예제 #1
0
파일: Set.cs 프로젝트: 7shi/LLPML
        public override void AddCodes(OpModule codes)
        {
            var dest = Var.Get(this.dest);
            if (dest == null)
            {
                if (this.dest is Variant)
                {
                    var setter = (this.dest as Variant).GetSetter();
                    if (setter != null)
                    {
                        var args = new NodeBase[1];
                        args[0] = values[0] as NodeBase;
                        Call.NewV(Parent, setter, This.New(Parent), args)
                            .AddCodes(codes);
                        return;
                    }
                }
                throw Abort("set: destination is not variable");
            }
            var dt = dest.Type;
            if (dt is TypeConstChar)
                throw Abort("set: can not change constants");
            if (dest is Member)
            {
                var mem = dest as Member;
                if (mem.IsSetter)
                {
                    mem.AddSetterCodes(codes, values[0] as NodeBase);
                    return;
                }
            }

            var v = values[0] as NodeBase;
            v.AddCodesV(codes, "push", null);
            var ad = dest.GetAddress(codes);
            if (!OpModule.NeedsDtor(v))
            {
                if (ad == null)
                {
                    ad = Addr32.New(Reg32.ESP);
                    codes.Add(I386.XchgRA(Reg32.EAX, ad));
                    dt.AddSetCodes(codes, ad);
                    codes.Add(I386.AddR(Reg32.ESP, Val32.New(4)));
                }
                else
                {
                    codes.Add(I386.Pop(Reg32.EAX));
                    dt.AddSetCodes(codes, ad);
                }
            }
            else
            {
                codes.Add(I386.MovRA(Reg32.EAX, Addr32.New(Reg32.ESP)));
                dt.AddSetCodes(codes, ad);
                codes.AddDtorCodes(v.Type);
            }
        }
예제 #2
0
파일: Expression.cs 프로젝트: 7shi/LLPML
        public override void AddCodesV(OpModule codes, string op, Addr32 dest)
        {
            if (AddConstCodes(codes, op, dest)) return;

            var v = values[0] as NodeBase;
            if (!OpModule.NeedsDtor(v))
                v.AddCodesV(codes, op, dest);
            else
            {
                v.AddCodesV(codes, "mov", null);
                codes.Add(I386.Push(Reg32.EAX));
                codes.AddCodes(op, dest);
                codes.AddDtorCodes(v.Type);
            }
        }
예제 #3
0
파일: Return.cs 프로젝트: 7shi/LLPML
 public override void AddCodes(OpModule codes)
 {
     ///if (castFailed != null) throw Abort(castFailed);
     var f = Parent.GetBelongFunction();
     if (value != null)
     {
         value.AddCodesV(codes, "mov", null);
         var retval = f.GetRetVal(Parent);
         var dest = retval.GetAddress(codes);
         if (!OpModule.NeedsDtor(value))
         {
             codes.Add(I386.MovAR(dest, Reg32.EAX));
             var tr = value.Type as TypeReference;
             if (tr != null && tr.UseGC)
                 TypeReference.AddReferenceCodes(codes);
         }
         else
         {
             codes.Add(I386.Push(Reg32.EAX));
             var rt = f.ReturnType;
             if (rt == null)
                 codes.Add(I386.MovAR(dest, Reg32.EAX));
             else
             {
                 if (rt is TypeReference)
                     codes.Add(I386.MovA(dest, Val32.New(0)));
                 rt.AddSetCodes(codes, dest);
             }
             codes.AddDtorCodes(value.Type);
         }
     }
     var b = Parent;
     var ptrs = UsingPointers;
     for (; ; ptrs = b.UsingPointers, b = b.Parent)
     {
         b.AddDestructors(codes, ptrs);
         if (b == f) break;
         b.AddExitCodes(codes);
     }
     if (!IsLast) codes.Add(I386.JmpD(b.Destruct));
 }
예제 #4
0
파일: TypeString.cs 프로젝트: 7shi/LLPML
 private void AddFunc(OpModule codes, Addr32 dest, string func)
 {
     codes.Add(I386.PushA(dest));
     codes.Add(I386.XchgRA(Reg32.EAX, Addr32.New(Reg32.ESP)));
     codes.Add(I386.Push(Reg32.EAX));
     codes.Add(codes.GetCall("string", func));
     codes.Add(I386.AddR(Reg32.ESP, Val32.New(8)));
     codes.Add(I386.XchgRA(Reg32.EAX, dest));
     codes.Add(I386.Push(Reg32.EAX));
     codes.AddDtorCodes(TypeString.Instance);
 }
예제 #5
0
파일: Comparers.cs 프로젝트: 7shi/LLPML
        public override void AddCodesV(OpModule codes, string op, Addr32 dest)
        {
            if (AddConstCodes(codes, op, dest)) return;

            OpCode last = new OpCode();
            Addr32 ad = Addr32.New(Reg32.ESP);
            var tb = CheckFunc();
            var c = GetCond();
            var v = values[0] as NodeBase;
            v.AddCodesV(codes, "push", null);
            for (int i = 1; i < values.Count; i++)
            {
                codes.AddOperatorCodes(tb, Tag, ad, values[i] as NodeBase, true);
                if (i < values.Count - 1)
                {
                    codes.Add(I386.Jcc(c.NotCondition, last.Address));
                    codes.Add(I386.MovAR(ad, Reg32.EAX));
                }
            }
            codes.Add(last);
            codes.Add(I386.MovR(Reg32.EAX, Val32.New(0)));
            codes.Add(I386.Setcc(c.Condition, Reg8.AL));
            if (!OpModule.NeedsDtor(v))
                codes.Add(I386.AddR(Reg32.ESP, Val32.New(4)));
            else
            {
                codes.Add(I386.XchgRA(Reg32.EAX, Addr32.New(Reg32.ESP)));
                codes.Add(I386.Push(Reg32.EAX));
                codes.AddDtorCodes(v.Type);
                codes.Add(I386.Pop(Reg32.EAX));
            }
            codes.AddCodes(op, dest);
        }