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

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

Issue 1403943004: [Interpreter] Add support for local context loads and stores. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@int_contextchain
Patch Set: Created 5 years, 2 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
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 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
127 } 127 }
128 128
129 129
130 template <typename T> 130 template <typename T>
131 static void CheckBytecodeArrayEqual(struct ExpectedSnippet<T> expected, 131 static void CheckBytecodeArrayEqual(struct ExpectedSnippet<T> expected,
132 Handle<BytecodeArray> actual, 132 Handle<BytecodeArray> actual,
133 bool has_unknown = false) { 133 bool has_unknown = false) {
134 CHECK_EQ(actual->frame_size(), expected.frame_size); 134 CHECK_EQ(actual->frame_size(), expected.frame_size);
135 CHECK_EQ(actual->parameter_count(), expected.parameter_count); 135 CHECK_EQ(actual->parameter_count(), expected.parameter_count);
136 CHECK_EQ(actual->length(), expected.bytecode_length); 136 CHECK_EQ(actual->length(), expected.bytecode_length);
137 if (expected.constant_count != -1) { 137 if (expected.constant_count == 0) {
138 if (expected.constant_count == 0) { 138 CHECK_EQ(actual->constant_pool(), CcTest::heap()->empty_fixed_array());
139 CHECK_EQ(actual->constant_pool(), CcTest::heap()->empty_fixed_array()); 139 } else {
140 } else { 140 CHECK_EQ(actual->constant_pool()->length(), expected.constant_count);
141 CHECK_EQ(actual->constant_pool()->length(), expected.constant_count); 141 for (int i = 0; i < expected.constant_count; i++) {
142 for (int i = 0; i < expected.constant_count; i++) { 142 CheckConstant(expected.constants[i], actual->constant_pool()->get(i));
143 CheckConstant(expected.constants[i], actual->constant_pool()->get(i));
144 }
145 } 143 }
146 } 144 }
147 145
148 BytecodeArrayIterator iterator(actual); 146 BytecodeArrayIterator iterator(actual);
149 int i = 0; 147 int i = 0;
150 while (!iterator.done()) { 148 while (!iterator.done()) {
151 int bytecode_index = i++; 149 int bytecode_index = i++;
152 Bytecode bytecode = iterator.current_bytecode(); 150 Bytecode bytecode = iterator.current_bytecode();
153 if (Bytecodes::ToByte(bytecode) != expected.bytecode[bytecode_index]) { 151 if (Bytecodes::ToByte(bytecode) != expected.bytecode[bytecode_index]) {
154 std::ostringstream stream; 152 std::ostringstream stream;
(...skipping 1330 matching lines...) Expand 10 before | Expand all | Expand 10 after
1485 helper.MakeBytecode(snippets[i].code_snippet, helper.kFunctionName); 1483 helper.MakeBytecode(snippets[i].code_snippet, helper.kFunctionName);
1486 CheckBytecodeArrayEqual(snippets[i], bytecode_array); 1484 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
1487 } 1485 }
1488 } 1486 }
1489 1487
1490 1488
1491 TEST(DeclareGlobals) { 1489 TEST(DeclareGlobals) {
1492 InitializedHandleScope handle_scope; 1490 InitializedHandleScope handle_scope;
1493 BytecodeGeneratorHelper helper; 1491 BytecodeGeneratorHelper helper;
1494 1492
1495 ExpectedSnippet<int> snippets[] = { 1493 ExpectedSnippet<InstanceType> snippets[] = {
1496 {"var a = 1;", 1494 {"var a = 1;",
1497 5 * kPointerSize, 1495 5 * kPointerSize,
1498 1, 1496 1,
1499 45, 1497 45,
1500 { 1498 {
1501 B(Ldar), R(Register::function_closure().index()), // 1499 B(Ldar), R(Register::function_closure().index()), //
1502 B(Star), R(2), // 1500 B(Star), R(2), //
1503 B(LdaConstant), U8(0), // 1501 B(LdaConstant), U8(0), //
1504 B(Star), R(3), // 1502 B(Star), R(3), //
1505 B(CallRuntime), U16(Runtime::kNewScriptContext), R(2), U8(2), // 1503 B(CallRuntime), U16(Runtime::kNewScriptContext), R(2), U8(2), //
1506 B(PushContext), R(1), // 1504 B(PushContext), R(1), //
1507 B(LdaConstant), U8(1), // 1505 B(LdaConstant), U8(1), //
1508 B(Star), R(2), // 1506 B(Star), R(2), //
1509 B(LdaZero), // 1507 B(LdaZero), //
1510 B(Star), R(3), // 1508 B(Star), R(3), //
1511 B(CallRuntime), U16(Runtime::kDeclareGlobals), R(2), U8(2), // 1509 B(CallRuntime), U16(Runtime::kDeclareGlobals), R(2), U8(2), //
1512 B(LdaConstant), U8(2), // 1510 B(LdaConstant), U8(2), //
1513 B(Star), R(2), // 1511 B(Star), R(2), //
1514 B(LdaZero), // 1512 B(LdaZero), //
1515 B(Star), R(3), // 1513 B(Star), R(3), //
1516 B(LdaSmi8), U8(1), // 1514 B(LdaSmi8), U8(1), //
1517 B(Star), R(4), // 1515 B(Star), R(4), //
1518 B(CallRuntime), U16(Runtime::kInitializeVarGlobal), R(2), // 1516 B(CallRuntime), U16(Runtime::kInitializeVarGlobal), R(2), //
1519 U8(3), // 1517 U8(3), //
1520 B(LdaUndefined), // 1518 B(LdaUndefined), //
1521 B(Return) // 1519 B(Return) //
1522 }, 1520 },
1523 -1}, 1521 3,
1522 {InstanceType::FIXED_ARRAY_TYPE,
1523 InstanceType::FIXED_ARRAY_TYPE,
1524 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}},
1524 {"function f() {}", 1525 {"function f() {}",
1525 3 * kPointerSize, 1526 3 * kPointerSize,
1526 1, 1527 1,
1527 29, 1528 29,
1528 { 1529 {
1529 B(Ldar), R(Register::function_closure().index()), // 1530 B(Ldar), R(Register::function_closure().index()), //
1530 B(Star), R(1), // 1531 B(Star), R(1), //
1531 B(LdaConstant), U8(0), // 1532 B(LdaConstant), U8(0), //
1532 B(Star), R(2), // 1533 B(Star), R(2), //
1533 B(CallRuntime), U16(Runtime::kNewScriptContext), R(1), U8(2), // 1534 B(CallRuntime), U16(Runtime::kNewScriptContext), R(1), U8(2), //
1534 B(PushContext), R(0), // 1535 B(PushContext), R(0), //
1535 B(LdaConstant), U8(1), // 1536 B(LdaConstant), U8(1), //
1536 B(Star), R(1), // 1537 B(Star), R(1), //
1537 B(LdaZero), // 1538 B(LdaZero), //
1538 B(Star), R(2), // 1539 B(Star), R(2), //
1539 B(CallRuntime), U16(Runtime::kDeclareGlobals), R(1), U8(2), // 1540 B(CallRuntime), U16(Runtime::kDeclareGlobals), R(1), U8(2), //
1540 B(LdaUndefined), // 1541 B(LdaUndefined), //
1541 B(Return) // 1542 B(Return) //
1542 }, 1543 },
1543 -1}, 1544 2,
1545 {InstanceType::FIXED_ARRAY_TYPE, InstanceType::FIXED_ARRAY_TYPE}},
1544 {"var a = 1;\na=2;", 1546 {"var a = 1;\na=2;",
1545 5 * kPointerSize, 1547 5 * kPointerSize,
1546 1, 1548 1,
1547 52, 1549 52,
1548 { 1550 {
1549 B(Ldar), R(Register::function_closure().index()), // 1551 B(Ldar), R(Register::function_closure().index()), //
1550 B(Star), R(2), // 1552 B(Star), R(2), //
1551 B(LdaConstant), U8(0), // 1553 B(LdaConstant), U8(0), //
1552 B(Star), R(3), // 1554 B(Star), R(3), //
1553 B(CallRuntime), U16(Runtime::kNewScriptContext), R(2), U8(2), // 1555 B(CallRuntime), U16(Runtime::kNewScriptContext), R(2), U8(2), //
(...skipping 10 matching lines...) Expand all
1564 B(LdaSmi8), U8(1), // 1566 B(LdaSmi8), U8(1), //
1565 B(Star), R(4), // 1567 B(Star), R(4), //
1566 B(CallRuntime), U16(Runtime::kInitializeVarGlobal), R(2), // 1568 B(CallRuntime), U16(Runtime::kInitializeVarGlobal), R(2), //
1567 U8(3), // 1569 U8(3), //
1568 B(LdaSmi8), U8(2), // 1570 B(LdaSmi8), U8(2), //
1569 B(StaGlobal), _, // 1571 B(StaGlobal), _, //
1570 B(Star), R(0), // 1572 B(Star), R(0), //
1571 B(Ldar), R(0), // 1573 B(Ldar), R(0), //
1572 B(Return) // 1574 B(Return) //
1573 }, 1575 },
1574 -1}, 1576 3,
1577 {InstanceType::FIXED_ARRAY_TYPE,
1578 InstanceType::FIXED_ARRAY_TYPE,
1579 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}},
1575 {"function f() {}\nf();", 1580 {"function f() {}\nf();",
1576 4 * kPointerSize, 1581 4 * kPointerSize,
1577 1, 1582 1,
1578 43, 1583 43,
1579 { 1584 {
1580 B(Ldar), R(Register::function_closure().index()), // 1585 B(Ldar), R(Register::function_closure().index()), //
1581 B(Star), R(2), // 1586 B(Star), R(2), //
1582 B(LdaConstant), U8(0), // 1587 B(LdaConstant), U8(0), //
1583 B(Star), R(3), // 1588 B(Star), R(3), //
1584 B(CallRuntime), U16(Runtime::kNewScriptContext), R(2), U8(2), // 1589 B(CallRuntime), U16(Runtime::kNewScriptContext), R(2), U8(2), //
1585 B(PushContext), R(1), // 1590 B(PushContext), R(1), //
1586 B(LdaConstant), U8(1), // 1591 B(LdaConstant), U8(1), //
1587 B(Star), R(2), // 1592 B(Star), R(2), //
1588 B(LdaZero), // 1593 B(LdaZero), //
1589 B(Star), R(3), // 1594 B(Star), R(3), //
1590 B(CallRuntime), U16(Runtime::kDeclareGlobals), R(2), U8(2), // 1595 B(CallRuntime), U16(Runtime::kDeclareGlobals), R(2), U8(2), //
1591 B(LdaUndefined), // 1596 B(LdaUndefined), //
1592 B(Star), R(3), // 1597 B(Star), R(3), //
1593 B(LdaGlobal), _, // 1598 B(LdaGlobal), _, //
1594 B(Star), R(2), // 1599 B(Star), R(2), //
1595 B(Call), R(2), R(3), U8(0), // 1600 B(Call), R(2), R(3), U8(0), //
1596 B(Star), R(0), // 1601 B(Star), R(0), //
1597 B(Ldar), R(0), // 1602 B(Ldar), R(0), //
1598 B(Return) // 1603 B(Return) //
1599 }, 1604 },
1600 -1}, 1605 2,
1606 {InstanceType::FIXED_ARRAY_TYPE, InstanceType::FIXED_ARRAY_TYPE}},
1601 }; 1607 };
1602 1608
1603 for (size_t i = 0; i < arraysize(snippets); i++) { 1609 for (size_t i = 0; i < arraysize(snippets); i++) {
1604 Handle<BytecodeArray> bytecode_array = 1610 Handle<BytecodeArray> bytecode_array =
1605 helper.MakeTopLevelBytecode(snippets[i].code_snippet); 1611 helper.MakeTopLevelBytecode(snippets[i].code_snippet);
1606 CheckBytecodeArrayEqual(snippets[i], bytecode_array, true); 1612 CheckBytecodeArrayEqual(snippets[i], bytecode_array, true);
1607 } 1613 }
1608 } 1614 }
1609 1615
1610 1616
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
1759 " x = x + 1;" 1765 " x = x + 1;"
1760 "}", 1766 "}",
1761 2 * kPointerSize, 1767 2 * kPointerSize,
1762 1, 1768 1,
1763 29, 1769 29,
1764 { 1770 {
1765 B(LdaZero), // 1771 B(LdaZero), //
1766 B(Star), R(0), // 1772 B(Star), R(0), //
1767 B(Ldar), R(0), // 1773 B(Ldar), R(0), //
1768 B(Star), R(1), // 1774 B(Star), R(1), //
1769 B(LdaSmi8), // 1775 B(LdaSmi8), U8(1), //
1770 U8(1), //
1771 B(TestEqual), R(1), // 1776 B(TestEqual), R(1), //
1772 B(JumpIfFalse), U8(4), // 1777 B(JumpIfFalse), U8(4), //
1773 B(Jump), U8(14), // 1778 B(Jump), U8(14), //
1774 B(Ldar), R(0), // 1779 B(Ldar), R(0), //
1775 B(Star), R(1), // 1780 B(Star), R(1), //
1776 B(LdaSmi8), U8(1), // 1781 B(LdaSmi8), U8(1), //
1777 B(Add), R(1), // 1782 B(Add), R(1), //
1778 B(Star), R(0), // 1783 B(Star), R(0), //
1779 B(Jump), U8(-22), // 1784 B(Jump), U8(-22), //
1780 B(LdaUndefined), // 1785 B(LdaUndefined), //
(...skipping 817 matching lines...) Expand 10 before | Expand all | Expand 10 after
2598 } 2603 }
2599 2604
2600 2605
2601 TEST(TryCatch) { 2606 TEST(TryCatch) {
2602 InitializedHandleScope handle_scope; 2607 InitializedHandleScope handle_scope;
2603 BytecodeGeneratorHelper helper; 2608 BytecodeGeneratorHelper helper;
2604 2609
2605 // TODO(rmcilroy): modify tests when we have real try catch support. 2610 // TODO(rmcilroy): modify tests when we have real try catch support.
2606 ExpectedSnippet<int> snippets[] = { 2611 ExpectedSnippet<int> snippets[] = {
2607 {"try { return 1; } catch(e) { return 2; }", 2612 {"try { return 1; } catch(e) { return 2; }",
2608 0, 2613 1 * kPointerSize,
2609 1, 2614 1,
2610 5, 2615 5,
2611 { 2616 {
2612 B(LdaSmi8), U8(1), // 2617 B(LdaSmi8), U8(1), //
2613 B(Return), // 2618 B(Return), //
2614 B(LdaUndefined), // 2619 B(LdaUndefined), //
2615 B(Return), // 2620 B(Return), //
2616 }, 2621 },
2617 0}, 2622 0},
2618 }; 2623 };
(...skipping 21 matching lines...) Expand all
2640 B(Star), R(0), // 2645 B(Star), R(0), //
2641 B(LdaSmi8), U8(2), // 2646 B(LdaSmi8), U8(2), //
2642 B(Star), R(0), // 2647 B(Star), R(0), //
2643 B(LdaSmi8), U8(3), // 2648 B(LdaSmi8), U8(3), //
2644 B(Star), R(0), // 2649 B(Star), R(0), //
2645 B(LdaUndefined), // 2650 B(LdaUndefined), //
2646 B(Return), // 2651 B(Return), //
2647 }, 2652 },
2648 0}, 2653 0},
2649 {"var a = 1; try { a = 2; } catch(e) { a = 20 } finally { a = 3; }", 2654 {"var a = 1; try { a = 2; } catch(e) { a = 20 } finally { a = 3; }",
2650 1 * kPointerSize, 2655 2 * kPointerSize,
2651 1, 2656 1,
2652 14, 2657 14,
2653 { 2658 {
2654 B(LdaSmi8), U8(1), // 2659 B(LdaSmi8), U8(1), //
2655 B(Star), R(0), // 2660 B(Star), R(0), //
2656 B(LdaSmi8), U8(2), // 2661 B(LdaSmi8), U8(2), //
2657 B(Star), R(0), // 2662 B(Star), R(0), //
2658 B(LdaSmi8), U8(3), // 2663 B(LdaSmi8), U8(3), //
2659 B(Star), R(0), // 2664 B(Star), R(0), //
2660 B(LdaUndefined), // 2665 B(LdaUndefined), //
2661 B(Return), // 2666 B(Return), //
2662 }, 2667 },
2663 0}, 2668 0},
2664 }; 2669 };
2665 2670
2666 for (size_t i = 0; i < arraysize(snippets); i++) { 2671 for (size_t i = 0; i < arraysize(snippets); i++) {
2667 Handle<BytecodeArray> bytecode_array = 2672 Handle<BytecodeArray> bytecode_array =
2668 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); 2673 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet);
2669 CheckBytecodeArrayEqual(snippets[i], bytecode_array); 2674 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
2670 } 2675 }
2671 } 2676 }
2672 2677
2678
2679 TEST(ContextVariables) {
2680 InitializedHandleScope handle_scope;
2681 BytecodeGeneratorHelper helper;
2682
2683 int closure = Register::function_closure().index();
2684 int first_context_slot = Context::MIN_CONTEXT_SLOTS;
2685 ExpectedSnippet<InstanceType> snippets[] = {
2686 {"var a; return function() { a = 1; };",
2687 1 * kPointerSize,
2688 1,
2689 12,
2690 {
2691 B(CallRuntime), U16(Runtime::kNewFunctionContext), //
2692 R(closure), U8(1), //
2693 B(PushContext), R(0), //
2694 B(LdaConstant), U8(0), //
2695 B(CreateClosure), U8(0), //
2696 B(Return), //
2697 },
2698 1,
2699 {InstanceType::SHARED_FUNCTION_INFO_TYPE}},
2700 {"var a = 1; return function() { a = 2; };",
2701 1 * kPointerSize,
2702 1,
2703 17,
2704 {
2705 B(CallRuntime), U16(Runtime::kNewFunctionContext), //
2706 R(closure), U8(1), //
2707 B(PushContext), R(0), //
2708 B(LdaSmi8), U8(1), //
2709 B(StaContextSlot), R(0), U8(first_context_slot), //
2710 B(LdaConstant), U8(0), //
2711 B(CreateClosure), U8(0), //
2712 B(Return), //
2713 },
2714 1,
2715 {InstanceType::SHARED_FUNCTION_INFO_TYPE}},
2716 {"var a = 1; var b = 2; return function() { a = 2; b = 3 };",
2717 1 * kPointerSize,
2718 1,
2719 22,
2720 {
2721 B(CallRuntime), U16(Runtime::kNewFunctionContext), //
2722 R(closure), U8(1), //
2723 B(PushContext), R(0), //
2724 B(LdaSmi8), U8(1), //
2725 B(StaContextSlot), R(0), U8(first_context_slot), //
2726 B(LdaSmi8), U8(2), //
2727 B(StaContextSlot), R(0), U8(first_context_slot + 1), //
2728 B(LdaConstant), U8(0), //
2729 B(CreateClosure), U8(0), //
2730 B(Return), //
2731 },
2732 1,
2733 {InstanceType::SHARED_FUNCTION_INFO_TYPE}},
2734 {"var a; (function() { a = 2; })(); return a;",
2735 3 * kPointerSize,
2736 1,
2737 24,
2738 {
2739 B(CallRuntime), U16(Runtime::kNewFunctionContext), //
2740 R(closure), U8(1), //
2741 B(PushContext), R(0), //
2742 B(LdaUndefined), //
2743 B(Star), R(2), //
2744 B(LdaConstant), U8(0), //
2745 B(CreateClosure), U8(0), //
2746 B(Star), R(1), //
2747 B(Call), R(1), R(2), U8(0), //
2748 B(LdaContextSlot), R(0), U8(first_context_slot), //
2749 B(Return), //
2750 },
2751 1,
2752 {InstanceType::SHARED_FUNCTION_INFO_TYPE}},
2753 {"'use strict'; let a = 1; { let b = 2; return function() { a + b; }; }",
2754 4 * kPointerSize,
2755 1,
2756 51,
2757 {
2758 B(CallRuntime), U16(Runtime::kNewFunctionContext), //
2759 R(closure), U8(1), //
2760 B(PushContext), R(0), //
2761 B(LdaTheHole), //
2762 B(StaContextSlot), R(0), U8(first_context_slot), //
2763 B(LdaConstant), U8(0), //
2764 B(LdaSmi8), U8(1), //
oth 2015/10/16 09:30:43 Consecutive loads to the accumulator?
rmcilroy 2015/10/16 11:19:04 This is because of the 'use strict'; which emits t
2765 B(StaContextSlot), R(0), U8(first_context_slot), //
2766 B(LdaConstant), U8(1), //
2767 B(Star), R(2), //
2768 B(Ldar), R(closure), //
2769 B(Star), R(3), //
2770 B(CallRuntime), U16(Runtime::kPushBlockContext), R(2), U8(2), //
2771 B(PushContext), R(1), //
2772 B(LdaTheHole), //
2773 B(StaContextSlot), R(1), U8(first_context_slot), //
2774 B(LdaSmi8), U8(2), //
2775 B(StaContextSlot), R(1), U8(first_context_slot), //
2776 B(LdaConstant), U8(2), //
2777 B(CreateClosure), U8(0), //
2778 B(Return), //
2779 // TODO(rmcilroy): Dead code after this point due to return in nested
2780 // block - investigate eliminating this.
2781 B(PopContext), R(0),
2782 B(LdaUndefined), //
2783 B(Return), //
2784 },
2785 3,
2786 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE,
2787 InstanceType::FIXED_ARRAY_TYPE,
2788 InstanceType::SHARED_FUNCTION_INFO_TYPE}},
2789 };
2790
2791 for (size_t i = 0; i < arraysize(snippets); i++) {
2792 Handle<BytecodeArray> bytecode_array =
2793 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet);
2794 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
2795 }
2796 }
2797
2673 } // namespace interpreter 2798 } // namespace interpreter
2674 } // namespace internal 2799 } // namespace internal
2675 } // namespace v8 2800 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698