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

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

Issue 1419823003: Remove support for "loads and stores to global vars through property cell shortcuts inst… (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@disable-shortcuts
Patch Set: Addressing comments 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
« no previous file with comments | « src/interpreter/interpreter.cc ('k') | test/unittests/compiler/js-type-feedback-unittest.cc » ('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 1001 matching lines...) Expand 10 before | Expand all | Expand 10 after
1012 Handle<BytecodeArray> bytecode_array = 1012 Handle<BytecodeArray> bytecode_array =
1013 helper.MakeBytecode(snippets[i].code_snippet, helper.kFunctionName); 1013 helper.MakeBytecode(snippets[i].code_snippet, helper.kFunctionName);
1014 CheckBytecodeArrayEqual(snippets[i], bytecode_array); 1014 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
1015 } 1015 }
1016 } 1016 }
1017 1017
1018 1018
1019 TEST(LoadGlobal) { 1019 TEST(LoadGlobal) {
1020 InitializedHandleScope handle_scope; 1020 InitializedHandleScope handle_scope;
1021 BytecodeGeneratorHelper helper; 1021 BytecodeGeneratorHelper helper;
1022 Zone zone;
1022 1023
1023 if (!FLAG_global_var_shortcuts) return; 1024 int context_reg = Register::function_context().index();
1025 int global_index = Context::GLOBAL_OBJECT_INDEX;
1024 1026
1025 ExpectedSnippet<int> snippets[] = { 1027 FeedbackVectorSpec feedback_spec(&zone);
1028 FeedbackVectorSlot slot1 = feedback_spec.AddLoadICSlot();
1029
1030 Handle<i::TypeFeedbackVector> vector =
1031 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec);
1032
1033 ExpectedSnippet<InstanceType> snippets[] = {
1026 { 1034 {
1027 "var a = 1;\nfunction f() { return a; }\nf()", 1035 "var a = 1;\nfunction f() { return a; }\nf()",
1028 0, 1036 kPointerSize,
1029 1, 1037 1,
1030 3, 1038 11,
1031 { 1039 {
1032 B(LdaGlobal), _, // 1040 B(LdaContextSlot), R(context_reg), U8(global_index), //
1033 B(Return) // 1041 B(Star), R(0), //
1042 B(LdaConstant), U8(0), //
1043 B(LoadICSloppy), R(0), U8(vector->GetIndex(slot1)), //
1044 B(Return) //
1034 }, 1045 },
1046 1,
1047 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE},
1035 }, 1048 },
1036 { 1049 {
1037 "function t() { }\nfunction f() { return t; }\nf()", 1050 "function t() { }\nfunction f() { return t; }\nf()",
1038 0, 1051 kPointerSize,
1039 1, 1052 1,
1040 3, 1053 11,
1041 { 1054 {
1042 B(LdaGlobal), _, // 1055 B(LdaContextSlot), R(context_reg), U8(global_index), //
1043 B(Return) // 1056 B(Star), R(0), //
1057 B(LdaConstant), U8(0), //
1058 B(LoadICSloppy), R(0), U8(vector->GetIndex(slot1)), //
1059 B(Return) //
1044 }, 1060 },
1061 1,
1062 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE},
1045 }, 1063 },
1046 }; 1064 };
1047 1065
1048 for (size_t i = 0; i < arraysize(snippets); i++) { 1066 for (size_t i = 0; i < arraysize(snippets); i++) {
1049 Handle<BytecodeArray> bytecode_array = 1067 Handle<BytecodeArray> bytecode_array =
1050 helper.MakeBytecode(snippets[i].code_snippet, "f"); 1068 helper.MakeBytecode(snippets[i].code_snippet, "f");
1051 CheckBytecodeArrayEqual(snippets[i], bytecode_array, true); 1069 CheckBytecodeArrayEqual(snippets[i], bytecode_array, true);
1052 } 1070 }
1053 } 1071 }
1054 1072
1055 1073
1056 TEST(StoreGlobal) { 1074 TEST(StoreGlobal) {
1057 InitializedHandleScope handle_scope; 1075 InitializedHandleScope handle_scope;
1058 BytecodeGeneratorHelper helper; 1076 BytecodeGeneratorHelper helper;
1077 Zone zone;
1059 1078
1060 if (!FLAG_global_var_shortcuts) return; 1079 int context_reg = Register::function_context().index();
1080 int global_index = Context::GLOBAL_OBJECT_INDEX;
1081
1082 FeedbackVectorSpec feedback_spec(&zone);
1083 FeedbackVectorSlot slot1 = feedback_spec.AddStoreICSlot();
1084
1085 Handle<i::TypeFeedbackVector> vector =
1086 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec);
1061 1087
1062 ExpectedSnippet<InstanceType> snippets[] = { 1088 ExpectedSnippet<InstanceType> snippets[] = {
1063 { 1089 {
1064 "var a = 1;\nfunction f() { a = 2; }\nf()", 1090 "var a = 1;\nfunction f() { a = 2; }\nf()",
1065 0, 1091 3 * kPointerSize,
1066 1, 1092 1,
1067 6, 1093 21,
1068 { 1094 {
1069 B(LdaSmi8), U8(2), // 1095 B(LdaSmi8), U8(2), //
1070 B(StaGlobalSloppy), _, // 1096 B(Star), R(0), //
1071 B(LdaUndefined), // 1097 B(LdaContextSlot), R(context_reg), U8(global_index), //
1072 B(Return) // 1098 B(Star), R(1), //
1099 B(LdaConstant), U8(0), //
1100 B(Star), R(2), //
1101 B(Ldar), R(0), //
1102 B(StoreICSloppy), R(1), R(2), U8(vector->GetIndex(slot1)), //
1103 B(LdaUndefined), //
1104 B(Return) //
1073 }, 1105 },
1106 1,
1107 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE},
1074 }, 1108 },
1075 { 1109 {
1076 "var a = \"test\"; function f(b) { a = b; }\nf(\"global\")", 1110 "var a = \"test\"; function f(b) { a = b; }\nf(\"global\")",
1077 0, 1111 3 * kPointerSize,
1078 2, 1112 2,
1079 6, 1113 21,
1080 { 1114 {
1081 B(Ldar), R(helper.kLastParamIndex), // 1115 B(Ldar), R(helper.kLastParamIndex), //
1082 B(StaGlobalSloppy), _, // 1116 B(Star), R(0), //
1083 B(LdaUndefined), // 1117 B(LdaContextSlot), R(context_reg), U8(global_index), //
1084 B(Return) // 1118 B(Star), R(1), //
1119 B(LdaConstant), U8(0), //
1120 B(Star), R(2), //
1121 B(Ldar), R(0), //
1122 B(StoreICSloppy), R(1), R(2), U8(vector->GetIndex(slot1)), //
1123 B(LdaUndefined), //
1124 B(Return) //
1085 }, 1125 },
1126 1,
1127 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE},
1086 }, 1128 },
1087 { 1129 {
1088 "'use strict'; var a = 1;\nfunction f() { a = 2; }\nf()", 1130 "'use strict'; var a = 1;\nfunction f() { a = 2; }\nf()",
1089 0, 1131 3 * kPointerSize,
1090 1, 1132 1,
1091 6, 1133 21,
1092 { 1134 {
1093 B(LdaSmi8), U8(2), // 1135 B(LdaSmi8), U8(2), //
1094 B(StaGlobalStrict), _, // 1136 B(Star), R(0), //
1095 B(LdaUndefined), // 1137 B(LdaContextSlot), R(context_reg), U8(global_index), //
1096 B(Return) // 1138 B(Star), R(1), //
1139 B(LdaConstant), U8(0), //
1140 B(Star), R(2), //
1141 B(Ldar), R(0), //
1142 B(StoreICStrict), R(1), R(2), U8(vector->GetIndex(slot1)), //
1143 B(LdaUndefined), //
1144 B(Return) //
1097 }, 1145 },
1146 1,
1147 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE},
1098 }, 1148 },
1099 }; 1149 };
1100 1150
1101 for (size_t i = 0; i < arraysize(snippets); i++) { 1151 for (size_t i = 0; i < arraysize(snippets); i++) {
1102 Handle<BytecodeArray> bytecode_array = 1152 Handle<BytecodeArray> bytecode_array =
1103 helper.MakeBytecode(snippets[i].code_snippet, "f"); 1153 helper.MakeBytecode(snippets[i].code_snippet, "f");
1104 CheckBytecodeArrayEqual(snippets[i], bytecode_array, true); 1154 CheckBytecodeArrayEqual(snippets[i], bytecode_array, true);
1105 } 1155 }
1106 } 1156 }
1107 1157
1108 1158
1109 TEST(CallGlobal) { 1159 TEST(CallGlobal) {
1110 InitializedHandleScope handle_scope; 1160 InitializedHandleScope handle_scope;
1111 BytecodeGeneratorHelper helper; 1161 BytecodeGeneratorHelper helper;
1162 Zone zone;
1112 1163
1113 if (!FLAG_global_var_shortcuts) return; 1164 int context_reg = Register::function_context().index();
1165 int global_index = Context::GLOBAL_OBJECT_INDEX;
1114 1166
1115 ExpectedSnippet<int> snippets[] = { 1167 FeedbackVectorSpec feedback_spec(&zone);
1168 FeedbackVectorSlot slot1 = feedback_spec.AddCallICSlot();
1169 FeedbackVectorSlot slot2 = feedback_spec.AddLoadICSlot();
1170 USE(slot1);
1171
1172 Handle<i::TypeFeedbackVector> vector =
1173 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec);
1174
1175 ExpectedSnippet<InstanceType> snippets[] = {
1116 { 1176 {
1117 "function t() { }\nfunction f() { return t(); }\nf()", 1177 "function t() { }\nfunction f() { return t(); }\nf()",
1118 2 * kPointerSize, 1178 3 * kPointerSize,
1119 1, 1179 1,
1120 12, 1180 20,
1121 { 1181 {
1122 B(LdaUndefined), // 1182 B(LdaUndefined), //
1123 B(Star), R(1), // 1183 B(Star), R(1), //
1124 B(LdaGlobal), _, // 1184 B(LdaContextSlot), R(context_reg), U8(global_index), //
1125 B(Star), R(0), // 1185 B(Star), R(2), //
1126 B(Call), R(0), R(1), U8(0), // 1186 B(LdaConstant), U8(0), //
1127 B(Return) // 1187 B(LoadICSloppy), R(2), U8(vector->GetIndex(slot2)), //
1188 B(Star), R(0), //
1189 B(Call), R(0), R(1), U8(0), //
1190 B(Return) //
1128 }, 1191 },
1192 1,
1193 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE},
1129 }, 1194 },
1130 { 1195 {
1131 "function t(a, b, c) { }\nfunction f() { return t(1, 2, 3); }\nf()", 1196 "function t(a, b, c) { }\nfunction f() { return t(1, 2, 3); }\nf()",
1132 5 * kPointerSize, 1197 5 * kPointerSize,
1133 1, 1198 1,
1134 24, 1199 32,
1135 { 1200 {
1136 B(LdaUndefined), // 1201 B(LdaUndefined), //
1137 B(Star), R(1), // 1202 B(Star), R(1), //
1138 B(LdaGlobal), _, // 1203 B(LdaContextSlot), R(context_reg), U8(global_index), //
1139 B(Star), R(0), // 1204 B(Star), R(2), //
1140 B(LdaSmi8), U8(1), // 1205 B(LdaConstant), U8(0), //
1141 B(Star), R(2), // 1206 B(LoadICSloppy), R(2), U8(vector->GetIndex(slot2)), //
1142 B(LdaSmi8), U8(2), // 1207 B(Star), R(0), //
1143 B(Star), R(3), // 1208 B(LdaSmi8), U8(1), //
1144 B(LdaSmi8), U8(3), // 1209 B(Star), R(2), //
1145 B(Star), R(4), // 1210 B(LdaSmi8), U8(2), //
1146 B(Call), R(0), R(1), U8(3), // 1211 B(Star), R(3), //
1147 B(Return) // 1212 B(LdaSmi8), U8(3), //
1213 B(Star), R(4), //
1214 B(Call), R(0), R(1), U8(3), //
1215 B(Return) //
1148 }, 1216 },
1217 1,
1218 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE},
1149 }, 1219 },
1150 }; 1220 };
1151 1221
1152 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); 1222 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]);
1153 for (size_t i = 0; i < num_snippets; i++) { 1223 for (size_t i = 0; i < num_snippets; i++) {
1154 Handle<BytecodeArray> bytecode_array = 1224 Handle<BytecodeArray> bytecode_array =
1155 helper.MakeBytecode(snippets[i].code_snippet, "f"); 1225 helper.MakeBytecode(snippets[i].code_snippet, "f");
1156 CheckBytecodeArrayEqual(snippets[i], bytecode_array, true); 1226 CheckBytecodeArrayEqual(snippets[i], bytecode_array, true);
1157 } 1227 }
1158 } 1228 }
(...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after
1473 }; 1543 };
1474 1544
1475 for (size_t i = 0; i < arraysize(snippets); i++) { 1545 for (size_t i = 0; i < arraysize(snippets); i++) {
1476 Handle<BytecodeArray> bytecode_array = 1546 Handle<BytecodeArray> bytecode_array =
1477 helper.MakeBytecode(snippets[i].code_snippet, helper.kFunctionName); 1547 helper.MakeBytecode(snippets[i].code_snippet, helper.kFunctionName);
1478 CheckBytecodeArrayEqual(snippets[i], bytecode_array); 1548 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
1479 } 1549 }
1480 } 1550 }
1481 1551
1482 1552
1483 // Tests !FLAG_global_var_shortcuts mode.
1484 TEST(DeclareGlobals) { 1553 TEST(DeclareGlobals) {
1485 InitializedHandleScope handle_scope; 1554 InitializedHandleScope handle_scope;
1486 BytecodeGeneratorHelper helper; 1555 BytecodeGeneratorHelper helper;
1487 Zone zone; 1556 Zone zone;
1488 1557
1489 if (FLAG_global_var_shortcuts) return;
1490
1491 int context_reg = Register::function_context().index(); 1558 int context_reg = Register::function_context().index();
1492 int global_index = Context::GLOBAL_OBJECT_INDEX; 1559 int global_index = Context::GLOBAL_OBJECT_INDEX;
1493 1560
1494 // Create different feedback vector specs to be precise on slot numbering. 1561 // Create different feedback vector specs to be precise on slot numbering.
1495 FeedbackVectorSpec feedback_spec_ss(&zone); 1562 FeedbackVectorSpec feedback_spec_ss(&zone);
1496 FeedbackVectorSlot slot_ss_1 = feedback_spec_ss.AddStoreICSlot(); 1563 FeedbackVectorSlot slot_ss_1 = feedback_spec_ss.AddStoreICSlot();
1497 FeedbackVectorSlot slot_ss_2 = feedback_spec_ss.AddStoreICSlot(); 1564 FeedbackVectorSlot slot_ss_2 = feedback_spec_ss.AddStoreICSlot();
1498 USE(slot_ss_1); 1565 USE(slot_ss_1);
1499 1566
1500 Handle<i::TypeFeedbackVector> vector_ss = 1567 Handle<i::TypeFeedbackVector> vector_ss =
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
1608 }; 1675 };
1609 1676
1610 for (size_t i = 0; i < arraysize(snippets); i++) { 1677 for (size_t i = 0; i < arraysize(snippets); i++) {
1611 Handle<BytecodeArray> bytecode_array = 1678 Handle<BytecodeArray> bytecode_array =
1612 helper.MakeTopLevelBytecode(snippets[i].code_snippet); 1679 helper.MakeTopLevelBytecode(snippets[i].code_snippet);
1613 CheckBytecodeArrayEqual(snippets[i], bytecode_array, true); 1680 CheckBytecodeArrayEqual(snippets[i], bytecode_array, true);
1614 } 1681 }
1615 } 1682 }
1616 1683
1617 1684
1618 // Tests FLAG_global_var_shortcuts mode.
1619 // TODO(ishell): remove when FLAG_global_var_shortcuts is removed.
1620 TEST(DeclareGlobals2) {
1621 InitializedHandleScope handle_scope;
1622 BytecodeGeneratorHelper helper;
1623
1624 if (!FLAG_global_var_shortcuts) return;
1625
1626 ExpectedSnippet<InstanceType> snippets[] = {
1627 {"var a = 1;",
1628 5 * kPointerSize,
1629 1,
1630 45,
1631 {
1632 B(Ldar), R(Register::function_closure().index()), //
1633 B(Star), R(2), //
1634 B(LdaConstant), U8(0), //
1635 B(Star), R(3), //
1636 B(CallRuntime), U16(Runtime::kNewScriptContext), R(2), U8(2), //
1637 B(PushContext), R(1), //
1638 B(LdaConstant), U8(1), //
1639 B(Star), R(2), //
1640 B(LdaZero), //
1641 B(Star), R(3), //
1642 B(CallRuntime), U16(Runtime::kDeclareGlobals), R(2), U8(2), //
1643 B(LdaConstant), U8(2), //
1644 B(Star), R(2), //
1645 B(LdaZero), //
1646 B(Star), R(3), //
1647 B(LdaSmi8), U8(1), //
1648 B(Star), R(4), //
1649 B(CallRuntime), U16(Runtime::kInitializeVarGlobal), R(2), U8(3), //
1650 B(LdaUndefined), //
1651 B(Return), //
1652 },
1653 3,
1654 {InstanceType::FIXED_ARRAY_TYPE, InstanceType::FIXED_ARRAY_TYPE,
1655 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}},
1656 {"function f() {}",
1657 3 * kPointerSize,
1658 1,
1659 29,
1660 {
1661 B(Ldar), R(Register::function_closure().index()), //
1662 B(Star), R(1), //
1663 B(LdaConstant), U8(0), //
1664 B(Star), R(2), //
1665 B(CallRuntime), U16(Runtime::kNewScriptContext), R(1), U8(2), //
1666 B(PushContext), R(0), //
1667 B(LdaConstant), U8(1), //
1668 B(Star), R(1), //
1669 B(LdaZero), //
1670 B(Star), R(2), //
1671 B(CallRuntime), U16(Runtime::kDeclareGlobals), R(1), U8(2), //
1672 B(LdaUndefined), //
1673 B(Return) //
1674 },
1675 2,
1676 {InstanceType::FIXED_ARRAY_TYPE, InstanceType::FIXED_ARRAY_TYPE}},
1677 {"var a = 1;\na=2;",
1678 5 * kPointerSize,
1679 1,
1680 52,
1681 {
1682 B(Ldar), R(Register::function_closure().index()), //
1683 B(Star), R(2), //
1684 B(LdaConstant), U8(0), //
1685 B(Star), R(3), //
1686 B(CallRuntime), U16(Runtime::kNewScriptContext), R(2), U8(2), //
1687 B(PushContext), R(1), //
1688 B(LdaConstant), U8(1), //
1689 B(Star), R(2), //
1690 B(LdaZero), //
1691 B(Star), R(3), //
1692 B(CallRuntime), U16(Runtime::kDeclareGlobals), R(2), U8(2), //
1693 B(LdaConstant), U8(2), //
1694 B(Star), R(2), //
1695 B(LdaZero), //
1696 B(Star), R(3), //
1697 B(LdaSmi8), U8(1), //
1698 B(Star), R(4), //
1699 B(CallRuntime), U16(Runtime::kInitializeVarGlobal), R(2), //
1700 U8(3), //
1701 B(LdaSmi8), U8(2), //
1702 B(StaGlobalSloppy), _, //
1703 B(Star), R(0), //
1704 B(Ldar), R(0), //
1705 B(Return) //
1706 },
1707 3,
1708 {InstanceType::FIXED_ARRAY_TYPE, InstanceType::FIXED_ARRAY_TYPE,
1709 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}},
1710 {"function f() {}\nf();",
1711 4 * kPointerSize,
1712 1,
1713 43,
1714 {
1715 B(Ldar), R(Register::function_closure().index()), //
1716 B(Star), R(2), //
1717 B(LdaConstant), U8(0), //
1718 B(Star), R(3), //
1719 B(CallRuntime), U16(Runtime::kNewScriptContext), R(2), U8(2), //
1720 B(PushContext), R(1), //
1721 B(LdaConstant), U8(1), //
1722 B(Star), R(2), //
1723 B(LdaZero), //
1724 B(Star), R(3), //
1725 B(CallRuntime), U16(Runtime::kDeclareGlobals), R(2), U8(2), //
1726 B(LdaUndefined), //
1727 B(Star), R(3), //
1728 B(LdaGlobal), _, //
1729 B(Star), R(2), //
1730 B(Call), R(2), R(3), U8(0), //
1731 B(Star), R(0), //
1732 B(Ldar), R(0), //
1733 B(Return) //
1734 },
1735 2,
1736 {InstanceType::FIXED_ARRAY_TYPE, InstanceType::FIXED_ARRAY_TYPE}},
1737 };
1738
1739 for (size_t i = 0; i < arraysize(snippets); i++) {
1740 Handle<BytecodeArray> bytecode_array =
1741 helper.MakeTopLevelBytecode(snippets[i].code_snippet);
1742 CheckBytecodeArrayEqual(snippets[i], bytecode_array, true);
1743 }
1744 }
1745
1746
1747 TEST(BasicLoops) { 1685 TEST(BasicLoops) {
1748 InitializedHandleScope handle_scope; 1686 InitializedHandleScope handle_scope;
1749 BytecodeGeneratorHelper helper; 1687 BytecodeGeneratorHelper helper;
1750 1688
1751 ExpectedSnippet<int> snippets[] = { 1689 ExpectedSnippet<int> snippets[] = {
1752 {"var x = 0;" 1690 {"var x = 0;"
1753 "var y = 1;" 1691 "var y = 1;"
1754 "while (x < 10) {" 1692 "while (x < 10) {"
1755 " y = y * 12;" 1693 " y = y * 12;"
1756 " x = x + 1;" 1694 " x = x + 1;"
(...skipping 915 matching lines...) Expand 10 before | Expand all | Expand 10 after
2672 }; 2610 };
2673 2611
2674 for (size_t i = 0; i < arraysize(snippets); i++) { 2612 for (size_t i = 0; i < arraysize(snippets); i++) {
2675 Handle<BytecodeArray> bytecode_array = 2613 Handle<BytecodeArray> bytecode_array =
2676 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); 2614 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet);
2677 CheckBytecodeArrayEqual(snippets[i], bytecode_array); 2615 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
2678 } 2616 }
2679 } 2617 }
2680 2618
2681 2619
2682 // Tests !FLAG_global_var_shortcuts mode.
2683 TEST(TopLevelObjectLiterals) { 2620 TEST(TopLevelObjectLiterals) {
2684 InitializedHandleScope handle_scope; 2621 InitializedHandleScope handle_scope;
2685 BytecodeGeneratorHelper helper; 2622 BytecodeGeneratorHelper helper;
2686 2623
2687 if (FLAG_global_var_shortcuts) return;
2688
2689 int has_function_flags = ObjectLiteral::kFastElements | 2624 int has_function_flags = ObjectLiteral::kFastElements |
2690 ObjectLiteral::kHasFunction | 2625 ObjectLiteral::kHasFunction |
2691 ObjectLiteral::kDisableMementos; 2626 ObjectLiteral::kDisableMementos;
2692 ExpectedSnippet<InstanceType> snippets[] = { 2627 ExpectedSnippet<InstanceType> snippets[] = {
2693 {"var a = { func: function() { } };", 2628 {"var a = { func: function() { } };",
2694 6 * kPointerSize, 2629 6 * kPointerSize,
2695 1, 2630 1,
2696 54, 2631 54,
2697 { 2632 {
2698 B(LdaConstant), U8(0), // 2633 B(LdaConstant), U8(0), //
(...skipping 29 matching lines...) Expand all
2728 }; 2663 };
2729 2664
2730 for (size_t i = 0; i < arraysize(snippets); i++) { 2665 for (size_t i = 0; i < arraysize(snippets); i++) {
2731 Handle<BytecodeArray> bytecode_array = 2666 Handle<BytecodeArray> bytecode_array =
2732 helper.MakeTopLevelBytecode(snippets[i].code_snippet); 2667 helper.MakeTopLevelBytecode(snippets[i].code_snippet);
2733 CheckBytecodeArrayEqual(snippets[i], bytecode_array); 2668 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
2734 } 2669 }
2735 } 2670 }
2736 2671
2737 2672
2738 // Tests FLAG_global_var_shortcuts mode.
2739 // TODO(ishell): remove when FLAG_global_var_shortcuts is removed.
2740 TEST(TopLevelObjectLiterals2) {
2741 InitializedHandleScope handle_scope;
2742 BytecodeGeneratorHelper helper;
2743
2744 if (!FLAG_global_var_shortcuts) return;
2745
2746 int has_function_flags = ObjectLiteral::kFastElements |
2747 ObjectLiteral::kHasFunction |
2748 ObjectLiteral::kDisableMementos;
2749 ExpectedSnippet<InstanceType> snippets[] = {
2750 {"var a = { func: function() { } };",
2751 7 * kPointerSize,
2752 1,
2753 69,
2754 {
2755 B(Ldar), R(Register::function_closure().index()), //
2756 B(Star), R(2), //
2757 B(LdaConstant), U8(0), //
2758 B(Star), R(3), //
2759 B(CallRuntime), U16(Runtime::kNewScriptContext), R(2), U8(2), //
2760 B(PushContext), R(1), //
2761 B(LdaConstant), U8(1), //
2762 B(Star), R(2), //
2763 B(LdaZero), //
2764 B(Star), R(3), //
2765 B(CallRuntime), U16(Runtime::kDeclareGlobals), R(2), U8(2), //
2766 B(LdaConstant), U8(2), //
2767 B(Star), R(2), //
2768 B(LdaZero), //
2769 B(Star), R(3), //
2770 B(LdaConstant), U8(3), //
2771 B(CreateObjectLiteral), U8(0), U8(has_function_flags), //
2772 B(Star), R(5), //
2773 B(LdaConstant), U8(4), //
2774 B(Star), R(6), //
2775 B(LdaConstant), U8(5), //
2776 B(CreateClosure), U8(1), //
2777 B(StoreICSloppy), R(5), R(6), U8(3), //
2778 B(CallRuntime), U16(Runtime::kToFastProperties), R(5), U8(1), //
2779 B(Ldar), R(5), //
2780 B(Star), R(4), //
2781 B(CallRuntime), U16(Runtime::kInitializeVarGlobal), R(2), U8(3), //
2782 B(LdaUndefined), //
2783 B(Return),
2784 },
2785 6,
2786 {InstanceType::FIXED_ARRAY_TYPE,
2787 InstanceType::FIXED_ARRAY_TYPE,
2788 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE,
2789 InstanceType::FIXED_ARRAY_TYPE,
2790 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE,
2791 InstanceType::SHARED_FUNCTION_INFO_TYPE}},
2792 };
2793
2794 for (size_t i = 0; i < arraysize(snippets); i++) {
2795 Handle<BytecodeArray> bytecode_array =
2796 helper.MakeTopLevelBytecode(snippets[i].code_snippet);
2797 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
2798 }
2799 }
2800
2801
2802 TEST(TryCatch) { 2673 TEST(TryCatch) {
2803 InitializedHandleScope handle_scope; 2674 InitializedHandleScope handle_scope;
2804 BytecodeGeneratorHelper helper; 2675 BytecodeGeneratorHelper helper;
2805 2676
2806 // TODO(rmcilroy): modify tests when we have real try catch support. 2677 // TODO(rmcilroy): modify tests when we have real try catch support.
2807 ExpectedSnippet<int> snippets[] = { 2678 ExpectedSnippet<int> snippets[] = {
2808 {"try { return 1; } catch(e) { return 2; }", 2679 {"try { return 1; } catch(e) { return 2; }",
2809 kPointerSize, 2680 kPointerSize,
2810 1, 2681 1,
2811 5, 2682 5,
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
2915 }; 2786 };
2916 2787
2917 for (size_t i = 0; i < arraysize(snippets); i++) { 2788 for (size_t i = 0; i < arraysize(snippets); i++) {
2918 Handle<BytecodeArray> bytecode_array = 2789 Handle<BytecodeArray> bytecode_array =
2919 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); 2790 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet);
2920 CheckBytecodeArrayEqual(snippets[i], bytecode_array); 2791 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
2921 } 2792 }
2922 } 2793 }
2923 2794
2924 2795
2925 // Tests !FLAG_global_var_shortcuts mode.
2926 TEST(CallNew) { 2796 TEST(CallNew) {
2927 InitializedHandleScope handle_scope; 2797 InitializedHandleScope handle_scope;
2928 BytecodeGeneratorHelper helper; 2798 BytecodeGeneratorHelper helper;
2929 Zone zone; 2799 Zone zone;
2930 2800
2931 if (FLAG_global_var_shortcuts) return;
2932
2933 int context_reg = Register::function_context().index(); 2801 int context_reg = Register::function_context().index();
2934 int global_index = Context::GLOBAL_OBJECT_INDEX; 2802 int global_index = Context::GLOBAL_OBJECT_INDEX;
2935 2803
2936 FeedbackVectorSpec feedback_spec(&zone); 2804 FeedbackVectorSpec feedback_spec(&zone);
2937 FeedbackVectorSlot slot1 = feedback_spec.AddGeneralSlot(); 2805 FeedbackVectorSlot slot1 = feedback_spec.AddGeneralSlot();
2938 FeedbackVectorSlot slot2 = feedback_spec.AddLoadICSlot(); 2806 FeedbackVectorSlot slot2 = feedback_spec.AddLoadICSlot();
2939 USE(slot1); 2807 USE(slot1);
2940 2808
2941 Handle<i::TypeFeedbackVector> vector = 2809 Handle<i::TypeFeedbackVector> vector =
2942 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec); 2810 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec);
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
3009 }; 2877 };
3010 2878
3011 for (size_t i = 0; i < arraysize(snippets); i++) { 2879 for (size_t i = 0; i < arraysize(snippets); i++) {
3012 Handle<BytecodeArray> bytecode_array = 2880 Handle<BytecodeArray> bytecode_array =
3013 helper.MakeBytecode(snippets[i].code_snippet, "f"); 2881 helper.MakeBytecode(snippets[i].code_snippet, "f");
3014 CheckBytecodeArrayEqual(snippets[i], bytecode_array, true); 2882 CheckBytecodeArrayEqual(snippets[i], bytecode_array, true);
3015 } 2883 }
3016 } 2884 }
3017 2885
3018 2886
3019 // Tests FLAG_global_var_shortcuts mode.
3020 // TODO(ishell): remove when FLAG_global_var_shortcuts is removed.
3021 TEST(CallNew2) {
3022 InitializedHandleScope handle_scope;
3023 BytecodeGeneratorHelper helper;
3024
3025 if (!FLAG_global_var_shortcuts) return;
3026
3027 ExpectedSnippet<InstanceType> snippets[] = {
3028 {"function bar() { this.value = 0; }\n"
3029 "function f() { return new bar(); }\n"
3030 "f()",
3031 kPointerSize,
3032 1,
3033 9,
3034 {
3035 B(LdaGlobal), _, //
3036 B(Star), R(0), //
3037 B(New), R(0), R(0), U8(0), //
3038 B(Return), //
3039 },
3040 0},
3041 {"function bar(x) { this.value = 18; this.x = x;}\n"
3042 "function f() { return new bar(3); }\n"
3043 "f()",
3044 2 * kPointerSize,
3045 1,
3046 13,
3047 {
3048 B(LdaGlobal), _, //
3049 B(Star), R(0), //
3050 B(LdaSmi8), U8(3), //
3051 B(Star), R(1), //
3052 B(New), R(0), R(1), U8(1), //
3053 B(Return), //
3054 },
3055 0},
3056 {"function bar(w, x, y, z) {\n"
3057 " this.value = 18;\n"
3058 " this.x = x;\n"
3059 " this.y = y;\n"
3060 " this.z = z;\n"
3061 "}\n"
3062 "function f() { return new bar(3, 4, 5); }\n"
3063 "f()",
3064 4 * kPointerSize,
3065 1,
3066 21,
3067 {
3068 B(LdaGlobal), _, //
3069 B(Star), R(0), //
3070 B(LdaSmi8), U8(3), //
3071 B(Star), R(1), //
3072 B(LdaSmi8), U8(4), //
3073 B(Star), R(2), //
3074 B(LdaSmi8), U8(5), //
3075 B(Star), R(3), //
3076 B(New), R(0), R(1), U8(3), //
3077 B(Return), //
3078 },
3079 0}};
3080
3081 for (size_t i = 0; i < arraysize(snippets); i++) {
3082 Handle<BytecodeArray> bytecode_array =
3083 helper.MakeBytecode(snippets[i].code_snippet, "f");
3084 CheckBytecodeArrayEqual(snippets[i], bytecode_array, true);
3085 }
3086 }
3087
3088
3089 TEST(ContextVariables) { 2887 TEST(ContextVariables) {
3090 InitializedHandleScope handle_scope; 2888 InitializedHandleScope handle_scope;
3091 BytecodeGeneratorHelper helper; 2889 BytecodeGeneratorHelper helper;
3092 2890
3093 int closure = Register::function_closure().index(); 2891 int closure = Register::function_closure().index();
3094 int first_context_slot = Context::MIN_CONTEXT_SLOTS; 2892 int first_context_slot = Context::MIN_CONTEXT_SLOTS;
3095 ExpectedSnippet<InstanceType> snippets[] = { 2893 ExpectedSnippet<InstanceType> snippets[] = {
3096 {"var a; return function() { a = 1; };", 2894 {"var a; return function() { a = 1; };",
3097 1 * kPointerSize, 2895 1 * kPointerSize,
3098 1, 2896 1,
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after
3284 for (size_t i = 0; i < arraysize(snippets); i++) { 3082 for (size_t i = 0; i < arraysize(snippets); i++) {
3285 Handle<BytecodeArray> bytecode_array = 3083 Handle<BytecodeArray> bytecode_array =
3286 helper.MakeBytecodeForFunction(snippets[i].code_snippet); 3084 helper.MakeBytecodeForFunction(snippets[i].code_snippet);
3287 CheckBytecodeArrayEqual(snippets[i], bytecode_array); 3085 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
3288 } 3086 }
3289 } 3087 }
3290 3088
3291 } // namespace interpreter 3089 } // namespace interpreter
3292 } // namespace internal 3090 } // namespace internal
3293 } // namespace v8 3091 } // namespace v8
OLDNEW
« no previous file with comments | « src/interpreter/interpreter.cc ('k') | test/unittests/compiler/js-type-feedback-unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698