Reviewers: caitp,
Description:
[es6] Fix computed property names in nested literals
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
Please review this at https://codereview.chromium.org/1307943007/
Base URL: https://chromium.googlesource.com/v8/v8.git@master
Affected files (+57, -0 lines):
M src/ast.cc
M test/mjsunit/es6/computed-property-names.js
Index: src/ast.cc
diff --git a/src/ast.cc b/src/ast.cc
index
624d462323a9574c278af3e01a240976509239ac..c61c29bf524ba300573958b13b96b1921e3fc1cd
100644
--- a/src/ast.cc
+++ b/src/ast.cc
@@ -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: test/mjsunit/es6/computed-property-names.js
diff --git a/test/mjsunit/es6/computed-property-names.js
b/test/mjsunit/es6/computed-property-names.js
index
80a047cc9cd3491aca0d9d9bacd390329e08606a..d75278cfe3f9759759dc334776df831c6ff0697c
100644
--- a/test/mjsunit/es6/computed-property-names.js
+++ b/test/mjsunit/es6/computed-property-names.js
@@ -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);
+})();
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.