Chromium Code Reviews| 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 e69a5ba06d654d6ca6a46780affd2fa878a329a2..abd072fc2d6166216b0cbcd435b5dc5e254ba4af 100644 |
| --- a/test/cctest/interpreter/test-bytecode-generator.cc |
| +++ b/test/cctest/interpreter/test-bytecode-generator.cc |
| @@ -15,6 +15,8 @@ namespace v8 { |
| namespace internal { |
| namespace interpreter { |
| +static const InstanceType kInstanceTypeDontCare = static_cast<InstanceType>(-1); |
| + |
| class BytecodeGeneratorHelper { |
| public: |
| const char* kFunctionName = "f"; |
| @@ -191,7 +193,9 @@ static void CheckConstant(Handle<Object> expected, Object* actual) { |
| static void CheckConstant(InstanceType expected, Object* actual) { |
| - CHECK_EQ(expected, HeapObject::cast(actual)->map()->instance_type()); |
| + if (expected != kInstanceTypeDontCare) { |
| + CHECK_EQ(expected, HeapObject::cast(actual)->map()->instance_type()); |
| + } |
| } |
| @@ -8289,6 +8293,7 @@ TEST(DoExpression) { |
| FLAG_harmony_do_expressions = old_flag; |
| } |
| + |
| TEST(WithStatement) { |
| InitializedHandleScope handle_scope; |
| BytecodeGeneratorHelper helper; |
| @@ -8341,6 +8346,260 @@ TEST(WithStatement) { |
| } |
| } |
| + |
| +TEST(ClassDeclarations) { |
| + InitializedHandleScope handle_scope; |
| + BytecodeGeneratorHelper helper; |
| + |
| + int closure = Register::function_closure().index(); |
| + int context = Register::current_context().index(); |
| + |
|
rmcilroy
2016/02/04 14:56:41
nit - add // clang-format off / on around the snip
oth
2016/02/04 16:59:48
Done.
|
| + ExpectedSnippet<InstanceType, 12> snippets[] = { |
| + {"class Person {\n" |
| + " constructor(name) { this.name = name; }\n" |
| + " speak() { console.log(this.name + ' is speaking.'); }\n" |
| + "}\n", |
| + 8 * kPointerSize, |
| + 1, |
| + 60, |
| + { |
| + B(LdaTheHole), // |
| + B(Star), R(1), // |
| + B(LdaTheHole), // |
| + B(Star), R(0), // |
| + B(LdaTheHole), // |
| + B(Star), R(2), // |
| + B(CreateClosure), U8(0), U8(0), // |
| + B(Star), R(3), // |
| + B(LdaSmi8), U8(15), // |
| + B(Star), R(4), // |
| + B(LdaConstant), U8(1), // |
| + B(Star), R(5), // |
| + B(CallRuntime), U16(Runtime::kDefineClass), R(2), U8(4), // |
| + B(Star), R(2), // |
| + B(LdaInitialMap), // |
| + B(Star), R(3), // |
| + B(Mov), R(3), R(4), // |
| + B(LdaConstant), U8(2), // |
| + B(Star), R(5), // |
| + B(CreateClosure), U8(3), U8(0), // |
| + B(Star), R(6), // |
| + B(CallRuntime), U16(Runtime::kDefineClassMethod), R(4), U8(3), // |
| + B(CallRuntime), U16(Runtime::kFinalizeClassDefinition), R(2), U8(2), // |
| + B(Star), R(0), // |
| + B(Star), R(1), // |
| + B(LdaUndefined), // |
| + B(Return) // |
| + }, |
| + 4, |
| + { InstanceType::SHARED_FUNCTION_INFO_TYPE, kInstanceTypeDontCare, |
| + InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
| + InstanceType::SHARED_FUNCTION_INFO_TYPE}}, |
| + {"var n0 = 'a';" |
| + "var n1 = 'b';" |
| + "class N {\n" |
| + " [n0]() { return n0; }\n" |
| + " static [n1]() { return n1; }\n" |
| + "}\n", |
| + 9 * kPointerSize, |
| + 1, |
| + 109, |
| + { |
| + B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), // |
| + /* */ U8(1), // |
| + B(PushContext), R(2), // |
| + B(LdaTheHole), // |
| + B(Star), R(1), // |
| + B(LdaConstant), U8(0), // |
| + B(StaContextSlot), R(context), U8(4), // |
| + B(LdaConstant), U8(1), // |
| + B(StaContextSlot), R(context), U8(5), // |
| + B(LdaTheHole), // |
| + B(Star), R(0), // |
| + B(LdaTheHole), // |
| + B(Star), R(3), // |
| + B(CreateClosure), U8(2), U8(0), // |
| + B(Star), R(4), // |
| + B(LdaSmi8), U8(41), // |
| + B(Star), R(5), // |
| + B(LdaSmi8), U8(107), // |
| + B(Star), R(6), // |
| + B(CallRuntime), U16(Runtime::kDefineClass), R(3), U8(4), // |
| + B(Star), R(3), // |
| + B(LdaInitialMap), // |
| + B(Star), R(4), // |
| + B(Mov), R(4), R(5), // |
| + B(LdaContextSlot), R(context), U8(4), // |
| + B(ToName), // |
| + B(Star), R(6), // |
| + B(CreateClosure), U8(3), U8(0), // |
| + B(Star), R(7), // |
| + B(CallRuntime), U16(Runtime::kDefineClassMethod), R(5), U8(3), // |
| + B(Mov), R(3), R(5), // |
| + B(LdaContextSlot), R(context), U8(5), // |
| + B(ToName), // |
| + B(Star), R(6), // |
| + B(LdaConstant), U8(4), // |
| + B(TestEqualStrict), R(6), // |
| + B(JumpIfFalse), U8(7), // |
| + B(CallRuntime), U16(Runtime::kThrowStaticPrototypeError), // |
| + /* */ R(0), U8(0), // |
| + B(CreateClosure), U8(5), U8(0), // |
| + B(Star), R(7), // |
| + B(CallRuntime), U16(Runtime::kDefineClassMethod), R(5), U8(3), // |
| + B(CallRuntime), U16(Runtime::kFinalizeClassDefinition), R(3), U8(2), // |
| + B(Star), R(0), // |
| + B(Star), R(1), // |
| + B(LdaUndefined), // |
| + B(Return), // |
| + }, |
| + 6, |
| + { InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
| + InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
| + InstanceType::SHARED_FUNCTION_INFO_TYPE, |
| + InstanceType::SHARED_FUNCTION_INFO_TYPE, |
| + InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
| + InstanceType::SHARED_FUNCTION_INFO_TYPE}}, |
| + {"class Person {\n" |
| + "}\n" |
| + "class Cyborg extends Person {\n" |
| + " constructor() { this.battery_ = 0; }" |
| + " get battery() { return battery_; }" |
| + " set battery(new_level) { battery_ = new_level; }" |
| + " charge() { battery(100); }" |
| + " static diet() { return 'metal bolts'; }\n" |
| + "}\n" |
| + "return new Cyborg();\n", |
| + 10 * kPointerSize, |
| + 1, |
| + 156, |
| + { |
| + B(LdaTheHole), // |
| + B(Star), R(2), // |
| + B(LdaTheHole), // |
| + B(Star), R(3), // |
| + B(LdaTheHole), // |
| + B(Star), R(0), // |
| + B(LdaTheHole), // |
| + B(Star), R(4), // |
| + B(CreateClosure), U8(0), U8(0), // |
| + B(Star), R(5), // |
| + B(LdaSmi8), U8(15), // |
| + B(Star), R(6), // |
| + B(LdaSmi8), U8(31), // |
| + B(Star), R(7), // |
| + B(CallRuntime), U16(Runtime::kDefineClass), R(4), U8(4), // |
| + B(Star), R(4), // |
| + B(LdaInitialMap), // |
| + B(Star), R(5), // |
| + B(CallRuntime), U16(Runtime::kFinalizeClassDefinition), R(4), U8(2), // |
| + B(Star), R(0), // |
| + B(Star), R(2), // |
| + B(LdaTheHole), // |
| + B(Star), R(1), // |
| + B(Ldar), R(2), // |
| + B(Star), R(4), // |
| + B(CreateClosure), U8(1), U8(0), // |
| + B(Star), R(5), // |
| + B(LdaSmi8), U8(32), // |
| + B(Star), R(6), // |
| + B(LdaConstant), U8(2), // |
| + B(Star), R(7), // |
| + B(CallRuntime), U16(Runtime::kDefineClass), R(4), U8(4), // |
| + B(Star), R(4), // |
| + B(LdaInitialMap), // |
| + B(Star), R(5), // |
| + B(Mov), R(5), R(6), // |
| + B(LdaConstant), U8(3), // |
| + B(Star), R(7), // |
| + B(CreateClosure), U8(4), U8(0), // |
| + B(Star), R(8), // |
| + B(LdaSmi8), U8(2), // |
| + B(Star), R(9), // |
| + B(CallRuntime), U16(Runtime::kDefineGetterPropertyUnchecked), // |
| + /* */ R(6), U8(4), // |
| + B(LdaConstant), U8(3), // |
| + B(Star), R(7), // |
| + B(CreateClosure), U8(5), U8(0), // |
| + B(Star), R(8), // |
| + B(CallRuntime), U16(Runtime::kDefineSetterPropertyUnchecked), // |
| + /* */ R(6), U8(4), // |
| + B(LdaConstant), U8(6), // |
| + B(Star), R(7), // |
| + B(CreateClosure), U8(7), U8(0), // |
| + B(Star), R(8), // |
| + B(CallRuntime), U16(Runtime::kDefineClassMethod), R(6), U8(3), // |
| + B(Mov), R(4), R(6), // |
| + B(LdaConstant), U8(8), // |
| + B(Star), R(7), // |
| + B(CreateClosure), U8(9), U8(0), // |
| + B(Star), R(8), // |
| + B(CallRuntime), U16(Runtime::kDefineClassMethod), R(6), U8(3), // |
| + B(CallRuntime), U16(Runtime::kFinalizeClassDefinition), R(4), U8(2), // |
| + B(Star), R(1), // |
| + B(Star), R(3), // |
| + B(Star), R(4), // |
| + B(New), R(4), R(0), U8(0), // |
| + B(Return), // |
| + }, |
| + 10, |
| + { InstanceType::SHARED_FUNCTION_INFO_TYPE, |
| + InstanceType::SHARED_FUNCTION_INFO_TYPE, |
| + kInstanceTypeDontCare, |
| + InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
| + InstanceType::SHARED_FUNCTION_INFO_TYPE, |
| + InstanceType::SHARED_FUNCTION_INFO_TYPE, |
| + InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
| + InstanceType::SHARED_FUNCTION_INFO_TYPE, |
| + InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
| + InstanceType::SHARED_FUNCTION_INFO_TYPE, |
| + } |
| + }, |
| + {"var count = 0;\n" |
| + "class C { constructor() { count++; }}\n" |
| + "return new C();\n", |
| + 9 * kPointerSize, |
| + 1, |
| + 59, |
| + { |
| + B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), U8(1), // |
| + B(PushContext), R(2), // |
| + B(LdaTheHole), // |
| + B(Star), R(1), // |
| + B(LdaZero), // |
| + B(StaContextSlot), R(context), U8(4), // |
| + B(LdaTheHole), // |
| + B(Star), R(0), // |
| + B(LdaTheHole), // |
| + B(Star), R(3), // |
| + B(CreateClosure), U8(0), U8(0), // |
| + B(Star), R(4), // |
| + B(LdaSmi8), U8(30), // |
| + B(Star), R(5), // |
| + B(LdaSmi8), U8(67), // |
| + B(Star), R(6), // |
| + B(CallRuntime), U16(Runtime::kDefineClass), R(3), U8(4), // |
| + B(Star), R(3), // |
| + B(LdaInitialMap), // |
| + B(Star), R(4), // |
| + B(CallRuntime), U16(Runtime::kFinalizeClassDefinition), R(3), U8(2), // |
| + B(Star), R(0), // |
| + B(Star), R(1), // |
| + B(Star), R(3), // |
| + B(New), R(3), R(0), U8(0), // |
| + B(Return), // |
| + }, |
| + 1, |
| + { 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); |
| + } |
| +} |
| + |
| } // namespace interpreter |
| } // namespace internal |
| } // namespace v8 |