From e552ca0602186826b9dbf2435dd95303cf1bf39b Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Fri, 7 Nov 2014 05:24:24 +0100 Subject: [PATCH] Use Heap object for CallData::function member Change-Id: I5cae1b16c68751da9481a1cdae2601efa2a500a2 Reviewed-by: Simon Hausmann --- src/qml/jsruntime/qv4context.cpp | 24 ++++++++++++------------ src/qml/jsruntime/qv4context_p.h | 2 +- src/qml/jsruntime/qv4debugging.cpp | 2 +- src/qml/jsruntime/qv4engine.cpp | 13 +++++++------ src/qml/jsruntime/qv4functionobject.cpp | 4 ++-- src/qml/jsruntime/qv4functionobject_p.h | 7 +++++-- 6 files changed, 28 insertions(+), 24 deletions(-) diff --git a/src/qml/jsruntime/qv4context.cpp b/src/qml/jsruntime/qv4context.cpp index 145e99e..84a3ae2 100644 --- a/src/qml/jsruntime/qv4context.cpp +++ b/src/qml/jsruntime/qv4context.cpp @@ -55,7 +55,7 @@ Returned *ExecutionContext::newCallContext(FunctionObject *function Heap::CallContext *c = reinterpret_cast(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(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(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(d()->function->formalParameterCount()); + return d()->function->needsActivation || d()->callData->argc < static_cast(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(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(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 b950481..601af5a 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 64027ff..fdba6e3 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 d724baf..747f5b7 100644 --- a/src/qml/jsruntime/qv4engine.cpp +++ b/src/qml/jsruntime/qv4engine.cpp @@ -741,14 +741,15 @@ QVector 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 ecfd64b..1f37ea1 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 50c2663..288777f 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); -- 2.7.4