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