outer = p;
lookups = p->lookups;
runtimeStrings = p->runtimeStrings;
+ compilationUnit = p->compilationUnit;
+ compiledFunction = p->compiledFunction;
withObject = with;
}
outer = p;
lookups = p->lookups;
runtimeStrings = p->runtimeStrings;
+ compilationUnit = p->compilationUnit;
+ compiledFunction = p->compiledFunction;
this->exceptionVarName = exceptionVarName;
this->exceptionValue = exceptionValue;
activation = 0;
if (function->function) {
- lookups = function->function->compilationUnit->runtimeLookups;
- runtimeStrings = function->function->compilationUnit->runtimeStrings;
+ compilationUnit = function->function->compilationUnit;
+ compiledFunction = function->function->compiledFunction;
+ lookups = compilationUnit->runtimeLookups;
+ runtimeStrings = compilationUnit->runtimeStrings;
}
uint argc = argumentCount;
activation = qml;
- lookups = function->function->compilationUnit->runtimeLookups;
- runtimeStrings = function->function->compilationUnit->runtimeStrings;
+ compilationUnit = function->function->compilationUnit;
+ compiledFunction = function->function->compiledFunction;
+ lookups = compilationUnit->runtimeLookups;
+ runtimeStrings = compilationUnit->runtimeStrings;
locals = (Value *)(this + 1);
if (function->varCount)
throwError(Value::fromObject(engine->newURIErrorObject(msg)));
}
-const Function *ExecutionContext::runtimeFunction() const
-{
- const ExecutionContext *ctx = this;
- if (ctx->type == Type_CatchContext)
- ctx = ctx->parent;
- if (ctx->type >= Type_CallContext) {
- const QV4::FunctionObject *f = ctx->asCallContext()->function;
- Q_ASSERT(f);
- return f ? f->function : 0;
- }
- Q_ASSERT(ctx->type == Type_GlobalContext);
- return engine->globalCode;
-}
-
void SimpleCallContext::initSimpleCallContext(ExecutionEngine *engine)
{
initBaseContext(Type_SimpleCallContext, engine, engine->current);
struct DeclarativeEnvironment;
struct Lookup;
+namespace CompiledData {
+struct CompilationUnit;
+struct Function;
+};
+
struct Q_QML_EXPORT DiagnosticMessage
{
enum { Error, Warning };
ExecutionContext *outer;
Lookup *lookups;
String **runtimeStrings;
+ CompiledData::CompilationUnit *compilationUnit;
+ const CompiledData::Function *compiledFunction;
ExecutionContext *next; // used in the GC
struct EvalCode
outer = 0;
lookups = 0;
runtimeStrings = 0;
+ compilationUnit = 0;
+ compiledFunction = 0;
currentEvalCode = 0;
interpreterInstructionPointer = 0;
}
inline CallContext *asCallContext();
inline const CallContext *asCallContext() const;
-
- const Function *runtimeFunction() const;
};
struct SimpleCallContext : public ExecutionContext
bool cstrict = ctx->strictMode;
ctx->strictMode = strictMode;
+ CompiledData::CompilationUnit * const oldCompilationUnit = ctx->compilationUnit;
+ const CompiledData::Function * const oldCompiledFunction = ctx->compiledFunction;
+ String ** const oldRuntimeStrings = ctx->runtimeStrings;
+ ctx->compilationUnit = function->compilationUnit;
+ ctx->compiledFunction = function->compiledFunction;
+ ctx->runtimeStrings = function->compilationUnit->runtimeStrings;
+
Value result = Value::undefinedValue();
try {
result = function->code(ctx, function->codeData);
} catch (Exception &ex) {
ctx->strictMode = cstrict;
ctx->currentEvalCode = evalCode.next;
+ ctx->compilationUnit = oldCompilationUnit;
+ ctx->compiledFunction = oldCompiledFunction;
+ ctx->runtimeStrings = oldRuntimeStrings;
if (strictMode)
ex.partiallyUnwindContext(parentContext);
throw;
ctx->strictMode = cstrict;
ctx->currentEvalCode = evalCode.next;
+ ctx->compilationUnit = oldCompilationUnit;
+ ctx->compiledFunction = oldCompiledFunction;
+ ctx->runtimeStrings = oldRuntimeStrings;
while (engine->current != parentContext)
engine->popContext();
void __qmljs_init_closure(ExecutionContext *ctx, Value *result, int functionId)
{
- const QV4::Function *runtimeFunction = ctx->runtimeFunction();
- QV4::Function *clos = runtimeFunction->compilationUnit->runtimeFunctions[functionId];
+ QV4::Function *clos = ctx->compilationUnit->runtimeFunctions[functionId];
assert(clos);
*result = Value::fromObject(ctx->engine->newScriptFunction(ctx, clos));
}
void __qmljs_builtin_define_object_literal(QV4::ExecutionContext *ctx, QV4::Value *result, const QV4::Value *args, int classId)
{
- const QV4::Function *runtimeFunction = ctx->runtimeFunction();
- Q_ASSERT(runtimeFunction);
- QV4::InternalClass *klass = runtimeFunction->compilationUnit->runtimeClasses[classId];
+ QV4::InternalClass *klass = ctx->compilationUnit->runtimeClasses[classId];
Object *o = ctx->engine->newObject(klass);
for (int i = 0; i < klass->size; ++i) {
void __qmljs_lookup_runtime_regexp(ExecutionContext *ctx, Value *result, int id)
{
- const QV4::Function *runtimeFunction = ctx->runtimeFunction();
- Q_ASSERT(runtimeFunction);
- *result = runtimeFunction->compilationUnit->runtimeRegularExpressions[id];
+ *result = ctx->compilationUnit->runtimeRegularExpressions[id];
}
} // namespace QV4
bool strict = scope->strictMode;
Lookup *oldLookups = scope->lookups;
- String **oldRuntimeStrings = scope->runtimeStrings;
+ CompiledData::CompilationUnit * const oldCompilationUnit = scope->compilationUnit;
+ const CompiledData::Function * const oldCompiledFunction = scope->compiledFunction;
+ String ** const oldRuntimeStrings = scope->runtimeStrings;
scope->strictMode = vmFunction->isStrict();
scope->lookups = vmFunction->compilationUnit->runtimeLookups;
+ scope->compilationUnit = vmFunction->compilationUnit;
+ scope->compiledFunction = vmFunction->compiledFunction;
scope->runtimeStrings = vmFunction->compilationUnit->runtimeStrings;
QV4::Value result;
} catch (Exception &e) {
scope->strictMode = strict;
scope->lookups = oldLookups;
+ scope->compilationUnit = oldCompilationUnit;
+ scope->compiledFunction = oldCompiledFunction;
scope->runtimeStrings = oldRuntimeStrings;
throw;
}
+ scope->lookups = oldLookups;
+ scope->compilationUnit = oldCompilationUnit;
+ scope->compiledFunction = oldCompiledFunction;
+ scope->runtimeStrings = oldRuntimeStrings;
+
return result;
} else {
}
#endif
- QV4::String ** const runtimeStrings = context->runtimeFunction()->compilationUnit->runtimeStrings;
+ QV4::String ** const runtimeStrings = context->runtimeStrings;
context->interpreterInstructionPointer = &code;
#ifdef MOTH_THREADED_INTERPRETER
MOTH_BEGIN_INSTR(LoadRegExp)
// TRACE(value, "%s", instr.value.toString(context)->toQString().toUtf8().constData());
- VALUE(instr.result) = context->runtimeFunction()->compilationUnit->runtimeRegularExpressions[instr.regExpId];
+ VALUE(instr.result) = context->compilationUnit->runtimeRegularExpressions[instr.regExpId];
MOTH_END_INSTR(LoadRegExp)
MOTH_BEGIN_INSTR(LoadClosure)