コード例 #1
0
        public static bool duk_get_delegate <T>(IntPtr ctx, int idx, out T o)
            where T : class
        {
            if (DuktapeDLL.duk_is_object(ctx, idx) ||/* && check if js delegate type (hidden property) */
                DuktapeDLL.duk_is_function(ctx, idx))
            {
                DuktapeDLL.duk_get_prop_string(ctx, idx, DuktapeVM.OBJ_PROP_NATIVE_WEAK);
                var refid = DuktapeDLL.duk_get_int(ctx, -1);
                DuktapeDLL.duk_pop(ctx);

                var             cache = DuktapeVM.GetObjectCache(ctx);
                DuktapeDelegate fn;
                if (cache.TryGetTypedWeakObject(refid, out fn) && fn != null)
                {
                    o = fn.target as T;
                    return(true);
                }
                // 默认赋值操作
                DuktapeDLL.duk_dup(ctx, idx);
                var heapptr = DuktapeDLL.duk_get_heapptr(ctx, idx);
                fn = new DuktapeDelegate(ctx, DuktapeDLL.duk_unity_ref(ctx));
                var vm = DuktapeVM.GetVM(ctx);
                o = vm.CreateDelegate(typeof(T), fn) as T;

                // DuktapeDelegate 拥有 js 对象的强引用, 此 js 对象无法释放 cache 中的 object, 所以这里用弱引用注册
                // 会出现的问题是, 如果 c# 没有对 DuktapeDelegate 的强引用, 那么反复 get_delegate 会重复创建 DuktapeDelegate
                refid = cache.AddWeakObject(fn);
                DuktapeDLL.duk_unity_set_prop_i(ctx, idx, DuktapeVM.OBJ_PROP_NATIVE_WEAK, refid);
                cache.AddJSValue(o, heapptr);
                return(true);
            }
            o = null;
            return(false);
        }
コード例 #2
0
 public static bool duk_get_type(IntPtr ctx, int idx, out Type o)
 {
     if (DuktapeDLL.duk_is_string(ctx, idx))
     {
         var name = DuktapeDLL.duk_get_string(ctx, idx);
         o = DuktapeAux.GetType(name);
         return(o != null);
     }
     else
     {
         //TODO: 增加一个隐藏属性记录jsobject对应类型 (constructor, object)
         if (DuktapeDLL.duk_get_prop_string(ctx, idx, DuktapeVM.OBJ_PROP_EXPORTED_REFID))
         {
             var vm    = DuktapeVM.GetVM(ctx);
             var refid = DuktapeDLL.duk_get_uint(ctx, -1);
             DuktapeDLL.duk_pop(ctx);
             o = vm.GetExportedType(refid);
             // Debug.Log($"get type from exported registry {o}:{refid}");
             return(o != null);
         }
         else if (DuktapeDLL.duk_get_prop_string(ctx, idx, DuktapeVM.OBJ_PROP_NATIVE))
         {
             var cache = DuktapeVM.GetObjectCache(ctx);
             var refid = DuktapeDLL.duk_get_int(ctx, -1);
             DuktapeDLL.duk_pop(ctx);
             cache.TryGetTypedObject(refid, out o);
             // Debug.Log($"get type from objectcache registry {o}:{refid}");
             return(o != null);
         }
     }
     o = null;
     return(false);
 }
コード例 #3
0
 public static bool duk_get_primitive_array(IntPtr ctx, int idx, out byte[] o)
 {
     if (DuktapeDLL.duk_is_array(ctx, idx))
     {
         var length = DuktapeDLL.duk_unity_get_length(ctx, idx);
         var nidx   = DuktapeDLL.duk_normalize_index(ctx, idx);
         o = new byte[length];
         for (var i = 0U; i < length; i++)
         {
             DuktapeDLL.duk_get_prop_index(ctx, idx, i);
             byte e;
             e    = (byte)DuktapeDLL.duk_get_int(ctx, -1); // duk_get_primitive(ctx, -1, out e);
             o[i] = e;
             DuktapeDLL.duk_pop(ctx);
         }
         return(true);
     }
     if (DuktapeDLL.duk_is_buffer_data(ctx, idx))
     {
         uint length;
         var  pointer = DuktapeDLL.duk_unity_get_buffer_data(ctx, idx, out length);
         o = new byte[length];
         Marshal.Copy(pointer, o, 0, (int)length);
         return(true);
     }
     duk_get_classvalue <byte[]>(ctx, idx, out o);
     return(true);
 }
