コード例 #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
ファイル: 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);
        }
コード例 #4
0
ファイル: exe.cs プロジェクト: master/plil
        void genLoad(Var e)
        {
            int id = e.getClassId();
            if (e == null) io.ICE("load instruction with no variable ptr");
            if (e.getLocalToken() != null) {

                // LocalToken lt = (LocalToken) e.getLocalToken();
                LocalBuilder lt = (LocalBuilder) e.getLocalToken();
                il.Emit(OpCodes.Ldloc, lt);

            } else {

                if (e.getFieldBuilder() != null) {

                    FieldBuilder fb = (FieldBuilder) e.getFieldBuilder();
                    if (id == Tok.T_STATIC) il.Emit(OpCodes.Ldsfld, fb);
                    else il.Emit(OpCodes.Ldfld, fb);

                } else {

                    int index = e.getIndex();
                    if (id == Tok.T_PARAM) {

                        if (index <= 256) il.Emit(OpCodes.Ldarg_S, index); else il.Emit(OpCodes.Ldarg, index);

                    } else {

                        if (id == Tok.T_AUTO || id == Tok.T_DEFCLASS) {
                            if (index <= 256) il.Emit(OpCodes.Ldloc_S, e.getIndex());
                            else il.Emit(OpCodes.Ldloc, e.getIndex());
                        } else {
                            io.ICE("instruction load of unknown class (" + e.getClassId()+")");
                        }
                    }
                }
            }
        }
コード例 #5
0
ファイル: exe.cs プロジェクト: stjordanis/plil
        public void Store(IAsm a)
        {
            if (a.getVar() == null)
            {
                io.ICE("store instruction with no variable ptr");
            }
            Var e = localvars.FindByName(a.getVar().getName());

            if (e == null)
            {
                e = a.getVar();
            }
            int id = e.getClassId();

            if (e.getLocalToken() != null)
            {
                LocalBuilder lt = (LocalBuilder)e.getLocalToken();
                il.Emit(OpCodes.Stloc, lt);
            }
            else
            {
                if (e.getFieldBuilder() != null)
                {
                    FieldBuilder fb = (FieldBuilder)e.getFieldBuilder();
                    if (id == Tok.T_STATIC)
                    {
                        il.Emit(OpCodes.Stsfld, fb);
                    }
                    else
                    {
                        il.Emit(OpCodes.Stfld, fb);
                    }
                }
                else
                {
                    int index = e.getIndex();
                    if (id == Tok.T_PARAM)
                    {
                        if (index <= 256)
                        {
                            il.Emit(OpCodes.Starg_S, index);
                        }
                        else
                        {
                            il.Emit(OpCodes.Starg, index);
                        }
                    }
                    else
                    {
                        if (id == Tok.T_AUTO || id == Tok.T_DEFCLASS)
                        {
                            il.Emit(OpCodes.Stloc, index);
                        }
                        else
                        {
                            io.ICE("instruction load of unknown class (" + e.getClassId() + ")");
                        }
                    }
                }
            }
        }
コード例 #6
0
ファイル: exe.cs プロジェクト: stjordanis/plil
        void genLoad(Var e)
        {
            int id = e.getClassId();

            if (e == null)
            {
                io.ICE("load instruction with no variable ptr");
            }
            if (e.getLocalToken() != null)
            {
                // LocalToken lt = (LocalToken) e.getLocalToken();
                LocalBuilder lt = (LocalBuilder)e.getLocalToken();
                il.Emit(OpCodes.Ldloc, lt);
            }
            else
            {
                if (e.getFieldBuilder() != null)
                {
                    FieldBuilder fb = (FieldBuilder)e.getFieldBuilder();
                    if (id == Tok.T_STATIC)
                    {
                        il.Emit(OpCodes.Ldsfld, fb);
                    }
                    else
                    {
                        il.Emit(OpCodes.Ldfld, fb);
                    }
                }
                else
                {
                    int index = e.getIndex();
                    if (id == Tok.T_PARAM)
                    {
                        if (index <= 256)
                        {
                            il.Emit(OpCodes.Ldarg_S, index);
                        }
                        else
                        {
                            il.Emit(OpCodes.Ldarg, index);
                        }
                    }
                    else
                    {
                        if (id == Tok.T_AUTO || id == Tok.T_DEFCLASS)
                        {
                            if (index <= 256)
                            {
                                il.Emit(OpCodes.Ldloc_S, e.getIndex());
                            }
                            else
                            {
                                il.Emit(OpCodes.Ldloc, e.getIndex());
                            }
                        }
                        else
                        {
                            io.ICE("instruction load of unknown class (" + e.getClassId() + ")");
                        }
                    }
                }
            }
        }