private void BeginValue(bool isString)
        {
            if (!m_Stack.empty())
            {
                StackItem *currItem = m_Stack.back();

                if ((currItem->type == COLLECTION_TYPE_OBJECT) && (currItem->valueCount % 2 == 0))
                {
                    D3D12MA_ASSERT((D3D12MA_DEBUG_LEVEL > 0) && isString);
                }

                if ((currItem->type == COLLECTION_TYPE_OBJECT) && (currItem->valueCount % 2 == 1))
                {
                    m_SB->Add(':');
                    m_SB->Add(' ');
                }
                else if (currItem->valueCount > 0)
                {
                    m_SB->Add(',');
                    m_SB->Add(' ');
                    WriteIndent();
                }
                else
                {
                    WriteIndent();
                }

                ++currItem->valueCount;
            }
        }
Beispiel #2
0
        /// <summary>
        /// 将位于指定数组索引的数组元素的地址作为 & 类型(托管指针)加载到计算堆栈的顶部。
        /// </summary>
        /// <param name="type"></param>
        public void Ldelema(Type type)
        {
            var vs = EvaluationStack_Pop(2);

#if JS
            var ptr   = (vs).Ptr;
            var index = (vs + 1).IntValue;
            var sptr  = new StackItem()
            {
                Ptr       = ptr,
                Index     = index,
                ValueType = StackValueType.Array
            };

            EvaluationStack_Push(sptr);
#else
            var ptr   = (vs)->Ptr;
            var index = (vs + 1)->IntValue;
            var stack = new StackItem()
            {
                Ptr       = ptr,
                Index     = index,
                ValueType = StackValueType.Array
            };

            StackItem *sptr = &stack;
            EvaluationStack_Push(sptr);
#endif
        }
Beispiel #3
0
 public void Push(StackItem *obj)
 {
     *Esp = *obj;
     Esp->VPoint = &Esp->IntValue;
     Esp++;
     EspI++;
 }
        static public void InvokeCustomSlot(IntPtr obj, string slotname, IntPtr stack, IntPtr ret)
        {
            QObject qobj = (QObject)((GCHandle)obj).Target;

#if DEBUG
            if ((QDebug.DebugChannel() & QtDebugChannel.QTDB_TRANSPARENT_PROXY) != 0)
            {
                Console.WriteLine("ENTER InvokeCustomSlot() {0}.{1}",
                                  qobj,
                                  slotname);
            }
#endif

            MethodInfo      slot       = Qyoto.GetSlotMethodInfo(qobj.GetType(), slotname);
            ParameterInfo[] parameters = slot.GetParameters();
            object[]        args       = new object[parameters.Length];

            unsafe {
                StackItem *stackPtr = (StackItem *)stack;
                for (int i = 0; i < args.Length; i++)
                {
                    args[i] = SmokeMarshallers.BoxFromStackItem(parameters[i].ParameterType, 0, stackPtr + i);
                }

                object returnValue = slot.Invoke(qobj, args);

                StackItem *retval = (StackItem *)ret;

                if (slot.ReturnType != typeof(void))
                {
                    SmokeMarshallers.UnboxToStackItem(returnValue, retval);
                }
            }
        }
Beispiel #5
0
        public static unsafe object ToObject(StackItem *stackItem)
        {
            switch (stackItem->ValueType)
            {
            case StackValueType.i4:
                return(stackItem->IntValue);

            case StackValueType.r4:
                return(stackItem->ValueFloat);

            case StackValueType.i8:
                return(stackItem->ValueLong);

            case StackValueType.r8:
                return(stackItem->ValueDouble);

            case StackValueType.Ref:
                if (stackItem->Ptr.IsAllocated)
                {
                    return(GetStackObject(stackItem->Ptr).Object);
                }
                return(null);
            }

            return(null);
        }
Beispiel #6
0
        public StackItem *Pop(int count)
        {
            Esp  -= count;
            EspI -= count;

            return(Esp);
        }
