Chromium Code Reviews| 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" |
| 11 #include "test/cctest/cctest.h" | 11 #include "test/cctest/cctest.h" |
| 12 #include "test/cctest/test-feedback-vector.h" | 12 #include "test/cctest/test-feedback-vector.h" |
| 13 | 13 |
| 14 namespace v8 { | 14 namespace v8 { |
| 15 namespace internal { | 15 namespace internal { |
| 16 namespace interpreter { | 16 namespace interpreter { |
| 17 | 17 |
| 18 class BytecodeGeneratorHelper { | 18 class BytecodeGeneratorHelper { |
| 19 public: | 19 public: |
| 20 const char* kFunctionName = "f"; | 20 const char* kFunctionName = "f"; |
| 21 | 21 |
| 22 static const int kLastParamIndex = | 22 static const int kLastParamIndex = |
| 23 -InterpreterFrameConstants::kLastParamFromRegisterPointer / kPointerSize; | 23 -InterpreterFrameConstants::kLastParamFromRegisterPointer / kPointerSize; |
| 24 | 24 |
| 25 BytecodeGeneratorHelper() { | 25 BytecodeGeneratorHelper() { |
| 26 i::FLAG_ignition = true; | 26 i::FLAG_ignition = true; |
| 27 i::FLAG_ignition_filter = StrDup(kFunctionName); | 27 i::FLAG_ignition_filter = StrDup(kFunctionName); |
| 28 i::FLAG_always_opt = false; | 28 i::FLAG_always_opt = false; |
| 29 i::FLAG_allow_natives_syntax = true; | 29 i::FLAG_allow_natives_syntax = true; |
| 30 i::FLAG_legacy_const = true; | |
| 31 CcTest::i_isolate()->interpreter()->Initialize(); | 30 CcTest::i_isolate()->interpreter()->Initialize(); |
| 32 } | 31 } |
| 33 | 32 |
| 34 Isolate* isolate() { return CcTest::i_isolate(); } | 33 Isolate* isolate() { return CcTest::i_isolate(); } |
| 35 Factory* factory() { return CcTest::i_isolate()->factory(); } | 34 Factory* factory() { return CcTest::i_isolate()->factory(); } |
| 36 | 35 |
| 37 Handle<BytecodeArray> MakeTopLevelBytecode(const char* source) { | 36 Handle<BytecodeArray> MakeTopLevelBytecode(const char* source) { |
| 38 const char* old_ignition_filter = i::FLAG_ignition_filter; | 37 const char* old_ignition_filter = i::FLAG_ignition_filter; |
| 39 i::FLAG_ignition_filter = "*"; | 38 i::FLAG_ignition_filter = "*"; |
| 40 Local<v8::Script> script = v8_compile(source); | 39 Local<v8::Script> script = v8_compile(source); |
| (...skipping 2243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2284 B(Ldar), R(0), // | 2283 B(Ldar), R(0), // |
| 2285 B(Return), // | 2284 B(Return), // |
| 2286 }}, | 2285 }}, |
| 2287 {"outer: {\n" | 2286 {"outer: {\n" |
| 2288 " let y = 10;" | 2287 " let y = 10;" |
| 2289 " function f() { return y; }\n" | 2288 " function f() { return y; }\n" |
| 2290 " break outer;\n" | 2289 " break outer;\n" |
| 2291 "}\n", | 2290 "}\n", |
| 2292 5 * kPointerSize, | 2291 5 * kPointerSize, |
| 2293 1, | 2292 1, |
| 2294 39, | 2293 50, |
| 2295 { | 2294 { |
| 2296 B(LdaConstant), U8(0), // | 2295 B(LdaConstant), U8(0), // |
| 2297 B(Star), R(3), // | 2296 B(Star), R(3), // |
| 2298 B(Ldar), R(closure), // | 2297 B(Ldar), R(closure), // |
| 2299 B(Star), R(4), // | 2298 B(Star), R(4), // |
| 2300 B(CallRuntime), U16(Runtime::kPushBlockContext), R(3), U8(2), // | 2299 B(CallRuntime), U16(Runtime::kPushBlockContext), R(3), U8(2), // |
| 2301 B(PushContext), R(2), // | 2300 B(PushContext), R(2), // |
| 2302 B(LdaTheHole), // | 2301 B(LdaTheHole), // |
| 2303 B(StaContextSlot), R(context), U8(4), // | 2302 B(StaContextSlot), R(context), U8(4), // |
| 2304 B(CreateClosure), U8(1), U8(0), // | 2303 B(CreateClosure), U8(1), U8(0), // |
| 2305 B(Star), R(0), // | 2304 B(Star), R(0), // |
| 2306 B(LdaSmi8), U8(10), // | 2305 B(LdaSmi8), U8(10), // |
| 2307 B(StaContextSlot), R(context), U8(4), // | 2306 B(StaContextSlot), R(context), U8(4), // |
| 2308 B(Ldar), R(0), // | 2307 B(Ldar), R(0), // |
| 2309 B(Star), R(1), // | 2308 B(JumpIfNotHole), U8(11), // |
| 2310 B(Jump), U8(2), // | 2309 B(LdaConstant), U8(2), // |
| 2311 B(PopContext), R(2), // | 2310 B(Star), R(3), // |
| 2312 B(LdaUndefined), // | 2311 B(CallRuntime), U16(Runtime::kThrowReferenceError), R(3), U8(1), // |
| 2313 B(Return), // | 2312 B(Star), R(1), // |
| 2313 B(Jump), U8(2), // | |
| 2314 B(PopContext), R(2), // | |
| 2315 B(LdaUndefined), // | |
| 2316 B(Return), // | |
| 2314 }, | 2317 }, |
| 2315 2, | 2318 3, |
| 2316 {InstanceType::FIXED_ARRAY_TYPE, | 2319 {InstanceType::FIXED_ARRAY_TYPE, InstanceType::SHARED_FUNCTION_INFO_TYPE, |
| 2317 InstanceType::SHARED_FUNCTION_INFO_TYPE}}, | 2320 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, |
| 2318 {"let x = 1;\n" | 2321 {"let x = 1;\n" |
| 2319 "outer: {\n" | 2322 "outer: {\n" |
| 2320 " inner: {\n" | 2323 " inner: {\n" |
| 2321 " let y = 2;\n" | 2324 " let y = 2;\n" |
| 2322 " function f() { return x + y; }\n" | 2325 " function f() { return x + y; }\n" |
| 2323 " if (y) break outer;\n" | 2326 " if (y) break outer;\n" |
| 2324 " y = 3;\n" | 2327 " y = 3;\n" |
| 2325 " }\n" | 2328 " }\n" |
| 2326 "}\n" | 2329 "}\n" |
| 2327 "x = 4;", | 2330 "x = 4;", |
| 2328 6 * kPointerSize, | 2331 6 * kPointerSize, |
| 2329 1, | 2332 1, |
| 2330 72, | 2333 130, |
| 2331 { | 2334 { |
| 2332 B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), // | 2335 B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), // |
| 2333 U8(1), // | 2336 U8(1), // |
| 2334 B(PushContext), R(2), // | 2337 B(PushContext), R(2), // |
| 2335 B(LdaTheHole), // | 2338 B(LdaTheHole), // |
| 2336 B(StaContextSlot), R(context), U8(4), // | 2339 B(StaContextSlot), R(context), U8(4), // |
| 2337 B(LdaSmi8), U8(1), // | 2340 B(LdaSmi8), U8(1), // |
| 2338 B(StaContextSlot), R(context), U8(4), // | 2341 B(StaContextSlot), R(context), U8(4), // |
| 2339 B(LdaConstant), U8(0), // | 2342 B(LdaConstant), U8(0), // |
| 2340 B(Star), R(4), // | 2343 B(Star), R(4), // |
| 2341 B(Ldar), R(closure), // | 2344 B(Ldar), R(closure), // |
| 2342 B(Star), R(5), // | 2345 B(Star), R(5), // |
| 2343 B(CallRuntime), U16(Runtime::kPushBlockContext), R(4), U8(2), // | 2346 B(CallRuntime), U16(Runtime::kPushBlockContext), R(4), U8(2), // |
| 2344 B(PushContext), R(3), // | 2347 B(PushContext), R(3), // |
| 2345 B(LdaTheHole), // | 2348 B(LdaTheHole), // |
| 2346 B(StaContextSlot), R(context), U8(4), // | 2349 B(StaContextSlot), R(context), U8(4), // |
| 2347 B(CreateClosure), U8(1), U8(0), // | 2350 B(CreateClosure), U8(1), U8(0), // |
| 2348 B(Star), R(0), // | 2351 B(Star), R(0), // |
| 2349 B(LdaSmi8), U8(2), // | 2352 B(LdaSmi8), U8(2), // |
| 2350 B(StaContextSlot), R(context), U8(4), // | 2353 B(StaContextSlot), R(context), U8(4), // |
| 2351 B(Ldar), R(0), // | 2354 B(Ldar), R(0), // |
| 2352 B(Star), R(1), // | 2355 B(JumpIfNotHole), U8(11), // |
| 2353 B(LdaContextSlot), R(context), U8(4), // | 2356 B(LdaConstant), U8(2), // |
| 2354 B(JumpIfToBooleanFalse), U8(6), // | 2357 B(Star), R(4), // |
| 2355 B(PopContext), R(3), // | 2358 B(CallRuntime), U16(Runtime::kThrowReferenceError), R(4), U8(1), // |
| 2356 B(Jump), U8(9), // | 2359 B(Star), R(1), // |
| 2357 B(LdaSmi8), U8(3), // | 2360 B(LdaContextSlot), R(context), U8(4), // |
| 2358 B(StaContextSlot), R(context), U8(4), // | 2361 B(JumpIfNotHole), U8(11), // |
| 2359 B(PopContext), R(3), // | 2362 B(LdaConstant), U8(3), // |
| 2360 B(LdaSmi8), U8(4), // | 2363 B(Star), R(4), // |
| 2361 B(StaContextSlot), R(context), U8(4), // | 2364 B(CallRuntime), U16(Runtime::kThrowReferenceError), R(4), U8(1), // |
| 2362 B(LdaUndefined), // | 2365 B(JumpIfToBooleanFalse), U8(6), // |
| 2363 B(Return), // | 2366 B(PopContext), R(3), // |
| 2364 }, | 2367 B(Jump), U8(27), // |
| 2365 2, | 2368 B(LdaSmi8), U8(3), // |
| 2366 {InstanceType::FIXED_ARRAY_TYPE, | 2369 B(Star), R(4), // |
| 2367 InstanceType::SHARED_FUNCTION_INFO_TYPE}}, | 2370 B(LdaContextSlot), R(context), U8(4), // |
| 2371 B(JumpIfNotHole), U8(11), // | |
| 2372 B(LdaConstant), U8(3), // | |
| 2373 B(Star), R(5), // | |
| 2374 B(CallRuntime), U16(Runtime::kThrowReferenceError), R(5), U8(1), // | |
| 2375 B(Ldar), R(4), // | |
| 2376 B(StaContextSlot), R(context), U8(4), // | |
| 2377 B(PopContext), R(3), // | |
| 2378 B(LdaSmi8), U8(4), // | |
| 2379 B(Star), R(4), // | |
| 2380 B(LdaContextSlot), R(context), U8(4), // | |
| 2381 B(JumpIfNotHole), U8(11), // | |
| 2382 B(LdaConstant), U8(4), // | |
| 2383 B(Star), R(5), // | |
| 2384 B(CallRuntime), U16(Runtime::kThrowReferenceError), R(5), U8(1), // | |
| 2385 B(Ldar), R(4), // | |
| 2386 B(StaContextSlot), R(context), U8(4), // | |
| 2387 B(LdaUndefined), // | |
| 2388 B(Return), // | |
| 2389 }, | |
| 2390 5, | |
| 2391 {InstanceType::FIXED_ARRAY_TYPE, InstanceType::SHARED_FUNCTION_INFO_TYPE, | |
| 2392 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, | |
| 2393 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, | |
| 2394 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, | |
| 2368 }; | 2395 }; |
| 2369 | 2396 |
| 2370 for (size_t i = 0; i < arraysize(snippets); i++) { | 2397 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 2371 Handle<BytecodeArray> bytecode_array = | 2398 Handle<BytecodeArray> bytecode_array = |
| 2372 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); | 2399 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); |
| 2373 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 2400 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
| 2374 } | 2401 } |
| 2375 } | 2402 } |
| 2376 | 2403 |
| 2377 | 2404 |
| (...skipping 612 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2990 B(Inc), // | 3017 B(Inc), // |
| 2991 B(Star), R(1), // | 3018 B(Star), R(1), // |
| 2992 B(Jump), U8(-26), // | 3019 B(Jump), U8(-26), // |
| 2993 B(Ldar), R(0), // | 3020 B(Ldar), R(0), // |
| 2994 B(Return), // | 3021 B(Return), // |
| 2995 }, | 3022 }, |
| 2996 0}, | 3023 0}, |
| 2997 {"var a = 0;\n" | 3024 {"var a = 0;\n" |
| 2998 "while (a) {\n" | 3025 "while (a) {\n" |
| 2999 " { \n" | 3026 " { \n" |
| 3000 " let z = 1;\n" | 3027 " let z = 1;\n" |
| 3001 " function f() { z = 2; }\n" | 3028 " function f() { z = 2; }\n" |
| 3002 " if (z) continue;\n" | 3029 " if (z) continue;\n" |
| 3003 " z++;\n" | 3030 " z++;\n" |
| 3004 " }\n" | 3031 " }\n" |
| 3005 "}\n", | 3032 "}\n", |
| 3006 6 * kPointerSize, | 3033 7 * kPointerSize, |
| 3007 1, | 3034 1, |
| 3008 65, | 3035 116, |
| 3009 { | 3036 { |
| 3010 B(LdaZero), // | 3037 B(LdaZero), // |
| 3011 B(Star), R(1), // | 3038 B(Star), R(1), // |
| 3012 B(Ldar), R(1), // | 3039 B(Ldar), R(1), // |
| 3013 B(JumpIfToBooleanFalse), U8(58), // | 3040 B(JumpIfToBooleanFalse), U8(109), // |
| 3014 B(LdaConstant), U8(0), // | 3041 B(LdaConstant), U8(0), // |
| 3015 B(Star), R(4), // | 3042 B(Star), R(4), // |
| 3016 B(Ldar), R(closure), // | 3043 B(Ldar), R(closure), // |
| 3017 B(Star), R(5), // | 3044 B(Star), R(5), // |
| 3018 B(CallRuntime), U16(Runtime::kPushBlockContext), R(4), U8(2), // | 3045 B(CallRuntime), U16(Runtime::kPushBlockContext), R(4), U8(2), // |
| 3019 B(PushContext), R(3), // | 3046 B(PushContext), R(3), // |
| 3020 B(LdaTheHole), // | 3047 B(LdaTheHole), // |
| 3021 B(StaContextSlot), R(context), U8(4), // | 3048 B(StaContextSlot), R(context), U8(4), // |
| 3022 B(CreateClosure), U8(1), U8(0), // | 3049 B(CreateClosure), U8(1), U8(0), // |
| 3023 B(Star), R(0), // | 3050 B(Star), R(0), // |
| 3024 B(LdaSmi8), U8(1), // | 3051 B(LdaSmi8), U8(1), // |
| 3025 B(StaContextSlot), R(context), U8(4), // | 3052 B(StaContextSlot), R(context), U8(4), // |
| 3026 B(Ldar), R(0), // | 3053 B(Ldar), R(0), // |
| 3027 B(Star), R(2), // | 3054 B(JumpIfNotHole), U8(11), // |
| 3028 B(LdaContextSlot), R(context), U8(4), // | 3055 B(LdaConstant), U8(2), // |
| 3029 B(JumpIfToBooleanFalse), U8(6), // | 3056 B(Star), R(4), // |
| 3030 B(PopContext), R(3), // | 3057 B(CallRuntime), U16(Runtime::kThrowReferenceError), R(4), U8(1), // |
| 3031 B(Jump), U8(-44), // | 3058 B(Star), R(2), // |
| 3032 B(LdaContextSlot), R(context), U8(4), // | 3059 B(LdaContextSlot), R(context), U8(4), // |
| 3033 B(ToNumber), // | 3060 B(JumpIfNotHole), U8(11), // |
| 3034 B(Star), R(4), // | 3061 B(LdaConstant), U8(3), // |
| 3035 B(Inc), // | 3062 B(Star), R(4), // |
| 3036 B(StaContextSlot), R(context), U8(4), // | 3063 B(CallRuntime), U16(Runtime::kThrowReferenceError), R(4), U8(1), // |
| 3037 B(PopContext), R(3), // | 3064 B(JumpIfToBooleanFalse), U8(6), // |
| 3038 B(Jump), U8(-58), // | 3065 B(PopContext), R(3), // |
| 3039 B(LdaUndefined), // | 3066 B(Jump), U8(-66), // |
| 3040 B(Return), // | 3067 B(LdaContextSlot), R(context), U8(4), // |
| 3041 }, | 3068 B(JumpIfNotHole), U8(11), // |
| 3042 2, | 3069 B(LdaConstant), U8(3), // |
| 3043 {InstanceType::FIXED_ARRAY_TYPE, | 3070 B(Star), R(4), // |
| 3044 InstanceType::SHARED_FUNCTION_INFO_TYPE}}, | 3071 B(CallRuntime), U16(Runtime::kThrowReferenceError), R(4), U8(1), // |
| 3072 B(ToNumber), // | |
| 3073 B(Star), R(4), // | |
| 3074 B(Inc), // | |
| 3075 B(Star), R(5), // | |
| 3076 B(LdaContextSlot), R(context), U8(4), // | |
| 3077 B(JumpIfNotHole), U8(11), // | |
| 3078 B(LdaConstant), U8(3), // | |
| 3079 B(Star), R(6), // | |
| 3080 B(CallRuntime), U16(Runtime::kThrowReferenceError), R(6), U8(1), // | |
| 3081 B(Ldar), R(5), // | |
| 3082 B(StaContextSlot), R(context), U8(4), // | |
| 3083 B(PopContext), R(3), // | |
| 3084 B(Jump), U8(-109), // | |
| 3085 B(LdaUndefined), // | |
| 3086 B(Return), // | |
| 3087 }, | |
| 3088 4, | |
| 3089 {InstanceType::FIXED_ARRAY_TYPE, InstanceType::SHARED_FUNCTION_INFO_TYPE, | |
| 3090 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, | |
| 3091 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, | |
| 3045 }; | 3092 }; |
| 3046 | 3093 |
| 3047 for (size_t i = 0; i < arraysize(snippets); i++) { | 3094 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 3048 Handle<BytecodeArray> bytecode_array = | 3095 Handle<BytecodeArray> bytecode_array = |
| 3049 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); | 3096 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); |
| 3050 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 3097 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
| 3051 } | 3098 } |
| 3052 } | 3099 } |
| 3053 | 3100 |
| 3054 | 3101 |
| (...skipping 2563 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5618 }; | 5665 }; |
| 5619 | 5666 |
| 5620 for (size_t i = 0; i < arraysize(snippets); i++) { | 5667 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 5621 Handle<BytecodeArray> bytecode_array = | 5668 Handle<BytecodeArray> bytecode_array = |
| 5622 helper.MakeBytecodeForFunction(snippets[i].code_snippet); | 5669 helper.MakeBytecodeForFunction(snippets[i].code_snippet); |
| 5623 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 5670 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
| 5624 } | 5671 } |
| 5625 } | 5672 } |
| 5626 | 5673 |
| 5627 TEST(IllegalRedeclaration) { | 5674 TEST(IllegalRedeclaration) { |
| 5675 bool old_legacy_const_flag = FLAG_legacy_const; | |
| 5676 FLAG_legacy_const = true; | |
| 5677 | |
| 5628 InitializedHandleScope handle_scope; | 5678 InitializedHandleScope handle_scope; |
| 5629 BytecodeGeneratorHelper helper; | 5679 BytecodeGeneratorHelper helper; |
| 5630 | 5680 |
| 5631 CHECK_GE(MessageTemplate::kVarRedeclaration, 128); | 5681 CHECK_GE(MessageTemplate::kVarRedeclaration, 128); |
| 5632 // Must adapt bytecode if this changes. | 5682 // Must adapt bytecode if this changes. |
| 5633 | 5683 |
| 5634 ExpectedSnippet<Handle<Object>, 2> snippets[] = { | 5684 ExpectedSnippet<Handle<Object>, 2> snippets[] = { |
| 5635 {"const a = 1; { var a = 2; }", | 5685 {"const a = 1; { var a = 2; }", |
| 5636 3 * kPointerSize, | 5686 3 * kPointerSize, |
| 5637 1, | 5687 1, |
| 5638 14, | 5688 14, |
| 5639 { | 5689 { |
| 5640 B(LdaConstant), U8(0), // | 5690 B(LdaConstant), U8(0), // |
| 5641 B(Star), R(1), // | 5691 B(Star), R(1), // |
| 5642 B(LdaConstant), U8(1), // | 5692 B(LdaConstant), U8(1), // |
| 5643 B(Star), R(2), // | 5693 B(Star), R(2), // |
| 5644 B(CallRuntime), U16(Runtime::kNewSyntaxError), R(1), U8(2), // | 5694 B(CallRuntime), U16(Runtime::kNewSyntaxError), R(1), U8(2), // |
| 5645 B(Throw), // | 5695 B(Throw), // |
| 5646 }, | 5696 }, |
| 5647 2, | 5697 2, |
| 5648 {helper.factory()->NewNumberFromInt(MessageTemplate::kVarRedeclaration), | 5698 {helper.factory()->NewNumberFromInt(MessageTemplate::kVarRedeclaration), |
| 5649 helper.factory()->NewStringFromAsciiChecked("a")}}, | 5699 helper.factory()->NewStringFromAsciiChecked("a")}}, |
| 5650 }; | 5700 }; |
| 5651 | 5701 |
| 5652 for (size_t i = 0; i < arraysize(snippets); i++) { | 5702 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 5653 Handle<BytecodeArray> bytecode_array = | 5703 Handle<BytecodeArray> bytecode_array = |
| 5654 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); | 5704 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); |
| 5655 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 5705 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
| 5656 } | 5706 } |
| 5707 | |
| 5708 FLAG_legacy_const = old_legacy_const_flag; | |
| 5657 } | 5709 } |
| 5658 | 5710 |
| 5659 | 5711 |
| 5660 TEST(ForIn) { | 5712 TEST(ForIn) { |
| 5661 InitializedHandleScope handle_scope; | 5713 InitializedHandleScope handle_scope; |
| 5662 BytecodeGeneratorHelper helper; | 5714 BytecodeGeneratorHelper helper; |
| 5663 Zone zone; | 5715 Zone zone; |
| 5664 | 5716 |
| 5665 int simple_flags = | 5717 int simple_flags = |
| 5666 ArrayLiteral::kDisableMementos | ArrayLiteral::kShallowElements; | 5718 ArrayLiteral::kDisableMementos | ArrayLiteral::kShallowElements; |
| (...skipping 875 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6542 | 6594 |
| 6543 | 6595 |
| 6544 TEST(ThisFunction) { | 6596 TEST(ThisFunction) { |
| 6545 InitializedHandleScope handle_scope; | 6597 InitializedHandleScope handle_scope; |
| 6546 BytecodeGeneratorHelper helper; | 6598 BytecodeGeneratorHelper helper; |
| 6547 | 6599 |
| 6548 int closure = Register::function_closure().index(); | 6600 int closure = Register::function_closure().index(); |
| 6549 | 6601 |
| 6550 ExpectedSnippet<int> snippets[] = { | 6602 ExpectedSnippet<int> snippets[] = { |
| 6551 {"var f;\n f = function f() { }", | 6603 {"var f;\n f = function f() { }", |
| 6552 1 * kPointerSize, | 6604 2 * kPointerSize, |
| 6553 1, | 6605 1, |
| 6554 9, | 6606 18, |
| 6555 { | 6607 { |
| 6556 B(LdaTheHole), // | 6608 B(LdaTheHole), // |
| 6557 B(Star), R(0), // | 6609 B(Star), R(0), // |
| 6558 B(Ldar), R(closure), // | 6610 B(Ldar), R(closure), // |
| 6559 B(Star), R(0), // | 6611 B(Star), R(1), // |
| 6560 B(LdaUndefined), // | 6612 B(Ldar), R(0), // |
| 6561 B(Return), // | 6613 B(JumpIfNotHole), U8(5), // |
| 6614 B(Mov), R(1), R(0), // | |
| 6615 B(Ldar), R(1), // | |
| 6616 B(LdaUndefined), // | |
| 6617 B(Return), // | |
| 6562 }}, | 6618 }}, |
| 6563 {"var f;\n f = function f() { return f; }", | 6619 {"var f;\n f = function f() { return f; }", |
| 6564 1 * kPointerSize, | 6620 2 * kPointerSize, |
| 6565 1, | 6621 1, |
| 6566 8, | 6622 22, |
| 6567 { | 6623 { |
| 6568 B(LdaTheHole), // | 6624 B(LdaTheHole), // |
| 6569 B(Star), R(0), // | 6625 B(Star), R(0), // |
| 6570 B(Ldar), R(closure), // | 6626 B(Ldar), R(closure), // |
| 6571 B(Star), R(0), // | 6627 B(Star), R(1), // |
| 6572 B(Return), // | 6628 B(Ldar), R(0), // |
| 6629 B(JumpIfNotHole), U8(5), // | |
| 6630 B(Mov), R(1), R(0), // | |
| 6631 B(Ldar), R(1), // | |
| 6632 B(Ldar), R(0), // | |
| 6633 B(JumpIfNotHole), U8(3), // | |
| 6634 B(LdaUndefined), // | |
| 6635 B(Return), // | |
| 6573 }}, | 6636 }}, |
| 6574 }; | 6637 }; |
| 6575 | 6638 |
| 6576 for (size_t i = 0; i < arraysize(snippets); i++) { | 6639 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 6577 Handle<BytecodeArray> bytecode_array = | 6640 Handle<BytecodeArray> bytecode_array = |
| 6578 helper.MakeBytecodeForFunction(snippets[i].code_snippet); | 6641 helper.MakeBytecodeForFunction(snippets[i].code_snippet); |
| 6579 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 6642 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
| 6580 } | 6643 } |
| 6581 } | 6644 } |
| 6582 | 6645 |
| 6583 | 6646 |
| 6584 TEST(NewTarget) { | 6647 TEST(NewTarget) { |
| 6585 InitializedHandleScope handle_scope; | 6648 InitializedHandleScope handle_scope; |
| 6586 BytecodeGeneratorHelper helper; | 6649 BytecodeGeneratorHelper helper; |
| 6587 | 6650 |
| 6588 int new_target = Register::new_target().index(); | 6651 int new_target = Register::new_target().index(); |
| 6589 | 6652 |
| 6590 ExpectedSnippet<int> snippets[] = { | 6653 ExpectedSnippet<InstanceType> snippets[] = { |
| 6591 {"return new.target;", | 6654 {"return new.target;", |
| 6592 1 * kPointerSize, | 6655 2 * kPointerSize, |
| 6593 1, | 6656 1, |
| 6594 5, | 6657 16, |
| 6595 { | 6658 { |
| 6596 B(Ldar), R(new_target), // | 6659 B(Ldar), R(new_target), // |
| 6597 B(Star), R(0), // | 6660 B(Star), R(0), // |
| 6598 B(Return), // | 6661 B(JumpIfNotHole), U8(11), // |
| 6599 }}, | 6662 B(LdaConstant), U8(0), // |
| 6663 B(Star), R(1), // | |
| 6664 B(CallRuntime), U16(Runtime::kThrowReferenceError), R(1), U8(1), // | |
| 6665 B(Return), // | |
| 6666 }, | |
| 6667 1, | |
| 6668 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, | |
| 6600 {"new.target;", | 6669 {"new.target;", |
| 6601 1 * kPointerSize, | 6670 2 * kPointerSize, |
| 6602 1, | 6671 1, |
| 6603 6, | 6672 17, |
| 6604 { | 6673 { |
| 6605 B(Ldar), R(new_target), // | 6674 B(Ldar), R(new_target), // |
| 6606 B(Star), R(0), // | 6675 B(Star), R(0), // |
| 6607 B(LdaUndefined), // | 6676 B(JumpIfNotHole), U8(11), // |
| 6608 B(Return), // | 6677 B(LdaConstant), U8(0), // |
| 6609 }}, | 6678 B(Star), R(1), // |
| 6610 }; | 6679 B(CallRuntime), U16(Runtime::kThrowReferenceError), R(1), U8(1), // |
| 6680 B(LdaUndefined), // | |
| 6681 B(Return), // | |
| 6682 }, | |
| 6683 1, | |
| 6684 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}}; | |
| 6611 | 6685 |
| 6612 for (size_t i = 0; i < arraysize(snippets); i++) { | 6686 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 6613 Handle<BytecodeArray> bytecode_array = | 6687 Handle<BytecodeArray> bytecode_array = |
| 6614 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); | 6688 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); |
| 6615 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 6689 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
| 6616 } | 6690 } |
| 6617 } | 6691 } |
| 6618 | 6692 |
| 6619 | 6693 |
| 6620 TEST(RemoveRedundantLdar) { | 6694 TEST(RemoveRedundantLdar) { |
| (...skipping 1005 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 7626 BytecodeGeneratorHelper helper; | 7700 BytecodeGeneratorHelper helper; |
| 7627 | 7701 |
| 7628 for (size_t i = 0; i < arraysize(snippets); ++i) { | 7702 for (size_t i = 0; i < arraysize(snippets); ++i) { |
| 7629 std::string body = prologue + snippets[i].code_snippet; | 7703 std::string body = prologue + snippets[i].code_snippet; |
| 7630 Handle<BytecodeArray> bytecode_array = | 7704 Handle<BytecodeArray> bytecode_array = |
| 7631 helper.MakeBytecodeForFunctionBody(body.c_str()); | 7705 helper.MakeBytecodeForFunctionBody(body.c_str()); |
| 7632 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 7706 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
| 7633 } | 7707 } |
| 7634 } | 7708 } |
| 7635 | 7709 |
| 7710 TEST(ConstVariable) { | |
| 7711 InitializedHandleScope handle_scope; | |
| 7712 BytecodeGeneratorHelper helper; | |
| 7713 | |
|
rmcilroy
2016/02/04 15:19:39
nit - please add
// clang-format off
and at th
mythria
2016/02/04 16:08:00
Done.
| |
| 7714 ExpectedSnippet<const char*> snippets[] = { | |
| 7715 {"const x = 10;", | |
| 7716 1 * kPointerSize, | |
| 7717 1, | |
| 7718 9, | |
| 7719 { | |
| 7720 B(LdaTheHole), // | |
| 7721 B(Star), R(0), // | |
| 7722 B(LdaSmi8), U8(10), // | |
| 7723 B(Star), R(0), // | |
| 7724 B(LdaUndefined), // | |
| 7725 B(Return) // | |
| 7726 }, | |
| 7727 0}, | |
| 7728 {"const x = 10; return x;", | |
| 7729 2 * kPointerSize, | |
| 7730 1, | |
| 7731 19, | |
| 7732 { | |
| 7733 B(LdaTheHole), // | |
| 7734 B(Star), R(0), // | |
| 7735 B(LdaSmi8), U8(10), // | |
| 7736 B(Star), R(0), // | |
| 7737 B(JumpIfNotHole), U8(11), // | |
| 7738 B(LdaConstant), U8(0), // | |
| 7739 B(Star), R(1), // | |
| 7740 B(CallRuntime), U16(Runtime::kThrowReferenceError), R(1), U8(1), // | |
| 7741 B(Return) // | |
| 7742 }, | |
| 7743 1, | |
| 7744 {"x"}}, | |
| 7745 {"const x = ( x = 20);", | |
| 7746 3 * kPointerSize, | |
| 7747 1, | |
| 7748 31, | |
| 7749 { | |
| 7750 B(LdaTheHole), // | |
| 7751 B(Star), R(0), // | |
| 7752 B(LdaSmi8), U8(20), // | |
| 7753 B(Star), R(1), // | |
| 7754 B(Ldar), R(0), // | |
| 7755 B(JumpIfNotHole), U8(11), // | |
| 7756 B(LdaConstant), U8(0), // | |
| 7757 B(Star), R(2), // | |
| 7758 B(CallRuntime), U16(Runtime::kThrowReferenceError), R(2), U8(1), // | |
| 7759 B(CallRuntime), U16(Runtime::kThrowConstAssignError), R(0), // | |
| 7760 U8(0), // | |
|
rmcilroy
2016/02/04 15:19:39
/* */ U8(0)
(and below).
mythria
2016/02/04 16:07:59
Done.
| |
| 7761 B(Ldar), R(1), // | |
| 7762 B(Star), R(0), // | |
| 7763 B(LdaUndefined), // | |
| 7764 B(Return) // | |
| 7765 }, | |
| 7766 1, | |
| 7767 {"x"}}, | |
| 7768 {"const x = 10; x = 20;", | |
| 7769 3 * kPointerSize, | |
| 7770 1, | |
| 7771 35, | |
| 7772 { | |
| 7773 B(LdaTheHole), // | |
| 7774 B(Star), R(0), // | |
| 7775 B(LdaSmi8), U8(10), // | |
| 7776 B(Star), R(0), // | |
| 7777 B(LdaSmi8), U8(20), // | |
| 7778 B(Star), R(1), // | |
| 7779 B(Ldar), R(0), // | |
| 7780 B(JumpIfNotHole), U8(11), // | |
| 7781 B(LdaConstant), U8(0), // | |
| 7782 B(Star), R(2), // | |
| 7783 B(CallRuntime), U16(Runtime::kThrowReferenceError), R(2), U8(1), // | |
| 7784 B(CallRuntime), U16(Runtime::kThrowConstAssignError), R(0), // | |
| 7785 U8(0), // | |
| 7786 B(Ldar), R(1), // | |
| 7787 B(Star), R(0), // | |
| 7788 B(LdaUndefined), // | |
| 7789 B(Return) // | |
| 7790 }, | |
| 7791 1, | |
| 7792 {"x"}}, | |
| 7793 }; | |
| 7794 | |
| 7795 for (size_t i = 0; i < arraysize(snippets); i++) { | |
| 7796 Handle<BytecodeArray> bytecode_array = | |
| 7797 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); | |
| 7798 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | |
| 7799 } | |
| 7800 } | |
| 7801 | |
| 7802 TEST(LetVariable) { | |
| 7803 InitializedHandleScope handle_scope; | |
| 7804 BytecodeGeneratorHelper helper; | |
| 7805 | |
|
rmcilroy
2016/02/04 15:19:39
ditto
mythria
2016/02/04 16:08:00
Done.
| |
| 7806 ExpectedSnippet<const char*> snippets[] = { | |
| 7807 {"let x = 10;", | |
| 7808 1 * kPointerSize, | |
| 7809 1, | |
| 7810 9, | |
| 7811 { | |
| 7812 B(LdaTheHole), // | |
| 7813 B(Star), R(0), // | |
| 7814 B(LdaSmi8), U8(10), // | |
| 7815 B(Star), R(0), // | |
| 7816 B(LdaUndefined), // | |
| 7817 B(Return) // | |
| 7818 }, | |
| 7819 0}, | |
| 7820 {"let x = 10; return x;", | |
| 7821 2 * kPointerSize, | |
| 7822 1, | |
| 7823 19, | |
| 7824 { | |
| 7825 B(LdaTheHole), // | |
| 7826 B(Star), R(0), // | |
| 7827 B(LdaSmi8), U8(10), // | |
| 7828 B(Star), R(0), // | |
| 7829 B(JumpIfNotHole), U8(11), // | |
| 7830 B(LdaConstant), U8(0), // | |
| 7831 B(Star), R(1), // | |
| 7832 B(CallRuntime), U16(Runtime::kThrowReferenceError), R(1), U8(1), // | |
| 7833 B(Return) // | |
| 7834 }, | |
| 7835 1, | |
| 7836 {"x"}}, | |
| 7837 {"let x = (x = 20);", | |
| 7838 3 * kPointerSize, | |
| 7839 1, | |
| 7840 26, | |
| 7841 { | |
| 7842 B(LdaTheHole), // | |
| 7843 B(Star), R(0), // | |
| 7844 B(LdaSmi8), U8(20), // | |
| 7845 B(Star), R(1), // | |
| 7846 B(Ldar), R(0), // | |
| 7847 B(JumpIfNotHole), U8(11), // | |
| 7848 B(LdaConstant), U8(0), // | |
| 7849 B(Star), R(2), // | |
| 7850 B(CallRuntime), U16(Runtime::kThrowReferenceError), R(2), U8(1), // | |
| 7851 B(Ldar), R(1), // | |
| 7852 B(Star), R(0), // | |
| 7853 B(LdaUndefined), // | |
| 7854 B(Return) // | |
| 7855 }, | |
| 7856 1, | |
| 7857 {"x"}}, | |
| 7858 {"let x = 10; x = 20;", | |
| 7859 3 * kPointerSize, | |
| 7860 1, | |
| 7861 30, | |
| 7862 { | |
| 7863 B(LdaTheHole), // | |
| 7864 B(Star), R(0), // | |
| 7865 B(LdaSmi8), U8(10), // | |
| 7866 B(Star), R(0), // | |
| 7867 B(LdaSmi8), U8(20), // | |
| 7868 B(Star), R(1), // | |
| 7869 B(Ldar), R(0), // | |
| 7870 B(JumpIfNotHole), U8(11), // | |
| 7871 B(LdaConstant), U8(0), // | |
| 7872 B(Star), R(2), // | |
| 7873 B(CallRuntime), U16(Runtime::kThrowReferenceError), R(2), U8(1), // | |
| 7874 B(Ldar), R(1), // | |
| 7875 B(Star), R(0), // | |
| 7876 B(LdaUndefined), // | |
| 7877 B(Return) // | |
| 7878 }, | |
| 7879 1, | |
| 7880 {"x"}}, | |
| 7881 }; | |
| 7882 | |
| 7883 for (size_t i = 0; i < arraysize(snippets); i++) { | |
| 7884 Handle<BytecodeArray> bytecode_array = | |
| 7885 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); | |
| 7886 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | |
| 7887 } | |
| 7888 } | |
| 7889 | |
| 7890 TEST(LegacyConstVariable) { | |
| 7891 bool old_legacy_const_flag = FLAG_legacy_const; | |
| 7892 FLAG_legacy_const = true; | |
| 7893 | |
| 7894 InitializedHandleScope handle_scope; | |
| 7895 BytecodeGeneratorHelper helper; | |
| 7896 | |
| 7897 ExpectedSnippet<const char*> snippets[] = { | |
| 7898 {"const x = 10;", | |
| 7899 2 * kPointerSize, | |
| 7900 1, | |
| 7901 18, | |
| 7902 { | |
| 7903 B(LdaTheHole), // | |
| 7904 B(Star), R(0), // | |
| 7905 B(LdaSmi8), U8(10), // | |
| 7906 B(Star), R(1), // | |
| 7907 B(Ldar), R(0), // | |
| 7908 B(JumpIfNotHole), U8(5), // | |
| 7909 B(Mov), R(1), R(0), // | |
| 7910 B(Ldar), R(1), // | |
| 7911 B(LdaUndefined), // | |
| 7912 B(Return) // | |
| 7913 }, | |
| 7914 0}, | |
| 7915 {"const x = 10; return x;", | |
| 7916 2 * kPointerSize, | |
| 7917 1, | |
| 7918 22, | |
| 7919 { | |
| 7920 B(LdaTheHole), // | |
| 7921 B(Star), R(0), // | |
| 7922 B(LdaSmi8), U8(10), // | |
| 7923 B(Star), R(1), // | |
| 7924 B(Ldar), R(0), // | |
| 7925 B(JumpIfNotHole), U8(5), // | |
| 7926 B(Mov), R(1), R(0), // | |
| 7927 B(Ldar), R(1), // | |
| 7928 B(Ldar), R(0), // | |
| 7929 B(JumpIfNotHole), U8(3), // | |
| 7930 B(LdaUndefined), // | |
| 7931 B(Return) // | |
| 7932 }, | |
| 7933 0}, | |
| 7934 {"const x = ( x = 20);", | |
| 7935 2 * kPointerSize, | |
| 7936 1, | |
| 7937 22, | |
| 7938 { | |
| 7939 B(LdaTheHole), // | |
| 7940 B(Star), R(0), // | |
| 7941 B(LdaSmi8), U8(20), // | |
| 7942 B(Star), R(1), // | |
| 7943 B(Ldar), R(0), // | |
| 7944 B(Ldar), R(1), // | |
| 7945 B(Ldar), R(0), // | |
| 7946 B(JumpIfNotHole), U8(5), // | |
| 7947 B(Mov), R(1), R(0), // | |
| 7948 B(Ldar), R(1), // | |
| 7949 B(LdaUndefined), // | |
| 7950 B(Return) // | |
| 7951 }, | |
| 7952 0}, | |
| 7953 {"const x = 10; x = 20;", | |
| 7954 2 * kPointerSize, | |
| 7955 1, | |
| 7956 26, | |
| 7957 { | |
| 7958 B(LdaTheHole), // | |
| 7959 B(Star), R(0), // | |
| 7960 B(LdaSmi8), U8(10), // | |
| 7961 B(Star), R(1), // | |
| 7962 B(Ldar), R(0), // | |
| 7963 B(JumpIfNotHole), U8(5), // | |
| 7964 B(Mov), R(1), R(0), // | |
| 7965 B(Ldar), R(1), // | |
| 7966 B(LdaSmi8), U8(20), // | |
| 7967 B(Star), R(1), // | |
| 7968 B(Ldar), R(0), // | |
| 7969 B(Ldar), R(1), // | |
| 7970 B(LdaUndefined), // | |
| 7971 B(Return) // | |
| 7972 }, | |
| 7973 0}, | |
| 7974 }; | |
| 7975 | |
| 7976 for (size_t i = 0; i < arraysize(snippets); i++) { | |
| 7977 Handle<BytecodeArray> bytecode_array = | |
| 7978 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); | |
| 7979 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | |
| 7980 } | |
| 7981 | |
| 7982 FLAG_legacy_const = old_legacy_const_flag; | |
| 7983 } | |
| 7984 | |
| 7985 TEST(ConstVariableContextSlot) { | |
| 7986 InitializedHandleScope handle_scope; | |
| 7987 BytecodeGeneratorHelper helper; | |
| 7988 | |
| 7989 int closure = Register::function_closure().index(); | |
| 7990 int context = Register::current_context().index(); | |
| 7991 | |
| 7992 // TODO(mythria): Add tests for initialization of this via super calls. | |
| 7993 // TODO(mythria): Add tests that walk the context chain. | |
|
rmcilroy
2016/02/04 15:19:39
ditto
mythria
2016/02/04 16:07:59
Done.
| |
| 7994 ExpectedSnippet<InstanceType> snippets[] = { | |
| 7995 {"const x = 10; function f1() {return x;}", | |
| 7996 2 * kPointerSize, | |
| 7997 1, | |
| 7998 23, | |
| 7999 { | |
| 8000 B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), // | |
| 8001 U8(1), // | |
| 8002 B(PushContext), R(1), // | |
| 8003 B(LdaTheHole), // | |
| 8004 B(StaContextSlot), R(context), U8(4), // | |
| 8005 B(CreateClosure), U8(0), U8(0), // | |
| 8006 B(Star), R(0), // | |
| 8007 B(LdaSmi8), U8(10), // | |
| 8008 B(StaContextSlot), R(context), U8(4), // | |
| 8009 B(LdaUndefined), // | |
| 8010 B(Return) // | |
| 8011 }, | |
| 8012 1, | |
| 8013 {InstanceType::SHARED_FUNCTION_INFO_TYPE}}, | |
| 8014 {"const x = 10; function f1() {return x;} return x;", | |
| 8015 3 * kPointerSize, | |
| 8016 1, | |
| 8017 36, | |
| 8018 { | |
| 8019 B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), // | |
| 8020 U8(1), // | |
| 8021 B(PushContext), R(1), // | |
| 8022 B(LdaTheHole), // | |
| 8023 B(StaContextSlot), R(context), U8(4), // | |
| 8024 B(CreateClosure), U8(0), U8(0), // | |
| 8025 B(Star), R(0), // | |
| 8026 B(LdaSmi8), U8(10), // | |
| 8027 B(StaContextSlot), R(context), U8(4), // | |
| 8028 B(LdaContextSlot), R(context), U8(4), // | |
| 8029 B(JumpIfNotHole), U8(11), // | |
| 8030 B(LdaConstant), U8(1), // | |
| 8031 B(Star), R(2), // | |
| 8032 B(CallRuntime), U16(Runtime::kThrowReferenceError), R(2), U8(1), // | |
| 8033 B(Return) // | |
| 8034 }, | |
| 8035 2, | |
| 8036 {InstanceType::SHARED_FUNCTION_INFO_TYPE, | |
| 8037 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, | |
| 8038 {"const x = (x = 20); function f1() {return x;}", | |
| 8039 4 * kPointerSize, | |
| 8040 1, | |
| 8041 49, | |
| 8042 { | |
| 8043 B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), // | |
| 8044 U8(1), // | |
| 8045 B(PushContext), R(1), // | |
| 8046 B(LdaTheHole), // | |
| 8047 B(StaContextSlot), R(context), U8(4), // | |
| 8048 B(CreateClosure), U8(0), U8(0), // | |
| 8049 B(Star), R(0), // | |
| 8050 B(LdaSmi8), U8(20), // | |
| 8051 B(Star), R(2), // | |
| 8052 B(LdaContextSlot), R(context), U8(4), // | |
| 8053 B(JumpIfNotHole), U8(11), // | |
| 8054 B(LdaConstant), U8(1), // | |
| 8055 B(Star), R(3), // | |
| 8056 B(CallRuntime), U16(Runtime::kThrowReferenceError), R(3), U8(1), // | |
| 8057 B(CallRuntime), U16(Runtime::kThrowConstAssignError), R(0), // | |
| 8058 U8(0), // | |
| 8059 B(Ldar), R(2), // | |
| 8060 B(StaContextSlot), R(context), U8(4), // | |
| 8061 B(StaContextSlot), R(context), U8(4), // | |
| 8062 B(LdaUndefined), // | |
| 8063 B(Return) // | |
| 8064 }, | |
| 8065 2, | |
| 8066 {InstanceType::SHARED_FUNCTION_INFO_TYPE, | |
| 8067 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, | |
| 8068 {"const x = 10; x = 20; function f1() {return x;}", | |
| 8069 4 * kPointerSize, | |
| 8070 1, | |
| 8071 51, | |
| 8072 { | |
| 8073 B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), // | |
| 8074 U8(1), // | |
| 8075 B(PushContext), R(1), // | |
| 8076 B(LdaTheHole), // | |
| 8077 B(StaContextSlot), R(context), U8(4), // | |
| 8078 B(CreateClosure), U8(0), U8(0), // | |
| 8079 B(Star), R(0), // | |
| 8080 B(LdaSmi8), U8(10), // | |
| 8081 B(StaContextSlot), R(context), U8(4), // | |
| 8082 B(LdaSmi8), U8(20), // | |
| 8083 B(Star), R(2), // | |
| 8084 B(LdaContextSlot), R(context), U8(4), // | |
| 8085 B(JumpIfNotHole), U8(11), // | |
| 8086 B(LdaConstant), U8(1), // | |
| 8087 B(Star), R(3), // | |
| 8088 B(CallRuntime), U16(Runtime::kThrowReferenceError), R(3), U8(1), // | |
| 8089 B(CallRuntime), U16(Runtime::kThrowConstAssignError), R(0), // | |
| 8090 U8(0), // | |
| 8091 B(Ldar), R(2), // | |
| 8092 B(StaContextSlot), R(context), U8(4), // | |
| 8093 B(LdaUndefined), // | |
| 8094 B(Return) // | |
| 8095 }, | |
| 8096 2, | |
| 8097 {InstanceType::SHARED_FUNCTION_INFO_TYPE, | |
| 8098 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, | |
| 8099 }; | |
| 8100 | |
| 8101 for (size_t i = 0; i < arraysize(snippets); i++) { | |
| 8102 Handle<BytecodeArray> bytecode_array = | |
| 8103 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); | |
| 8104 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | |
| 8105 } | |
| 8106 } | |
| 8107 | |
| 8108 TEST(LetVariableContextSlot) { | |
| 8109 InitializedHandleScope handle_scope; | |
| 8110 BytecodeGeneratorHelper helper; | |
| 8111 | |
| 8112 int closure = Register::function_closure().index(); | |
| 8113 int context = Register::current_context().index(); | |
| 8114 | |
| 8115 ExpectedSnippet<InstanceType> snippets[] = { | |
|
rmcilroy
2016/02/04 15:19:39
ditto
mythria
2016/02/04 16:07:59
Done.
| |
| 8116 {"let x = 10; function f1() {return x;}", | |
| 8117 2 * kPointerSize, | |
| 8118 1, | |
| 8119 23, | |
| 8120 { | |
| 8121 B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), // | |
| 8122 U8(1), // | |
| 8123 B(PushContext), R(1), // | |
| 8124 B(LdaTheHole), // | |
| 8125 B(StaContextSlot), R(context), U8(4), // | |
| 8126 B(CreateClosure), U8(0), U8(0), // | |
| 8127 B(Star), R(0), // | |
| 8128 B(LdaSmi8), U8(10), // | |
| 8129 B(StaContextSlot), R(context), U8(4), // | |
| 8130 B(LdaUndefined), // | |
| 8131 B(Return) // | |
| 8132 }, | |
| 8133 1, | |
| 8134 {InstanceType::SHARED_FUNCTION_INFO_TYPE}}, | |
| 8135 {"let x = 10; function f1() {return x;} return x;", | |
| 8136 3 * kPointerSize, | |
| 8137 1, | |
| 8138 36, | |
| 8139 { | |
| 8140 B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), // | |
| 8141 U8(1), // | |
| 8142 B(PushContext), R(1), // | |
| 8143 B(LdaTheHole), // | |
| 8144 B(StaContextSlot), R(context), U8(4), // | |
| 8145 B(CreateClosure), U8(0), U8(0), // | |
| 8146 B(Star), R(0), // | |
| 8147 B(LdaSmi8), U8(10), // | |
| 8148 B(StaContextSlot), R(context), U8(4), // | |
| 8149 B(LdaContextSlot), R(context), U8(4), // | |
| 8150 B(JumpIfNotHole), U8(11), // | |
| 8151 B(LdaConstant), U8(1), // | |
| 8152 B(Star), R(2), // | |
| 8153 B(CallRuntime), U16(Runtime::kThrowReferenceError), R(2), U8(1), // | |
| 8154 B(Return) // | |
| 8155 }, | |
| 8156 2, | |
| 8157 {InstanceType::SHARED_FUNCTION_INFO_TYPE, | |
| 8158 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, | |
| 8159 {"let x = (x = 20); function f1() {return x;}", | |
| 8160 4 * kPointerSize, | |
| 8161 1, | |
| 8162 44, | |
| 8163 { | |
| 8164 B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), // | |
| 8165 U8(1), // | |
| 8166 B(PushContext), R(1), // | |
| 8167 B(LdaTheHole), // | |
| 8168 B(StaContextSlot), R(context), U8(4), // | |
| 8169 B(CreateClosure), U8(0), U8(0), // | |
| 8170 B(Star), R(0), // | |
| 8171 B(LdaSmi8), U8(20), // | |
| 8172 B(Star), R(2), // | |
| 8173 B(LdaContextSlot), R(context), U8(4), // | |
| 8174 B(JumpIfNotHole), U8(11), // | |
| 8175 B(LdaConstant), U8(1), // | |
| 8176 B(Star), R(3), // | |
| 8177 B(CallRuntime), U16(Runtime::kThrowReferenceError), R(3), U8(1), // | |
| 8178 B(Ldar), R(2), // | |
| 8179 B(StaContextSlot), R(context), U8(4), // | |
| 8180 B(StaContextSlot), R(context), U8(4), // | |
| 8181 B(LdaUndefined), // | |
| 8182 B(Return) // | |
| 8183 }, | |
| 8184 2, | |
| 8185 {InstanceType::SHARED_FUNCTION_INFO_TYPE, | |
| 8186 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, | |
| 8187 {"let x = 10; x = 20; function f1() {return x;}", | |
| 8188 4 * kPointerSize, | |
| 8189 1, | |
| 8190 46, | |
| 8191 { | |
| 8192 B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), // | |
| 8193 U8(1), // | |
| 8194 B(PushContext), R(1), // | |
| 8195 B(LdaTheHole), // | |
| 8196 B(StaContextSlot), R(context), U8(4), // | |
| 8197 B(CreateClosure), U8(0), U8(0), // | |
| 8198 B(Star), R(0), // | |
| 8199 B(LdaSmi8), U8(10), // | |
| 8200 B(StaContextSlot), R(context), U8(4), // | |
| 8201 B(LdaSmi8), U8(20), // | |
| 8202 B(Star), R(2), // | |
| 8203 B(LdaContextSlot), R(context), U8(4), // | |
| 8204 B(JumpIfNotHole), U8(11), // | |
| 8205 B(LdaConstant), U8(1), // | |
| 8206 B(Star), R(3), // | |
| 8207 B(CallRuntime), U16(Runtime::kThrowReferenceError), R(3), U8(1), // | |
| 8208 B(Ldar), R(2), // | |
| 8209 B(StaContextSlot), R(context), U8(4), // | |
| 8210 B(LdaUndefined), // | |
| 8211 B(Return) // | |
| 8212 }, | |
| 8213 2, | |
| 8214 {InstanceType::SHARED_FUNCTION_INFO_TYPE, | |
| 8215 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, | |
| 8216 }; | |
| 8217 | |
| 8218 for (size_t i = 0; i < arraysize(snippets); i++) { | |
| 8219 Handle<BytecodeArray> bytecode_array = | |
| 8220 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); | |
| 8221 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | |
| 8222 } | |
| 8223 } | |
| 8224 | |
| 7636 TEST(DoExpression) { | 8225 TEST(DoExpression) { |
| 7637 bool old_flag = FLAG_harmony_do_expressions; | 8226 bool old_flag = FLAG_harmony_do_expressions; |
| 7638 FLAG_harmony_do_expressions = true; | 8227 FLAG_harmony_do_expressions = true; |
| 7639 | 8228 |
| 7640 InitializedHandleScope handle_scope; | 8229 InitializedHandleScope handle_scope; |
| 7641 BytecodeGeneratorHelper helper; | 8230 BytecodeGeneratorHelper helper; |
| 7642 | 8231 |
| 7643 ExpectedSnippet<const char*> snippets[] = { | 8232 ExpectedSnippet<const char*> snippets[] = { |
| 7644 {"var a = do { }; return a;", | 8233 {"var a = do { }; return a;", |
| 7645 2 * kPointerSize, | 8234 2 * kPointerSize, |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 7740 for (size_t i = 0; i < arraysize(snippets); i++) { | 8329 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 7741 Handle<BytecodeArray> bytecode_array = | 8330 Handle<BytecodeArray> bytecode_array = |
| 7742 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); | 8331 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); |
| 7743 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 8332 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
| 7744 } | 8333 } |
| 7745 } | 8334 } |
| 7746 | 8335 |
| 7747 } // namespace interpreter | 8336 } // namespace interpreter |
| 7748 } // namespace internal | 8337 } // namespace internal |
| 7749 } // namespace v8 | 8338 } // namespace v8 |
| OLD | NEW |