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;
            }
        }
Beispiel #2
0
        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;
                        }
                    }
                }
            }
        }
Beispiel #3
0
 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);
                 }
             }
         }
     }
 }