Exemple #1
0
        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);
 }
Exemple #3
0
 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;
 }
Exemple #4
0
 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;
 }
Exemple #5
0
        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));
        }
Exemple #7
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;
            }
        }
Exemple #9
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);
        }
Exemple #10
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));
                    }
                });
            }
        }