diff options
-rw-r--r-- | src/qml/compiler/qv4codegen.cpp | 9 | ||||
-rw-r--r-- | src/qml/compiler/qv4instr_moth.cpp | 7 | ||||
-rw-r--r-- | src/qml/compiler/qv4instr_moth_p.h | 11 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4argumentsobject.cpp | 12 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4argumentsobject_p.h | 7 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4runtime.cpp | 14 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4runtimeapi_p.h | 3 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4vme_moth.cpp | 10 |
8 files changed, 49 insertions, 24 deletions
diff --git a/src/qml/compiler/qv4codegen.cpp b/src/qml/compiler/qv4codegen.cpp index a73414f7ce..52e908d4f3 100644 --- a/src/qml/compiler/qv4codegen.cpp +++ b/src/qml/compiler/qv4codegen.cpp @@ -1828,8 +1828,13 @@ int Codegen::defineFunction(const QString &name, AST::Node *ast, } } if (_context->usesArgumentsObject == Context::ArgumentsObjectUsed) { - Instruction::CallBuiltinSetupArgumentsObject setup; - bytecodeGenerator->addInstruction(setup); + if (_context->isStrict) { + Instruction::CreateUnmappedArgumentsObject setup; + bytecodeGenerator->addInstruction(setup); + } else { + Instruction::CreateMappedArgumentsObject setup; + bytecodeGenerator->addInstruction(setup); + } referenceForName(QStringLiteral("arguments"), false).storeConsumeAccumulator(); } if (_context->usesThis && !_context->isStrict) { diff --git a/src/qml/compiler/qv4instr_moth.cpp b/src/qml/compiler/qv4instr_moth.cpp index e4b64bc287..f8bb7d1e21 100644 --- a/src/qml/compiler/qv4instr_moth.cpp +++ b/src/qml/compiler/qv4instr_moth.cpp @@ -334,8 +334,11 @@ void dumpBytecode(const char *code, int len, int nFormals) << ", " << instr.arrayGetterSetterCountAndFlags; MOTH_END_INSTR(CallBuiltinDefineObjectLiteral) - MOTH_BEGIN_INSTR(CallBuiltinSetupArgumentsObject) - MOTH_END_INSTR(CallBuiltinSetupArgumentsObject) + MOTH_BEGIN_INSTR(CreateMappedArgumentsObject) + MOTH_END_INSTR(CreateMappedArgumentsObject) + + MOTH_BEGIN_INSTR(CreateUnmappedArgumentsObject) + MOTH_END_INSTR(CreateUnmappedArgumentsObject) MOTH_BEGIN_INSTR(CallBuiltinConvertThisToObject) MOTH_END_INSTR(CallBuiltinConvertThisToObject) diff --git a/src/qml/compiler/qv4instr_moth_p.h b/src/qml/compiler/qv4instr_moth_p.h index 0a271001ed..55de0da962 100644 --- a/src/qml/compiler/qv4instr_moth_p.h +++ b/src/qml/compiler/qv4instr_moth_p.h @@ -126,7 +126,8 @@ QT_BEGIN_NAMESPACE F(CallBuiltinDeclareVar, callBuiltinDeclareVar) \ F(CallBuiltinDefineArray, callBuiltinDefineArray) \ F(CallBuiltinDefineObjectLiteral, callBuiltinDefineObjectLiteral) \ - F(CallBuiltinSetupArgumentsObject, callBuiltinSetupArgumentsObject) \ + F(CreateMappedArgumentsObject, createMappedArgumentsObject) \ + F(CreateUnmappedArgumentsObject, createUnmappedArgumentsObject) \ F(CallBuiltinConvertThisToObject, callBuiltinConvertThisToObject) \ F(CreateValue, createValue) \ F(CreateProperty, createProperty) \ @@ -510,7 +511,10 @@ union Instr int arrayGetterSetterCountAndFlags; // 30 bits for count, 1 bit for needsSparseArray boolean StackSlot args; }; - struct instr_callBuiltinSetupArgumentsObject { + struct instr_createMappedArgumentsObject { + MOTH_INSTR_HEADER + }; + struct instr_createUnmappedArgumentsObject { MOTH_INSTR_HEADER }; struct instr_callBuiltinConvertThisToObject { @@ -754,7 +758,8 @@ union Instr instr_callBuiltinDeclareVar callBuiltinDeclareVar; instr_callBuiltinDefineArray callBuiltinDefineArray; instr_callBuiltinDefineObjectLiteral callBuiltinDefineObjectLiteral; - instr_callBuiltinSetupArgumentsObject callBuiltinSetupArgumentsObject; + instr_createMappedArgumentsObject createMappedArgumentsObject; + instr_createUnmappedArgumentsObject createUnmappedArgumentsObject; instr_callBuiltinConvertThisToObject callBuiltinConvertThisToObject; instr_createValue createValue; instr_createProperty createProperty; diff --git a/src/qml/jsruntime/qv4argumentsobject.cpp b/src/qml/jsruntime/qv4argumentsobject.cpp index 5d1d322f7b..6066f612d9 100644 --- a/src/qml/jsruntime/qv4argumentsobject.cpp +++ b/src/qml/jsruntime/qv4argumentsobject.cpp @@ -46,19 +46,20 @@ using namespace QV4; DEFINE_OBJECT_VTABLE(ArgumentsObject); -void Heap::ArgumentsObject::init(QV4::CallContext *context) +void Heap::ArgumentsObject::init(QV4::CallContext *context, bool strict) { ExecutionEngine *v4 = internalClass->engine; Object::init(); fullyCreated = false; + isStrict = strict; this->context.set(v4, context->d()); Q_ASSERT(vtable() == QV4::ArgumentsObject::staticVTable()); Scope scope(v4); Scoped<QV4::ArgumentsObject> args(scope, this); - if (context->d()->strictMode) { + if (isStrict) { Q_ASSERT(CalleePropertyIndex == args->internalClass()->find(v4->id_callee())); Q_ASSERT(CallerPropertyIndex == args->internalClass()->find(v4->id_caller())); args->setProperty(CalleePropertyIndex + QV4::Object::GetterOffset, *v4->thrower()); @@ -127,10 +128,9 @@ bool ArgumentsObject::defineOwnProperty(ExecutionEngine *engine, uint index, con arrayIndex.set(scope.engine, d()->mappedArguments->values[index]); } - bool strict = engine->current->strictMode; - engine->current->strictMode = false; bool result = Object::defineOwnProperty2(scope.engine, index, desc, attrs); - engine->current->strictMode = strict; + if (!result) + return false; if (isMapped && attrs.isData()) { Q_ASSERT(arrayData()); @@ -146,8 +146,6 @@ bool ArgumentsObject::defineOwnProperty(ExecutionEngine *engine, uint index, con } } - if (engine->current->strictMode && !result) - return engine->throwTypeError(); return result; } diff --git a/src/qml/jsruntime/qv4argumentsobject_p.h b/src/qml/jsruntime/qv4argumentsobject_p.h index 228e79c33b..da88a44fee 100644 --- a/src/qml/jsruntime/qv4argumentsobject_p.h +++ b/src/qml/jsruntime/qv4argumentsobject_p.h @@ -78,7 +78,8 @@ DECLARE_HEAP_OBJECT(ArgumentsSetterFunction, FunctionObject) { #define ArgumentsObjectMembers(class, Member) \ Member(class, Pointer, CallContext *, context) \ Member(class, Pointer, MemberData *, mappedArguments) \ - Member(class, NoMark, bool, fullyCreated) + Member(class, NoMark, bool, fullyCreated) \ + Member(class, NoMark, bool, isStrict) DECLARE_HEAP_OBJECT(ArgumentsObject, Object) { DECLARE_MARK_TABLE(ArgumentsObject); @@ -87,7 +88,7 @@ DECLARE_HEAP_OBJECT(ArgumentsObject, Object) { CalleePropertyIndex = 1, CallerPropertyIndex = 3 }; - void init(QV4::CallContext *context); + void init(QV4::CallContext *context, bool strict); }; } @@ -132,7 +133,7 @@ struct ArgumentsObject: Object { static bool isNonStrictArgumentsObject(Managed *m) { return m->d()->vtable()->type == Type_ArgumentsObject && - !static_cast<ArgumentsObject *>(m)->context()->strictMode; + !static_cast<ArgumentsObject *>(m)->d()->isStrict; } bool defineOwnProperty(ExecutionEngine *engine, uint index, const Property *desc, PropertyAttributes attrs); diff --git a/src/qml/jsruntime/qv4runtime.cpp b/src/qml/jsruntime/qv4runtime.cpp index 8def6ecdae..9292fa674b 100644 --- a/src/qml/jsruntime/qv4runtime.cpp +++ b/src/qml/jsruntime/qv4runtime.cpp @@ -1314,12 +1314,20 @@ ReturnedValue Runtime::method_objectLiteral(ExecutionEngine *engine, const QV4:: return o.asReturnedValue(); } -QV4::ReturnedValue Runtime::method_setupArgumentsObject(ExecutionEngine *engine) +QV4::ReturnedValue Runtime::method_createMappedArgumentsObject(ExecutionEngine *engine) { Q_ASSERT(engine->current->type == Heap::ExecutionContext::Type_CallContext); QV4::CallContext *c = static_cast<QV4::CallContext *>(engine->currentContext); - QV4::InternalClass *ic = engine->internalClasses[c->d()->strictMode ? EngineBase::Class_StrictArgumentsObject : EngineBase::Class_ArgumentsObject]; - return engine->memoryManager->allocObject<ArgumentsObject>(ic, engine->objectPrototype(), c)->asReturnedValue(); + QV4::InternalClass *ic = engine->internalClasses[EngineBase::Class_ArgumentsObject]; + return engine->memoryManager->allocObject<ArgumentsObject>(ic, engine->objectPrototype(), c, false)->asReturnedValue(); +} + +QV4::ReturnedValue Runtime::method_createUnmappedArgumentsObject(ExecutionEngine *engine) +{ + Q_ASSERT(engine->current->type == Heap::ExecutionContext::Type_CallContext); + QV4::CallContext *c = static_cast<QV4::CallContext *>(engine->currentContext); + QV4::InternalClass *ic = engine->internalClasses[EngineBase::Class_StrictArgumentsObject]; + return engine->memoryManager->allocObject<ArgumentsObject>(ic, engine->objectPrototype(), c, true)->asReturnedValue(); } #endif // V4_BOOTSTRAP diff --git a/src/qml/jsruntime/qv4runtimeapi_p.h b/src/qml/jsruntime/qv4runtimeapi_p.h index 0fbffde944..e0f7bd8706 100644 --- a/src/qml/jsruntime/qv4runtimeapi_p.h +++ b/src/qml/jsruntime/qv4runtimeapi_p.h @@ -137,7 +137,8 @@ struct ExceptionCheck<void (*)(QV4::NoThrowEngine *, A, B, C)> { \ /* function header */ \ F(void, declareVar, (ExecutionEngine *engine, bool deletable, int nameIndex)) \ - F(ReturnedValue, setupArgumentsObject, (ExecutionEngine *engine)) \ + F(ReturnedValue, createMappedArgumentsObject, (ExecutionEngine *engine)) \ + F(ReturnedValue, createUnmappedArgumentsObject, (ExecutionEngine *engine)) \ F(void, convertThisToObject, (ExecutionEngine *engine)) \ \ /* literals */ \ diff --git a/src/qml/jsruntime/qv4vme_moth.cpp b/src/qml/jsruntime/qv4vme_moth.cpp index e3a91654f4..b1f667bd05 100644 --- a/src/qml/jsruntime/qv4vme_moth.cpp +++ b/src/qml/jsruntime/qv4vme_moth.cpp @@ -730,9 +730,13 @@ QV4::ReturnedValue VME::exec(Function *function, const FunctionObject *jsFunctio STORE_ACCUMULATOR(Runtime::method_objectLiteral(engine, args, instr.internalClassId, instr.arrayValueCount, instr.arrayGetterSetterCountAndFlags)); MOTH_END_INSTR(CallBuiltinDefineObjectLiteral) - MOTH_BEGIN_INSTR(CallBuiltinSetupArgumentsObject) - STORE_ACCUMULATOR(Runtime::method_setupArgumentsObject(engine)); - MOTH_END_INSTR(CallBuiltinSetupArgumentsObject) + MOTH_BEGIN_INSTR(CreateMappedArgumentsObject) + STORE_ACCUMULATOR(Runtime::method_createMappedArgumentsObject(engine)); + MOTH_END_INSTR(CreateMappedArgumentsObject) + + MOTH_BEGIN_INSTR(CreateUnmappedArgumentsObject) + STORE_ACCUMULATOR(Runtime::method_createUnmappedArgumentsObject(engine)); + MOTH_END_INSTR(CreateUnmappedArgumentsObject) MOTH_BEGIN_INSTR(CallBuiltinConvertThisToObject) if (function->canUseSimpleFunction()) { |