mirror of https://github.com/axmolengine/axmol.git
Merge pull request #14256 from pandamicro/v3
Use generational gc friendly API in JSTouchDelegate
This commit is contained in:
commit
617f5265f1
|
@ -37,16 +37,18 @@ schedTarget_proxy_t *_schedObj_target_ht = NULL;
|
||||||
JSTouchDelegate::TouchDelegateMap JSTouchDelegate::sTouchDelegateMap;
|
JSTouchDelegate::TouchDelegateMap JSTouchDelegate::sTouchDelegateMap;
|
||||||
|
|
||||||
JSTouchDelegate::JSTouchDelegate()
|
JSTouchDelegate::JSTouchDelegate()
|
||||||
: _obj(nullptr)
|
: _needUnroot(false)
|
||||||
, _needUnroot(false)
|
|
||||||
, _touchListenerAllAtOnce(nullptr)
|
, _touchListenerAllAtOnce(nullptr)
|
||||||
, _touchListenerOneByOne(nullptr)
|
, _touchListenerOneByOne(nullptr)
|
||||||
{
|
{
|
||||||
|
auto cx = ScriptingCore::getInstance()->getGlobalContext();
|
||||||
|
_obj.construct(cx);
|
||||||
}
|
}
|
||||||
|
|
||||||
JSTouchDelegate::~JSTouchDelegate()
|
JSTouchDelegate::~JSTouchDelegate()
|
||||||
{
|
{
|
||||||
CCLOGINFO("In the destructor of JSTouchDelegate.");
|
CCLOGINFO("In the destructor of JSTouchDelegate.");
|
||||||
|
_obj.destroyIfConstructed();
|
||||||
}
|
}
|
||||||
|
|
||||||
void JSTouchDelegate::setDelegateForJSObject(JSObject* pJSObj, JSTouchDelegate* pDelegate)
|
void JSTouchDelegate::setDelegateForJSObject(JSObject* pJSObj, JSTouchDelegate* pDelegate)
|
||||||
|
@ -74,17 +76,9 @@ void JSTouchDelegate::removeDelegateForJSObject(JSObject* pJSObj)
|
||||||
sTouchDelegateMap.erase(pJSObj);
|
sTouchDelegateMap.erase(pJSObj);
|
||||||
}
|
}
|
||||||
|
|
||||||
void JSTouchDelegate::setJSObject(JSObject *obj)
|
void JSTouchDelegate::setJSObject(JS::HandleObject obj)
|
||||||
{
|
{
|
||||||
_obj = obj;
|
_obj.ref() = obj;
|
||||||
|
|
||||||
js_proxy_t *p = jsb_get_js_proxy(_obj);
|
|
||||||
if (!p)
|
|
||||||
{
|
|
||||||
JSContext *cx = ScriptingCore::getInstance()->getGlobalContext();
|
|
||||||
JS::AddNamedObjectRoot(cx, &_obj, "JSB_TouchDelegateTarget, target");
|
|
||||||
_needUnroot = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void JSTouchDelegate::registerStandardDelegate(int priority)
|
void JSTouchDelegate::registerStandardDelegate(int priority)
|
||||||
|
@ -123,12 +117,6 @@ void JSTouchDelegate::registerTargetedDelegate(int priority, bool swallowsTouche
|
||||||
|
|
||||||
void JSTouchDelegate::unregisterTouchDelegate()
|
void JSTouchDelegate::unregisterTouchDelegate()
|
||||||
{
|
{
|
||||||
if (_needUnroot)
|
|
||||||
{
|
|
||||||
JSContext *cx = ScriptingCore::getInstance()->getGlobalContext();
|
|
||||||
JS::RemoveObjectRoot(cx, &_obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
auto dispatcher = Director::getInstance()->getEventDispatcher();
|
auto dispatcher = Director::getInstance()->getEventDispatcher();
|
||||||
dispatcher->removeEventListener(_touchListenerAllAtOnce);
|
dispatcher->removeEventListener(_touchListenerAllAtOnce);
|
||||||
dispatcher->removeEventListener(_touchListenerOneByOne);
|
dispatcher->removeEventListener(_touchListenerOneByOne);
|
||||||
|
@ -143,8 +131,7 @@ bool JSTouchDelegate::onTouchBegan(Touch *touch, Event *event)
|
||||||
JS::RootedValue retval(cx);
|
JS::RootedValue retval(cx);
|
||||||
bool bRet = false;
|
bool bRet = false;
|
||||||
|
|
||||||
ScriptingCore::getInstance()->executeCustomTouchEvent(EventTouch::EventCode::BEGAN,
|
ScriptingCore::getInstance()->executeCustomTouchEvent(EventTouch::EventCode::BEGAN, touch, _obj.ref(), &retval);
|
||||||
touch, _obj.get(), &retval);
|
|
||||||
|
|
||||||
if(retval.isBoolean())
|
if(retval.isBoolean())
|
||||||
{
|
{
|
||||||
|
@ -159,48 +146,45 @@ void JSTouchDelegate::onTouchMoved(Touch *touch, Event *event)
|
||||||
{
|
{
|
||||||
CC_UNUSED_PARAM(event);
|
CC_UNUSED_PARAM(event);
|
||||||
|
|
||||||
ScriptingCore::getInstance()->executeCustomTouchEvent(EventTouch::EventCode::MOVED,
|
ScriptingCore::getInstance()->executeCustomTouchEvent(EventTouch::EventCode::MOVED, touch, _obj.ref());
|
||||||
touch, _obj);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void JSTouchDelegate::onTouchEnded(Touch *touch, Event *event)
|
void JSTouchDelegate::onTouchEnded(Touch *touch, Event *event)
|
||||||
{
|
{
|
||||||
CC_UNUSED_PARAM(event);
|
CC_UNUSED_PARAM(event);
|
||||||
|
|
||||||
ScriptingCore::getInstance()->executeCustomTouchEvent(EventTouch::EventCode::ENDED,
|
ScriptingCore::getInstance()->executeCustomTouchEvent(EventTouch::EventCode::ENDED, touch, _obj.ref());
|
||||||
touch, _obj);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void JSTouchDelegate::onTouchCancelled(Touch *touch, Event *event)
|
void JSTouchDelegate::onTouchCancelled(Touch *touch, Event *event)
|
||||||
{
|
{
|
||||||
CC_UNUSED_PARAM(event);
|
CC_UNUSED_PARAM(event);
|
||||||
ScriptingCore::getInstance()->executeCustomTouchEvent(EventTouch::EventCode::CANCELLED,
|
ScriptingCore::getInstance()->executeCustomTouchEvent(EventTouch::EventCode::CANCELLED, touch, _obj.ref());
|
||||||
touch, _obj);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// optional
|
// optional
|
||||||
void JSTouchDelegate::onTouchesBegan(const std::vector<Touch*>& touches, Event *event)
|
void JSTouchDelegate::onTouchesBegan(const std::vector<Touch*>& touches, Event *event)
|
||||||
{
|
{
|
||||||
CC_UNUSED_PARAM(event);
|
CC_UNUSED_PARAM(event);
|
||||||
ScriptingCore::getInstance()->executeCustomTouchesEvent(EventTouch::EventCode::BEGAN, touches, _obj);
|
ScriptingCore::getInstance()->executeCustomTouchesEvent(EventTouch::EventCode::BEGAN, touches, _obj.ref());
|
||||||
}
|
}
|
||||||
|
|
||||||
void JSTouchDelegate::onTouchesMoved(const std::vector<Touch*>& touches, Event *event)
|
void JSTouchDelegate::onTouchesMoved(const std::vector<Touch*>& touches, Event *event)
|
||||||
{
|
{
|
||||||
CC_UNUSED_PARAM(event);
|
CC_UNUSED_PARAM(event);
|
||||||
ScriptingCore::getInstance()->executeCustomTouchesEvent(EventTouch::EventCode::MOVED, touches, _obj);
|
ScriptingCore::getInstance()->executeCustomTouchesEvent(EventTouch::EventCode::MOVED, touches, _obj.ref());
|
||||||
}
|
}
|
||||||
|
|
||||||
void JSTouchDelegate::onTouchesEnded(const std::vector<Touch*>& touches, Event *event)
|
void JSTouchDelegate::onTouchesEnded(const std::vector<Touch*>& touches, Event *event)
|
||||||
{
|
{
|
||||||
CC_UNUSED_PARAM(event);
|
CC_UNUSED_PARAM(event);
|
||||||
ScriptingCore::getInstance()->executeCustomTouchesEvent(EventTouch::EventCode::ENDED, touches, _obj);
|
ScriptingCore::getInstance()->executeCustomTouchesEvent(EventTouch::EventCode::ENDED, touches, _obj.ref());
|
||||||
}
|
}
|
||||||
|
|
||||||
void JSTouchDelegate::onTouchesCancelled(const std::vector<Touch*>& touches, Event *event)
|
void JSTouchDelegate::onTouchesCancelled(const std::vector<Touch*>& touches, Event *event)
|
||||||
{
|
{
|
||||||
CC_UNUSED_PARAM(event);
|
CC_UNUSED_PARAM(event);
|
||||||
ScriptingCore::getInstance()->executeCustomTouchesEvent(EventTouch::EventCode::CANCELLED, touches, _obj);
|
ScriptingCore::getInstance()->executeCustomTouchesEvent(EventTouch::EventCode::CANCELLED, touches, _obj.ref());
|
||||||
}
|
}
|
||||||
|
|
||||||
// cc.EventTouch#getTouches
|
// cc.EventTouch#getTouches
|
||||||
|
@ -798,7 +782,6 @@ bool js_cocos2dx_JSTouchDelegate_registerStandardDelegate(JSContext *cx, uint32_
|
||||||
if (argc == 1 || argc == 2)
|
if (argc == 1 || argc == 2)
|
||||||
{
|
{
|
||||||
JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
|
JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
|
||||||
JSObject* jsobj = NULL;
|
|
||||||
|
|
||||||
JSTouchDelegate *touch = new JSTouchDelegate();
|
JSTouchDelegate *touch = new JSTouchDelegate();
|
||||||
|
|
||||||
|
@ -810,7 +793,7 @@ bool js_cocos2dx_JSTouchDelegate_registerStandardDelegate(JSContext *cx, uint32_
|
||||||
|
|
||||||
touch->registerStandardDelegate(priority);
|
touch->registerStandardDelegate(priority);
|
||||||
|
|
||||||
jsobj = args.get(0).toObjectOrNull();
|
JS::RootedObject jsobj(cx, args.get(0).toObjectOrNull());
|
||||||
touch->setJSObject(jsobj);
|
touch->setJSObject(jsobj);
|
||||||
JSTouchDelegate::setDelegateForJSObject(jsobj, touch);
|
JSTouchDelegate::setDelegateForJSObject(jsobj, touch);
|
||||||
return true;
|
return true;
|
||||||
|
@ -824,12 +807,11 @@ bool js_cocos2dx_JSTouchDelegate_registerTargetedDelegate(JSContext *cx, uint32_
|
||||||
if (argc == 3)
|
if (argc == 3)
|
||||||
{
|
{
|
||||||
JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
|
JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
|
||||||
JSObject* jsobj = NULL;
|
|
||||||
|
|
||||||
JSTouchDelegate *touch = new JSTouchDelegate();
|
JSTouchDelegate *touch = new JSTouchDelegate();
|
||||||
touch->registerTargetedDelegate(args.get(0).toInt32(), args.get(1).toBoolean());
|
touch->registerTargetedDelegate(args.get(0).toInt32(), args.get(1).toBoolean());
|
||||||
|
|
||||||
jsobj = args.get(2).toObjectOrNull();
|
JS::RootedObject jsobj(cx, args.get(2).toObjectOrNull());
|
||||||
touch->setJSObject(jsobj);
|
touch->setJSObject(jsobj);
|
||||||
JSTouchDelegate::setDelegateForJSObject(jsobj, touch);
|
JSTouchDelegate::setDelegateForJSObject(jsobj, touch);
|
||||||
|
|
||||||
|
@ -5773,7 +5755,6 @@ bool js_cocos2dx_PolygonInfo_constructor(JSContext *cx, uint32_t argc, jsval *vp
|
||||||
CCASSERT(typeMapIter != _js_global_type_map.end(), "Can't find the class type!");
|
CCASSERT(typeMapIter != _js_global_type_map.end(), "Can't find the class type!");
|
||||||
typeClass = typeMapIter->second;
|
typeClass = typeMapIter->second;
|
||||||
CCASSERT(typeClass, "The value is null.");
|
CCASSERT(typeClass, "The value is null.");
|
||||||
// JSObject *obj = JS_NewObject(cx, typeClass->jsclass, typeClass->proto, typeClass->parentProto);
|
|
||||||
JS::RootedObject proto(cx, typeClass->proto.get());
|
JS::RootedObject proto(cx, typeClass->proto.get());
|
||||||
JS::RootedObject parent(cx, typeClass->parentProto.get());
|
JS::RootedObject parent(cx, typeClass->parentProto.get());
|
||||||
JS::RootedObject obj(cx, JS_NewObject(cx, typeClass->jsclass, proto, parent));
|
JS::RootedObject obj(cx, JS_NewObject(cx, typeClass->jsclass, proto, parent));
|
||||||
|
@ -5964,7 +5945,6 @@ bool js_cocos2dx_AutoPolygon_constructor(JSContext *cx, uint32_t argc, jsval *vp
|
||||||
CCASSERT(typeMapIter != _js_global_type_map.end(), "Can't find the class type!");
|
CCASSERT(typeMapIter != _js_global_type_map.end(), "Can't find the class type!");
|
||||||
typeClass = typeMapIter->second;
|
typeClass = typeMapIter->second;
|
||||||
CCASSERT(typeClass, "The value is null.");
|
CCASSERT(typeClass, "The value is null.");
|
||||||
// JSObject *obj = JS_NewObject(cx, typeClass->jsclass, typeClass->proto, typeClass->parentProto);
|
|
||||||
JS::RootedObject proto(cx, typeClass->proto.get());
|
JS::RootedObject proto(cx, typeClass->proto.get());
|
||||||
JS::RootedObject parent(cx, typeClass->parentProto.get());
|
JS::RootedObject parent(cx, typeClass->parentProto.get());
|
||||||
JS::RootedObject obj(cx, JS_NewObject(cx, typeClass->jsclass, proto, parent));
|
JS::RootedObject obj(cx, JS_NewObject(cx, typeClass->jsclass, proto, parent));
|
||||||
|
|
|
@ -197,7 +197,7 @@ public:
|
||||||
// Remove the delegate by the key (pJSObj).
|
// Remove the delegate by the key (pJSObj).
|
||||||
static void removeDelegateForJSObject(JSObject* pJSObj);
|
static void removeDelegateForJSObject(JSObject* pJSObj);
|
||||||
|
|
||||||
void setJSObject(JSObject *obj);
|
void setJSObject(JS::HandleObject obj);
|
||||||
void registerStandardDelegate(int priority);
|
void registerStandardDelegate(int priority);
|
||||||
void registerTargetedDelegate(int priority, bool swallowsTouches);
|
void registerTargetedDelegate(int priority, bool swallowsTouches);
|
||||||
// unregister touch delegate.
|
// unregister touch delegate.
|
||||||
|
@ -217,7 +217,7 @@ public:
|
||||||
void onTouchesCancelled(const std::vector<cocos2d::Touch*>& touches, cocos2d::Event *event);
|
void onTouchesCancelled(const std::vector<cocos2d::Touch*>& touches, cocos2d::Event *event);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
JS::Heap<JSObject*> _obj;
|
mozilla::Maybe<JS::PersistentRootedObject> _obj;
|
||||||
typedef std::unordered_map<JSObject*, JSTouchDelegate*> TouchDelegateMap;
|
typedef std::unordered_map<JSObject*, JSTouchDelegate*> TouchDelegateMap;
|
||||||
typedef std::pair<JSObject*, JSTouchDelegate*> TouchDelegatePair;
|
typedef std::pair<JSObject*, JSTouchDelegate*> TouchDelegatePair;
|
||||||
static TouchDelegateMap sTouchDelegateMap;
|
static TouchDelegateMap sTouchDelegateMap;
|
||||||
|
|
2
web
2
web
|
@ -1 +1 @@
|
||||||
Subproject commit bcf78ece2a2743d0f1bfb37ffced23a0caba14a5
|
Subproject commit c3ef2f2a28014089f6a8fc5b2fe1cd19ae67b0ad
|
Loading…
Reference in New Issue