JSValueRef prototype;
if (self == NSArray_)
- prototype = CYGetCachedObject(context, CYJSString("Array_prototype"));
+ prototype = CYGetCachedObject(context, CYJSString("ArrayInstance_prototype"));
else if (self == NSDictionary_)
- prototype = CYGetCachedObject(context, CYJSString("Object_prototype"));
+ prototype = CYGetCachedObject(context, CYJSString("ObjectInstance_prototype"));
else if (self == NSString_)
prototype = CYGetCachedObject(context, CYJSString("StringInstance_prototype"));
else
@end
@protocol Cycript
+- (id) cy$box;
- (JSValueRef) cy$JSValueInContext:(JSContextRef)context;
@end
/* Bridge: NSArray {{{ */
@implementation NSArray (Cycript)
+- (id) cy$box {
+ return [[self mutableCopy] autorelease];
+}
+
- (NSString *) cy$toCYON {
NSMutableString *json([[[NSMutableString alloc] init] autorelease]);
[json appendString:@"@["];
/* Bridge: NSDictionary {{{ */
@implementation NSDictionary (Cycript)
+- (id) cy$box {
+ return [[self mutableCopy] autorelease];
+}
+
- (NSString *) cy$toCYON {
NSMutableString *json([[[NSMutableString alloc] init] autorelease]);
[json appendString:@"@{"];
/* Bridge: NSObject {{{ */
@implementation NSObject (Cycript)
+- (id) cy$box {
+ return self;
+}
+
- (JSValueRef) cy$JSValueInContext:(JSContextRef)context { CYObjectiveTry_(context) {
return NULL;
} CYObjectiveCatch }
/* Bridge: NSString {{{ */
@implementation NSString (Cycript)
+- (id) cy$box {
+ return [[self copy] autorelease];
+}
+
- (JSType) cy$JSType {
return kJSTypeString;
}
@implementation CYJSArray
+- (NSString *) cy$toCYON {
+ CYPool pool;
+ return [NSString stringWithUTF8String:CYPoolCCYON(pool, context_, object_)];
+}
+
- (id) initWithJSObject:(JSObjectRef)object inContext:(JSContextRef)context { CYObjectiveTry {
if ((self = [super init]) != nil) {
object_ = object;
return false;
} CYCatch }
+static JSValueRef Instance_box_callAsFunction(JSContextRef context, JSObjectRef object, JSObjectRef _this, size_t count, const JSValueRef arguments[], JSValueRef *exception) { CYTry {
+ if (count == 0)
+ throw CYJSError(context, "incorrect number of arguments to Instance");
+ CYPool pool;
+ id value(CYCastNSObject(pool, context, arguments[0]));
+ if (value == nil)
+ value = [NSNull null];
+ return CYCastJSValue(context, [value cy$box]);
+} CYCatch }
+
static bool Internal_hasProperty(JSContextRef context, JSObjectRef object, JSStringRef property) {
Internal *internal(reinterpret_cast<Internal *>(JSObjectGetPrivate(object)));
CYPool pool;
sig::Signature signature;
sig::Parse(pool, &signature, type, &Structor_);
+ size_t used(count + 3);
+ if (used > signature.count) {
+ sig::Element *elements(new (pool) sig::Element[used]);
+ memcpy(elements, signature.elements, used * sizeof(sig::Element));
+
+ for (size_t index(signature.count); index != used; ++index) {
+ sig::Element *element(&elements[index]);
+ element->name = NULL;
+ element->offset = _not(size_t);
+
+ sig::Type *type(new (pool) sig::Type);
+ memset(type, 0, sizeof(*type));
+ type->primitive = sig::object_P;
+ element->type = type;
+ }
+
+ signature.elements = elements;
+ signature.count = used;
+ }
+
ffi_cif cif;
sig::sig_ffi_cif(pool, &sig::ObjectiveC, &signature, &cif);
return NULL;
Instance *internal(reinterpret_cast<Instance *>(JSObjectGetPrivate(_this)));
-
id value(internal->GetValue());
+
if (value == nil)
return CYCastJSValue(context, "nil");
CYPoolTry {
// XXX: this seems like a stupid implementation; what if it crashes? why not use the CYONifier backend?
- return CYCastJSValue(context, CYJSString(context, [internal->GetValue() description]));
+ return CYCastJSValue(context, CYJSString(context, [value description]));
} CYPoolCatch(NULL)
} CYCatch return /*XXX*/ NULL; }
JSObjectRef Instance(JSObjectMakeConstructor(context, Instance_, &Instance_new));
JSObjectRef Message(JSObjectMakeConstructor(context, Message_, NULL));
JSObjectRef Selector(JSObjectMakeConstructor(context, Selector_, &Selector_new));
- JSObjectRef StringInstance(JSObjectMakeConstructor(context, Instance_, NULL));
JSObjectRef Super(JSObjectMakeConstructor(context, Super_, &Super_new));
JSObjectRef Instance_prototype(CYCastJSObject(context, CYGetProperty(context, Instance, prototype_s)));
CYSetProperty(context, cy, CYJSString("Instance_prototype"), Instance_prototype);
+ JSObjectRef ArrayInstance(JSObjectMakeConstructor(context, Instance_, NULL));
+ JSObjectRef ArrayInstance_prototype(CYCastJSObject(context, CYGetProperty(context, ArrayInstance, prototype_s)));
+ CYSetProperty(context, cy, CYJSString("ArrayInstance_prototype"), ArrayInstance_prototype);
+ JSObjectRef Array_prototype(CYGetCachedObject(context, CYJSString("Array_prototype")));
+ JSObjectSetPrototype(context, ArrayInstance_prototype, Array_prototype);
+
+ JSObjectRef ObjectInstance(JSObjectMakeConstructor(context, Instance_, NULL));
+ JSObjectRef ObjectInstance_prototype(CYCastJSObject(context, CYGetProperty(context, ObjectInstance, prototype_s)));
+ CYSetProperty(context, cy, CYJSString("ObjectInstance_prototype"), ObjectInstance_prototype);
+ JSObjectRef Object_prototype(CYGetCachedObject(context, CYJSString("Object_prototype")));
+ JSObjectSetPrototype(context, ObjectInstance_prototype, Object_prototype);
+
+ JSObjectRef StringInstance(JSObjectMakeConstructor(context, Instance_, NULL));
JSObjectRef StringInstance_prototype(CYCastJSObject(context, CYGetProperty(context, StringInstance, prototype_s)));
CYSetProperty(context, cy, CYJSString("StringInstance_prototype"), StringInstance_prototype);
-
JSObjectRef String_prototype(CYGetCachedObject(context, CYJSString("String_prototype")));
JSObjectSetPrototype(context, StringInstance_prototype, String_prototype);
CYSetProperty(context, cycript, CYJSString("Selector"), Selector);
CYSetProperty(context, cycript, CYJSString("Super"), Super);
+ JSObjectRef box(JSObjectMakeFunctionWithCallback(context, CYJSString("box"), &Instance_box_callAsFunction));
+ CYSetProperty(context, Instance, CYJSString("box"), box);
+
#if defined(__APPLE__) && defined(__arm__) && 0
CYSetProperty(context, all, CYJSString("objc_registerClassPair"), &objc_registerClassPair_, kJSPropertyAttributeDontEnum);
#endif