コード例 #4
0
 protected static int object_dtor(IntPtr ctx)
 {
     if (DuktapeDLL.duk_get_prop_string(ctx, 0, DuktapeVM.OBJ_PROP_NATIVE))
     {
         var id = DuktapeDLL.duk_get_int(ctx, -1);
         DuktapeVM.GetObjectCache(ctx)?.RemoveObject(id);
     }
     DuktapeDLL.duk_pop(ctx); // pop native
     return(0);
 }
コード例 #5
0
 public static int ClearTimer(IntPtr ctx)
 {
     if (DuktapeDLL.duk_is_number(ctx, 0))
     {
         var id = DuktapeDLL.duk_get_int(ctx, 0);
         DuktapeDLL.duk_push_boolean(ctx, DuktapeRunner.Clear(id));
         return(1);
     }
     return(0);
 }
コード例 #6
0
        // public static bool duk_rebind_this(IntPtr ctx, Matrix4x4 o)
        // {
        //     DuktapeDLL.duk_push_this(ctx);
        //     DuktapeDLL.duk_unity_put16f(ctx, -1, ...);
        //     DuktapeDLL.duk_pop(ctx);
        //     return true;
        // }

        public static bool duk_get_native_refid(IntPtr ctx, int idx, out int id)
        {
            if (!DuktapeDLL.duk_is_null_or_undefined(ctx, idx))
            {
                if (DuktapeDLL.duk_unity_get_refid(ctx, idx, out id))
                {
                    id = DuktapeDLL.duk_get_int(ctx, -1);
                    return(true);
                }
            }
            id = 0;
            return(false);
        }
コード例 #7
0
        public static int SetTimeout(IntPtr ctx)
        {
            DuktapeFunction fn;
            var             idx = _GetTimerFunction(ctx, out fn);

            if (idx < 0)
            {
                var id = DuktapeRunner.SetTimeout(fn, DuktapeDLL.duk_get_int(ctx, 1));
                DuktapeDLL.duk_push_uint(ctx, id);
                return(1);
            }
            return(DuktapeDLL.duk_generic_error(ctx, "invalid arg " + idx));
        }
コード例 #8
0
        // public static bool duk_rebind_this(IntPtr ctx, Matrix4x4 o)
        // {
        //     DuktapeDLL.duk_push_this(ctx);
        //     DuktapeDLL.duk_unity_put16f(ctx, -1, ...);
        //     DuktapeDLL.duk_pop(ctx);
        //     return true;
        // }

        public static bool duk_get_native_refid(IntPtr ctx, int idx, out int id)
        {
            if (!DuktapeDLL.duk_is_null_or_undefined(ctx, idx))
            {
                if (DuktapeDLL.duk_get_prop_string(ctx, idx, DuktapeVM.OBJ_PROP_NATIVE))
                {
                    id = DuktapeDLL.duk_get_int(ctx, -1);
                    return(true);
                }
                DuktapeDLL.duk_pop(ctx); // pop OBJ_PROP_NATIVE
            }
            id = 0;
            return(false);
        }
コード例 #9
0
 public static bool duk_get_cached_object(IntPtr ctx, int idx, out object o)
 {
     if (DuktapeDLL.duk_get_prop_string(ctx, idx, DuktapeVM.OBJ_PROP_NATIVE))
     {
         var id = DuktapeDLL.duk_get_int(ctx, -1);
         DuktapeDLL.duk_pop(ctx);
         return(DuktapeVM.GetObjectCache(ctx).TryGetObject(id, out o));
     }
     else
     {
         DuktapeDLL.duk_pop(ctx);
     }
     o = null;
     return(false);
 }
コード例 #10
0
ファイル: DuktapeArray.cs プロジェクト: shunfy/duktape-unity
        //
        public int GetIntValue(int index)
        {
            var ctx = _context.rawValue;

            this.Push(ctx);
            DuktapeDLL.duk_get_prop_index(ctx, -1, (uint)index);
            var res = 0;

            if (DuktapeDLL.duk_is_number(ctx, -1))
            {
                res = DuktapeDLL.duk_get_int(ctx, -1);
            }
            DuktapeDLL.duk_pop_2(ctx);
            return(res);
        }
