[es6] Fix computed property names in nested literals
authoradamk <adamk@chromium.org>
Tue, 25 Aug 2015 21:10:34 +0000 (14:10 -0700)
committerCommit bot <commit-bot@chromium.org>
Tue, 25 Aug 2015 21:10:44 +0000 (21:10 +0000)
Make ObjectLiteral::is_simple() false for literals containing computed
property names, which causes IsCompileTimeValue() to return false and
thus force code to be generated for setting up such properties. This
mirrors the handling of '__proto__' in literals.

BUG=v8:4387
LOG=y

Review URL: https://codereview.chromium.org/1307943007

Cr-Commit-Position: refs/heads/master@{#30362}

src/ast.cc
test/mjsunit/es6/computed-property-names.js

index 624d462..c61c29b 100644 (file)
@@ -446,6 +446,7 @@ void ObjectLiteral::BuildConstantProperties(Isolate* isolate) {
 
     if (position == boilerplate_properties_ * 2) {
       DCHECK(property->is_computed_name());
+      is_simple = false;
       break;
     }
     DCHECK(!property->is_computed_name());
index 80a047c..d75278c 100644 (file)
@@ -298,3 +298,59 @@ function ID(x) {
     };
   }, MyError);
 })();
+
+
+(function TestNestedLiterals() {
+  var array = [
+    42,
+    { a: 'A',
+      ['b']: 'B',
+      c: 'C',
+      [ID('d')]: 'D',
+    },
+    43,
+  ];
+  assertEquals(42, array[0]);
+  assertEquals(43, array[2]);
+  assertEquals('A', array[1].a);
+  assertEquals('B', array[1].b);
+  assertEquals('C', array[1].c);
+  assertEquals('D', array[1].d);
+  var object = {
+    outer: 42,
+    inner: {
+      a: 'A',
+      ['b']: 'B',
+      c: 'C',
+      [ID('d')]: 'D',
+    },
+    outer2: 43,
+  };
+  assertEquals(42, object.outer);
+  assertEquals(43, object.outer2);
+  assertEquals('A', object.inner.a);
+  assertEquals('B', object.inner.b);
+  assertEquals('C', object.inner.c);
+  assertEquals('D', object.inner.d);
+  var object = {
+    outer: 42,
+    array: [
+      43,
+      { a: 'A',
+        ['b']: 'B',
+        c: 'C',
+        [ID('d')]: 'D',
+      },
+      44,
+    ],
+    outer2: 45
+  };
+  assertEquals(42, object.outer);
+  assertEquals(45, object.outer2);
+  assertEquals(43, object.array[0]);
+  assertEquals(44, object.array[2]);
+  assertEquals('A', object.array[1].a);
+  assertEquals('B', object.array[1].b);
+  assertEquals('C', object.array[1].c);
+  assertEquals('D', object.array[1].d);
+})();