aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/qml/jsruntime/qv4context.cpp24
-rw-r--r--src/qml/jsruntime/qv4context_p.h2
-rw-r--r--src/qml/jsruntime/qv4debugging.cpp2
-rw-r--r--src/qml/jsruntime/qv4engine.cpp13
-rw-r--r--src/qml/jsruntime/qv4functionobject.cpp4
-rw-r--r--src/qml/jsruntime/qv4functionobject_p.h7
6 files changed, 28 insertions, 24 deletions
diff --git a/src/qml/jsruntime/qv4context.cpp b/src/qml/jsruntime/qv4context.cpp
index 145e99e3a3..84a3ae20cf 100644
--- a/src/qml/jsruntime/qv4context.cpp
+++ b/src/qml/jsruntime/qv4context.cpp
@@ -55,7 +55,7 @@ Returned<CallContext> *ExecutionContext::newCallContext(FunctionObject *function
Heap::CallContext *c = reinterpret_cast<Heap::CallContext *>(d()->engine->memoryManager->allocManaged(requiredMemoryForExecutionContect(function, callData->argc)));
new (c) Heap::CallContext(d()->engine, Heap::ExecutionContext::Type_CallContext);
- c->function = function;
+ c->function = function->d();
c->realArgumentCount = callData->argc;
c->strictMode = function->strictMode();
@@ -161,7 +161,7 @@ Heap::CatchContext::CatchContext(ExecutionEngine *engine, QV4::String *exception
Heap::CallContext::CallContext(ExecutionEngine *engine, QV4::Object *qml, QV4::FunctionObject *function)
: Heap::ExecutionContext(engine, Heap::ExecutionContext::Type_QmlContext)
{
- this->function = function;
+ this->function = function->d();
callData = reinterpret_cast<CallData *>(this + 1);
callData->tag = QV4::Value::_Integer_Type;
callData->argc = 0;
@@ -184,7 +184,7 @@ Heap::CallContext::CallContext(ExecutionEngine *engine, QV4::Object *qml, QV4::F
String * const *CallContext::formals() const
{
- return (d()->function && d()->function->function()) ? d()->function->function()->internalClass->nameMap.constData() : 0;
+ return (d()->function && d()->function->function) ? d()->function->function->internalClass->nameMap.constData() : 0;
}
unsigned int CallContext::formalCount() const
@@ -194,7 +194,7 @@ unsigned int CallContext::formalCount() const
String * const *CallContext::variables() const
{
- return (d()->function && d()->function->function()) ? d()->function->function()->internalClass->nameMap.constData() + d()->function->function()->compiledFunction->nFormals : 0;
+ return (d()->function && d()->function->function) ? d()->function->function->internalClass->nameMap.constData() + d()->function->formalParameterCount() : 0;
}
unsigned int CallContext::variableCount() const
@@ -220,7 +220,7 @@ bool ExecutionContext::deleteProperty(String *name)
return false;
} else if (ctx->d()->type >= Heap::ExecutionContext::Type_CallContext) {
CallContext *c = static_cast<CallContext *>(ctx);
- FunctionObject *f = c->d()->function;
+ ScopedFunctionObject f(scope, c->d()->function);
if (f->needsActivation() || hasWith) {
uint index = f->function()->internalClass->find(name);
if (index < UINT_MAX)
@@ -244,7 +244,7 @@ bool ExecutionContext::deleteProperty(String *name)
bool CallContext::needsOwnArguments() const
{
- return d()->function->needsActivation() || d()->callData->argc < static_cast<int>(d()->function->formalParameterCount());
+ return d()->function->needsActivation || d()->callData->argc < static_cast<int>(d()->function->formalParameterCount());
}
void ExecutionContext::markObjects(Heap::Base *m, ExecutionEngine *engine)
@@ -296,8 +296,8 @@ void ExecutionContext::setProperty(String *name, const ValueRef value)
ScopedObject activation(scope, (Object *)0);
if (ctx->d()->type >= Heap::ExecutionContext::Type_CallContext) {
CallContext *c = static_cast<CallContext *>(ctx);
- if (c->d()->function->function()) {
- uint index = c->d()->function->function()->internalClass->find(name);
+ if (c->d()->function->function) {
+ uint index = c->d()->function->function->internalClass->find(name);
if (index < UINT_MAX) {
if (index < c->d()->function->formalParameterCount()) {
c->d()->callData->args[c->d()->function->formalParameterCount() - index - 1] = *value;
@@ -434,13 +434,13 @@ ReturnedValue ExecutionContext::getPropertyAndBase(String *name, Object *&base)
else if (ctx->d()->type >= Heap::ExecutionContext::Type_CallContext) {
QV4::CallContext *c = static_cast<CallContext *>(ctx);
- FunctionObject *f = c->d()->function;
+ ScopedFunctionObject f(scope, c->d()->function);
if (f->function() && (f->needsActivation() || hasWith || hasCatchScope)) {
uint index = f->function()->internalClass->find(name);
if (index < UINT_MAX) {
- if (index < c->d()->function->formalParameterCount())
- return c->d()->callData->args[c->d()->function->formalParameterCount() - index - 1].asReturnedValue();
- return c->d()->locals[index - c->d()->function->formalParameterCount()].asReturnedValue();
+ if (index < f->formalParameterCount())
+ return c->d()->callData->args[f->formalParameterCount() - index - 1].asReturnedValue();
+ return c->d()->locals[index - f->formalParameterCount()].asReturnedValue();
}
}
ScopedObject activation(scope, c->d()->activation);
diff --git a/src/qml/jsruntime/qv4context_p.h b/src/qml/jsruntime/qv4context_p.h
index b950481f76..601af5a520 100644
--- a/src/qml/jsruntime/qv4context_p.h
+++ b/src/qml/jsruntime/qv4context_p.h
@@ -111,7 +111,7 @@ struct CallContext : ExecutionContext {
}
CallContext(ExecutionEngine *engine, QV4::Object *qml, QV4::FunctionObject *function);
- QV4::FunctionObject *function;
+ FunctionObject *function;
int realArgumentCount;
Value *locals;
Object *activation;
diff --git a/src/qml/jsruntime/qv4debugging.cpp b/src/qml/jsruntime/qv4debugging.cpp
index 64027ff6e4..fdba6e3626 100644
--- a/src/qml/jsruntime/qv4debugging.cpp
+++ b/src/qml/jsruntime/qv4debugging.cpp
@@ -573,7 +573,7 @@ Function *Debugger::getFunction() const
{
ExecutionContext *context = m_engine->currentContext();
if (CallContext *callCtx = context->asCallContext())
- return callCtx->d()->function->function();
+ return callCtx->d()->function->function;
else {
Q_ASSERT(context->d()->type == QV4::Heap::ExecutionContext::Type_GlobalContext);
return context->d()->engine->globalCode;
diff --git a/src/qml/jsruntime/qv4engine.cpp b/src/qml/jsruntime/qv4engine.cpp
index d724bafaa2..747f5b7530 100644
--- a/src/qml/jsruntime/qv4engine.cpp
+++ b/src/qml/jsruntime/qv4engine.cpp
@@ -741,14 +741,15 @@ QVector<StackFrame> ExecutionEngine::stackTrace(int frameLimit) const
CallContext *callCtx = c->asCallContext();
if (callCtx && callCtx->d()->function) {
StackFrame frame;
- if (callCtx->d()->function->function())
- frame.source = callCtx->d()->function->function()->sourceFile();
- name = callCtx->d()->function->name();
+ ScopedFunctionObject function(scope, callCtx->d()->function);
+ if (function->function())
+ frame.source = function->function()->sourceFile();
+ name = function->name();
frame.function = name->toQString();
frame.line = -1;
frame.column = -1;
- if (callCtx->d()->function->function())
+ if (callCtx->d()->function->function)
// line numbers can be negative for places where you can't set a real breakpoint
frame.line = qAbs(callCtx->d()->lineNumber);
@@ -828,8 +829,8 @@ QUrl ExecutionEngine::resolvedUrl(const QString &file)
while (c) {
CallContext *callCtx = c->asCallContext();
if (callCtx && callCtx->d()->function) {
- if (callCtx->d()->function->function())
- base.setUrl(callCtx->d()->function->function()->sourceFile());
+ if (callCtx->d()->function->function)
+ base.setUrl(callCtx->d()->function->function->sourceFile());
break;
}
c = c->d()->parent;
diff --git a/src/qml/jsruntime/qv4functionobject.cpp b/src/qml/jsruntime/qv4functionobject.cpp
index ecfd64bbd9..1f37ea13fd 100644
--- a/src/qml/jsruntime/qv4functionobject.cpp
+++ b/src/qml/jsruntime/qv4functionobject.cpp
@@ -457,7 +457,7 @@ ReturnedValue SimpleScriptFunction::construct(Managed *that, CallData *callData)
CallContext::Data ctx(v4);
ctx.strictMode = f->strictMode();
ctx.callData = callData;
- ctx.function = f.getPointer();
+ ctx.function = f.getPointer()->d();
ctx.compilationUnit = f->function()->compilationUnit;
ctx.lookups = ctx.compilationUnit->runtimeLookups;
ctx.outer = f->scope();
@@ -494,7 +494,7 @@ ReturnedValue SimpleScriptFunction::call(Managed *that, CallData *callData)
CallContext::Data ctx(v4);
ctx.strictMode = f->strictMode();
ctx.callData = callData;
- ctx.function = f;
+ ctx.function = f->d();
ctx.compilationUnit = f->function()->compilationUnit;
ctx.lookups = ctx.compilationUnit->runtimeLookups;
ctx.outer = f->scope();
diff --git a/src/qml/jsruntime/qv4functionobject_p.h b/src/qml/jsruntime/qv4functionobject_p.h
index 50c266313e..288777f8eb 100644
--- a/src/qml/jsruntime/qv4functionobject_p.h
+++ b/src/qml/jsruntime/qv4functionobject_p.h
@@ -63,6 +63,9 @@ struct Q_QML_PRIVATE_EXPORT FunctionObject : Object {
FunctionObject(InternalClass *ic);
~FunctionObject();
+ unsigned int formalParameterCount() { return function ? function->compiledFunction->nFormals : 0; }
+ unsigned int varCount() { return function ? function->compiledFunction->nLocals : 0; }
+
QV4::ExecutionContext *scope;
Function *function;
};
@@ -114,8 +117,8 @@ struct Q_QML_EXPORT FunctionObject: Object {
Function *function() { return d()->function; }
ReturnedValue name();
- unsigned int formalParameterCount() { return function() ? function()->compiledFunction->nFormals : 0; }
- unsigned int varCount() { return function() ? function()->compiledFunction->nLocals : 0; }
+ unsigned int formalParameterCount() { return d()->formalParameterCount(); }
+ unsigned int varCount() { return d()->varCount(); }
void init(String *name, bool createProto);