diff options
Diffstat (limited to 'src/qml/jsruntime/qv4argumentsobject.cpp')
-rw-r--r-- | src/qml/jsruntime/qv4argumentsobject.cpp | 40 |
1 files changed, 17 insertions, 23 deletions
diff --git a/src/qml/jsruntime/qv4argumentsobject.cpp b/src/qml/jsruntime/qv4argumentsobject.cpp index 629c255b48..5094bafa66 100644 --- a/src/qml/jsruntime/qv4argumentsobject.cpp +++ b/src/qml/jsruntime/qv4argumentsobject.cpp @@ -51,8 +51,7 @@ ArgumentsObject::ArgumentsObject(CallContext *context) , context(context) , fullyCreated(false) { - type = Type_ArgumentsObject; - flags &= ~SimpleArray; + setArrayType(ArrayData::Complex); ExecutionEngine *v4 = context->engine; Scope scope(v4); @@ -66,14 +65,12 @@ ArgumentsObject::ArgumentsObject(CallContext *context) memberData[CallerPropertyIndex] = pd; arrayReserve(context->callData->argc); - for (int i = 0; i < context->callData->argc; ++i) - arrayData[i].value = context->callData->args[i]; - arrayDataLen = context->callData->argc; + arrayData->put(0, context->callData->args, context->callData->argc); + arrayData->setLength(context->callData->argc); fullyCreated = true; } else { Q_ASSERT(CalleePropertyIndex == internalClass->find(context->engine->id_callee)); memberData[CalleePropertyIndex].value = context->function->asReturnedValue(); - isNonStrictArgumentsObject = true; } Q_ASSERT(LengthPropertyIndex == internalClass->find(context->engine->id_length)); Property *lp = memberData + ArrayObject::LengthPropertyIndex; @@ -95,18 +92,18 @@ void ArgumentsObject::fullyCreate() uint numAccessors = qMin((int)context->function->formalParameterCount, context->realArgumentCount); uint argCount = qMin(context->realArgumentCount, context->callData->argc); arrayReserve(argCount); - ensureArrayAttributes(); + arrayData->ensureAttributes(); context->engine->requireArgumentsAccessors(numAccessors); for (uint i = 0; i < (uint)numAccessors; ++i) { mappedArguments.append(context->callData->args[i]); - arrayData[i] = context->engine->argumentsAccessors.at(i); - arrayAttributes[i] = Attr_Accessor; + arrayData->data[i] = context->engine->argumentsAccessors.at(i); + arrayData->setAttributes(i, Attr_Accessor); } - for (uint i = numAccessors; i < argCount; ++i) { - arrayData[i] = Property::fromValue(context->callData->args[i]); - arrayAttributes[i] = Attr_Data; - } - arrayDataLen = argCount; + arrayData->setLength(numAccessors); + arrayData->put(numAccessors, context->callData->args + numAccessors, argCount - numAccessors); + for (uint i = numAccessors; i < argCount; ++i) + arrayData->setAttributes(i, Attr_Data); + arrayData->setLength(argCount); fullyCreated = true; } @@ -116,27 +113,24 @@ bool ArgumentsObject::defineOwnProperty(ExecutionContext *ctx, uint index, const fullyCreate(); Scope scope(ctx); - uint pidx = propertyIndexFromArrayIndex(index); - Property *pd = arrayData + pidx; + Property *pd = arrayData->getProperty(index); Property map; PropertyAttributes mapAttrs; bool isMapped = false; if (pd && index < (uint)mappedArguments.size()) - isMapped = arrayAttributes && arrayAttributes[pidx].isAccessor() && pd->getter() == context->engine->argumentsAccessors.at(index).getter(); + isMapped = arrayData->attributes(index).isAccessor() && pd->getter() == context->engine->argumentsAccessors.at(index).getter(); if (isMapped) { map = *pd; - mapAttrs = arrayAttributes[pidx]; - arrayAttributes[pidx] = Attr_Data; + mapAttrs = arrayData->attributes(index); + arrayData->setAttributes(index, Attr_Data); pd->value = mappedArguments.at(index); } - isNonStrictArgumentsObject = false; bool strict = ctx->strictMode; ctx->strictMode = false; - bool result = Object::__defineOwnProperty__(ctx, index, desc, attrs); + bool result = Object::defineOwnProperty2(ctx, index, desc, attrs); ctx->strictMode = strict; - isNonStrictArgumentsObject = true; if (isMapped && attrs.isData()) { ScopedCallData callData(scope, 1); @@ -146,7 +140,7 @@ bool ArgumentsObject::defineOwnProperty(ExecutionContext *ctx, uint index, const if (attrs.isWritable()) { *pd = map; - arrayAttributes[pidx] = mapAttrs; + arrayData->setAttributes(index, mapAttrs); } } |