void RegisterTickHandler(IntPtr isolate, IntPtr info, IntPtr self, int paramLen) { try { if (paramLen != 1) { return; } IntPtr fn = IntPtr.Zero; var value1 = PuertsDLL.GetArgumentValue(info, 0); if (PuertsDLL.GetJsValueType(isolate, value1, false) == JsValueType.Function) { fn = PuertsDLL.GetFunctionFromValue(isolate, value1, false); if (fn == IntPtr.Zero) { return; } tickHandler.Add(fn); } } catch (Exception e) { PuertsDLL.ThrowException(isolate, "registerTickHandler throw c# exception:" + e.Message + ",stack:" + e.StackTrace); } }
public object Construct(IntPtr isolate, IntPtr info, int argumentsLen) { if (argumentsLen == 1) { try { var arg0 = PuertsDLL.GetArgumentValue(info, 0); var arg0type = NativeValueApi.GetValueFromArgument.GetJsValueType(isolate, arg0, false); if (arg0type == JsValueType.Function || arg0type == JsValueType.NativeObject) { object obj = translateFunc(isolate, NativeValueApi.GetValueFromArgument, arg0, false); if (obj != null) { return(obj); } } } catch (Exception e) { PuertsDLL.ThrowException(isolate, "c# exception:" + e.Message + ",stack:" + e.StackTrace); return(null); } } PuertsDLL.ThrowException(isolate, "invalid arguments to constructor of " + delegateType.GetFriendlyName()); return(null); }
public ArgumentHelper(int jsEnvIdx, IntPtr isolate, IntPtr info, int index) { this.jsEnvIdx = jsEnvIdx; this.isolate = isolate; value = PuertsDLL.GetArgumentValue(info, index); valueType = PuertsDLL.GetJsValueType(isolate, value, false); obj = null; }
public ArgumentHelper(int jsEnvIdx, IntPtr isolate, IntPtr info, int index) { this.jsEnvIdx = jsEnvIdx; this.isolate = isolate; value = PuertsDLL.GetArgumentValue(info, index); valueType = JsValueType.Invalid; obj = null; csType = null; }
public T[] GetParams <T>(IntPtr info, int start, int end) { T[] result = new T[end - start]; for (int i = start; i < end; i++) { var val = PuertsDLL.GetArgumentValue(info, i); result[i - start] = StaticTranslate <T> .Get(jsEnvIdx, isolate, NativeValueApi.GetValueFromArgument, val, false); } return(result); }
internal void InitArrayTypeId(IntPtr isolate) { arrayTypeId = PuertsDLL.RegisterClass(jsEnv.isolate, GetTypeId(isolate, typeof(Array)), "__puerts.Array", null, null, 0); var lengthFuncId = jsEnv.AddCallback(ArrayLength); PuertsDLL.RegisterProperty(jsEnv.isolate, arrayTypeId, "Length", false, callbackWrap, lengthFuncId, null, 0, true); PuertsDLL.RegisterFunction(jsEnv.isolate, arrayTypeId, "get_Item", false, callbackWrap, jsEnv.AddCallback((IntPtr isolate1, IntPtr info, IntPtr self, int argumentsLen) => { try { Array array = jsEnv.GeneralGetterManager.GetSelf(self) as Array; uint index = (uint)PuertsDLL.GetNumberFromValue(isolate1, PuertsDLL.GetArgumentValue(info, 0), false); if (FastArrayGet(isolate1, info, self, array, index)) { return; } var transalteFunc = jsEnv.GeneralSetterManager.GetTranslateFunc(array.GetType().GetElementType()); transalteFunc(isolate1, NativeValueApi.SetValueToResult, info, array.GetValue((int)index)); } catch (Exception e) { PuertsDLL.ThrowException(isolate1, "array.get throw c# exception:" + e.Message + ",stack:" + e.StackTrace); } })); PuertsDLL.RegisterFunction(jsEnv.isolate, arrayTypeId, "set_Item", false, callbackWrap, jsEnv.AddCallback((IntPtr isolate1, IntPtr info, IntPtr self, int argumentsLen) => { try { Array array = jsEnv.GeneralGetterManager.GetSelf(self) as Array; uint index = (uint)PuertsDLL.GetNumberFromValue(isolate1, PuertsDLL.GetArgumentValue(info, 0), false); var val = PuertsDLL.GetArgumentValue(info, 1); if (FastArraySet(isolate1, info, self, array, index, val)) { return; } var transalteFunc = jsEnv.GeneralGetterManager.GetTranslateFunc(array.GetType().GetElementType()); array.SetValue(transalteFunc(isolate1, NativeValueApi.GetValueFromArgument, val, false), index); } catch (Exception e) { PuertsDLL.ThrowException(isolate1, "array.get throw c# exception:" + e.Message + ",stack:" + e.StackTrace); } })); //暂时兼容,否则生成代码的模版那里用不了 PuertsDLL.RegisterProperty(jsEnv.isolate, arrayTypeId, "length", false, callbackWrap, lengthFuncId, null, 0, true); PuertsDLL.RegisterIndexedProperty(jsEnv.isolate, arrayTypeId, StaticCallbacks.IndexedGetterWrap, StaticCallbacks.IndexedSetterWrap, Utils.TwoIntToLong(jsEnv.Idx, 0)); }
void LoadType(IntPtr isolate, IntPtr info, IntPtr self, int paramLen) { try { Type type = null; var value = PuertsDLL.GetArgumentValue(info, 0); if (PuertsDLL.GetJsValueType(isolate, value, false) == JsValueType.String) { string classFullName = PuertsDLL.GetStringFromValue(isolate, value, false); var maybeType = TypeRegister.GetType(classFullName); if (paramLen == 1) { type = maybeType; } else if (maybeType != null && maybeType.IsGenericTypeDefinition && maybeType.GetGenericArguments().Length == (paramLen - 1)) //泛型 { var genericArguments = new Type[paramLen - 1]; for (int i = 1; i < paramLen; i++) { value = PuertsDLL.GetArgumentValue(info, i); if (PuertsDLL.GetJsValueType(isolate, value, false) != JsValueType.Function) { return; } var argTypeId = PuertsDLL.GetTypeIdFromValue(isolate, value, false); if (argTypeId == -1) { return; } genericArguments[i - 1] = TypeRegister.GetType(argTypeId); } type = maybeType.MakeGenericType(genericArguments); //UnityEngine.Debug.Log(type); } } if (type == null) { return; } int typeId = TypeRegister.GetTypeId(isolate, type); PuertsDLL.ReturnClass(isolate, info, typeId); } catch (Exception e) { PuertsDLL.ThrowException(isolate, "loadClass throw c# exception:" + e.Message + ",stack:" + e.StackTrace); } }
public CallInfo(IntPtr isolate, IntPtr info, IntPtr self, int len) { Isolate = isolate; Info = info; Self = self; Length = len; JsTypes = new JsValueType[Length]; Values = new object[Length]; NativePtrs = new IntPtr[Length]; for (int i = 0; i < Length; i++) { var nativeValuePtr = PuertsDLL.GetArgumentValue(info, i); NativePtrs[i] = nativeValuePtr; var type = PuertsDLL.GetJsValueType(isolate, nativeValuePtr, false); JsTypes[i] = type; } }
Type GetTypeFromJs(IntPtr isolate, IntPtr info, IntPtr self, int paramLen) { Type type = null; var value = PuertsDLL.GetArgumentValue(info, 0); if (PuertsDLL.GetJsValueType(isolate, value, false) == JsValueType.String) { string classFullName = PuertsDLL.GetStringFromValue(isolate, value, false); var maybeType = TypeRegister.GetType(classFullName); if (paramLen == 1) { type = maybeType; } else if (maybeType != null && maybeType.IsGenericTypeDefinition && maybeType.GetGenericArguments().Length == (paramLen - 1)) //泛型 { var genericArguments = new Type[paramLen - 1]; for (int i = 1; i < paramLen; i++) { value = PuertsDLL.GetArgumentValue(info, i); if (PuertsDLL.GetJsValueType(isolate, value, false) != JsValueType.Function) { return(null); } var argTypeId = PuertsDLL.GetTypeIdFromValue(isolate, value, false); if (argTypeId == -1) { return(null); } genericArguments[i - 1] = TypeRegister.GetType(argTypeId); } type = maybeType.MakeGenericType(genericArguments); } } else if (PuertsDLL.GetJsValueType(isolate, value, false) == JsValueType.NativeObject) { type = StaticTranslate <Type> .Get(Index, isolate, NativeValueApi.GetValueFromArgument, value, false); } return(type); }
private FunctionCallback GenFieldSetter(Type type, FieldInfo field) { var translateFunc = jsEnv.GeneralGetterManager.GetTranslateFunc(field.FieldType); var typeMask = GeneralGetterManager.GetJsTypeMask(field.FieldType); if (field.IsStatic) { return((IntPtr isolate, IntPtr info, IntPtr self, int argumentsLen) => { var valuePtr = PuertsDLL.GetArgumentValue(info, 0); var valueType = PuertsDLL.GetJsValueType(isolate, valuePtr, false); if ((typeMask & valueType) != valueType) { PuertsDLL.ThrowException(isolate, "expect " + typeMask + " but got " + valueType); } else { field.SetValue(null, translateFunc(isolate, NativeValueApi.GetValueFromArgument, valuePtr, false)); } }); } else { return((IntPtr isolate, IntPtr info, IntPtr self, int argumentsLen) => { var valuePtr = PuertsDLL.GetArgumentValue(info, 0); var valueType = PuertsDLL.GetJsValueType(isolate, valuePtr, false); if ((typeMask & valueType) != valueType) { PuertsDLL.ThrowException(isolate, "expect " + typeMask + " but got " + valueType); } else { var me = jsEnv.GeneralGetterManager.GetSelf(self); field.SetValue(me, translateFunc(isolate, NativeValueApi.GetValueFromArgument, valuePtr, false)); } }); } }