X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/24e7b1a688a2ff1cac094026d20cc6001f062581..50a3d79f79a223e8a119fe7531fd0a47ebd09d45:/Execute.cpp diff --git a/Execute.cpp b/Execute.cpp index 04a86a3..70751a4 100644 --- a/Execute.cpp +++ b/Execute.cpp @@ -425,7 +425,7 @@ const char *CYPoolCCYON(CYPool &pool, JSContextRef context, JSObjectRef object, 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(reinterpret_cast(&objects)))}; + JSValueRef arguments[1] = {CYCastJSValue(context, reinterpret_cast(&objects))}; JSValueRef value(CYCallAsFunction(context, (JSObjectRef) toCYON, object, 1, arguments)); _assert(value != NULL); return CYPoolCString(pool, context, value); @@ -1590,30 +1590,32 @@ class ExecutionHandle { } }; +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 objects; - json = CYPoolCCYON(pool, context, result, objects, &exception); - } catch (const char *error) { - return error; - } - + std::set objects; + const char *json(CYPoolCCYON(pool, context, result, objects, &exception)); if (exception != NULL) goto error; @@ -1622,6 +1624,10 @@ const char *CYExecute(JSContextRef context, CYPool &pool, CYUTF8String code) { return json; } +void CYCancel() { + cancel_ = true; +} + static bool initialized_ = false; void CYInitializeDynamic() { @@ -1833,6 +1839,9 @@ static JSValueRef require(JSContextRef context, JSObjectRef object, JSObjectRef return CYGetProperty(context, module, property); } CYCatch(NULL) } +extern "C" void CYDestroyWeak(JSWeakObjectMapRef weak, void *data) { +} + extern "C" void CYSetupContext(JSGlobalContextRef context) { CYInitializeDynamic(); @@ -1934,7 +1943,7 @@ extern "C" void CYSetupContext(JSGlobalContextRef context) { #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(weak))); } #endif