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; } }
/// <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 }
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); } } }
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); }
public StackItem *Pop(int count) { Esp -= count; EspI -= count; return(Esp); }
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); }
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 }
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; } } }
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); }
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; }
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; }
public void Reset() { Esp = EspZero; EspI = 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 } } }
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); } }
public void EvaluationStack_Push(StackItem *obj) { Stack.Push(obj); }