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)) { var heapptr = DuktapeDLL.duk_get_heapptr(ctx, idx); var cache = DuktapeVM.GetObjectCache(ctx); DuktapeDelegate fn; if (cache.TryGetDelegate(heapptr, out fn)) { // Debug.LogWarningFormat("cache hit {0}", heapptr); o = fn.target as T; return(true); } // 默认赋值操作 DuktapeDLL.duk_dup(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 // Debug.LogWarningFormat("cache create : {0}", heapptr); cache.AddDelegate(heapptr, fn); return(true); } o = null; return(false); }
public static bool duk_get_delegate <T>(IntPtr ctx, int idx, out T o) where T : class { //TODO: 20200320 !!! 如果 o 不是 jsobject, 且是 Delegate 但不是 DuktapeDelegate, 则 ... 处理 if (DuktapeDLL.duk_is_object(ctx, idx) || DuktapeDLL.duk_is_function(ctx, idx)) { var heapptr = DuktapeDLL.duk_get_heapptr(ctx, idx); var cache = DuktapeVM.GetObjectCache(ctx); DuktapeDelegate fn; if (cache.TryGetDelegate(heapptr, out fn)) { // Debug.LogWarningFormat("cache hit {0}", heapptr); o = fn.target as T; return(true); } // 默认赋值操作 DuktapeDLL.duk_dup(ctx, idx); fn = new DuktapeDelegate(ctx, DuktapeDLL.duk_unity_ref(ctx), heapptr); var vm = DuktapeVM.GetVM(ctx); o = vm.CreateDelegate(typeof(T), fn) as T; // DuktapeDelegate 拥有 js 对象的强引用, 此 js 对象无法释放 cache 中的 object, 所以这里用弱引用注册 // 会出现的问题是, 如果 c# 没有对 DuktapeDelegate 的强引用, 那么反复 get_delegate 会重复创建 DuktapeDelegate // Debug.LogWarningFormat("cache create : {0}", heapptr); cache.AddDelegate(heapptr, fn); return(true); } // else if (DuktapeDLL.duk_is_object(ctx, idx)) // { // return duk_get_classvalue<T>(ctx, idx, out o); // } o = null; return(false); }
public void AddDelegate(IntPtr jso, DuktapeDelegate o) { _delegateMap[jso] = new WeakReference(o); // 不能直接保留 o -> jso 的映射 (会产生o的强引用) // Delegate 对 DuktapeDelegate 存在强引用 (首参), DuktapeDelegat 对 jsobject 存在强引用 // AddJSValue(o, jso); }
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); }
public Delegate CreateDelegate(Type type, DuktapeDelegate fn) { MethodInfo method; if (_delegates.TryGetValue(type, out method)) { var target = Delegate.CreateDelegate(type, fn, method, true); fn.target = target; return(target); } return(null); }
public bool TryGetDelegate(IntPtr jso, out DuktapeDelegate o) { WeakReference weakRef; if (_delegateMap.TryGetValue(jso, out weakRef)) { o = weakRef.Target as DuktapeDelegate; return(o != null); } o = null; return(false); }
public void AddDelegate(IntPtr jso, DuktapeDelegate o) { _delegateMap[jso] = new WeakReference(o); AddJSValue(o, jso); }