X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/7341eedbaf526ef2f0986b576c656906050e270a..4e2cc9d31bca82d99377b34371535f2ec9ee5c33:/Execute.cpp diff --git a/Execute.cpp b/Execute.cpp index ea882eb..fc19fba 100644 --- a/Execute.cpp +++ b/Execute.cpp @@ -143,6 +143,10 @@ CYUTF16String CYCastUTF16String(JSStringRef value) { return CYUTF16String(JSStringGetCharactersPtr(value), JSStringGetLength(value)); } +const char *CYPoolCString(CYPool &pool, CYUTF8String utf8) { + return pool.strndup(utf8.data, utf8.size); +} + CYUTF8String CYPoolUTF8String(CYPool &pool, JSContextRef context, JSStringRef value) { return CYPoolUTF8String(pool, CYCastUTF16String(value)); } @@ -416,8 +420,7 @@ _visible void CYGarbageCollect(JSContextRef context) { static JSValueRef Cycript_compile_callAsFunction(JSContextRef context, JSObjectRef object, JSObjectRef _this, size_t count, const JSValueRef arguments[], JSValueRef *exception) { CYTry { CYPool pool; CYUTF8String before(CYPoolUTF8String(pool, context, CYJSString(context, arguments[0]))); - std::stringbuf value(std::string(before.data, before.size)); - CYUTF8String after(CYPoolCode(pool, value)); + CYUTF8String after(CYPoolCode(pool, before)); return CYCastJSValue(context, CYJSString(after)); } CYCatch_(NULL, "SyntaxError") } @@ -1465,8 +1468,12 @@ static JSValueRef Type_callAsFunction_arrayOf(JSContextRef context, JSObjectRef } CYCatch(NULL) } static JSValueRef Type_callAsFunction_blockWith(JSContextRef context, JSObjectRef object, JSObjectRef _this, size_t count, const JSValueRef arguments[], JSValueRef *exception) { +#ifdef CY_OBJECTIVEC sig::Block type; return Type_callAsFunction_$With(context, object, _this, count, arguments, type, exception); +#else + _assert(false); +#endif } static JSValueRef Type_callAsFunction_constant(JSContextRef context, JSObjectRef object, JSObjectRef _this, size_t count, const JSValueRef arguments[], JSValueRef *exception) { CYTry { @@ -1857,18 +1864,22 @@ class ExecutionHandle { } }; +#ifndef __ANDROID__ static volatile bool cancel_; static bool CYShouldTerminate(JSContextRef context, void *arg) { return cancel_; } +#endif _visible const char *CYExecute(JSContextRef context, CYPool &pool, CYUTF8String code) { ExecutionHandle handle(context); +#ifndef __ANDROID__ cancel_ = false; if (&JSContextGroupSetExecutionTimeLimit != NULL) JSContextGroupSetExecutionTimeLimit(JSContextGetGroup(context), 0.5, &CYShouldTerminate, NULL); +#endif try { JSValueRef result(_jsccall(JSEvaluateScript, context, CYJSString(code), NULL, NULL, 0)); @@ -1885,9 +1896,11 @@ _visible const char *CYExecute(JSContextRef context, CYPool &pool, CYUTF8String } } +#ifndef __ANDROID__ _visible void CYCancel() { cancel_ = true; } +#endif const char *CYPoolLibraryPath(CYPool &pool); @@ -2054,7 +2067,8 @@ const char *CYPoolLibraryPath(CYPool &pool) { char *lib(pool.strdup(addr.dli_fname)); char *slash(strrchr(lib, '/')); - _assert(slash != NULL); + if (slash == NULL) + return "."; *slash = '\0'; slash = strrchr(lib, '/');