Beispiel #7
0
        public void Reset()
        {
            fixed(StackItem *p = &EvaluationStack[0])
            {
                Esp = p;
            }

            EspI = 0;
        }
        public static unsafe void InvokeDelegate(Delegate d, IntPtr stack)
        {
            MethodInfo mi = d.Method;

            ParameterInfo[] parameters = mi.GetParameters();
            object[]        args       = new object[parameters.Length];
            StackItem *     stackPtr   = (StackItem *)stack;

            for (int i = 0; i < args.Length; i++)
            {
                args[i] = SmokeMarshallers.BoxFromStackItem(parameters[i].ParameterType, 0, stackPtr + i);
            }
            d.DynamicInvoke(args);
        }
Beispiel #9
0
        public Clr(int localCount = 5, int argCount = 5, bool haseResult = true, int maxStack = 5)
        {
#if JS
            _Stack = new BaseClrStack(maxStack);
#else
            Stack = new ClrStack(maxStack);
#endif
            RetResult     = haseResult;
            LocalVarCount = localCount;
            ArgsVarCount  = argCount;

#if JS
            CallStackClr = new BaseClrStack(localCount + argCount);
            CallStack    = CallStackClr.EvaluationStack;
#else
            CallStack = new StackItem[localCount + argCount];
#endif

            if (CallStack.Length <= 0)
            {
                return;
            }
#if JS
            _Csp  = 0;
            _Argp = Csp + localCount;
#else
            fixed(StackItem *csp = &CallStack[0])
            {
                Csp  = csp;
                Argp = csp + localCount;
            }

            for (int i = 0; i < CallStack.Length; i++)
            {
                CallStack[i].Index = i;
                CallStack[i].Fix();
                //fixed (int* x = &CallStack[i].IntValue)
                //{
                //    CallStack[i].VPoint = x;
                //}
            }
#endif
        }
Beispiel #10
0
        public ClrStack(int maxStack = 5)
        {
            //maxStack++;
            EvaluationStack = new StackItem[maxStack];

            fixed(StackItem *esp = &EvaluationStack[0])
            {
                Esp     = esp;
                EspZero = esp;
            }

            for (int i = 0; i < EvaluationStack.Length; i++)
            {
                EvaluationStack[i].Index = i;
                fixed(int *x = &EvaluationStack[i].IntValue)
                {
                    EvaluationStack[i].VPoint = x;
                }
            }
        }
Beispiel #11
0
        public ClrStack(int maxStack = 5)
        {
            //maxStack++;
            EvaluationStack = new StackItem[maxStack];

            fixed(StackItem *esp = &EvaluationStack[0])
            {
                Esp = esp;
            }

            for (int i = 0; i < EvaluationStack.Length; i++)
            {
                EvaluationStack[i].Index = i;
                EvaluationStack[i].Fix();
                //fixed (int* x = &EvaluationStack[i].IntValue)
                //{
                //    EvaluationStack[i].VPoint = x;
                //}
            }
            //钉住地址,防止被GC修改变量位置,防止Esp找不到指定的位置
            //TODO 释放
            GCHanlde = GCHandle.Alloc(EvaluationStack, GCHandleType.Pinned);
        }
Beispiel #12
0
        public static void InvokeMethod(IntPtr instanceHandle, IntPtr methodHandle, IntPtr stack, IntPtr typeIDs)
        {
            object     instance = ((GCHandle)instanceHandle).Target;
            MethodInfo method   = (MethodInfo)((GCHandle)methodHandle).Target;

#if DEBUG
            if ((QDebug.DebugChannel() & QtDebugChannel.QTDB_TRANSPARENT_PROXY) != 0 &&
                (QDebug.DebugChannel() & QtDebugChannel.QTDB_VIRTUAL) != 0)
            {
                Console.WriteLine("ENTER InvokeMethod() {0}.{1}",
                                  instance,
                                  method.Name);
            }
#endif
            unsafe {
                StackItem *     stackPtr   = (StackItem *)stack;
                ParameterInfo[] parameters = method.GetParameters();
                object[]        args       = new object[parameters.Length];
                TypeId *        typeIDsPtr = (TypeId *)typeIDs;

                for (int i = 0; i < args.Length; i++)
                {
                    args[i] = SmokeMarshallers.BoxFromStackItem(parameters[i].ParameterType, (int)typeIDsPtr[i + 1], stackPtr + i + 1);
                }
                object returnValue = method.Invoke(instance, args);
                *      typeIDsPtr  = SmokeMarshallers.GetTypeId(returnValue == null ? typeof(object) : returnValue.GetType());

                //TODO: should this always be unboxing something?
                if (method.ReturnType != typeof(void))
                {
                    SmokeMarshallers.UnboxToStackItem(returnValue, stackPtr);
                }
            }

            return;
        }
