Add Notification constructor and destructor
These handle the life cycle of the member variables.
This commit is contained in:
parent
6a550f285f
commit
d5ae329d8a
|
@ -373,6 +373,18 @@ namespace realm {
|
||||||
JSObjectRef realmObject;
|
JSObjectRef realmObject;
|
||||||
JSObjectRef callbackObject;
|
JSObjectRef callbackObject;
|
||||||
RJSRealmDelegate::NotificationFunction func;
|
RJSRealmDelegate::NotificationFunction func;
|
||||||
|
|
||||||
|
Notification(JSGlobalContextRef c, JSObjectRef r, JSObjectRef cb, RJSRealmDelegate::NotificationFunction f) : ctx(c), realmObject(r), callbackObject(cb), func(f) {
|
||||||
|
JSGlobalContextRetain(ctx);
|
||||||
|
JSValueProtect(ctx, realmObject);
|
||||||
|
JSValueProtect(ctx, callbackObject);
|
||||||
|
}
|
||||||
|
|
||||||
|
~Notification() {
|
||||||
|
JSValueUnprotect(ctx, callbackObject);
|
||||||
|
JSValueUnprotect(ctx, realmObject);
|
||||||
|
JSGlobalContextRelease(ctx);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -382,10 +394,7 @@ JSValueRef RealmAddNotification(JSContextRef ctx, JSObjectRef function, JSObject
|
||||||
|
|
||||||
JSObjectRef callback = RJSValidatedValueToFunction(ctx, arguments[0]);
|
JSObjectRef callback = RJSValidatedValueToFunction(ctx, arguments[0]);
|
||||||
SharedRealm realm = *RJSGetInternal<SharedRealm *>(thisObject);
|
SharedRealm realm = *RJSGetInternal<SharedRealm *>(thisObject);
|
||||||
JSGlobalContextRef gCtx = JSGlobalContextRetain(JSContextGetGlobalContext(ctx));
|
JSGlobalContextRef gCtx = JSContextGetGlobalContext(ctx);
|
||||||
|
|
||||||
JSValueProtect(gCtx, thisObject);
|
|
||||||
JSValueProtect(gCtx, callback);
|
|
||||||
|
|
||||||
RJSRealmDelegate::NotificationFunction func = std::make_shared<std::function<void(const std::string)>>([=](std::string notification_name) {
|
RJSRealmDelegate::NotificationFunction func = std::make_shared<std::function<void(const std::string)>>([=](std::string notification_name) {
|
||||||
JSValueRef arguments[2];
|
JSValueRef arguments[2];
|
||||||
|
@ -424,16 +433,6 @@ JSValueRef RealmClose(JSContextRef ctx, JSObjectRef function, JSObjectRef thisOb
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void RJSNotificationFinalize(JSObjectRef object) {
|
|
||||||
Notification *notification = RJSGetInternal<Notification *>(object);
|
|
||||||
JSGlobalContextRef ctx = notification->ctx;
|
|
||||||
|
|
||||||
JSValueUnprotect(ctx, notification->callbackObject);
|
|
||||||
JSValueUnprotect(ctx, notification->realmObject);
|
|
||||||
JSGlobalContextRelease(ctx);
|
|
||||||
RJSFinalize<Notification *>(object);
|
|
||||||
}
|
|
||||||
|
|
||||||
const JSStaticFunction RJSRealmFuncs[] = {
|
const JSStaticFunction RJSRealmFuncs[] = {
|
||||||
{"objects", RealmObjects, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontEnum | kJSPropertyAttributeDontDelete},
|
{"objects", RealmObjects, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontEnum | kJSPropertyAttributeDontDelete},
|
||||||
{"create", RealmCreateObject, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontEnum | kJSPropertyAttributeDontDelete},
|
{"create", RealmCreateObject, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontEnum | kJSPropertyAttributeDontDelete},
|
||||||
|
@ -451,7 +450,7 @@ JSClassRef RJSRealmClass() {
|
||||||
}
|
}
|
||||||
|
|
||||||
JSClassRef RJSNotificationClass() {
|
JSClassRef RJSNotificationClass() {
|
||||||
static JSClassRef s_notificationClass = RJSCreateWrapperClass<Notification *>("Notification", NULL, NULL, NULL, RJSNotificationFinalize);
|
static JSClassRef s_notificationClass = RJSCreateWrapperClass<Notification *>("Notification", NULL, NULL, NULL);
|
||||||
return s_notificationClass;
|
return s_notificationClass;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue