Example #1
0
        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();
        }
Example #2
0
 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);
        }
Example #4
0
 public CallableSymbol(CallableDeclarationStmt declaration, List <ParameterSymbol> parameters, int scope) :
     base(declaration.Identifier, GetCallableType(declaration), scope)
 {
     Parameters = parameters;
 }