| 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/interpreter/interpreter.h" | 5 #include "src/interpreter/interpreter.h" |
| 6 | 6 |
| 7 #include <fstream> | 7 #include <fstream> |
| 8 #include <memory> | 8 #include <memory> |
| 9 | 9 |
| 10 #include "src/ast/prettyprinter.h" | 10 #include "src/ast/prettyprinter.h" |
| (...skipping 2373 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2384 } | 2384 } |
| 2385 | 2385 |
| 2386 __ Bind(&end); | 2386 __ Bind(&end); |
| 2387 __ Dispatch(); | 2387 __ Dispatch(); |
| 2388 } | 2388 } |
| 2389 | 2389 |
| 2390 // Jump <imm> | 2390 // Jump <imm> |
| 2391 // | 2391 // |
| 2392 // Jump by number of bytes represented by the immediate operand |imm|. | 2392 // Jump by number of bytes represented by the immediate operand |imm|. |
| 2393 void Interpreter::DoJump(InterpreterAssembler* assembler) { | 2393 void Interpreter::DoJump(InterpreterAssembler* assembler) { |
| 2394 Node* relative_jump = __ BytecodeOperandImmIntPtr(0); | 2394 Node* relative_jump = __ BytecodeOperandUImmWord(0); |
| 2395 __ Jump(relative_jump); | 2395 __ Jump(relative_jump); |
| 2396 } | 2396 } |
| 2397 | 2397 |
| 2398 // JumpConstant <idx> | 2398 // JumpConstant <idx> |
| 2399 // | 2399 // |
| 2400 // Jump by number of bytes in the Smi in the |idx| entry in the constant pool. | 2400 // Jump by number of bytes in the Smi in the |idx| entry in the constant pool. |
| 2401 void Interpreter::DoJumpConstant(InterpreterAssembler* assembler) { | 2401 void Interpreter::DoJumpConstant(InterpreterAssembler* assembler) { |
| 2402 Node* index = __ BytecodeOperandIdx(0); | 2402 Node* index = __ BytecodeOperandIdx(0); |
| 2403 Node* relative_jump = __ LoadAndUntagConstantPoolEntry(index); | 2403 Node* relative_jump = __ LoadAndUntagConstantPoolEntry(index); |
| 2404 __ Jump(relative_jump); | 2404 __ Jump(relative_jump); |
| 2405 } | 2405 } |
| 2406 | 2406 |
| 2407 // JumpIfTrue <imm> | 2407 // JumpIfTrue <imm> |
| 2408 // | 2408 // |
| 2409 // Jump by number of bytes represented by an immediate operand if the | 2409 // Jump by number of bytes represented by an immediate operand if the |
| 2410 // accumulator contains true. | 2410 // accumulator contains true. |
| 2411 void Interpreter::DoJumpIfTrue(InterpreterAssembler* assembler) { | 2411 void Interpreter::DoJumpIfTrue(InterpreterAssembler* assembler) { |
| 2412 Node* accumulator = __ GetAccumulator(); | 2412 Node* accumulator = __ GetAccumulator(); |
| 2413 Node* relative_jump = __ BytecodeOperandImmIntPtr(0); | 2413 Node* relative_jump = __ BytecodeOperandUImmWord(0); |
| 2414 Node* true_value = __ BooleanConstant(true); | 2414 Node* true_value = __ BooleanConstant(true); |
| 2415 __ JumpIfWordEqual(accumulator, true_value, relative_jump); | 2415 __ JumpIfWordEqual(accumulator, true_value, relative_jump); |
| 2416 } | 2416 } |
| 2417 | 2417 |
| 2418 // JumpIfTrueConstant <idx> | 2418 // JumpIfTrueConstant <idx> |
| 2419 // | 2419 // |
| 2420 // Jump by number of bytes in the Smi in the |idx| entry in the constant pool | 2420 // Jump by number of bytes in the Smi in the |idx| entry in the constant pool |
| 2421 // if the accumulator contains true. | 2421 // if the accumulator contains true. |
| 2422 void Interpreter::DoJumpIfTrueConstant(InterpreterAssembler* assembler) { | 2422 void Interpreter::DoJumpIfTrueConstant(InterpreterAssembler* assembler) { |
| 2423 Node* accumulator = __ GetAccumulator(); | 2423 Node* accumulator = __ GetAccumulator(); |
| 2424 Node* index = __ BytecodeOperandIdx(0); | 2424 Node* index = __ BytecodeOperandIdx(0); |
| 2425 Node* relative_jump = __ LoadAndUntagConstantPoolEntry(index); | 2425 Node* relative_jump = __ LoadAndUntagConstantPoolEntry(index); |
| 2426 Node* true_value = __ BooleanConstant(true); | 2426 Node* true_value = __ BooleanConstant(true); |
| 2427 __ JumpIfWordEqual(accumulator, true_value, relative_jump); | 2427 __ JumpIfWordEqual(accumulator, true_value, relative_jump); |
| 2428 } | 2428 } |
| 2429 | 2429 |
| 2430 // JumpIfFalse <imm> | 2430 // JumpIfFalse <imm> |
| 2431 // | 2431 // |
| 2432 // Jump by number of bytes represented by an immediate operand if the | 2432 // Jump by number of bytes represented by an immediate operand if the |
| 2433 // accumulator contains false. | 2433 // accumulator contains false. |
| 2434 void Interpreter::DoJumpIfFalse(InterpreterAssembler* assembler) { | 2434 void Interpreter::DoJumpIfFalse(InterpreterAssembler* assembler) { |
| 2435 Node* accumulator = __ GetAccumulator(); | 2435 Node* accumulator = __ GetAccumulator(); |
| 2436 Node* relative_jump = __ BytecodeOperandImmIntPtr(0); | 2436 Node* relative_jump = __ BytecodeOperandUImmWord(0); |
| 2437 Node* false_value = __ BooleanConstant(false); | 2437 Node* false_value = __ BooleanConstant(false); |
| 2438 __ JumpIfWordEqual(accumulator, false_value, relative_jump); | 2438 __ JumpIfWordEqual(accumulator, false_value, relative_jump); |
| 2439 } | 2439 } |
| 2440 | 2440 |
| 2441 // JumpIfFalseConstant <idx> | 2441 // JumpIfFalseConstant <idx> |
| 2442 // | 2442 // |
| 2443 // Jump by number of bytes in the Smi in the |idx| entry in the constant pool | 2443 // Jump by number of bytes in the Smi in the |idx| entry in the constant pool |
| 2444 // if the accumulator contains false. | 2444 // if the accumulator contains false. |
| 2445 void Interpreter::DoJumpIfFalseConstant(InterpreterAssembler* assembler) { | 2445 void Interpreter::DoJumpIfFalseConstant(InterpreterAssembler* assembler) { |
| 2446 Node* accumulator = __ GetAccumulator(); | 2446 Node* accumulator = __ GetAccumulator(); |
| 2447 Node* index = __ BytecodeOperandIdx(0); | 2447 Node* index = __ BytecodeOperandIdx(0); |
| 2448 Node* relative_jump = __ LoadAndUntagConstantPoolEntry(index); | 2448 Node* relative_jump = __ LoadAndUntagConstantPoolEntry(index); |
| 2449 Node* false_value = __ BooleanConstant(false); | 2449 Node* false_value = __ BooleanConstant(false); |
| 2450 __ JumpIfWordEqual(accumulator, false_value, relative_jump); | 2450 __ JumpIfWordEqual(accumulator, false_value, relative_jump); |
| 2451 } | 2451 } |
| 2452 | 2452 |
| 2453 // JumpIfToBooleanTrue <imm> | 2453 // JumpIfToBooleanTrue <imm> |
| 2454 // | 2454 // |
| 2455 // Jump by number of bytes represented by an immediate operand if the object | 2455 // Jump by number of bytes represented by an immediate operand if the object |
| 2456 // referenced by the accumulator is true when the object is cast to boolean. | 2456 // referenced by the accumulator is true when the object is cast to boolean. |
| 2457 void Interpreter::DoJumpIfToBooleanTrue(InterpreterAssembler* assembler) { | 2457 void Interpreter::DoJumpIfToBooleanTrue(InterpreterAssembler* assembler) { |
| 2458 Node* value = __ GetAccumulator(); | 2458 Node* value = __ GetAccumulator(); |
| 2459 Node* relative_jump = __ BytecodeOperandImmIntPtr(0); | 2459 Node* relative_jump = __ BytecodeOperandUImmWord(0); |
| 2460 Label if_true(assembler), if_false(assembler); | 2460 Label if_true(assembler), if_false(assembler); |
| 2461 __ BranchIfToBooleanIsTrue(value, &if_true, &if_false); | 2461 __ BranchIfToBooleanIsTrue(value, &if_true, &if_false); |
| 2462 __ Bind(&if_true); | 2462 __ Bind(&if_true); |
| 2463 __ Jump(relative_jump); | 2463 __ Jump(relative_jump); |
| 2464 __ Bind(&if_false); | 2464 __ Bind(&if_false); |
| 2465 __ Dispatch(); | 2465 __ Dispatch(); |
| 2466 } | 2466 } |
| 2467 | 2467 |
| 2468 // JumpIfToBooleanTrueConstant <idx> | 2468 // JumpIfToBooleanTrueConstant <idx> |
| 2469 // | 2469 // |
| (...skipping 12 matching lines...) Expand all Loading... |
| 2482 __ Bind(&if_false); | 2482 __ Bind(&if_false); |
| 2483 __ Dispatch(); | 2483 __ Dispatch(); |
| 2484 } | 2484 } |
| 2485 | 2485 |
| 2486 // JumpIfToBooleanFalse <imm> | 2486 // JumpIfToBooleanFalse <imm> |
| 2487 // | 2487 // |
| 2488 // Jump by number of bytes represented by an immediate operand if the object | 2488 // Jump by number of bytes represented by an immediate operand if the object |
| 2489 // referenced by the accumulator is false when the object is cast to boolean. | 2489 // referenced by the accumulator is false when the object is cast to boolean. |
| 2490 void Interpreter::DoJumpIfToBooleanFalse(InterpreterAssembler* assembler) { | 2490 void Interpreter::DoJumpIfToBooleanFalse(InterpreterAssembler* assembler) { |
| 2491 Node* value = __ GetAccumulator(); | 2491 Node* value = __ GetAccumulator(); |
| 2492 Node* relative_jump = __ BytecodeOperandImmIntPtr(0); | 2492 Node* relative_jump = __ BytecodeOperandUImmWord(0); |
| 2493 Label if_true(assembler), if_false(assembler); | 2493 Label if_true(assembler), if_false(assembler); |
| 2494 __ BranchIfToBooleanIsTrue(value, &if_true, &if_false); | 2494 __ BranchIfToBooleanIsTrue(value, &if_true, &if_false); |
| 2495 __ Bind(&if_true); | 2495 __ Bind(&if_true); |
| 2496 __ Dispatch(); | 2496 __ Dispatch(); |
| 2497 __ Bind(&if_false); | 2497 __ Bind(&if_false); |
| 2498 __ Jump(relative_jump); | 2498 __ Jump(relative_jump); |
| 2499 } | 2499 } |
| 2500 | 2500 |
| 2501 // JumpIfToBooleanFalseConstant <idx> | 2501 // JumpIfToBooleanFalseConstant <idx> |
| 2502 // | 2502 // |
| (...skipping 13 matching lines...) Expand all Loading... |
| 2516 __ Jump(relative_jump); | 2516 __ Jump(relative_jump); |
| 2517 } | 2517 } |
| 2518 | 2518 |
| 2519 // JumpIfNull <imm> | 2519 // JumpIfNull <imm> |
| 2520 // | 2520 // |
| 2521 // Jump by number of bytes represented by an immediate operand if the object | 2521 // Jump by number of bytes represented by an immediate operand if the object |
| 2522 // referenced by the accumulator is the null constant. | 2522 // referenced by the accumulator is the null constant. |
| 2523 void Interpreter::DoJumpIfNull(InterpreterAssembler* assembler) { | 2523 void Interpreter::DoJumpIfNull(InterpreterAssembler* assembler) { |
| 2524 Node* accumulator = __ GetAccumulator(); | 2524 Node* accumulator = __ GetAccumulator(); |
| 2525 Node* null_value = __ HeapConstant(isolate_->factory()->null_value()); | 2525 Node* null_value = __ HeapConstant(isolate_->factory()->null_value()); |
| 2526 Node* relative_jump = __ BytecodeOperandImmIntPtr(0); | 2526 Node* relative_jump = __ BytecodeOperandUImmWord(0); |
| 2527 __ JumpIfWordEqual(accumulator, null_value, relative_jump); | 2527 __ JumpIfWordEqual(accumulator, null_value, relative_jump); |
| 2528 } | 2528 } |
| 2529 | 2529 |
| 2530 // JumpIfNullConstant <idx> | 2530 // JumpIfNullConstant <idx> |
| 2531 // | 2531 // |
| 2532 // Jump by number of bytes in the Smi in the |idx| entry in the constant pool | 2532 // Jump by number of bytes in the Smi in the |idx| entry in the constant pool |
| 2533 // if the object referenced by the accumulator is the null constant. | 2533 // if the object referenced by the accumulator is the null constant. |
| 2534 void Interpreter::DoJumpIfNullConstant(InterpreterAssembler* assembler) { | 2534 void Interpreter::DoJumpIfNullConstant(InterpreterAssembler* assembler) { |
| 2535 Node* accumulator = __ GetAccumulator(); | 2535 Node* accumulator = __ GetAccumulator(); |
| 2536 Node* null_value = __ HeapConstant(isolate_->factory()->null_value()); | 2536 Node* null_value = __ HeapConstant(isolate_->factory()->null_value()); |
| 2537 Node* index = __ BytecodeOperandIdx(0); | 2537 Node* index = __ BytecodeOperandIdx(0); |
| 2538 Node* relative_jump = __ LoadAndUntagConstantPoolEntry(index); | 2538 Node* relative_jump = __ LoadAndUntagConstantPoolEntry(index); |
| 2539 __ JumpIfWordEqual(accumulator, null_value, relative_jump); | 2539 __ JumpIfWordEqual(accumulator, null_value, relative_jump); |
| 2540 } | 2540 } |
| 2541 | 2541 |
| 2542 // JumpIfUndefined <imm> | 2542 // JumpIfUndefined <imm> |
| 2543 // | 2543 // |
| 2544 // Jump by number of bytes represented by an immediate operand if the object | 2544 // Jump by number of bytes represented by an immediate operand if the object |
| 2545 // referenced by the accumulator is the undefined constant. | 2545 // referenced by the accumulator is the undefined constant. |
| 2546 void Interpreter::DoJumpIfUndefined(InterpreterAssembler* assembler) { | 2546 void Interpreter::DoJumpIfUndefined(InterpreterAssembler* assembler) { |
| 2547 Node* accumulator = __ GetAccumulator(); | 2547 Node* accumulator = __ GetAccumulator(); |
| 2548 Node* undefined_value = | 2548 Node* undefined_value = |
| 2549 __ HeapConstant(isolate_->factory()->undefined_value()); | 2549 __ HeapConstant(isolate_->factory()->undefined_value()); |
| 2550 Node* relative_jump = __ BytecodeOperandImmIntPtr(0); | 2550 Node* relative_jump = __ BytecodeOperandUImmWord(0); |
| 2551 __ JumpIfWordEqual(accumulator, undefined_value, relative_jump); | 2551 __ JumpIfWordEqual(accumulator, undefined_value, relative_jump); |
| 2552 } | 2552 } |
| 2553 | 2553 |
| 2554 // JumpIfUndefinedConstant <idx> | 2554 // JumpIfUndefinedConstant <idx> |
| 2555 // | 2555 // |
| 2556 // Jump by number of bytes in the Smi in the |idx| entry in the constant pool | 2556 // Jump by number of bytes in the Smi in the |idx| entry in the constant pool |
| 2557 // if the object referenced by the accumulator is the undefined constant. | 2557 // if the object referenced by the accumulator is the undefined constant. |
| 2558 void Interpreter::DoJumpIfUndefinedConstant(InterpreterAssembler* assembler) { | 2558 void Interpreter::DoJumpIfUndefinedConstant(InterpreterAssembler* assembler) { |
| 2559 Node* accumulator = __ GetAccumulator(); | 2559 Node* accumulator = __ GetAccumulator(); |
| 2560 Node* undefined_value = | 2560 Node* undefined_value = |
| 2561 __ HeapConstant(isolate_->factory()->undefined_value()); | 2561 __ HeapConstant(isolate_->factory()->undefined_value()); |
| 2562 Node* index = __ BytecodeOperandIdx(0); | 2562 Node* index = __ BytecodeOperandIdx(0); |
| 2563 Node* relative_jump = __ LoadAndUntagConstantPoolEntry(index); | 2563 Node* relative_jump = __ LoadAndUntagConstantPoolEntry(index); |
| 2564 __ JumpIfWordEqual(accumulator, undefined_value, relative_jump); | 2564 __ JumpIfWordEqual(accumulator, undefined_value, relative_jump); |
| 2565 } | 2565 } |
| 2566 | 2566 |
| 2567 // JumpIfJSReceiver <imm> | 2567 // JumpIfJSReceiver <imm> |
| 2568 // | 2568 // |
| 2569 // Jump by number of bytes represented by an immediate operand if the object | 2569 // Jump by number of bytes represented by an immediate operand if the object |
| 2570 // referenced by the accumulator is a JSReceiver. | 2570 // referenced by the accumulator is a JSReceiver. |
| 2571 void Interpreter::DoJumpIfJSReceiver(InterpreterAssembler* assembler) { | 2571 void Interpreter::DoJumpIfJSReceiver(InterpreterAssembler* assembler) { |
| 2572 Node* accumulator = __ GetAccumulator(); | 2572 Node* accumulator = __ GetAccumulator(); |
| 2573 Node* relative_jump = __ BytecodeOperandImmIntPtr(0); | 2573 Node* relative_jump = __ BytecodeOperandUImmWord(0); |
| 2574 | 2574 |
| 2575 Label if_object(assembler), if_notobject(assembler, Label::kDeferred), | 2575 Label if_object(assembler), if_notobject(assembler, Label::kDeferred), |
| 2576 if_notsmi(assembler); | 2576 if_notsmi(assembler); |
| 2577 __ Branch(__ TaggedIsSmi(accumulator), &if_notobject, &if_notsmi); | 2577 __ Branch(__ TaggedIsSmi(accumulator), &if_notobject, &if_notsmi); |
| 2578 | 2578 |
| 2579 __ Bind(&if_notsmi); | 2579 __ Bind(&if_notsmi); |
| 2580 __ Branch(__ IsJSReceiver(accumulator), &if_object, &if_notobject); | 2580 __ Branch(__ IsJSReceiver(accumulator), &if_object, &if_notobject); |
| 2581 __ Bind(&if_object); | 2581 __ Bind(&if_object); |
| 2582 __ Jump(relative_jump); | 2582 __ Jump(relative_jump); |
| 2583 | 2583 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 2607 __ Dispatch(); | 2607 __ Dispatch(); |
| 2608 } | 2608 } |
| 2609 | 2609 |
| 2610 // JumpIfNotHole <imm> | 2610 // JumpIfNotHole <imm> |
| 2611 // | 2611 // |
| 2612 // Jump by number of bytes represented by an immediate operand if the object | 2612 // Jump by number of bytes represented by an immediate operand if the object |
| 2613 // referenced by the accumulator is the hole. | 2613 // referenced by the accumulator is the hole. |
| 2614 void Interpreter::DoJumpIfNotHole(InterpreterAssembler* assembler) { | 2614 void Interpreter::DoJumpIfNotHole(InterpreterAssembler* assembler) { |
| 2615 Node* accumulator = __ GetAccumulator(); | 2615 Node* accumulator = __ GetAccumulator(); |
| 2616 Node* the_hole_value = __ HeapConstant(isolate_->factory()->the_hole_value()); | 2616 Node* the_hole_value = __ HeapConstant(isolate_->factory()->the_hole_value()); |
| 2617 Node* relative_jump = __ BytecodeOperandImmIntPtr(0); | 2617 Node* relative_jump = __ BytecodeOperandUImmWord(0); |
| 2618 __ JumpIfWordNotEqual(accumulator, the_hole_value, relative_jump); | 2618 __ JumpIfWordNotEqual(accumulator, the_hole_value, relative_jump); |
| 2619 } | 2619 } |
| 2620 | 2620 |
| 2621 // JumpIfNotHoleConstant <idx> | 2621 // JumpIfNotHoleConstant <idx> |
| 2622 // | 2622 // |
| 2623 // Jump by number of bytes in the Smi in the |idx| entry in the constant pool | 2623 // Jump by number of bytes in the Smi in the |idx| entry in the constant pool |
| 2624 // if the object referenced by the accumulator is the hole constant. | 2624 // if the object referenced by the accumulator is the hole constant. |
| 2625 void Interpreter::DoJumpIfNotHoleConstant(InterpreterAssembler* assembler) { | 2625 void Interpreter::DoJumpIfNotHoleConstant(InterpreterAssembler* assembler) { |
| 2626 Node* accumulator = __ GetAccumulator(); | 2626 Node* accumulator = __ GetAccumulator(); |
| 2627 Node* the_hole_value = __ HeapConstant(isolate_->factory()->the_hole_value()); | 2627 Node* the_hole_value = __ HeapConstant(isolate_->factory()->the_hole_value()); |
| 2628 Node* index = __ BytecodeOperandIdx(0); | 2628 Node* index = __ BytecodeOperandIdx(0); |
| 2629 Node* relative_jump = __ LoadAndUntagConstantPoolEntry(index); | 2629 Node* relative_jump = __ LoadAndUntagConstantPoolEntry(index); |
| 2630 __ JumpIfWordNotEqual(accumulator, the_hole_value, relative_jump); | 2630 __ JumpIfWordNotEqual(accumulator, the_hole_value, relative_jump); |
| 2631 } | 2631 } |
| 2632 | 2632 |
| 2633 // JumpLoop <imm> <loop_depth> | 2633 // JumpLoop <imm> <loop_depth> |
| 2634 // | 2634 // |
| 2635 // Jump by number of bytes represented by the immediate operand |imm|. Also | 2635 // Jump by number of bytes represented by the immediate operand |imm|. Also |
| 2636 // performs a loop nesting check and potentially triggers OSR in case the | 2636 // performs a loop nesting check and potentially triggers OSR in case the |
| 2637 // current OSR level matches (or exceeds) the specified |loop_depth|. | 2637 // current OSR level matches (or exceeds) the specified |loop_depth|. |
| 2638 void Interpreter::DoJumpLoop(InterpreterAssembler* assembler) { | 2638 void Interpreter::DoJumpLoop(InterpreterAssembler* assembler) { |
| 2639 Node* relative_jump = __ BytecodeOperandImmIntPtr(0); | 2639 Node* relative_jump = __ BytecodeOperandUImmWord(0); |
| 2640 Node* loop_depth = __ BytecodeOperandImm(1); | 2640 Node* loop_depth = __ BytecodeOperandImm(1); |
| 2641 Node* osr_level = __ LoadOSRNestingLevel(); | 2641 Node* osr_level = __ LoadOSRNestingLevel(); |
| 2642 | 2642 |
| 2643 // Check if OSR points at the given {loop_depth} are armed by comparing it to | 2643 // Check if OSR points at the given {loop_depth} are armed by comparing it to |
| 2644 // the current {osr_level} loaded from the header of the BytecodeArray. | 2644 // the current {osr_level} loaded from the header of the BytecodeArray. |
| 2645 Label ok(assembler), osr_armed(assembler, Label::kDeferred); | 2645 Label ok(assembler), osr_armed(assembler, Label::kDeferred); |
| 2646 Node* condition = __ Int32GreaterThanOrEqual(loop_depth, osr_level); | 2646 Node* condition = __ Int32GreaterThanOrEqual(loop_depth, osr_level); |
| 2647 __ Branch(condition, &ok, &osr_armed); | 2647 __ Branch(condition, &ok, &osr_armed); |
| 2648 | 2648 |
| 2649 __ Bind(&ok); | 2649 __ Bind(&ok); |
| 2650 __ Jump(relative_jump); | 2650 __ JumpBackward(relative_jump); |
| 2651 | 2651 |
| 2652 __ Bind(&osr_armed); | 2652 __ Bind(&osr_armed); |
| 2653 { | 2653 { |
| 2654 Callable callable = CodeFactory::InterpreterOnStackReplacement(isolate_); | 2654 Callable callable = CodeFactory::InterpreterOnStackReplacement(isolate_); |
| 2655 Node* target = __ HeapConstant(callable.code()); | 2655 Node* target = __ HeapConstant(callable.code()); |
| 2656 Node* context = __ GetContext(); | 2656 Node* context = __ GetContext(); |
| 2657 __ CallStub(callable.descriptor(), target, context); | 2657 __ CallStub(callable.descriptor(), target, context); |
| 2658 __ Jump(relative_jump); | 2658 __ JumpBackward(relative_jump); |
| 2659 } | 2659 } |
| 2660 } | 2660 } |
| 2661 | 2661 |
| 2662 // CreateRegExpLiteral <pattern_idx> <literal_idx> <flags> | 2662 // CreateRegExpLiteral <pattern_idx> <literal_idx> <flags> |
| 2663 // | 2663 // |
| 2664 // Creates a regular expression literal for literal index <literal_idx> with | 2664 // Creates a regular expression literal for literal index <literal_idx> with |
| 2665 // <flags> and the pattern in <pattern_idx>. | 2665 // <flags> and the pattern in <pattern_idx>. |
| 2666 void Interpreter::DoCreateRegExpLiteral(InterpreterAssembler* assembler) { | 2666 void Interpreter::DoCreateRegExpLiteral(InterpreterAssembler* assembler) { |
| 2667 Node* index = __ BytecodeOperandIdx(0); | 2667 Node* index = __ BytecodeOperandIdx(0); |
| 2668 Node* pattern = __ LoadConstantPoolEntry(index); | 2668 Node* pattern = __ LoadConstantPoolEntry(index); |
| (...skipping 630 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3299 __ StoreObjectField(generator, JSGeneratorObject::kContinuationOffset, | 3299 __ StoreObjectField(generator, JSGeneratorObject::kContinuationOffset, |
| 3300 __ SmiTag(new_state)); | 3300 __ SmiTag(new_state)); |
| 3301 __ SetAccumulator(old_state); | 3301 __ SetAccumulator(old_state); |
| 3302 | 3302 |
| 3303 __ Dispatch(); | 3303 __ Dispatch(); |
| 3304 } | 3304 } |
| 3305 | 3305 |
| 3306 } // namespace interpreter | 3306 } // namespace interpreter |
| 3307 } // namespace internal | 3307 } // namespace internal |
| 3308 } // namespace v8 | 3308 } // namespace v8 |
| OLD | NEW |