public LLVMBasicBlockRef Emit(LLVMValueRef context) { // Create the block and its corresponding builder. LLVMBasicBlockRef block = LLVM.AppendBasicBlock(context, Name); LLVMBuilderRef builder = LLVM.CreateBuilder(); // Position and link the builder. LLVM.PositionBuilderAtEnd(builder, block); // Emit the expressions. Expressions.ForEach(expression => { expression.Emit(builder); }); // No value was returned. if (ReturnExpr == null) { LLVM.BuildRetVoid(builder); } // Otherwise, emit the set return value. else { LLVM.BuildRet(builder, ReturnExpr.Emit(builder)); } // Cache emitted block. Current = block; return(block); }
private void Resolve(ReturnExpr @return) { if (!_currentLambda) { throw new Exception("Cannot return when not in a lambda!"); } if (@return.Value != null) { Resolve(@return.Value); } }
/// <summary> /// Execute the statement. /// </summary> public object VisitReturn(ReturnExpr expr) { var parent = expr.FindParent <FunctionExpr>(); if (parent == null) { throw new LangException("syntax error", "unable to return, parent not found", string.Empty, 0); } object result = expr.Exp == null ? LObjects.Null : expr.Exp.Evaluate(this); bool hasReturnVal = expr.Exp != null; parent.HasReturnValue = hasReturnVal; parent.ReturnValue = result; parent.ContinueRunning = false; return(LObjects.Null); }
private object Evaluate(Expr expression) { return(expression switch { BinaryExpr binaryExpr => Evaluate(binaryExpr), BlockExpr blockExpr => Evaluate(blockExpr), BreakExpr breakExpr => Evaluate(breakExpr), CallExpr callExpr => Evaluate(callExpr), ContinueExpr continueExpr => Evaluate(continueExpr), Identifier identifier => Evaluate(identifier), IfExpr ifExpr => Evaluate(ifExpr), LambdaExpr lambdaExpr => Evaluate(lambdaExpr), Literal literal => Evaluate(literal), ReturnExpr returnExpr => Evaluate(returnExpr), UnaryExpr unaryExpr => Evaluate(unaryExpr), _ => throw new ArgumentOutOfRangeException(nameof(expression)) });
public Expr OnParseReturn() { var tokenIt = this._parser.TokenIt; var initiatorToken = tokenIt.NextToken; var expr = new ReturnExpr(); // <codeReturn> tokenIt.Expect(Tokens.Return); if (tokenIt.IsEndOfStmtOrBlock()) { return(expr); } var exp = this._parser.ParseExpression(Terminators.ExpStatementEnd, passNewLine: false); expr.Exp = exp; // </codeReturn> this._parser.SetupContext(expr, initiatorToken); return(expr); }
/// <summary> /// Visits the try statement tree. /// </summary> /// <param name="tryExpr"></param> public object VisitReturn(ReturnExpr expr) { _callBackOnNodeStart(expr); return(null); }