Remove the realArgumentsCount member in CallContext
authorLars Knoll <lars.knoll@theqtcompany.com>
Mon, 19 Jan 2015 15:29:48 +0000 (16:29 +0100)
committerLars Knoll <lars.knoll@digia.com>
Fri, 23 Jan 2015 11:30:43 +0000 (12:30 +0100)
The data is easily available through the CallData, only used by
the Arguments object and we save a pointer in Heap::CallData this way.

For this to work, let CallData::argc always return the real number
of arguments passed into the function.

Change-Id: I59c7c41e8c1af160db09fa794977ab7084c9e12d
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
src/qml/jsruntime/qv4argumentsobject.cpp
src/qml/jsruntime/qv4context.cpp
src/qml/jsruntime/qv4context_p.h
src/qml/jsruntime/qv4functionobject.cpp

index 82a6fd5..d7ffbe5 100644 (file)
@@ -68,7 +68,7 @@ Heap::ArgumentsObject::ArgumentsObject(QV4::CallContext *context)
         args->memberData()->data[CalleePropertyIndex] = context->d()->function->asReturnedValue();
     }
     Q_ASSERT(LengthPropertyIndex == args->internalClass()->find(context->d()->engine->id_length));
-    args->memberData()->data[LengthPropertyIndex] = Primitive::fromInt32(context->d()->realArgumentCount);
+    args->memberData()->data[LengthPropertyIndex] = Primitive::fromInt32(context->d()->callData->argc);
 }
 
 void ArgumentsObject::fullyCreate()
@@ -76,8 +76,8 @@ void ArgumentsObject::fullyCreate()
     if (fullyCreated())
         return;
 
-    uint numAccessors = qMin((int)context()->function->formalParameterCount(), context()->realArgumentCount);
-    uint argCount = qMin(context()->realArgumentCount, context()->callData->argc);
+    uint numAccessors = qMin((int)context()->function->formalParameterCount(), context()->callData->argc);
+    uint argCount = context()->callData->argc;
     ArrayData::realloc(this, Heap::ArrayData::Sparse, argCount, true);
     context()->engine->requireArgumentsAccessors(numAccessors);
 
@@ -105,7 +105,7 @@ bool ArgumentsObject::defineOwnProperty(ExecutionEngine *engine, uint index, con
     ScopedProperty map(scope);
     PropertyAttributes mapAttrs;
     bool isMapped = false;
-    uint numAccessors = qMin((int)context()->function->formalParameterCount(), context()->realArgumentCount);
+    uint numAccessors = qMin((int)context()->function->formalParameterCount(), context()->callData->argc);
     if (pd && index < (uint)numAccessors)
         isMapped = arrayData()->attributes(index).isAccessor() &&
                 pd->getter() == context()->engine->argumentsAccessors[index].getter();
@@ -188,8 +188,8 @@ PropertyAttributes ArgumentsObject::queryIndexed(const Managed *m, uint index)
     if (args->fullyCreated())
         return Object::queryIndexed(m, index);
 
-    uint numAccessors = qMin((int)args->context()->function->formalParameterCount(), args->context()->realArgumentCount);
-    uint argCount = qMin(args->context()->realArgumentCount, args->context()->callData->argc);
+    uint numAccessors = qMin((int)args->context()->function->formalParameterCount(), args->context()->callData->argc);
+    uint argCount = args->context()->callData->argc;
     if (index >= argCount)
         return PropertyAttributes();
     if (index >= numAccessors)
index 8c63747..b6a4b0f 100644 (file)
@@ -57,7 +57,6 @@ Heap::CallContext *ExecutionContext::newCallContext(FunctionObject *function, Ca
     new (c) Heap::CallContext(d()->engine, Heap::ExecutionContext::Type_CallContext);
 
     c->function = function->d();
-    c->realArgumentCount = callData->argc;
 
     c->strictMode = function->strictMode();
     c->outer = function->scope();
@@ -77,7 +76,6 @@ Heap::CallContext *ExecutionContext::newCallContext(FunctionObject *function, Ca
     ::memcpy(c->callData, callData, sizeof(CallData) + (callData->argc - 1) * sizeof(Value));
     if (callData->argc < static_cast<int>(compiledFunction->nFormals))
         std::fill(c->callData->args + c->callData->argc, c->callData->args + compiledFunction->nFormals, Primitive::undefinedValue());
-    c->callData->argc = qMax((uint)callData->argc, compiledFunction->nFormals);
 
     return c;
 }
index 1431c5a..93cd9d4 100644 (file)
@@ -107,7 +107,6 @@ struct CallContext : ExecutionContext {
     CallContext(ExecutionEngine *engine, QV4::Object *qml, QV4::FunctionObject *function);
 
     FunctionObject *function;
-    int realArgumentCount;
     Value *locals;
     Object *activation;
 };
index 63efb4f..ed96cce 100644 (file)
@@ -498,10 +498,8 @@ ReturnedValue SimpleScriptFunction::construct(Managed *that, CallData *callData)
     ctx.lookups = ctx.compilationUnit->runtimeLookups;
     ctx.outer = f->scope();
     ctx.locals = scope.alloc(f->varCount());
-    while (callData->argc < (int)f->formalParameterCount()) {
-        callData->args[callData->argc] = Encode::undefined();
-        ++callData->argc;
-    }
+    for (int i = callData->argc; i < (int)f->formalParameterCount(); ++i)
+        callData->args[i] = Encode::undefined();
     Q_ASSERT(v4->currentContext() == &ctx);
 
     ScopedObject result(scope, Q_V4_PROFILE(v4, f->function()));
@@ -535,10 +533,8 @@ ReturnedValue SimpleScriptFunction::call(Managed *that, CallData *callData)
     ctx.lookups = ctx.compilationUnit->runtimeLookups;
     ctx.outer = f->scope();
     ctx.locals = scope.alloc(f->varCount());
-    while (callData->argc < (int)f->formalParameterCount()) {
-        callData->args[callData->argc] = Encode::undefined();
-        ++callData->argc;
-    }
+    for (int i = callData->argc; i < (int)f->formalParameterCount(); ++i)
+        callData->args[i] = Encode::undefined();
     Q_ASSERT(v4->currentContext() == &ctx);
 
     ScopedValue result(scope, Q_V4_PROFILE(v4, f->function()));