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)); } }); } }
public void Init(IntPtr isolate, IntPtr info, IntPtr self, int len) { Isolate = isolate; Info = info; Self = self; Length = len; if (JsTypes == null || JsTypes.Length < Length) { 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; Values[i] = null; } }
public JsValueType GetJsValueType(IntPtr isolate, IntPtr holder, bool isByRef) { return(PuertsDLL.GetJsValueType(isolate, holder, isByRef)); }
public bool IsMatch(CallInfo callInfo) { if (hasParamArray && beginOptional > length) { if (callInfo.Length < length - 1) { return(false); } } else if (callInfo.Length > length) { return(false); } else if (callInfo.Length < beginOptional - 1) { return(false); } for (int i = 0; i < callInfo.Length; i++) { if (i < length) { var argJsType = callInfo.JsTypes[i]; if (byRef[i]) { if (argJsType != JsValueType.JsObject) { return(false); } if (isOut[i]) { continue; } else { argJsType = PuertsDLL.GetJsValueType(callInfo.Isolate, callInfo.NativePtrs[i], true); } } if (argJsType == JsValueType.NativeObject && types[i] == typeof(JSObject)) { // 非要把一个NativeObject赋值给JSObject是允许的。 continue; } if ((typeMasks[i] & argJsType) != argJsType) { //UnityEngine.Debug.Log("arg " + i + " not match, expected " + typeMasks[i] + ", but got " + argJsType); return(false); } if (argJsType == JsValueType.NativeObject) { if (callInfo.Values[i] == null) { callInfo.Values[i] = generalGetterManager.AnyTranslator(callInfo.Isolate, NativeValueApi.GetValueFromArgument, callInfo.NativePtrs[i], byRef[i]); } if (!types[i].IsAssignableFrom(callInfo.Values[i].GetType())) { return(false); } } } } return(true); }
bool FastArraySet(IntPtr isolate, IntPtr info, IntPtr self, object obj, uint index, IntPtr value) { bool hited = true; var jsType = PuertsDLL.GetJsValueType(isolate, value, false); var type = obj.GetType(); if (type == typeof(int[]) && jsType == JsValueType.Number) { int[] array = obj as int[]; array[index] = (int)PuertsDLL.GetNumberFromValue(isolate, value, false); } else if (type == typeof(float[]) && jsType == JsValueType.Number) { float[] array = obj as float[]; array[index] = (float)PuertsDLL.GetNumberFromValue(isolate, value, false); } else if (type == typeof(double[]) && jsType == JsValueType.Number) { double[] array = obj as double[]; array[index] = PuertsDLL.GetNumberFromValue(isolate, value, false); } else if (type == typeof(bool[]) && jsType == JsValueType.Boolean) { bool[] array = obj as bool[]; array[index] = PuertsDLL.GetBooleanFromValue(isolate, value, false); } else if (type == typeof(long[]) && jsType == JsValueType.BigInt) { long[] array = obj as long[]; array[index] = PuertsDLL.GetBigIntFromValueChecked(isolate, value, false); } else if (type == typeof(ulong[]) && jsType == JsValueType.BigInt) { ulong[] array = obj as ulong[]; array[index] = (ulong)PuertsDLL.GetBigIntFromValueChecked(isolate, value, false); } else if (type == typeof(sbyte[]) && jsType == JsValueType.Number) { sbyte[] array = obj as sbyte[]; array[index] = (sbyte)PuertsDLL.GetNumberFromValue(isolate, value, false); } else if (type == typeof(short[]) && jsType == JsValueType.Number) { short[] array = obj as short[]; array[index] = (short)PuertsDLL.GetNumberFromValue(isolate, value, false); } else if (type == typeof(ushort[]) && jsType == JsValueType.Number) { ushort[] array = obj as ushort[]; array[index] = (ushort)PuertsDLL.GetNumberFromValue(isolate, value, false); } else if (type == typeof(char[]) && jsType == JsValueType.Number) { char[] array = obj as char[]; array[index] = (char)PuertsDLL.GetNumberFromValue(isolate, value, false); } else if (type == typeof(uint[]) && jsType == JsValueType.Number) { uint[] array = obj as uint[]; array[index] = (uint)PuertsDLL.GetNumberFromValue(isolate, value, false); } else if (type == typeof(string[]) && jsType == JsValueType.String) { string[] array = obj as string[]; array[index] = PuertsDLL.GetStringFromValue(isolate, value, false); } else if (type == typeof(string[]) && jsType == JsValueType.NullOrUndefined) { string[] array = obj as string[]; array[index] = null; } else { hited = false; } return(hited); }