private bool HandleAwaitStatement(JsAwaitStatement stmt, StackEntry location, ImmutableStack <StackEntry> stack, ImmutableStack <Tuple <string, State> > breakStack, ImmutableStack <Tuple <string, State> > continueStack, State currentState, State returnState, IList <JsStatement> currentBlock)
        {
            var  stateAfter       = GetStateAfterStatement(location, stack, currentState.FinallyStack, returnState).Item1;
            bool createDummyState = false;

            if (stateAfter.StateValue == returnState.StateValue)
            {
                stateAfter       = CreateNewStateValue(currentState.FinallyStack);
                createDummyState = true;                        // We must never return to our parent state after an await because
            }

            currentBlock.Add(new JsSetNextStateStatement(stateAfter.StateValue));
            currentBlock.Add(JsExpression.Invocation(JsExpression.Member(stmt.Awaiter, stmt.OnCompletedMethodName), JsExpression.Identifier(_stateMachineMethodName)));
            if (_needDoFinallyBlocksVariable)
            {
                currentBlock.Add(JsExpression.Assign(JsExpression.Identifier(_doFinallyBlocksVariableName), JsExpression.False));
            }
            currentBlock.Add(JsStatement.Return());

            if (!stack.IsEmpty || location.Index < location.Block.Statements.Count - 1)
            {
                Enqueue(PushFollowing(stack, location), breakStack, continueStack, stateAfter, returnState);
            }
            if (createDummyState)
            {
                Enqueue(ImmutableStack <StackEntry> .Empty.Push(new StackEntry(JsStatement.Block(JsStatement.BlockMerged(new JsStatement[0])), 0)), breakStack, continueStack, stateAfter, returnState);
            }

            return(false);
        }
Example #2
0
 public object VisitAwaitStatement(JsAwaitStatement statement, bool addNewline)
 {
     if (!_allowIntermediates)
     {
         throw new NotSupportedException("await should not occur in the output stage");
     }
     _cb.Append("await ");
     VisitExpression(statement.Awaiter, false);
     _cb.Append(":" + statement.OnCompletedMethodName + ";");
     if (addNewline)
     {
         _cb.AppendLine();
     }
     return(null);
 }
 public override JsStatement VisitAwaitStatement(JsAwaitStatement statement, object data)
 {
     _result |= InterestingConstruct.Await;
     return(statement);
 }
		private bool HandleAwaitStatement(JsAwaitStatement stmt, StackEntry location, ImmutableStack<StackEntry> stack, ImmutableStack<Tuple<string, State>> breakStack, ImmutableStack<Tuple<string, State>> continueStack, State currentState, State returnState, IList<JsStatement> currentBlock) {
			var stateAfter = GetStateAfterStatement(location, stack, currentState.FinallyStack, returnState).Item1;
			bool createDummyState = false;
			if (stateAfter.StateValue == returnState.StateValue) {
				stateAfter = CreateNewStateValue(currentState.FinallyStack);
				createDummyState = true;	// We must never return to our parent state after an await because 
			}

			currentBlock.Add(new JsSetNextStateStatement(stateAfter.StateValue));
			currentBlock.Add(JsExpression.Invocation(JsExpression.Member(stmt.Awaiter, stmt.OnCompletedMethodName), JsExpression.Identifier(_stateMachineMethodName)));
			if (_needDoFinallyBlocksVariable)
				currentBlock.Add(JsExpression.Assign(JsExpression.Identifier(_doFinallyBlocksVariableName), JsExpression.False));
			currentBlock.Add(JsStatement.Return());

			if (!stack.IsEmpty || location.Index < location.Block.Statements.Count - 1) {
				Enqueue(PushFollowing(stack, location), breakStack, continueStack, stateAfter, returnState);
			}
			if (createDummyState) {
				Enqueue(ImmutableStack<StackEntry>.Empty.Push(new StackEntry(JsStatement.Block(JsStatement.BlockMerged(new JsStatement[0])), 0)), breakStack, continueStack, stateAfter, returnState);
			}

			return false;
		}
        public virtual JsStatement VisitAwaitStatement(JsAwaitStatement statement, TData data)
        {
            var awaiter = VisitExpression(statement.Awaiter, data);

            return(ReferenceEquals(awaiter, statement.Awaiter) ? statement : new JsAwaitStatement(awaiter, statement.OnCompletedMethodName));
        }