| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/compiler.h" | 7 #include "src/compiler.h" |
| 8 #include "src/interpreter/bytecode-array-iterator.h" | 8 #include "src/interpreter/bytecode-array-iterator.h" |
| 9 #include "src/interpreter/bytecode-generator.h" | 9 #include "src/interpreter/bytecode-generator.h" |
| 10 #include "src/interpreter/interpreter.h" | 10 #include "src/interpreter/interpreter.h" |
| (...skipping 2306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2317 B(Ldar), R(0), // | 2317 B(Ldar), R(0), // |
| 2318 B(Star), R(1), // | 2318 B(Star), R(1), // |
| 2319 B(Jump), U8(2), // | 2319 B(Jump), U8(2), // |
| 2320 B(PopContext), R(context), // | 2320 B(PopContext), R(context), // |
| 2321 B(LdaUndefined), // | 2321 B(LdaUndefined), // |
| 2322 B(Return), // | 2322 B(Return), // |
| 2323 }, | 2323 }, |
| 2324 2, | 2324 2, |
| 2325 {InstanceType::FIXED_ARRAY_TYPE, | 2325 {InstanceType::FIXED_ARRAY_TYPE, |
| 2326 InstanceType::SHARED_FUNCTION_INFO_TYPE}}, | 2326 InstanceType::SHARED_FUNCTION_INFO_TYPE}}, |
| 2327 {"let x = 1;\n" |
| 2328 "outer: {\n" |
| 2329 " inner: {\n" |
| 2330 " let y = 2;\n" |
| 2331 " function f() { return x + y; }\n" |
| 2332 " if (y) break outer;\n" |
| 2333 " y = 3;\n" |
| 2334 " }\n" |
| 2335 "}\n" |
| 2336 "x = 4;", |
| 2337 6 * kPointerSize, |
| 2338 1, |
| 2339 72, |
| 2340 { |
| 2341 B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), // |
| 2342 U8(1), // |
| 2343 B(PushContext), R(2), // |
| 2344 B(LdaTheHole), // |
| 2345 B(StaContextSlot), R(2), U8(4), // |
| 2346 B(LdaSmi8), U8(1), // |
| 2347 B(StaContextSlot), R(2), U8(4), // |
| 2348 B(LdaConstant), U8(0), // |
| 2349 B(Star), R(4), // |
| 2350 B(Ldar), R(closure), // |
| 2351 B(Star), R(5), // |
| 2352 B(CallRuntime), U16(Runtime::kPushBlockContext), R(4), U8(2), // |
| 2353 B(PushContext), R(3), // |
| 2354 B(LdaTheHole), // |
| 2355 B(StaContextSlot), R(3), U8(4), // |
| 2356 B(CreateClosure), U8(1), U8(0), // |
| 2357 B(Star), R(0), // |
| 2358 B(LdaSmi8), U8(2), // |
| 2359 B(StaContextSlot), R(3), U8(4), // |
| 2360 B(Ldar), R(0), // |
| 2361 B(Star), R(1), // |
| 2362 B(LdaContextSlot), R(3), U8(4), // |
| 2363 B(JumpIfToBooleanFalse), U8(6), // |
| 2364 B(PopContext), R(2), // |
| 2365 B(Jump), U8(9), // |
| 2366 B(LdaSmi8), U8(3), // |
| 2367 B(StaContextSlot), R(3), U8(4), // |
| 2368 B(PopContext), R(2), // |
| 2369 B(LdaSmi8), U8(4), // |
| 2370 B(StaContextSlot), R(2), U8(4), // |
| 2371 B(LdaUndefined), // |
| 2372 B(Return), // |
| 2373 }, |
| 2374 2, |
| 2375 {InstanceType::FIXED_ARRAY_TYPE, |
| 2376 InstanceType::SHARED_FUNCTION_INFO_TYPE}}, |
| 2327 }; | 2377 }; |
| 2328 | 2378 |
| 2329 for (size_t i = 0; i < arraysize(snippets); i++) { | 2379 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 2330 Handle<BytecodeArray> bytecode_array = | 2380 Handle<BytecodeArray> bytecode_array = |
| 2331 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); | 2381 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); |
| 2332 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 2382 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
| 2333 } | 2383 } |
| 2334 } | 2384 } |
| 2335 | 2385 |
| 2336 | 2386 |
| 2337 TEST(BasicLoops) { | 2387 TEST(BasicLoops) { |
| 2338 InitializedHandleScope handle_scope; | 2388 InitializedHandleScope handle_scope; |
| 2339 BytecodeGeneratorHelper helper; | 2389 BytecodeGeneratorHelper helper; |
| 2340 | 2390 |
| 2341 ExpectedSnippet<int> snippets[] = { | 2391 int closure = Register::function_closure().index(); |
| 2392 int context = Register::function_context().index(); |
| 2393 |
| 2394 ExpectedSnippet<InstanceType> snippets[] = { |
| 2342 {"var x = 0;\n" | 2395 {"var x = 0;\n" |
| 2343 "while (false) { x = 99; break; continue; }\n" | 2396 "while (false) { x = 99; break; continue; }\n" |
| 2344 "return x;", | 2397 "return x;", |
| 2345 1 * kPointerSize, | 2398 1 * kPointerSize, |
| 2346 1, | 2399 1, |
| 2347 4, | 2400 4, |
| 2348 { | 2401 { |
| 2349 B(LdaZero), // | 2402 B(LdaZero), // |
| 2350 B(Star), R(0), // | 2403 B(Star), R(0), // |
| 2351 B(Return) // | 2404 B(Return) // |
| (...skipping 591 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2943 B(Jump), U8(10), // | 2996 B(Jump), U8(10), // |
| 2944 B(Ldar), R(1), // | 2997 B(Ldar), R(1), // |
| 2945 B(ToNumber), // | 2998 B(ToNumber), // |
| 2946 B(Inc), // | 2999 B(Inc), // |
| 2947 B(Star), R(1), // | 3000 B(Star), R(1), // |
| 2948 B(Jump), U8(-26), // | 3001 B(Jump), U8(-26), // |
| 2949 B(Ldar), R(0), // | 3002 B(Ldar), R(0), // |
| 2950 B(Return), // | 3003 B(Return), // |
| 2951 }, | 3004 }, |
| 2952 0}, | 3005 0}, |
| 3006 {"var a = 0;\n" |
| 3007 "while (a) {\n" |
| 3008 " { \n" |
| 3009 " let z = 1;\n" |
| 3010 " function f() { z = 2; }\n" |
| 3011 " if (z) continue;\n" |
| 3012 " z++;\n" |
| 3013 " }\n" |
| 3014 "}\n", |
| 3015 6 * kPointerSize, |
| 3016 1, |
| 3017 65, |
| 3018 { |
| 3019 B(LdaZero), // |
| 3020 B(Star), R(1), // |
| 3021 B(Ldar), R(1), // |
| 3022 B(JumpIfToBooleanFalse), U8(58), // |
| 3023 B(LdaConstant), U8(0), // |
| 3024 B(Star), R(4), // |
| 3025 B(Ldar), R(closure), // |
| 3026 B(Star), R(5), // |
| 3027 B(CallRuntime), U16(Runtime::kPushBlockContext), R(4), U8(2), // |
| 3028 B(PushContext), R(3), // |
| 3029 B(LdaTheHole), // |
| 3030 B(StaContextSlot), R(3), U8(4), // |
| 3031 B(CreateClosure), U8(1), U8(0), // |
| 3032 B(Star), R(0), // |
| 3033 B(LdaSmi8), U8(1), // |
| 3034 B(StaContextSlot), R(3), U8(4), // |
| 3035 B(Ldar), R(0), // |
| 3036 B(Star), R(2), // |
| 3037 B(LdaContextSlot), R(3), U8(4), // |
| 3038 B(JumpIfToBooleanFalse), U8(6), // |
| 3039 B(PopContext), R(context), // |
| 3040 B(Jump), U8(-44), // |
| 3041 B(LdaContextSlot), R(3), U8(4), // |
| 3042 B(ToNumber), // |
| 3043 B(Star), R(4), // |
| 3044 B(Inc), // |
| 3045 B(StaContextSlot), R(3), U8(4), // |
| 3046 B(PopContext), R(context), // |
| 3047 B(Jump), U8(-58), // |
| 3048 B(LdaUndefined), // |
| 3049 B(Return), // |
| 3050 }, |
| 3051 2, |
| 3052 {InstanceType::FIXED_ARRAY_TYPE, |
| 3053 InstanceType::SHARED_FUNCTION_INFO_TYPE}}, |
| 2953 }; | 3054 }; |
| 2954 | 3055 |
| 2955 for (size_t i = 0; i < arraysize(snippets); i++) { | 3056 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 2956 Handle<BytecodeArray> bytecode_array = | 3057 Handle<BytecodeArray> bytecode_array = |
| 2957 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); | 3058 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); |
| 2958 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 3059 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
| 2959 } | 3060 } |
| 2960 } | 3061 } |
| 2961 | 3062 |
| 2962 | 3063 |
| (...skipping 3933 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6896 std::string(function_epilogue); | 6997 std::string(function_epilogue); |
| 6897 Handle<BytecodeArray> bytecode_array = | 6998 Handle<BytecodeArray> bytecode_array = |
| 6898 helper.MakeBytecode(script.c_str(), "*", "f"); | 6999 helper.MakeBytecode(script.c_str(), "*", "f"); |
| 6899 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 7000 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
| 6900 } | 7001 } |
| 6901 } | 7002 } |
| 6902 | 7003 |
| 6903 } // namespace interpreter | 7004 } // namespace interpreter |
| 6904 } // namespace internal | 7005 } // namespace internal |
| 6905 } // namespace v8 | 7006 } // namespace v8 |
| OLD | NEW |