return CYCastJSValue(context, name);
} CYCatch(NULL) }
+static void (*JSSynchronousGarbageCollectForDebugging$)(JSContextRef);
+
+void CYGarbageCollect(JSContextRef context) {
+ (JSSynchronousGarbageCollectForDebugging$ ?: &JSGarbageCollect)(context);
+}
+
static JSValueRef Cycript_gc_callAsFunction(JSContextRef context, JSObjectRef object, JSObjectRef _this, size_t count, const JSValueRef arguments[], JSValueRef *exception) { CYTry {
- JSGarbageCollect(context);
+ CYGarbageCollect(context);
return CYJSUndefined(context);
} CYCatch(NULL) }
return JSContextGetGlobalObject(context);
}
+class ExecutionHandle {
+ private:
+ JSContextRef context_;
+ void *handle_;
+
+ public:
+ ExecutionHandle(JSContextRef context) :
+ context_(context)
+ {
+ if (hooks_ != NULL && hooks_->ExecuteStart != NULL)
+ handle_ = (*hooks_->ExecuteStart)(context_);
+ else
+ handle_ = NULL;
+ }
+
+ ~ExecutionHandle() {
+ if (hooks_ != NULL && hooks_->ExecuteEnd != NULL)
+ (*hooks_->ExecuteEnd)(context_, handle_);
+ }
+};
+
const char *CYExecute(JSContextRef context, CYPool &pool, CYUTF8String code) {
JSValueRef exception(NULL);
- void *handle;
- if (hooks_ != NULL && hooks_->ExecuteStart != NULL)
- handle = (*hooks_->ExecuteStart)(context);
- else
- handle = NULL;
+ ExecutionHandle handle(context);
- try {
-
- JSValueRef result;
- try {
+ JSValueRef result; try {
result = JSEvaluateScript(context, CYJSString(code), NULL, NULL, 0, &exception);
} catch (const char *error) {
return error;
if (JSValueIsUndefined(context, result))
return NULL;
- const char *json;
- try {
+ const char *json; try {
json = CYPoolCCYON(pool, context, result, &exception);
} catch (const char *error) {
return error;
CYSetProperty(context, CYGetGlobalObject(context), Result_, result);
return json;
-
- } catch (...) {
- if (hooks_ != NULL && hooks_->ExecuteEnd != NULL)
- (*hooks_->ExecuteEnd)(context, handle);
- throw;
- }
}
static bool initialized_ = false;
else return;
JSObjectMakeArray$ = reinterpret_cast<JSObjectRef (*)(JSContextRef, size_t, const JSValueRef[], JSValueRef *)>(dlsym(RTLD_DEFAULT, "JSObjectMakeArray"));
+ JSSynchronousGarbageCollectForDebugging$ = reinterpret_cast<void (*)(JSContextRef)>(dlsym(RTLD_DEFAULT, "JSSynchronousGarbageCollectForDebugging"));
JSClassDefinition definition;