diff --git a/Test/Assets/Plugins/CLRSharp/CLRSharp/CLRSharp_Env.cs b/Test/Assets/Plugins/CLRSharp/CLRSharp/CLRSharp_Env.cs index c450807..c4dac45 100644 --- a/Test/Assets/Plugins/CLRSharp/CLRSharp/CLRSharp_Env.cs +++ b/Test/Assets/Plugins/CLRSharp/CLRSharp/CLRSharp_Env.cs @@ -11,7 +11,7 @@ public string version { get { - return "0.48.1Beta"; + return "0.50.1Beta"; } } public ICLRSharp_Logger logger diff --git a/Test/Assets/Plugins/CLRSharp/CLRSharp/Execute/StackFrame.cs b/Test/Assets/Plugins/CLRSharp/CLRSharp/Execute/StackFrame.cs index 57263d9..3bbdec5 100644 --- a/Test/Assets/Plugins/CLRSharp/CLRSharp/Execute/StackFrame.cs +++ b/Test/Assets/Plugins/CLRSharp/CLRSharp/Execute/StackFrame.cs @@ -74,48 +74,48 @@ public Mono.Cecil.Cil.Instruction GetCode() public int _codepos = 0; public class MyCalcStack : Stack { - Queue unused = new Queue(); + //Queue unused = new Queue(); public void Push(VBox box) { - if (box != null) - { - box.refcount++; - while (unused.Count > 0) - { - VBox b = unused.Dequeue(); - if (b.refcount == 0) - ValueOnStack.UnUse(b); - } - } + //if (box != null) + //{ + // box.refcount++; + // while (unused.Count > 0) + // { + // VBox b = unused.Dequeue(); + // if (b.refcount == 0) + // ValueOnStack.UnUse(b); + // } + //} base.Push(box); } public new object Pop() { var ob = base.Pop(); - VBox box = ob as VBox; - if (box != null) - { - box.refcount--; - if (box.refcount == 0) - unused.Enqueue(box); - } + //VBox box = ob as VBox; + //if (box != null) + //{ + // box.refcount--; + // if (box.refcount == 0) + // unused.Enqueue(box); + //} return ob; } public void ClearVBox() { - while (unused.Count > 0) - { - VBox b = unused.Dequeue(); - if (b.refcount == 0) - { - ValueOnStack.UnUse(b); - } - else - { - Console.WriteLine("not zero."); - } - } + //while (unused.Count > 0) + //{ + // VBox b = unused.Dequeue(); + // if (b.refcount == 0) + // { + // ValueOnStack.UnUse(b); + // } + // else + // { + // Console.WriteLine("not zero."); + // } + //} this.Clear(); } } @@ -128,10 +128,10 @@ public class MySlotVar : List } public void Add(VBox box) { - if (box != null) - { - box.refcount++; - } + //if (box != null) + //{ + // box.refcount++; + //} base.Add(box); } public void ClearVBox() @@ -141,17 +141,20 @@ public void ClearVBox() VBox box = b as VBox; if (box != null) { - box.refcount--; - if (box.refcount == 0) - { - ValueOnStack.UnUse(box); - } - else - { - Console.WriteLine("not zero."); - } + ValueOnStack.UnUse(box); } } + // box.refcount--; + // if (box.refcount == 0) + // { + // ValueOnStack.UnUse(box); + // } + // else + // { + // Console.WriteLine("not zero."); + // } + // } + //} this.Clear(); } } @@ -374,6 +377,7 @@ public void Call(ThreadContext context, IMethod _clrmethod, bool bVisual) } if (pp is VBox && !bCLR) { + ValueOnStack.UnUse(pp as VBox); pp = (pp as VBox).BoxDefine(); } if (pp is ICLRType_System) @@ -432,10 +436,17 @@ public void Call(ThreadContext context, IMethod _clrmethod, bool bVisual) } if (_this is VBox) { + //ValueOnStack.UnUse(_this as VBox);//放在这里会导致计算错误,原因待查 + _this = (_this as VBox).BoxDefine(); } bool bCross = (_this is CLRSharp_Instance && _clrmethod is IMethod_System); object returnvar = _clrmethod.Invoke(context, _this, _pp, bVisual); + + if(_this is VBox) + { + ValueOnStack.UnUse(_this as VBox); + } if (bCross) { //这里究竟如何处理还需要再考虑 @@ -493,7 +504,8 @@ public void Dup() } public void Pop() { - stackCalc.Pop(); + var v = stackCalc.Pop() as VBox; + ValueOnStack.UnUse(v); _codepos++; } //流程控制 @@ -522,12 +534,16 @@ public void Box(ICLRType type) obj = box.BoxDefine(); + ValueOnStack.UnUse(box); + } else { - var nbox = new VBox(box.typeStack, tcode); + var nbox = ValueOnStack.MakeVBox(tcode); nbox.Set(box); obj = nbox.BoxDefine(); + ValueOnStack.UnUse(nbox); + ValueOnStack.UnUse(box); } } } @@ -589,6 +605,7 @@ public void Brtrue(int addr_index) { VBox box = obj as VBox; b = box.ToBool(); + ValueOnStack.UnUse(box); } else if (obj.GetType().IsClass) { @@ -624,6 +641,7 @@ public void Brfalse(int addr_index) { VBox box = obj as VBox; b = box.ToBool(); + ValueOnStack.UnUse(box); } else if (obj.GetType().IsClass) { @@ -665,6 +683,8 @@ public void Beq(int addr_index) { _codepos++; } + ValueOnStack.UnUse(n1); + ValueOnStack.UnUse(n2); } else if (o1 is int) { @@ -674,7 +694,11 @@ public void Beq(int addr_index) if (o2 is int) rv = (int)o2; else if (o2 is VBox) + { rv = (o2 as VBox).v32; + ValueOnStack.UnUse(o2 as VBox); + + } else throw new Exception("what a fuck"); @@ -706,6 +730,9 @@ public void Bne(int addr_index) { _codepos++; } + ValueOnStack.UnUse(n1); + ValueOnStack.UnUse(n2); + } public void Bne_Un(int addr_index) { @@ -721,6 +748,9 @@ public void Bne_Un(int addr_index) { _codepos++; } + ValueOnStack.UnUse(n1); + ValueOnStack.UnUse(n2); + } public void Bge(int addr_index) { @@ -736,6 +766,9 @@ public void Bge(int addr_index) { _codepos++; } + ValueOnStack.UnUse(n1); + ValueOnStack.UnUse(n2); + } public void Bge_Un(int addr_index) { @@ -751,6 +784,9 @@ public void Bge_Un(int addr_index) { _codepos++; } + ValueOnStack.UnUse(n1); + ValueOnStack.UnUse(n2); + } public void Bgt(int addr_index) { @@ -766,6 +802,9 @@ public void Bgt(int addr_index) { _codepos++; } + ValueOnStack.UnUse(n1); + ValueOnStack.UnUse(n2); + } public void Bgt_Un(int addr_index) { @@ -781,6 +820,9 @@ public void Bgt_Un(int addr_index) { _codepos++; } + ValueOnStack.UnUse(n1); + ValueOnStack.UnUse(n2); + } public void Ble(int addr_index) { @@ -796,6 +838,9 @@ public void Ble(int addr_index) { _codepos++; } + ValueOnStack.UnUse(n1); + ValueOnStack.UnUse(n2); + } public void Ble_Un(int addr_index) { @@ -811,6 +856,9 @@ public void Ble_Un(int addr_index) { _codepos++; } + ValueOnStack.UnUse(n1); + ValueOnStack.UnUse(n2); + } public void Blt(int addr_index) { @@ -826,6 +874,9 @@ public void Blt(int addr_index) { _codepos++; } + ValueOnStack.UnUse(n1); + ValueOnStack.UnUse(n2); + } public void Blt_Un(int addr_index) { @@ -840,6 +891,9 @@ public void Blt_Un(int addr_index) { _codepos++; } + ValueOnStack.UnUse(n1); + ValueOnStack.UnUse(n2); + } //加载常量 public void Ldc_I4(int v)//int32 @@ -895,11 +949,17 @@ public void Stloc(int pos) else { if (v is VBox) + { box.Set(v as VBox); + } else box.SetDirect(v); } } + if (v is VBox) + { + ValueOnStack.UnUse(v as VBox); + } _codepos++; } //拿出变量槽 @@ -1047,7 +1107,7 @@ public void Ceq() beq = obj1 == obj2; } else if (n1 == null || n2 == null) - + { if (n1 != null) { @@ -1075,7 +1135,8 @@ public void Ceq() } - + ValueOnStack.UnUse(n1); + ValueOnStack.UnUse(n2); stackCalc.Push(ValueOnStack.MakeVBoxBool(beq)); _codepos++; } @@ -1086,6 +1147,8 @@ public void Cgt() stackCalc.Push(ValueOnStack.MakeVBoxBool(n1.logic_gt(n2))); + ValueOnStack.UnUse(n1); + ValueOnStack.UnUse(n2); _codepos++; } public void Cgt_Un() @@ -1103,6 +1166,8 @@ public void Cgt_Un() VBox n1 = GetVBox(_n1); stackCalc.Push(ValueOnStack.MakeVBoxBool(n1.logic_gt_Un(n2))); + ValueOnStack.UnUse(n1); + ValueOnStack.UnUse(n2); _codepos++; } } @@ -1111,6 +1176,8 @@ public void Clt() VBox n2 = stackCalc.Pop() as VBox; VBox n1 = stackCalc.Pop() as VBox; stackCalc.Push(ValueOnStack.MakeVBoxBool(n1.logic_lt(n2))); + ValueOnStack.UnUse(n1); + ValueOnStack.UnUse(n2); _codepos++; } public void Clt_Un() @@ -1118,6 +1185,8 @@ public void Clt_Un() VBox n2 = stackCalc.Pop() as VBox; VBox n1 = stackCalc.Pop() as VBox; stackCalc.Push(ValueOnStack.MakeVBoxBool(n1.logic_lt_Un(n2))); + ValueOnStack.UnUse(n1); + ValueOnStack.UnUse(n2); _codepos++; } public void Ckfinite() @@ -1151,7 +1220,10 @@ public void Add() VBox n_1 = GetVBox(n1); n_1.Add(n2); stackCalc.Push(n_1.BoxDefine()); + ValueOnStack.UnUse(n_1); + } + ValueOnStack.UnUse(n2); _codepos++; } @@ -1196,7 +1268,11 @@ public void Sub() n_1.SetDirect(n1); n_1.Sub(n2); stackCalc.Push(n_1.BoxDefine()); + ValueOnStack.UnUse(n_1); + } + ValueOnStack.UnUse(n2); + _codepos++; } public void Mul() @@ -1205,6 +1281,8 @@ public void Mul() VBox n1 = stackCalc.Pop() as VBox; n1.Mul(n2); stackCalc.Push(n1); + ValueOnStack.UnUse(n2); + _codepos++; } public void Div() @@ -1213,6 +1291,8 @@ public void Div() VBox n1 = stackCalc.Pop() as VBox; n1.Div(n2); stackCalc.Push(n1); + ValueOnStack.UnUse(n2); + _codepos++; } public void Div_Un() @@ -1221,6 +1301,8 @@ public void Div_Un() VBox n1 = stackCalc.Pop() as VBox; n1.Div(n2);//!!! _un stackCalc.Push(n1); + ValueOnStack.UnUse(n2); + _codepos++; } public void Rem() @@ -1229,6 +1311,8 @@ public void Rem() VBox n1 = stackCalc.Pop() as VBox; n1.Mod(n2); stackCalc.Push(n1); + ValueOnStack.UnUse(n2); + _codepos++; ; } public void Rem_Un() @@ -1237,6 +1321,8 @@ public void Rem_Un() VBox n1 = stackCalc.Pop() as VBox; n1.Mod(n2);//!!!_un stackCalc.Push(n1); + ValueOnStack.UnUse(n2); + _codepos++; } public void Neg() @@ -1249,6 +1335,9 @@ public void Neg() var obj = v.Clone(); obj.Neg(); stackCalc.Push(obj); + ValueOnStack.UnUse(v); + + } else if (n1 is int) { @@ -1275,6 +1364,7 @@ public void Conv_I1() if (b != null) { stackCalc.Push(ValueOnStack.Convert(b, NumberType.SBYTE)); + ValueOnStack.UnUse(b); } else { @@ -1290,6 +1380,7 @@ public void Conv_U1() if (b != null) { stackCalc.Push(ValueOnStack.Convert(b, NumberType.BYTE)); + ValueOnStack.UnUse(b); } else { @@ -1305,6 +1396,7 @@ public void Conv_I2() if (b != null) { stackCalc.Push(ValueOnStack.Convert(b, NumberType.INT16)); + ValueOnStack.UnUse(b); } else { @@ -1320,6 +1412,7 @@ public void Conv_U2() if (b != null) { stackCalc.Push(ValueOnStack.Convert(b, NumberType.UINT16)); + ValueOnStack.UnUse(b); } else { @@ -1334,6 +1427,7 @@ public void Conv_I4() if (b != null) { stackCalc.Push(ValueOnStack.Convert(b, NumberType.INT32)); + ValueOnStack.UnUse(b); } else { @@ -1349,6 +1443,7 @@ public void Conv_U4() if (b != null) { stackCalc.Push(ValueOnStack.Convert(b, NumberType.UINT32)); + ValueOnStack.UnUse(b); } else { @@ -1364,6 +1459,7 @@ public void Conv_I8() if (b != null) { stackCalc.Push(ValueOnStack.Convert(b, NumberType.INT64)); + ValueOnStack.UnUse(b); } else { @@ -1379,6 +1475,7 @@ public void Conv_U8() if (b != null) { stackCalc.Push(ValueOnStack.Convert(b, NumberType.UINT64)); + ValueOnStack.UnUse(b); } else { @@ -1394,6 +1491,7 @@ public void Conv_I() if (b != null) { stackCalc.Push(ValueOnStack.Convert(b, NumberType.INT32)); + ValueOnStack.UnUse(b); } else { @@ -1409,6 +1507,7 @@ public void Conv_U() if (b != null) { stackCalc.Push(ValueOnStack.Convert(b, NumberType.UINT32)); + ValueOnStack.UnUse(b); } else { @@ -1425,6 +1524,7 @@ public void Conv_R4() if (b != null) { stackCalc.Push(ValueOnStack.Convert(b, NumberType.FLOAT)); + ValueOnStack.UnUse(b); } else { @@ -1448,6 +1548,7 @@ public void Conv_R8() if (b != null) { stackCalc.Push(ValueOnStack.Convert(b, NumberType.DOUBLE)); + ValueOnStack.UnUse(b); } else { @@ -1463,6 +1564,7 @@ public void Conv_R_Un() if (b != null) { stackCalc.Push(ValueOnStack.Convert(b, NumberType.FLOAT)); + ValueOnStack.UnUse(b); } else { @@ -1479,7 +1581,13 @@ public void NewArr(ThreadContext context, Type type) //MethodParamList tlist = MethodParamList.MakeList_OneParam_Int(context.environment); //var m = _type.GetMethod(".ctor", tlist); var objv = stackCalc.Pop(); - if (objv is VBox) objv = (objv as VBox).BoxDefine(); + + + if (objv is VBox) + { + ValueOnStack.UnUse(objv as VBox); + objv = (objv as VBox).BoxDefine(); + } var array = Array.CreateInstance(type, (int)objv); stackCalc.Push(array); _codepos++; @@ -1500,6 +1608,7 @@ public void Ldelema(object obj) if ((indexobj is VBox)) { index = (indexobj as VBox).ToInt(); + ValueOnStack.UnUse(indexobj as VBox); } else { @@ -1519,6 +1628,7 @@ public void Ldelem_I1() if ((indexobj is VBox)) { index = (indexobj as VBox).ToInt(); + ValueOnStack.UnUse(indexobj as VBox); } else { @@ -1553,6 +1663,7 @@ public void Ldelem_U1() if ((indexobj is VBox)) { index = (indexobj as VBox).ToInt(); + ValueOnStack.UnUse(indexobj as VBox); } else { @@ -1584,6 +1695,7 @@ public void Ldelem_I2() if ((indexobj is VBox)) { index = (indexobj as VBox).ToInt(); + ValueOnStack.UnUse(indexobj as VBox); } else { @@ -1602,6 +1714,7 @@ public void Ldelem_U2() if ((indexobj is VBox)) { index = (indexobj as VBox).ToInt(); + ValueOnStack.UnUse(indexobj as VBox); } else { @@ -1632,6 +1745,7 @@ public void Ldelem_I4() if ((indexobj is VBox)) { index = (indexobj as VBox).ToInt(); + ValueOnStack.UnUse(indexobj as VBox); } else { @@ -1650,6 +1764,7 @@ public void Ldelem_U4() if ((indexobj is VBox)) { index = (indexobj as VBox).ToInt(); + ValueOnStack.UnUse(indexobj as VBox); } else { @@ -1669,6 +1784,7 @@ public void Ldelem_I8() if ((indexobj is VBox)) { index = (indexobj as VBox).ToInt(); + ValueOnStack.UnUse(indexobj as VBox); } else { @@ -1698,6 +1814,7 @@ public void Ldelem_I() if ((indexobj is VBox)) { index = (indexobj as VBox).ToInt(); + ValueOnStack.UnUse(indexobj as VBox); } else { @@ -1716,6 +1833,7 @@ public void Ldelem_R4() if ((indexobj is VBox)) { index = (indexobj as VBox).ToInt(); + ValueOnStack.UnUse(indexobj as VBox); } else { @@ -1734,6 +1852,7 @@ public void Ldelem_R8() if ((indexobj is VBox)) { index = (indexobj as VBox).ToInt(); + ValueOnStack.UnUse(indexobj as VBox); } else { @@ -1752,6 +1871,7 @@ public void Ldelem_Ref() if ((indexobj is VBox)) { index = (indexobj as VBox).ToInt(); + ValueOnStack.UnUse(indexobj as VBox); } else { @@ -1768,6 +1888,7 @@ public void Ldelem_Any(object obj) if ((indexobj is VBox)) { index = (indexobj as VBox).ToInt(); + ValueOnStack.UnUse(indexobj as VBox); } else { @@ -1812,6 +1933,7 @@ public void Stelem_I1() if (obj is VBox) { value = (obj as VBox).ToInt(); + ValueOnStack.UnUse(obj as VBox); } else { @@ -1822,6 +1944,7 @@ public void Stelem_I1() if ((indexobj is VBox)) { index = (indexobj as VBox).ToInt(); + ValueOnStack.UnUse(indexobj as VBox); } else { @@ -1851,6 +1974,7 @@ public void Stelem_I2() if (obj is VBox) { value = (obj as VBox).ToInt(); + ValueOnStack.UnUse(obj as VBox); } else { @@ -1861,6 +1985,7 @@ public void Stelem_I2() if ((indexobj is VBox)) { index = (indexobj as VBox).ToInt(); + ValueOnStack.UnUse(indexobj as VBox); } else { @@ -1889,6 +2014,7 @@ public void Stelem_I4() if (obj is VBox) { value = (obj as VBox).ToInt(); + ValueOnStack.UnUse(obj as VBox); } else { @@ -1899,6 +2025,7 @@ public void Stelem_I4() if ((indexobj is VBox)) { index = (indexobj as VBox).ToInt(); + ValueOnStack.UnUse(indexobj as VBox); } else { @@ -1927,6 +2054,7 @@ public void Stelem_I8() if (obj is VBox) { value = (obj as VBox).ToInt64(); + ValueOnStack.UnUse(obj as VBox); } else { @@ -1937,6 +2065,7 @@ public void Stelem_I8() if ((indexobj is VBox)) { index = (indexobj as VBox).ToInt(); + ValueOnStack.UnUse(indexobj as VBox); } else { @@ -1965,6 +2094,8 @@ public void Stelem_R4() if (obj is VBox) { value = (obj as VBox).ToFloat(); + ValueOnStack.UnUse(obj as VBox); + } else { @@ -1975,6 +2106,8 @@ public void Stelem_R4() if ((indexobj is VBox)) { index = (indexobj as VBox).ToInt(); + ValueOnStack.UnUse(indexobj as VBox); + } else { @@ -1991,6 +2124,8 @@ public void Stelem_R8() if (obj is VBox) { value = (obj as VBox).ToDouble(); + ValueOnStack.UnUse(obj as VBox); + } else { @@ -2001,6 +2136,8 @@ public void Stelem_R8() if ((indexobj is VBox)) { index = (indexobj as VBox).ToInt(); + ValueOnStack.UnUse(indexobj as VBox); + } else { @@ -2018,6 +2155,8 @@ public void Stelem_Ref() if ((indexobj is VBox)) { index = (indexobj as VBox).ToInt(); + ValueOnStack.UnUse(indexobj as VBox); + } else { @@ -2032,13 +2171,15 @@ public void Stelem_Ref() public void Stelem_Any() { var value = stackCalc.Pop(); - var obj = stackCalc.Pop(); + var indexobj = stackCalc.Pop(); int index = 0; - if (obj is VBox) + if (indexobj is VBox) { - index = (obj as VBox).ToInt(); + index = (indexobj as VBox).ToInt(); + ValueOnStack.UnUse(indexobj as VBox); + } - else index = (int)obj; + else index = (int)indexobj; var array = stackCalc.Pop() as Array; array.SetValue(value, index); _codepos++; @@ -2060,6 +2201,7 @@ public void NewObj(ThreadContext context, IMethod _clrmethod) var pp = stackCalc.Pop(); if (pp is VBox && !bCLR) { + ValueOnStack.UnUse(pp as VBox); pp = (pp as VBox).BoxDefine(); } if ((pp is int) && (pType.TypeForSystem != typeof(int) && pType.TypeForSystem != typeof(object))) @@ -2134,7 +2276,7 @@ public void Ldfld(ThreadContext context, IField field) public void Ldflda(ThreadContext context, IField field) { var obj = stackCalc.Pop(); - if(obj is RefObj) + if (obj is RefObj) { obj = (obj as RefObj).Get(); } @@ -2187,6 +2329,7 @@ public void Stfld(ThreadContext context, IField field) } if (value is VBox) { + ValueOnStack.UnUse(value as VBox); value = (value as VBox).BoxDefine(); } //else @@ -2208,6 +2351,7 @@ public void Stsfld(ThreadContext context, IField field) if (value is VBox) { + ValueOnStack.UnUse(value as VBox); value = (value as VBox).BoxDefine(); } //var type = context.environment.GetType(field.DeclaringType.FullName, field.Module); @@ -2249,6 +2393,7 @@ public void Conv_Ovf_I1() if (b != null) { stackCalc.Push(ValueOnStack.Convert(b, NumberType.SBYTE)); + ValueOnStack.UnUse(b); } else { @@ -2263,6 +2408,8 @@ public void Conv_Ovf_U1() if (b != null) { stackCalc.Push(ValueOnStack.Convert(b, NumberType.BYTE)); + ValueOnStack.UnUse(b); + } else { @@ -2277,6 +2424,8 @@ public void Conv_Ovf_I2() if (b != null) { stackCalc.Push(ValueOnStack.Convert(b, NumberType.INT16)); + ValueOnStack.UnUse(b); + } else { @@ -2291,6 +2440,8 @@ public void Conv_Ovf_U2() if (b != null) { stackCalc.Push(ValueOnStack.Convert(b, NumberType.UINT16)); + ValueOnStack.UnUse(b); + } else { @@ -2305,6 +2456,8 @@ public void Conv_Ovf_I4() if (b != null) { stackCalc.Push(ValueOnStack.Convert(b, NumberType.INT32)); + ValueOnStack.UnUse(b); + } else { @@ -2319,6 +2472,8 @@ public void Conv_Ovf_U4() if (b != null) { stackCalc.Push(ValueOnStack.Convert(b, NumberType.UINT32)); + ValueOnStack.UnUse(b); + } else { @@ -2333,6 +2488,8 @@ public void Conv_Ovf_I8() if (b != null) { stackCalc.Push(ValueOnStack.Convert(b, NumberType.INT64)); + ValueOnStack.UnUse(b); + } else { @@ -2347,6 +2504,8 @@ public void Conv_Ovf_U8() if (b != null) { stackCalc.Push(ValueOnStack.Convert(b, NumberType.UINT64)); + ValueOnStack.UnUse(b); + } else { @@ -2361,6 +2520,8 @@ public void Conv_Ovf_I() if (b != null) { stackCalc.Push(ValueOnStack.Convert(b, NumberType.INT32)); + ValueOnStack.UnUse(b); + } else { @@ -2375,6 +2536,8 @@ public void Conv_Ovf_U() if (b != null) { stackCalc.Push(ValueOnStack.Convert(b, NumberType.UINT32)); + ValueOnStack.UnUse(b); + } else { @@ -2444,6 +2607,8 @@ public void Starg(ThreadContext context, int p) object _this = stackCalc.Pop(); if (_this is VBox) { + ValueOnStack.UnUse(_this as VBox); + _this = (_this as VBox).Clone(); } this._params[p] = _this; @@ -2492,6 +2657,7 @@ public void Switch(ThreadContext context, int[] index) if (indexobj is VBox) { pos = (indexobj as VBox).ToUInt(); + ValueOnStack.UnUse(indexobj as VBox); } else if (indexobj is int) { @@ -2686,6 +2852,7 @@ public void Stind_Ref(ThreadContext context, object obj) { (o2 as RefObj).Set(o1 is VBox ? (o1 as VBox).BoxDefine() : o1); + ValueOnStack.UnUse(o1 as VBox); } _codepos++; @@ -2697,6 +2864,8 @@ public void Stind_I1(ThreadContext context, object obj) if (o2 is RefObj) { (o2 as RefObj).Set(o1 is VBox ? (o1 as VBox).BoxDefine() : o1); + ValueOnStack.UnUse(o1 as VBox); + } _codepos++; @@ -2708,6 +2877,8 @@ public void Stind_I2(ThreadContext context, object obj) if (o2 is RefObj) { (o2 as RefObj).Set(o1 is VBox ? (o1 as VBox).BoxDefine() : o1); + ValueOnStack.UnUse(o1 as VBox); + } _codepos++; @@ -2719,6 +2890,8 @@ public void Stind_I4(ThreadContext context, object obj) if (o2 is RefObj) { (o2 as RefObj).Set(o1 is VBox ? (o1 as VBox).BoxDefine() : o1); + ValueOnStack.UnUse(o1 as VBox); + } _codepos++; @@ -2730,6 +2903,8 @@ public void Stind_I8(ThreadContext context, object obj) if (o2 is RefObj) { (o2 as RefObj).Set(o1 is VBox ? (o1 as VBox).BoxDefine() : o1); + ValueOnStack.UnUse(o1 as VBox); + } _codepos++; @@ -2741,6 +2916,8 @@ public void Stind_R4(ThreadContext context, object obj) if (o2 is RefObj) { (o2 as RefObj).Set(o1 is VBox ? (o1 as VBox).BoxDefine() : o1); + ValueOnStack.UnUse(o1 as VBox); + } _codepos++; @@ -2752,6 +2929,8 @@ public void Stind_R8(ThreadContext context, object obj) if (o2 is RefObj) { (o2 as RefObj).Set(o1 is VBox ? (o1 as VBox).BoxDefine() : o1); + ValueOnStack.UnUse(o1 as VBox); + } _codepos++; @@ -2763,6 +2942,9 @@ public void And() n1.And(n2); stackCalc.Push(n1); _codepos++; + + ValueOnStack.UnUse(n2); + } public void Or() { @@ -2771,6 +2953,9 @@ public void Or() n1.Or(n2); stackCalc.Push(n1); _codepos++; + + ValueOnStack.UnUse(n2); + } public void Xor() { @@ -2779,6 +2964,9 @@ public void Xor() n1.Xor(n2); stackCalc.Push(n1); _codepos++; + + ValueOnStack.UnUse(n2); + } public void Shl(ThreadContext context, object obj) { @@ -2787,7 +2975,8 @@ public void Shl(ThreadContext context, object obj) n1.v32 <<= n2.v32; stackCalc.Push(n1); _codepos++; - //_codepos++; + + ValueOnStack.UnUse(n2); } public void Shr(ThreadContext context, object obj) { @@ -2796,6 +2985,9 @@ public void Shr(ThreadContext context, object obj) n1.v32 >>= n2.v32; stackCalc.Push(n1); _codepos++; + + ValueOnStack.UnUse(n2); + } public void Shr_Un(ThreadContext context, object obj) { @@ -2804,6 +2996,9 @@ public void Shr_Un(ThreadContext context, object obj) n1.v32 >>= n2.v32; stackCalc.Push(n1); _codepos++; + + ValueOnStack.UnUse(n2); + } public void Not() { @@ -2812,6 +3007,8 @@ public void Not() n1.Not(); stackCalc.Push(n1); _codepos++; + + } public void Cpobj(ThreadContext context, object obj) { diff --git a/Test/Assets/Plugins/CLRSharp/CLRSharp/Execute/ValueOnStack.cs b/Test/Assets/Plugins/CLRSharp/CLRSharp/Execute/ValueOnStack.cs index a602b2a..eb57bc1 100644 --- a/Test/Assets/Plugins/CLRSharp/CLRSharp/Execute/ValueOnStack.cs +++ b/Test/Assets/Plugins/CLRSharp/CLRSharp/Execute/ValueOnStack.cs @@ -141,6 +141,7 @@ public static VBox MakeVBox(NumberType code) var b = unusedVBox.Dequeue(); b.typeStack = NumberOnStack.Int32; b.type = code; + b.unuse = false; return b; } return new VBox(NumberOnStack.Int32, code); @@ -151,6 +152,7 @@ public static VBox MakeVBox(NumberType code) var b = unusedVBox.Dequeue(); b.typeStack = NumberOnStack.Int64; b.type = code; + b.unuse = false; return b; } return new VBox(NumberOnStack.Int64, code); @@ -161,6 +163,7 @@ public static VBox MakeVBox(NumberType code) var b = unusedVBox.Dequeue(); b.typeStack = NumberOnStack.Double; b.type = code; + b.unuse = false; return b; } return new VBox(NumberOnStack.Double, code); @@ -240,9 +243,13 @@ public static VBox Convert(VBox box, NumberType type) public static Queue unusedVBox = null; public static void UnUse(VBox box) { + if (box == null) return; + if (box.unuse) + return; + box.unuse = true; if (unusedVBox == null) unusedVBox = new Queue(); - box.refcount = 0; + //box.refcount = 0; unusedVBox.Enqueue(box); } //public static void UnUse(IBox box) @@ -289,10 +296,14 @@ public enum NumberOnStack } public class VBox { + public bool unuse = false; + + public static int newcount=0; public VBox(NumberOnStack typeStack, NumberType thistype) { this.typeStack = typeStack; this.type = thistype; + newcount++; } public VBox Clone() { @@ -313,7 +324,7 @@ public VBox Clone() return b; } - public int refcount = 0; + //public int refcount = 0; public NumberOnStack typeStack; public NumberType type; public Int32 v32; @@ -612,14 +623,30 @@ public void SetDirect(object value) { v32 = (int)value; } + else if(value is uint) + { + v32 = (int)(uint)value; + } else if (value is short) { v32 = (short)value; } + else if (value is UInt16) + { + v32 = (UInt16)value; + } else if(value is char) { v32 = (char)value; } + else if (value is byte) + { + v32 = (byte)value; + } + else if (value is sbyte) + { + v32 = (sbyte)value; + } else { v32 = (int)Convert.ToDecimal(value); diff --git a/Test/Assets/Plugins/CLRSharp/CLRSharp/Type/System/System_Type.cs b/Test/Assets/Plugins/CLRSharp/CLRSharp/Type/System/System_Type.cs index 2c3a8d8..d5fcb8d 100644 --- a/Test/Assets/Plugins/CLRSharp/CLRSharp/Type/System/System_Type.cs +++ b/Test/Assets/Plugins/CLRSharp/CLRSharp/Type/System/System_Type.cs @@ -189,6 +189,41 @@ public ICLRType DeclaringType } public void Set(object _this, object value) { + if(value!=null&&(value.GetType()==typeof(int)|| value.GetType() == typeof(Int64))) + { + if (info.FieldType == typeof(bool)) + value = (bool)((int)value != 0); + else if(info.FieldType==typeof(char)) + { + value = (char)((int)value); + } + else if (info.FieldType == typeof(byte)) + { + value = (byte)((int)value); + } + else if (info.FieldType == typeof(sbyte)) + { + value = (sbyte)((int)value); + } + else if (info.FieldType == typeof(UInt16)) + { + value = (UInt16)((int)value); + } + else if (info.FieldType == typeof(Int16)) + { + value = (Int16)((int)value); + } + else if (info.FieldType == typeof(UInt32)) + { + value = (UInt32)((int)value); + } + else if (info.FieldType == typeof(UInt64)) + { + value = (UInt64)((Int64)value); + } + + } + info.SetValue(_this, value); } diff --git a/readme.txt b/readme.txt index 44d1d3f..7a76a79 100644 --- a/readme.txt +++ b/readme.txt @@ -1,5 +1,8 @@ L# Unitydotnet̫һ£Щbug ԽL#ĵԪԻ +2016-03-04 +v0.50beta +޸ջϼGC 2015-11-15 ޸һЩvs2015