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 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); }
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); }
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); }
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); }
// 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); }
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)); }
// 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); }
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); }
// 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); }
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); }
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); }
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); }
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] }
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); }
public static bool duk_get_structvalue(IntPtr ctx, int idx, out LayerMask o) { o = (LayerMask)DuktapeDLL.duk_get_int(ctx, idx); return(true); }