Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(184)

Side by Side Diff: test/cctest/interpreter/test-bytecode-generator.cc

Issue 1604923002: [Interpreter] Always store current context in the frames context slot. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@int_fix_block_context_scope
Patch Set: Rebase Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/x87/builtins-x87.cc ('k') | test/mjsunit/deopt-with-outer-context.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 2195 matching lines...) Expand 10 before | Expand all | Expand 10 after
2206 CheckBytecodeArrayEqual(snippets[i], bytecode_array); 2206 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
2207 } 2207 }
2208 } 2208 }
2209 2209
2210 2210
2211 TEST(BreakableBlocks) { 2211 TEST(BreakableBlocks) {
2212 InitializedHandleScope handle_scope; 2212 InitializedHandleScope handle_scope;
2213 BytecodeGeneratorHelper helper; 2213 BytecodeGeneratorHelper helper;
2214 2214
2215 int closure = Register::function_closure().index(); 2215 int closure = Register::function_closure().index();
2216 int context = Register::function_context().index(); 2216 int context = Register::current_context().index();
2217 2217
2218 ExpectedSnippet<InstanceType> snippets[] = { 2218 ExpectedSnippet<InstanceType> snippets[] = {
2219 {"var x = 0;\n" 2219 {"var x = 0;\n"
2220 "label: {\n" 2220 "label: {\n"
2221 " x = x + 1;\n" 2221 " x = x + 1;\n"
2222 " break label;\n" 2222 " break label;\n"
2223 " x = x + 1;\n" 2223 " x = x + 1;\n"
2224 "}\n" 2224 "}\n"
2225 "return x;", 2225 "return x;",
2226 2 * kPointerSize, 2226 2 * kPointerSize,
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
2302 1, 2302 1,
2303 39, 2303 39,
2304 { 2304 {
2305 B(LdaConstant), U8(0), // 2305 B(LdaConstant), U8(0), //
2306 B(Star), R(3), // 2306 B(Star), R(3), //
2307 B(Ldar), R(closure), // 2307 B(Ldar), R(closure), //
2308 B(Star), R(4), // 2308 B(Star), R(4), //
2309 B(CallRuntime), U16(Runtime::kPushBlockContext), R(3), U8(2), // 2309 B(CallRuntime), U16(Runtime::kPushBlockContext), R(3), U8(2), //
2310 B(PushContext), R(2), // 2310 B(PushContext), R(2), //
2311 B(LdaTheHole), // 2311 B(LdaTheHole), //
2312 B(StaContextSlot), R(2), U8(4), // 2312 B(StaContextSlot), R(context), U8(4), //
2313 B(CreateClosure), U8(1), U8(0), // 2313 B(CreateClosure), U8(1), U8(0), //
2314 B(Star), R(0), // 2314 B(Star), R(0), //
2315 B(LdaSmi8), U8(10), // 2315 B(LdaSmi8), U8(10), //
2316 B(StaContextSlot), R(2), U8(4), // 2316 B(StaContextSlot), R(context), U8(4), //
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(2), //
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" 2327 {"let x = 1;\n"
2328 "outer: {\n" 2328 "outer: {\n"
2329 " inner: {\n" 2329 " inner: {\n"
2330 " let y = 2;\n" 2330 " let y = 2;\n"
2331 " function f() { return x + y; }\n" 2331 " function f() { return x + y; }\n"
2332 " if (y) break outer;\n" 2332 " if (y) break outer;\n"
2333 " y = 3;\n" 2333 " y = 3;\n"
2334 " }\n" 2334 " }\n"
2335 "}\n" 2335 "}\n"
2336 "x = 4;", 2336 "x = 4;",
2337 6 * kPointerSize, 2337 6 * kPointerSize,
2338 1, 2338 1,
2339 72, 2339 72,
2340 { 2340 {
2341 B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), // 2341 B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), //
2342 U8(1), // 2342 U8(1), //
2343 B(PushContext), R(2), // 2343 B(PushContext), R(2), //
2344 B(LdaTheHole), // 2344 B(LdaTheHole), //
2345 B(StaContextSlot), R(2), U8(4), // 2345 B(StaContextSlot), R(context), U8(4), //
2346 B(LdaSmi8), U8(1), // 2346 B(LdaSmi8), U8(1), //
2347 B(StaContextSlot), R(2), U8(4), // 2347 B(StaContextSlot), R(context), U8(4), //
2348 B(LdaConstant), U8(0), // 2348 B(LdaConstant), U8(0), //
2349 B(Star), R(4), // 2349 B(Star), R(4), //
2350 B(Ldar), R(closure), // 2350 B(Ldar), R(closure), //
2351 B(Star), R(5), // 2351 B(Star), R(5), //
2352 B(CallRuntime), U16(Runtime::kPushBlockContext), R(4), U8(2), // 2352 B(CallRuntime), U16(Runtime::kPushBlockContext), R(4), U8(2), //
2353 B(PushContext), R(3), // 2353 B(PushContext), R(3), //
2354 B(LdaTheHole), // 2354 B(LdaTheHole), //
2355 B(StaContextSlot), R(3), U8(4), // 2355 B(StaContextSlot), R(context), U8(4), //
2356 B(CreateClosure), U8(1), U8(0), // 2356 B(CreateClosure), U8(1), U8(0), //
2357 B(Star), R(0), // 2357 B(Star), R(0), //
2358 B(LdaSmi8), U8(2), // 2358 B(LdaSmi8), U8(2), //
2359 B(StaContextSlot), R(3), U8(4), // 2359 B(StaContextSlot), R(context), U8(4), //
2360 B(Ldar), R(0), // 2360 B(Ldar), R(0), //
2361 B(Star), R(1), // 2361 B(Star), R(1), //
2362 B(LdaContextSlot), R(3), U8(4), // 2362 B(LdaContextSlot), R(context), U8(4), //
2363 B(JumpIfToBooleanFalse), U8(6), // 2363 B(JumpIfToBooleanFalse), U8(6), //
2364 B(PopContext), R(2), // 2364 B(PopContext), R(3), //
2365 B(Jump), U8(9), // 2365 B(Jump), U8(9), //
2366 B(LdaSmi8), U8(3), // 2366 B(LdaSmi8), U8(3), //
2367 B(StaContextSlot), R(3), U8(4), // 2367 B(StaContextSlot), R(context), U8(4), //
2368 B(PopContext), R(2), // 2368 B(PopContext), R(3), //
2369 B(LdaSmi8), U8(4), // 2369 B(LdaSmi8), U8(4), //
2370 B(StaContextSlot), R(2), U8(4), // 2370 B(StaContextSlot), R(context), U8(4), //
2371 B(LdaUndefined), // 2371 B(LdaUndefined), //
2372 B(Return), // 2372 B(Return), //
2373 }, 2373 },
2374 2, 2374 2,
2375 {InstanceType::FIXED_ARRAY_TYPE, 2375 {InstanceType::FIXED_ARRAY_TYPE,
2376 InstanceType::SHARED_FUNCTION_INFO_TYPE}}, 2376 InstanceType::SHARED_FUNCTION_INFO_TYPE}},
2377 }; 2377 };
2378 2378
2379 for (size_t i = 0; i < arraysize(snippets); i++) { 2379 for (size_t i = 0; i < arraysize(snippets); i++) {
2380 Handle<BytecodeArray> bytecode_array = 2380 Handle<BytecodeArray> bytecode_array =
2381 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); 2381 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet);
2382 CheckBytecodeArrayEqual(snippets[i], bytecode_array); 2382 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
2383 } 2383 }
2384 } 2384 }
2385 2385
2386 2386
2387 TEST(BasicLoops) { 2387 TEST(BasicLoops) {
2388 InitializedHandleScope handle_scope; 2388 InitializedHandleScope handle_scope;
2389 BytecodeGeneratorHelper helper; 2389 BytecodeGeneratorHelper helper;
2390 2390
2391 int closure = Register::function_closure().index(); 2391 int closure = Register::function_closure().index();
2392 int context = Register::function_context().index(); 2392 int context = Register::current_context().index();
2393 2393
2394 ExpectedSnippet<InstanceType> snippets[] = { 2394 ExpectedSnippet<InstanceType> snippets[] = {
2395 {"var x = 0;\n" 2395 {"var x = 0;\n"
2396 "while (false) { x = 99; break; continue; }\n" 2396 "while (false) { x = 99; break; continue; }\n"
2397 "return x;", 2397 "return x;",
2398 1 * kPointerSize, 2398 1 * kPointerSize,
2399 1, 2399 1,
2400 4, 2400 4,
2401 { 2401 {
2402 B(LdaZero), // 2402 B(LdaZero), //
(...skipping 617 matching lines...) Expand 10 before | Expand all | Expand 10 after
3020 B(Star), R(1), // 3020 B(Star), R(1), //
3021 B(Ldar), R(1), // 3021 B(Ldar), R(1), //
3022 B(JumpIfToBooleanFalse), U8(58), // 3022 B(JumpIfToBooleanFalse), U8(58), //
3023 B(LdaConstant), U8(0), // 3023 B(LdaConstant), U8(0), //
3024 B(Star), R(4), // 3024 B(Star), R(4), //
3025 B(Ldar), R(closure), // 3025 B(Ldar), R(closure), //
3026 B(Star), R(5), // 3026 B(Star), R(5), //
3027 B(CallRuntime), U16(Runtime::kPushBlockContext), R(4), U8(2), // 3027 B(CallRuntime), U16(Runtime::kPushBlockContext), R(4), U8(2), //
3028 B(PushContext), R(3), // 3028 B(PushContext), R(3), //
3029 B(LdaTheHole), // 3029 B(LdaTheHole), //
3030 B(StaContextSlot), R(3), U8(4), // 3030 B(StaContextSlot), R(context), U8(4), //
3031 B(CreateClosure), U8(1), U8(0), // 3031 B(CreateClosure), U8(1), U8(0), //
3032 B(Star), R(0), // 3032 B(Star), R(0), //
3033 B(LdaSmi8), U8(1), // 3033 B(LdaSmi8), U8(1), //
3034 B(StaContextSlot), R(3), U8(4), // 3034 B(StaContextSlot), R(context), U8(4), //
3035 B(Ldar), R(0), // 3035 B(Ldar), R(0), //
3036 B(Star), R(2), // 3036 B(Star), R(2), //
3037 B(LdaContextSlot), R(3), U8(4), // 3037 B(LdaContextSlot), R(context), U8(4), //
3038 B(JumpIfToBooleanFalse), U8(6), // 3038 B(JumpIfToBooleanFalse), U8(6), //
3039 B(PopContext), R(context), // 3039 B(PopContext), R(3), //
3040 B(Jump), U8(-44), // 3040 B(Jump), U8(-44), //
3041 B(LdaContextSlot), R(3), U8(4), // 3041 B(LdaContextSlot), R(context), U8(4), //
3042 B(ToNumber), // 3042 B(ToNumber), //
3043 B(Star), R(4), // 3043 B(Star), R(4), //
3044 B(Inc), // 3044 B(Inc), //
3045 B(StaContextSlot), R(3), U8(4), // 3045 B(StaContextSlot), R(context), U8(4), //
3046 B(PopContext), R(context), // 3046 B(PopContext), R(3), //
3047 B(Jump), U8(-58), // 3047 B(Jump), U8(-58), //
3048 B(LdaUndefined), // 3048 B(LdaUndefined), //
3049 B(Return), // 3049 B(Return), //
3050 }, 3050 },
3051 2, 3051 2,
3052 {InstanceType::FIXED_ARRAY_TYPE, 3052 {InstanceType::FIXED_ARRAY_TYPE,
3053 InstanceType::SHARED_FUNCTION_INFO_TYPE}}, 3053 InstanceType::SHARED_FUNCTION_INFO_TYPE}},
3054 }; 3054 };
3055 3055
3056 for (size_t i = 0; i < arraysize(snippets); i++) { 3056 for (size_t i = 0; i < arraysize(snippets); i++) {
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after
3346 } 3346 }
3347 3347
3348 3348
3349 TEST(Delete) { 3349 TEST(Delete) {
3350 InitializedHandleScope handle_scope; 3350 InitializedHandleScope handle_scope;
3351 BytecodeGeneratorHelper helper; 3351 BytecodeGeneratorHelper helper;
3352 3352
3353 int deep_elements_flags = 3353 int deep_elements_flags =
3354 ObjectLiteral::kFastElements | ObjectLiteral::kDisableMementos; 3354 ObjectLiteral::kFastElements | ObjectLiteral::kDisableMementos;
3355 int closure = Register::function_closure().index(); 3355 int closure = Register::function_closure().index();
3356 int context = Register::current_context().index();
3356 int first_context_slot = Context::MIN_CONTEXT_SLOTS; 3357 int first_context_slot = Context::MIN_CONTEXT_SLOTS;
3357 3358
3358 ExpectedSnippet<InstanceType> snippets[] = { 3359 ExpectedSnippet<InstanceType> snippets[] = {
3359 {"var a = {x:13, y:14}; return delete a.x;", 3360 {"var a = {x:13, y:14}; return delete a.x;",
3360 2 * kPointerSize, 3361 2 * kPointerSize,
3361 1, 3362 1,
3362 15, 3363 15,
3363 {B(CreateObjectLiteral), U8(0), U8(0), U8(deep_elements_flags), // 3364 {B(CreateObjectLiteral), U8(0), U8(0), U8(deep_elements_flags), //
3364 B(Star), R(1), // 3365 B(Star), R(1), //
3365 B(Star), R(0), // 3366 B(Star), R(0), //
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
3411 "(function f1() {return a;});" 3412 "(function f1() {return a;});"
3412 "return delete a[1];", 3413 "return delete a[1];",
3413 2 * kPointerSize, 3414 2 * kPointerSize,
3414 1, 3415 1,
3415 29, 3416 29,
3416 {B(CallRuntime), U16(Runtime::kNewFunctionContext), // 3417 {B(CallRuntime), U16(Runtime::kNewFunctionContext), //
3417 R(closure), U8(1), // 3418 R(closure), U8(1), //
3418 B(PushContext), R(0), // 3419 B(PushContext), R(0), //
3419 B(CreateObjectLiteral), U8(0), U8(0), U8(deep_elements_flags), // 3420 B(CreateObjectLiteral), U8(0), U8(0), U8(deep_elements_flags), //
3420 B(Star), R(1), // 3421 B(Star), R(1), //
3421 B(StaContextSlot), R(0), U8(first_context_slot), // 3422 B(StaContextSlot), R(context), U8(first_context_slot), //
3422 B(CreateClosure), U8(1), U8(0), // 3423 B(CreateClosure), U8(1), U8(0), //
3423 B(LdaContextSlot), R(0), U8(first_context_slot), // 3424 B(LdaContextSlot), R(context), U8(first_context_slot), //
3424 B(Star), R(1), // 3425 B(Star), R(1), //
3425 B(LdaSmi8), U8(1), // 3426 B(LdaSmi8), U8(1), //
3426 B(DeletePropertyStrict), R(1), // 3427 B(DeletePropertyStrict), R(1), //
3427 B(Return)}, 3428 B(Return)},
3428 2, 3429 2,
3429 {InstanceType::FIXED_ARRAY_TYPE, 3430 {InstanceType::FIXED_ARRAY_TYPE,
3430 InstanceType::SHARED_FUNCTION_INFO_TYPE}}, 3431 InstanceType::SHARED_FUNCTION_INFO_TYPE}},
3431 {"return delete 'test';", 3432 {"return delete 'test';",
3432 0 * kPointerSize, 3433 0 * kPointerSize,
3433 1, 3434 1,
3434 2, 3435 2,
3435 {B(LdaTrue), // 3436 {B(LdaTrue), //
3436 B(Return)}, 3437 B(Return)},
3437 0}, 3438 0},
3438 }; 3439 };
3439 3440
3440 for (size_t i = 0; i < arraysize(snippets); i++) { 3441 for (size_t i = 0; i < arraysize(snippets); i++) {
3441 Handle<BytecodeArray> bytecode_array = 3442 Handle<BytecodeArray> bytecode_array =
3442 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); 3443 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet);
3443 CheckBytecodeArrayEqual(snippets[i], bytecode_array); 3444 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
3444 } 3445 }
3445 } 3446 }
3446 3447
3447 3448
3448 TEST(GlobalDelete) { 3449 TEST(GlobalDelete) {
3449 InitializedHandleScope handle_scope; 3450 InitializedHandleScope handle_scope;
3450 BytecodeGeneratorHelper helper; 3451 BytecodeGeneratorHelper helper;
3451 Zone zone; 3452 Zone zone;
3452 3453
3453 int context = Register::function_context().index(); 3454 int context = Register::current_context().index();
3454 int native_context_index = Context::NATIVE_CONTEXT_INDEX; 3455 int native_context_index = Context::NATIVE_CONTEXT_INDEX;
3455 int global_context_index = Context::EXTENSION_INDEX; 3456 int global_context_index = Context::EXTENSION_INDEX;
3456 FeedbackVectorSpec feedback_spec(&zone); 3457 FeedbackVectorSpec feedback_spec(&zone);
3457 FeedbackVectorSlot slot = feedback_spec.AddLoadICSlot(); 3458 FeedbackVectorSlot slot = feedback_spec.AddLoadICSlot();
3458 3459
3459 Handle<i::TypeFeedbackVector> vector = 3460 Handle<i::TypeFeedbackVector> vector =
3460 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec); 3461 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec);
3461 3462
3462 ExpectedSnippet<InstanceType> snippets[] = { 3463 ExpectedSnippet<InstanceType> snippets[] = {
3463 {"var a = {x:13, y:14};\n function f() { return delete a.x; };\n f();", 3464 {"var a = {x:13, y:14};\n function f() { return delete a.x; };\n f();",
(...skipping 797 matching lines...) Expand 10 before | Expand all | Expand 10 after
4261 CheckBytecodeArrayEqual(snippets[i], bytecode_array); 4262 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
4262 } 4263 }
4263 } 4264 }
4264 4265
4265 4266
4266 TEST(TryCatch) { 4267 TEST(TryCatch) {
4267 InitializedHandleScope handle_scope; 4268 InitializedHandleScope handle_scope;
4268 BytecodeGeneratorHelper helper; 4269 BytecodeGeneratorHelper helper;
4269 4270
4270 int closure = Register::function_closure().index(); 4271 int closure = Register::function_closure().index();
4271 int context = Register::function_context().index();
4272 4272
4273 ExpectedSnippet<const char*> snippets[] = { 4273 ExpectedSnippet<const char*> snippets[] = {
4274 {"try { return 1; } catch(e) { return 2; }", 4274 {"try { return 1; } catch(e) { return 2; }",
4275 5 * kPointerSize, 4275 5 * kPointerSize,
4276 1, 4276 1,
4277 27, 4277 27,
4278 { 4278 {
4279 B(LdaSmi8), U8(1), // 4279 B(LdaSmi8), U8(1), //
4280 B(Return), // 4280 B(Return), //
4281 B(Star), R(3), // 4281 B(Star), R(3), //
4282 B(LdaConstant), U8(0), // 4282 B(LdaConstant), U8(0), //
4283 B(Star), R(2), // 4283 B(Star), R(2), //
4284 B(Ldar), R(closure), // 4284 B(Ldar), R(closure), //
4285 B(Star), R(4), // 4285 B(Star), R(4), //
4286 B(CallRuntime), U16(Runtime::kPushCatchContext), R(2), U8(3), // 4286 B(CallRuntime), U16(Runtime::kPushCatchContext), R(2), U8(3), //
4287 B(PushContext), R(0), // 4287 B(PushContext), R(0), //
4288 B(LdaSmi8), U8(2), // 4288 B(LdaSmi8), U8(2), //
4289 B(PopContext), R(context), // 4289 B(PopContext), R(0), //
4290 B(Return), // 4290 B(Return), //
4291 // TODO(mstarzinger): Potential optimization, elide next bytes. 4291 // TODO(mstarzinger): Potential optimization, elide next bytes.
4292 B(LdaUndefined), // 4292 B(LdaUndefined), //
4293 B(Return), // 4293 B(Return), //
4294 }, 4294 },
4295 1, 4295 1,
4296 {"e"}, 4296 {"e"},
4297 1, 4297 1,
4298 {{0, 3, 3}}}, 4298 {{0, 3, 3}}},
4299 {"var a; try { a = 1 } catch(e1) {}; try { a = 2 } catch(e2) { a = 3 }", 4299 {"var a; try { a = 1 } catch(e1) {}; try { a = 2 } catch(e2) { a = 3 }",
4300 6 * kPointerSize, 4300 6 * kPointerSize,
4301 1, 4301 1,
4302 56, 4302 56,
4303 { 4303 {
4304 B(LdaSmi8), U8(1), // 4304 B(LdaSmi8), U8(1), //
4305 B(Star), R(0), // 4305 B(Star), R(0), //
4306 B(Jump), U8(21), // 4306 B(Jump), U8(21), //
4307 B(Star), R(4), // 4307 B(Star), R(4), //
4308 B(LdaConstant), U8(0), // 4308 B(LdaConstant), U8(0), //
4309 B(Star), R(3), // 4309 B(Star), R(3), //
4310 B(Ldar), R(closure), // 4310 B(Ldar), R(closure), //
4311 B(Star), R(5), // 4311 B(Star), R(5), //
4312 B(CallRuntime), U16(Runtime::kPushCatchContext), R(3), U8(3), // 4312 B(CallRuntime), U16(Runtime::kPushCatchContext), R(3), U8(3), //
4313 B(PushContext), R(1), // 4313 B(PushContext), R(1), //
4314 B(PopContext), R(context), // 4314 B(PopContext), R(1), //
4315 B(LdaSmi8), U8(2), // 4315 B(LdaSmi8), U8(2), //
4316 B(Star), R(0), // 4316 B(Star), R(0), //
4317 B(Jump), U8(25), // 4317 B(Jump), U8(25), //
4318 B(Star), R(4), // 4318 B(Star), R(4), //
4319 B(LdaConstant), U8(1), // 4319 B(LdaConstant), U8(1), //
4320 B(Star), R(3), // 4320 B(Star), R(3), //
4321 B(Ldar), R(closure), // 4321 B(Ldar), R(closure), //
4322 B(Star), R(5), // 4322 B(Star), R(5), //
4323 B(CallRuntime), U16(Runtime::kPushCatchContext), R(3), U8(3), // 4323 B(CallRuntime), U16(Runtime::kPushCatchContext), R(3), U8(3), //
4324 B(PushContext), R(1), // 4324 B(PushContext), R(1), //
4325 B(LdaSmi8), U8(3), // 4325 B(LdaSmi8), U8(3), //
4326 B(Star), R(0), // 4326 B(Star), R(0), //
4327 B(PopContext), R(context), // 4327 B(PopContext), R(1), //
4328 B(LdaUndefined), // 4328 B(LdaUndefined), //
4329 B(Return), // 4329 B(Return), //
4330 }, 4330 },
4331 2, 4331 2,
4332 {"e1", "e2"}, 4332 {"e1", "e2"},
4333 2, 4333 2,
4334 {{0, 4, 6}, {25, 29, 31}}}, 4334 {{0, 4, 6}, {25, 29, 31}}},
4335 }; 4335 };
4336 4336
4337 for (size_t i = 0; i < arraysize(snippets); i++) { 4337 for (size_t i = 0; i < arraysize(snippets); i++) {
4338 Handle<BytecodeArray> bytecode_array = 4338 Handle<BytecodeArray> bytecode_array =
4339 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); 4339 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet);
4340 CheckBytecodeArrayEqual(snippets[i], bytecode_array); 4340 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
4341 } 4341 }
4342 } 4342 }
4343 4343
4344 4344
4345 TEST(TryFinally) { 4345 TEST(TryFinally) {
4346 InitializedHandleScope handle_scope; 4346 InitializedHandleScope handle_scope;
4347 BytecodeGeneratorHelper helper; 4347 BytecodeGeneratorHelper helper;
4348 4348
4349 int closure = Register::function_closure().index(); 4349 int closure = Register::function_closure().index();
4350 int context = Register::function_context().index();
4351 4350
4352 ExpectedSnippet<const char*> snippets[] = { 4351 ExpectedSnippet<const char*> snippets[] = {
4353 {"var a = 1; try { a = 2; } finally { a = 3; }", 4352 {"var a = 1; try { a = 2; } finally { a = 3; }",
4354 4 * kPointerSize, 4353 4 * kPointerSize,
4355 1, 4354 1,
4356 35, 4355 35,
4357 { 4356 {
4358 B(LdaSmi8), U8(1), // 4357 B(LdaSmi8), U8(1), //
4359 B(Star), R(0), // 4358 B(Star), R(0), //
4360 B(LdaSmi8), U8(2), // 4359 B(LdaSmi8), U8(2), //
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
4392 B(Jump), U8(25), // 4391 B(Jump), U8(25), //
4393 B(Star), R(7), // 4392 B(Star), R(7), //
4394 B(LdaConstant), U8(0), // 4393 B(LdaConstant), U8(0), //
4395 B(Star), R(6), // 4394 B(Star), R(6), //
4396 B(Ldar), R(closure), // 4395 B(Ldar), R(closure), //
4397 B(Star), R(8), // 4396 B(Star), R(8), //
4398 B(CallRuntime), U16(Runtime::kPushCatchContext), R(6), U8(3), // 4397 B(CallRuntime), U16(Runtime::kPushCatchContext), R(6), U8(3), //
4399 B(PushContext), R(1), // 4398 B(PushContext), R(1), //
4400 B(LdaSmi8), U8(20), // 4399 B(LdaSmi8), U8(20), //
4401 B(Star), R(0), // 4400 B(Star), R(0), //
4402 B(PopContext), R(context), // 4401 B(PopContext), R(1), //
4403 B(LdaSmi8), U8(-1), // 4402 B(LdaSmi8), U8(-1), //
4404 B(Star), R(2), // 4403 B(Star), R(2), //
4405 B(Jump), U8(7), // 4404 B(Jump), U8(7), //
4406 B(Star), R(3), // 4405 B(Star), R(3), //
4407 B(LdaZero), // 4406 B(LdaZero), //
4408 B(Star), R(2), // 4407 B(Star), R(2), //
4409 B(LdaSmi8), U8(3), // 4408 B(LdaSmi8), U8(3), //
4410 B(Star), R(0), // 4409 B(Star), R(0), //
4411 B(LdaZero), // 4410 B(LdaZero), //
4412 B(TestEqualStrict), R(2), // 4411 B(TestEqualStrict), R(2), //
(...skipping 20 matching lines...) Expand all
4433 B(Jump), U8(25), // 4432 B(Jump), U8(25), //
4434 B(Star), R(8), // 4433 B(Star), R(8), //
4435 B(LdaConstant), U8(0), // 4434 B(LdaConstant), U8(0), //
4436 B(Star), R(7), // 4435 B(Star), R(7), //
4437 B(Ldar), R(closure), // 4436 B(Ldar), R(closure), //
4438 B(Star), R(9), // 4437 B(Star), R(9), //
4439 B(CallRuntime), U16(Runtime::kPushCatchContext), R(7), U8(3), // 4438 B(CallRuntime), U16(Runtime::kPushCatchContext), R(7), U8(3), //
4440 B(PushContext), R(1), // 4439 B(PushContext), R(1), //
4441 B(LdaSmi8), U8(2), // 4440 B(LdaSmi8), U8(2), //
4442 B(Star), R(0), // 4441 B(Star), R(0), //
4443 B(PopContext), R(context), // 4442 B(PopContext), R(1), //
4444 B(Jump), U8(25), // 4443 B(Jump), U8(25), //
4445 B(Star), R(7), // 4444 B(Star), R(7), //
4446 B(LdaConstant), U8(0), // 4445 B(LdaConstant), U8(0), //
4447 B(Star), R(6), // 4446 B(Star), R(6), //
4448 B(Ldar), R(closure), // 4447 B(Ldar), R(closure), //
4449 B(Star), R(8), // 4448 B(Star), R(8), //
4450 B(CallRuntime), U16(Runtime::kPushCatchContext), R(6), U8(3), // 4449 B(CallRuntime), U16(Runtime::kPushCatchContext), R(6), U8(3), //
4451 B(PushContext), R(1), // 4450 B(PushContext), R(1), //
4452 B(LdaSmi8), U8(20), // 4451 B(LdaSmi8), U8(20), //
4453 B(Star), R(0), // 4452 B(Star), R(0), //
4454 B(PopContext), R(context), // 4453 B(PopContext), R(1), //
4455 B(LdaSmi8), U8(-1), // 4454 B(LdaSmi8), U8(-1), //
4456 B(Star), R(2), // 4455 B(Star), R(2), //
4457 B(Jump), U8(7), // 4456 B(Jump), U8(7), //
4458 B(Star), R(3), // 4457 B(Star), R(3), //
4459 B(LdaZero), // 4458 B(LdaZero), //
4460 B(Star), R(2), // 4459 B(Star), R(2), //
4461 B(LdaSmi8), U8(3), // 4460 B(LdaSmi8), U8(3), //
4462 B(Star), R(0), // 4461 B(Star), R(0), //
4463 B(LdaZero), // 4462 B(LdaZero), //
4464 B(TestEqualStrict), R(2), // 4463 B(TestEqualStrict), R(2), //
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
4616 BytecodeGeneratorHelper helper; 4615 BytecodeGeneratorHelper helper;
4617 Zone zone; 4616 Zone zone;
4618 4617
4619 FeedbackVectorSpec feedback_spec(&zone); 4618 FeedbackVectorSpec feedback_spec(&zone);
4620 FeedbackVectorSlot slot = feedback_spec.AddCallICSlot(); 4619 FeedbackVectorSlot slot = feedback_spec.AddCallICSlot();
4621 4620
4622 Handle<i::TypeFeedbackVector> vector = 4621 Handle<i::TypeFeedbackVector> vector =
4623 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec); 4622 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec);
4624 4623
4625 int closure = Register::function_closure().index(); 4624 int closure = Register::function_closure().index();
4626 int context = Register::function_context().index(); 4625 int context = Register::current_context().index();
4627 int new_target = Register::new_target().index(); 4626 int new_target = Register::new_target().index();
4628 int first_context_slot = Context::MIN_CONTEXT_SLOTS; 4627 int first_context_slot = Context::MIN_CONTEXT_SLOTS;
4629 4628
4630 // The wide check below relies on MIN_CONTEXT_SLOTS + 3 + 249 == 256, if this 4629 // The wide check below relies on MIN_CONTEXT_SLOTS + 3 + 249 == 256, if this
4631 // ever changes, the REPEAT_XXX should be changed to output the correct number 4630 // ever changes, the REPEAT_XXX should be changed to output the correct number
4632 // of unique variables to trigger the wide slot load / store. 4631 // of unique variables to trigger the wide slot load / store.
4633 STATIC_ASSERT(Context::MIN_CONTEXT_SLOTS + 3 + 249 == 256); 4632 STATIC_ASSERT(Context::MIN_CONTEXT_SLOTS + 3 + 249 == 256);
4634 int wide_slot = first_context_slot + 3; 4633 int wide_slot = first_context_slot + 3;
4635 4634
4636 ExpectedSnippet<InstanceType> snippets[] = { 4635 ExpectedSnippet<InstanceType> snippets[] = {
4637 {"var a; return function() { a = 1; };", 4636 {"var a; return function() { a = 1; };",
4638 1 * kPointerSize, 4637 1 * kPointerSize,
4639 1, 4638 1,
4640 11, 4639 11,
4641 { 4640 {
4642 B(CallRuntime), U16(Runtime::kNewFunctionContext), // 4641 B(CallRuntime), U16(Runtime::kNewFunctionContext), //
4643 R(closure), U8(1), // 4642 R(closure), U8(1), //
4644 B(PushContext), R(0), // 4643 B(PushContext), R(0), //
4645 B(CreateClosure), U8(0), U8(0), // 4644 B(CreateClosure), U8(0), U8(0), //
4646 B(Return), // 4645 B(Return), //
4647 }, 4646 },
4648 1, 4647 1,
4649 {InstanceType::SHARED_FUNCTION_INFO_TYPE}}, 4648 {InstanceType::SHARED_FUNCTION_INFO_TYPE}},
4650 {"var a = 1; return function() { a = 2; };", 4649 {"var a = 1; return function() { a = 2; };",
4651 1 * kPointerSize, 4650 1 * kPointerSize,
4652 1, 4651 1,
4653 16, 4652 16,
4654 { 4653 {
4655 B(CallRuntime), U16(Runtime::kNewFunctionContext), // 4654 B(CallRuntime), U16(Runtime::kNewFunctionContext), //
4656 R(closure), U8(1), // 4655 R(closure), U8(1), //
4657 B(PushContext), R(0), // 4656 B(PushContext), R(0), //
4658 B(LdaSmi8), U8(1), // 4657 B(LdaSmi8), U8(1), //
4659 B(StaContextSlot), R(0), U8(first_context_slot), // 4658 B(StaContextSlot), R(context), U8(first_context_slot), //
4660 B(CreateClosure), U8(0), U8(0), // 4659 B(CreateClosure), U8(0), U8(0), //
4661 B(Return), // 4660 B(Return), //
4662 }, 4661 },
4663 1, 4662 1,
4664 {InstanceType::SHARED_FUNCTION_INFO_TYPE}}, 4663 {InstanceType::SHARED_FUNCTION_INFO_TYPE}},
4665 {"var a = 1; var b = 2; return function() { a = 2; b = 3 };", 4664 {"var a = 1; var b = 2; return function() { a = 2; b = 3 };",
4666 1 * kPointerSize, 4665 1 * kPointerSize,
4667 1, 4666 1,
4668 21, 4667 21,
4669 { 4668 {
4670 B(CallRuntime), U16(Runtime::kNewFunctionContext), // 4669 B(CallRuntime), U16(Runtime::kNewFunctionContext), //
4671 R(closure), U8(1), // 4670 R(closure), U8(1), //
4672 B(PushContext), R(0), // 4671 B(PushContext), R(0), //
4673 B(LdaSmi8), U8(1), // 4672 B(LdaSmi8), U8(1), //
4674 B(StaContextSlot), R(0), U8(first_context_slot), // 4673 B(StaContextSlot), R(context), U8(first_context_slot), //
4675 B(LdaSmi8), U8(2), // 4674 B(LdaSmi8), U8(2), //
4676 B(StaContextSlot), R(0), U8(first_context_slot + 1), // 4675 B(StaContextSlot), R(context), U8(first_context_slot + 1), //
4677 B(CreateClosure), U8(0), U8(0), // 4676 B(CreateClosure), U8(0), U8(0), //
4678 B(Return), // 4677 B(Return), //
4679 }, 4678 },
4680 1, 4679 1,
4681 {InstanceType::SHARED_FUNCTION_INFO_TYPE}}, 4680 {InstanceType::SHARED_FUNCTION_INFO_TYPE}},
4682 {"var a; (function() { a = 2; })(); return a;", 4681 {"var a; (function() { a = 2; })(); return a;",
4683 3 * kPointerSize, 4682 3 * kPointerSize,
4684 1, 4683 1,
4685 24, 4684 24,
4686 { 4685 {
4687 B(CallRuntime), U16(Runtime::kNewFunctionContext), // 4686 B(CallRuntime), U16(Runtime::kNewFunctionContext), //
4688 R(closure), U8(1), // 4687 R(closure), U8(1), //
4689 B(PushContext), R(0), // 4688 B(PushContext), R(0), //
4690 B(LdaUndefined), // 4689 B(LdaUndefined), //
4691 B(Star), R(2), // 4690 B(Star), R(2), //
4692 B(CreateClosure), U8(0), U8(0), // 4691 B(CreateClosure), U8(0), U8(0), //
4693 B(Star), R(1), // 4692 B(Star), R(1), //
4694 B(Call), R(1), R(2), U8(0), U8(vector->GetIndex(slot)), // 4693 B(Call), R(1), R(2), U8(0), U8(vector->GetIndex(slot)), //
4695 B(LdaContextSlot), R(0), U8(first_context_slot), // 4694 B(LdaContextSlot), R(context), U8(first_context_slot), //
4696 B(Return), // 4695 B(Return), //
4697 }, 4696 },
4698 1, 4697 1,
4699 {InstanceType::SHARED_FUNCTION_INFO_TYPE}}, 4698 {InstanceType::SHARED_FUNCTION_INFO_TYPE}},
4700 {"'use strict'; let a = 1; { let b = 2; return function() { a + b; }; }", 4699 {"'use strict'; let a = 1; { let b = 2; return function() { a + b; }; }",
4701 4 * kPointerSize, 4700 4 * kPointerSize,
4702 1, 4701 1,
4703 46, 4702 46,
4704 { 4703 {
4705 B(CallRuntime), U16(Runtime::kNewFunctionContext), // 4704 B(CallRuntime), U16(Runtime::kNewFunctionContext), //
4706 R(closure), U8(1), // 4705 R(closure), U8(1), //
4707 B(PushContext), R(0), // 4706 B(PushContext), R(0), //
4708 B(LdaTheHole), // 4707 B(LdaTheHole), //
4709 B(StaContextSlot), R(0), U8(first_context_slot), // 4708 B(StaContextSlot), R(context), U8(first_context_slot), //
4710 B(LdaSmi8), U8(1), // 4709 B(LdaSmi8), U8(1), //
4711 B(StaContextSlot), R(0), U8(first_context_slot), // 4710 B(StaContextSlot), R(context), U8(first_context_slot), //
4712 B(LdaConstant), U8(0), // 4711 B(LdaConstant), U8(0), //
4713 B(Star), R(2), // 4712 B(Star), R(2), //
4714 B(Ldar), R(closure), // 4713 B(Ldar), R(closure), //
4715 B(Star), R(3), // 4714 B(Star), R(3), //
4716 B(CallRuntime), U16(Runtime::kPushBlockContext), R(2), U8(2), // 4715 B(CallRuntime), U16(Runtime::kPushBlockContext), R(2), U8(2), //
4717 B(PushContext), R(1), // 4716 B(PushContext), R(1), //
4718 B(LdaTheHole), // 4717 B(LdaTheHole), //
4719 B(StaContextSlot), R(1), U8(first_context_slot), // 4718 B(StaContextSlot), R(context), U8(first_context_slot), //
4720 B(LdaSmi8), U8(2), // 4719 B(LdaSmi8), U8(2), //
4721 B(StaContextSlot), R(1), U8(first_context_slot), // 4720 B(StaContextSlot), R(context), U8(first_context_slot), //
4722 B(CreateClosure), U8(1), U8(0), // 4721 B(CreateClosure), U8(1), U8(0), //
4723 B(PopContext), R(context), // 4722 B(PopContext), R(0), //
4724 B(Return), // 4723 B(Return), //
4725 }, 4724 },
4726 2, 4725 2,
4727 {InstanceType::FIXED_ARRAY_TYPE, 4726 {InstanceType::FIXED_ARRAY_TYPE,
4728 InstanceType::SHARED_FUNCTION_INFO_TYPE}}, 4727 InstanceType::SHARED_FUNCTION_INFO_TYPE}},
4729 {"'use strict';\n" 4728 {"'use strict';\n"
4730 REPEAT_249_UNIQUE_VARS() 4729 REPEAT_249_UNIQUE_VARS()
4731 "eval();" 4730 "eval();"
4732 "var b = 100;" 4731 "var b = 100;"
4733 "return b", 4732 "return b",
4734 3 * kPointerSize, 4733 3 * kPointerSize,
4735 1, 4734 1,
4736 1041, 4735 1041,
4737 { 4736 {
4738 B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), // 4737 B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), //
4739 U8(1), // 4738 U8(1), //
4740 B(PushContext), R(0), // 4739 B(PushContext), R(0), //
4741 B(Ldar), THIS(1), // 4740 B(Ldar), THIS(1), //
4742 B(StaContextSlot), R(0), U8(first_context_slot), // 4741 B(StaContextSlot), R(context), U8(first_context_slot), //
4743 B(CreateUnmappedArguments), // 4742 B(CreateUnmappedArguments), //
4744 B(StaContextSlot), R(0), U8(first_context_slot + 1), // 4743 B(StaContextSlot), R(context), U8(first_context_slot + 1), //
4745 B(Ldar), R(new_target), // 4744 B(Ldar), R(new_target), //
4746 B(StaContextSlot), R(0), U8(first_context_slot + 2), // 4745 B(StaContextSlot), R(context), U8(first_context_slot + 2), //
4747 REPEAT_249(COMMA, // 4746 REPEAT_249(COMMA, //
4748 B(LdaZero), // 4747 B(LdaZero), //
4749 B(StaContextSlot), R(0), U8(wide_slot++)), // 4748 B(StaContextSlot), R(context), U8(wide_slot++)), //
4750 B(LdaUndefined), // 4749 B(LdaUndefined), //
4751 B(Star), R(2), // 4750 B(Star), R(2), //
4752 B(LdaGlobalStrict), U8(0), U8(1), // 4751 B(LdaGlobalStrict), U8(0), U8(1), //
4753 B(Star), R(1), // 4752 B(Star), R(1), //
4754 B(Call), R(1), R(2), U8(0), U8(0), // 4753 B(Call), R(1), R(2), U8(0), U8(0), //
4755 B(LdaSmi8), U8(100), // 4754 B(LdaSmi8), U8(100), //
4756 B(StaContextSlotWide), R(0), U16(256), // 4755 B(StaContextSlotWide), R(context), U16(256), //
4757 B(LdaContextSlotWide), R(0), U16(256), // 4756 B(LdaContextSlotWide), R(context), U16(256), //
4758 B(Return), // 4757 B(Return), //
4759 }, 4758 },
4760 1, 4759 1,
4761 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, 4760 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}},
4762 }; 4761 };
4763 4762
4764 for (size_t i = 0; i < arraysize(snippets); i++) { 4763 for (size_t i = 0; i < arraysize(snippets); i++) {
4765 Handle<BytecodeArray> bytecode_array = 4764 Handle<BytecodeArray> bytecode_array =
4766 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); 4765 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet);
4767 CheckBytecodeArrayEqual(snippets[i], bytecode_array); 4766 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
4768 } 4767 }
4769 } 4768 }
4770 4769
4771 4770
4772 TEST(ContextParameters) { 4771 TEST(ContextParameters) {
4773 InitializedHandleScope handle_scope; 4772 InitializedHandleScope handle_scope;
4774 BytecodeGeneratorHelper helper; 4773 BytecodeGeneratorHelper helper;
4775 4774
4776 int closure = Register::function_closure().index(); 4775 int closure = Register::function_closure().index();
4776 int context = Register::current_context().index();
4777 int first_context_slot = Context::MIN_CONTEXT_SLOTS; 4777 int first_context_slot = Context::MIN_CONTEXT_SLOTS;
4778 4778
4779 ExpectedSnippet<InstanceType> snippets[] = { 4779 ExpectedSnippet<InstanceType> snippets[] = {
4780 {"function f(arg1) { return function() { arg1 = 2; }; }", 4780 {"function f(arg1) { return function() { arg1 = 2; }; }",
4781 1 * kPointerSize, 4781 1 * kPointerSize,
4782 2, 4782 2,
4783 16, 4783 16,
4784 { 4784 {
4785 B(CallRuntime), U16(Runtime::kNewFunctionContext), // 4785 B(CallRuntime), U16(Runtime::kNewFunctionContext), //
4786 R(closure), U8(1), // 4786 R(closure), U8(1), //
4787 B(PushContext), R(0), // 4787 B(PushContext), R(0), //
4788 B(Ldar), R(helper.kLastParamIndex), // 4788 B(Ldar), R(helper.kLastParamIndex), //
4789 B(StaContextSlot), R(0), U8(first_context_slot), // 4789 B(StaContextSlot), R(context), U8(first_context_slot), //
4790 B(CreateClosure), U8(0), U8(0), // 4790 B(CreateClosure), U8(0), U8(0), //
4791 B(Return), // 4791 B(Return), //
4792 }, 4792 },
4793 1, 4793 1,
4794 {InstanceType::SHARED_FUNCTION_INFO_TYPE}}, 4794 {InstanceType::SHARED_FUNCTION_INFO_TYPE}},
4795 {"function f(arg1) { var a = function() { arg1 = 2; }; return arg1; }", 4795 {"function f(arg1) { var a = function() { arg1 = 2; }; return arg1; }",
4796 2 * kPointerSize, 4796 2 * kPointerSize,
4797 2, 4797 2,
4798 21, 4798 21,
4799 { 4799 {
4800 B(CallRuntime), U16(Runtime::kNewFunctionContext), // 4800 B(CallRuntime), U16(Runtime::kNewFunctionContext), //
4801 R(closure), U8(1), // 4801 R(closure), U8(1), //
4802 B(PushContext), R(1), // 4802 B(PushContext), R(1), //
4803 B(Ldar), R(helper.kLastParamIndex), // 4803 B(Ldar), R(helper.kLastParamIndex), //
4804 B(StaContextSlot), R(1), U8(first_context_slot), // 4804 B(StaContextSlot), R(context), U8(first_context_slot), //
4805 B(CreateClosure), U8(0), U8(0), // 4805 B(CreateClosure), U8(0), U8(0), //
4806 B(Star), R(0), // 4806 B(Star), R(0), //
4807 B(LdaContextSlot), R(1), U8(first_context_slot), // 4807 B(LdaContextSlot), R(context), U8(first_context_slot), //
4808 B(Return), // 4808 B(Return), //
4809 }, 4809 },
4810 1, 4810 1,
4811 {InstanceType::SHARED_FUNCTION_INFO_TYPE}}, 4811 {InstanceType::SHARED_FUNCTION_INFO_TYPE}},
4812 {"function f(a1, a2, a3, a4) { return function() { a1 = a3; }; }", 4812 {"function f(a1, a2, a3, a4) { return function() { a1 = a3; }; }",
4813 1 * kPointerSize, 4813 1 * kPointerSize,
4814 5, 4814 5,
4815 21, 4815 21,
4816 { 4816 {
4817 B(CallRuntime), U16(Runtime::kNewFunctionContext), // 4817 B(CallRuntime), U16(Runtime::kNewFunctionContext), //
4818 R(closure), U8(1), // 4818 R(closure), U8(1), //
4819 B(PushContext), R(0), // 4819 B(PushContext), R(0), //
4820 B(Ldar), R(helper.kLastParamIndex - 3), // 4820 B(Ldar), R(helper.kLastParamIndex - 3), //
4821 B(StaContextSlot), R(0), U8(first_context_slot + 1), // 4821 B(StaContextSlot), R(context), U8(first_context_slot + 1), //
4822 B(Ldar), R(helper.kLastParamIndex -1), // 4822 B(Ldar), R(helper.kLastParamIndex -1), //
4823 B(StaContextSlot), R(0), U8(first_context_slot), // 4823 B(StaContextSlot), R(context), U8(first_context_slot), //
4824 B(CreateClosure), U8(0), U8(0), // 4824 B(CreateClosure), U8(0), U8(0), //
4825 B(Return), // 4825 B(Return), //
4826 }, 4826 },
4827 1, 4827 1,
4828 {InstanceType::SHARED_FUNCTION_INFO_TYPE}}, 4828 {InstanceType::SHARED_FUNCTION_INFO_TYPE}},
4829 {"function f() { var self = this; return function() { self = 2; }; }", 4829 {"function f() { var self = this; return function() { self = 2; }; }",
4830 1 * kPointerSize, 4830 1 * kPointerSize,
4831 1, 4831 1,
4832 16, 4832 16,
4833 { 4833 {
4834 B(CallRuntime), U16(Runtime::kNewFunctionContext), // 4834 B(CallRuntime), U16(Runtime::kNewFunctionContext), //
4835 R(closure), U8(1), // 4835 R(closure), U8(1), //
4836 B(PushContext), R(0), // 4836 B(PushContext), R(0), //
4837 B(Ldar), R(helper.kLastParamIndex), // 4837 B(Ldar), R(helper.kLastParamIndex), //
4838 B(StaContextSlot), R(0), U8(first_context_slot), // 4838 B(StaContextSlot), R(context), U8(first_context_slot), //
4839 B(CreateClosure), U8(0), U8(0), // 4839 B(CreateClosure), U8(0), U8(0), //
4840 B(Return), // 4840 B(Return), //
4841 }, 4841 },
4842 1, 4842 1,
4843 {InstanceType::SHARED_FUNCTION_INFO_TYPE}}, 4843 {InstanceType::SHARED_FUNCTION_INFO_TYPE}},
4844 }; 4844 };
4845 4845
4846 for (size_t i = 0; i < arraysize(snippets); i++) { 4846 for (size_t i = 0; i < arraysize(snippets); i++) {
4847 Handle<BytecodeArray> bytecode_array = 4847 Handle<BytecodeArray> bytecode_array =
4848 helper.MakeBytecodeForFunction(snippets[i].code_snippet); 4848 helper.MakeBytecodeForFunction(snippets[i].code_snippet);
4849 CheckBytecodeArrayEqual(snippets[i], bytecode_array); 4849 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
4850 } 4850 }
4851 } 4851 }
4852 4852
4853 4853
4854 TEST(OuterContextVariables) { 4854 TEST(OuterContextVariables) {
4855 InitializedHandleScope handle_scope; 4855 InitializedHandleScope handle_scope;
4856 BytecodeGeneratorHelper helper; 4856 BytecodeGeneratorHelper helper;
4857 4857
4858 int context = Register::function_context().index(); 4858 int context = Register::current_context().index();
4859 int first_context_slot = Context::MIN_CONTEXT_SLOTS; 4859 int first_context_slot = Context::MIN_CONTEXT_SLOTS;
4860 4860
4861 ExpectedSnippet<InstanceType> snippets[] = { 4861 ExpectedSnippet<InstanceType> snippets[] = {
4862 {"function Outer() {" 4862 {"function Outer() {"
4863 " var outerVar = 1;" 4863 " var outerVar = 1;"
4864 " function Inner(innerArg) {" 4864 " function Inner(innerArg) {"
4865 " this.innerFunc = function() { return outerVar * innerArg; }" 4865 " this.innerFunc = function() { return outerVar * innerArg; }"
4866 " }" 4866 " }"
4867 " this.getInnerFunc = function() { return new Inner(1).innerFunc; }" 4867 " this.getInnerFunc = function() { return new Inner(1).innerFunc; }"
4868 "}" 4868 "}"
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
4924 FeedbackVectorSlot slot2 = feedback_spec.AddStoreICSlot(); 4924 FeedbackVectorSlot slot2 = feedback_spec.AddStoreICSlot();
4925 Handle<i::TypeFeedbackVector> vector = 4925 Handle<i::TypeFeedbackVector> vector =
4926 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec); 4926 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec);
4927 4927
4928 FeedbackVectorSpec store_feedback_spec(&zone); 4928 FeedbackVectorSpec store_feedback_spec(&zone);
4929 FeedbackVectorSlot store_slot = store_feedback_spec.AddStoreICSlot(); 4929 FeedbackVectorSlot store_slot = store_feedback_spec.AddStoreICSlot();
4930 Handle<i::TypeFeedbackVector> store_vector = 4930 Handle<i::TypeFeedbackVector> store_vector =
4931 i::NewTypeFeedbackVector(helper.isolate(), &store_feedback_spec); 4931 i::NewTypeFeedbackVector(helper.isolate(), &store_feedback_spec);
4932 4932
4933 int closure = Register::function_closure().index(); 4933 int closure = Register::function_closure().index();
4934 int context = Register::current_context().index();
4934 int first_context_slot = Context::MIN_CONTEXT_SLOTS; 4935 int first_context_slot = Context::MIN_CONTEXT_SLOTS;
4935 4936
4936 int object_literal_flags = 4937 int object_literal_flags =
4937 ObjectLiteral::kFastElements | ObjectLiteral::kDisableMementos; 4938 ObjectLiteral::kFastElements | ObjectLiteral::kDisableMementos;
4938 int array_literal_flags = 4939 int array_literal_flags =
4939 ArrayLiteral::kDisableMementos | ArrayLiteral::kShallowElements; 4940 ArrayLiteral::kDisableMementos | ArrayLiteral::kShallowElements;
4940 4941
4941 ExpectedSnippet<InstanceType> snippets[] = { 4942 ExpectedSnippet<InstanceType> snippets[] = {
4942 {"var a = 1; return ++a;", 4943 {"var a = 1; return ++a;",
4943 1 * kPointerSize, 4944 1 * kPointerSize,
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
5077 InstanceType::FIXED_ARRAY_TYPE}}, 5078 InstanceType::FIXED_ARRAY_TYPE}},
5078 {"var a = 1; var b = function() { return a }; return ++a;", 5079 {"var a = 1; var b = function() { return a }; return ++a;",
5079 2 * kPointerSize, 5080 2 * kPointerSize,
5080 1, 5081 1,
5081 26, 5082 26,
5082 { 5083 {
5083 B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), // 5084 B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), //
5084 U8(1), // 5085 U8(1), //
5085 B(PushContext), R(1), // 5086 B(PushContext), R(1), //
5086 B(LdaSmi8), U8(1), // 5087 B(LdaSmi8), U8(1), //
5087 B(StaContextSlot), R(1), U8(first_context_slot), // 5088 B(StaContextSlot), R(context), U8(first_context_slot), //
5088 B(CreateClosure), U8(0), U8(0), // 5089 B(CreateClosure), U8(0), U8(0), //
5089 B(Star), R(0), // 5090 B(Star), R(0), //
5090 B(LdaContextSlot), R(1), U8(first_context_slot), // 5091 B(LdaContextSlot), R(context), U8(first_context_slot), //
5091 B(ToNumber), // 5092 B(ToNumber), //
5092 B(Inc), // 5093 B(Inc), //
5093 B(StaContextSlot), R(1), U8(first_context_slot), // 5094 B(StaContextSlot), R(context), U8(first_context_slot), //
5094 B(Return), // 5095 B(Return), //
5095 }, 5096 },
5096 1, 5097 1,
5097 {InstanceType::SHARED_FUNCTION_INFO_TYPE}}, 5098 {InstanceType::SHARED_FUNCTION_INFO_TYPE}},
5098 {"var a = 1; var b = function() { return a }; return a--;", 5099 {"var a = 1; var b = function() { return a }; return a--;",
5099 3 * kPointerSize, 5100 3 * kPointerSize,
5100 1, 5101 1,
5101 30, 5102 30,
5102 { 5103 {
5103 B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), // 5104 B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), //
5104 U8(1), // 5105 U8(1), //
5105 B(PushContext), R(1), // 5106 B(PushContext), R(1), //
5106 B(LdaSmi8), U8(1), // 5107 B(LdaSmi8), U8(1), //
5107 B(StaContextSlot), R(1), U8(first_context_slot), // 5108 B(StaContextSlot), R(context), U8(first_context_slot), //
5108 B(CreateClosure), U8(0), U8(0), // 5109 B(CreateClosure), U8(0), U8(0), //
5109 B(Star), R(0), // 5110 B(Star), R(0), //
5110 B(LdaContextSlot), R(1), U8(first_context_slot), // 5111 B(LdaContextSlot), R(context), U8(first_context_slot), //
5111 B(ToNumber), // 5112 B(ToNumber), //
5112 B(Star), R(2), // 5113 B(Star), R(2), //
5113 B(Dec), // 5114 B(Dec), //
5114 B(StaContextSlot), R(1), U8(first_context_slot), // 5115 B(StaContextSlot), R(context), U8(first_context_slot), //
5115 B(Ldar), R(2), // 5116 B(Ldar), R(2), //
5116 B(Return), // 5117 B(Return), //
5117 }, 5118 },
5118 1, 5119 1,
5119 {InstanceType::SHARED_FUNCTION_INFO_TYPE}}, 5120 {InstanceType::SHARED_FUNCTION_INFO_TYPE}},
5120 {"var idx = 1; var a = [1, 2]; return a[idx++] = 2;", 5121 {"var idx = 1; var a = [1, 2]; return a[idx++] = 2;",
5121 4 * kPointerSize, 5122 4 * kPointerSize,
5122 1, 5123 1,
5123 27, 5124 27,
5124 { 5125 {
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
5228 } 5229 }
5229 } 5230 }
5230 5231
5231 5232
5232 TEST(CompoundExpressions) { 5233 TEST(CompoundExpressions) {
5233 InitializedHandleScope handle_scope; 5234 InitializedHandleScope handle_scope;
5234 BytecodeGeneratorHelper helper; 5235 BytecodeGeneratorHelper helper;
5235 Zone zone; 5236 Zone zone;
5236 5237
5237 int closure = Register::function_closure().index(); 5238 int closure = Register::function_closure().index();
5239 int context = Register::current_context().index();
5238 int first_context_slot = Context::MIN_CONTEXT_SLOTS; 5240 int first_context_slot = Context::MIN_CONTEXT_SLOTS;
5239 5241
5240 FeedbackVectorSpec feedback_spec(&zone); 5242 FeedbackVectorSpec feedback_spec(&zone);
5241 FeedbackVectorSlot slot1 = feedback_spec.AddLoadICSlot(); 5243 FeedbackVectorSlot slot1 = feedback_spec.AddLoadICSlot();
5242 FeedbackVectorSlot slot2 = feedback_spec.AddStoreICSlot(); 5244 FeedbackVectorSlot slot2 = feedback_spec.AddStoreICSlot();
5243 5245
5244 Handle<i::TypeFeedbackVector> vector = 5246 Handle<i::TypeFeedbackVector> vector =
5245 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec); 5247 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec);
5246 5248
5247 int object_literal_flags = 5249 int object_literal_flags =
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
5318 {InstanceType::FIXED_ARRAY_TYPE}}, 5320 {InstanceType::FIXED_ARRAY_TYPE}},
5319 {"var a = 1; (function f() { return a; }); a |= 24;", 5321 {"var a = 1; (function f() { return a; }); a |= 24;",
5320 2 * kPointerSize, 5322 2 * kPointerSize,
5321 1, 5323 1,
5322 29, 5324 29,
5323 { 5325 {
5324 B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), // 5326 B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), //
5325 U8(1), // 5327 U8(1), //
5326 B(PushContext), R(0), // 5328 B(PushContext), R(0), //
5327 B(LdaSmi8), U8(1), // 5329 B(LdaSmi8), U8(1), //
5328 B(StaContextSlot), R(0), U8(first_context_slot), // 5330 B(StaContextSlot), R(context), U8(first_context_slot), //
5329 B(CreateClosure), U8(0), U8(0), // 5331 B(CreateClosure), U8(0), U8(0), //
5330 B(LdaContextSlot), R(0), U8(first_context_slot), // 5332 B(LdaContextSlot), R(context), U8(first_context_slot), //
5331 B(Star), R(1), // 5333 B(Star), R(1), //
5332 B(LdaSmi8), U8(24), // 5334 B(LdaSmi8), U8(24), //
5333 B(BitwiseOr), R(1), // 5335 B(BitwiseOr), R(1), //
5334 B(StaContextSlot), R(0), U8(first_context_slot), // 5336 B(StaContextSlot), R(context), U8(first_context_slot), //
5335 B(LdaUndefined), // 5337 B(LdaUndefined), //
5336 B(Return), // 5338 B(Return), //
5337 }, 5339 },
5338 1, 5340 1,
5339 {InstanceType::SHARED_FUNCTION_INFO_TYPE}}, 5341 {InstanceType::SHARED_FUNCTION_INFO_TYPE}},
5340 }; 5342 };
5341 5343
5342 for (size_t i = 0; i < arraysize(snippets); i++) { 5344 for (size_t i = 0; i < arraysize(snippets); i++) {
5343 Handle<BytecodeArray> bytecode_array = 5345 Handle<BytecodeArray> bytecode_array =
5344 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); 5346 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet);
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
5397 } 5399 }
5398 } 5400 }
5399 5401
5400 5402
5401 TEST(CreateArguments) { 5403 TEST(CreateArguments) {
5402 InitializedHandleScope handle_scope; 5404 InitializedHandleScope handle_scope;
5403 BytecodeGeneratorHelper helper; 5405 BytecodeGeneratorHelper helper;
5404 Zone zone; 5406 Zone zone;
5405 5407
5406 int closure = Register::function_closure().index(); 5408 int closure = Register::function_closure().index();
5409 int context = Register::current_context().index();
5407 int first_context_slot = Context::MIN_CONTEXT_SLOTS; 5410 int first_context_slot = Context::MIN_CONTEXT_SLOTS;
5408 5411
5409 FeedbackVectorSpec feedback_spec(&zone); 5412 FeedbackVectorSpec feedback_spec(&zone);
5410 FeedbackVectorSlot slot = feedback_spec.AddKeyedLoadICSlot(); 5413 FeedbackVectorSlot slot = feedback_spec.AddKeyedLoadICSlot();
5411 5414
5412 Handle<i::TypeFeedbackVector> vector = 5415 Handle<i::TypeFeedbackVector> vector =
5413 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec); 5416 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec);
5414 5417
5415 ExpectedSnippet<const char*> snippets[] = { 5418 ExpectedSnippet<const char*> snippets[] = {
5416 {"function f() { return arguments; }", 5419 {"function f() { return arguments; }",
(...skipping 28 matching lines...) Expand all
5445 }}, 5448 }},
5446 {"function f(a) { return arguments[0]; }", 5449 {"function f(a) { return arguments[0]; }",
5447 3 * kPointerSize, 5450 3 * kPointerSize,
5448 2, 5451 2,
5449 22, 5452 22,
5450 { 5453 {
5451 B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), // 5454 B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), //
5452 U8(1), // 5455 U8(1), //
5453 B(PushContext), R(1), // 5456 B(PushContext), R(1), //
5454 B(Ldar), R(BytecodeGeneratorHelper::kLastParamIndex), // 5457 B(Ldar), R(BytecodeGeneratorHelper::kLastParamIndex), //
5455 B(StaContextSlot), R(1), U8(first_context_slot), // 5458 B(StaContextSlot), R(context), U8(first_context_slot), //
5456 B(CreateMappedArguments), // 5459 B(CreateMappedArguments), //
5457 B(Star), R(0), // 5460 B(Star), R(0), //
5458 B(Star), R(2), // 5461 B(Star), R(2), //
5459 B(LdaZero), // 5462 B(LdaZero), //
5460 B(KeyedLoadICSloppy), R(2), U8(vector->GetIndex(slot)), // 5463 B(KeyedLoadICSloppy), R(2), U8(vector->GetIndex(slot)), //
5461 B(Return), // 5464 B(Return), //
5462 }}, 5465 }},
5463 {"function f(a, b, c) { return arguments; }", 5466 {"function f(a, b, c) { return arguments; }",
5464 2 * kPointerSize, 5467 2 * kPointerSize,
5465 4, 5468 4,
5466 26, 5469 26,
5467 { 5470 {
5468 B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), // 5471 B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), //
5469 U8(1), // 5472 U8(1), //
5470 B(PushContext), R(1), // 5473 B(PushContext), R(1), //
5471 B(Ldar), R(BytecodeGeneratorHelper::kLastParamIndex - 2), // 5474 B(Ldar), R(BytecodeGeneratorHelper::kLastParamIndex - 2), //
5472 B(StaContextSlot), R(1), U8(first_context_slot + 2), // 5475 B(StaContextSlot), R(context), U8(first_context_slot + 2), //
5473 B(Ldar), R(BytecodeGeneratorHelper::kLastParamIndex - 1), // 5476 B(Ldar), R(BytecodeGeneratorHelper::kLastParamIndex - 1), //
5474 B(StaContextSlot), R(1), U8(first_context_slot + 1), // 5477 B(StaContextSlot), R(context), U8(first_context_slot + 1), //
5475 B(Ldar), R(BytecodeGeneratorHelper::kLastParamIndex), // 5478 B(Ldar), R(BytecodeGeneratorHelper::kLastParamIndex), //
5476 B(StaContextSlot), R(1), U8(first_context_slot), // 5479 B(StaContextSlot), R(context), U8(first_context_slot), //
5477 B(CreateMappedArguments), // 5480 B(CreateMappedArguments), //
5478 B(Star), R(0), // 5481 B(Star), R(0), //
5479 B(Return), // 5482 B(Return), //
5480 }}, 5483 }},
5481 {"function f(a, b, c) { 'use strict'; return arguments; }", 5484 {"function f(a, b, c) { 'use strict'; return arguments; }",
5482 1 * kPointerSize, 5485 1 * kPointerSize,
5483 4, 5486 4,
5484 4, 5487 4,
5485 { 5488 {
5486 B(CreateUnmappedArguments), // 5489 B(CreateUnmappedArguments), //
(...skipping 1299 matching lines...) Expand 10 before | Expand all | Expand 10 after
6786 } 6789 }
6787 } 6790 }
6788 6791
6789 6792
6790 TEST(Eval) { 6793 TEST(Eval) {
6791 InitializedHandleScope handle_scope; 6794 InitializedHandleScope handle_scope;
6792 BytecodeGeneratorHelper helper; 6795 BytecodeGeneratorHelper helper;
6793 Zone zone; 6796 Zone zone;
6794 6797
6795 int closure = Register::function_closure().index(); 6798 int closure = Register::function_closure().index();
6799 int context = Register::current_context().index();
6796 int new_target = Register::new_target().index(); 6800 int new_target = Register::new_target().index();
6797 6801
6798 int first_context_slot = Context::MIN_CONTEXT_SLOTS; 6802 int first_context_slot = Context::MIN_CONTEXT_SLOTS;
6799 6803
6800 ExpectedSnippet<const char*> snippets[] = { 6804 ExpectedSnippet<const char*> snippets[] = {
6801 {"return eval('1;');", 6805 {"return eval('1;');",
6802 9 * kPointerSize, 6806 9 * kPointerSize,
6803 1, 6807 1,
6804 67, 6808 67,
6805 { 6809 {
6806 B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), // 6810 B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), //
6807 U8(1), // 6811 U8(1), //
6808 B(PushContext), R(0), // 6812 B(PushContext), R(0), //
6809 B(Ldar), THIS(1), // 6813 B(Ldar), THIS(1), //
6810 B(StaContextSlot), R(0), U8(first_context_slot), // 6814 B(StaContextSlot), R(context), U8(first_context_slot), //
6811 B(CreateMappedArguments), // 6815 B(CreateMappedArguments), //
6812 B(StaContextSlot), R(0), U8(first_context_slot + 1), // 6816 B(StaContextSlot), R(context), U8(first_context_slot + 1), //
6813 B(Ldar), R(new_target), // 6817 B(Ldar), R(new_target), //
6814 B(StaContextSlot), R(0), U8(first_context_slot + 2), // 6818 B(StaContextSlot), R(context), U8(first_context_slot + 2), //
6815 B(Mov), R(0), R(3), // 6819 B(Mov), R(context), R(3), //
6816 B(LdaConstant), U8(0), // 6820 B(LdaConstant), U8(0), //
6817 B(Star), R(4), // 6821 B(Star), R(4), //
6818 B(CallRuntimeForPair), U16(Runtime::kLoadLookupSlot), // 6822 B(CallRuntimeForPair), U16(Runtime::kLoadLookupSlot), //
6819 R(3), U8(2), R(1), // 6823 R(3), U8(2), R(1), //
6820 B(LdaConstant), U8(1), // 6824 B(LdaConstant), U8(1), //
6821 B(Star), R(3), // 6825 B(Star), R(3), //
6822 B(Mov), R(1), R(4), // 6826 B(Mov), R(1), R(4), //
6823 B(Mov), R(3), R(5), // 6827 B(Mov), R(3), R(5), //
6824 B(Mov), R(closure), R(6), // 6828 B(Mov), R(closure), R(6), //
6825 B(LdaZero), // 6829 B(LdaZero), //
(...skipping 16 matching lines...) Expand all
6842 CheckBytecodeArrayEqual(snippets[i], bytecode_array); 6846 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
6843 } 6847 }
6844 } 6848 }
6845 6849
6846 6850
6847 TEST(LookupSlot) { 6851 TEST(LookupSlot) {
6848 InitializedHandleScope handle_scope; 6852 InitializedHandleScope handle_scope;
6849 BytecodeGeneratorHelper helper; 6853 BytecodeGeneratorHelper helper;
6850 6854
6851 int closure = Register::function_closure().index(); 6855 int closure = Register::function_closure().index();
6856 int context = Register::current_context().index();
6852 int first_context_slot = Context::MIN_CONTEXT_SLOTS; 6857 int first_context_slot = Context::MIN_CONTEXT_SLOTS;
6853 int new_target = Register::new_target().index(); 6858 int new_target = Register::new_target().index();
6854 6859
6855 ExpectedSnippet<const char*> snippets[] = { 6860 ExpectedSnippet<const char*> snippets[] = {
6856 {"eval('var x = 10;'); return x;", 6861 {"eval('var x = 10;'); return x;",
6857 9 * kPointerSize, 6862 9 * kPointerSize,
6858 1, 6863 1,
6859 69, 6864 69,
6860 { 6865 {
6861 B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), // 6866 B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), //
6862 U8(1), // 6867 U8(1), //
6863 B(PushContext), R(0), // 6868 B(PushContext), R(0), //
6864 B(Ldar), THIS(1), // 6869 B(Ldar), THIS(1), //
6865 B(StaContextSlot), R(0), U8(first_context_slot), // 6870 B(StaContextSlot), R(context), U8(first_context_slot), //
6866 B(CreateMappedArguments), // 6871 B(CreateMappedArguments), //
6867 B(StaContextSlot), R(0), U8(first_context_slot + 1), // 6872 B(StaContextSlot), R(context), U8(first_context_slot + 1), //
6868 B(Ldar), R(new_target), // 6873 B(Ldar), R(new_target), //
6869 B(StaContextSlot), R(0), U8(first_context_slot + 2), // 6874 B(StaContextSlot), R(context), U8(first_context_slot + 2), //
6870 B(Mov), R(0), R(3), // 6875 B(Mov), R(context), R(3), //
6871 B(LdaConstant), U8(0), // 6876 B(LdaConstant), U8(0), //
6872 B(Star), R(4), // 6877 B(Star), R(4), //
6873 B(CallRuntimeForPair), U16(Runtime::kLoadLookupSlot), // 6878 B(CallRuntimeForPair), U16(Runtime::kLoadLookupSlot), //
6874 R(3), U8(2), R(1), // 6879 R(3), U8(2), R(1), //
6875 B(LdaConstant), U8(1), // 6880 B(LdaConstant), U8(1), //
6876 B(Star), R(3), // 6881 B(Star), R(3), //
6877 B(Mov), R(1), R(4), // 6882 B(Mov), R(1), R(4), //
6878 B(Mov), R(3), R(5), // 6883 B(Mov), R(3), R(5), //
6879 B(Mov), R(closure), R(6), // 6884 B(Mov), R(closure), R(6), //
6880 B(LdaZero), // 6885 B(LdaZero), //
(...skipping 11 matching lines...) Expand all
6892 {"eval", "var x = 10;", "x"}}, 6897 {"eval", "var x = 10;", "x"}},
6893 {"eval('var x = 10;'); return typeof x;", 6898 {"eval('var x = 10;'); return typeof x;",
6894 9 * kPointerSize, 6899 9 * kPointerSize,
6895 1, 6900 1,
6896 70, 6901 70,
6897 { 6902 {
6898 B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), // 6903 B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), //
6899 U8(1), // 6904 U8(1), //
6900 B(PushContext), R(0), // 6905 B(PushContext), R(0), //
6901 B(Ldar), THIS(1), // 6906 B(Ldar), THIS(1), //
6902 B(StaContextSlot), R(0), U8(first_context_slot), // 6907 B(StaContextSlot), R(context), U8(first_context_slot), //
6903 B(CreateMappedArguments), // 6908 B(CreateMappedArguments), //
6904 B(StaContextSlot), R(0), U8(first_context_slot + 1), // 6909 B(StaContextSlot), R(context), U8(first_context_slot + 1), //
6905 B(Ldar), R(new_target), // 6910 B(Ldar), R(new_target), //
6906 B(StaContextSlot), R(0), U8(first_context_slot + 2), // 6911 B(StaContextSlot), R(context), U8(first_context_slot + 2), //
6907 B(Mov), R(0), R(3), // 6912 B(Mov), R(context), R(3), //
6908 B(LdaConstant), U8(0), // 6913 B(LdaConstant), U8(0), //
6909 B(Star), R(4), // 6914 B(Star), R(4), //
6910 B(CallRuntimeForPair), U16(Runtime::kLoadLookupSlot), // 6915 B(CallRuntimeForPair), U16(Runtime::kLoadLookupSlot), //
6911 R(3), U8(2), R(1), // 6916 R(3), U8(2), R(1), //
6912 B(LdaConstant), U8(1), // 6917 B(LdaConstant), U8(1), //
6913 B(Star), R(3), // 6918 B(Star), R(3), //
6914 B(Mov), R(1), R(4), // 6919 B(Mov), R(1), R(4), //
6915 B(Mov), R(3), R(5), // 6920 B(Mov), R(3), R(5), //
6916 B(Mov), R(closure), R(6), // 6921 B(Mov), R(closure), R(6), //
6917 B(LdaZero), // 6922 B(LdaZero), //
(...skipping 12 matching lines...) Expand all
6930 {"eval", "var x = 10;", "x"}}, 6935 {"eval", "var x = 10;", "x"}},
6931 {"x = 20; return eval('');", 6936 {"x = 20; return eval('');",
6932 9 * kPointerSize, 6937 9 * kPointerSize,
6933 1, 6938 1,
6934 71, 6939 71,
6935 { 6940 {
6936 B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), // 6941 B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), //
6937 U8(1), // 6942 U8(1), //
6938 B(PushContext), R(0), // 6943 B(PushContext), R(0), //
6939 B(Ldar), THIS(1), // 6944 B(Ldar), THIS(1), //
6940 B(StaContextSlot), R(0), U8(first_context_slot), // 6945 B(StaContextSlot), R(context), U8(first_context_slot), //
6941 B(CreateMappedArguments), // 6946 B(CreateMappedArguments), //
6942 B(StaContextSlot), R(0), U8(first_context_slot + 1), // 6947 B(StaContextSlot), R(context), U8(first_context_slot + 1), //
6943 B(Ldar), R(new_target), // 6948 B(Ldar), R(new_target), //
6944 B(StaContextSlot), R(0), U8(first_context_slot + 2), // 6949 B(StaContextSlot), R(context), U8(first_context_slot + 2), //
6945 B(LdaSmi8), U8(20), // 6950 B(LdaSmi8), U8(20), //
6946 B(StaLookupSlotSloppy), U8(0), // 6951 B(StaLookupSlotSloppy), U8(0), //
6947 B(Mov), R(0), R(3), // 6952 B(Mov), R(context), R(3), //
6948 B(LdaConstant), U8(1), // 6953 B(LdaConstant), U8(1), //
6949 B(Star), R(4), // 6954 B(Star), R(4), //
6950 B(CallRuntimeForPair), U16(Runtime::kLoadLookupSlot), // 6955 B(CallRuntimeForPair), U16(Runtime::kLoadLookupSlot), //
6951 R(3), U8(2), R(1), // 6956 R(3), U8(2), R(1), //
6952 B(LdaConstant), U8(2), // 6957 B(LdaConstant), U8(2), //
6953 B(Star), R(3), // 6958 B(Star), R(3), //
6954 B(Mov), R(1), R(4), // 6959 B(Mov), R(1), R(4), //
6955 B(Mov), R(3), R(5), // 6960 B(Mov), R(3), R(5), //
6956 B(Mov), R(closure), R(6), // 6961 B(Mov), R(closure), R(6), //
6957 B(LdaZero), // 6962 B(LdaZero), //
(...skipping 25 matching lines...) Expand all
6983 6988
6984 FeedbackVectorSpec feedback_spec(&zone); 6989 FeedbackVectorSpec feedback_spec(&zone);
6985 FeedbackVectorSlot slot1 = feedback_spec.AddLoadICSlot(); 6990 FeedbackVectorSlot slot1 = feedback_spec.AddLoadICSlot();
6986 FeedbackVectorSlot slot2 = feedback_spec.AddCallICSlot(); 6991 FeedbackVectorSlot slot2 = feedback_spec.AddCallICSlot();
6987 USE(slot1); 6992 USE(slot1);
6988 6993
6989 Handle<i::TypeFeedbackVector> vector = 6994 Handle<i::TypeFeedbackVector> vector =
6990 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec); 6995 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec);
6991 6996
6992 int closure = Register::function_closure().index(); 6997 int closure = Register::function_closure().index();
6998 int context = Register::current_context().index();
6993 int new_target = Register::new_target().index(); 6999 int new_target = Register::new_target().index();
6994 7000
6995 ExpectedSnippet<InstanceType> snippets[] = { 7001 ExpectedSnippet<InstanceType> snippets[] = {
6996 {"g = function(){}; eval(''); return g();", 7002 {"g = function(){}; eval(''); return g();",
6997 9 * kPointerSize, 7003 9 * kPointerSize,
6998 1, 7004 1,
6999 90, 7005 90,
7000 { 7006 {
7001 B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), // 7007 B(CallRuntime), U16(Runtime::kNewFunctionContext), R(closure), //
7002 U8(1), // 7008 U8(1), //
7003 B(PushContext), R(0), // 7009 B(PushContext), R(0), //
7004 B(Ldar), THIS(1), // 7010 B(Ldar), THIS(1), //
7005 B(StaContextSlot), R(0), U8(4), // 7011 B(StaContextSlot), R(context), U8(4), //
7006 B(CreateMappedArguments), // 7012 B(CreateMappedArguments), //
7007 B(StaContextSlot), R(0), U8(5), // 7013 B(StaContextSlot), R(context), U8(5), //
7008 B(Ldar), R(new_target), // 7014 B(Ldar), R(new_target), //
7009 B(StaContextSlot), R(0), U8(6), // 7015 B(StaContextSlot), R(context), U8(6), //
7010 B(CreateClosure), U8(0), U8(0), // 7016 B(CreateClosure), U8(0), U8(0), //
7011 B(StaLookupSlotSloppy), U8(1), // 7017 B(StaLookupSlotSloppy), U8(1), //
7012 B(Mov), R(0), R(3), // 7018 B(Mov), R(context), R(3), //
7013 B(LdaConstant), U8(2), // 7019 B(LdaConstant), U8(2), //
7014 B(Star), R(4), // 7020 B(Star), R(4), //
7015 B(CallRuntimeForPair), U16(Runtime::kLoadLookupSlot), // 7021 B(CallRuntimeForPair), U16(Runtime::kLoadLookupSlot), //
7016 R(3), U8(2), R(1), // 7022 R(3), U8(2), R(1), //
7017 B(LdaConstant), U8(3), // 7023 B(LdaConstant), U8(3), //
7018 B(Star), R(3), // 7024 B(Star), R(3), //
7019 B(Mov), R(1), R(4), // 7025 B(Mov), R(1), R(4), //
7020 B(Mov), R(3), R(5), // 7026 B(Mov), R(3), R(5), //
7021 B(Mov), R(closure), R(6), // 7027 B(Mov), R(closure), R(6), //
7022 B(LdaZero), // 7028 B(LdaZero), //
7023 B(Star), R(7), // 7029 B(Star), R(7), //
7024 B(LdaSmi8), U8(10), // 7030 B(LdaSmi8), U8(10), //
7025 B(Star), R(8), // 7031 B(Star), R(8), //
7026 B(CallRuntime), U16(Runtime::kResolvePossiblyDirectEval), R(4), // 7032 B(CallRuntime), U16(Runtime::kResolvePossiblyDirectEval), R(4), //
7027 U8(5), // 7033 U8(5), //
7028 B(Star), R(1), // 7034 B(Star), R(1), //
7029 B(Call), R(1), R(2), U8(1), U8(0), // 7035 B(Call), R(1), R(2), U8(1), U8(0), //
7030 B(Mov), R(0), R(3), // 7036 B(Mov), R(context), R(3), //
7031 B(LdaConstant), U8(1), // 7037 B(LdaConstant), U8(1), //
7032 B(Star), R(4), // 7038 B(Star), R(4), //
7033 B(CallRuntimeForPair), U16(Runtime::kLoadLookupSlot), // 7039 B(CallRuntimeForPair), U16(Runtime::kLoadLookupSlot), //
7034 R(3), U8(2), R(1), // 7040 R(3), U8(2), R(1), //
7035 B(Call), R(1), R(2), U8(0), U8(vector->GetIndex(slot2)), // 7041 B(Call), R(1), R(2), U8(0), U8(vector->GetIndex(slot2)), //
7036 B(Return), // 7042 B(Return), //
7037 }, 7043 },
7038 4, 7044 4,
7039 {InstanceType::SHARED_FUNCTION_INFO_TYPE, 7045 {InstanceType::SHARED_FUNCTION_INFO_TYPE,
7040 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, 7046 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE,
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after
7273 std::string(function_epilogue); 7279 std::string(function_epilogue);
7274 Handle<BytecodeArray> bytecode_array = 7280 Handle<BytecodeArray> bytecode_array =
7275 helper.MakeBytecode(script.c_str(), "*", "f"); 7281 helper.MakeBytecode(script.c_str(), "*", "f");
7276 CheckBytecodeArrayEqual(snippets[i], bytecode_array); 7282 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
7277 } 7283 }
7278 } 7284 }
7279 7285
7280 } // namespace interpreter 7286 } // namespace interpreter
7281 } // namespace internal 7287 } // namespace internal
7282 } // namespace v8 7288 } // namespace v8
OLDNEW
« no previous file with comments | « src/x87/builtins-x87.cc ('k') | test/mjsunit/deopt-with-outer-context.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698