JSValueRef toCYON(CYGetProperty(context, object, toCYON_s));
if (CYIsCallable(context, toCYON)) {
// XXX: this needs to be abstracted behind some kind of function
- JSValueRef arguments[1] = {CYCastJSValue(context, static_cast<double>(reinterpret_cast<uintptr_t>(&objects)))};
+ JSValueRef arguments[1] = {CYCastJSValue(context, reinterpret_cast<uintptr_t>(&objects))};
JSValueRef value(CYCallAsFunction(context, (JSObjectRef) toCYON, object, 1, arguments));
_assert(value != NULL);
return CYPoolCString(pool, context, value);
}
};
+static volatile bool cancel_;
+
+static bool CYShouldTerminate(JSContextRef context, void *arg) {
+ return cancel_;
+}
+
const char *CYExecute(JSContextRef context, CYPool &pool, CYUTF8String code) {
JSValueRef exception(NULL);
+ if (false) error:
+ return CYPoolCString(pool, context, CYJSString(context, exception));
ExecutionHandle handle(context);
- JSValueRef result; try {
- result = JSEvaluateScript(context, CYJSString(code), NULL, NULL, 0, &exception);
- } catch (const char *error) {
- return error;
- }
+ cancel_ = false;
+ if (&JSContextGroupSetExecutionTimeLimit != NULL)
+ JSContextGroupSetExecutionTimeLimit(JSContextGetGroup(context), 0.5, &CYShouldTerminate, NULL);
- if (exception != NULL) error:
- return CYPoolCString(pool, context, CYJSString(context, exception));
+ JSValueRef result(JSEvaluateScript(context, CYJSString(code), NULL, NULL, 0, &exception));
+ if (exception != NULL)
+ goto error;
if (JSValueIsUndefined(context, result))
return NULL;
- const char *json; try {
- std::set<void *> objects;
- json = CYPoolCCYON(pool, context, result, objects, &exception);
- } catch (const char *error) {
- return error;
- }
-
+ std::set<void *> objects;
+ const char *json(CYPoolCCYON(pool, context, result, objects, &exception));
if (exception != NULL)
goto error;
return json;
}
+void CYCancel() {
+ cancel_ = true;
+}
+
static bool initialized_ = false;
void CYInitializeDynamic() {
return CYGetProperty(context, module, property);
} CYCatch(NULL) }
+extern "C" void CYDestroyWeak(JSWeakObjectMapRef weak, void *data) {
+}
+
extern "C" void CYSetupContext(JSGlobalContextRef context) {
CYInitializeDynamic();
#ifdef __APPLE__
if (&JSWeakObjectMapCreate != NULL) {
- JSWeakObjectMapRef weak(JSWeakObjectMapCreate(context, NULL, NULL));
+ JSWeakObjectMapRef weak(JSWeakObjectMapCreate(context, NULL, &CYDestroyWeak));
CYSetProperty(context, cy, weak_s, CYCastJSValue(context, reinterpret_cast<uintptr_t>(weak)));
}
#endif