From: Jay Freeman (saurik) Date: Sun, 26 Jan 2014 22:12:18 +0000 (-0800) Subject: Attempt to load a framework when no module found. X-Git-Tag: v0.9.501~5 X-Git-Url: https://git.saurik.com/cycript.git/commitdiff_plain/3f7f8d1112c3bdfd3cb684a0497e789bc352d7c7 Attempt to load a framework when no module found. --- diff --git a/Execute.cpp b/Execute.cpp index b0c8aac..a145ee0 100644 --- a/Execute.cpp +++ b/Execute.cpp @@ -1685,8 +1685,9 @@ JSGlobalContextRef CYGetJSContext(JSContextRef context) { extern "C" bool CydgetMemoryParse(const uint16_t **data, size_t *size); void *CYMapFile(const char *path, size_t *psize) { - int fd; - _syscall(fd = open(path, O_RDONLY)); + int fd(_syscall_(open(path, O_RDONLY), 1, {ENOENT})); + if (fd == -1) + return NULL; struct stat stat; _syscall(fstat(fd, &stat)); @@ -1716,7 +1717,9 @@ static JSValueRef require(JSContextRef context, JSObjectRef object, JSObjectRef CYJSString property("exports"); JSObjectRef module; - const char *path(pool.strcat(lib, "/cycript0.9/", CYPoolCString(pool, context, arguments[0]), ".cy", NULL)); + const char *name(CYPoolCString(pool, context, arguments[0])); + const char *path(pool.strcat(lib, "/cycript0.9/", name, ".cy", NULL)); + CYJSString key(path); JSObjectRef modules(CYGetCachedObject(context, CYJSString("modules"))); JSValueRef cache(CYGetProperty(context, modules, key)); @@ -1727,6 +1730,16 @@ static JSValueRef require(JSContextRef context, JSObjectRef object, JSObjectRef CYUTF8String code; code.data = reinterpret_cast(CYMapFile(path, &code.size)); + if (code.data == NULL) { + if (strchr(name, '/') == NULL && ( + dlopen(pool.strcat("/System/Library/Frameworks/", name, ".framework/", name, NULL), RTLD_LAZY | RTLD_GLOBAL) != NULL || + dlopen(pool.strcat("/System/Library/PrivateFrameworks/", name, ".framework/", name, NULL), RTLD_LAZY | RTLD_GLOBAL) != NULL || + false)) + return CYJSUndefined(NULL); + + CYThrow("Can't find module: %s", name); + } + module = JSObjectMake(context, NULL, NULL); CYSetProperty(context, modules, key, module);