X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/b3378a02d0a811be38e530933fb9a57a3012a823..d3b63265874c492a4128f93fe55d568ef7d7aa2c:/Execute.cpp diff --git a/Execute.cpp b/Execute.cpp index c6a5a99..f8b70e5 100644 --- a/Execute.cpp +++ b/Execute.cpp @@ -1,5 +1,5 @@ /* Cycript - Optimizing JavaScript Compiler/Runtime - * Copyright (C) 2009-2010 Jay Freeman (saurik) + * Copyright (C) 2009-2012 Jay Freeman (saurik) */ /* GNU Lesser General Public License, Version 3 {{{ */ @@ -695,6 +695,15 @@ Closure_privateData *CYMakeFunctor_(JSContextRef context, JSObjectRef function, // XXX: in point of fact, this may /need/ to leak :( Closure_privateData *internal(new Closure_privateData(context, function, type)); +#if defined(__APPLE__) && defined(__arm__) + void *executable; + ffi_closure *writable(reinterpret_cast(ffi_closure_alloc(sizeof(ffi_closure), &executable))); + + ffi_status status(ffi_prep_closure_loc(writable, &internal->cif_, callback, internal, executable)); + _assert(status == FFI_OK); + + internal->value_ = executable; +#else ffi_closure *closure((ffi_closure *) _syscall(mmap( NULL, sizeof(ffi_closure), PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, @@ -707,6 +716,7 @@ Closure_privateData *CYMakeFunctor_(JSContextRef context, JSObjectRef function, _syscall(mprotect(closure, sizeof(*closure), PROT_READ | PROT_EXEC)); internal->value_ = closure; +#endif return internal; } @@ -944,17 +954,17 @@ static void *CYCastSymbol(const char *name) { static JSValueRef All_getProperty(JSContextRef context, JSObjectRef object, JSStringRef property, JSValueRef *exception) { CYTry { JSObjectRef global(CYGetGlobalObject(context)); JSObjectRef cycript(CYCastJSObject(context, CYGetProperty(context, global, CYJSString("Cycript")))); - if (JSValueRef value = CYGetProperty(context, cycript, property)) - if (!JSValueIsUndefined(context, value)) - return value; + JSObjectRef alls(CYCastJSObject(context, CYGetProperty(context, cycript, CYJSString("alls")))); + + for (size_t i(0), count(CYArrayLength(context, alls)); i != count; ++i) + if (JSObjectRef space = CYCastJSObject(context, CYArrayGet(context, alls, count - i - 1))) + if (JSValueRef value = CYGetProperty(context, space, property)) + if (!JSValueIsUndefined(context, value)) + return value; CYPool pool; CYUTF8String name(CYPoolUTF8String(pool, context, property)); - if (hooks_ != NULL && hooks_->RuntimeProperty != NULL) - if (JSValueRef value = (*hooks_->RuntimeProperty)(context, name)) - return value; - size_t length(name.size); char keyed[length + 2]; memcpy(keyed + 1, name.data, length + 1); @@ -993,9 +1003,23 @@ static JSValueRef All_getProperty(JSContextRef context, JSObjectRef object, JSSt return NULL; } CYCatch } +static void All_getPropertyNames(JSContextRef context, JSObjectRef object, JSPropertyNameAccumulatorRef names) { + JSObjectRef global(CYGetGlobalObject(context)); + JSObjectRef cycript(CYCastJSObject(context, CYGetProperty(context, global, CYJSString("Cycript")))); + JSObjectRef alls(CYCastJSObject(context, CYGetProperty(context, cycript, CYJSString("alls")))); + + for (size_t i(0), count(CYArrayLength(context, alls)); i != count; ++i) + if (JSObjectRef space = CYCastJSObject(context, CYArrayGet(context, alls, count - i - 1))) { + JSPropertyNameArrayRef subset(JSObjectCopyPropertyNames(context, space)); + for (size_t index(0), count(JSPropertyNameArrayGetCount(subset)); index != count; ++index) + JSPropertyNameAccumulatorAddName(names, JSPropertyNameArrayGetNameAtIndex(subset, index)); + JSPropertyNameArrayRelease(subset); + } +} + static JSObjectRef Pointer_new(JSContextRef context, JSObjectRef object, size_t count, const JSValueRef arguments[], JSValueRef *exception) { CYTry { if (count != 2) - throw CYJSError(context, "incorrect number of arguments to Functor constructor"); + throw CYJSError(context, "incorrect number of arguments to Pointer constructor"); CYPool pool; @@ -1111,6 +1135,16 @@ static JSValueRef Pointer_callAsFunction_toCYON(JSContextRef context, JSObjectRe } } CYCatch } +static JSValueRef Type_getProperty_alignment(JSContextRef context, JSObjectRef object, JSStringRef property, JSValueRef *exception) { + Type_privateData *internal(reinterpret_cast(JSObjectGetPrivate(object))); + return CYCastJSValue(context, internal->GetFFI()->alignment); +} + +static JSValueRef Type_getProperty_size(JSContextRef context, JSObjectRef object, JSStringRef property, JSValueRef *exception) { + Type_privateData *internal(reinterpret_cast(JSObjectGetPrivate(object))); + return CYCastJSValue(context, internal->GetFFI()->size); +} + static JSValueRef Type_callAsFunction_toString(JSContextRef context, JSObjectRef object, JSObjectRef _this, size_t count, const JSValueRef arguments[], JSValueRef *exception) { CYTry { Type_privateData *internal(reinterpret_cast(JSObjectGetPrivate(_this))); CYPool pool; @@ -1159,6 +1193,12 @@ namespace cy { JSStaticFunction const * const Functor::StaticFunctions = Functor_staticFunctions; } +static JSStaticValue Type_staticValues[3] = { + {"alignment", &Type_getProperty_alignment, NULL, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontEnum | kJSPropertyAttributeDontDelete}, + {"size", &Type_getProperty_size, NULL, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontEnum | kJSPropertyAttributeDontDelete}, + {NULL, NULL, NULL, 0} +}; + static JSStaticFunction Type_staticFunctions[4] = { {"toCYON", &Type_callAsFunction_toCYON, kJSPropertyAttributeDontEnum | kJSPropertyAttributeDontDelete}, {"toJSON", &Type_callAsFunction_toJSON, kJSPropertyAttributeDontEnum | kJSPropertyAttributeDontDelete}, @@ -1211,10 +1251,8 @@ const char *CYExecute(apr_pool_t *pool, CYUTF8String code) { return error; } - if (exception != NULL) { error: - result = exception; - exception = NULL; - } + if (exception != NULL) error: + return CYPoolCString(pool, context, CYJSString(context, exception)); if (JSValueIsUndefined(context, result)) return NULL; @@ -1255,6 +1293,7 @@ void CYInitializeDynamic() { definition = kJSClassDefinitionEmpty; definition.className = "All"; definition.getProperty = &All_getProperty; + definition.getPropertyNames = &All_getPropertyNames; All_ = JSClassCreate(&definition); definition = kJSClassDefinitionEmpty; @@ -1288,6 +1327,7 @@ void CYInitializeDynamic() { definition = kJSClassDefinitionEmpty; definition.className = "Type"; + definition.staticValues = Type_staticValues; definition.staticFunctions = Type_staticFunctions; definition.getProperty = &Type_getProperty; definition.callAsFunction = &Type_callAsFunction; @@ -1369,6 +1409,8 @@ JSGlobalContextRef CYGetJSContext(JSContextRef context) { } extern "C" void CYSetupContext(JSGlobalContextRef context) { + JSValueRef exception(NULL); + CYInitializeDynamic(); JSObjectRef global(CYGetGlobalObject(context)); @@ -1422,6 +1464,10 @@ extern "C" void CYSetupContext(JSGlobalContextRef context) { JSObjectRef all(JSObjectMake(context, All_, NULL)); CYSetProperty(context, cycript, CYJSString("all"), all); + JSObjectRef alls(JSObjectCallAsConstructor(context, Array, 0, NULL, &exception)); + CYThrow(context, exception); + CYSetProperty(context, cycript, CYJSString("alls"), alls); + if (true) { JSObjectRef last(NULL), curr(global); @@ -1449,6 +1495,8 @@ extern "C" void CYSetupContext(JSGlobalContextRef context) { if (hooks_ != NULL && hooks_->SetupContext != NULL) (*hooks_->SetupContext)(context); + + CYArrayPush(context, alls, cycript); } JSGlobalContextRef CYGetJSContext() {