private void Visit(CallableDeclarationStmt declaration) { var funcSymbol = declaration.DeclarationSymbol; Type[] paramTypes = funcSymbol.Parameters.Select(p => { if (p.IsReference) { return(p.Type.CILType.MakeByRefType()); } return(p.Type.CILType); }).ToArray(); var func = typeBuilder.DefineMethod(funcSymbol.ScopedName, MethodAttributes.Static, funcSymbol.Type.CILType, paramTypes); declaration.DeclarationSymbol.CILMethod = func; MethodStack.Push(func); int index = 1; foreach (var parameter in funcSymbol.Parameters) { var CILParameter = func.DefineParameter(index, ParameterAttributes.None, parameter.Name); parameter.CILParameter = CILParameter; } foreach (var statement in declaration.ProcedureBlock.Statements) { Visit((dynamic)statement); } if (declaration is ProcedureDeclarationStmt) { CurrentMethodIL.Emit(OpCodes.Ret); } MethodStack.Pop(); }
private static TypeInfo GetCallableType(CallableDeclarationStmt declaration) { if (declaration is FunctionDeclarationStmt) { return(new TypeInfo(((FunctionDeclarationStmt)declaration).ReturnType)); } else { return(TypeInfo.BasicVoid); } }
private void Visit(CallableDeclarationStmt statement) { var symbol = statement.DeclarationSymbol; foreach (var freeSym in symbol.FreeVariables) { if (true) { var varSym = freeSym; TypeNode paramType; if (varSym.Type.IsArray) { paramType = new ArrayType(0, 0, varSym.Type.BasicType); } else { paramType = new SimpleType(0, 0, varSym.Type.BasicType); } statement.AddParameter(varSym.Name, paramType, true); } } Visit(statement.ProcedureBlock); }
public CallableSymbol(CallableDeclarationStmt declaration, List <ParameterSymbol> parameters, int scope) : base(declaration.Identifier, GetCallableType(declaration), scope) { Parameters = parameters; }