Beispiel #13
0
        public static void InvokeMethod(IntPtr instanceHandle, IntPtr methodHandle, IntPtr stack)
        {
            object     instance = ((GCHandle)instanceHandle).Target;
            MethodInfo method   = (MethodInfo)((GCHandle)methodHandle).Target;

#if DEBUG
            if ((QDebug.DebugChannel() & QtDebugChannel.QTDB_TRANSPARENT_PROXY) != 0 &&
                (QDebug.DebugChannel() & QtDebugChannel.QTDB_VIRTUAL) != 0)
            {
                Console.WriteLine("ENTER InvokeMethod() {0}.{1}",
                                  instance,
                                  method.Name);
            }
#endif

            unsafe {
                StackItem *     stackPtr   = (StackItem *)stack;
                ParameterInfo[] parameters = method.GetParameters();
                object[]        args       = new object[parameters.Length];

                for (int i = 0; i < args.Length; i++)
                {
                    if (parameters[i].ParameterType == typeof(bool))
                    {
                        args[i] = stackPtr[i + 1].s_bool;
                    }
                    else if (parameters[i].ParameterType == typeof(sbyte))
                    {
                        args[i] = stackPtr[i + 1].s_char;
                    }
                    else if (parameters[i].ParameterType == typeof(byte))
                    {
                        args[i] = stackPtr[i + 1].s_uchar;
                    }
                    else if (parameters[i].ParameterType == typeof(char))
                    {
                        args[i] = (char)stackPtr[i + 1].s_uchar;
                    }
                    else if (parameters[i].ParameterType == typeof(short))
                    {
                        args[i] = stackPtr[i + 1].s_short;
                    }
                    else if (parameters[i].ParameterType == typeof(ushort))
                    {
                        args[i] = stackPtr[i + 1].s_ushort;
                    }
                    else if (parameters[i].ParameterType == typeof(int))
                    {
                        args[i] = stackPtr[i + 1].s_int;
                    }
                    else if (parameters[i].ParameterType.IsEnum)
                    {
                        args[i] = Enum.ToObject(parameters[i].ParameterType, stackPtr[i + 1].s_int);
                    }
                    else if (parameters[i].ParameterType == typeof(uint))
                    {
                        args[i] = stackPtr[i + 1].s_uint;
                    }
                    else if (parameters[i].ParameterType == typeof(long))
                    {
                        // s_long will contain the wrong value on 32 bit platforms
                        // (i.e. where a native C++ 'long' isn't at least 64 bit)
                        args[i] = (SmokeMarshallers.SizeOfNativeLong < sizeof(long))? stackPtr[i + 1].s_int : stackPtr[i + 1].s_long;
                    }
                    else if (parameters[i].ParameterType == typeof(ulong))
                    {
                        args[i] = (SmokeMarshallers.SizeOfNativeLong < sizeof(long))? stackPtr[i + 1].s_uint : stackPtr[i + 1].s_ulong;
                    }
                    else if (parameters[i].ParameterType == typeof(float))
                    {
                        args[i] = stackPtr[i + 1].s_float;
                    }
                    else if (parameters[i].ParameterType == typeof(double))
                    {
                        args[i] = stackPtr[i + 1].s_double;
                    }
                    else if (parameters[i].ParameterType == typeof(string))
                    {
                        if (stackPtr[i + 1].s_class != IntPtr.Zero)
                        {
                            args[i] = (string)((GCHandle)stackPtr[i + 1].s_class).Target;
#if DEBUG
                            DebugGCHandle.Free((GCHandle)stackPtr[i + 1].s_class);
#else
                            ((GCHandle)stackPtr[i + 1].s_class).SynchronizedFree();
#endif
                        }
                    }
                    else
                    {
                        if (stackPtr[i + 1].s_class != IntPtr.Zero)
                        {
                            args[i] = ((GCHandle)stackPtr[i + 1].s_class).Target;
#if DEBUG
                            DebugGCHandle.Free((GCHandle)stackPtr[i + 1].s_class);
#else
                            ((GCHandle)stackPtr[i + 1].s_class).SynchronizedFree();
#endif
                        }
                    }
                }

                object returnValue = method.Invoke(instance, args);
                Type   returnType  = method.ReturnType;

                if (returnType == typeof(void))
                {
                    ;
                }
                else if (returnType == typeof(bool))
                {
                    stackPtr[0].s_bool = (bool)returnValue;
                }
                else if (returnType == typeof(sbyte))
                {
                    stackPtr[0].s_char = (sbyte)returnValue;
                }
                else if (returnType == typeof(byte))
                {
                    stackPtr[0].s_uchar = (byte)returnValue;
                }
                else if (returnType == typeof(char))
                {
                    stackPtr[0].s_uchar = (byte)(char)returnValue;
                }
                else if (returnType == typeof(short))
                {
                    stackPtr[0].s_short = (short)returnValue;
                }
                else if (returnType == typeof(ushort))
                {
                    stackPtr[0].s_ushort = (ushort)returnValue;
                }
                else if (returnType == typeof(int) || returnType.IsEnum)
                {
                    stackPtr[0].s_int = (int)returnValue;
                }
                else if (returnType == typeof(uint))
                {
                    stackPtr[0].s_uint = (uint)returnValue;
                }
                else if (returnType == typeof(long))
                {
                    stackPtr[0].s_long = (long)returnValue;
                }
                else if (returnType == typeof(ulong))
                {
                    stackPtr[0].s_ulong = (ulong)returnValue;
                }
                else if (returnType == typeof(float))
                {
                    stackPtr[0].s_float = (float)returnValue;
                }
                else if (returnType == typeof(double))
                {
                    stackPtr[0].s_double = (double)returnValue;
                }
                else if (returnType == typeof(string))
                {
#if DEBUG
                    stackPtr[0].s_class = (IntPtr)DebugGCHandle.Alloc(returnValue);
#else
                    stackPtr[0].s_class = (IntPtr)GCHandle.Alloc(returnValue);
#endif
                }
                else if (returnValue == null)
                {
                    stackPtr[0].s_class = IntPtr.Zero;
                }
                else
                {
#if DEBUG
                    stackPtr[0].s_class = (IntPtr)DebugGCHandle.Alloc(returnValue);
#else
                    stackPtr[0].s_class = (IntPtr)GCHandle.Alloc(returnValue);
#endif
                }
            }

            return;
        }
