| Index: src/compiler/ast-graph-builder.cc
|
| diff --git a/src/compiler/ast-graph-builder.cc b/src/compiler/ast-graph-builder.cc
|
| index 6cf419fc95808f193ec72a5aad7170a20a483bcd..c2e7bc849d704bb430fce95ce5e45a1f38c9fa1a 100644
|
| --- a/src/compiler/ast-graph-builder.cc
|
| +++ b/src/compiler/ast-graph-builder.cc
|
| @@ -1252,6 +1252,13 @@ void AstGraphBuilder::VisitTryCatchStatement(TryCatchStatement* stmt) {
|
| void AstGraphBuilder::VisitTryFinallyStatement(TryFinallyStatement* stmt) {
|
| TryFinallyBuilder try_control(this);
|
|
|
| + ExternalReference message_object =
|
| + ExternalReference::address_of_pending_message_obj(isolate());
|
| + ExternalReference message_present =
|
| + ExternalReference::address_of_has_pending_message(isolate());
|
| + ExternalReference message_script =
|
| + ExternalReference::address_of_pending_message_script(isolate());
|
| +
|
| // We keep a record of all paths that enter the finally-block to be able to
|
| // dispatch to the correct continuation point after the statements in the
|
| // finally-block have been evaluated.
|
| @@ -1280,23 +1287,29 @@ void AstGraphBuilder::VisitTryFinallyStatement(TryFinallyStatement* stmt) {
|
| // - BreakStatement/ContinueStatement: Filled with the hole.
|
| // - Falling through into finally-block: Filled with the hole.
|
| Node* result = try_control.GetResultValueNode();
|
| + Node* token = try_control.GetDispatchTokenNode();
|
|
|
| - // TODO(mstarzinger): See FullCodeGenerator::EnterFinallyBlock.
|
| - environment()->Push(jsgraph()->SmiConstant(Code::kHeaderSize));
|
| + // The result value, dispatch token and message is expected on the operand
|
| + // stack (this is in sync with FullCodeGenerator::EnterFinallyBlock).
|
| + environment()->Push(token); // TODO(mstarzinger): Cook token!
|
| environment()->Push(result);
|
| - environment()->Push(jsgraph()->TheHoleConstant()); // pending_message_obj
|
| - environment()->Push(jsgraph()->SmiConstant(0)); // has_pending_message
|
| - environment()->Push(jsgraph()->TheHoleConstant()); // pending_message_script
|
| + environment()->Push(BuildLoadExternal(message_object, kMachAnyTagged));
|
| + environment()->Push(BuildLoadExternal(message_present, kMachBool));
|
| + environment()->Push(BuildLoadExternal(message_script, kMachAnyTagged));
|
|
|
| // Evaluate the finally-block.
|
| Visit(stmt->finally_block());
|
| try_control.EndFinally();
|
|
|
| - // TODO(mstarzinger): See FullCodeGenerator::ExitFinallyBlock.
|
| - environment()->Drop(5);
|
| + // The result value, dispatch token and message is restored from the operand
|
| + // stack (this is in sync with FullCodeGenerator::ExitFinallyBlock).
|
| + BuildStoreExternal(message_script, kMachAnyTagged, environment()->Pop());
|
| + BuildStoreExternal(message_present, kMachBool, environment()->Pop());
|
| + BuildStoreExternal(message_object, kMachAnyTagged, environment()->Pop());
|
| + result = environment()->Pop();
|
| + token = environment()->Pop(); // TODO(mstarzinger): Uncook token!
|
|
|
| // Dynamic dispatch after the finally-block.
|
| - Node* token = try_control.GetDispatchTokenNode();
|
| commands->ApplyDeferredCommands(token, result);
|
|
|
| // TODO(mstarzinger): Remove bailout once everything works.
|
| @@ -2776,9 +2789,8 @@ Node* AstGraphBuilder::BuildVariableAssignment(
|
|
|
|
|
| Node* AstGraphBuilder::BuildLoadObjectField(Node* object, int offset) {
|
| - Node* field_load = NewNode(jsgraph()->machine()->Load(kMachAnyTagged), object,
|
| - jsgraph()->Int32Constant(offset - kHeapObjectTag));
|
| - return field_load;
|
| + return NewNode(jsgraph()->machine()->Load(kMachAnyTagged), object,
|
| + jsgraph()->IntPtrConstant(offset - kHeapObjectTag));
|
| }
|
|
|
|
|
| @@ -2805,6 +2817,23 @@ Node* AstGraphBuilder::BuildLoadGlobalProxy() {
|
| }
|
|
|
|
|
| +Node* AstGraphBuilder::BuildLoadExternal(ExternalReference reference,
|
| + MachineType type) {
|
| + return NewNode(jsgraph()->machine()->Load(type),
|
| + jsgraph()->ExternalConstant(reference),
|
| + jsgraph()->IntPtrConstant(0));
|
| +}
|
| +
|
| +
|
| +Node* AstGraphBuilder::BuildStoreExternal(ExternalReference reference,
|
| + MachineType type, Node* value) {
|
| + StoreRepresentation representation(type, kNoWriteBarrier);
|
| + return NewNode(jsgraph()->machine()->Store(representation),
|
| + jsgraph()->ExternalConstant(reference),
|
| + jsgraph()->IntPtrConstant(0), value);
|
| +}
|
| +
|
| +
|
| Node* AstGraphBuilder::BuildToBoolean(Node* input) {
|
| // TODO(titzer): This should be in a JSOperatorReducer.
|
| switch (input->opcode()) {
|
| @@ -2940,11 +2969,8 @@ Node* AstGraphBuilder::BuildBinaryOp(Node* left, Node* right, Token::Value op) {
|
|
|
| Node* AstGraphBuilder::BuildStackCheck() {
|
| IfBuilder stack_check(this);
|
| - Node* limit =
|
| - NewNode(jsgraph()->machine()->Load(kMachPtr),
|
| - jsgraph()->ExternalConstant(
|
| - ExternalReference::address_of_stack_limit(isolate())),
|
| - jsgraph()->ZeroConstant());
|
| + Node* limit = BuildLoadExternal(
|
| + ExternalReference::address_of_stack_limit(isolate()), kMachPtr);
|
| Node* stack = NewNode(jsgraph()->machine()->LoadStackPointer());
|
| Node* tag = NewNode(jsgraph()->machine()->UintLessThan(), limit, stack);
|
| stack_check.If(tag, BranchHint::kTrue);
|
|
|