X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/c1d3e52e58e86c49f9d04e06ae8e0ece4b98250c..a703494adeea8b4b225e7bb58eacf94e7f881d01:/ObjectiveC/Library.mm diff --git a/ObjectiveC/Library.mm b/ObjectiveC/Library.mm index ee1f5bf..dccc3ad 100644 --- a/ObjectiveC/Library.mm +++ b/ObjectiveC/Library.mm @@ -159,7 +159,7 @@ const char *CYPoolCString(CYPool &pool, JSContextRef context, NSString *value) { return string; } -#ifdef __APPLE__ +#ifdef __clang__ JSStringRef CYCopyJSString(JSContextRef context, NSString *value) { return JSStringCreateWithCFString(reinterpret_cast(value)); } @@ -170,7 +170,7 @@ JSStringRef CYCopyJSString(JSContextRef context, NSObject *value) { return NULL; // XXX: this definition scares me; is anyone using this?! NSString *string([value description]); -#ifdef __APPLE__ +#ifdef __clang__ return CYCopyJSString(context, string); #else CYPool pool; @@ -644,10 +644,6 @@ static JSValueRef BlockAdapter_(JSContextRef context, size_t count, JSValueRef v return CYCallAsFunction(context, function, _this, count - 1, values + 1); } -static void BlockClosure_(ffi_cif *cif, void *result, void **arguments, void *arg) { - CYExecuteClosure(cif, result, arguments, arg, &BlockAdapter_); -} - NSBlock *CYMakeBlock(JSContextRef context, JSObjectRef function, sig::Signature &signature) { _assert(__NSMallocBlock__ != Nil); BlockLiteral *literal(reinterpret_cast(malloc(sizeof(BlockLiteral)))); @@ -655,7 +651,7 @@ NSBlock *CYMakeBlock(JSContextRef context, JSObjectRef function, sig::Signature CYBlockDescriptor *descriptor(new CYBlockDescriptor); memset(&descriptor->d_, 0, sizeof(descriptor->d_)); - descriptor->internal_ = CYMakeFunctor_(context, function, signature, &BlockClosure_); + descriptor->internal_ = CYMakeFunctor_(context, function, signature, &BlockAdapter_); literal->invoke = reinterpret_cast(descriptor->internal_->GetValue()); literal->isa = __NSMallocBlock__; @@ -767,7 +763,7 @@ NSObject *CYCopyNSObject(CYPool &pool, JSContextRef context, JSValueRef value) { [json appendString:@"@["]; bool comma(false); -#ifdef __APPLE__ +#ifdef __clang__ for (id object in self) { #else for (size_t index(0), count([self count]); index != count; ++index) { @@ -877,7 +873,7 @@ NSObject *CYCopyNSObject(CYPool &pool, JSContextRef context, JSValueRef value) { [json appendString:@"@{"]; bool comma(false); -#ifdef __APPLE__ +#ifdef __clang__ for (NSObject *key in self) { #else NSEnumerator *keys([self keyEnumerator]); @@ -908,7 +904,7 @@ NSObject *CYCopyNSObject(CYPool &pool, JSContextRef context, JSValueRef value) { - (void) cy$getPropertyNames:(JSPropertyNameAccumulatorRef)names inContext:(JSContextRef)context { [super cy$getPropertyNames:names inContext:context]; -#ifdef __APPLE__ +#ifdef __clang__ for (NSObject *key in self) { #else NSEnumerator *keys([self keyEnumerator]); @@ -1087,6 +1083,21 @@ NSObject *CYCopyNSObject(CYPool &pool, JSContextRef context, JSValueRef value) { return true; } +@end +/* }}} */ +/* Bridge: NSOrderedSet {{{ */ +@implementation NSOrderedSet (Cycript) + +- (NSString *) cy$toCYON:(bool)objective inSet:(std::set &)objects { + _oassert(objects.insert(self).second); + + NSMutableString *json([[[NSMutableString alloc] init] autorelease]); + [json appendString:@"[NSOrderedSet orderedSetWithArray:"]; + [json appendString:CYCastNSCYON([self array], true, objects)]; + [json appendString:@"]]"]; + return json; +} + @end /* }}} */ /* Bridge: NSProxy {{{ */ @@ -1454,8 +1465,8 @@ void CYObjectiveC_ExecuteEnd(JSContextRef context, void *handle) { CYSadTry { return [(NSAutoreleasePool *) handle release]; } CYSadCatch() } -static void CYObjectiveC_CallFunction(JSContextRef context, ffi_cif *cif, void (*function)(), uint8_t *value, void **values) { CYSadTry { - ffi_call(cif, function, value, values); +static void CYObjectiveC_CallFunction(CYPool &pool, JSContextRef context, ffi_cif *cif, void (*function)(), void *value, void **values) { CYSadTry { + CYCallFunction(pool, context, cif, function, value, values); } CYSadCatch() } #ifdef __APPLE__ @@ -1581,10 +1592,6 @@ static JSValueRef MessageAdapter_(JSContextRef context, size_t count, JSValueRef return CYCallAsFunction(context, function, _this, count - 2, values + 2); } -static void MessageClosure_(ffi_cif *cif, void *result, void **arguments, void *arg) { - CYExecuteClosure(cif, result, arguments, arg, &MessageAdapter_); -} - static JSObjectRef CYMakeMessage(JSContextRef context, SEL sel, IMP imp, const char *type) { Message_privateData *internal(new Message_privateData(sel, type, imp)); return JSObjectMake(context, Message_, internal); @@ -1595,7 +1602,7 @@ static IMP CYMakeMessage(JSContextRef context, JSValueRef value, const char *enc CYPool pool; sig::Signature signature; sig::Parse(pool, &signature, encoding, &Structor_); - Closure_privateData *internal(CYMakeFunctor_(context, function, signature, &MessageClosure_)); + Closure_privateData *internal(CYMakeFunctor_(context, function, signature, &MessageAdapter_)); // XXX: see notes in Library.cpp about needing to leak return reinterpret_cast(internal->GetValue()); } @@ -2255,7 +2262,7 @@ static JSValueRef choose(JSContextRef context, JSObjectRef object, JSObjectRef _ CYGarbageCollect(context); CYPool pool; - Class _class(CYCastNSObject(&pool, context, arguments[0])); + id _class(CYCastNSObject(&pool, context, arguments[0])); vm_address_t *zones(NULL); unsigned size(0);