CYTry {
NSString *name(CYCastNSString(pool, property));
- NSString *data(CYCastNSObject(pool, context, value));
+ NSObject *data(CYCastNSObject(pool, context, value));
CYPoolTry {
if ([self cy$setProperty:name to:data])
if (count != 1)
@throw [NSException exceptionWithName:NSInvalidArgumentException reason:@"incorrect number of arguments to objc_registerClassPair" userInfo:nil];
CYPool pool;
- Class _class(CYCastNSObject(pool, context, arguments[0]));
+ NSObject *value(CYCastNSObject(pool, context, arguments[0]));
+ if (value == NULL || !CYIsClass(value))
+ @throw [NSException exceptionWithName:NSInvalidArgumentException reason:@"incorrect number of arguments to objc_registerClassPair" userInfo:nil];
+ Class _class((Class) value);
$objc_registerClassPair(_class);
return CYJSUndefined(context);
} CYCatch
@throw [NSException exceptionWithName:NSInvalidArgumentException reason:@"incorrect number of arguments to Selector.type" userInfo:nil];
CYPool pool;
Selector_privateData *internal(reinterpret_cast<Selector_privateData *>(JSObjectGetPrivate(_this)));
- Class _class(CYCastNSObject(pool, context, arguments[0]));
- SEL sel(internal->GetValue());
- objc_method *method(class_getInstanceMethod(_class, sel));
- const char *type(CYPoolTypeEncoding(pool, _class, sel, method));
- return type == NULL ? CYJSNull(context) : CYCastJSValue(context, CYJSString(type));
+ NSObject *value(CYCastNSObject(pool, context, arguments[0]));
+ if (value == NULL) lookup:
+ // XXX: do a lookup of some kind
+ return CYJSNull(context);
+ else if (!CYIsClass(value))
+ @throw [NSException exceptionWithName:NSInvalidArgumentException reason:@"Selector.type takes a Class" userInfo:nil];
+ else {
+ Class _class((Class) value);
+ SEL sel(internal->GetValue());
+ if (objc_method *method = class_getInstanceMethod(_class, sel)) {
+ const char *type(CYPoolTypeEncoding(pool, _class, sel, method));
+ return type == NULL ? CYJSNull(context) : CYCastJSValue(context, CYJSString(type));
+ } else goto lookup;
+ }
} CYCatch
}