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/ast-loop-assignment-analyzer.h" | 8 #include "src/compiler/ast-loop-assignment-analyzer.h" |
9 #include "src/compiler/control-builders.h" | 9 #include "src/compiler/control-builders.h" |
10 #include "src/compiler/linkage.h" | 10 #include "src/compiler/linkage.h" |
(...skipping 1289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1300 // The result value semantics depend on how the block was entered: | 1300 // The result value semantics depend on how the block was entered: |
1301 // - ReturnStatement: It represents the return value being returned. | 1301 // - ReturnStatement: It represents the return value being returned. |
1302 // - ThrowStatement: It represents the exception being thrown. | 1302 // - ThrowStatement: It represents the exception being thrown. |
1303 // - BreakStatement/ContinueStatement: Filled with the hole. | 1303 // - BreakStatement/ContinueStatement: Filled with the hole. |
1304 // - Falling through into finally-block: Filled with the hole. | 1304 // - Falling through into finally-block: Filled with the hole. |
1305 Node* result = try_control.GetResultValueNode(); | 1305 Node* result = try_control.GetResultValueNode(); |
1306 Node* token = try_control.GetDispatchTokenNode(); | 1306 Node* token = try_control.GetDispatchTokenNode(); |
1307 | 1307 |
1308 // The result value, dispatch token and message is expected on the operand | 1308 // The result value, dispatch token and message is expected on the operand |
1309 // stack (this is in sync with FullCodeGenerator::EnterFinallyBlock). | 1309 // stack (this is in sync with FullCodeGenerator::EnterFinallyBlock). |
| 1310 Node* message = BuildLoadExternal(message_object, kMachAnyTagged); |
1310 environment()->Push(token); // TODO(mstarzinger): Cook token! | 1311 environment()->Push(token); // TODO(mstarzinger): Cook token! |
1311 environment()->Push(result); | 1312 environment()->Push(result); |
1312 environment()->Push(BuildLoadExternal(message_object, kMachAnyTagged)); | 1313 environment()->Push(message); |
1313 | 1314 |
1314 // Evaluate the finally-block. | 1315 // Evaluate the finally-block. |
1315 Visit(stmt->finally_block()); | 1316 Visit(stmt->finally_block()); |
1316 try_control.EndFinally(); | 1317 try_control.EndFinally(); |
1317 | 1318 |
1318 // The result value, dispatch token and message is restored from the operand | 1319 // The result value, dispatch token and message is restored from the operand |
1319 // stack (this is in sync with FullCodeGenerator::ExitFinallyBlock). | 1320 // stack (this is in sync with FullCodeGenerator::ExitFinallyBlock). |
1320 BuildStoreExternal(message_object, kMachAnyTagged, environment()->Pop()); | 1321 message = environment()->Pop(); |
1321 result = environment()->Pop(); | 1322 result = environment()->Pop(); |
1322 token = environment()->Pop(); // TODO(mstarzinger): Uncook token! | 1323 token = environment()->Pop(); // TODO(mstarzinger): Uncook token! |
| 1324 BuildStoreExternal(message_object, kMachAnyTagged, message); |
1323 | 1325 |
1324 // Dynamic dispatch after the finally-block. | 1326 // Dynamic dispatch after the finally-block. |
1325 commands->ApplyDeferredCommands(token, result); | 1327 commands->ApplyDeferredCommands(token, result); |
1326 | 1328 |
1327 // TODO(mstarzinger): Remove bailout once everything works. | 1329 // TODO(mstarzinger): Remove bailout once everything works. |
1328 if (!FLAG_turbo_exceptions) SetStackOverflow(); | 1330 if (!FLAG_turbo_exceptions) SetStackOverflow(); |
1329 } | 1331 } |
1330 | 1332 |
1331 | 1333 |
1332 void AstGraphBuilder::VisitDebuggerStatement(DebuggerStatement* stmt) { | 1334 void AstGraphBuilder::VisitDebuggerStatement(DebuggerStatement* stmt) { |
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1643 // its right. All the code from above initializes the static component of the | 1645 // its right. All the code from above initializes the static component of the |
1644 // object literal, and arranges for the map of the result to reflect the | 1646 // object literal, and arranges for the map of the result to reflect the |
1645 // static order in which the keys appear. For the dynamic properties, we | 1647 // static order in which the keys appear. For the dynamic properties, we |
1646 // compile them into a series of "SetOwnProperty" runtime calls. This will | 1648 // compile them into a series of "SetOwnProperty" runtime calls. This will |
1647 // preserve insertion order. | 1649 // preserve insertion order. |
1648 for (; property_index < expr->properties()->length(); property_index++) { | 1650 for (; property_index < expr->properties()->length(); property_index++) { |
1649 ObjectLiteral::Property* property = expr->properties()->at(property_index); | 1651 ObjectLiteral::Property* property = expr->properties()->at(property_index); |
1650 | 1652 |
1651 environment()->Push(literal); // Duplicate receiver. | 1653 environment()->Push(literal); // Duplicate receiver. |
1652 VisitForValue(property->key()); | 1654 VisitForValue(property->key()); |
1653 environment()->Push(BuildToName(environment()->Pop(), | 1655 Node* name = BuildToName(environment()->Pop(), |
1654 expr->GetIdForProperty(property_index))); | 1656 expr->GetIdForProperty(property_index)); |
| 1657 environment()->Push(name); |
1655 // TODO(mstarzinger): For ObjectLiteral::Property::PROTOTYPE the key should | 1658 // TODO(mstarzinger): For ObjectLiteral::Property::PROTOTYPE the key should |
1656 // not be on the operand stack while the value is being evaluated. Come up | 1659 // not be on the operand stack while the value is being evaluated. Come up |
1657 // with a repro for this and fix it. Also find a nice way to do so. :) | 1660 // with a repro for this and fix it. Also find a nice way to do so. :) |
1658 VisitForValue(property->value()); | 1661 VisitForValue(property->value()); |
1659 Node* value = environment()->Pop(); | 1662 Node* value = environment()->Pop(); |
1660 Node* key = environment()->Pop(); | 1663 Node* key = environment()->Pop(); |
1661 Node* receiver = environment()->Pop(); | 1664 Node* receiver = environment()->Pop(); |
1662 BuildSetHomeObject(value, receiver, property->value()); | 1665 BuildSetHomeObject(value, receiver, property->value()); |
1663 | 1666 |
1664 switch (property->kind()) { | 1667 switch (property->kind()) { |
(...skipping 803 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2468 if (!info()->scope()->uses_this() && !info()->scope()->inner_uses_this() && | 2471 if (!info()->scope()->uses_this() && !info()->scope()->inner_uses_this() && |
2469 !info()->scope()->calls_sloppy_eval()) { | 2472 !info()->scope()->calls_sloppy_eval()) { |
2470 return receiver; | 2473 return receiver; |
2471 } | 2474 } |
2472 | 2475 |
2473 IfBuilder receiver_check(this); | 2476 IfBuilder receiver_check(this); |
2474 Node* undefined = jsgraph()->UndefinedConstant(); | 2477 Node* undefined = jsgraph()->UndefinedConstant(); |
2475 Node* check = NewNode(javascript()->StrictEqual(), receiver, undefined); | 2478 Node* check = NewNode(javascript()->StrictEqual(), receiver, undefined); |
2476 receiver_check.If(check); | 2479 receiver_check.If(check); |
2477 receiver_check.Then(); | 2480 receiver_check.Then(); |
2478 environment()->Push(BuildLoadGlobalProxy()); | 2481 Node* proxy = BuildLoadGlobalProxy(); |
| 2482 environment()->Push(proxy); |
2479 receiver_check.Else(); | 2483 receiver_check.Else(); |
2480 environment()->Push(receiver); | 2484 environment()->Push(receiver); |
2481 receiver_check.End(); | 2485 receiver_check.End(); |
2482 return environment()->Pop(); | 2486 return environment()->Pop(); |
2483 } | 2487 } |
2484 | 2488 |
2485 | 2489 |
2486 Node* AstGraphBuilder::BuildLocalFunctionContext(Node* context, Node* closure) { | 2490 Node* AstGraphBuilder::BuildLocalFunctionContext(Node* context, Node* closure) { |
2487 // Allocate a new local context. | 2491 // Allocate a new local context. |
2488 const Operator* op = javascript()->CreateFunctionContext(); | 2492 const Operator* op = javascript()->CreateFunctionContext(); |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2567 | 2571 |
2568 | 2572 |
2569 Node* AstGraphBuilder::BuildHoleCheckThrow(Node* value, Variable* variable, | 2573 Node* AstGraphBuilder::BuildHoleCheckThrow(Node* value, Variable* variable, |
2570 Node* not_hole, | 2574 Node* not_hole, |
2571 BailoutId bailout_id) { | 2575 BailoutId bailout_id) { |
2572 IfBuilder hole_check(this); | 2576 IfBuilder hole_check(this); |
2573 Node* the_hole = jsgraph()->TheHoleConstant(); | 2577 Node* the_hole = jsgraph()->TheHoleConstant(); |
2574 Node* check = NewNode(javascript()->StrictEqual(), value, the_hole); | 2578 Node* check = NewNode(javascript()->StrictEqual(), value, the_hole); |
2575 hole_check.If(check); | 2579 hole_check.If(check); |
2576 hole_check.Then(); | 2580 hole_check.Then(); |
2577 environment()->Push(BuildThrowReferenceError(variable, bailout_id)); | 2581 Node* error = BuildThrowReferenceError(variable, bailout_id); |
| 2582 environment()->Push(error); |
2578 hole_check.Else(); | 2583 hole_check.Else(); |
2579 environment()->Push(not_hole); | 2584 environment()->Push(not_hole); |
2580 hole_check.End(); | 2585 hole_check.End(); |
2581 return environment()->Pop(); | 2586 return environment()->Pop(); |
2582 } | 2587 } |
2583 | 2588 |
2584 | 2589 |
2585 Node* AstGraphBuilder::BuildThrowIfStaticPrototype(Node* name, | 2590 Node* AstGraphBuilder::BuildThrowIfStaticPrototype(Node* name, |
2586 BailoutId bailout_id) { | 2591 BailoutId bailout_id) { |
2587 IfBuilder prototype_check(this); | 2592 IfBuilder prototype_check(this); |
(...skipping 760 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3348 // Phi does not exist yet, introduce one. | 3353 // Phi does not exist yet, introduce one. |
3349 value = NewPhi(inputs, value, control); | 3354 value = NewPhi(inputs, value, control); |
3350 value->ReplaceInput(inputs - 1, other); | 3355 value->ReplaceInput(inputs - 1, other); |
3351 } | 3356 } |
3352 return value; | 3357 return value; |
3353 } | 3358 } |
3354 | 3359 |
3355 } // namespace compiler | 3360 } // namespace compiler |
3356 } // namespace internal | 3361 } // namespace internal |
3357 } // namespace v8 | 3362 } // namespace v8 |
OLD | NEW |