@@ -624,44 +624,54 @@ bool js_cocos2dx_CCMenuItemToggle_create(JSContext *cx, uint32_t argc, jsval *vp
624
624
return false ;
625
625
}
626
626
627
- // "setCallback" in JS
628
- // item.setCallback( callback_fn, [this]);
629
- template <class T >
630
- bool js_cocos2dx_setCallback (JSContext *cx, uint32_t argc, jsval *vp)
627
+ bool js_cocos2dx_MenuItem_setCallback (JSContext *cx, uint32_t argc, jsval *vp)
631
628
{
632
- if (argc == 1 || argc == 2 )
633
- {
634
- jsval *argv = JS_ARGV (cx, vp);
635
- JSObject *obj = JS_THIS_OBJECT (cx, vp);
636
- jsval jsThis = JSVAL_VOID;
637
- jsval jsFunc = argv[0 ];
638
-
639
- if (jsFunc.isUndefined ())
640
- {
641
- JS_ReportError (cx, " The callback function is undefined." );
642
- return false ;
643
- }
644
-
645
- if (argc == 2 )
646
- {
647
- jsThis = argv[1 ];
648
- }
649
-
650
- js_proxy_t *proxy = jsb_get_js_proxy (obj);
651
- T* item = (T*)(proxy ? proxy->ptr : NULL );
652
- TEST_NATIVE_OBJECT (cx, item)
653
- bind_menu_item (cx, item, jsFunc, jsThis);
629
+ jsval *argv = JS_ARGV (cx, vp);
630
+ bool ok = true ;
631
+ JSObject *obj = JS_THIS_OBJECT (cx, vp);
632
+ js_proxy_t *proxy = jsb_get_js_proxy (obj);
633
+ cocos2d::MenuItem* cobj = (cocos2d::MenuItem *)(proxy ? proxy->ptr : NULL );
634
+ JSB_PRECONDITION2 ( cobj, cx, false , " js_cocos2dx_MenuItem_setCallback : Invalid Native Object" );
635
+ if (argc == 1 || argc == 2 ) {
636
+ std::function<void (cocos2d::Ref *)> arg0;
637
+ do {
638
+ if (JS_TypeOfValue (cx, argv[0 ]) == JSTYPE_FUNCTION)
639
+ {
640
+ std::shared_ptr<JSFunctionWrapper> func (new JSFunctionWrapper (cx, JS_THIS_OBJECT (cx, vp), argv[0 ]));
641
+ auto lambda = [=](cocos2d::Ref* larg0) -> void {
642
+ jsval largv[1 ];
643
+ do {
644
+ if (larg0) {
645
+ js_proxy_t *jsProxy = js_get_or_create_proxy<cocos2d::Ref>(cx, (cocos2d::Ref*)larg0);
646
+ largv[0 ] = OBJECT_TO_JSVAL (jsProxy->obj );
647
+ } else {
648
+ largv[0 ] = JSVAL_NULL;
649
+ }
650
+ } while (0 );
651
+ jsval rval;
652
+ bool ok = func->invoke (1 , &largv[0 ], rval);
653
+ if (!ok && JS_IsExceptionPending (cx)) {
654
+ JS_ReportPendingException (cx);
655
+ }
656
+ };
657
+ arg0 = lambda;
658
+ }
659
+ else
660
+ {
661
+ arg0 = nullptr ;
662
+ }
663
+ } while (0 )
664
+ ;
665
+ JSB_PRECONDITION2 (ok, cx, false , " js_cocos2dx_MenuItem_setCallback : Error processing arguments" );
666
+ cobj->setCallback (arg0);
667
+ JS_SET_RVAL (cx, vp, JSVAL_VOID);
654
668
return true ;
655
669
}
656
- JS_ReportError (cx, " wrong number of arguments: %d, was expecting %d or %d" , argc, 1 , 2 );
657
- return false ;
658
- }
659
670
660
- bool js_cocos2dx_CCMenuItem_setCallback (JSContext * cx, uint32_t argc, jsval *vp) {
661
- return js_cocos2dx_setCallback<cocos2d::MenuItem>(cx, argc, vp) ;
671
+ JS_ReportError ( cx, " js_cocos2dx_MenuItem_setCallback : wrong number of arguments: %d, was expecting %d " , argc, 1 );
672
+ return false ;
662
673
}
663
674
664
-
665
675
bool js_cocos2dx_CCAnimation_create (JSContext *cx, uint32_t argc, jsval *vp)
666
676
{
667
677
bool ok = true ;
@@ -4869,7 +4879,7 @@ void register_cocos2dx_js_extensions(JSContext* cx, JSObject* global)
4869
4879
JS_DefineFunction (cx, jsb_cocos2d_Animation_prototype, " release" , js_cocos2dx_release, 0 , JSPROP_ENUMERATE | JSPROP_PERMANENT);
4870
4880
JS_DefineFunction (cx, jsb_cocos2d_SpriteFrame_prototype, " retain" , js_cocos2dx_retain, 0 , JSPROP_ENUMERATE | JSPROP_PERMANENT);
4871
4881
JS_DefineFunction (cx, jsb_cocos2d_SpriteFrame_prototype, " release" , js_cocos2dx_release, 0 , JSPROP_ENUMERATE | JSPROP_PERMANENT);
4872
- JS_DefineFunction (cx, jsb_cocos2d_MenuItem_prototype, " setCallback" , js_cocos2dx_CCMenuItem_setCallback , 2 , JSPROP_ENUMERATE | JSPROP_PERMANENT);
4882
+ JS_DefineFunction (cx, jsb_cocos2d_MenuItem_prototype, " setCallback" , js_cocos2dx_MenuItem_setCallback , 2 , JSPROP_ENUMERATE | JSPROP_PERMANENT);
4873
4883
JS_DefineFunction (cx, jsb_cocos2d_TMXLayer_prototype, " getTileFlagsAt" , js_cocos2dx_CCTMXLayer_tileFlagsAt, 2 , JSPROP_ENUMERATE | JSPROP_PERMANENT);
4874
4884
JS_DefineFunction (cx, jsb_cocos2d_TMXLayer_prototype, " getTiles" , js_cocos2dx_CCTMXLayer_getTiles, 0 , JSPROP_ENUMERATE | JSPROP_PERMANENT);
4875
4885
0 commit comments