コード例 #11
0
        protected static void duk_add_event(IntPtr ctx, string name, DuktapeDLL.duk_c_function add_op, DuktapeDLL.duk_c_function remove_op, int idx)
        {
            idx = DuktapeDLL.duk_normalize_index(ctx, idx);

            DuktapeDLL.duk_get_prop_string(ctx, idx, DuktapeVM.OBJ_PROP_NATIVE); // 直接在 event object 上复制主对象的引用id
            var refid = DuktapeDLL.duk_get_int(ctx, -1);

            DuktapeDLL.duk_pop(ctx);

            DuktapeDLL.duk_push_object(ctx);
            DuktapeDLL.duk_unity_set_prop_i(ctx, -1, DuktapeVM.OBJ_PROP_NATIVE, refid);
            DuktapeDLL.duk_push_c_function(ctx, add_op, 1);
            DuktapeDLL.duk_put_prop_string(ctx, -2, "on");
            DuktapeDLL.duk_push_c_function(ctx, remove_op, 1);
            DuktapeDLL.duk_put_prop_string(ctx, -2, "off");
            DuktapeDLL.duk_put_prop_string(ctx, idx, name);
        }
コード例 #12
0
 public static bool duk_rebind_native(IntPtr ctx, int idx, object o)
 {
     if (DuktapeDLL.duk_is_null_or_undefined(ctx, idx)) // or check for object?
     {
         return(true);
     }
     if (DuktapeDLL.duk_get_prop_string(ctx, idx, DuktapeVM.OBJ_PROP_NATIVE))
     {
         var id = DuktapeDLL.duk_get_int(ctx, -1);
         DuktapeDLL.duk_pop(ctx); // pop OBJ_PROP_NATIVE
         return(DuktapeVM.GetObjectCache(ctx).ReplaceObject(id, o));
     }
     else
     {
         DuktapeDLL.duk_pop(ctx);
     }
     return(false);
 }
コード例 #13
0
 public static bool duk_get_primitive_array(IntPtr ctx, int idx, out sbyte[] o)
 {
     if (DuktapeDLL.duk_is_array(ctx, idx))
     {
         var length = DuktapeDLL.duk_unity_get_length(ctx, idx);
         var nidx   = DuktapeDLL.duk_normalize_index(ctx, idx);
         o = new sbyte[length];
         for (var i = 0U; i < length; i++)
         {
             DuktapeDLL.duk_get_prop_index(ctx, idx, i);
             sbyte e;
             e    = (sbyte)DuktapeDLL.duk_get_int(ctx, -1); // duk_get_primitive(ctx, -1, out e);
             o[i] = e;
             DuktapeDLL.duk_pop(ctx);
         }
         return(true);
     }
     duk_get_classvalue <sbyte[]>(ctx, idx, out o);
     return(true);
 }
コード例 #14
0
        protected static void duk_add_event_instanced(IntPtr ctx, string name, DuktapeDLL.duk_c_function add_op, DuktapeDLL.duk_c_function remove_op, int idx)
        {
            idx = DuktapeDLL.duk_normalize_index(ctx, idx);

            DuktapeDLL.duk_get_prop_string(ctx, idx, DuktapeVM.OBJ_PROP_NATIVE); // 直接在 event object 上复制主对象的引用id
            var refid = DuktapeDLL.duk_get_int(ctx, -1);

            DuktapeDLL.duk_pop(ctx);

            DuktapeDLL.duk_push_object(ctx);       // [evtobj]
            DuktapeDLL.duk_unity_set_prop_i(ctx, -1, DuktapeVM.OBJ_PROP_NATIVE, refid);
            DuktapeDLL.duk_push_string(ctx, name); // [evtobj, name]
            DuktapeDLL.duk_dup(ctx, -2);           // [evtobj, name, evtobj]
            DuktapeDLL.duk_push_c_function(ctx, add_op, 1);
            DuktapeDLL.duk_put_prop_string(ctx, -2, "on");
            DuktapeDLL.duk_push_c_function(ctx, remove_op, 1);
            DuktapeDLL.duk_put_prop_string(ctx, -2, "off");
            // [evtobj, name, evtobj]
            DuktapeDLL.duk_def_prop(ctx, idx, DuktapeDLL.DUK_DEFPROP_HAVE_VALUE
                                    | DuktapeDLL.DUK_DEFPROP_SET_ENUMERABLE
                                    | DuktapeDLL.DUK_DEFPROP_CLEAR_CONFIGURABLE);
            // [evtobj]
        }
コード例 #15
0
 public static bool duk_get_primitive(IntPtr ctx, int idx, out byte o)
 {
     o = (byte)DuktapeDLL.duk_get_int(ctx, idx); // no check
     return(true);
 }
コード例 #16
0
 public static bool duk_get_structvalue(IntPtr ctx, int idx, out LayerMask o)
 {
     o = (LayerMask)DuktapeDLL.duk_get_int(ctx, idx);
     return(true);
 }