Beispiel #14
0
 public void Reset()
 {
     Esp  = EspZero;
     EspI = 0;
 }
Beispiel #15
0
        static public void InvokeCustomSlot(IntPtr obj, string slotname, IntPtr stack, IntPtr ret)
        {
            QObject qobj = (QObject)((GCHandle)obj).Target;

#if DEBUG
            if ((QDebug.DebugChannel() & QtDebugChannel.QTDB_TRANSPARENT_PROXY) != 0)
            {
                Console.WriteLine("ENTER InvokeCustomSlot() {0}.{1}",
                                  qobj,
                                  slotname);
            }
#endif

            MethodInfo      slot       = Qyoto.GetSlotMethodInfo(qobj.GetType(), slotname);
            ParameterInfo[] parameters = slot.GetParameters();
            object[]        args       = new object[parameters.Length];

            unsafe {
                StackItem *stackPtr = (StackItem *)stack;
                for (int i = 0; i < args.Length; i++)
                {
                    if (parameters[i].ParameterType == typeof(bool))
                    {
                        args[i] = stackPtr[i].s_bool;
                    }
                    else if (parameters[i].ParameterType == typeof(sbyte))
                    {
                        args[i] = stackPtr[i].s_char;
                    }
                    else if (parameters[i].ParameterType == typeof(byte))
                    {
                        args[i] = stackPtr[i].s_uchar;
                    }
                    else if (parameters[i].ParameterType == typeof(char))
                    {
                        args[i] = (char)stackPtr[i].s_uchar;
                    }
                    else if (parameters[i].ParameterType == typeof(short))
                    {
                        args[i] = stackPtr[i].s_short;
                    }
                    else if (parameters[i].ParameterType == typeof(ushort))
                    {
                        args[i] = stackPtr[i].s_ushort;
                    }
                    else if (parameters[i].ParameterType == typeof(int) ||
                             parameters[i].ParameterType.IsEnum)
                    {
                        args[i] = stackPtr[i].s_int;
                    }
                    else if (parameters[i].ParameterType == typeof(uint))
                    {
                        args[i] = stackPtr[i].s_uint;
                    }
                    else if (parameters[i].ParameterType == typeof(long))
                    {
                        // s_long will contain the wrong value on 32 bit platforms
                        // (i.e. where a native C++ 'long' isn't at least 64 bit)
                        args[i] = (SmokeMarshallers.SizeOfNativeLong < sizeof(long))? stackPtr[i + 1].s_int : stackPtr[i + 1].s_long;
                    }
                    else if (parameters[i].ParameterType == typeof(ulong))
                    {
                        args[i] = (SmokeMarshallers.SizeOfNativeLong < sizeof(long))? stackPtr[i + 1].s_uint : stackPtr[i + 1].s_ulong;
                    }
                    else if (parameters[i].ParameterType == typeof(float))
                    {
                        args[i] = stackPtr[i].s_float;
                    }
                    else if (parameters[i].ParameterType == typeof(double))
                    {
                        args[i] = stackPtr[i].s_double;
                    }
                    else if (parameters[i].ParameterType == typeof(string))
                    {
                        if (stackPtr[i].s_class != IntPtr.Zero)
                        {
                            args[i] = (string)((GCHandle)stackPtr[i].s_class).Target;
#if DEBUG
                            DebugGCHandle.Free((GCHandle)stackPtr[i].s_class);
#else
                            ((GCHandle)stackPtr[i].s_class).SynchronizedFree();
#endif
                        }
                    }
                    else
                    {
                        if (stackPtr[i].s_class != IntPtr.Zero)
                        {
                            args[i] = ((GCHandle)stackPtr[i].s_class).Target;
#if DEBUG
                            DebugGCHandle.Free((GCHandle)stackPtr[i].s_class);
#else
                            ((GCHandle)stackPtr[i].s_class).SynchronizedFree();
#endif
                        }
                    }
                }
            }

            object returnValue = slot.Invoke(qobj, args);
            Type   returnType  = slot.ReturnType;

            unsafe {
                StackItem *retval = (StackItem *)ret;
                if (returnType == typeof(void))
                {
                    ;
                }
                else if (returnType == typeof(bool))
                {
                    retval[0].s_bool = (bool)returnValue;
                }
                else if (returnType == typeof(sbyte))
                {
                    retval[0].s_char = (sbyte)returnValue;
                }
                else if (returnType == typeof(byte))
                {
                    retval[0].s_uchar = (byte)returnValue;
                }
                else if (returnType == typeof(short))
                {
                    retval[0].s_short = (short)returnValue;
                }
                else if (returnType == typeof(ushort))
                {
                    retval[0].s_ushort = (ushort)returnValue;
                }
                else if (returnType == typeof(int) || returnType.IsEnum)
                {
                    retval[0].s_int = (int)returnValue;
                }
                else if (returnType == typeof(uint))
                {
                    retval[0].s_uint = (uint)returnValue;
                }
                else if (returnType == typeof(long))
                {
                    retval[0].s_long = (long)returnValue;
                }
                else if (returnType == typeof(ulong))
                {
                    retval[0].s_ulong = (ulong)returnValue;
                }
                else if (returnType == typeof(float))
                {
                    retval[0].s_float = (float)returnValue;
                }
                else if (returnType == typeof(double))
                {
                    retval[0].s_double = (double)returnValue;
                }
                else if (returnType == typeof(string))
                {
#if DEBUG
                    retval[0].s_class = (IntPtr)DebugGCHandle.Alloc(returnValue);
#else
                    retval[0].s_class = (IntPtr)GCHandle.Alloc(returnValue);
#endif
                }
                else if (returnValue == null)
                {
                    retval[0].s_class = IntPtr.Zero;
                }
                else
                {
#if DEBUG
                    retval[0].s_class = (IntPtr)DebugGCHandle.Alloc(returnValue);
#else
                    retval[0].s_class = (IntPtr)GCHandle.Alloc(returnValue);
#endif
                }
            }
        }
