OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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/compiler/ast-graph-builder.h" | 5 #include "src/compiler/ast-graph-builder.h" |
6 | 6 |
7 #include "src/compiler.h" | 7 #include "src/compiler.h" |
8 #include "src/compiler/control-builders.h" | 8 #include "src/compiler/control-builders.h" |
9 #include "src/compiler/node-properties.h" | 9 #include "src/compiler/node-properties.h" |
10 #include "src/compiler/node-properties-inl.h" | 10 #include "src/compiler/node-properties-inl.h" |
(...skipping 913 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
924 // Fall through. | 924 // Fall through. |
925 case ObjectLiteral::Property::COMPUTED: { | 925 case ObjectLiteral::Property::COMPUTED: { |
926 // It is safe to use [[Put]] here because the boilerplate already | 926 // It is safe to use [[Put]] here because the boilerplate already |
927 // contains computed properties with an uninitialized value. | 927 // contains computed properties with an uninitialized value. |
928 if (key->value()->IsInternalizedString()) { | 928 if (key->value()->IsInternalizedString()) { |
929 if (property->emit_store()) { | 929 if (property->emit_store()) { |
930 VisitForValue(property->value()); | 930 VisitForValue(property->value()); |
931 Node* value = environment()->Pop(); | 931 Node* value = environment()->Pop(); |
932 PrintableUnique<Name> name = MakeUnique(key->AsPropertyName()); | 932 PrintableUnique<Name> name = MakeUnique(key->AsPropertyName()); |
933 Node* store = | 933 Node* store = |
934 NewNode(javascript()->StoreNamed(name), literal, value); | 934 NewNode(javascript()->StoreNamed(info()->strict_mode(), name), |
| 935 literal, value); |
935 BuildLazyBailout(store, key->id()); | 936 BuildLazyBailout(store, key->id()); |
936 } else { | 937 } else { |
937 VisitForEffect(property->value()); | 938 VisitForEffect(property->value()); |
938 } | 939 } |
939 break; | 940 break; |
940 } | 941 } |
941 environment()->Push(literal); // Duplicate receiver. | 942 environment()->Push(literal); // Duplicate receiver. |
942 VisitForValue(property->key()); | 943 VisitForValue(property->key()); |
943 VisitForValue(property->value()); | 944 VisitForValue(property->value()); |
944 Node* value = environment()->Pop(); | 945 Node* value = environment()->Pop(); |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1016 | 1017 |
1017 // Create nodes to evaluate all the non-constant subexpressions and to store | 1018 // Create nodes to evaluate all the non-constant subexpressions and to store |
1018 // them into the newly cloned array. | 1019 // them into the newly cloned array. |
1019 for (int i = 0; i < expr->values()->length(); i++) { | 1020 for (int i = 0; i < expr->values()->length(); i++) { |
1020 Expression* subexpr = expr->values()->at(i); | 1021 Expression* subexpr = expr->values()->at(i); |
1021 if (CompileTimeValue::IsCompileTimeValue(subexpr)) continue; | 1022 if (CompileTimeValue::IsCompileTimeValue(subexpr)) continue; |
1022 | 1023 |
1023 VisitForValue(subexpr); | 1024 VisitForValue(subexpr); |
1024 Node* value = environment()->Pop(); | 1025 Node* value = environment()->Pop(); |
1025 Node* index = jsgraph()->Constant(i); | 1026 Node* index = jsgraph()->Constant(i); |
1026 Node* store = NewNode(javascript()->StoreProperty(), literal, index, value); | 1027 Node* store = NewNode(javascript()->StoreProperty(info()->strict_mode()), |
| 1028 literal, index, value); |
1027 BuildLazyBailout(store, expr->GetIdForElement(i)); | 1029 BuildLazyBailout(store, expr->GetIdForElement(i)); |
1028 } | 1030 } |
1029 | 1031 |
1030 environment()->Pop(); // Array literal index. | 1032 environment()->Pop(); // Array literal index. |
1031 ast_context()->ProduceValue(environment()->Pop()); | 1033 ast_context()->ProduceValue(environment()->Pop()); |
1032 } | 1034 } |
1033 | 1035 |
1034 | 1036 |
1035 void AstGraphBuilder::VisitForInAssignment(Expression* expr, Node* value) { | 1037 void AstGraphBuilder::VisitForInAssignment(Expression* expr, Node* value) { |
1036 DCHECK(expr->IsValidReferenceExpression()); | 1038 DCHECK(expr->IsValidReferenceExpression()); |
(...skipping 10 matching lines...) Expand all Loading... |
1047 BuildVariableAssignment(var, value, Token::ASSIGN, BailoutId::None()); | 1049 BuildVariableAssignment(var, value, Token::ASSIGN, BailoutId::None()); |
1048 break; | 1050 break; |
1049 } | 1051 } |
1050 case NAMED_PROPERTY: { | 1052 case NAMED_PROPERTY: { |
1051 environment()->Push(value); | 1053 environment()->Push(value); |
1052 VisitForValue(property->obj()); | 1054 VisitForValue(property->obj()); |
1053 Node* object = environment()->Pop(); | 1055 Node* object = environment()->Pop(); |
1054 value = environment()->Pop(); | 1056 value = environment()->Pop(); |
1055 PrintableUnique<Name> name = | 1057 PrintableUnique<Name> name = |
1056 MakeUnique(property->key()->AsLiteral()->AsPropertyName()); | 1058 MakeUnique(property->key()->AsLiteral()->AsPropertyName()); |
1057 Node* store = NewNode(javascript()->StoreNamed(name), object, value); | 1059 Node* store = NewNode( |
| 1060 javascript()->StoreNamed(info()->strict_mode(), name), object, value); |
1058 // TODO(jarin) Fill in the correct bailout id. | 1061 // TODO(jarin) Fill in the correct bailout id. |
1059 BuildLazyBailout(store, BailoutId::None()); | 1062 BuildLazyBailout(store, BailoutId::None()); |
1060 break; | 1063 break; |
1061 } | 1064 } |
1062 case KEYED_PROPERTY: { | 1065 case KEYED_PROPERTY: { |
1063 environment()->Push(value); | 1066 environment()->Push(value); |
1064 VisitForValue(property->obj()); | 1067 VisitForValue(property->obj()); |
1065 VisitForValue(property->key()); | 1068 VisitForValue(property->key()); |
1066 Node* key = environment()->Pop(); | 1069 Node* key = environment()->Pop(); |
1067 Node* object = environment()->Pop(); | 1070 Node* object = environment()->Pop(); |
1068 value = environment()->Pop(); | 1071 value = environment()->Pop(); |
1069 Node* store = NewNode(javascript()->StoreProperty(), object, key, value); | 1072 Node* store = NewNode(javascript()->StoreProperty(info()->strict_mode()), |
| 1073 object, key, value); |
1070 // TODO(jarin) Fill in the correct bailout id. | 1074 // TODO(jarin) Fill in the correct bailout id. |
1071 BuildLazyBailout(store, BailoutId::None()); | 1075 BuildLazyBailout(store, BailoutId::None()); |
1072 break; | 1076 break; |
1073 } | 1077 } |
1074 } | 1078 } |
1075 } | 1079 } |
1076 | 1080 |
1077 | 1081 |
1078 void AstGraphBuilder::VisitAssignment(Assignment* expr) { | 1082 void AstGraphBuilder::VisitAssignment(Assignment* expr) { |
1079 DCHECK(expr->target()->IsValidReferenceExpression()); | 1083 DCHECK(expr->target()->IsValidReferenceExpression()); |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1140 case VARIABLE: { | 1144 case VARIABLE: { |
1141 Variable* variable = expr->target()->AsVariableProxy()->var(); | 1145 Variable* variable = expr->target()->AsVariableProxy()->var(); |
1142 BuildVariableAssignment(variable, value, expr->op(), | 1146 BuildVariableAssignment(variable, value, expr->op(), |
1143 expr->AssignmentId()); | 1147 expr->AssignmentId()); |
1144 break; | 1148 break; |
1145 } | 1149 } |
1146 case NAMED_PROPERTY: { | 1150 case NAMED_PROPERTY: { |
1147 Node* object = environment()->Pop(); | 1151 Node* object = environment()->Pop(); |
1148 PrintableUnique<Name> name = | 1152 PrintableUnique<Name> name = |
1149 MakeUnique(property->key()->AsLiteral()->AsPropertyName()); | 1153 MakeUnique(property->key()->AsLiteral()->AsPropertyName()); |
1150 Node* store = NewNode(javascript()->StoreNamed(name), object, value); | 1154 Node* store = NewNode( |
| 1155 javascript()->StoreNamed(info()->strict_mode(), name), object, value); |
1151 BuildLazyBailout(store, expr->AssignmentId()); | 1156 BuildLazyBailout(store, expr->AssignmentId()); |
1152 break; | 1157 break; |
1153 } | 1158 } |
1154 case KEYED_PROPERTY: { | 1159 case KEYED_PROPERTY: { |
1155 Node* key = environment()->Pop(); | 1160 Node* key = environment()->Pop(); |
1156 Node* object = environment()->Pop(); | 1161 Node* object = environment()->Pop(); |
1157 Node* store = NewNode(javascript()->StoreProperty(), object, key, value); | 1162 Node* store = NewNode(javascript()->StoreProperty(info()->strict_mode()), |
| 1163 object, key, value); |
1158 BuildLazyBailout(store, expr->AssignmentId()); | 1164 BuildLazyBailout(store, expr->AssignmentId()); |
1159 break; | 1165 break; |
1160 } | 1166 } |
1161 } | 1167 } |
1162 | 1168 |
1163 ast_context()->ProduceValue(value); | 1169 ast_context()->ProduceValue(value); |
1164 } | 1170 } |
1165 | 1171 |
1166 | 1172 |
1167 void AstGraphBuilder::VisitYield(Yield* expr) { | 1173 void AstGraphBuilder::VisitYield(Yield* expr) { |
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1440 case VARIABLE: { | 1446 case VARIABLE: { |
1441 Variable* variable = expr->expression()->AsVariableProxy()->var(); | 1447 Variable* variable = expr->expression()->AsVariableProxy()->var(); |
1442 BuildVariableAssignment(variable, value, expr->op(), | 1448 BuildVariableAssignment(variable, value, expr->op(), |
1443 expr->AssignmentId()); | 1449 expr->AssignmentId()); |
1444 break; | 1450 break; |
1445 } | 1451 } |
1446 case NAMED_PROPERTY: { | 1452 case NAMED_PROPERTY: { |
1447 Node* object = environment()->Pop(); | 1453 Node* object = environment()->Pop(); |
1448 PrintableUnique<Name> name = | 1454 PrintableUnique<Name> name = |
1449 MakeUnique(property->key()->AsLiteral()->AsPropertyName()); | 1455 MakeUnique(property->key()->AsLiteral()->AsPropertyName()); |
1450 Node* store = NewNode(javascript()->StoreNamed(name), object, value); | 1456 Node* store = NewNode( |
| 1457 javascript()->StoreNamed(info()->strict_mode(), name), object, value); |
1451 BuildLazyBailout(store, expr->AssignmentId()); | 1458 BuildLazyBailout(store, expr->AssignmentId()); |
1452 break; | 1459 break; |
1453 } | 1460 } |
1454 case KEYED_PROPERTY: { | 1461 case KEYED_PROPERTY: { |
1455 Node* key = environment()->Pop(); | 1462 Node* key = environment()->Pop(); |
1456 Node* object = environment()->Pop(); | 1463 Node* object = environment()->Pop(); |
1457 Node* store = NewNode(javascript()->StoreProperty(), object, key, value); | 1464 Node* store = NewNode(javascript()->StoreProperty(info()->strict_mode()), |
| 1465 object, key, value); |
1458 BuildLazyBailout(store, expr->AssignmentId()); | 1466 BuildLazyBailout(store, expr->AssignmentId()); |
1459 break; | 1467 break; |
1460 } | 1468 } |
1461 } | 1469 } |
1462 | 1470 |
1463 // Restore old value for postfix expressions. | 1471 // Restore old value for postfix expressions. |
1464 if (is_postfix) value = environment()->Pop(); | 1472 if (is_postfix) value = environment()->Pop(); |
1465 | 1473 |
1466 ast_context()->ProduceValue(value); | 1474 ast_context()->ProduceValue(value); |
1467 } | 1475 } |
(...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1857 Node* AstGraphBuilder::BuildVariableAssignment(Variable* variable, Node* value, | 1865 Node* AstGraphBuilder::BuildVariableAssignment(Variable* variable, Node* value, |
1858 Token::Value op, | 1866 Token::Value op, |
1859 BailoutId bailout_id) { | 1867 BailoutId bailout_id) { |
1860 Node* the_hole = jsgraph()->TheHoleConstant(); | 1868 Node* the_hole = jsgraph()->TheHoleConstant(); |
1861 VariableMode mode = variable->mode(); | 1869 VariableMode mode = variable->mode(); |
1862 switch (variable->location()) { | 1870 switch (variable->location()) { |
1863 case Variable::UNALLOCATED: { | 1871 case Variable::UNALLOCATED: { |
1864 // Global var, const, or let variable. | 1872 // Global var, const, or let variable. |
1865 Node* global = BuildLoadGlobalObject(); | 1873 Node* global = BuildLoadGlobalObject(); |
1866 PrintableUnique<Name> name = MakeUnique(variable->name()); | 1874 PrintableUnique<Name> name = MakeUnique(variable->name()); |
1867 Operator* op = javascript()->StoreNamed(name); | 1875 Operator* op = javascript()->StoreNamed(info()->strict_mode(), name); |
1868 Node* store = NewNode(op, global, value); | 1876 Node* store = NewNode(op, global, value); |
1869 BuildLazyBailout(store, bailout_id); | 1877 BuildLazyBailout(store, bailout_id); |
1870 return store; | 1878 return store; |
1871 } | 1879 } |
1872 case Variable::PARAMETER: | 1880 case Variable::PARAMETER: |
1873 case Variable::LOCAL: | 1881 case Variable::LOCAL: |
1874 // Local var, const, or let variable. | 1882 // Local var, const, or let variable. |
1875 if (mode == CONST_LEGACY && op == Token::INIT_CONST_LEGACY) { | 1883 if (mode == CONST_LEGACY && op == Token::INIT_CONST_LEGACY) { |
1876 // Perform an initialization check for legacy const variables. | 1884 // Perform an initialization check for legacy const variables. |
1877 Node* current = environment()->Lookup(variable); | 1885 Node* current = environment()->Lookup(variable); |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2051 | 2059 |
2052 void AstGraphBuilder::BuildLazyBailoutWithPushedNode(Node* node, | 2060 void AstGraphBuilder::BuildLazyBailoutWithPushedNode(Node* node, |
2053 BailoutId ast_id) { | 2061 BailoutId ast_id) { |
2054 environment()->Push(node); | 2062 environment()->Push(node); |
2055 BuildLazyBailout(node, ast_id); | 2063 BuildLazyBailout(node, ast_id); |
2056 environment()->Pop(); | 2064 environment()->Pop(); |
2057 } | 2065 } |
2058 } | 2066 } |
2059 } | 2067 } |
2060 } // namespace v8::internal::compiler | 2068 } // namespace v8::internal::compiler |
OLD | NEW |