X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/5587a93f98c158ab5e71c1f1c6b318690271d335..47f55bc70a0eef068c8a27ca0618a11c512dbf20:/Execute.cpp diff --git a/Execute.cpp b/Execute.cpp index 82ef815..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)); @@ -1724,15 +1727,25 @@ static JSValueRef require(JSContextRef context, JSObjectRef object, JSObjectRef if (!JSValueIsUndefined(context, cache)) module = CYCastJSObject(context, cache); else { + 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); JSObjectRef exports(JSObjectMake(context, NULL, NULL)); CYSetProperty(context, module, property, exports); - CYUTF8String code; - code.data = reinterpret_cast(CYMapFile(path, &code.size)); - std::stringstream wrap; wrap << "(function (exports, require, module) { " << code << "\n});"; code = CYPoolCode(pool, wrap);