示例#1
0
文件: asm.cs 项目: stjordanis/plil
        public void Load(IAsm a)
        {
            StringBuilder sb = new StringBuilder(Io.MAXSTR);
            Var           e  = a.getVar();

            if (e == null)
            {
                io.Abort("PL0402: load instruction with no variable ptr");
            }
            switch (e.getClassId())
            {
            case Tok.T_STATIC:
                sb.Append("\tldsfld ");
                sb.Append(genFieldRef(e));
                sb.Append("\t\t\t\t\t//");
                sb.Append(a.getICount());
                sb.Append(", ");
                sb.Append(e.getName());
                sb.Append("\r\n");
                break;

            case Tok.T_AUTO:
            case Tok.T_DEFCLASS:
                sb.Append("\tldloc ");
                sb.Append(e.getIndex());
                sb.Append("\t\t\t\t\t//");
                sb.Append(a.getICount());
                sb.Append(", ");
                sb.Append(e.getName());
                sb.Append("\r\n");
                break;

            case Tok.T_PARAM:
                sb.Append("\tldarg ");
                sb.Append(e.getIndex());
                sb.Append("\t\t\t\t\t//");
                sb.Append(a.getICount());
                sb.Append(", ");
                sb.Append(e.getName());
                sb.Append("\r\n");
                break;

            default:
                io.Abort("PL0403: instruction load of unknown class (" + e.getClassId() + ")");
                break;
            }
            io.Out(sb.ToString());
        }
示例#2
0
文件: asm.cs 项目: stjordanis/plil
        public void FieldDef(IAsm a)
        {
            Var    e      = a.getVar();
            String prefix = "";

            switch (e.getClassId())
            {
            case Tok.T_STATIC:
                prefix = "\t.field ";
                break;

            case Tok.T_AUTO:
            case Tok.T_DEFCLASS:
                prefix = "\t.field ";
                break;

            default:
                io.Abort("PL0407: unhandled field def type");
                break;
            }

            StringBuilder sb = new StringBuilder(Io.MAXSTR);

            sb.Append(prefix);
            sb.Append(genDataTypeSig(e));
            sb.Append(" ");
            sb.Append(e.getName());
            sb.Append("\r\n");
            io.Out(sb.ToString());
        }
示例#3
0
文件: blk.cs 项目: master/plil
 public void add(Var e)
 {
     int index = vindex++;
     e.setIndex(index);
     vhash.Add(e.getName(), e);
     vhash.Add(index, e);
 }
示例#4
0
        public void add(Var e)
        {
            int index = vindex++;

            e.setIndex(index);
            vhash.Add(e.getName(), e);
            vhash.Add(index, e);
        }
示例#5
0
文件: asm.cs 项目: stjordanis/plil
        public void FuncBegin(IAsm a)
        {
            Var    func    = a.getVar();
            String funcsig = genDataTypeSig(a.getVar());

            VarList x        = func.getParams();
            String  paramsig = "";

            if (x.Length() > 0)
            {
                int           max = x.Length();
                StringBuilder t   = new StringBuilder(Io.MAXSTR);
                for (int i = 0; i < max; i++)
                {
                    Var e = x.FindByIndex(i);
                    t.Append(genDataTypeSig(e));
                    if (i < max - 1)
                    {
                        t.Append(",");
                    }
                }
                paramsig = t.ToString();
            }
            StringBuilder sb = new StringBuilder(Io.MAXSTR);

            sb.Append("\t.method public ");
            sb.Append("static ");
            sb.Append(funcsig);
            sb.Append(" ");
            sb.Append(func.getName());
            sb.Append("(");
            sb.Append(paramsig);
            sb.Append(") {\r\n");
            io.Out(sb.ToString());

            if (func.getName().ToLower().Equals("main"))
            {
                io.Out("\t.entrypoint\r\n");
            }
        }
示例#6
0
文件: exe.cs 项目: stjordanis/plil
        public void FuncBegin(IAsm a)
        {
            Var  func    = a.getVar();
            Type funcsig = genDataTypeSig(a.getVar());

            VarList paramlist = func.getParams();

            Type[] paramTypes = null;

            if (paramlist.Length() > 0)
            {
                int max = paramlist.Length();
                paramTypes = new Type[max];
                for (int i = 0; i < max; i++)
                {
                    Var e = paramlist.FindByIndex(i);
                    paramTypes[i] = genDataTypeSig(e);
                }
            }

            emethod = eclass.DefineMethod(func.getName(),
                                          MethodAttributes.Static | MethodAttributes.Public,
                                          funcsig, paramTypes);
            func.setMethodBuilder(emethod);

            for (int i = 0; i < paramlist.Length(); i++)
            {
                emethod.DefineParameter(i + 1, 0, paramlist.FindByIndex(i).getName());
            }

            il = emethod.GetILGenerator();

            if (func.getName().ToLower().Equals("main"))
            {
                appbuild.SetEntryPoint(emethod);
            }
            //    emodule.SetUserEntryPoint(emethod);

            labelhash = new Hashtable();
        }
