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/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/ast.h" | 7 #include "src/ast.h" |
8 #include "src/ast-numbering.h" | 8 #include "src/ast-numbering.h" |
9 #include "src/compiler.h" | 9 #include "src/compiler.h" |
10 #include "src/scopes.h" | 10 #include "src/scopes.h" |
11 | 11 |
12 namespace v8 { | 12 namespace v8 { |
13 namespace internal { | 13 namespace internal { |
14 | 14 |
15 | 15 |
16 class AstNumberingVisitor FINAL : public AstVisitor { | 16 class AstNumberingVisitor FINAL : public AstVisitor { |
17 public: | 17 public: |
18 explicit AstNumberingVisitor(Zone* zone) | 18 explicit AstNumberingVisitor(Zone* zone) |
19 : AstVisitor(), next_id_(BailoutId::FirstUsable().ToInt()) { | 19 : AstVisitor(), |
| 20 next_id_(BailoutId::FirstUsable().ToInt()), |
| 21 dont_crankshaft_reason_(kNoReason), |
| 22 dont_turbofan_reason_(kNoReason) { |
20 InitializeAstVisitor(zone); | 23 InitializeAstVisitor(zone); |
21 } | 24 } |
22 | 25 |
23 void Renumber(FunctionLiteral* node); | 26 void Renumber(FunctionLiteral* node); |
24 | 27 |
25 private: | 28 private: |
26 // AST node visitor interface. | 29 // AST node visitor interface. |
27 #define DEFINE_VISIT(type) virtual void Visit##type(type* node); | 30 #define DEFINE_VISIT(type) virtual void Visit##type(type* node); |
28 AST_NODE_LIST(DEFINE_VISIT) | 31 AST_NODE_LIST(DEFINE_VISIT) |
29 #undef DEFINE_VISIT | 32 #undef DEFINE_VISIT |
30 | 33 |
31 void VisitStatements(ZoneList<Statement*>* statements); | 34 void VisitStatements(ZoneList<Statement*>* statements); |
32 void VisitDeclarations(ZoneList<Declaration*>* declarations); | 35 void VisitDeclarations(ZoneList<Declaration*>* declarations); |
33 void VisitArguments(ZoneList<Expression*>* arguments); | 36 void VisitArguments(ZoneList<Expression*>* arguments); |
34 void VisitObjectLiteralProperty(ObjectLiteralProperty* property); | 37 void VisitObjectLiteralProperty(ObjectLiteralProperty* property); |
35 | 38 |
36 int ReserveIdRange(int n) { | 39 int ReserveIdRange(int n) { |
37 int tmp = next_id_; | 40 int tmp = next_id_; |
38 next_id_ += n; | 41 next_id_ += n; |
39 return tmp; | 42 return tmp; |
40 } | 43 } |
41 | 44 |
42 void IncrementNodeCount() { properties_.add_node_count(1); } | 45 void IncrementNodeCount() { properties_.add_node_count(1); } |
| 46 void DisableCrankshaft(BailoutReason reason) { |
| 47 dont_crankshaft_reason_ = reason; |
| 48 properties_.flags()->Add(kDontSelfOptimize); |
| 49 } |
| 50 // TODO(turbofan): Remove the dont_turbofan_reason once no nodes are |
| 51 // DontTurbofanNode. That set of nodes must be kept in sync with |
| 52 // Pipeline::GenerateCode. |
| 53 void DisableTurbofan(BailoutReason reason) { |
| 54 dont_crankshaft_reason_ = reason; |
| 55 dont_turbofan_reason_ = reason; |
| 56 properties_.flags()->Add(kDontSelfOptimize); |
| 57 } |
| 58 void DisableSelfOptimization() { |
| 59 properties_.add_node_count(1); |
| 60 properties_.flags()->Add(kDontSelfOptimize); |
| 61 } |
| 62 void DisableCaching(BailoutReason reason) { |
| 63 properties_.add_node_count(1); |
| 64 dont_crankshaft_reason_ = reason; |
| 65 properties_.flags()->Add(kDontSelfOptimize); |
| 66 properties_.flags()->Add(kDontCache); |
| 67 } |
| 68 |
| 69 BailoutReason dont_optimize_reason() const { |
| 70 return (dont_turbofan_reason_ != kNoReason) ? dont_turbofan_reason_ |
| 71 : dont_crankshaft_reason_; |
| 72 } |
43 | 73 |
44 int next_id_; | 74 int next_id_; |
45 AstProperties properties_; | 75 AstProperties properties_; |
| 76 BailoutReason dont_crankshaft_reason_; |
| 77 BailoutReason dont_turbofan_reason_; |
46 | 78 |
47 DEFINE_AST_VISITOR_SUBCLASS_MEMBERS(); | 79 DEFINE_AST_VISITOR_SUBCLASS_MEMBERS(); |
48 DISALLOW_COPY_AND_ASSIGN(AstNumberingVisitor); | 80 DISALLOW_COPY_AND_ASSIGN(AstNumberingVisitor); |
49 }; | 81 }; |
50 | 82 |
51 | 83 |
52 void AstNumberingVisitor::VisitVariableDeclaration(VariableDeclaration* node) { | 84 void AstNumberingVisitor::VisitVariableDeclaration(VariableDeclaration* node) { |
53 IncrementNodeCount(); | 85 IncrementNodeCount(); |
54 VisitVariableProxy(node->proxy()); | 86 VisitVariableProxy(node->proxy()); |
55 } | 87 } |
56 | 88 |
57 | 89 |
58 void AstNumberingVisitor::VisitExportDeclaration(ExportDeclaration* node) { | 90 void AstNumberingVisitor::VisitExportDeclaration(ExportDeclaration* node) { |
59 IncrementNodeCount(); | 91 IncrementNodeCount(); |
| 92 DisableCrankshaft(kExportDeclaration); |
60 VisitVariableProxy(node->proxy()); | 93 VisitVariableProxy(node->proxy()); |
61 } | 94 } |
62 | 95 |
63 | 96 |
64 void AstNumberingVisitor::VisitModuleUrl(ModuleUrl* node) { | 97 void AstNumberingVisitor::VisitModuleUrl(ModuleUrl* node) { |
65 IncrementNodeCount(); | 98 IncrementNodeCount(); |
| 99 DisableCrankshaft(kModuleUrl); |
66 } | 100 } |
67 | 101 |
68 | 102 |
69 void AstNumberingVisitor::VisitEmptyStatement(EmptyStatement* node) { | 103 void AstNumberingVisitor::VisitEmptyStatement(EmptyStatement* node) { |
70 IncrementNodeCount(); | 104 IncrementNodeCount(); |
71 } | 105 } |
72 | 106 |
73 | 107 |
74 void AstNumberingVisitor::VisitContinueStatement(ContinueStatement* node) { | 108 void AstNumberingVisitor::VisitContinueStatement(ContinueStatement* node) { |
75 IncrementNodeCount(); | 109 IncrementNodeCount(); |
76 } | 110 } |
77 | 111 |
78 | 112 |
79 void AstNumberingVisitor::VisitBreakStatement(BreakStatement* node) { | 113 void AstNumberingVisitor::VisitBreakStatement(BreakStatement* node) { |
80 IncrementNodeCount(); | 114 IncrementNodeCount(); |
81 } | 115 } |
82 | 116 |
83 | 117 |
84 void AstNumberingVisitor::VisitDebuggerStatement(DebuggerStatement* node) { | 118 void AstNumberingVisitor::VisitDebuggerStatement(DebuggerStatement* node) { |
85 IncrementNodeCount(); | 119 IncrementNodeCount(); |
| 120 DisableCrankshaft(kDebuggerStatement); |
86 node->set_base_id(ReserveIdRange(DebuggerStatement::num_ids())); | 121 node->set_base_id(ReserveIdRange(DebuggerStatement::num_ids())); |
87 } | 122 } |
88 | 123 |
89 | 124 |
90 void AstNumberingVisitor::VisitNativeFunctionLiteral( | 125 void AstNumberingVisitor::VisitNativeFunctionLiteral( |
91 NativeFunctionLiteral* node) { | 126 NativeFunctionLiteral* node) { |
92 IncrementNodeCount(); | 127 IncrementNodeCount(); |
| 128 DisableCrankshaft(kNativeFunctionLiteral); |
93 node->set_base_id(ReserveIdRange(NativeFunctionLiteral::num_ids())); | 129 node->set_base_id(ReserveIdRange(NativeFunctionLiteral::num_ids())); |
94 } | 130 } |
95 | 131 |
96 | 132 |
97 void AstNumberingVisitor::VisitLiteral(Literal* node) { | 133 void AstNumberingVisitor::VisitLiteral(Literal* node) { |
98 IncrementNodeCount(); | 134 IncrementNodeCount(); |
99 node->set_base_id(ReserveIdRange(Literal::num_ids())); | 135 node->set_base_id(ReserveIdRange(Literal::num_ids())); |
100 } | 136 } |
101 | 137 |
102 | 138 |
103 void AstNumberingVisitor::VisitRegExpLiteral(RegExpLiteral* node) { | 139 void AstNumberingVisitor::VisitRegExpLiteral(RegExpLiteral* node) { |
104 IncrementNodeCount(); | 140 IncrementNodeCount(); |
105 node->set_base_id(ReserveIdRange(RegExpLiteral::num_ids())); | 141 node->set_base_id(ReserveIdRange(RegExpLiteral::num_ids())); |
106 } | 142 } |
107 | 143 |
108 | 144 |
109 void AstNumberingVisitor::VisitVariableProxy(VariableProxy* node) { | 145 void AstNumberingVisitor::VisitVariableProxy(VariableProxy* node) { |
110 IncrementNodeCount(); | 146 IncrementNodeCount(); |
| 147 if (node->var()->IsLookupSlot()) { |
| 148 DisableCrankshaft(kReferenceToAVariableWhichRequiresDynamicLookup); |
| 149 } |
111 node->set_base_id(ReserveIdRange(VariableProxy::num_ids())); | 150 node->set_base_id(ReserveIdRange(VariableProxy::num_ids())); |
112 } | 151 } |
113 | 152 |
114 | 153 |
115 void AstNumberingVisitor::VisitThisFunction(ThisFunction* node) { | 154 void AstNumberingVisitor::VisitThisFunction(ThisFunction* node) { |
116 IncrementNodeCount(); | 155 IncrementNodeCount(); |
117 node->set_base_id(ReserveIdRange(ThisFunction::num_ids())); | 156 node->set_base_id(ReserveIdRange(ThisFunction::num_ids())); |
118 } | 157 } |
119 | 158 |
120 | 159 |
121 void AstNumberingVisitor::VisitSuperReference(SuperReference* node) { | 160 void AstNumberingVisitor::VisitSuperReference(SuperReference* node) { |
122 IncrementNodeCount(); | 161 IncrementNodeCount(); |
| 162 DisableTurbofan(kSuperReference); |
123 node->set_base_id(ReserveIdRange(SuperReference::num_ids())); | 163 node->set_base_id(ReserveIdRange(SuperReference::num_ids())); |
124 Visit(node->this_var()); | 164 Visit(node->this_var()); |
125 } | 165 } |
126 | 166 |
127 | 167 |
128 void AstNumberingVisitor::VisitModuleDeclaration(ModuleDeclaration* node) { | 168 void AstNumberingVisitor::VisitModuleDeclaration(ModuleDeclaration* node) { |
129 IncrementNodeCount(); | 169 IncrementNodeCount(); |
| 170 DisableCrankshaft(kModuleDeclaration); |
130 VisitVariableProxy(node->proxy()); | 171 VisitVariableProxy(node->proxy()); |
131 Visit(node->module()); | 172 Visit(node->module()); |
132 } | 173 } |
133 | 174 |
134 | 175 |
135 void AstNumberingVisitor::VisitImportDeclaration(ImportDeclaration* node) { | 176 void AstNumberingVisitor::VisitImportDeclaration(ImportDeclaration* node) { |
136 IncrementNodeCount(); | 177 IncrementNodeCount(); |
| 178 DisableCrankshaft(kImportDeclaration); |
137 VisitVariableProxy(node->proxy()); | 179 VisitVariableProxy(node->proxy()); |
138 Visit(node->module()); | 180 Visit(node->module()); |
139 } | 181 } |
140 | 182 |
141 | 183 |
142 void AstNumberingVisitor::VisitModuleVariable(ModuleVariable* node) { | 184 void AstNumberingVisitor::VisitModuleVariable(ModuleVariable* node) { |
143 IncrementNodeCount(); | 185 IncrementNodeCount(); |
| 186 DisableCrankshaft(kModuleVariable); |
144 Visit(node->proxy()); | 187 Visit(node->proxy()); |
145 } | 188 } |
146 | 189 |
147 | 190 |
148 void AstNumberingVisitor::VisitModulePath(ModulePath* node) { | 191 void AstNumberingVisitor::VisitModulePath(ModulePath* node) { |
149 IncrementNodeCount(); | 192 IncrementNodeCount(); |
| 193 DisableCrankshaft(kModulePath); |
150 Visit(node->module()); | 194 Visit(node->module()); |
151 } | 195 } |
152 | 196 |
153 | 197 |
154 void AstNumberingVisitor::VisitModuleStatement(ModuleStatement* node) { | 198 void AstNumberingVisitor::VisitModuleStatement(ModuleStatement* node) { |
155 IncrementNodeCount(); | 199 IncrementNodeCount(); |
| 200 DisableCrankshaft(kModuleStatement); |
156 Visit(node->body()); | 201 Visit(node->body()); |
157 } | 202 } |
158 | 203 |
159 | 204 |
160 void AstNumberingVisitor::VisitExpressionStatement(ExpressionStatement* node) { | 205 void AstNumberingVisitor::VisitExpressionStatement(ExpressionStatement* node) { |
161 IncrementNodeCount(); | 206 IncrementNodeCount(); |
162 Visit(node->expression()); | 207 Visit(node->expression()); |
163 } | 208 } |
164 | 209 |
165 | 210 |
166 void AstNumberingVisitor::VisitReturnStatement(ReturnStatement* node) { | 211 void AstNumberingVisitor::VisitReturnStatement(ReturnStatement* node) { |
167 IncrementNodeCount(); | 212 IncrementNodeCount(); |
168 Visit(node->expression()); | 213 Visit(node->expression()); |
169 } | 214 } |
170 | 215 |
171 | 216 |
172 void AstNumberingVisitor::VisitYield(Yield* node) { | 217 void AstNumberingVisitor::VisitYield(Yield* node) { |
173 IncrementNodeCount(); | 218 IncrementNodeCount(); |
| 219 DisableCrankshaft(kYield); |
174 node->set_base_id(ReserveIdRange(Yield::num_ids())); | 220 node->set_base_id(ReserveIdRange(Yield::num_ids())); |
175 Visit(node->generator_object()); | 221 Visit(node->generator_object()); |
176 Visit(node->expression()); | 222 Visit(node->expression()); |
177 } | 223 } |
178 | 224 |
179 | 225 |
180 void AstNumberingVisitor::VisitThrow(Throw* node) { | 226 void AstNumberingVisitor::VisitThrow(Throw* node) { |
181 IncrementNodeCount(); | 227 IncrementNodeCount(); |
182 node->set_base_id(ReserveIdRange(Throw::num_ids())); | 228 node->set_base_id(ReserveIdRange(Throw::num_ids())); |
183 Visit(node->exception()); | 229 Visit(node->exception()); |
(...skipping 24 matching lines...) Expand all Loading... |
208 | 254 |
209 void AstNumberingVisitor::VisitFunctionDeclaration(FunctionDeclaration* node) { | 255 void AstNumberingVisitor::VisitFunctionDeclaration(FunctionDeclaration* node) { |
210 IncrementNodeCount(); | 256 IncrementNodeCount(); |
211 VisitVariableProxy(node->proxy()); | 257 VisitVariableProxy(node->proxy()); |
212 VisitFunctionLiteral(node->fun()); | 258 VisitFunctionLiteral(node->fun()); |
213 } | 259 } |
214 | 260 |
215 | 261 |
216 void AstNumberingVisitor::VisitModuleLiteral(ModuleLiteral* node) { | 262 void AstNumberingVisitor::VisitModuleLiteral(ModuleLiteral* node) { |
217 IncrementNodeCount(); | 263 IncrementNodeCount(); |
| 264 DisableCaching(kModuleLiteral); |
218 VisitBlock(node->body()); | 265 VisitBlock(node->body()); |
219 } | 266 } |
220 | 267 |
221 | 268 |
222 void AstNumberingVisitor::VisitCallRuntime(CallRuntime* node) { | 269 void AstNumberingVisitor::VisitCallRuntime(CallRuntime* node) { |
223 IncrementNodeCount(); | 270 IncrementNodeCount(); |
| 271 if (node->is_jsruntime()) { |
| 272 // Don't try to optimize JS runtime calls because we bailout on them. |
| 273 DisableCrankshaft(kCallToAJavaScriptRuntimeFunction); |
| 274 } |
224 node->set_base_id(ReserveIdRange(CallRuntime::num_ids())); | 275 node->set_base_id(ReserveIdRange(CallRuntime::num_ids())); |
225 VisitArguments(node->arguments()); | 276 VisitArguments(node->arguments()); |
226 } | 277 } |
227 | 278 |
228 | 279 |
229 void AstNumberingVisitor::VisitWithStatement(WithStatement* node) { | 280 void AstNumberingVisitor::VisitWithStatement(WithStatement* node) { |
230 IncrementNodeCount(); | 281 IncrementNodeCount(); |
| 282 DisableCrankshaft(kWithStatement); |
231 Visit(node->expression()); | 283 Visit(node->expression()); |
232 Visit(node->statement()); | 284 Visit(node->statement()); |
233 } | 285 } |
234 | 286 |
235 | 287 |
236 void AstNumberingVisitor::VisitDoWhileStatement(DoWhileStatement* node) { | 288 void AstNumberingVisitor::VisitDoWhileStatement(DoWhileStatement* node) { |
237 IncrementNodeCount(); | 289 IncrementNodeCount(); |
| 290 DisableSelfOptimization(); |
238 node->set_base_id(ReserveIdRange(DoWhileStatement::num_ids())); | 291 node->set_base_id(ReserveIdRange(DoWhileStatement::num_ids())); |
239 Visit(node->body()); | 292 Visit(node->body()); |
240 Visit(node->cond()); | 293 Visit(node->cond()); |
241 } | 294 } |
242 | 295 |
243 | 296 |
244 void AstNumberingVisitor::VisitWhileStatement(WhileStatement* node) { | 297 void AstNumberingVisitor::VisitWhileStatement(WhileStatement* node) { |
245 IncrementNodeCount(); | 298 IncrementNodeCount(); |
| 299 DisableSelfOptimization(); |
246 node->set_base_id(ReserveIdRange(WhileStatement::num_ids())); | 300 node->set_base_id(ReserveIdRange(WhileStatement::num_ids())); |
247 Visit(node->cond()); | 301 Visit(node->cond()); |
248 Visit(node->body()); | 302 Visit(node->body()); |
249 } | 303 } |
250 | 304 |
251 | 305 |
252 void AstNumberingVisitor::VisitTryCatchStatement(TryCatchStatement* node) { | 306 void AstNumberingVisitor::VisitTryCatchStatement(TryCatchStatement* node) { |
253 IncrementNodeCount(); | 307 IncrementNodeCount(); |
| 308 DisableTurbofan(kTryCatchStatement); |
254 Visit(node->try_block()); | 309 Visit(node->try_block()); |
255 Visit(node->catch_block()); | 310 Visit(node->catch_block()); |
256 } | 311 } |
257 | 312 |
258 | 313 |
259 void AstNumberingVisitor::VisitTryFinallyStatement(TryFinallyStatement* node) { | 314 void AstNumberingVisitor::VisitTryFinallyStatement(TryFinallyStatement* node) { |
260 IncrementNodeCount(); | 315 IncrementNodeCount(); |
| 316 DisableTurbofan(kTryFinallyStatement); |
261 Visit(node->try_block()); | 317 Visit(node->try_block()); |
262 Visit(node->finally_block()); | 318 Visit(node->finally_block()); |
263 } | 319 } |
264 | 320 |
265 | 321 |
266 void AstNumberingVisitor::VisitProperty(Property* node) { | 322 void AstNumberingVisitor::VisitProperty(Property* node) { |
267 IncrementNodeCount(); | 323 IncrementNodeCount(); |
268 node->set_base_id(ReserveIdRange(Property::num_ids())); | 324 node->set_base_id(ReserveIdRange(Property::num_ids())); |
269 Visit(node->key()); | 325 Visit(node->key()); |
270 Visit(node->obj()); | 326 Visit(node->obj()); |
(...skipping 20 matching lines...) Expand all Loading... |
291 void AstNumberingVisitor::VisitCompareOperation(CompareOperation* node) { | 347 void AstNumberingVisitor::VisitCompareOperation(CompareOperation* node) { |
292 IncrementNodeCount(); | 348 IncrementNodeCount(); |
293 node->set_base_id(ReserveIdRange(CompareOperation::num_ids())); | 349 node->set_base_id(ReserveIdRange(CompareOperation::num_ids())); |
294 Visit(node->left()); | 350 Visit(node->left()); |
295 Visit(node->right()); | 351 Visit(node->right()); |
296 } | 352 } |
297 | 353 |
298 | 354 |
299 void AstNumberingVisitor::VisitForInStatement(ForInStatement* node) { | 355 void AstNumberingVisitor::VisitForInStatement(ForInStatement* node) { |
300 IncrementNodeCount(); | 356 IncrementNodeCount(); |
| 357 DisableSelfOptimization(); |
301 node->set_base_id(ReserveIdRange(ForInStatement::num_ids())); | 358 node->set_base_id(ReserveIdRange(ForInStatement::num_ids())); |
302 Visit(node->each()); | 359 Visit(node->each()); |
303 Visit(node->enumerable()); | 360 Visit(node->enumerable()); |
304 Visit(node->body()); | 361 Visit(node->body()); |
305 } | 362 } |
306 | 363 |
307 | 364 |
308 void AstNumberingVisitor::VisitForOfStatement(ForOfStatement* node) { | 365 void AstNumberingVisitor::VisitForOfStatement(ForOfStatement* node) { |
309 IncrementNodeCount(); | 366 IncrementNodeCount(); |
| 367 DisableTurbofan(kForOfStatement); |
310 node->set_base_id(ReserveIdRange(ForOfStatement::num_ids())); | 368 node->set_base_id(ReserveIdRange(ForOfStatement::num_ids())); |
311 Visit(node->assign_iterator()); | 369 Visit(node->assign_iterator()); |
312 Visit(node->next_result()); | 370 Visit(node->next_result()); |
313 Visit(node->result_done()); | 371 Visit(node->result_done()); |
314 Visit(node->assign_each()); | 372 Visit(node->assign_each()); |
315 Visit(node->body()); | 373 Visit(node->body()); |
316 } | 374 } |
317 | 375 |
318 | 376 |
319 void AstNumberingVisitor::VisitConditional(Conditional* node) { | 377 void AstNumberingVisitor::VisitConditional(Conditional* node) { |
(...skipping 30 matching lines...) Expand all Loading... |
350 void AstNumberingVisitor::VisitCaseClause(CaseClause* node) { | 408 void AstNumberingVisitor::VisitCaseClause(CaseClause* node) { |
351 IncrementNodeCount(); | 409 IncrementNodeCount(); |
352 node->set_base_id(ReserveIdRange(CaseClause::num_ids())); | 410 node->set_base_id(ReserveIdRange(CaseClause::num_ids())); |
353 if (!node->is_default()) Visit(node->label()); | 411 if (!node->is_default()) Visit(node->label()); |
354 VisitStatements(node->statements()); | 412 VisitStatements(node->statements()); |
355 } | 413 } |
356 | 414 |
357 | 415 |
358 void AstNumberingVisitor::VisitForStatement(ForStatement* node) { | 416 void AstNumberingVisitor::VisitForStatement(ForStatement* node) { |
359 IncrementNodeCount(); | 417 IncrementNodeCount(); |
| 418 DisableSelfOptimization(); |
360 node->set_base_id(ReserveIdRange(ForStatement::num_ids())); | 419 node->set_base_id(ReserveIdRange(ForStatement::num_ids())); |
361 if (node->init() != NULL) Visit(node->init()); | 420 if (node->init() != NULL) Visit(node->init()); |
362 if (node->cond() != NULL) Visit(node->cond()); | 421 if (node->cond() != NULL) Visit(node->cond()); |
363 if (node->next() != NULL) Visit(node->next()); | 422 if (node->next() != NULL) Visit(node->next()); |
364 Visit(node->body()); | 423 Visit(node->body()); |
365 } | 424 } |
366 | 425 |
367 | 426 |
368 void AstNumberingVisitor::VisitClassLiteral(ClassLiteral* node) { | 427 void AstNumberingVisitor::VisitClassLiteral(ClassLiteral* node) { |
369 IncrementNodeCount(); | 428 IncrementNodeCount(); |
| 429 DisableTurbofan(kClassLiteral); |
370 node->set_base_id(ReserveIdRange(ClassLiteral::num_ids())); | 430 node->set_base_id(ReserveIdRange(ClassLiteral::num_ids())); |
371 if (node->extends()) Visit(node->extends()); | 431 if (node->extends()) Visit(node->extends()); |
372 if (node->constructor()) Visit(node->constructor()); | 432 if (node->constructor()) Visit(node->constructor()); |
373 for (int i = 0; i < node->properties()->length(); i++) { | 433 for (int i = 0; i < node->properties()->length(); i++) { |
374 VisitObjectLiteralProperty(node->properties()->at(i)); | 434 VisitObjectLiteralProperty(node->properties()->at(i)); |
375 } | 435 } |
376 } | 436 } |
377 | 437 |
378 | 438 |
379 void AstNumberingVisitor::VisitObjectLiteral(ObjectLiteral* node) { | 439 void AstNumberingVisitor::VisitObjectLiteral(ObjectLiteral* node) { |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
460 | 520 |
461 Scope* scope = node->scope(); | 521 Scope* scope = node->scope(); |
462 VisitDeclarations(scope->declarations()); | 522 VisitDeclarations(scope->declarations()); |
463 if (scope->is_function_scope() && scope->function() != NULL) { | 523 if (scope->is_function_scope() && scope->function() != NULL) { |
464 // Visit the name of the named function expression. | 524 // Visit the name of the named function expression. |
465 Visit(scope->function()); | 525 Visit(scope->function()); |
466 } | 526 } |
467 VisitStatements(node->body()); | 527 VisitStatements(node->body()); |
468 | 528 |
469 node->set_ast_properties(&properties_); | 529 node->set_ast_properties(&properties_); |
| 530 node->set_dont_optimize_reason(dont_optimize_reason()); |
470 } | 531 } |
471 | 532 |
472 | 533 |
473 bool AstNumbering::Renumber(FunctionLiteral* function, Zone* zone) { | 534 bool AstNumbering::Renumber(FunctionLiteral* function, Zone* zone) { |
474 AstNumberingVisitor visitor(zone); | 535 AstNumberingVisitor visitor(zone); |
475 visitor.Renumber(function); | 536 visitor.Renumber(function); |
476 return !visitor.HasStackOverflow(); | 537 return !visitor.HasStackOverflow(); |
477 } | 538 } |
478 } | 539 } |
479 } // namespace v8::internal | 540 } // namespace v8::internal |
OLD | NEW |