Beispiel #16
0
        static public void InvokeDelegate(Delegate d, IntPtr stack)
        {
            unsafe {
                MethodInfo      mi         = d.Method;
                ParameterInfo[] parameters = mi.GetParameters();
                object[]        args       = new object[parameters.Length];
                StackItem *     stackPtr   = (StackItem *)stack;
                for (int i = 0; i < args.Length; i++)
                {
                    if (parameters[i].ParameterType == typeof(bool))
                    {
                        args[i] = stackPtr[i].s_bool;
                    }
                    else if (parameters[i].ParameterType == typeof(sbyte))
                    {
                        args[i] = stackPtr[i].s_char;
                    }
                    else if (parameters[i].ParameterType == typeof(byte))
                    {
                        args[i] = stackPtr[i].s_uchar;
                    }
                    else if (parameters[i].ParameterType == typeof(char))
                    {
                        args[i] = (char)stackPtr[i].s_uchar;
                    }
                    else if (parameters[i].ParameterType == typeof(short))
                    {
                        args[i] = stackPtr[i].s_short;
                    }
                    else if (parameters[i].ParameterType == typeof(ushort))
                    {
                        args[i] = stackPtr[i].s_ushort;
                    }
                    else if (parameters[i].ParameterType == typeof(int) ||
                             parameters[i].ParameterType.IsEnum)
                    {
                        args[i] = stackPtr[i].s_int;
                    }
                    else if (parameters[i].ParameterType == typeof(uint))
                    {
                        args[i] = stackPtr[i].s_uint;
                    }
                    else if (parameters[i].ParameterType == typeof(long))
                    {
                        // s_long will contain the wrong value on 32 bit platforms
                        // (i.e. where a native C++ 'long' isn't at least 64 bit)
                        args[i] = (SmokeMarshallers.SizeOfNativeLong < sizeof(long))? stackPtr[i + 1].s_int : stackPtr[i + 1].s_long;
                    }
                    else if (parameters[i].ParameterType == typeof(ulong))
                    {
                        args[i] = (SmokeMarshallers.SizeOfNativeLong < sizeof(long))? stackPtr[i + 1].s_uint : stackPtr[i + 1].s_ulong;
                    }
                    else if (parameters[i].ParameterType == typeof(float))
                    {
                        args[i] = stackPtr[i].s_float;
                    }
                    else if (parameters[i].ParameterType == typeof(double))
                    {
                        args[i] = stackPtr[i].s_double;
                    }
                    else
                    {
                        if (stackPtr[i].s_class != IntPtr.Zero)
                        {
                            args[i] = ((GCHandle)stackPtr[i].s_class).Target;
#if DEBUG
                            DebugGCHandle.Free((GCHandle)stackPtr[i].s_class);
#else
                            ((GCHandle)stackPtr[i].s_class).SynchronizedFree();
#endif
                        }
                    }
                }
                d.DynamicInvoke(args);
            }
        }
Beispiel #17
0
 public void EvaluationStack_Push(StackItem *obj)
 {
     Stack.Push(obj);
 }