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/bytecode-generator.h" | 5 #include "src/interpreter/bytecode-generator.h" |
6 | 6 |
7 #include "src/ast/scopes.h" | 7 #include "src/ast/scopes.h" |
8 #include "src/compiler.h" | 8 #include "src/compiler.h" |
9 #include "src/interpreter/control-flow-builders.h" | 9 #include "src/interpreter/control-flow-builders.h" |
10 #include "src/objects.h" | 10 #include "src/objects.h" |
(...skipping 826 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
837 case VARIABLE: { | 837 case VARIABLE: { |
838 Variable* variable = expr->AsVariableProxy()->var(); | 838 Variable* variable = expr->AsVariableProxy()->var(); |
839 VisitVariableAssignment(variable, slot); | 839 VisitVariableAssignment(variable, slot); |
840 break; | 840 break; |
841 } | 841 } |
842 case NAMED_PROPERTY: { | 842 case NAMED_PROPERTY: { |
843 TemporaryRegisterScope temporary_register_scope(builder()); | 843 TemporaryRegisterScope temporary_register_scope(builder()); |
844 Register value = temporary_register_scope.NewRegister(); | 844 Register value = temporary_register_scope.NewRegister(); |
845 builder()->StoreAccumulatorInRegister(value); | 845 builder()->StoreAccumulatorInRegister(value); |
846 Register object = VisitForRegisterValue(property->obj()); | 846 Register object = VisitForRegisterValue(property->obj()); |
847 size_t name_index = builder()->GetConstantPoolEntry( | 847 Handle<String> name = property->key()->AsLiteral()->AsPropertyName(); |
848 property->key()->AsLiteral()->AsPropertyName()); | 848 builder()->StoreNamedProperty(object, name, feedback_index(slot), |
849 builder()->StoreNamedProperty(object, name_index, feedback_index(slot), | |
850 language_mode()); | 849 language_mode()); |
851 break; | 850 break; |
852 } | 851 } |
853 case KEYED_PROPERTY: { | 852 case KEYED_PROPERTY: { |
854 TemporaryRegisterScope temporary_register_scope(builder()); | 853 TemporaryRegisterScope temporary_register_scope(builder()); |
855 Register value = temporary_register_scope.NewRegister(); | 854 Register value = temporary_register_scope.NewRegister(); |
856 builder()->StoreAccumulatorInRegister(value); | 855 builder()->StoreAccumulatorInRegister(value); |
857 Register object = VisitForRegisterValue(property->obj()); | 856 Register object = VisitForRegisterValue(property->obj()); |
858 Register key = VisitForRegisterValue(property->key()); | 857 Register key = VisitForRegisterValue(property->key()); |
859 builder()->LoadAccumulatorWithRegister(value); | 858 builder()->LoadAccumulatorWithRegister(value); |
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1057 case ObjectLiteral::Property::CONSTANT: | 1056 case ObjectLiteral::Property::CONSTANT: |
1058 UNREACHABLE(); | 1057 UNREACHABLE(); |
1059 case ObjectLiteral::Property::MATERIALIZED_LITERAL: | 1058 case ObjectLiteral::Property::MATERIALIZED_LITERAL: |
1060 DCHECK(!CompileTimeValue::IsCompileTimeValue(property->value())); | 1059 DCHECK(!CompileTimeValue::IsCompileTimeValue(property->value())); |
1061 // Fall through. | 1060 // Fall through. |
1062 case ObjectLiteral::Property::COMPUTED: { | 1061 case ObjectLiteral::Property::COMPUTED: { |
1063 // It is safe to use [[Put]] here because the boilerplate already | 1062 // It is safe to use [[Put]] here because the boilerplate already |
1064 // contains computed properties with an uninitialized value. | 1063 // contains computed properties with an uninitialized value. |
1065 if (literal_key->value()->IsInternalizedString()) { | 1064 if (literal_key->value()->IsInternalizedString()) { |
1066 if (property->emit_store()) { | 1065 if (property->emit_store()) { |
1067 size_t name_index = | |
1068 builder()->GetConstantPoolEntry(literal_key->AsPropertyName()); | |
1069 VisitForAccumulatorValue(property->value()); | 1066 VisitForAccumulatorValue(property->value()); |
1070 builder()->StoreNamedProperty(literal, name_index, | 1067 builder()->StoreNamedProperty( |
1071 feedback_index(property->GetSlot(0)), | 1068 literal, literal_key->AsPropertyName(), |
1072 language_mode()); | 1069 feedback_index(property->GetSlot(0)), language_mode()); |
1073 } else { | 1070 } else { |
1074 VisitForEffect(property->value()); | 1071 VisitForEffect(property->value()); |
1075 } | 1072 } |
1076 } else { | 1073 } else { |
1077 inner_temporary_register_scope.PrepareForConsecutiveAllocations(3); | 1074 inner_temporary_register_scope.PrepareForConsecutiveAllocations(3); |
1078 Register key = | 1075 Register key = |
1079 inner_temporary_register_scope.NextConsecutiveRegister(); | 1076 inner_temporary_register_scope.NextConsecutiveRegister(); |
1080 Register value = | 1077 Register value = |
1081 inner_temporary_register_scope.NextConsecutiveRegister(); | 1078 inner_temporary_register_scope.NextConsecutiveRegister(); |
1082 Register language = | 1079 Register language = |
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1284 case VariableLocation::PARAMETER: { | 1281 case VariableLocation::PARAMETER: { |
1285 // The parameter indices are shifted by 1 (receiver is variable | 1282 // The parameter indices are shifted by 1 (receiver is variable |
1286 // index -1 but is parameter index 0 in BytecodeArrayBuilder). | 1283 // index -1 but is parameter index 0 in BytecodeArrayBuilder). |
1287 Register source = builder()->Parameter(variable->index() + 1); | 1284 Register source = builder()->Parameter(variable->index() + 1); |
1288 source = assignment_hazard_helper()->GetRegisterForLoad(source); | 1285 source = assignment_hazard_helper()->GetRegisterForLoad(source); |
1289 execution_result()->SetResultInRegister(source); | 1286 execution_result()->SetResultInRegister(source); |
1290 break; | 1287 break; |
1291 } | 1288 } |
1292 case VariableLocation::GLOBAL: | 1289 case VariableLocation::GLOBAL: |
1293 case VariableLocation::UNALLOCATED: { | 1290 case VariableLocation::UNALLOCATED: { |
1294 size_t name_index = builder()->GetConstantPoolEntry(variable->name()); | 1291 builder()->LoadGlobal(variable->name(), feedback_index(slot), |
1295 builder()->LoadGlobal(name_index, feedback_index(slot), language_mode(), | 1292 language_mode(), typeof_mode); |
1296 typeof_mode); | |
1297 execution_result()->SetResultInAccumulator(); | 1293 execution_result()->SetResultInAccumulator(); |
1298 break; | 1294 break; |
1299 } | 1295 } |
1300 case VariableLocation::CONTEXT: { | 1296 case VariableLocation::CONTEXT: { |
1301 int depth = execution_context()->ContextChainDepth(variable->scope()); | 1297 int depth = execution_context()->ContextChainDepth(variable->scope()); |
1302 ContextScope* context = execution_context()->Previous(depth); | 1298 ContextScope* context = execution_context()->Previous(depth); |
1303 Register context_reg; | 1299 Register context_reg; |
1304 if (context) { | 1300 if (context) { |
1305 context_reg = context->reg(); | 1301 context_reg = context->reg(); |
1306 } else { | 1302 } else { |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1365 // index -1 but is parameter index 0 in BytecodeArrayBuilder). | 1361 // index -1 but is parameter index 0 in BytecodeArrayBuilder). |
1366 Register destination(builder()->Parameter(variable->index() + 1)); | 1362 Register destination(builder()->Parameter(variable->index() + 1)); |
1367 destination = | 1363 destination = |
1368 assignment_hazard_helper()->GetRegisterForStore(destination); | 1364 assignment_hazard_helper()->GetRegisterForStore(destination); |
1369 | 1365 |
1370 builder()->StoreAccumulatorInRegister(destination); | 1366 builder()->StoreAccumulatorInRegister(destination); |
1371 break; | 1367 break; |
1372 } | 1368 } |
1373 case VariableLocation::GLOBAL: | 1369 case VariableLocation::GLOBAL: |
1374 case VariableLocation::UNALLOCATED: { | 1370 case VariableLocation::UNALLOCATED: { |
1375 size_t name_index = builder()->GetConstantPoolEntry(variable->name()); | 1371 builder()->StoreGlobal(variable->name(), feedback_index(slot), |
1376 builder()->StoreGlobal(name_index, feedback_index(slot), language_mode()); | 1372 language_mode()); |
1377 break; | 1373 break; |
1378 } | 1374 } |
1379 case VariableLocation::CONTEXT: { | 1375 case VariableLocation::CONTEXT: { |
1380 // TODO(rmcilroy): support const mode initialization. | 1376 // TODO(rmcilroy): support const mode initialization. |
1381 int depth = execution_context()->ContextChainDepth(variable->scope()); | 1377 int depth = execution_context()->ContextChainDepth(variable->scope()); |
1382 ContextScope* context = execution_context()->Previous(depth); | 1378 ContextScope* context = execution_context()->Previous(depth); |
1383 Register context_reg; | 1379 Register context_reg; |
1384 if (context) { | 1380 if (context) { |
1385 context_reg = context->reg(); | 1381 context_reg = context->reg(); |
1386 } else { | 1382 } else { |
(...skipping 22 matching lines...) Expand all Loading... |
1409 builder()->StoreLookupSlot(variable->name(), language_mode()); | 1405 builder()->StoreLookupSlot(variable->name(), language_mode()); |
1410 break; | 1406 break; |
1411 } | 1407 } |
1412 } | 1408 } |
1413 } | 1409 } |
1414 | 1410 |
1415 | 1411 |
1416 void BytecodeGenerator::VisitAssignment(Assignment* expr) { | 1412 void BytecodeGenerator::VisitAssignment(Assignment* expr) { |
1417 DCHECK(expr->target()->IsValidReferenceExpression()); | 1413 DCHECK(expr->target()->IsValidReferenceExpression()); |
1418 Register object, key; | 1414 Register object, key; |
1419 size_t name_index = kMaxUInt32; | 1415 Handle<String> name; |
1420 | 1416 |
1421 // Left-hand side can only be a property, a global or a variable slot. | 1417 // Left-hand side can only be a property, a global or a variable slot. |
1422 Property* property = expr->target()->AsProperty(); | 1418 Property* property = expr->target()->AsProperty(); |
1423 LhsKind assign_type = Property::GetAssignType(property); | 1419 LhsKind assign_type = Property::GetAssignType(property); |
1424 | 1420 |
1425 // Evaluate LHS expression. | 1421 // Evaluate LHS expression. |
1426 switch (assign_type) { | 1422 switch (assign_type) { |
1427 case VARIABLE: | 1423 case VARIABLE: |
1428 // Nothing to do to evaluate variable assignment LHS. | 1424 // Nothing to do to evaluate variable assignment LHS. |
1429 break; | 1425 break; |
1430 case NAMED_PROPERTY: { | 1426 case NAMED_PROPERTY: { |
1431 object = VisitForRegisterValue(property->obj()); | 1427 object = VisitForRegisterValue(property->obj()); |
1432 name_index = builder()->GetConstantPoolEntry( | 1428 name = property->key()->AsLiteral()->AsPropertyName(); |
1433 property->key()->AsLiteral()->AsPropertyName()); | |
1434 break; | 1429 break; |
1435 } | 1430 } |
1436 case KEYED_PROPERTY: { | 1431 case KEYED_PROPERTY: { |
1437 object = VisitForRegisterValue(property->obj()); | 1432 object = VisitForRegisterValue(property->obj()); |
1438 if (expr->is_compound()) { | 1433 if (expr->is_compound()) { |
1439 // Use VisitForAccumulator and store to register so that the key is | 1434 // Use VisitForAccumulator and store to register so that the key is |
1440 // still in the accumulator for loading the old value below. | 1435 // still in the accumulator for loading the old value below. |
1441 key = execution_result()->NewRegister(); | 1436 key = execution_result()->NewRegister(); |
1442 VisitForAccumulatorValue(property->key()); | 1437 VisitForAccumulatorValue(property->key()); |
1443 builder()->StoreAccumulatorInRegister(key); | 1438 builder()->StoreAccumulatorInRegister(key); |
(...skipping 15 matching lines...) Expand all Loading... |
1459 case VARIABLE: { | 1454 case VARIABLE: { |
1460 VariableProxy* proxy = expr->target()->AsVariableProxy(); | 1455 VariableProxy* proxy = expr->target()->AsVariableProxy(); |
1461 old_value = VisitVariableLoadForRegisterValue( | 1456 old_value = VisitVariableLoadForRegisterValue( |
1462 proxy->var(), proxy->VariableFeedbackSlot()); | 1457 proxy->var(), proxy->VariableFeedbackSlot()); |
1463 break; | 1458 break; |
1464 } | 1459 } |
1465 case NAMED_PROPERTY: { | 1460 case NAMED_PROPERTY: { |
1466 FeedbackVectorSlot slot = property->PropertyFeedbackSlot(); | 1461 FeedbackVectorSlot slot = property->PropertyFeedbackSlot(); |
1467 old_value = execution_result()->NewRegister(); | 1462 old_value = execution_result()->NewRegister(); |
1468 builder() | 1463 builder() |
1469 ->LoadNamedProperty(object, name_index, feedback_index(slot), | 1464 ->LoadNamedProperty(object, name, feedback_index(slot), |
1470 language_mode()) | 1465 language_mode()) |
1471 .StoreAccumulatorInRegister(old_value); | 1466 .StoreAccumulatorInRegister(old_value); |
1472 break; | 1467 break; |
1473 } | 1468 } |
1474 case KEYED_PROPERTY: { | 1469 case KEYED_PROPERTY: { |
1475 // Key is already in accumulator at this point due to evaluating the | 1470 // Key is already in accumulator at this point due to evaluating the |
1476 // LHS above. | 1471 // LHS above. |
1477 FeedbackVectorSlot slot = property->PropertyFeedbackSlot(); | 1472 FeedbackVectorSlot slot = property->PropertyFeedbackSlot(); |
1478 old_value = execution_result()->NewRegister(); | 1473 old_value = execution_result()->NewRegister(); |
1479 builder() | 1474 builder() |
(...skipping 17 matching lines...) Expand all Loading... |
1497 FeedbackVectorSlot slot = expr->AssignmentSlot(); | 1492 FeedbackVectorSlot slot = expr->AssignmentSlot(); |
1498 switch (assign_type) { | 1493 switch (assign_type) { |
1499 case VARIABLE: { | 1494 case VARIABLE: { |
1500 // TODO(oth): The VisitVariableAssignment() call is hard to reason about. | 1495 // TODO(oth): The VisitVariableAssignment() call is hard to reason about. |
1501 // Is the value in the accumulator safe? Yes, but scary. | 1496 // Is the value in the accumulator safe? Yes, but scary. |
1502 Variable* variable = expr->target()->AsVariableProxy()->var(); | 1497 Variable* variable = expr->target()->AsVariableProxy()->var(); |
1503 VisitVariableAssignment(variable, slot); | 1498 VisitVariableAssignment(variable, slot); |
1504 break; | 1499 break; |
1505 } | 1500 } |
1506 case NAMED_PROPERTY: | 1501 case NAMED_PROPERTY: |
1507 builder()->StoreNamedProperty(object, name_index, feedback_index(slot), | 1502 builder()->StoreNamedProperty(object, name, feedback_index(slot), |
1508 language_mode()); | 1503 language_mode()); |
1509 break; | 1504 break; |
1510 case KEYED_PROPERTY: | 1505 case KEYED_PROPERTY: |
1511 builder()->StoreKeyedProperty(object, key, feedback_index(slot), | 1506 builder()->StoreKeyedProperty(object, key, feedback_index(slot), |
1512 language_mode()); | 1507 language_mode()); |
1513 break; | 1508 break; |
1514 case NAMED_SUPER_PROPERTY: | 1509 case NAMED_SUPER_PROPERTY: |
1515 case KEYED_SUPER_PROPERTY: | 1510 case KEYED_SUPER_PROPERTY: |
1516 UNIMPLEMENTED(); | 1511 UNIMPLEMENTED(); |
1517 } | 1512 } |
(...skipping 10 matching lines...) Expand all Loading... |
1528 } | 1523 } |
1529 | 1524 |
1530 | 1525 |
1531 void BytecodeGenerator::VisitPropertyLoad(Register obj, Property* expr) { | 1526 void BytecodeGenerator::VisitPropertyLoad(Register obj, Property* expr) { |
1532 LhsKind property_kind = Property::GetAssignType(expr); | 1527 LhsKind property_kind = Property::GetAssignType(expr); |
1533 FeedbackVectorSlot slot = expr->PropertyFeedbackSlot(); | 1528 FeedbackVectorSlot slot = expr->PropertyFeedbackSlot(); |
1534 switch (property_kind) { | 1529 switch (property_kind) { |
1535 case VARIABLE: | 1530 case VARIABLE: |
1536 UNREACHABLE(); | 1531 UNREACHABLE(); |
1537 case NAMED_PROPERTY: { | 1532 case NAMED_PROPERTY: { |
1538 size_t name_index = builder()->GetConstantPoolEntry( | 1533 builder()->LoadNamedProperty(obj, |
1539 expr->key()->AsLiteral()->AsPropertyName()); | 1534 expr->key()->AsLiteral()->AsPropertyName(), |
1540 builder()->LoadNamedProperty(obj, name_index, feedback_index(slot), | 1535 feedback_index(slot), language_mode()); |
1541 language_mode()); | |
1542 break; | 1536 break; |
1543 } | 1537 } |
1544 case KEYED_PROPERTY: { | 1538 case KEYED_PROPERTY: { |
1545 VisitForAccumulatorValue(expr->key()); | 1539 VisitForAccumulatorValue(expr->key()); |
1546 builder()->LoadKeyedProperty(obj, feedback_index(slot), language_mode()); | 1540 builder()->LoadKeyedProperty(obj, feedback_index(slot), language_mode()); |
1547 break; | 1541 break; |
1548 } | 1542 } |
1549 case NAMED_SUPER_PROPERTY: | 1543 case NAMED_SUPER_PROPERTY: |
1550 case KEYED_SUPER_PROPERTY: | 1544 case KEYED_SUPER_PROPERTY: |
1551 UNIMPLEMENTED(); | 1545 UNIMPLEMENTED(); |
(...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1817 | 1811 |
1818 // Left-hand side can only be a property, a global or a variable slot. | 1812 // Left-hand side can only be a property, a global or a variable slot. |
1819 Property* property = expr->expression()->AsProperty(); | 1813 Property* property = expr->expression()->AsProperty(); |
1820 LhsKind assign_type = Property::GetAssignType(property); | 1814 LhsKind assign_type = Property::GetAssignType(property); |
1821 | 1815 |
1822 // TODO(rmcilroy): Set is_postfix to false if visiting for effect. | 1816 // TODO(rmcilroy): Set is_postfix to false if visiting for effect. |
1823 bool is_postfix = expr->is_postfix(); | 1817 bool is_postfix = expr->is_postfix(); |
1824 | 1818 |
1825 // Evaluate LHS expression and get old value. | 1819 // Evaluate LHS expression and get old value. |
1826 Register obj, key, old_value; | 1820 Register obj, key, old_value; |
1827 size_t name_index = kMaxUInt32; | 1821 Handle<String> name; |
1828 switch (assign_type) { | 1822 switch (assign_type) { |
1829 case VARIABLE: { | 1823 case VARIABLE: { |
1830 VariableProxy* proxy = expr->expression()->AsVariableProxy(); | 1824 VariableProxy* proxy = expr->expression()->AsVariableProxy(); |
1831 VisitVariableLoadForAccumulatorValue(proxy->var(), | 1825 VisitVariableLoadForAccumulatorValue(proxy->var(), |
1832 proxy->VariableFeedbackSlot()); | 1826 proxy->VariableFeedbackSlot()); |
1833 break; | 1827 break; |
1834 } | 1828 } |
1835 case NAMED_PROPERTY: { | 1829 case NAMED_PROPERTY: { |
1836 FeedbackVectorSlot slot = property->PropertyFeedbackSlot(); | 1830 FeedbackVectorSlot slot = property->PropertyFeedbackSlot(); |
1837 obj = VisitForRegisterValue(property->obj()); | 1831 obj = VisitForRegisterValue(property->obj()); |
1838 name_index = builder()->GetConstantPoolEntry( | 1832 name = property->key()->AsLiteral()->AsPropertyName(); |
1839 property->key()->AsLiteral()->AsPropertyName()); | 1833 builder()->LoadNamedProperty(obj, name, feedback_index(slot), |
1840 builder()->LoadNamedProperty(obj, name_index, feedback_index(slot), | |
1841 language_mode()); | 1834 language_mode()); |
1842 break; | 1835 break; |
1843 } | 1836 } |
1844 case KEYED_PROPERTY: { | 1837 case KEYED_PROPERTY: { |
1845 FeedbackVectorSlot slot = property->PropertyFeedbackSlot(); | 1838 FeedbackVectorSlot slot = property->PropertyFeedbackSlot(); |
1846 obj = VisitForRegisterValue(property->obj()); | 1839 obj = VisitForRegisterValue(property->obj()); |
1847 // Use visit for accumulator here since we need the key in the accumulator | 1840 // Use visit for accumulator here since we need the key in the accumulator |
1848 // for the LoadKeyedProperty. | 1841 // for the LoadKeyedProperty. |
1849 key = execution_result()->NewRegister(); | 1842 key = execution_result()->NewRegister(); |
1850 VisitForAccumulatorValue(property->key()); | 1843 VisitForAccumulatorValue(property->key()); |
(...skipping 22 matching lines...) Expand all Loading... |
1873 | 1866 |
1874 // Store the value. | 1867 // Store the value. |
1875 FeedbackVectorSlot feedback_slot = expr->CountSlot(); | 1868 FeedbackVectorSlot feedback_slot = expr->CountSlot(); |
1876 switch (assign_type) { | 1869 switch (assign_type) { |
1877 case VARIABLE: { | 1870 case VARIABLE: { |
1878 Variable* variable = expr->expression()->AsVariableProxy()->var(); | 1871 Variable* variable = expr->expression()->AsVariableProxy()->var(); |
1879 VisitVariableAssignment(variable, feedback_slot); | 1872 VisitVariableAssignment(variable, feedback_slot); |
1880 break; | 1873 break; |
1881 } | 1874 } |
1882 case NAMED_PROPERTY: { | 1875 case NAMED_PROPERTY: { |
1883 builder()->StoreNamedProperty( | 1876 builder()->StoreNamedProperty(obj, name, feedback_index(feedback_slot), |
1884 obj, name_index, feedback_index(feedback_slot), language_mode()); | 1877 language_mode()); |
1885 break; | 1878 break; |
1886 } | 1879 } |
1887 case KEYED_PROPERTY: { | 1880 case KEYED_PROPERTY: { |
1888 builder()->StoreKeyedProperty(obj, key, feedback_index(feedback_slot), | 1881 builder()->StoreKeyedProperty(obj, key, feedback_index(feedback_slot), |
1889 language_mode()); | 1882 language_mode()); |
1890 break; | 1883 break; |
1891 } | 1884 } |
1892 case NAMED_SUPER_PROPERTY: | 1885 case NAMED_SUPER_PROPERTY: |
1893 case KEYED_SUPER_PROPERTY: | 1886 case KEYED_SUPER_PROPERTY: |
1894 UNIMPLEMENTED(); | 1887 UNIMPLEMENTED(); |
(...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2223 } | 2216 } |
2224 | 2217 |
2225 | 2218 |
2226 int BytecodeGenerator::feedback_index(FeedbackVectorSlot slot) const { | 2219 int BytecodeGenerator::feedback_index(FeedbackVectorSlot slot) const { |
2227 return info()->feedback_vector()->GetIndex(slot); | 2220 return info()->feedback_vector()->GetIndex(slot); |
2228 } | 2221 } |
2229 | 2222 |
2230 } // namespace interpreter | 2223 } // namespace interpreter |
2231 } // namespace internal | 2224 } // namespace internal |
2232 } // namespace v8 | 2225 } // namespace v8 |
OLD | NEW |