Exemple #1
0
 internal unsafe void AssignFromStack(int fieldIdx, StackObject *esp, Enviorment.AppDomain appdomain, IList <object> managedStack)
 {
     if (fieldIdx < fields.Length && fieldIdx >= 0)
     {
         AssignFromStackSub(ref fields[fieldIdx], fieldIdx, esp, managedStack);
     }
     else
     {
         if (Type.FirstCLRBaseType != null && Type.FirstCLRBaseType is Enviorment.CrossBindingAdaptor)
         {
             CLRType clrType = appdomain.GetType(((Enviorment.CrossBindingAdaptor)Type.FirstCLRBaseType).BaseCLRType) as CLRType;
             var     field   = clrType.GetField(fieldIdx);
             clrType.SetFieldValue(fieldIdx, ref clrInstance, field.FieldType.CheckCLRTypes(ILIntepreter.CheckAndCloneValueType(StackObject.ToObject(esp, appdomain, managedStack), appdomain)));
         }
         else
         {
             throw new TypeLoadException();
         }
     }
 }
Exemple #2
0
        public unsafe object this[int index]
        {
            get
            {
                if (index < fields.Length && index >= 0)
                {
                    fixed(StackObject *ptr = fields)
                    {
                        StackObject *esp = &ptr[index];

                        return(StackObject.ToObject(esp, null, managedObjs));
                    }
                }
                else
                {
                    if (Type.FirstCLRBaseType != null && Type.FirstCLRBaseType is Enviorment.CrossBindingAdaptor)
                    {
                        CLRType clrType = type.AppDomain.GetType(((Enviorment.CrossBindingAdaptor)Type.FirstCLRBaseType).BaseCLRType) as CLRType;
                        return(clrType.GetFieldValue(index, clrInstance));
                    }
                    else
                    {
                        throw new TypeLoadException();
                    }
                }
            }
            set
            {
                value = ILIntepreter.CheckAndCloneValueType(value, type.AppDomain);
                if (index < fields.Length && index >= 0)
                {
                    fixed(StackObject *ptr = fields)
                    {
                        StackObject *esp = &ptr[index];

                        if (value != null)
                        {
                            var vt = value.GetType();
                            if (vt.IsPrimitive)
                            {
                                ILIntepreter.UnboxObject(esp, value, managedObjs, type.AppDomain);
                            }
                            else if (vt.IsEnum)
                            {
                                esp->ObjectType = ObjectTypes.Integer;
                                esp->Value      = value.ToInt32();
                                esp->ValueLow   = 0;
                            }
                            else
                            {
                                esp->ObjectType    = ObjectTypes.Object;
                                esp->Value         = index;
                                managedObjs[index] = value;
                            }
                        }
                        else
                        {
                            *esp = StackObject.Null;
                        }
                    }
                }
                else
                {
                    if (Type.FirstCLRBaseType != null && Type.FirstCLRBaseType is Enviorment.CrossBindingAdaptor)
                    {
                        CLRType clrType = type.AppDomain.GetType(((Enviorment.CrossBindingAdaptor)Type.FirstCLRBaseType).BaseCLRType) as CLRType;
                        clrType.SetFieldValue(index, ref clrInstance, value);
                    }
                    else
                    {
                        throw new TypeLoadException();
                    }
                }
            }
        }