|
|
@@ -65,11 +65,17 @@ namespace ILRuntime.Runtime.Intepreter
|
|
|
int mStackBase = mStack.Count;
|
|
|
StackObject* esp = stack.StackBase;
|
|
|
if (method.HasThis)
|
|
|
+ {
|
|
|
+ if (instance is CrossBindingAdaptorType)
|
|
|
+ instance = ((CrossBindingAdaptorType)instance).ILInstance;
|
|
|
+ if (instance == null)
|
|
|
+ throw new NullReferenceException("instance should not be null!");
|
|
|
esp = PushObject(esp, mStack, instance);
|
|
|
+ }
|
|
|
esp = PushParameters(method, esp, p);
|
|
|
bool unhandledException;
|
|
|
esp = Execute(method, esp, out unhandledException);
|
|
|
- object result = method.ReturnType != domain.VoidType ? method.ReturnType.TypeForCLR.CheckCLRTypes(domain, StackObject.ToObject((esp - 1), domain, mStack)) : null;
|
|
|
+ object result = method.ReturnType != domain.VoidType ? method.ReturnType.TypeForCLR.CheckCLRTypes(StackObject.ToObject((esp - 1), domain, mStack)) : null;
|
|
|
//ClearStack
|
|
|
mStack.RemoveRange(mStackBase, mStack.Count - mStackBase);
|
|
|
return result;
|
|
|
@@ -79,8 +85,14 @@ namespace ILRuntime.Runtime.Intepreter
|
|
|
if (method == null)
|
|
|
throw new NullReferenceException();
|
|
|
#if UNITY_EDITOR
|
|
|
- if(System.Threading.Thread.CurrentThread.ManagedThreadId == AppDomain.UnityMainThreadID)
|
|
|
+ if (System.Threading.Thread.CurrentThread.ManagedThreadId == AppDomain.UnityMainThreadID)
|
|
|
+
|
|
|
+#if UNITY_5_5_OR_NEWER
|
|
|
UnityEngine.Profiling.Profiler.BeginSample(method.ToString());
|
|
|
+#else
|
|
|
+ UnityEngine.Profiler.BeginSample(method.ToString());
|
|
|
+#endif
|
|
|
+
|
|
|
#endif
|
|
|
OpCode[] body = method.Body;
|
|
|
StackFrame frame;
|
|
|
@@ -128,7 +140,7 @@ namespace ILRuntime.Runtime.Intepreter
|
|
|
//Managed Stack reserved for local variable
|
|
|
for (int i = 0; i < method.LocalVariableCount; i++)
|
|
|
{
|
|
|
- var v = method.Definition.Body.Variables[i];
|
|
|
+ var v = method.Variables[i];
|
|
|
if (v.VariableType.IsValueType && !v.VariableType.IsPrimitive)
|
|
|
{
|
|
|
var t = AppDomain.GetType(v.VariableType, method.DeclearingType, method);
|
|
|
@@ -505,7 +517,7 @@ namespace ILRuntime.Runtime.Intepreter
|
|
|
else
|
|
|
{
|
|
|
var t = AppDomain.GetType(ip->TokenInteger);
|
|
|
- ((CLRType)t).GetField(idx).SetValue(obj, t.TypeForCLR.CheckCLRTypes(AppDomain, StackObject.ToObject(val, AppDomain, mStack)));
|
|
|
+ ((CLRType)t).GetField(idx).SetValue(obj, t.TypeForCLR.CheckCLRTypes(StackObject.ToObject(val, AppDomain, mStack)));
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
@@ -518,7 +530,7 @@ namespace ILRuntime.Runtime.Intepreter
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- ((CLRType)t).GetField(objRef->ValueLow).SetValue(null, t.TypeForCLR.CheckCLRTypes(AppDomain, StackObject.ToObject(val, AppDomain, mStack)));
|
|
|
+ ((CLRType)t).GetField(objRef->ValueLow).SetValue(null, t.TypeForCLR.CheckCLRTypes(StackObject.ToObject(val, AppDomain, mStack)));
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
@@ -975,6 +987,25 @@ namespace ILRuntime.Runtime.Intepreter
|
|
|
esp++;
|
|
|
}
|
|
|
break;
|
|
|
+ case OpCodeEnum.Div_Un:
|
|
|
+ {
|
|
|
+ StackObject* b = esp - 1;
|
|
|
+ StackObject* a = esp - 1 - 1;
|
|
|
+ esp = a;
|
|
|
+ switch (a->ObjectType)
|
|
|
+ {
|
|
|
+ case ObjectTypes.Long:
|
|
|
+ *((ulong*)&esp->Value) = *((ulong*)&a->Value) / *((ulong*)&b->Value);
|
|
|
+ break;
|
|
|
+ case ObjectTypes.Integer:
|
|
|
+ esp->Value = (int)((uint)a->Value / (uint)b->Value);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ throw new NotImplementedException();
|
|
|
+ }
|
|
|
+ esp++;
|
|
|
+ }
|
|
|
+ break;
|
|
|
case OpCodeEnum.Rem:
|
|
|
{
|
|
|
StackObject* b = esp - 1;
|
|
|
@@ -1663,6 +1694,8 @@ namespace ILRuntime.Runtime.Intepreter
|
|
|
if (objRef->ObjectType == ObjectTypes.Null)
|
|
|
throw new NullReferenceException();
|
|
|
var obj = mStack[objRef->Value];
|
|
|
+ if (obj == null)
|
|
|
+ throw new NullReferenceException();
|
|
|
ilm = ((ILTypeInstance)obj).Type.GetVirtualMethod(ilm) as ILMethod;
|
|
|
}
|
|
|
esp = Execute(ilm, esp, out unhandledException);
|
|
|
@@ -1696,13 +1729,23 @@ namespace ILRuntime.Runtime.Intepreter
|
|
|
throw new NotSupportedException(cm.ToString() + " is not bound!");
|
|
|
#endif
|
|
|
#if UNITY_EDITOR
|
|
|
- if(System.Threading.Thread.CurrentThread.ManagedThreadId == AppDomain.UnityMainThreadID)
|
|
|
- UnityEngine.Profiling.Profiler.BeginSample(cm.ToString());
|
|
|
+ if (System.Threading.Thread.CurrentThread.ManagedThreadId == AppDomain.UnityMainThreadID)
|
|
|
+
|
|
|
+#if UNITY_5_5_OR_NEWER
|
|
|
+ UnityEngine.Profiling.Profiler.BeginSample(cm.ToString());
|
|
|
+#else
|
|
|
+ UnityEngine.Profiler.BeginSample(cm.ToString());
|
|
|
+#endif
|
|
|
#endif
|
|
|
object result = cm.Invoke(this, esp, mStack);
|
|
|
#if UNITY_EDITOR
|
|
|
- if(System.Threading.Thread.CurrentThread.ManagedThreadId == AppDomain.UnityMainThreadID)
|
|
|
- UnityEngine.Profiling.Profiler.EndSample();
|
|
|
+ if (System.Threading.Thread.CurrentThread.ManagedThreadId == AppDomain.UnityMainThreadID)
|
|
|
+#if UNITY_5_5_OR_NEWER
|
|
|
+ UnityEngine.Profiling.Profiler.EndSample();
|
|
|
+#else
|
|
|
+ UnityEngine.Profiler.EndSample();
|
|
|
+#endif
|
|
|
+
|
|
|
#endif
|
|
|
if (result is CrossBindingAdaptorType)
|
|
|
result = ((CrossBindingAdaptorType)result).ILInstance;
|
|
|
@@ -1733,47 +1776,9 @@ namespace ILRuntime.Runtime.Intepreter
|
|
|
#region FieldOperation
|
|
|
case OpCodeEnum.Stfld:
|
|
|
{
|
|
|
- StackObject* objRef = GetObjectAndResolveReference(esp - 1 - 1);
|
|
|
- if (objRef->ObjectType == ObjectTypes.Null)
|
|
|
- throw new NullReferenceException();
|
|
|
- object obj = null;
|
|
|
- switch (objRef->ObjectType)
|
|
|
- {
|
|
|
- case ObjectTypes.Object:
|
|
|
- obj = mStack[objRef->Value];
|
|
|
- break;
|
|
|
- case ObjectTypes.FieldReference:
|
|
|
- {
|
|
|
- obj = mStack[objRef->Value];
|
|
|
- int idx = objRef->ValueLow;
|
|
|
- if (obj is ILTypeInstance)
|
|
|
- {
|
|
|
- obj = ((ILTypeInstance)obj)[idx];
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- var t = AppDomain.GetType(obj.GetType());
|
|
|
- obj = ((CLRType)t).GetField(idx).GetValue(obj);
|
|
|
- }
|
|
|
- }
|
|
|
- break;
|
|
|
- case ObjectTypes.StaticFieldReference:
|
|
|
- {
|
|
|
- var t = AppDomain.GetType(objRef->Value);
|
|
|
- int idx = objRef->ValueLow;
|
|
|
- if (t is ILType)
|
|
|
- {
|
|
|
- obj = ((ILType)t).StaticInstance[idx];
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- obj = ((CLRType)t).GetField(idx).GetValue(null);
|
|
|
- }
|
|
|
- }
|
|
|
- break;
|
|
|
- default:
|
|
|
- throw new NotImplementedException();
|
|
|
- }
|
|
|
+ var objRef = GetObjectAndResolveReference(esp - 1 - 1);
|
|
|
+ object obj = RetriveObject(objRef, mStack);
|
|
|
+
|
|
|
if (obj != null)
|
|
|
{
|
|
|
if (obj is ILTypeInstance)
|
|
|
@@ -1790,7 +1795,7 @@ namespace ILRuntime.Runtime.Intepreter
|
|
|
{
|
|
|
var val = esp - 1;
|
|
|
var f = ((CLRType)type).GetField(ip->TokenInteger);
|
|
|
- f.SetValue(obj, f.FieldType.CheckCLRTypes(domain, CheckAndCloneValueType(StackObject.ToObject(val, domain, mStack), domain)));
|
|
|
+ f.SetValue(obj, f.FieldType.CheckCLRTypes(CheckAndCloneValueType(StackObject.ToObject(val, domain, mStack), domain)));
|
|
|
//Writeback
|
|
|
if (t.IsValueType)
|
|
|
{
|
|
|
@@ -1804,7 +1809,7 @@ namespace ILRuntime.Runtime.Intepreter
|
|
|
int idx = objRef->ValueLow;
|
|
|
if (oldObj is ILTypeInstance)
|
|
|
{
|
|
|
- oldObj = ((ILTypeInstance)oldObj)[idx];
|
|
|
+ ((ILTypeInstance)oldObj)[idx] = obj;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
@@ -1846,46 +1851,7 @@ namespace ILRuntime.Runtime.Intepreter
|
|
|
case OpCodeEnum.Ldfld:
|
|
|
{
|
|
|
StackObject* objRef = GetObjectAndResolveReference(esp - 1);
|
|
|
- if (objRef->ObjectType == ObjectTypes.Null)
|
|
|
- throw new NullReferenceException();
|
|
|
- object obj = null;
|
|
|
- switch (objRef->ObjectType)
|
|
|
- {
|
|
|
- case ObjectTypes.Object:
|
|
|
- obj = mStack[objRef->Value];
|
|
|
- break;
|
|
|
- case ObjectTypes.FieldReference:
|
|
|
- {
|
|
|
- obj = mStack[objRef->Value];
|
|
|
- int idx = objRef->ValueLow;
|
|
|
- if (obj is ILTypeInstance)
|
|
|
- {
|
|
|
- obj = ((ILTypeInstance)obj)[idx];
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- var t = AppDomain.GetType(obj.GetType());
|
|
|
- obj = ((CLRType)t).GetField(idx).GetValue(obj);
|
|
|
- }
|
|
|
- }
|
|
|
- break;
|
|
|
- case ObjectTypes.StaticFieldReference:
|
|
|
- {
|
|
|
- var t = AppDomain.GetType(objRef->Value);
|
|
|
- int idx = objRef->ValueLow;
|
|
|
- if (t is ILType)
|
|
|
- {
|
|
|
- obj = ((ILType)t).StaticInstance[idx];
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- obj = ((CLRType)t).GetField(idx).GetValue(null);
|
|
|
- }
|
|
|
- }
|
|
|
- break;
|
|
|
- default:
|
|
|
- throw new NotImplementedException();
|
|
|
- }
|
|
|
+ object obj = RetriveObject(objRef, mStack);
|
|
|
Free(esp - 1);
|
|
|
if (obj != null)
|
|
|
{
|
|
|
@@ -1900,10 +1866,11 @@ namespace ILRuntime.Runtime.Intepreter
|
|
|
var type = AppDomain.GetType(t);
|
|
|
if (type != null)
|
|
|
{
|
|
|
- var val = ((CLRType)type).GetField(ip->TokenInteger).GetValue(obj);
|
|
|
+ var ft = ((CLRType)type).GetField(ip->TokenInteger);
|
|
|
+ var val = ft.GetValue(obj);
|
|
|
if (val is CrossBindingAdaptorType)
|
|
|
val = ((CrossBindingAdaptorType)val).ILInstance;
|
|
|
- PushObject(esp - 1, mStack, val);
|
|
|
+ PushObject(esp - 1, mStack, val, ft.FieldType == typeof(object));
|
|
|
}
|
|
|
else
|
|
|
throw new TypeLoadException();
|
|
|
@@ -1917,46 +1884,8 @@ namespace ILRuntime.Runtime.Intepreter
|
|
|
case OpCodeEnum.Ldflda:
|
|
|
{
|
|
|
StackObject* objRef = GetObjectAndResolveReference(esp - 1);
|
|
|
- if (objRef->ObjectType == ObjectTypes.Null)
|
|
|
- throw new NullReferenceException();
|
|
|
- object obj = null;
|
|
|
- switch (objRef->ObjectType)
|
|
|
- {
|
|
|
- case ObjectTypes.Object:
|
|
|
- obj = mStack[objRef->Value];
|
|
|
- break;
|
|
|
- case ObjectTypes.FieldReference:
|
|
|
- {
|
|
|
- obj = mStack[objRef->Value];
|
|
|
- int idx = objRef->ValueLow;
|
|
|
- if (obj is ILTypeInstance)
|
|
|
- {
|
|
|
- obj = ((ILTypeInstance)obj)[idx];
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- var t = AppDomain.GetType(obj.GetType());
|
|
|
- obj = ((CLRType)t).GetField(idx).GetValue(obj);
|
|
|
- }
|
|
|
- }
|
|
|
- break;
|
|
|
- case ObjectTypes.StaticFieldReference:
|
|
|
- {
|
|
|
- var t = AppDomain.GetType(objRef->Value);
|
|
|
- int idx = objRef->ValueLow;
|
|
|
- if (t is ILType)
|
|
|
- {
|
|
|
- obj = ((ILType)t).StaticInstance[idx];
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- obj = ((CLRType)t).GetField(idx).GetValue(null);
|
|
|
- }
|
|
|
- }
|
|
|
- break;
|
|
|
- default:
|
|
|
- throw new NotImplementedException();
|
|
|
- }
|
|
|
+ object obj = RetriveObject(objRef, mStack);
|
|
|
+
|
|
|
Free(esp - 1);
|
|
|
if (obj != null)
|
|
|
{
|
|
|
@@ -1995,7 +1924,7 @@ namespace ILRuntime.Runtime.Intepreter
|
|
|
int idx = (int)ip->TokenLong;
|
|
|
var f = t.GetField(idx);
|
|
|
StackObject* val = esp - 1;
|
|
|
- f.SetValue(null, f.FieldType.CheckCLRTypes(domain, CheckAndCloneValueType(StackObject.ToObject(val, domain, mStack), domain)));
|
|
|
+ f.SetValue(null, f.FieldType.CheckCLRTypes(CheckAndCloneValueType(StackObject.ToObject(val, domain, mStack), domain)));
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
@@ -2022,7 +1951,7 @@ namespace ILRuntime.Runtime.Intepreter
|
|
|
var val = f.GetValue(null);
|
|
|
if (val is CrossBindingAdaptorType)
|
|
|
val = ((CrossBindingAdaptorType)val).ILInstance;
|
|
|
- PushObject(esp, mStack, val);
|
|
|
+ PushObject(esp, mStack, val, f.FieldType == typeof(object));
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
@@ -2342,59 +2271,67 @@ namespace ILRuntime.Runtime.Intepreter
|
|
|
else
|
|
|
{
|
|
|
CLRMethod cm = (CLRMethod)m;
|
|
|
- if (cm.DeclearingType.IsDelegate)
|
|
|
+ //Means new object();
|
|
|
+ if (cm == null)
|
|
|
{
|
|
|
- var objRef = GetObjectAndResolveReference(esp - 1 - 1);
|
|
|
- var mi = (IMethod)mStack[(esp - 1)->Value];
|
|
|
- object ins;
|
|
|
- if (objRef->ObjectType == ObjectTypes.Null)
|
|
|
- ins = null;
|
|
|
- else
|
|
|
- ins = mStack[objRef->Value];
|
|
|
- Free(esp - 1);
|
|
|
- Free(esp - 1 - 1);
|
|
|
- esp = esp - 1 - 1;
|
|
|
- object dele;
|
|
|
- if (mi is ILMethod)
|
|
|
+ esp = PushObject(esp, mStack, new object());
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (cm.DeclearingType.IsDelegate)
|
|
|
{
|
|
|
- if (ins != null)
|
|
|
- {
|
|
|
- dele = ((ILTypeInstance)ins).GetDelegateAdapter((ILMethod)mi);
|
|
|
- if (dele == null)
|
|
|
- dele = domain.DelegateManager.FindDelegateAdapter((ILTypeInstance)ins, (ILMethod)mi);
|
|
|
- }
|
|
|
+ var objRef = GetObjectAndResolveReference(esp - 1 - 1);
|
|
|
+ var mi = (IMethod)mStack[(esp - 1)->Value];
|
|
|
+ object ins;
|
|
|
+ if (objRef->ObjectType == ObjectTypes.Null)
|
|
|
+ ins = null;
|
|
|
else
|
|
|
+ ins = mStack[objRef->Value];
|
|
|
+ Free(esp - 1);
|
|
|
+ Free(esp - 1 - 1);
|
|
|
+ esp = esp - 1 - 1;
|
|
|
+ object dele;
|
|
|
+ if (mi is ILMethod)
|
|
|
{
|
|
|
- if (((ILMethod)mi).DelegateAdapter == null)
|
|
|
+ if (ins != null)
|
|
|
{
|
|
|
- ((ILMethod)mi).DelegateAdapter = domain.DelegateManager.FindDelegateAdapter(null, (ILMethod)mi);
|
|
|
+ dele = ((ILTypeInstance)ins).GetDelegateAdapter((ILMethod)mi);
|
|
|
+ if (dele == null)
|
|
|
+ dele = domain.DelegateManager.FindDelegateAdapter((ILTypeInstance)ins, (ILMethod)mi);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (((ILMethod)mi).DelegateAdapter == null)
|
|
|
+ {
|
|
|
+ ((ILMethod)mi).DelegateAdapter = domain.DelegateManager.FindDelegateAdapter(null, (ILMethod)mi);
|
|
|
+ }
|
|
|
+ dele = ((ILMethod)mi).DelegateAdapter;
|
|
|
}
|
|
|
- dele = ((ILMethod)mi).DelegateAdapter;
|
|
|
}
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (ins is ILTypeInstance)
|
|
|
+ ins = ((ILTypeInstance)ins).CLRInstance;
|
|
|
+ dele = Delegate.CreateDelegate(cm.DeclearingType.TypeForCLR, ins, ((CLRMethod)mi).MethodInfo);
|
|
|
+ }
|
|
|
+ esp = PushObject(esp, mStack, dele);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- if (ins is ILTypeInstance)
|
|
|
- ins = ((ILTypeInstance)ins).CLRInstance;
|
|
|
- dele = Delegate.CreateDelegate(cm.DeclearingType.TypeForCLR, ins, ((CLRMethod)mi).MethodInfo);
|
|
|
- }
|
|
|
- esp = PushObject(esp, mStack, dele);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- var redirect = cm.Redirection;
|
|
|
- if (redirect != null)
|
|
|
- esp = redirect(this, esp, mStack, cm, true);
|
|
|
- else
|
|
|
- {
|
|
|
- object result = cm.Invoke(this, esp, mStack, true);
|
|
|
- int paramCount = cm.ParameterCount;
|
|
|
- for (int i = 1; i <= paramCount; i++)
|
|
|
+ var redirect = cm.Redirection;
|
|
|
+ if (redirect != null)
|
|
|
+ esp = redirect(this, esp, mStack, cm, true);
|
|
|
+ else
|
|
|
{
|
|
|
- Free(esp - i);
|
|
|
+ object result = cm.Invoke(this, esp, mStack, true);
|
|
|
+ int paramCount = cm.ParameterCount;
|
|
|
+ for (int i = 1; i <= paramCount; i++)
|
|
|
+ {
|
|
|
+ Free(esp - i);
|
|
|
+ }
|
|
|
+ esp = Minus(esp, paramCount);
|
|
|
+ esp = PushObject(esp, mStack, result);//new constructedObj
|
|
|
}
|
|
|
- esp = Minus(esp, paramCount);
|
|
|
- esp = PushObject(esp, mStack, result);//new constructedObj
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -2402,7 +2339,8 @@ namespace ILRuntime.Runtime.Intepreter
|
|
|
break;
|
|
|
case OpCodeEnum.Constrained:
|
|
|
{
|
|
|
- var obj = GetObjectAndResolveReference(esp - 1);
|
|
|
+ var objRef = esp - 1;
|
|
|
+ var obj = GetObjectAndResolveReference(objRef);
|
|
|
var type = domain.GetType(ip->TokenInteger);
|
|
|
if (type != null)
|
|
|
{
|
|
|
@@ -2412,8 +2350,43 @@ namespace ILRuntime.Runtime.Intepreter
|
|
|
if (t.IsEnum)
|
|
|
{
|
|
|
ILEnumTypeInstance ins = new ILEnumTypeInstance(t);
|
|
|
- ins.AssignFromStack(0, obj, AppDomain, mStack);
|
|
|
- ins.Boxed = true;
|
|
|
+ switch (obj->ObjectType)
|
|
|
+ {
|
|
|
+ case ObjectTypes.FieldReference:
|
|
|
+ {
|
|
|
+ var owner = mStack[obj->Value] as ILTypeInstance;
|
|
|
+ int idx = obj->ValueLow;
|
|
|
+ Free(objRef);
|
|
|
+ owner.PushToStack(idx, objRef, AppDomain, mStack);
|
|
|
+ ins.AssignFromStack(0, objRef, AppDomain, mStack);
|
|
|
+ ins.Boxed = true;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case ObjectTypes.StaticFieldReference:
|
|
|
+ {
|
|
|
+ var st = AppDomain.GetType(obj->Value) as ILType;
|
|
|
+ int idx = obj->ValueLow;
|
|
|
+ Free(objRef);
|
|
|
+ st.StaticInstance.PushToStack(idx, objRef, AppDomain, mStack);
|
|
|
+ ins.AssignFromStack(0, objRef, AppDomain, mStack);
|
|
|
+ ins.Boxed = true;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case ObjectTypes.ArrayReference:
|
|
|
+ {
|
|
|
+ var arr = mStack[obj->Value];
|
|
|
+ var idx = obj->ValueLow;
|
|
|
+ Free(objRef);
|
|
|
+ LoadFromArrayReference(arr, idx, objRef, t, mStack);
|
|
|
+ ins.AssignFromStack(0, objRef, AppDomain, mStack);
|
|
|
+ ins.Boxed = true;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ ins.AssignFromStack(0, obj, AppDomain, mStack);
|
|
|
+ ins.Boxed = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
esp = PushObject(esp - 1, mStack, ins);
|
|
|
}
|
|
|
else
|
|
|
@@ -2423,9 +2396,14 @@ namespace ILRuntime.Runtime.Intepreter
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- if (type.TypeForCLR.IsEnum)
|
|
|
+ var tt = type.TypeForCLR;
|
|
|
+ if (tt.IsEnum)
|
|
|
+ {
|
|
|
+ esp = PushObject(esp - 1, mStack, Enum.ToObject(tt, StackObject.ToObject(obj, AppDomain, mStack)));
|
|
|
+ }
|
|
|
+ else if (tt.IsPrimitive)
|
|
|
{
|
|
|
- esp = PushObject(esp - 1, mStack, Enum.ToObject(type.TypeForCLR, StackObject.ToObject(obj, AppDomain, mStack)));
|
|
|
+ esp = PushObject(esp - 1, mStack, tt.CheckCLRTypes(StackObject.ToObject(obj, AppDomain, mStack)));
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
@@ -2531,7 +2509,7 @@ namespace ILRuntime.Runtime.Intepreter
|
|
|
esp = PushObject(obj, mStack, (short)obj->Value, true);
|
|
|
break;
|
|
|
case ObjectTypes.Null:
|
|
|
- esp = PushObject(obj, mStack, 0L, true);
|
|
|
+ esp = PushObject(obj, mStack, (short)0, true);
|
|
|
break;
|
|
|
default:
|
|
|
throw new NotImplementedException();
|
|
|
@@ -2579,6 +2557,17 @@ namespace ILRuntime.Runtime.Intepreter
|
|
|
throw new NotImplementedException();
|
|
|
}
|
|
|
}
|
|
|
+ else if (t == typeof(char))
|
|
|
+ {
|
|
|
+ switch (obj->ObjectType)
|
|
|
+ {
|
|
|
+ case ObjectTypes.Integer:
|
|
|
+ esp = PushObject(obj, mStack, (char)obj->Value, true);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ throw new NotImplementedException();
|
|
|
+ }
|
|
|
+ }
|
|
|
else if (t == typeof(uint))
|
|
|
{
|
|
|
switch (obj->ObjectType)
|
|
|
@@ -2587,7 +2576,7 @@ namespace ILRuntime.Runtime.Intepreter
|
|
|
esp = PushObject(obj, mStack, (uint)obj->Value, true);
|
|
|
break;
|
|
|
case ObjectTypes.Null:
|
|
|
- esp = PushObject(obj, mStack, 0L, true);
|
|
|
+ esp = PushObject(obj, mStack, (uint)0, true);
|
|
|
break;
|
|
|
default:
|
|
|
throw new NotImplementedException();
|
|
|
@@ -2601,7 +2590,7 @@ namespace ILRuntime.Runtime.Intepreter
|
|
|
esp = PushObject(obj, mStack, (ushort)obj->Value, true);
|
|
|
break;
|
|
|
case ObjectTypes.Null:
|
|
|
- esp = PushObject(obj, mStack, 0L, true);
|
|
|
+ esp = PushObject(obj, mStack, (ushort)0, true);
|
|
|
break;
|
|
|
default:
|
|
|
throw new NotImplementedException();
|
|
|
@@ -2615,7 +2604,7 @@ namespace ILRuntime.Runtime.Intepreter
|
|
|
esp = PushObject(obj, mStack, *(ulong*)&obj->Value, true);
|
|
|
break;
|
|
|
case ObjectTypes.Null:
|
|
|
- esp = PushObject(obj, mStack, 0L, true);
|
|
|
+ esp = PushObject(obj, mStack, (ulong)0, true);
|
|
|
break;
|
|
|
default:
|
|
|
throw new NotImplementedException();
|
|
|
@@ -2629,7 +2618,7 @@ namespace ILRuntime.Runtime.Intepreter
|
|
|
esp = PushObject(obj, mStack, (sbyte)obj->Value, true);
|
|
|
break;
|
|
|
case ObjectTypes.Null:
|
|
|
- esp = PushObject(obj, mStack, 0L, true);
|
|
|
+ esp = PushObject(obj, mStack, (sbyte)0, true);
|
|
|
break;
|
|
|
default:
|
|
|
throw new NotImplementedException();
|
|
|
@@ -2710,6 +2699,12 @@ namespace ILRuntime.Runtime.Intepreter
|
|
|
objRef->ObjectType = ObjectTypes.Double;
|
|
|
*(double*)&objRef->Value = val;
|
|
|
}
|
|
|
+ else if (type == typeof(char))
|
|
|
+ {
|
|
|
+ char val = (char)obj;
|
|
|
+ objRef->ObjectType = ObjectTypes.Integer;
|
|
|
+ *(char*)&objRef->Value = val;
|
|
|
+ }
|
|
|
else if (type == typeof(uint))
|
|
|
{
|
|
|
uint val = (uint)obj;
|
|
|
@@ -2851,58 +2846,48 @@ namespace ILRuntime.Runtime.Intepreter
|
|
|
var type = domain.GetType(ip->TokenInteger);
|
|
|
if (type != null)
|
|
|
{
|
|
|
- if (objRef->ObjectType != ObjectTypes.Null)
|
|
|
+ var obj = RetriveObject(objRef, mStack);
|
|
|
+ Free(objRef);
|
|
|
+
|
|
|
+ if (obj != null)
|
|
|
{
|
|
|
- var obj = mStack[objRef->Value];
|
|
|
- Free(objRef);
|
|
|
- if (obj != null)
|
|
|
+ if (obj is ILTypeInstance)
|
|
|
{
|
|
|
- if (obj is ILTypeInstance)
|
|
|
+ if (((ILTypeInstance)obj).CanAssignTo(type))
|
|
|
{
|
|
|
- if (((ILTypeInstance)obj).CanAssignTo(type))
|
|
|
- {
|
|
|
- esp = PushObject(objRef, mStack, obj);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
-#if !DEBUG
|
|
|
- objRef->ObjectType = ObjectTypes.Null;
|
|
|
- objRef->Value = -1;
|
|
|
- objRef->ValueLow = 0;
|
|
|
-#endif
|
|
|
- }
|
|
|
+ esp = PushObject(objRef, mStack, obj);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- if (type.TypeForCLR.IsAssignableFrom(obj.GetType()))
|
|
|
- {
|
|
|
- esp = PushObject(objRef, mStack, obj, true);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
#if !DEBUG
|
|
|
objRef->ObjectType = ObjectTypes.Null;
|
|
|
objRef->Value = -1;
|
|
|
objRef->ValueLow = 0;
|
|
|
#endif
|
|
|
- }
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
+ if (type.TypeForCLR.IsAssignableFrom(obj.GetType()))
|
|
|
+ {
|
|
|
+ esp = PushObject(objRef, mStack, obj, true);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
#if !DEBUG
|
|
|
- objRef->ObjectType = ObjectTypes.Null;
|
|
|
- objRef->Value = -1;
|
|
|
- objRef->ValueLow = 0;
|
|
|
+ objRef->ObjectType = ObjectTypes.Null;
|
|
|
+ objRef->Value = -1;
|
|
|
+ objRef->ValueLow = 0;
|
|
|
#endif
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
#if !DEBUG
|
|
|
- objRef->ObjectType = ObjectTypes.Null;
|
|
|
- objRef->Value = -1;
|
|
|
- objRef->ValueLow = 0;
|
|
|
+ objRef->ObjectType = ObjectTypes.Null;
|
|
|
+ objRef->Value = -1;
|
|
|
+ objRef->ValueLow = 0;
|
|
|
#endif
|
|
|
}
|
|
|
}
|
|
|
@@ -2923,6 +2908,8 @@ namespace ILRuntime.Runtime.Intepreter
|
|
|
if (type.TypeForCLR != typeof(ILTypeInstance))
|
|
|
{
|
|
|
arr = Array.CreateInstance(type.TypeForCLR, cnt->Value);
|
|
|
+ //Register Type
|
|
|
+ AppDomain.GetType(arr.GetType());
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
@@ -2935,21 +2922,9 @@ namespace ILRuntime.Runtime.Intepreter
|
|
|
}
|
|
|
break;
|
|
|
case OpCodeEnum.Stelem_Ref:
|
|
|
- {
|
|
|
- var val = esp - 1;
|
|
|
- var idx = esp - 1 - 1;
|
|
|
- var arrRef = esp - 1 - 1 - 1;
|
|
|
- Array arr = mStack[arrRef->Value] as Array;
|
|
|
- ArraySetValue(arr, mStack[val->Value], idx->Value);
|
|
|
- Free(esp - 1);
|
|
|
- Free(esp - 1 - 1);
|
|
|
- Free(esp - 1 - 1 - 1);
|
|
|
- esp = esp - 1 - 1 - 1;
|
|
|
- }
|
|
|
- break;
|
|
|
case OpCodeEnum.Stelem_Any:
|
|
|
{
|
|
|
- var val = esp - 1;
|
|
|
+ var val = GetObjectAndResolveReference(esp - 1);
|
|
|
var idx = esp - 1 - 1;
|
|
|
var arrRef = esp - 1 - 1 - 1;
|
|
|
Array arr = mStack[arrRef->Value] as Array;
|
|
|
@@ -2957,6 +2932,9 @@ namespace ILRuntime.Runtime.Intepreter
|
|
|
{
|
|
|
switch (val->ObjectType)
|
|
|
{
|
|
|
+ case ObjectTypes.Null:
|
|
|
+ arr.SetValue(null, idx->Value);
|
|
|
+ break;
|
|
|
case ObjectTypes.Object:
|
|
|
ArraySetValue(arr, mStack[val->Value], idx->Value);
|
|
|
break;
|
|
|
@@ -2990,7 +2968,7 @@ namespace ILRuntime.Runtime.Intepreter
|
|
|
break;
|
|
|
case ObjectTypes.Long:
|
|
|
{
|
|
|
- if(arr is long[])
|
|
|
+ if (arr is long[])
|
|
|
{
|
|
|
((long[])arr)[idx->Value] = *(long*)&val->Value;
|
|
|
}
|
|
|
@@ -3598,7 +3576,42 @@ namespace ILRuntime.Runtime.Intepreter
|
|
|
*(double*)&obj->Value = val;
|
|
|
}
|
|
|
break;
|
|
|
-
|
|
|
+ case OpCodeEnum.Conv_R_Un:
|
|
|
+ {
|
|
|
+ var obj = esp - 1;
|
|
|
+ bool isDouble = false;
|
|
|
+ float val = 0;
|
|
|
+ double val2 = 0;
|
|
|
+ switch (obj->ObjectType)
|
|
|
+ {
|
|
|
+ case ObjectTypes.Long:
|
|
|
+ val2 = (double)*(ulong*)&obj->Value;
|
|
|
+ isDouble = true;
|
|
|
+ break;
|
|
|
+ case ObjectTypes.Float:
|
|
|
+ ip++;
|
|
|
+ continue;
|
|
|
+ case ObjectTypes.Integer:
|
|
|
+ val = (uint)obj->Value;
|
|
|
+ break;
|
|
|
+ case ObjectTypes.Double:
|
|
|
+ ip++;
|
|
|
+ continue;
|
|
|
+ default:
|
|
|
+ throw new NotImplementedException();
|
|
|
+ }
|
|
|
+ if (isDouble)
|
|
|
+ {
|
|
|
+ obj->ObjectType = ObjectTypes.Double;
|
|
|
+ *(double*)&obj->Value = val2;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ obj->ObjectType = ObjectTypes.Float;
|
|
|
+ *(float*)&obj->Value = val;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
#endregion
|
|
|
|
|
|
#region Stack operation
|
|
|
@@ -3706,19 +3719,77 @@ namespace ILRuntime.Runtime.Intepreter
|
|
|
}
|
|
|
}
|
|
|
#if UNITY_EDITOR
|
|
|
- if(System.Threading.Thread.CurrentThread.ManagedThreadId == AppDomain.UnityMainThreadID)
|
|
|
- UnityEngine.Profiling.Profiler.EndSample();
|
|
|
+ if (System.Threading.Thread.CurrentThread.ManagedThreadId == AppDomain.UnityMainThreadID)
|
|
|
+#if UNITY_5_5_OR_NEWER
|
|
|
+ UnityEngine.Profiling.Profiler.EndSample();
|
|
|
+#else
|
|
|
+ UnityEngine.Profiler.EndSample();
|
|
|
+#endif
|
|
|
#endif
|
|
|
//ClearStack
|
|
|
return stack.PopFrame(ref frame, esp, mStack);
|
|
|
}
|
|
|
|
|
|
+ object RetriveObject(StackObject* esp, List<object> mStack)
|
|
|
+ {
|
|
|
+ StackObject* objRef = GetObjectAndResolveReference(esp);
|
|
|
+ if (objRef->ObjectType == ObjectTypes.Null)
|
|
|
+ return null;
|
|
|
+ object obj = null;
|
|
|
+ switch (objRef->ObjectType)
|
|
|
+ {
|
|
|
+ case ObjectTypes.Object:
|
|
|
+ obj = mStack[objRef->Value];
|
|
|
+ break;
|
|
|
+ case ObjectTypes.FieldReference:
|
|
|
+ {
|
|
|
+ obj = mStack[objRef->Value];
|
|
|
+ int idx = objRef->ValueLow;
|
|
|
+ if (obj is ILTypeInstance)
|
|
|
+ {
|
|
|
+ obj = ((ILTypeInstance)obj)[idx];
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ var t = AppDomain.GetType(obj.GetType());
|
|
|
+ obj = ((CLRType)t).GetField(idx).GetValue(obj);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case ObjectTypes.ArrayReference:
|
|
|
+ {
|
|
|
+ Array arr = mStack[objRef->Value] as Array;
|
|
|
+ int idx = objRef->ValueLow;
|
|
|
+ obj = arr.GetValue(idx);
|
|
|
+ obj = obj.GetType().CheckCLRTypes(obj);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case ObjectTypes.StaticFieldReference:
|
|
|
+ {
|
|
|
+ var t = AppDomain.GetType(objRef->Value);
|
|
|
+ int idx = objRef->ValueLow;
|
|
|
+ if (t is ILType)
|
|
|
+ {
|
|
|
+ obj = ((ILType)t).StaticInstance[idx];
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ obj = ((CLRType)t).GetField(idx).GetValue(null);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ throw new NotImplementedException();
|
|
|
+ }
|
|
|
+ return obj;
|
|
|
+ }
|
|
|
+
|
|
|
void ArraySetValue(Array arr, object obj, int idx)
|
|
|
{
|
|
|
if (obj == null)
|
|
|
arr.SetValue(null, idx);
|
|
|
else
|
|
|
- arr.SetValue(obj.GetType().CheckCLRTypes(AppDomain, obj), idx);
|
|
|
+ arr.SetValue(arr.GetType().GetElementType().CheckCLRTypes(obj), idx);
|
|
|
}
|
|
|
|
|
|
void StoreIntValueToArray(Array arr, StackObject* val, StackObject* idx)
|
|
|
@@ -3733,7 +3804,7 @@ namespace ILRuntime.Runtime.Intepreter
|
|
|
}
|
|
|
{
|
|
|
short[] tmp = arr as short[];
|
|
|
- if(tmp != null)
|
|
|
+ if (tmp != null)
|
|
|
{
|
|
|
tmp[idx->Value] = (short)val->Value;
|
|
|
return;
|
|
|
@@ -3818,7 +3889,7 @@ namespace ILRuntime.Runtime.Intepreter
|
|
|
|
|
|
void LoadFromFieldReference(object obj, int idx, StackObject* dst, List<object> mStack)
|
|
|
{
|
|
|
- if(obj is ILTypeInstance)
|
|
|
+ if (obj is ILTypeInstance)
|
|
|
{
|
|
|
((ILTypeInstance)obj).PushToStack(idx, dst, AppDomain, mStack);
|
|
|
}
|
|
|
@@ -3840,12 +3911,12 @@ namespace ILRuntime.Runtime.Intepreter
|
|
|
{
|
|
|
CLRType t = AppDomain.GetType(obj.GetType()) as CLRType;
|
|
|
var fi = t.GetField(idx);
|
|
|
- var v = obj.GetType().CheckCLRTypes(AppDomain, CheckAndCloneValueType(StackObject.ToObject(val, AppDomain, mStack), AppDomain));
|
|
|
+ var v = obj.GetType().CheckCLRTypes(CheckAndCloneValueType(StackObject.ToObject(val, AppDomain, mStack), AppDomain));
|
|
|
fi.SetValue(obj, v);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- void LoadFromArrayReference(object obj,int idx, StackObject* objRef, IType t, List<object> mStack)
|
|
|
+ void LoadFromArrayReference(object obj, int idx, StackObject* objRef, IType t, List<object> mStack)
|
|
|
{
|
|
|
var nT = t.TypeForCLR;
|
|
|
LoadFromArrayReference(obj, idx, objRef, nT, mStack);
|
|
|
@@ -3936,7 +4007,7 @@ namespace ILRuntime.Runtime.Intepreter
|
|
|
var nT = t.TypeForCLR;
|
|
|
StoreValueToArrayReference(objRef, val, nT, mStack);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
void StoreValueToArrayReference(StackObject* objRef, StackObject* val, Type nT, List<object> mStack)
|
|
|
{
|
|
|
if (nT.IsPrimitive)
|
|
|
@@ -4022,12 +4093,13 @@ namespace ILRuntime.Runtime.Intepreter
|
|
|
StackObject* PushParameters(IMethod method, StackObject* esp, object[] p)
|
|
|
{
|
|
|
List<object> mStack = stack.ManagedStack;
|
|
|
- if (p != null && p.Length > 0)
|
|
|
+ var plist = method.Parameters;
|
|
|
+ int pCnt = plist != null ? plist.Count : 0;
|
|
|
+ int pCnt2 = p != null ? p.Length : 0;
|
|
|
+ if (pCnt != pCnt2)
|
|
|
+ throw new ArgumentOutOfRangeException("Parameter mismatch");
|
|
|
+ if (pCnt2 > 0)
|
|
|
{
|
|
|
- var plist = method.Parameters;
|
|
|
- int pCnt = plist != null ? plist.Count : 0;
|
|
|
- if (pCnt != p.Length)
|
|
|
- throw new ArgumentOutOfRangeException();
|
|
|
for (int i = 0; i < p.Length; i++)
|
|
|
{
|
|
|
bool isBox = false;
|