public override Value VisitConditionalExpression([NotNull] ConditionalExpressionContext context) { EmitLocation(context); var condition = context.Condition.Accept(this); if (condition == null) { return(null); } var condBool = InstructionBuilder.Compare(RealPredicate.OrderedAndNotEqual, condition, Context.CreateConstant(0.0)) .RegisterName("ifcond"); var function = InstructionBuilder.InsertBlock.ContainingFunction; var thenBlock = Context.CreateBasicBlock("then", function); var elseBlock = Context.CreateBasicBlock("else"); var phiMergeBlock = Context.CreateBasicBlock("ifcont"); InstructionBuilder.Branch(condBool, thenBlock, elseBlock); // generate then block InstructionBuilder.PositionAtEnd(thenBlock); var thenValue = context.ThenExpression.Accept(this); if (thenValue == null) { return(null); } InstructionBuilder.Branch(phiMergeBlock); // capture the insert in case generating thenExpression adds new blocks thenBlock = InstructionBuilder.InsertBlock; // generate else block function.BasicBlocks.Add(elseBlock); InstructionBuilder.PositionAtEnd(elseBlock); var elseValue = context.ElseExpression.Accept(this); if (elseValue == null) { return(null); } InstructionBuilder.Branch(phiMergeBlock); elseBlock = InstructionBuilder.InsertBlock; // generate PHI merge block function.BasicBlocks.Add(phiMergeBlock); InstructionBuilder.PositionAtEnd(phiMergeBlock); var phiNode = InstructionBuilder.PhiNode(function.Context.DoubleType) .RegisterName("iftmp"); phiNode.AddIncoming(thenValue, thenBlock); phiNode.AddIncoming(elseValue, elseBlock); return(phiNode); }
private static void CheckConditional(ConditionalExpressionContext c, string returnType, Action <CompileException, Context> onError, SymbolTable table) { string type = GetExpressionType(c.Children.First.Value, onError, table); if (type != "bool") { onError(new CompileException($"Type of conditional expression in {c.Statement} statement is not bool"), c); } CheckScopeBody(c.Children.First.Next.Value, returnType, onError, table); }
public override IAstNode VisitConditionalExpression([NotNull] ConditionalExpressionContext context) { var expressionSpan = context.GetSourceSpan( ); // compiler generated result variable supports building conditional // expressions without the need for SSA form using mutable variables // The result is assigned a value from both sides of the branch. In // pure SSA form this isn't needed as a PHI node would be used instead. var retVal = new ConditionalExpression(expressionSpan , ( IExpression )context.Condition.Accept(this) , ( IExpression )context.ThenExpression.Accept(this) , ( IExpression )context.ElseExpression.Accept(this) , new LocalVariableDeclaration(expressionSpan, $"$ifresult${LocalVarIndex++}", null, true) ); Push(retVal.ResultVariable); return(retVal); }
public async Task <ICollection <MessageToken> > Execute(BPMNExecutionContext executionContext, UserTask userTask, CancellationToken token) { var pointer = executionContext.Pointer; var instance = executionContext.Instance.GetInstance(pointer.InstanceFlowNodeId); if (!instance.Metadata.ContainsKey(HUMANTASK_INSTANCE_ID_NAME)) { using (var httpClient = _httpClientFactory.Build()) { var operationParameters = new JObject { { "nameIdentifier", executionContext.Instance.NameIdentifier } }; var ctx = new ConditionalExpressionContext(pointer.Incoming); if (userTask.InputParameters != null && userTask.InputParameters.Any()) { foreach (var inputParameter in userTask.InputParameters) { if (string.IsNullOrWhiteSpace(inputParameter.Value)) { continue; } var value = ExpressionParser.GetString(inputParameter.Value, ctx); operationParameters.Add(inputParameter.Key, value); } } var jArr = new JArray(); var link = _options.CallbackUrl.Replace("{id}", executionContext.Instance.AggregateId); link = link.Replace("{eltId}", pointer.InstanceFlowNodeId); jArr.Add(link); var tokenResponse = await httpClient.RequestClientCredentialsTokenAsync(new ClientCredentialsTokenRequest { Address = _options.OAuthTokenEndpoint, ClientId = _options.ClientId, ClientSecret = _options.ClientSecret, Scope = "create_humantaskinstance" }, token); if (tokenResponse.IsError) { throw new BPMNProcessorException(tokenResponse.Error); } var obj = new JObject { { "humanTaskName", userTask.HumanTaskName }, { "operationParameters", operationParameters }, { "callbackUrls", jArr } }; var content = new StringContent(obj.ToString(), Encoding.UTF8, "application/json"); var request = new HttpRequestMessage { Method = HttpMethod.Post, Content = content, RequestUri = new Uri($"{_options.WSHumanTaskAPI}/humantaskinstances") }; request.Headers.Add("Authorization", $"Bearer {tokenResponse.AccessToken}"); var httpResult = await httpClient.SendAsync(request, token); var str = await httpResult.Content.ReadAsStringAsync(); var o = JObject.Parse(str); var humanTaskInstancId = o["id"].ToString(); executionContext.Instance.UpdateMetadata(pointer.InstanceFlowNodeId, HUMANTASK_INSTANCE_ID_NAME, humanTaskInstancId); throw new FlowNodeInstanceBlockedException(); } } var stateTransition = executionContext.Instance.StateTransitions.FirstOrDefault(_ => _.State == "COMPLETED" && _.FlowNodeInstanceId == pointer.InstanceFlowNodeId); if (stateTransition == null) { throw new FlowNodeInstanceBlockedException(); } var result = new List <MessageToken>(); if (stateTransition.Content == null) { result.Add(MessageToken.EmptyMessage()); } else { result.Add(MessageToken.NewMessage(userTask.Id, stateTransition.Content)); } return(result); }
public ConditionalExpressionContext conditionalExpression() { ConditionalExpressionContext _localctx = new ConditionalExpressionContext(Context, State); EnterRule(_localctx, 44, RULE_conditionalExpression); try { EnterOuterAlt(_localctx, 1); { State = 307; logicalOrExpression(0); State = 313; switch ( Interpreter.AdaptivePredict(TokenStream,29,Context) ) { case 1: { State = 308; Match(Question); State = 309; expression(); State = 310; Match(Colon); State = 311; conditionalExpression(); } break; } } } catch (RecognitionException re) { _localctx.exception = re; ErrorHandler.ReportError(this, re); ErrorHandler.Recover(this, re); } finally { ExitRule(); } return _localctx; }