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); }
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); }
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)); }