| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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/ast.h" | 5 #include "src/ast.h" |
| 6 | 6 |
| 7 #include <cmath> // For isfinite. | 7 #include <cmath> // For isfinite. |
| 8 #include "src/builtins.h" | 8 #include "src/builtins.h" |
| 9 #include "src/code-stubs.h" | 9 #include "src/code-stubs.h" |
| 10 #include "src/contexts.h" | 10 #include "src/contexts.h" |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 58 var_proxy->raw_name()->IsOneByteEqualTo("undefined"); | 58 var_proxy->raw_name()->IsOneByteEqualTo("undefined"); |
| 59 } | 59 } |
| 60 | 60 |
| 61 | 61 |
| 62 VariableProxy::VariableProxy(Zone* zone, Variable* var, int position) | 62 VariableProxy::VariableProxy(Zone* zone, Variable* var, int position) |
| 63 : Expression(zone, position), | 63 : Expression(zone, position), |
| 64 name_(var->raw_name()), | 64 name_(var->raw_name()), |
| 65 var_(NULL), // Will be set by the call to BindTo. | 65 var_(NULL), // Will be set by the call to BindTo. |
| 66 is_this_(var->is_this()), | 66 is_this_(var->is_this()), |
| 67 is_assigned_(false), | 67 is_assigned_(false), |
| 68 interface_(var->interface()) { | 68 interface_(var->interface()), |
| 69 variable_feedback_slot_(kInvalidFeedbackSlot) { |
| 69 BindTo(var); | 70 BindTo(var); |
| 70 } | 71 } |
| 71 | 72 |
| 72 | 73 |
| 73 VariableProxy::VariableProxy(Zone* zone, | 74 VariableProxy::VariableProxy(Zone* zone, |
| 74 const AstRawString* name, | 75 const AstRawString* name, |
| 75 bool is_this, | 76 bool is_this, |
| 76 Interface* interface, | 77 Interface* interface, |
| 77 int position) | 78 int position) |
| 78 : Expression(zone, position), | 79 : Expression(zone, position), |
| 79 name_(name), | 80 name_(name), |
| 80 var_(NULL), | 81 var_(NULL), |
| 81 is_this_(is_this), | 82 is_this_(is_this), |
| 82 is_assigned_(false), | 83 is_assigned_(false), |
| 83 interface_(interface) { | 84 interface_(interface), |
| 85 variable_feedback_slot_(kInvalidFeedbackSlot) { |
| 84 } | 86 } |
| 85 | 87 |
| 86 | 88 |
| 87 void VariableProxy::BindTo(Variable* var) { | 89 void VariableProxy::BindTo(Variable* var) { |
| 88 ASSERT(var_ == NULL); // must be bound only once | 90 ASSERT(var_ == NULL); // must be bound only once |
| 89 ASSERT(var != NULL); // must bind | 91 ASSERT(var != NULL); // must bind |
| 90 ASSERT(!FLAG_harmony_modules || interface_->IsUnified(var->interface())); | 92 ASSERT(!FLAG_harmony_modules || interface_->IsUnified(var->interface())); |
| 91 ASSERT((is_this() && var->is_this()) || name_ == var->raw_name()); | 93 ASSERT((is_this() && var->is_this()) || name_ == var->raw_name()); |
| 92 // Ideally CONST-ness should match. However, this is very hard to achieve | 94 // Ideally CONST-ness should match. However, this is very hard to achieve |
| 93 // because we don't know the exact semantics of conflicting (const and | 95 // because we don't know the exact semantics of conflicting (const and |
| (...skipping 920 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1014 void AstConstructionVisitor::Visit##NodeType(NodeType* node) { \ | 1016 void AstConstructionVisitor::Visit##NodeType(NodeType* node) { \ |
| 1015 increase_node_count(); \ | 1017 increase_node_count(); \ |
| 1016 add_slot_node(node); \ | 1018 add_slot_node(node); \ |
| 1017 } | 1019 } |
| 1018 #define DONT_OPTIMIZE_NODE(NodeType) \ | 1020 #define DONT_OPTIMIZE_NODE(NodeType) \ |
| 1019 void AstConstructionVisitor::Visit##NodeType(NodeType* node) { \ | 1021 void AstConstructionVisitor::Visit##NodeType(NodeType* node) { \ |
| 1020 increase_node_count(); \ | 1022 increase_node_count(); \ |
| 1021 set_dont_optimize_reason(k##NodeType); \ | 1023 set_dont_optimize_reason(k##NodeType); \ |
| 1022 add_flag(kDontSelfOptimize); \ | 1024 add_flag(kDontSelfOptimize); \ |
| 1023 } | 1025 } |
| 1024 #define DONT_SELFOPTIMIZE_NODE(NodeType) \ | 1026 #define DONT_OPTIMIZE_NODE_WITH_FEEDBACK_SLOTS(NodeType) \ |
| 1027 void AstConstructionVisitor::Visit##NodeType(NodeType* node) { \ |
| 1028 increase_node_count(); \ |
| 1029 add_slot_node(node); \ |
| 1030 set_dont_optimize_reason(k##NodeType); \ |
| 1031 add_flag(kDontSelfOptimize); \ |
| 1032 } |
| 1033 #define DONT_SELFOPTIMIZE_NODE(NodeType) \ |
| 1025 void AstConstructionVisitor::Visit##NodeType(NodeType* node) { \ | 1034 void AstConstructionVisitor::Visit##NodeType(NodeType* node) { \ |
| 1026 increase_node_count(); \ | 1035 increase_node_count(); \ |
| 1027 add_flag(kDontSelfOptimize); \ | 1036 add_flag(kDontSelfOptimize); \ |
| 1028 } | 1037 } |
| 1029 #define DONT_SELFOPTIMIZE_NODE_WITH_FEEDBACK_SLOTS(NodeType) \ | 1038 #define DONT_SELFOPTIMIZE_NODE_WITH_FEEDBACK_SLOTS(NodeType) \ |
| 1030 void AstConstructionVisitor::Visit##NodeType(NodeType* node) { \ | 1039 void AstConstructionVisitor::Visit##NodeType(NodeType* node) { \ |
| 1031 increase_node_count(); \ | 1040 increase_node_count(); \ |
| 1032 add_slot_node(node); \ | 1041 add_slot_node(node); \ |
| 1033 add_flag(kDontSelfOptimize); \ | 1042 add_flag(kDontSelfOptimize); \ |
| 1034 } | 1043 } |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1052 REGULAR_NODE(SwitchStatement) | 1061 REGULAR_NODE(SwitchStatement) |
| 1053 REGULAR_NODE(CaseClause) | 1062 REGULAR_NODE(CaseClause) |
| 1054 REGULAR_NODE(Conditional) | 1063 REGULAR_NODE(Conditional) |
| 1055 REGULAR_NODE(Literal) | 1064 REGULAR_NODE(Literal) |
| 1056 REGULAR_NODE(ArrayLiteral) | 1065 REGULAR_NODE(ArrayLiteral) |
| 1057 REGULAR_NODE(ObjectLiteral) | 1066 REGULAR_NODE(ObjectLiteral) |
| 1058 REGULAR_NODE(RegExpLiteral) | 1067 REGULAR_NODE(RegExpLiteral) |
| 1059 REGULAR_NODE(FunctionLiteral) | 1068 REGULAR_NODE(FunctionLiteral) |
| 1060 REGULAR_NODE(Assignment) | 1069 REGULAR_NODE(Assignment) |
| 1061 REGULAR_NODE(Throw) | 1070 REGULAR_NODE(Throw) |
| 1062 REGULAR_NODE(Property) | |
| 1063 REGULAR_NODE(UnaryOperation) | 1071 REGULAR_NODE(UnaryOperation) |
| 1064 REGULAR_NODE(CountOperation) | 1072 REGULAR_NODE(CountOperation) |
| 1065 REGULAR_NODE(BinaryOperation) | 1073 REGULAR_NODE(BinaryOperation) |
| 1066 REGULAR_NODE(CompareOperation) | 1074 REGULAR_NODE(CompareOperation) |
| 1067 REGULAR_NODE(ThisFunction) | 1075 REGULAR_NODE(ThisFunction) |
| 1076 |
| 1068 REGULAR_NODE_WITH_FEEDBACK_SLOTS(Call) | 1077 REGULAR_NODE_WITH_FEEDBACK_SLOTS(Call) |
| 1069 REGULAR_NODE_WITH_FEEDBACK_SLOTS(CallNew) | 1078 REGULAR_NODE_WITH_FEEDBACK_SLOTS(CallNew) |
| 1079 REGULAR_NODE_WITH_FEEDBACK_SLOTS(Property) |
| 1070 // In theory, for VariableProxy we'd have to add: | 1080 // In theory, for VariableProxy we'd have to add: |
| 1071 // if (node->var()->IsLookupSlot()) | 1081 // if (node->var()->IsLookupSlot()) |
| 1072 // set_dont_optimize_reason(kReferenceToAVariableWhichRequiresDynamicLookup); | 1082 // set_dont_optimize_reason(kReferenceToAVariableWhichRequiresDynamicLookup); |
| 1073 // But node->var() is usually not bound yet at VariableProxy creation time, and | 1083 // But node->var() is usually not bound yet at VariableProxy creation time, and |
| 1074 // LOOKUP variables only result from constructs that cannot be inlined anyway. | 1084 // LOOKUP variables only result from constructs that cannot be inlined anyway. |
| 1075 REGULAR_NODE(VariableProxy) | 1085 REGULAR_NODE_WITH_FEEDBACK_SLOTS(VariableProxy) |
| 1076 | 1086 |
| 1077 // We currently do not optimize any modules. | 1087 // We currently do not optimize any modules. |
| 1078 DONT_OPTIMIZE_NODE(ModuleDeclaration) | 1088 DONT_OPTIMIZE_NODE(ModuleDeclaration) |
| 1079 DONT_OPTIMIZE_NODE(ImportDeclaration) | 1089 DONT_OPTIMIZE_NODE(ImportDeclaration) |
| 1080 DONT_OPTIMIZE_NODE(ExportDeclaration) | 1090 DONT_OPTIMIZE_NODE(ExportDeclaration) |
| 1081 DONT_OPTIMIZE_NODE(ModuleVariable) | 1091 DONT_OPTIMIZE_NODE(ModuleVariable) |
| 1082 DONT_OPTIMIZE_NODE(ModulePath) | 1092 DONT_OPTIMIZE_NODE(ModulePath) |
| 1083 DONT_OPTIMIZE_NODE(ModuleUrl) | 1093 DONT_OPTIMIZE_NODE(ModuleUrl) |
| 1084 DONT_OPTIMIZE_NODE(ModuleStatement) | 1094 DONT_OPTIMIZE_NODE(ModuleStatement) |
| 1085 DONT_OPTIMIZE_NODE(Yield) | |
| 1086 DONT_OPTIMIZE_NODE(WithStatement) | 1095 DONT_OPTIMIZE_NODE(WithStatement) |
| 1087 DONT_OPTIMIZE_NODE(TryCatchStatement) | 1096 DONT_OPTIMIZE_NODE(TryCatchStatement) |
| 1088 DONT_OPTIMIZE_NODE(TryFinallyStatement) | 1097 DONT_OPTIMIZE_NODE(TryFinallyStatement) |
| 1089 DONT_OPTIMIZE_NODE(DebuggerStatement) | 1098 DONT_OPTIMIZE_NODE(DebuggerStatement) |
| 1090 DONT_OPTIMIZE_NODE(NativeFunctionLiteral) | 1099 DONT_OPTIMIZE_NODE(NativeFunctionLiteral) |
| 1091 | 1100 |
| 1101 DONT_OPTIMIZE_NODE_WITH_FEEDBACK_SLOTS(Yield) |
| 1102 |
| 1092 DONT_SELFOPTIMIZE_NODE(DoWhileStatement) | 1103 DONT_SELFOPTIMIZE_NODE(DoWhileStatement) |
| 1093 DONT_SELFOPTIMIZE_NODE(WhileStatement) | 1104 DONT_SELFOPTIMIZE_NODE(WhileStatement) |
| 1094 DONT_SELFOPTIMIZE_NODE(ForStatement) | 1105 DONT_SELFOPTIMIZE_NODE(ForStatement) |
| 1106 DONT_SELFOPTIMIZE_NODE(ForOfStatement) |
| 1107 |
| 1095 DONT_SELFOPTIMIZE_NODE_WITH_FEEDBACK_SLOTS(ForInStatement) | 1108 DONT_SELFOPTIMIZE_NODE_WITH_FEEDBACK_SLOTS(ForInStatement) |
| 1096 DONT_SELFOPTIMIZE_NODE(ForOfStatement) | |
| 1097 | 1109 |
| 1098 DONT_CACHE_NODE(ModuleLiteral) | 1110 DONT_CACHE_NODE(ModuleLiteral) |
| 1099 | 1111 |
| 1100 | 1112 |
| 1101 void AstConstructionVisitor::VisitCallRuntime(CallRuntime* node) { | 1113 void AstConstructionVisitor::VisitCallRuntime(CallRuntime* node) { |
| 1102 increase_node_count(); | 1114 increase_node_count(); |
| 1115 add_slot_node(node); |
| 1103 if (node->is_jsruntime()) { | 1116 if (node->is_jsruntime()) { |
| 1104 // Don't try to optimize JS runtime calls because we bailout on them. | 1117 // Don't try to optimize JS runtime calls because we bailout on them. |
| 1105 set_dont_optimize_reason(kCallToAJavaScriptRuntimeFunction); | 1118 set_dont_optimize_reason(kCallToAJavaScriptRuntimeFunction); |
| 1106 } | 1119 } |
| 1107 } | 1120 } |
| 1108 | 1121 |
| 1109 #undef REGULAR_NODE | 1122 #undef REGULAR_NODE |
| 1110 #undef DONT_OPTIMIZE_NODE | 1123 #undef DONT_OPTIMIZE_NODE |
| 1111 #undef DONT_SELFOPTIMIZE_NODE | 1124 #undef DONT_SELFOPTIMIZE_NODE |
| 1112 #undef DONT_CACHE_NODE | 1125 #undef DONT_CACHE_NODE |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1123 SNPrintF(buffer, "%d", Smi::cast(*value())->value()); | 1136 SNPrintF(buffer, "%d", Smi::cast(*value())->value()); |
| 1124 str = arr; | 1137 str = arr; |
| 1125 } else { | 1138 } else { |
| 1126 str = DoubleToCString(value()->Number(), buffer); | 1139 str = DoubleToCString(value()->Number(), buffer); |
| 1127 } | 1140 } |
| 1128 return isolate_->factory()->NewStringFromAsciiChecked(str); | 1141 return isolate_->factory()->NewStringFromAsciiChecked(str); |
| 1129 } | 1142 } |
| 1130 | 1143 |
| 1131 | 1144 |
| 1132 } } // namespace v8::internal | 1145 } } // namespace v8::internal |
| OLD | NEW |