Index: test/cctest/interpreter/test-bytecode-generator.cc |
diff --git a/test/cctest/interpreter/test-bytecode-generator.cc b/test/cctest/interpreter/test-bytecode-generator.cc |
index 459fe6232c7162ad1e00baefc4651fc91b408f82..4046832fa95155036fd532050b01a075f9ed8543 100644 |
--- a/test/cctest/interpreter/test-bytecode-generator.cc |
+++ b/test/cctest/interpreter/test-bytecode-generator.cc |
@@ -95,7 +95,7 @@ struct ExpectedSnippet { |
int bytecode_length; |
const uint8_t bytecode[512]; |
int constant_count; |
- T constants[4]; |
+ T constants[6]; |
}; |
@@ -1238,7 +1238,7 @@ TEST(IfConditions) { |
B(LdaUndefined), // |
B(Return)}, // |
0, |
- {unused, unused, unused, unused}}, |
+ {unused, unused, unused, unused, unused, unused}}, |
{"function f() { if ('lucky') { return 1; } else { return -1; } } f();", |
0, |
1, |
@@ -1255,7 +1255,7 @@ TEST(IfConditions) { |
B(Return)}, // |
1, |
{helper.factory()->NewStringFromStaticChars("lucky"), unused, unused, |
- unused}}, |
+ unused, unused, unused}}, |
{"function f() { if (false) { return 1; } else { return -1; } } f();", |
0, |
1, |
@@ -1270,7 +1270,7 @@ TEST(IfConditions) { |
B(LdaUndefined), // |
B(Return)}, // |
0, |
- {unused, unused, unused, unused}}, |
+ {unused, unused, unused, unused, unused, unused}}, |
{"function f(a) { if (a <= 0) { return 200; } else { return -200; } }" |
"f(99);", |
kPointerSize, |
@@ -1290,7 +1290,8 @@ TEST(IfConditions) { |
B(Return)}, // |
2, |
{helper.factory()->NewNumberFromInt(200), |
- helper.factory()->NewNumberFromInt(-200), unused, unused}}, |
+ helper.factory()->NewNumberFromInt(-200), unused, unused, unused, |
+ unused}}, |
{"function f(a, b) { if (a in b) { return 200; } }" |
"f('prop', { prop: 'yes'});", |
kPointerSize, |
@@ -1306,7 +1307,8 @@ TEST(IfConditions) { |
B(LdaUndefined), // |
B(Return)}, // |
1, |
- {helper.factory()->NewNumberFromInt(200), unused, unused, unused}}, |
+ {helper.factory()->NewNumberFromInt(200), unused, unused, unused, unused, |
+ unused}}, |
{"function f(z) { var a = 0; var b = 0; if (a === 0.01) { " |
#define X "b = a; a = b; " |
X X X X X X X X X X X X X X X X X X X X X X X X |
@@ -1338,7 +1340,8 @@ TEST(IfConditions) { |
{helper.factory()->NewHeapNumber(0.01), |
helper.factory()->NewNumberFromInt(200), |
helper.factory()->NewNumberFromInt(199), |
- helper.factory()->NewNumberFromInt(-200)}}, |
+ helper.factory()->NewNumberFromInt(-200), |
+ unused, unused}}, |
{"function f(a, b) {\n" |
" if (a == b) { return 1; }\n" |
" if (a === b) { return 1; }\n" |
@@ -1376,7 +1379,7 @@ TEST(IfConditions) { |
B(LdaZero), // |
B(Return)}, // |
0, |
- {unused, unused, unused, unused}}, |
+ {unused, unused, unused, unused, unused, unused}}, |
}; |
for (size_t i = 0; i < arraysize(snippets); i++) { |
@@ -2051,6 +2054,455 @@ TEST(ArrayLiterals) { |
} |
} |
+ |
+TEST(ObjectLiterals) { |
+ InitializedHandleScope handle_scope; |
+ BytecodeGeneratorHelper helper; |
+ |
+ int simple_flags = ObjectLiteral::kFastElements | |
+ ObjectLiteral::kShallowProperties | |
+ ObjectLiteral::kDisableMementos; |
+ int deep_elements_flags = |
+ ObjectLiteral::kFastElements | ObjectLiteral::kDisableMementos; |
+ ExpectedSnippet<InstanceType> snippets[] = { |
+ {"return { };", |
+ 0, |
+ 1, |
+ 6, |
+ { |
+ B(LdaConstant), U8(0), // |
+ B(CreateObjectLiteral), U8(0), U8(simple_flags), // |
+ B(Return) // |
+ }, |
+ 1, |
+ {InstanceType::FIXED_ARRAY_TYPE}}, |
+ {"return { name: 'string', val: 9.2 };", |
+ 0, |
+ 1, |
+ 6, |
+ { |
+ B(LdaConstant), U8(0), // |
+ B(CreateObjectLiteral), U8(0), U8(deep_elements_flags), // |
+ B(Return) // |
+ }, |
+ 1, |
+ {InstanceType::FIXED_ARRAY_TYPE}}, |
+ {"var a = 1; return { name: 'string', val: a };", |
+ 3 * kPointerSize, |
+ 1, |
+ 24, |
+ { |
+ B(LdaSmi8), U8(1), // |
+ B(Star), R(0), // |
+ B(LdaConstant), U8(0), // |
+ B(CreateObjectLiteral), U8(0), U8(deep_elements_flags), // |
+ B(Star), R(1), // |
+ B(LdaConstant), U8(1), // |
+ B(Star), R(2), // |
+ B(Ldar), R(0), // |
+ B(StoreICSloppy), R(1), R(2), U8(3), // |
+ B(Ldar), R(1), // |
+ B(Return), // |
+ }, |
+ 2, |
+ {InstanceType::FIXED_ARRAY_TYPE, |
+ InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, |
+ {"var a = 1; return { val: a, val: a + 1 };", |
+ 4 * kPointerSize, |
+ 1, |
+ 32, |
+ { |
+ B(LdaSmi8), U8(1), // |
+ B(Star), R(0), // |
+ B(LdaConstant), U8(0), // |
+ B(CreateObjectLiteral), U8(0), U8(deep_elements_flags), // |
+ B(Star), R(1), // |
+ B(Ldar), R(0), // |
+ B(LdaConstant), U8(1), // |
+ B(Star), R(2), // |
+ B(Ldar), R(0), // |
+ B(Star), R(3), // |
+ B(LdaSmi8), U8(1), // |
+ B(Add), R(3), // |
+ B(StoreICSloppy), R(1), R(2), U8(3), // |
+ B(Ldar), R(1), // |
+ B(Return), // |
+ }, |
+ 2, |
+ {InstanceType::FIXED_ARRAY_TYPE, |
+ InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, |
+ {"return { func: function() { } };", |
+ 2 * kPointerSize, |
+ 1, |
+ 22, |
+ { |
+ B(LdaConstant), U8(0), // |
+ B(CreateObjectLiteral), U8(0), U8(deep_elements_flags), // |
+ B(Star), R(0), // |
+ B(LdaConstant), U8(1), // |
+ B(Star), R(1), // |
+ B(LdaConstant), U8(2), // |
+ B(CreateClosure), U8(0), // |
+ B(StoreICSloppy), R(0), R(1), U8(3), // |
+ B(Ldar), R(0), // |
+ B(Return), // |
+ }, |
+ 3, |
+ {InstanceType::FIXED_ARRAY_TYPE, |
+ InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
+ InstanceType::SHARED_FUNCTION_INFO_TYPE}}, |
+ {"return { func(a) { return a; } };", |
+ 2 * kPointerSize, |
+ 1, |
+ 22, |
+ { |
+ B(LdaConstant), U8(0), // |
+ B(CreateObjectLiteral), U8(0), U8(deep_elements_flags), // |
+ B(Star), R(0), // |
+ B(LdaConstant), U8(1), // |
+ B(Star), R(1), // |
+ B(LdaConstant), U8(2), // |
+ B(CreateClosure), U8(0), // |
+ B(StoreICSloppy), R(0), R(1), U8(3), // |
+ B(Ldar), R(0), // |
+ B(Return), // |
+ }, |
+ 3, |
+ {InstanceType::FIXED_ARRAY_TYPE, |
+ InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
+ InstanceType::SHARED_FUNCTION_INFO_TYPE}}, |
+ {"return { get a() { return 2; } };", |
+ 5 * kPointerSize, |
+ 1, |
+ 31, |
+ { |
+ B(LdaConstant), U8(0), // |
+ B(CreateObjectLiteral), U8(0), U8(deep_elements_flags), // |
+ B(Star), R(0), // |
+ B(LdaConstant), U8(1), // |
+ B(Star), R(1), // |
+ B(LdaConstant), U8(2), // |
+ B(CreateClosure), U8(0), // |
+ B(Star), R(2), // |
+ B(LdaNull), // |
+ B(Star), R(3), // |
+ B(LdaZero), // |
+ B(Star), R(4), // |
+ B(CallRuntime), U16(Runtime::kDefineAccessorPropertyUnchecked), // |
+ R(0), U8(5), // |
+ B(Ldar), R(0), // |
+ B(Return), // |
+ }, |
+ 3, |
+ {InstanceType::FIXED_ARRAY_TYPE, |
+ InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
+ InstanceType::SHARED_FUNCTION_INFO_TYPE}}, |
+ {"return { get a() { return this.x; }, set a(val) { this.x = val } };", |
+ 5 * kPointerSize, |
+ 1, |
+ 34, |
+ { |
+ B(LdaConstant), U8(0), // |
+ B(CreateObjectLiteral), U8(0), U8(deep_elements_flags), // |
+ B(Star), R(0), // |
+ B(LdaConstant), U8(1), // |
+ B(Star), R(1), // |
+ B(LdaConstant), U8(2), // |
+ B(CreateClosure), U8(0), // |
+ B(Star), R(2), // |
+ B(LdaConstant), U8(3), // |
+ B(CreateClosure), U8(0), // |
+ B(Star), R(3), // |
+ B(LdaZero), // |
+ B(Star), R(4), // |
+ B(CallRuntime), U16(Runtime::kDefineAccessorPropertyUnchecked), // |
+ R(0), U8(5), // |
+ B(Ldar), R(0), // |
+ B(Return), // |
+ }, |
+ 4, |
+ {InstanceType::FIXED_ARRAY_TYPE, |
+ InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
+ InstanceType::SHARED_FUNCTION_INFO_TYPE, |
+ InstanceType::SHARED_FUNCTION_INFO_TYPE}}, |
+ {"return { get a() { return this.x; }, set b(val) { this.y = val } };", |
+ 5 * kPointerSize, |
+ 1, |
+ 52, |
+ { |
+ B(LdaConstant), U8(0), // |
+ B(CreateObjectLiteral), U8(0), U8(deep_elements_flags), // |
+ B(Star), R(0), // |
+ B(LdaConstant), U8(1), // |
+ B(Star), R(1), // |
+ B(LdaConstant), U8(2), // |
+ B(CreateClosure), U8(0), // |
+ B(Star), R(2), // |
+ B(LdaNull), // |
+ B(Star), R(3), // |
+ B(LdaZero), // |
+ B(Star), R(4), // |
+ B(CallRuntime), U16(Runtime::kDefineAccessorPropertyUnchecked), // |
+ R(0), U8(5), // |
+ B(LdaConstant), U8(3), // |
+ B(Star), R(1), // |
+ B(LdaNull), // |
+ B(Star), R(2), // |
+ B(LdaConstant), U8(4), // |
+ B(CreateClosure), U8(0), // |
+ B(Star), R(3), // |
+ B(LdaZero), // |
+ B(Star), R(4), // |
+ B(CallRuntime), U16(Runtime::kDefineAccessorPropertyUnchecked), // |
+ R(0), U8(5), // |
+ B(Ldar), R(0), // |
+ B(Return), // |
+ }, |
+ 5, |
+ {InstanceType::FIXED_ARRAY_TYPE, |
+ InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
+ InstanceType::SHARED_FUNCTION_INFO_TYPE, |
+ InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
+ InstanceType::SHARED_FUNCTION_INFO_TYPE}}, |
+ {"var a = 1; return { 1: a };", |
+ 5 * kPointerSize, |
+ 1, |
+ 30, |
+ { |
+ B(LdaSmi8), U8(1), // |
+ B(Star), R(0), // |
+ B(LdaConstant), U8(0), // |
+ B(CreateObjectLiteral), U8(0), U8(deep_elements_flags), // |
+ B(Star), R(1), // |
+ B(LdaSmi8), U8(1), // |
+ B(Star), R(2), // |
+ B(Ldar), R(0), // |
+ B(Star), R(3), // |
+ B(LdaZero), // |
+ B(Star), R(4), // |
+ B(CallRuntime), U16(Runtime::kSetProperty), R(1), U8(4), // |
+ B(Ldar), R(1), // |
+ B(Return), // |
+ }, |
+ 1, |
+ {InstanceType::FIXED_ARRAY_TYPE}}, |
+ {"return { __proto__: null }", |
+ 2 * kPointerSize, |
+ 1, |
+ 18, |
+ { |
+ B(LdaConstant), U8(0), // |
+ B(CreateObjectLiteral), U8(0), U8(simple_flags), // |
+ B(Star), R(0), // |
+ B(LdaNull), B(Star), R(1), // |
+ B(CallRuntime), U16(Runtime::kInternalSetPrototype), R(0), U8(2), // |
+ B(Ldar), R(0), // |
+ B(Return), // |
+ }, |
+ 1, |
+ {InstanceType::FIXED_ARRAY_TYPE}}, |
+ {"var a = 'test'; return { [a]: 1 }", |
+ 5 * kPointerSize, |
+ 1, |
+ 31, |
+ { |
+ B(LdaConstant), U8(0), // |
+ B(Star), R(0), // |
+ B(LdaConstant), U8(1), // |
+ B(CreateObjectLiteral), U8(0), U8(simple_flags), // |
+ B(Star), R(1), // |
+ B(Ldar), R(0), // |
+ B(ToName), // |
+ B(Star), R(2), // |
+ B(LdaSmi8), U8(1), // |
+ B(Star), R(3), // |
+ B(LdaZero), // |
+ B(Star), R(4), // |
+ B(CallRuntime), U16(Runtime::kDefineDataPropertyUnchecked), R(1), // |
+ U8(4), // |
+ B(Ldar), R(1), // |
+ B(Return), // |
+ }, |
+ 2, |
+ {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
+ InstanceType::FIXED_ARRAY_TYPE}}, |
+ {"var a = 'test'; return { val: a, [a]: 1 }", |
+ 5 * kPointerSize, |
+ 1, |
+ 41, |
+ { |
+ B(LdaConstant), U8(0), // |
+ B(Star), R(0), // |
+ B(LdaConstant), U8(1), // |
+ B(CreateObjectLiteral), U8(0), U8(deep_elements_flags), // |
+ B(Star), R(1), // |
+ B(LdaConstant), U8(2), // |
+ B(Star), R(2), // |
+ B(Ldar), R(0), // |
+ B(StoreICSloppy), R(1), R(2), U8(3), // |
+ B(Ldar), R(0), // |
+ B(ToName), // |
+ B(Star), R(2), // |
+ B(LdaSmi8), U8(1), // |
+ B(Star), R(3), // |
+ B(LdaZero), // |
+ B(Star), R(4), // |
+ B(CallRuntime), U16(Runtime::kDefineDataPropertyUnchecked), R(1), // |
+ U8(4), // |
+ B(Ldar), R(1), // |
+ B(Return), // |
+ }, |
+ 3, |
+ {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
+ InstanceType::FIXED_ARRAY_TYPE, |
+ InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, |
+ {"var a = 'test'; return { [a]: 1, __proto__: {} }", |
+ 5 * kPointerSize, |
+ 1, |
+ 43, |
+ { |
+ B(LdaConstant), U8(0), // |
+ B(Star), R(0), // |
+ B(LdaConstant), U8(1), // |
+ B(CreateObjectLiteral), U8(1), U8(simple_flags), // |
+ B(Star), R(1), // |
+ B(Ldar), R(0), // |
+ B(ToName), // |
+ B(Star), R(2), // |
+ B(LdaSmi8), U8(1), // |
+ B(Star), R(3), // |
+ B(LdaZero), // |
+ B(Star), R(4), // |
+ B(CallRuntime), U16(Runtime::kDefineDataPropertyUnchecked), R(1), // |
+ U8(4), // |
+ B(LdaConstant), U8(1), // |
+ B(CreateObjectLiteral), U8(0), U8(13), // |
+ B(Star), R(2), // |
+ B(CallRuntime), U16(Runtime::kInternalSetPrototype), R(1), U8(2), // |
+ B(Ldar), R(1), // |
+ B(Return), // |
+ }, |
+ 2, |
+ {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
+ InstanceType::FIXED_ARRAY_TYPE}}, |
+ {"var n = 'name'; return { [n]: 'val', get a() { }, set a(b) {} };", |
+ 5 * kPointerSize, |
+ 1, |
+ 69, |
+ { |
+ B(LdaConstant), U8(0), // |
+ B(Star), R(0), // |
+ B(LdaConstant), U8(1), // |
+ B(CreateObjectLiteral), U8(0), U8(simple_flags), // |
+ B(Star), R(1), // |
+ B(Ldar), R(0), // |
+ B(ToName), // |
+ B(Star), R(2), // |
+ B(LdaConstant), U8(2), // |
+ B(Star), R(3), // |
+ B(LdaZero), // |
+ B(Star), R(4), // |
+ B(CallRuntime), U16(Runtime::kDefineDataPropertyUnchecked), R(1), // |
+ U8(4), // |
+ B(LdaConstant), U8(3), // |
+ B(ToName), // |
+ B(Star), R(2), // |
+ B(LdaConstant), U8(4), // |
+ B(CreateClosure), U8(0), // |
+ B(Star), R(3), // |
+ B(LdaZero), // |
+ B(Star), R(4), // |
+ B(CallRuntime), U16(Runtime::kDefineGetterPropertyUnchecked), // |
+ R(1), U8(4), // |
+ B(LdaConstant), U8(3), // |
+ B(ToName), // |
+ B(Star), R(2), // |
+ B(LdaConstant), U8(5), // |
+ B(CreateClosure), U8(0), // |
+ B(Star), R(3), // |
+ B(LdaZero), // |
+ B(Star), R(4), // |
+ B(CallRuntime), U16(Runtime::kDefineSetterPropertyUnchecked), // |
+ R(1), U8(4), // |
+ B(Ldar), R(1), // |
+ B(Return), // |
+ }, |
+ 6, |
+ {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
+ InstanceType::FIXED_ARRAY_TYPE, |
+ InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
+ InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
+ InstanceType::SHARED_FUNCTION_INFO_TYPE, |
+ InstanceType::SHARED_FUNCTION_INFO_TYPE}}, |
+ }; |
+ |
+ for (size_t i = 0; i < arraysize(snippets); i++) { |
+ Handle<BytecodeArray> bytecode_array = |
+ helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); |
+ CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
+ } |
+} |
+ |
+ |
+TEST(TopLevelObjectLiterals) { |
+ InitializedHandleScope handle_scope; |
+ BytecodeGeneratorHelper helper; |
+ |
+ int has_function_flags = ObjectLiteral::kFastElements | |
+ ObjectLiteral::kHasFunction | |
+ ObjectLiteral::kDisableMementos; |
+ ExpectedSnippet<InstanceType> snippets[] = { |
+ {"var a = { func: function() { } };", |
+ 7 * kPointerSize, |
+ 1, |
+ 69, |
+ { |
+ B(Ldar), R(Register::function_closure().index()), // |
+ B(Star), R(2), // |
+ B(LdaConstant), U8(0), // |
+ B(Star), R(3), // |
+ B(CallRuntime), U16(Runtime::kNewScriptContext), R(2), U8(2), // |
+ B(PushContext), R(1), // |
+ B(LdaConstant), U8(1), // |
+ B(Star), R(2), // |
+ B(LdaZero), // |
+ B(Star), R(3), // |
+ B(CallRuntime), U16(Runtime::kDeclareGlobals), R(2), U8(2), // |
+ B(LdaConstant), U8(2), // |
+ B(Star), R(2), // |
+ B(LdaZero), // |
+ B(Star), R(3), // |
+ B(LdaConstant), U8(3), // |
+ B(CreateObjectLiteral), U8(0), U8(has_function_flags), // |
+ B(Star), R(5), // |
+ B(LdaConstant), U8(4), // |
+ B(Star), R(6), // |
+ B(LdaConstant), U8(5), // |
+ B(CreateClosure), U8(1), // |
+ B(StoreICSloppy), R(5), R(6), U8(3), // |
+ B(CallRuntime), U16(Runtime::kToFastProperties), R(5), U8(1), // |
+ B(Ldar), R(5), // |
+ B(Star), R(4), // |
+ B(CallRuntime), U16(Runtime::kInitializeVarGlobal), R(2), U8(3), // |
+ B(LdaUndefined), // |
+ B(Return), // |
+ }, |
+ 6, |
+ {InstanceType::FIXED_ARRAY_TYPE, |
+ InstanceType::FIXED_ARRAY_TYPE, |
+ InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
+ InstanceType::FIXED_ARRAY_TYPE, |
+ InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
+ InstanceType::SHARED_FUNCTION_INFO_TYPE}}, |
+ }; |
+ |
+ for (size_t i = 0; i < arraysize(snippets); i++) { |
+ Handle<BytecodeArray> bytecode_array = |
+ helper.MakeTopLevelBytecode(snippets[i].code_snippet); |
+ CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
+ } |
+} |
+ |
} // namespace interpreter |
} // namespace internal |
} // namespace v8 |