/* Cycript - Optimizing JavaScript Compiler/Runtime
- * Copyright (C) 2009-2014 Jay Freeman (saurik)
+ * Copyright (C) 2009-2015 Jay Freeman (saurik)
*/
/* GNU Affero General Public License, Version 3 {{{ */
return string;
}
-#ifdef __APPLE__
+#ifdef __clang__
JSStringRef CYCopyJSString(JSContextRef context, NSString *value) {
return JSStringCreateWithCFString(reinterpret_cast<CFStringRef>(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;
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<BlockLiteral *>(malloc(sizeof(BlockLiteral))));
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<void (*)(void *, ...)>(descriptor->internal_->GetValue());
literal->isa = __NSMallocBlock__;
[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) {
[json appendString:@"@{"];
bool comma(false);
-#ifdef __APPLE__
+#ifdef __clang__
for (NSObject *key in self) {
#else
NSEnumerator *keys([self keyEnumerator]);
- (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]);
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__
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);
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<IMP>(internal->GetValue());
}
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);
imp = NULL;
CYPoolTry {
- NSMethodSignature *method([self methodSignatureForSelector:_cmd]);
- if (method == nil)
- throw CYJSError(context, "unrecognized selector %s sent to object %p", sel_getName(_cmd), self);
- type = CYPoolCString(pool, context, [method _typeString]);
+ if (NSMethodSignature *method = [self methodSignatureForSelector:_cmd])
+ type = CYPoolCString(pool, context, [method _typeString]);
+ else
+ type = NULL;
} CYPoolCatch(NULL)
+
+ if (type == NULL)
+ throw CYJSError(context, "unrecognized selector %s sent to object %p", sel_getName(_cmd), self);
}
void *setup[2];
CYSetPrototype(context, CYCastJSObject(context, CYGetProperty(context, Selector, prototype_s)), Function_prototype);
} CYPoolCatch() }
+static void *CYObjectiveC_CastSymbol(const char *name) {
+ if (false);
+#ifdef __GNU_LIBOBJC__
+ else if (strcmp(name, "object_getClass") == 0)
+ return reinterpret_cast<void *>(&object_getClass);
+#endif
+ return NULL;
+}
+
static CYHook CYObjectiveCHook = {
&CYObjectiveC_ExecuteStart,
&CYObjectiveC_ExecuteEnd,
&CYObjectiveC_SetupContext,
&CYObjectiveC_PoolFFI,
&CYObjectiveC_FromFFI,
+ &CYObjectiveC_CastSymbol,
};
CYRegisterHook CYObjectiveC(&CYObjectiveCHook);