public static void _EmitReturn(ReturnStatement rs,  List<ILInstuction> il)
        {
            if (rs.Expression != null) {
                var returnVariable = _EmitExpression(rs.Expression, il);

                CurrentFunction.AddLocal(returnVariable, rs.Expression.ResultType);

                ILReturn ilReturn = new ILReturn();
                ilReturn.Line = GetLabel();
                ilReturn.Return = _constructVariableAccess(returnVariable);
                il.Add(ilReturn);
            } else {
                ILReturn ilReturn = new ILReturn();
                ilReturn.Line = GetLabel();
                il.Add(ilReturn);
            }
        }
        public static bool ValidateReturnStatement(ReturnStatement returnStatement, SymbolTableLight table)
        {
            bool validReturn = returnStatement.Validate(table);

            if (validReturn && (returnStatement.Expression != null || f_currentFunction.Header.ReturnType != null) && (
                (returnStatement.Expression == null && f_currentFunction.Header.ReturnType != null) ||
                (returnStatement.Expression != null && f_currentFunction.Header.ReturnType == null) ||
                !IsAssignable(f_currentFunction.Header.ReturnType, returnStatement.Expression.ResultType)
                ))
            {
                CompilerServices.AddError(
                    returnStatement.Location,
                    "Return type doesn't match function prototype"
                );
                return false;
            }

            return validReturn;
        }
 public static void EmitReturn(ReturnStatement rs,  List<ILInstuction> il)
 {
     ILReturn ilReturn = new ILReturn();
     ilReturn.Line = GetLabel();
     ilReturn.Return = ConstructILExpression(rs.Expression);
     il.Add(ilReturn);
 }
Example #4
0
 public static void EmitReturn(ReturnStatement returnStatement, SymbolTable table, ILGenerator ilGen)
 {
     if (returnStatement.Expression == null)
     {
         ilGen.Emit(OpCodes.Ret);
     }
     else
     {
         EmitExpression(returnStatement.Expression, table, ilGen);
         ilGen.Emit(OpCodes.Ret);
     }
 }