コード例 #1
0
ファイル: Is.cs プロジェクト: 7shi/LLPML
        public override void AddCodesV(OpModule codes, string op, Addr32 dest)
        {
            var f = Parent.GetFunction(Tag);
            if (f == null) throw Abort("is: can not find: {0}", Tag);

            TypeOf.AddCodes(this, Parent, values[1] as NodeBase, codes, "push", null);
            TypeOf.AddCodes(this, Parent, values[0] as NodeBase, codes, "push", null);
            codes.Add(I386.CallD(f.First));
            codes.Add(I386.AddR(Reg32.ESP, Val32.New(8)));
            codes.AddCodes(op, dest);
        }
コード例 #2
0
ファイル: New.cs プロジェクト: 7shi/LLPML
 public override void AddCodesV(OpModule codes, string op, Addr32 dest)
 {
     var tt = Type.Type;
     var tts = tt as TypeStruct;
     if (!IsArray && (tts == null || !tts.IsClass))
         throw Abort("new: is not class: {0}", tts.Name);
     var f = Parent.GetFunction(Function);
     if (f == null)
         throw Abort("new: undefined function: {0}", Function);
     Val32 type = codes.GetTypeObject(Type), izer = Val32.New(0), ctor = Val32.New(0), init = null;
     if (!IsArray)
     {
         var st = tts.GetStruct();
         if (st.IsEmpty)
         {
             init = st.First;
             st = st.GetBaseStruct();
             type = codes.GetTypeObjectD(st);
         }
         izer = codes.GetAddress(st.GetFunction(Define.Initializer));
         ctor = codes.GetAddress(st.GetFunction(Define.Constructor));
     }
     codes.Add(I386.PushD(ctor));
     codes.Add(I386.PushD(izer));
     Length.AddCodesV(codes, "push", null);
     codes.Add(I386.PushD(Val32.NewI(tt.Size)));
     codes.Add(I386.PushD(type));
     codes.Add(I386.CallD(f.First));
     codes.Add(I386.AddR(Reg32.ESP, Val32.New(16)));
     if (init != null)
     {
         codes.Add(I386.Push(Reg32.EAX));
         codes.Add(I386.CallD(init));
         codes.Add(I386.Pop(Reg32.EAX));
     }
     codes.AddCodes(op, dest);
 }
コード例 #3
0
ファイル: Member.cs プロジェクト: 7shi/LLPML
 protected void AddCodesInternal(OpModule codes, string op, Addr32 dest)
 {
     var st = GetTargetStruct();
     var target = Target;
     if (IsLengthInternal)
     {
         if (target is Member)
             (target as Member).AddCodesInternal(codes, "mov", null);
         else
             target.AddCodesV(codes, "mov", null);
         codes.Add(I386.MovRA(Reg32.EAX, Addr32.NewRO(Reg32.EAX, -4)));
         codes.AddCodes(op, dest);
         return;
     }
     else if (IsGetterInternal)
     {
         if (target == null)
         {
             var g = Parent.GetFunction("get_" + TargetType);
             if (g != null)
             {
                 Call.NewName(Parent, g.Name).AddCodesV(codes, "mov", null);
                 var gg = GetFunctionPrefix("get_");
                 codes.Add(I386.Push(Reg32.EAX));
                 codes.Add(I386.CallD(gg.First));
                 if (gg.CallType == CallType.CDecl)
                     codes.Add(I386.AddR(Reg32.ESP, Val32.New(4)));
                 codes.AddCodes(op, dest);
                 return;
             }
         }
         GetCall("get_", null).AddCodesV(codes, op, dest);
         return;
     }
     else if (IsFunctionInternal)
     {
         var delg = GetDelegate();
         if (delg != null)
             delg.AddCodesV(codes, op, dest);
         else
         {
             var fp = Variant.NewName(GetTargetStruct(), name);
             fp.AddCodesV(codes, op, dest);
         }
         return;
     }
     if (st != null)
     {
         var ci = st.GetInt(name);
         if (ci != null)
         {
             ci.AddCodesV(codes, op, dest);
             return;
         }
         var cs = st.GetString(name);
         if (cs != null)
         {
             cs.AddCodesV(codes, op, dest);
             return;
         }
     }
     TypeInternal.AddGetCodes(codes, op, dest, GetAddressInternal(codes));
 }