Simplify logic for put and putIndexed
authorLars Knoll <lars.knoll@digia.com>
Fri, 12 Apr 2013 12:36:41 +0000 (14:36 +0200)
committerSimon Hausmann <simon.hausmann@digia.com>
Fri, 12 Apr 2013 13:26:46 +0000 (15:26 +0200)
Change-Id: Ia67dc06f505fdb064a22920a9786708aa6d83e6e
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
src/v4/qv4object.cpp

index 45ce45e..0937a98 100644 (file)
@@ -510,31 +510,21 @@ void Object::internalPut(ExecutionContext *ctx, String *name, const Value &value
         if (!extensible)
             goto reject;
     } else {
-        PropertyAttributes attrs;
-        if (Property *p = prototype->__getPropertyDescriptor__(ctx, name, &attrs)) {
+        // clause 4
+        if ((pd = prototype->__getPropertyDescriptor__(ctx, name, &attrs))) {
             if (attrs.isAccessor()) {
-                if (p->setter())
-                    goto cont;
+                if (!pd->setter())
+                    goto reject;
+            } else if (!extensible || !attrs.isWritable()) {
                 goto reject;
             }
-            if (!extensible)
-                goto reject;
-            if (!attrs.isWritable())
-                goto reject;
-        } else {
-            if (!extensible)
-                goto reject;
+        } else if (!extensible) {
+            goto reject;
         }
     }
 
     cont:
 
-
-    // clause 4
-    // ### should be able to remove these two lines (see call 15 lines above)
-    if (!pd && prototype)
-        pd = prototype->__getPropertyDescriptor__(ctx, name, &attrs);
-
     // Clause 5
     if (pd && attrs.isAccessor()) {
         assert(pd->setter() != 0);
@@ -593,30 +583,21 @@ void Object::internalPutIndexed(ExecutionContext *ctx, uint index, const Value &
         if (!extensible)
             goto reject;
     } else {
-        PropertyAttributes attrs;
-        if (Property *p = prototype->__getPropertyDescriptor__(ctx, index, &attrs)) {
+        // clause 4
+        if ((pd = prototype->__getPropertyDescriptor__(ctx, index, &attrs))) {
             if (attrs.isAccessor()) {
-                if (p->setter())
-                    goto cont;
+                if (!pd->setter())
+                    goto reject;
+            } else if (!extensible || !attrs.isWritable()) {
                 goto reject;
             }
-            if (!extensible)
-                goto reject;
-            if (!attrs.isWritable())
-                goto reject;
-        } else {
-            if (!extensible)
-                goto reject;
+        } else if (!extensible) {
+            goto reject;
         }
     }
 
     cont:
 
-    // clause 4
-    // ### remove and replace with 15 lines above...
-    if (!pd && prototype)
-        pd = prototype->__getPropertyDescriptor__(ctx, index, &attrs);
-
     // Clause 5
     if (pd && attrs.isAccessor()) {
         assert(pd->setter() != 0);