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); }
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); } }