| 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 73767eb3c6100ee923bbb96d331b657e03d997d7..737cc7b2f93a46547881dde9d746c8ad12414778 100644
|
| --- a/test/cctest/interpreter/test-bytecode-generator.cc
|
| +++ b/test/cctest/interpreter/test-bytecode-generator.cc
|
| @@ -1512,7 +1512,7 @@ TEST(PropertyCall) {
|
| B(Star), R(1), //
|
| B(LoadIC), R(1), U8(0), U8(vector->GetIndex(slot2)), //
|
| B(Star), R(0), //
|
| - B(Call), R(0), R(1), U8(1), U8(vector->GetIndex(slot1)), //
|
| + B(CallIC), R(0), R(1), U8(1), U8(vector->GetIndex(slot1)), //
|
| B(Return), //
|
| },
|
| 1,
|
| @@ -1531,7 +1531,7 @@ TEST(PropertyCall) {
|
| B(Star), R(2), //
|
| B(Ldar), A(3, 4), //
|
| B(Star), R(3), //
|
| - B(Call), R(0), R(1), U8(3), U8(vector->GetIndex(slot1)), //
|
| + B(CallIC), R(0), R(1), U8(3), U8(vector->GetIndex(slot1)), //
|
| B(Return) //
|
| },
|
| 1,
|
| @@ -1553,7 +1553,7 @@ TEST(PropertyCall) {
|
| B(Star), R(2), //
|
| B(Ldar), A(2, 3), //
|
| B(Star), R(3), //
|
| - B(Call), R(0), R(1), U8(3), U8(vector->GetIndex(slot1)), //
|
| + B(CallIC), R(0), R(1), U8(3), U8(vector->GetIndex(slot1)), //
|
| B(Return), //
|
| },
|
| 1,
|
| @@ -1577,7 +1577,7 @@ TEST(PropertyCall) {
|
| B(Star), R(1), //
|
| B(LoadICWide), R(1), U16(0), U16(wide_idx + 4), //
|
| B(Star), R(0), //
|
| - B(CallWide), R16(0), R16(1), U16(1), U16(wide_idx + 2), //
|
| + B(CallICWide), R16(0), R16(1), U16(1), U16(wide_idx + 2), //
|
| B(Return), //
|
| },
|
| 1,
|
| @@ -1826,13 +1826,13 @@ TEST(CallGlobal) {
|
| 1,
|
| 15,
|
| {
|
| - B(StackCheck), //
|
| - B(LdaUndefined), //
|
| - B(Star), R(1), //
|
| - B(LdaGlobal), U8(0), U8(vector->GetIndex(slot2)), //
|
| - B(Star), R(0), //
|
| - B(Call), R(0), R(1), U8(1), U8(vector->GetIndex(slot1)), //
|
| - B(Return) //
|
| + B(StackCheck), //
|
| + B(LdaUndefined), //
|
| + B(Star), R(1), //
|
| + B(LdaGlobal), U8(0), U8(vector->GetIndex(slot2)), //
|
| + B(Star), R(0), //
|
| + B(CallIC), R(0), R(1), U8(1), U8(vector->GetIndex(slot1)), //
|
| + B(Return) //
|
| },
|
| 1,
|
| {"t"}},
|
| @@ -1841,19 +1841,19 @@ TEST(CallGlobal) {
|
| 1,
|
| 27,
|
| {
|
| - B(StackCheck), //
|
| - B(LdaUndefined), //
|
| - B(Star), R(1), //
|
| - B(LdaGlobal), U8(0), U8(vector->GetIndex(slot2)), //
|
| - B(Star), R(0), //
|
| - B(LdaSmi8), U8(1), //
|
| - B(Star), R(2), //
|
| - B(LdaSmi8), U8(2), //
|
| - B(Star), R(3), //
|
| - B(LdaSmi8), U8(3), //
|
| - B(Star), R(4), //
|
| - B(Call), R(0), R(1), U8(4), U8(vector->GetIndex(slot1)), //
|
| - B(Return) //
|
| + B(StackCheck), //
|
| + B(LdaUndefined), //
|
| + B(Star), R(1), //
|
| + B(LdaGlobal), U8(0), U8(vector->GetIndex(slot2)), //
|
| + B(Star), R(0), //
|
| + B(LdaSmi8), U8(1), //
|
| + B(Star), R(2), //
|
| + B(LdaSmi8), U8(2), //
|
| + B(Star), R(3), //
|
| + B(LdaSmi8), U8(3), //
|
| + B(Star), R(4), //
|
| + B(CallIC), R(0), R(1), U8(4), U8(vector->GetIndex(slot1)), //
|
| + B(Return) //
|
| },
|
| 1,
|
| {"t"}},
|
| @@ -2300,7 +2300,7 @@ TEST(DeclareGlobals) {
|
| B(Star), R(2), //
|
| B(LdaGlobal), U8(1), U8(load_vector->GetIndex(load_slot_1)), //
|
| B(Star), R(1), //
|
| - B(Call), R(1), R(2), U8(1), //
|
| + B(CallIC), R(1), R(2), U8(1), //
|
| /* */ U8(load_vector->GetIndex(call_slot_1)), //
|
| B(Star), R(0), //
|
| B(Return) //
|
| @@ -3774,13 +3774,13 @@ TEST(FunctionLiterals) {
|
| 1,
|
| 15,
|
| {
|
| - B(StackCheck), //
|
| - B(LdaUndefined), //
|
| - B(Star), R(1), //
|
| - B(CreateClosure), U8(0), U8(0), //
|
| - B(Star), R(0), //
|
| - B(Call), R(0), R(1), U8(1), U8(vector->GetIndex(slot)), //
|
| - B(Return) //
|
| + B(StackCheck), //
|
| + B(LdaUndefined), //
|
| + B(Star), R(1), //
|
| + B(CreateClosure), U8(0), U8(0), //
|
| + B(Star), R(0), //
|
| + B(CallIC), R(0), R(1), U8(1), U8(vector->GetIndex(slot)), //
|
| + B(Return) //
|
| },
|
| 1,
|
| {InstanceType::SHARED_FUNCTION_INFO_TYPE}},
|
| @@ -3789,15 +3789,15 @@ TEST(FunctionLiterals) {
|
| 1,
|
| 19,
|
| {
|
| - B(StackCheck), //
|
| - B(LdaUndefined), //
|
| - B(Star), R(1), //
|
| - B(CreateClosure), U8(0), U8(0), //
|
| - B(Star), R(0), //
|
| - B(LdaSmi8), U8(1), //
|
| - B(Star), R(2), //
|
| - B(Call), R(0), R(1), U8(2), U8(vector->GetIndex(slot)), //
|
| - B(Return) //
|
| + B(StackCheck), //
|
| + B(LdaUndefined), //
|
| + B(Star), R(1), //
|
| + B(CreateClosure), U8(0), U8(0), //
|
| + B(Star), R(0), //
|
| + B(LdaSmi8), U8(1), //
|
| + B(Star), R(2), //
|
| + B(CallIC), R(0), R(1), U8(2), U8(vector->GetIndex(slot)), //
|
| + B(Return) //
|
| },
|
| 1,
|
| {InstanceType::SHARED_FUNCTION_INFO_TYPE}},
|
| @@ -3861,7 +3861,7 @@ TEST(RegExpLiterals) {
|
| B(Star), R(0), //
|
| B(LdaConstant), U8(2), //
|
| B(Star), R(2), //
|
| - B(Call), R(0), R(1), U8(2), U8(vector->GetIndex(slot1)), //
|
| + B(CallIC), R(0), R(1), U8(2), U8(vector->GetIndex(slot1)), //
|
| B(Return), //
|
| },
|
| 3,
|
| @@ -5036,17 +5036,17 @@ TEST(ContextVariables) {
|
| 1,
|
| 25,
|
| {
|
| - B(CallRuntime), U16(Runtime::kNewFunctionContext), //
|
| - /* */ R(closure), U8(1), //
|
| - B(PushContext), R(0), //
|
| - B(StackCheck), //
|
| - B(LdaUndefined), //
|
| - B(Star), R(2), //
|
| - B(CreateClosure), U8(0), U8(0), //
|
| - B(Star), R(1), //
|
| - B(Call), R(1), R(2), U8(1), U8(vector->GetIndex(slot)), //
|
| - B(LdaContextSlot), R(context), U8(first_context_slot), //
|
| - B(Return), //
|
| + B(CallRuntime), U16(Runtime::kNewFunctionContext), //
|
| + /* */ R(closure), U8(1), //
|
| + B(PushContext), R(0), //
|
| + B(StackCheck), //
|
| + B(LdaUndefined), //
|
| + B(Star), R(2), //
|
| + B(CreateClosure), U8(0), U8(0), //
|
| + B(Star), R(1), //
|
| + B(CallIC), R(1), R(2), U8(1), U8(vector->GetIndex(slot)), //
|
| + B(LdaContextSlot), R(context), U8(first_context_slot), //
|
| + B(Return), //
|
| },
|
| 1,
|
| {InstanceType::SHARED_FUNCTION_INFO_TYPE}},
|
| @@ -5087,7 +5087,7 @@ TEST(ContextVariables) {
|
| "return b",
|
| 3 * kPointerSize,
|
| 1,
|
| - 1042,
|
| + 1041,
|
| {
|
| B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), //
|
| /* */ U8(1), //
|
| @@ -5104,9 +5104,9 @@ TEST(ContextVariables) {
|
| B(StaContextSlot), R(context), U8(wide_slot++)), //
|
| B(LdaUndefined), //
|
| B(Star), R(2), //
|
| - B(LdaGlobal), U8(0), U8(1), //
|
| + B(LdaGlobal), U8(0), U8(1), //
|
| B(Star), R(1), //
|
| - B(Call), R(1), R(2), U8(1), U8(0), //
|
| + B(Call), R(1), R(2), U8(1), //
|
| B(LdaSmi8), U8(100), //
|
| B(StaContextSlotWide), R(context), U16(256), //
|
| B(LdaContextSlotWide), R(context), U16(256), //
|
| @@ -6324,13 +6324,13 @@ DISABLED_TEST(ForOf) {
|
| B(LdaConstant), U8(1), //
|
| B(KeyedLoadIC), R(5), U8(vector->GetIndex(slot2)), //
|
| B(Star), R(4), //
|
| - B(Call), R(4), R(5), U8(1), U8(vector->GetIndex(slot1)), //
|
| + B(CallIC), R(4), R(5), U8(1), U8(vector->GetIndex(slot1)), //
|
| B(Star), R(1), //
|
| B(Ldar), R(1), //
|
| B(Star), R(6), //
|
| B(LoadIC), R(6), U8(2), U8(vector->GetIndex(slot4)), //
|
| B(Star), R(5), //
|
| - B(Call), R(5), R(6), U8(1), U8(vector->GetIndex(slot3)), //
|
| + B(CallIC), R(5), R(6), U8(1), U8(vector->GetIndex(slot3)), //
|
| B(Star), R(2), //
|
| B(Star), R(4), //
|
| B(CallRuntime), U16(Runtime::kInlineIsJSReceiver), R(4), U8(1), //
|
| @@ -6373,13 +6373,13 @@ DISABLED_TEST(ForOf) {
|
| B(LdaConstant), U8(1), //
|
| B(KeyedLoadIC), R(6), U8(vector->GetIndex(slot2)), //
|
| B(Star), R(5), //
|
| - B(Call), R(5), R(6), U8(1), U8(vector->GetIndex(slot1)), //
|
| + B(CallIC), R(5), R(6), U8(1), U8(vector->GetIndex(slot1)), //
|
| B(Star), R(1), //
|
| B(Ldar), R(1), //
|
| B(Star), R(7), //
|
| B(LoadIC), R(7), U8(2), U8(vector->GetIndex(slot4)), //
|
| B(Star), R(6), //
|
| - B(Call), R(6), R(7), U8(1), U8(vector->GetIndex(slot3)), //
|
| + B(CallIC), R(6), R(7), U8(1), U8(vector->GetIndex(slot3)), //
|
| B(Star), R(2), //
|
| B(Star), R(5), //
|
| B(CallRuntime), U16(Runtime::kInlineIsJSReceiver), R(5), U8(1), //
|
| @@ -6424,13 +6424,13 @@ DISABLED_TEST(ForOf) {
|
| B(LdaConstant), U8(1), //
|
| B(KeyedLoadIC), R(5), U8(vector->GetIndex(slot2)), //
|
| B(Star), R(4), //
|
| - B(Call), R(4), R(5), U8(1), U8(vector->GetIndex(slot1)), //
|
| + B(CallIC), R(4), R(5), U8(1), U8(vector->GetIndex(slot1)), //
|
| B(Star), R(1), //
|
| B(Ldar), R(1), //
|
| B(Star), R(6), //
|
| B(LoadIC), R(6), U8(2), U8(vector->GetIndex(slot4)), //
|
| B(Star), R(5), //
|
| - B(Call), R(5), R(6), U8(1), U8(vector->GetIndex(slot3)), //
|
| + B(CallIC), R(5), R(6), U8(1), U8(vector->GetIndex(slot3)), //
|
| B(Star), R(2), //
|
| B(Star), R(4), //
|
| B(CallRuntime), U16(Runtime::kInlineIsJSReceiver), R(4), U8(1), //
|
| @@ -6486,13 +6486,13 @@ DISABLED_TEST(ForOf) {
|
| B(LdaConstant), U8(2), //
|
| B(KeyedLoadIC), R(4), U8(vector->GetIndex(slot2)), //
|
| B(Star), R(3), //
|
| - B(Call), R(3), R(4), U8(1), U8(vector->GetIndex(slot1)), //
|
| + B(CallIC), R(3), R(4), U8(1), U8(vector->GetIndex(slot1)), //
|
| B(Star), R(0), //
|
| B(Ldar), R(0), //
|
| B(Star), R(5), //
|
| B(LoadIC), R(5), U8(3), U8(vector->GetIndex(slot4)), //
|
| B(Star), R(4), //
|
| - B(Call), R(4), R(5), U8(1), U8(vector->GetIndex(slot3)), //
|
| + B(CallIC), R(4), R(5), U8(1), U8(vector->GetIndex(slot3)), //
|
| B(Star), R(1), //
|
| B(Star), R(3), //
|
| B(CallRuntime), U16(Runtime::kInlineIsJSReceiver), R(3), U8(1), //
|
| @@ -7440,7 +7440,7 @@ TEST(Eval) {
|
| {"return eval('1;');",
|
| 9 * kPointerSize,
|
| 1,
|
| - 65,
|
| + 64,
|
| {
|
| B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), //
|
| /* */ U8(1), //
|
| @@ -7468,7 +7468,7 @@ TEST(Eval) {
|
| B(CallRuntime), U16(Runtime::kResolvePossiblyDirectEval), R(4), //
|
| /* */ U8(5), //
|
| B(Star), R(1), //
|
| - B(Call), R(1), R(2), U8(2), U8(0), //
|
| + B(Call), R(1), R(2), U8(2), //
|
| B(Return), //
|
| },
|
| 2,
|
| @@ -7498,7 +7498,7 @@ TEST(LookupSlot) {
|
| {"eval('var x = 10;'); return x;",
|
| 9 * kPointerSize,
|
| 1,
|
| - 67,
|
| + 66,
|
| {
|
| B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), //
|
| /* */ U8(1), //
|
| @@ -7526,7 +7526,7 @@ TEST(LookupSlot) {
|
| B(CallRuntime), U16(Runtime::kResolvePossiblyDirectEval), R(4), //
|
| U8(5), //
|
| B(Star), R(1), //
|
| - B(Call), R(1), R(2), U8(2), U8(0), //
|
| + B(Call), R(1), R(2), U8(2), //
|
| B(LdaLookupSlot), U8(2), //
|
| B(Return), //
|
| },
|
| @@ -7535,7 +7535,7 @@ TEST(LookupSlot) {
|
| {"eval('var x = 10;'); return typeof x;",
|
| 9 * kPointerSize,
|
| 1,
|
| - 68,
|
| + 67,
|
| {
|
| B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), //
|
| /* */ U8(1), //
|
| @@ -7563,7 +7563,7 @@ TEST(LookupSlot) {
|
| B(CallRuntime), U16(Runtime::kResolvePossiblyDirectEval), R(4), //
|
| /* */ U8(5), //
|
| B(Star), R(1), //
|
| - B(Call), R(1), R(2), U8(2), U8(0), //
|
| + B(Call), R(1), R(2), U8(2), //
|
| B(LdaLookupSlotInsideTypeof), U8(2), //
|
| B(TypeOf), //
|
| B(Return), //
|
| @@ -7573,7 +7573,7 @@ TEST(LookupSlot) {
|
| {"x = 20; return eval('');",
|
| 9 * kPointerSize,
|
| 1,
|
| - 69,
|
| + 68,
|
| {
|
| B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), //
|
| U8(1), //
|
| @@ -7603,7 +7603,7 @@ TEST(LookupSlot) {
|
| B(CallRuntime), U16(Runtime::kResolvePossiblyDirectEval), R(4), //
|
| /* */ U8(5), //
|
| B(Star), R(1), //
|
| - B(Call), R(1), R(2), U8(2), U8(0), //
|
| + B(Call), R(1), R(2), U8(2), //
|
| B(Return), //
|
| },
|
| 3,
|
| @@ -7641,7 +7641,7 @@ TEST(CallLookupSlot) {
|
| {"g = function(){}; eval(''); return g();",
|
| 9 * kPointerSize,
|
| 1,
|
| - 85,
|
| + 84,
|
| {
|
| B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), //
|
| /* */ U8(1), //
|
| @@ -7671,12 +7671,12 @@ TEST(CallLookupSlot) {
|
| B(CallRuntime), U16(Runtime::kResolvePossiblyDirectEval), R(4), //
|
| U8(5), //
|
| B(Star), R(1), //
|
| - B(Call), R(1), R(2), U8(2), U8(0), //
|
| + B(Call), R(1), R(2), U8(2), //
|
| B(LdaConstant), U8(1), //
|
| B(Star), R(3), //
|
| B(CallRuntimeForPair), U16(Runtime::kLoadLookupSlotForCall), //
|
| R(3), U8(1), R(1), //
|
| - B(Call), R(1), R(2), U8(1), U8(vector->GetIndex(slot2)), //
|
| + B(CallIC), R(1), R(2), U8(1), U8(vector->GetIndex(slot2)), //
|
| B(Return), //
|
| },
|
| 4,
|
| @@ -9069,7 +9069,7 @@ TEST(ClassDeclarations) {
|
| B(Star), R(6), //
|
| B(CallRuntime), U16(Runtime::kDefineClass), R(3), U8(4), //
|
| B(Star), R(3), //
|
| - B(LoadIC), R(3), U8(1), U8(1), //
|
| + B(LoadIC), R(3), U8(1), U8(1), //
|
| B(Star), R(4), //
|
| B(CallRuntime), U16(Runtime::kFinalizeClassDefinition), R(3), U8(2), //
|
| B(Star), R(0), //
|
| @@ -9096,6 +9096,113 @@ TEST(ClassDeclarations) {
|
| }
|
| }
|
|
|
| +TEST(TailCall) {
|
| + bool old_tailcall_flag = FLAG_harmony_tailcalls;
|
| + FLAG_harmony_tailcalls = true;
|
| +
|
| + InitializedHandleScope handle_scope;
|
| + BytecodeGeneratorHelper helper;
|
| +
|
| + int closure = Register::function_closure().index();
|
| + int context = Register::current_context().index();
|
| + int new_target = Register::new_target().index();
|
| +
|
| + // clang-format off
|
| + ExpectedSnippet<const char*> snippets[] = {
|
| + {"function g() { throw new Error('foo'); };"
|
| + "var eval = g;"
|
| + "function f() {"
|
| + " 'use strict';"
|
| + " return eval('g()');"
|
| + "}",
|
| + 9 * kPointerSize,
|
| + 1,
|
| + 63,
|
| + {
|
| + B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), //
|
| + U8(1), //
|
| + B(PushContext), R(0), //
|
| + B(Ldar), THIS(1), //
|
| + B(StaContextSlot), R(context), U8(4), //
|
| + B(CreateUnmappedArguments), //
|
| + B(StaContextSlot), R(context), U8(5), //
|
| + B(Ldar), R(new_target), //
|
| + B(StaContextSlot), R(context), U8(6), //
|
| + B(StackCheck), //
|
| + B(LdaUndefined), //
|
| + B(Star), R(2), //
|
| + B(LdaGlobal), U8(0), U8(1), //
|
| + B(Star), R(1), //
|
| + B(LdaConstant), U8(1), //
|
| + B(Star), R(3), //
|
| + B(Mov), R(1), R(4), //
|
| + B(Mov), R(3), R(5), //
|
| + B(Mov), R(closure), R(6), //
|
| + B(LdaSmi8), U8(1), //
|
| + B(Star), R(7), //
|
| + B(LdaSmi8), U8(64), //
|
| + B(Star), R(8), //
|
| + B(CallRuntime), U16(Runtime::kResolvePossiblyDirectEval), R(4), //
|
| + U8(5), //
|
| + B(Star), R(1), //
|
| + B(TailCall), R(1), R(2), U8(2), //
|
| + B(Return), //
|
| + },
|
| + 2,
|
| + {"eval",
|
| + "g()"}}
|
| + };
|
| + // clang-format on
|
| +
|
| + for (size_t i = 0; i < arraysize(snippets); i++) {
|
| + Handle<BytecodeArray> bytecode_array =
|
| + helper.MakeBytecodeForFunction(snippets[i].code_snippet);
|
| + CheckBytecodeArrayEqual(snippets[i], bytecode_array);
|
| + }
|
| +
|
| + FLAG_harmony_tailcalls = old_tailcall_flag;
|
| +}
|
| +
|
| +TEST(TailCallIC) {
|
| + bool old_tailcall_flag = FLAG_harmony_tailcalls;
|
| + FLAG_harmony_tailcalls = true;
|
| +
|
| + InitializedHandleScope handle_scope;
|
| + BytecodeGeneratorHelper helper;
|
| +
|
| + // clang-format off
|
| + ExpectedSnippet<const char*> snippets[] = {
|
| + {"function g() { return 0; };"
|
| + "function f() {"
|
| + " 'use strict';"
|
| + " return g();"
|
| + "}",
|
| + 2 * kPointerSize,
|
| + 1,
|
| + 15,
|
| + {
|
| + B(StackCheck), //
|
| + B(LdaUndefined), //
|
| + B(Star), R(1), //
|
| + B(LdaGlobal), U8(0), U8(3), //
|
| + B(Star), R(0), //
|
| + B(TailCallIC), R(0), R(1), U8(1), U8(1), //
|
| + B(Return),
|
| + },
|
| + 1,
|
| + {"g"}}
|
| + };
|
| + // clang-format on
|
| +
|
| + for (size_t i = 0; i < arraysize(snippets); i++) {
|
| + Handle<BytecodeArray> bytecode_array =
|
| + helper.MakeBytecodeForFunction(snippets[i].code_snippet);
|
| + CheckBytecodeArrayEqual(snippets[i], bytecode_array);
|
| + }
|
| +
|
| + FLAG_harmony_tailcalls = old_tailcall_flag;
|
| +}
|
| +
|
| // TODO(oth): Add tests for super keyword.
|
|
|
| } // namespace interpreter
|
|
|