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); int refid; DuktapeDLL.duk_unity_get_refid(ctx, idx, out refid); // 直接在 event object 上复制主对象的引用id DuktapeDLL.duk_push_object(ctx); DuktapeDLL.duk_unity_set_refid(ctx, -1, 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); }
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); }
protected static void duk_add_property(IntPtr ctx, string name, DuktapeDLL.duk_c_function getter, DuktapeDLL.duk_c_function setter, int idx) { // [ctor, prototype] idx = DuktapeDLL.duk_normalize_index(ctx, idx); var flags = 0U; DuktapeDLL.duk_push_string(ctx, name); if (getter != null) { flags |= DuktapeDLL.DUK_DEFPROP_HAVE_GETTER; DuktapeDLL.duk_push_c_function(ctx, getter, 0); } if (setter != null) { flags |= DuktapeDLL.DUK_DEFPROP_HAVE_SETTER; DuktapeDLL.duk_push_c_function(ctx, setter, 1); } // [ctor, prototype, name, ?getter, ?setter] DuktapeDLL.duk_def_prop(ctx, idx, flags | DuktapeDLL.DUK_DEFPROP_SET_ENUMERABLE | DuktapeDLL.DUK_DEFPROP_CLEAR_CONFIGURABLE); }
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); int refid; DuktapeDLL.duk_unity_get_refid(ctx, idx, out refid); // 直接在 event object 上复制主对象的引用id DuktapeDLL.duk_push_object(ctx); // [evtobj] DuktapeDLL.duk_unity_set_refid(ctx, -1, 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] }
protected static void duk_add_field(IntPtr ctx, string name, DuktapeDLL.duk_c_function getter, DuktapeDLL.duk_c_function setter, int idx) { // js 层面field与property绑定代码结构完全一致 duk_add_property(ctx, name, getter, setter, idx); }
protected static void duk_add_method(IntPtr ctx, string name, DuktapeDLL.duk_c_function func, int idx) { idx = DuktapeDLL.duk_normalize_index(ctx, idx); DuktapeDLL.duk_push_c_function(ctx, func, DuktapeDLL.DUK_VARARGS); DuktapeDLL.duk_put_prop_string(ctx, idx, name); }
protected static void duk_begin_class(IntPtr ctx, string typename, Type type, DuktapeDLL.duk_c_function ctor) { // Debug.LogFormat("begin class {0}", DuktapeDLL.duk_get_top(ctx)); DuktapeDLL.duk_push_c_function(ctx, ctor, DuktapeDLL.DUK_VARARGS); // [ctor] DuktapeDLL.duk_dup(ctx, -1); // [ctor ctor] // Debug.LogFormat("begin check {0}", DuktapeDLL.duk_get_top(ctx)); DuktapeDLL.duk_dup(ctx, -1); // [ctor ctor ctor] var ptr = DuktapeDLL.duk_get_heapptr(ctx, -1); var typeid = DuktapeVM.GetVM(ctx).AddExportedType(type, new DuktapeFunction(ctx, DuktapeDLL.duk_unity_ref(ctx), ptr)); DuktapeDLL.duk_unity_set_type_refid(ctx, -1, typeid); // constructor_function.!type == typeid // Debug.LogFormat("end check {0}", DuktapeDLL.duk_get_top(ctx)); DuktapeDLL.duk_put_prop_string(ctx, -3, typename); DuktapeDLL.duk_push_object(ctx); // [ctor, prototype] DuktapeDLL.duk_dup_top(ctx); // [ctor, prototype, prototype] DuktapeDLL.duk_unity_set_type_refid(ctx, -1, typeid); // prototype.!type == typeid DuktapeDLL.duk_push_c_function(ctx, object_dtor, 1); DuktapeDLL.duk_set_finalizer(ctx, -3); // set prototype finalizer DuktapeDLL.duk_put_prop_string(ctx, -3, "prototype"); // [ctor, prototype] }
protected static void duk_begin_class(IntPtr ctx, string typename, Type type, DuktapeDLL.duk_c_function ctor) { // Debug.LogFormat("begin class {0}", DuktapeDLL.duk_get_top(ctx)); DuktapeDLL.duk_push_c_function(ctx, ctor, DuktapeDLL.DUK_VARARGS); // [ctor] DuktapeDLL.duk_dup(ctx, -1); // Debug.LogFormat("begin check {0}", DuktapeDLL.duk_get_top(ctx)); DuktapeDLL.duk_dup(ctx, -1); var refid = DuktapeVM.GetVM(ctx).AddExported(type, new DuktapeFunction(ctx, DuktapeDLL.duk_unity_ref(ctx))); DuktapeDLL.duk_push_uint(ctx, refid); DuktapeDLL.duk_put_prop_string(ctx, -3, DuktapeVM.OBJ_PROP_EXPORTED_REFID); // Debug.LogFormat("end check {0}", DuktapeDLL.duk_get_top(ctx)); DuktapeDLL.duk_put_prop_string(ctx, -3, typename); DuktapeDLL.duk_push_object(ctx); // [ctor, prototype] DuktapeDLL.duk_dup_top(ctx); // [ctor, prototype, prototype] DuktapeDLL.duk_push_c_function(ctx, object_dtor, 1); DuktapeDLL.duk_set_finalizer(ctx, -3); // set prototype finalizer DuktapeDLL.duk_put_prop_string(ctx, -3, "prototype"); // [ctor, prototype] }