Exemple #1
0
        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);
        }
Exemple #2
0
        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);
        }
Exemple #4
0
 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);
 }