Merge pull request #15777 from pandamicro/v3

Fix scheduler callback target lost issue
This commit is contained in:
minggo 2016-06-03 14:05:32 +08:00
commit cf80eb18b1
2 changed files with 28 additions and 37 deletions

View File

@ -734,7 +734,26 @@ JSCallbackWrapper::JSCallbackWrapper(JS::HandleValue owner)
JSCallbackWrapper::~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);
}
}
}
void JSCallbackWrapper::setJSCallbackFunc(JS::HandleValue func) {
@ -806,33 +825,6 @@ 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)
@ -1225,7 +1217,6 @@ void JSScheduleWrapper::removeTargetForJSObject(JS::HandleObject jsTargetObj, JS
free(removed);
}
}
target->reset();
dump();
CCLOGINFO("removeTargetForJSObject end");
}
@ -1272,12 +1263,14 @@ void JSScheduleWrapper::scheduleFunc(float dt)
JSB_AUTOCOMPARTMENT_WITH_GLOBAL_OBJCET
JS::RootedValue callback(cx, getJSCallbackFunc());
if(!callback.isNullOrUndefined()) {
JS::HandleValueArray args = JS::HandleValueArray::fromMarkedLocation(1, &data);
JS::RootedValue retval(cx);
JS::RootedValue targetVal(cx, getJSCallbackThis());
if (!targetVal.isNullOrUndefined()) {
JS::RootedObject target(cx, targetVal.toObjectOrNull());
if(!callback.isNullOrUndefined())
{
auto exist = JSScheduleWrapper::getTargetForSchedule(callback);
if (exist)
{
JS::HandleValueArray args = JS::HandleValueArray::fromMarkedLocation(1, &data);
JS::RootedValue retval(cx);
JS::RootedObject target(cx, getJSCallbackThis().toObjectOrNull());
JS_CallFunctionValue(cx, target, callback, args, &retval);
}
}

View File

@ -148,8 +148,6 @@ public:
const jsval getJSCallbackFunc() const;
const jsval getJSCallbackThis() const;
const jsval getJSExtraData() const;
void reset();
protected:
JS::Heap<JS::Value> _owner;
JS::Heap<JS::Value> _jsCallback;