Get rid of the nonStrictArgumentsObject flag in Managed
authorLars Knoll <lars.knoll@digia.com>
Fri, 13 Dec 2013 11:15:25 +0000 (12:15 +0100)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Fri, 3 Jan 2014 16:09:21 +0000 (17:09 +0100)
Change-Id: I4ac58e9d87506ae930c2e44e6089f4af3cd9ccb2
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
src/qml/jsruntime/qv4argumentsobject.cpp
src/qml/jsruntime/qv4argumentsobject_p.h
src/qml/jsruntime/qv4managed_p.h
src/qml/jsruntime/qv4object.cpp
src/qml/jsruntime/qv4objectiterator.cpp
src/qml/jsruntime/qv4objectproto.cpp

index df08b5a..3b58f68 100644 (file)
@@ -72,7 +72,6 @@ ArgumentsObject::ArgumentsObject(CallContext *context)
     } 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;
@@ -130,12 +129,10 @@ bool ArgumentsObject::defineOwnProperty(ExecutionContext *ctx, uint index, const
         pd->value = mappedArguments.at(index);
     }
 
-    isNonStrictArgumentsObject = false;
     bool strict = ctx->strictMode;
     ctx->strictMode = false;
     bool result = Object::__defineOwnProperty__(ctx, index, desc, attrs);
     ctx->strictMode = strict;
-    isNonStrictArgumentsObject = true;
 
     if (isMapped && attrs.isData()) {
         ScopedCallData callData(scope, 1);
index b300dcf..42b749c 100644 (file)
@@ -84,6 +84,10 @@ struct ArgumentsObject: Object {
     ArgumentsObject(CallContext *context);
     ~ArgumentsObject() {}
 
+    static bool isNonStrictArgumentsObject(Managed *m) {
+        return m->internalClass->vtable->type == Type_ArgumentsObject &&
+                !static_cast<ArgumentsObject *>(m)->context->strictMode;
+    }
 
     enum {
         LengthPropertyIndex = 0,
index 8febf3f..1243921 100644 (file)
@@ -351,7 +351,7 @@ public:
             uchar markBit :  1;
             uchar inUse   :  1;
             uchar extensible : 1; // used by Object
-            uchar isNonStrictArgumentsObject : 1;
+            uchar _unused : 1;
             uchar needsActivation : 1; // used by FunctionObject
             uchar strictMode : 1; // used by FunctionObject
             uchar bindingKeyFlag : 1;
index 559792d..7b0ddc6 100644 (file)
@@ -969,7 +969,7 @@ bool Object::__defineOwnProperty__(ExecutionContext *ctx, uint index, const Prop
     if (isArrayObject() && index >= arrayLength() && !internalClass->propertyData[ArrayObject::LengthPropertyIndex].isWritable())
         goto reject;
 
-    if (isNonStrictArgumentsObject)
+    if (ArgumentsObject::isNonStrictArgumentsObject(this))
         return static_cast<ArgumentsObject *>(this)->defineOwnProperty(ctx, index, p, attrs);
 
     // Clause 1
index 04fa504..f7a5cd7 100644 (file)
@@ -58,7 +58,7 @@ ObjectIterator::ObjectIterator(SafeObject *scratch1, SafeObject *scratch2, const
     current = o;
     tmpDynamicProperty.value = Primitive::undefinedValue();
 
-    if (object && object->isNonStrictArgumentsObject) {
+    if (object && object->asArgumentsObject()) {
         Scope scope(object->engine());
         Scoped<ArgumentsObject> (scope, object->asReturnedValue())->fullyCreate();
     }
@@ -76,7 +76,7 @@ ObjectIterator::ObjectIterator(Scope &scope, const ObjectRef o, uint flags)
     current = o;
     tmpDynamicProperty.value = Primitive::undefinedValue();
 
-    if (object && object->isNonStrictArgumentsObject) {
+    if (object && object->asArgumentsObject()) {
         Scope scope(object->engine());
         Scoped<ArgumentsObject> (scope, object->asReturnedValue())->fullyCreate();
     }
index a8e78b4..2e631bd 100644 (file)
@@ -157,7 +157,7 @@ ReturnedValue ObjectPrototype::method_getOwnPropertyDescriptor(CallContext *ctx)
     if (!O)
         return ctx->throwTypeError();
 
-    if (O->isNonStrictArgumentsObject)
+    if (ArgumentsObject::isNonStrictArgumentsObject(O.getPointer()))
         Scoped<ArgumentsObject>(scope, O)->fullyCreate();
 
     ScopedValue v(scope, ctx->argument(1));
@@ -287,7 +287,7 @@ ReturnedValue ObjectPrototype::method_freeze(CallContext *ctx)
     if (!o)
         return ctx->throwTypeError();
 
-    if (o->isNonStrictArgumentsObject)
+    if (ArgumentsObject::isNonStrictArgumentsObject(o.getPointer()))
         Scoped<ArgumentsObject>(scope, o)->fullyCreate();
 
     o->extensible = false;