示例#7
0
文件: asm.cs 项目: stjordanis/plil
        public void Call(IAsm a)
        {
            Var     func = a.getVar();
            LibFunc lfunc;

            String funcsig = genDataTypeSig(a.getVar());

            VarList x        = func.getParams();
            String  paramsig = "";

            if (x.Length() > 0)
            {
                int           max = x.Length();
                StringBuilder t   = new StringBuilder(Io.MAXSTR);
                for (int i = 0; i < max; i++)
                {
                    Var e = x.FindByIndex(i);
                    t.Append(genDataTypeSig(e));
                    if (i < max - 1)
                    {
                        t.Append(",");
                    }
                }
                paramsig = t.ToString();
            }

            StringBuilder sb = new StringBuilder(Io.MAXSTR);

            sb.Append("\tcall ");
            sb.Append(funcsig);
            sb.Append(" ");

            lfunc = lib.lookup_func(a.getVar().getName());
            if (lfunc != null)
            {
                sb.Append(lfunc.nameFull);
            }
            else
            {
                sb.Append(io.GetClassname());
                sb.Append("::");
                sb.Append(func.getName());
                sb.Append("(");
                sb.Append(paramsig);
                sb.Append(")");
            }

            sb.Append("\t\t\t\t\t//");
            sb.Append(a.getICount());
            sb.Append("\r\n");
            io.Out(sb.ToString());
        }
示例#8
0
        public void mergeNodes(VarList p)
        {
            int i;

            for (i = 0; i < p.Length(); i++)
            {
                Var varSrc = p.FindByIndex(i);
                Var varTrg = FindByName(varSrc.getName());
                if ((varTrg != null) && (varTrg.getType() != Var.VAR_PARAM))
                {
                    add(varSrc);
                }
                else
                if (varTrg == null)
                {
                    add(varSrc);
                }
                else
                {
                    FindByName(varSrc.getName()).setTypeId(varSrc.getTypeId());
                    FindByName(varSrc.getName()).setGranularity(varSrc.getGranularity());
                }
            }
        }
示例#9
0
文件: exe.cs 项目: stjordanis/plil
        public void FieldDef(IAsm a)
        {
            Var             e    = a.getVar();
            FieldAttributes attr = FieldAttributes.Private;

            if (e.getClassId() == Tok.T_STATIC)
            {
                attr |= FieldAttributes.Static;
            }

            Type t = genDataTypeSig(e);                         /* gen type info */

            FieldBuilder f = eclass.DefineField(e.getName(), t, attr);

            e.setFieldBuilder((Object)f);
        }
示例#10
0
文件: exe.cs 项目: stjordanis/plil
        public void LocalVars(VarList v)
        {
            int max = v.Length();

            for (int i = 0; i < max; i++)
            {
                Var          e  = v.FindByIndex(i);
                Type         et = genDataTypeSig(e);
                LocalBuilder t  = il.DeclareLocal(et);
                if (io.getGenDebug())
                {
                    t.SetLocalSymInfo(e.getName());
                }
                e.setLocalToken(t);
            }
            localvars = v;
        }
示例#11
0
文件: asm.cs 项目: stjordanis/plil
        private string genFieldRef(Var e)
        {
            if (e == null)
            {
                return(null);
            }
            StringBuilder sb = new StringBuilder(Io.MAXSTR);

            if (e.getSign() == Tok.T_UNSIGNED)
            {
                sb.Append("unsigned ");
            }
            sb.Append(ilSType(e.getTypeId()));
            sb.Append(" ");
            sb.Append("Class" + io.GetClassname());
            sb.Append(".");
            sb.Append(e.getName());
            return(sb.ToString());
        }
示例#12
0
文件: exe.cs 项目: stjordanis/plil
        public void Call(IAsm a)
        {
            Var    func = a.getVar();
            Object o    = func.getMethodBuilder();

            LibFunc lfunc = lib.lookup_func(a.getVar().getName());

            if (lfunc != null)
            {
                il.Emit(OpCodes.Call, lfunc.methodInfo);
            }
            else
            {
                if (o == null)
                {
                    io.ICE("no previous extern for (" + func.getName() + ")");
                }
                MethodBuilder mb = (MethodBuilder)o;
                il.Emit(OpCodes.Call, mb);
            }
        }
示例#13
0
文件: asm.cs 项目: master/plil
 private string genFieldRef(Var e)
 {
     if (e == null) return null;
     StringBuilder sb = new StringBuilder(Io.MAXSTR);
     if (e.getSign() == Tok.T_UNSIGNED) sb.Append("unsigned ");
     sb.Append(ilSType(e.getTypeId()));
     sb.Append(" ");
     sb.Append("Class" + io.GetClassname());
     sb.Append(".");
     sb.Append(e.getName());
     return (sb.ToString());
 }