diff --git a/cocos/scripting/js-bindings/manual/cocos2d_specifics.cpp b/cocos/scripting/js-bindings/manual/cocos2d_specifics.cpp index 0d4e6000c2..25fa1b4ceb 100644 --- a/cocos/scripting/js-bindings/manual/cocos2d_specifics.cpp +++ b/cocos/scripting/js-bindings/manual/cocos2d_specifics.cpp @@ -734,26 +734,7 @@ JSCallbackWrapper::JSCallbackWrapper(JS::HandleValue owner) JSCallbackWrapper::~JSCallbackWrapper() { - JSContext* cx = ScriptingCore::getInstance()->getGlobalContext(); - JS::RootedValue ownerVal(cx, _owner); - if (!ownerVal.isNullOrUndefined()) - { - JS::RootedValue target(cx, _jsCallback); - if (!target.isNullOrUndefined()) - { - js_remove_object_reference(ownerVal, target); - } - target.set(_jsThisObj); - if (!target.isNullOrUndefined()) - { - js_remove_object_reference(ownerVal, target); - } - target.set(_extraData); - if (!target.isNullOrUndefined()) - { - js_remove_object_reference(ownerVal, target); - } - } + reset(); } void JSCallbackWrapper::setJSCallbackFunc(JS::HandleValue func) { @@ -825,6 +806,33 @@ const jsval JSCallbackWrapper::getJSExtraData() const return _extraData; } +void JSCallbackWrapper::reset() +{ + JSContext* cx = ScriptingCore::getInstance()->getGlobalContext(); + JS::RootedValue ownerVal(cx, _owner); + if (!ownerVal.isNullOrUndefined()) + { + JS::RootedValue target(cx, _jsCallback); + if (!target.isNullOrUndefined()) + { + js_remove_object_reference(ownerVal, target); + } + target.set(_jsThisObj); + if (!target.isNullOrUndefined()) + { + js_remove_object_reference(ownerVal, target); + } + target.set(_extraData); + if (!target.isNullOrUndefined()) + { + js_remove_object_reference(ownerVal, target); + } + } + _jsCallback = JS::NullValue(); + _jsThisObj = JS::NullValue(); + _extraData = JS::NullValue(); +} + // cc.CallFunc.create( func, this, [data]) // cc.CallFunc.create( func ) static bool js_callFunc(JSContext *cx, uint32_t argc, jsval *vp) @@ -1217,6 +1225,7 @@ void JSScheduleWrapper::removeTargetForJSObject(JS::HandleObject jsTargetObj, JS free(removed); } } + target->reset(); dump(); CCLOGINFO("removeTargetForJSObject end"); } @@ -1266,8 +1275,11 @@ void JSScheduleWrapper::scheduleFunc(float dt) if(!callback.isNullOrUndefined()) { JS::HandleValueArray args = JS::HandleValueArray::fromMarkedLocation(1, &data); JS::RootedValue retval(cx); - JS::RootedObject callbackTarget(cx, getJSCallbackThis().toObjectOrNull()); - JS_CallFunctionValue(cx, callbackTarget, callback, args, &retval); + JS::RootedValue targetVal(cx, getJSCallbackThis()); + if (!targetVal.isNullOrUndefined()) { + JS::RootedObject target(cx, targetVal.toObjectOrNull()); + JS_CallFunctionValue(cx, target, callback, args, &retval); + } } } diff --git a/cocos/scripting/js-bindings/manual/cocos2d_specifics.hpp b/cocos/scripting/js-bindings/manual/cocos2d_specifics.hpp index f83b56bf56..8cf8cbfc0f 100644 --- a/cocos/scripting/js-bindings/manual/cocos2d_specifics.hpp +++ b/cocos/scripting/js-bindings/manual/cocos2d_specifics.hpp @@ -148,6 +148,8 @@ public: const jsval getJSCallbackFunc() const; const jsval getJSCallbackThis() const; const jsval getJSExtraData() const; + + void reset(); protected: JS::Heap _owner; JS::Heap _jsCallback;