| OLD | NEW | 
|---|
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "src/v8.h" | 5 #include "src/v8.h" | 
| 6 | 6 | 
| 7 #include "src/compiler.h" | 7 #include "src/compiler.h" | 
| 8 #include "src/interpreter/bytecode-array-iterator.h" | 8 #include "src/interpreter/bytecode-array-iterator.h" | 
| 9 #include "src/interpreter/bytecode-generator.h" | 9 #include "src/interpreter/bytecode-generator.h" | 
| 10 #include "src/interpreter/interpreter.h" | 10 #include "src/interpreter/interpreter.h" | 
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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),                                             // | 
|  | 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 | 
|  | 2798 | 
|  | 2799 TEST(ContextParameters) { | 
|  | 2800   InitializedHandleScope handle_scope; | 
|  | 2801   BytecodeGeneratorHelper helper; | 
|  | 2802 | 
|  | 2803   int closure = Register::function_closure().index(); | 
|  | 2804   int first_context_slot = Context::MIN_CONTEXT_SLOTS; | 
|  | 2805   ExpectedSnippet<InstanceType> snippets[] = { | 
|  | 2806       {"function f(arg1) { return function() { arg1 = 2; }; }", | 
|  | 2807        1 * kPointerSize, | 
|  | 2808        2, | 
|  | 2809        17, | 
|  | 2810        { | 
|  | 2811            B(CallRuntime), U16(Runtime::kNewFunctionContext),  // | 
|  | 2812                            R(closure), U8(1),                  // | 
|  | 2813            B(PushContext), R(0),                               // | 
|  | 2814            B(Ldar), R(helper.kLastParamIndex),                 // | 
|  | 2815            B(StaContextSlot), R(0), U8(first_context_slot),    // | 
|  | 2816            B(LdaConstant), U8(0),                              // | 
|  | 2817            B(CreateClosure), U8(0),                            // | 
|  | 2818            B(Return),                                          // | 
|  | 2819        }, | 
|  | 2820        1, | 
|  | 2821        {InstanceType::SHARED_FUNCTION_INFO_TYPE}}, | 
|  | 2822       {"function f(arg1) { var a = function() { arg1 = 2; }; return arg1; }", | 
|  | 2823        2 * kPointerSize, | 
|  | 2824        2, | 
|  | 2825        22, | 
|  | 2826        { | 
|  | 2827            B(CallRuntime), U16(Runtime::kNewFunctionContext),  // | 
|  | 2828                            R(closure), U8(1),                  // | 
|  | 2829            B(PushContext), R(1),                               // | 
|  | 2830            B(Ldar), R(helper.kLastParamIndex),                 // | 
|  | 2831            B(StaContextSlot), R(1), U8(first_context_slot),    // | 
|  | 2832            B(LdaConstant), U8(0),                              // | 
|  | 2833            B(CreateClosure), U8(0),                            // | 
|  | 2834            B(Star), R(0),                                      // | 
|  | 2835            B(LdaContextSlot), R(1), U8(first_context_slot),    // | 
|  | 2836            B(Return),                                          // | 
|  | 2837        }, | 
|  | 2838        1, | 
|  | 2839        {InstanceType::SHARED_FUNCTION_INFO_TYPE}}, | 
|  | 2840       {"function f(a1, a2, a3, a4) { return function() { a1 = a3; }; }", | 
|  | 2841        1 * kPointerSize, | 
|  | 2842        5, | 
|  | 2843        22, | 
|  | 2844        { | 
|  | 2845            B(CallRuntime), U16(Runtime::kNewFunctionContext),    // | 
|  | 2846                            R(closure), U8(1),                    // | 
|  | 2847            B(PushContext), R(0),                                 // | 
|  | 2848            B(Ldar), R(helper.kLastParamIndex - 3),               // | 
|  | 2849            B(StaContextSlot), R(0), U8(first_context_slot + 1),  // | 
|  | 2850            B(Ldar), R(helper.kLastParamIndex -1),                // | 
|  | 2851            B(StaContextSlot), R(0), U8(first_context_slot),      // | 
|  | 2852            B(LdaConstant), U8(0),                                // | 
|  | 2853            B(CreateClosure), U8(0),                              // | 
|  | 2854            B(Return),                                            // | 
|  | 2855        }, | 
|  | 2856        1, | 
|  | 2857        {InstanceType::SHARED_FUNCTION_INFO_TYPE}}, | 
|  | 2858       {"function f() { var self = this; return function() { self = 2; }; }", | 
|  | 2859        1 * kPointerSize, | 
|  | 2860        1, | 
|  | 2861        17, | 
|  | 2862        { | 
|  | 2863            B(CallRuntime), U16(Runtime::kNewFunctionContext),  // | 
|  | 2864                            R(closure), U8(1),                  // | 
|  | 2865            B(PushContext), R(0),                               // | 
|  | 2866            B(Ldar), R(helper.kLastParamIndex),                 // | 
|  | 2867            B(StaContextSlot), R(0), U8(first_context_slot),    // | 
|  | 2868            B(LdaConstant), U8(0),                              // | 
|  | 2869            B(CreateClosure), U8(0),                            // | 
|  | 2870            B(Return),                                          // | 
|  | 2871        }, | 
|  | 2872        1, | 
|  | 2873        {InstanceType::SHARED_FUNCTION_INFO_TYPE}}, | 
|  | 2874   }; | 
|  | 2875 | 
|  | 2876   for (size_t i = 0; i < arraysize(snippets); i++) { | 
|  | 2877     Handle<BytecodeArray> bytecode_array = | 
|  | 2878         helper.MakeBytecodeForFunction(snippets[i].code_snippet); | 
|  | 2879     CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 
|  | 2880   } | 
|  | 2881 } | 
|  | 2882 | 
| 2673 }  // namespace interpreter | 2883 }  // namespace interpreter | 
| 2674 }  // namespace internal | 2884 }  // namespace internal | 
| 2675 }  // namespace v8 | 2885 }  // namespace v8 | 
| OLD | NEW | 
|---|