static void WriteBackInstance(ILRuntime.Runtime.Enviorment.AppDomain __domain, StackObject *ptr_of_this_method, IList <object> __mStack, ref ILRuntime.Runtime.Stack.StackObject instance_of_this_method) { ptr_of_this_method = ILIntepreter.GetObjectAndResolveReference(ptr_of_this_method); switch (ptr_of_this_method->ObjectType) { case ObjectTypes.Object: { __mStack[ptr_of_this_method->Value] = instance_of_this_method; } break; case ObjectTypes.FieldReference: { var ___obj = __mStack[ptr_of_this_method->Value]; if (___obj is ILTypeInstance) { ((ILTypeInstance)___obj)[ptr_of_this_method->ValueLow] = instance_of_this_method; } else { var t = __domain.GetType(___obj.GetType()) as CLRType; t.SetFieldValue(ptr_of_this_method->ValueLow, ref ___obj, instance_of_this_method); } } break; case ObjectTypes.StaticFieldReference: { var t = __domain.GetType(ptr_of_this_method->Value); if (t is ILType) { ((ILType)t).StaticInstance[ptr_of_this_method->ValueLow] = instance_of_this_method; } else { ((CLRType)t).SetStaticFieldValue(ptr_of_this_method->ValueLow, instance_of_this_method); } } break; case ObjectTypes.ArrayReference: { var instance_of_arrayReference = __mStack[ptr_of_this_method->Value] as ILRuntime.Runtime.Stack.StackObject[]; instance_of_arrayReference[ptr_of_this_method->ValueLow] = instance_of_this_method; } break; } }
public void ClearValueTypeObject(IType type, StackObject *ptr) { if (type is ILType) { ILType t = (ILType)type; for (int i = 0; i < t.FieldTypes.Length; i++) { var ft = t.FieldTypes[i]; StackObject *val = ILIntepreter.Minus(ptr, t.FieldStartIndex + i + 1); if (ft.IsPrimitive || ft.IsEnum) { StackObject.Initialized(val, ft); } else { switch (val->ObjectType) { case ObjectTypes.ValueTypeObjectReference: ClearValueTypeObject(ft, ILIntepreter.ResolveReference(val)); break; default: if (ft.IsValueType) { if (ft is ILType) { throw new NotImplementedException(); } else { managedStack[val->Value] = ((CLRType)ft).CreateDefaultInstance(); } } else { managedStack[val->Value] = null; } break; } } } if (type.BaseType != null && type.BaseType is ILType) { ClearValueTypeObject((ILType)type.BaseType, ptr); } } else { CLRType t = (CLRType)type; var cnt = t.TotalFieldCount; for (int i = 0; i < cnt; i++) { var vt = t.OrderedFieldTypes[i] as CLRType; StackObject *val = ILIntepreter.Minus(ptr, i + 1); if (vt.IsPrimitive) { StackObject.Initialized(val, vt); } else { switch (val->ObjectType) { case ObjectTypes.ValueTypeObjectReference: { var dst = ILIntepreter.ResolveReference(val); ClearValueTypeObject(vt, dst); } break; default: if (vt.IsValueType) { managedStack[val->Value] = vt.CreateDefaultInstance(); } else { managedStack[val->Value] = null; } break; } } } } }
void InitializeValueTypeObject(IType type, StackObject *ptr) { if (type is ILType) { ILType t = (ILType)type; for (int i = 0; i < t.FieldTypes.Length; i++) { var ft = t.FieldTypes[i]; StackObject *val = ILIntepreter.Minus(ptr, t.FieldStartIndex + i + 1); if (ft.IsPrimitive || ft.IsEnum) { StackObject.Initialized(val, ft); } else { if (ft.IsValueType) { if (ft is ILType || ((CLRType)ft).ValueTypeBinder != null) { AllocValueType(val, ft); } else { val->ObjectType = ObjectTypes.Object; val->Value = managedStack.Count; managedStack.Add(((CLRType)ft).CreateDefaultInstance()); } } else { val->ObjectType = ObjectTypes.Object; val->Value = managedStack.Count; managedStack.Add(null); } } } if (type.BaseType != null && type.BaseType is ILType) { InitializeValueTypeObject((ILType)type.BaseType, ptr); } } else { CLRType t = (CLRType)type; var cnt = t.TotalFieldCount; for (int i = 0; i < cnt; i++) { var it = t.OrderedFieldTypes[i] as CLRType; StackObject *val = ILIntepreter.Minus(ptr, i + 1); if (it.IsPrimitive) { StackObject.Initialized(val, it); } else { if (it.IsValueType) { if (it.ValueTypeBinder != null) { AllocValueType(val, it); } else { val->ObjectType = ObjectTypes.Object; val->Value = managedStack.Count; managedStack.Add(it.CreateDefaultInstance()); } } else { val->ObjectType = ObjectTypes.Object; val->Value = managedStack.Count; managedStack.Add(null); } } } } }