Beispiel #1
0
        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);
        }
Beispiel #2
0
        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));
                    }
                });
            }
        }
Beispiel #3
0
        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;
            }
        }
Beispiel #4
0
 public JsValueType GetJsValueType(IntPtr isolate, IntPtr holder, bool isByRef)
 {
     return(PuertsDLL.GetJsValueType(isolate, holder, isByRef));
 }
Beispiel #5
0
        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);
        }
Beispiel #6
0
        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);
        }