/* Cycript - Optimizing JavaScript Compiler/Runtime
- * Copyright (C) 2009-2013 Jay Freeman (saurik)
+ * Copyright (C) 2009-2014 Jay Freeman (saurik)
*/
-/* GNU General Public License, Version 3 {{{ */
+/* GNU Affero General Public License, Version 3 {{{ */
/*
- * Cycript is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published
- * by the Free Software Foundation, either version 3 of the License,
- * or (at your option) any later version.
- *
- * Cycript is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Cycript. If not, see <http://www.gnu.org/licenses/>.
+ * GNU Affero General Public License for more details.
+
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
**/
/* }}} */
static Class NSCFType_;
static Class NSGenericDeallocHandler_;
static Class NSZombie_;
-
-static std::set<Class> banned_;
#else
static Class NSBoolNumber_;
#endif
Class _class(object_getClass(value));
SEL sel(@selector(cy$toCYON:inSet:));
- if (objc_method *toCYON = class_getInstanceMethod(_class, sel))
+ if (class_isMetaClass(_class)) {
+ const char *name(class_getName(value));
+ if (class_isMetaClass(value))
+ string = [NSString stringWithFormat:@"object_getClass(%s)", name];
+ else
+ string = [NSString stringWithUTF8String:name];
+ } else if (objc_method *toCYON = class_getInstanceMethod(_class, sel))
string = reinterpret_cast<NSString *(*)(id, SEL, bool, std::set<void *> &)>(method_getImplementation(toCYON))(value, sel, objective, objects);
else if (objc_method *methodSignatureForSelector = class_getInstanceMethod(_class, @selector(methodSignatureForSelector:))) {
if (reinterpret_cast<NSMethodSignature *(*)(id, SEL, SEL)>(method_getImplementation(methodSignatureForSelector))(value, @selector(methodSignatureForSelector:), sel) != nil)
} else fail: {
if (false);
#ifdef __APPLE__
- else if (value == NSZombie_)
- string = @"_NSZombie_";
else if (_class == NSZombie_)
string = [NSString stringWithFormat:@"<_NSZombie_: %p>", value];
- // XXX: frowny /in/ the pants
- else if (banned_.find(value) != banned_.end())
- string = nil;
#endif
else
string = [NSString stringWithFormat:@"%@", value];
uintptr_t mask((1 << length) - 1);
return CYCastJSValue(context, (field >> shift) & mask);
} else {
- Type_privateData type(pool, ivar_getTypeEncoding(ivar));
- return CYFromFFI(context, type.type_, type.GetFFI(), data);
+ auto type(new(pool) Type_privateData(ivar_getTypeEncoding(ivar)));
+ return CYFromFFI(context, type->type_, type->GetFFI(), data);
}
}
uintptr_t mask((1 << length) - 1);
field = field & ~(mask << shift) | (uintptr_t(CYCastDouble(context, value)) & mask) << shift;
} else {
- Type_privateData type(pool, ivar_getTypeEncoding(ivar));
- CYPoolFFI(&pool, context, type.type_, type.GetFFI(), reinterpret_cast<uint8_t *>(self) + ivar_getOffset(ivar), value);
+ auto type(new(pool) Type_privateData(ivar_getTypeEncoding(ivar)));
+ CYPoolFFI(&pool, context, type->type_, type->GetFFI(), reinterpret_cast<uint8_t *>(self) + ivar_getOffset(ivar), value);
return true;
}
}
if (!CYIsClass(value))
CYThrow("non-Class object cannot be used as Type");
- // XXX: this is a very silly implementation
-
- std::ostringstream type;
- type << "@\"";
- type << class_getName(value);
- type << "\"";
-
- CYPoolTry {
- return CYMakeType(context, type.str().c_str());
- } CYPoolCatch(NULL)
+ sig::Type type;
+ memset(&type, 0, sizeof(type));
+ type.primitive = sig::object_P;
+ type.name = class_getName(value);
+ return CYMakeType(context, &type);
} CYCatch(NULL) return /*XXX*/ NULL; }
static JSValueRef Selector_callAsFunction_toString(JSContextRef context, JSObjectRef object, JSObjectRef _this, size_t count, const JSValueRef arguments[], JSValueRef *exception) { CYTry {
CYPool &pool(CYGetGlobalPool());
- Object_type = new(pool) Type_privateData("@");
- Selector_type = new(pool) Type_privateData(":");
+ Object_type = new(pool) Type_privateData(sig::object_P);
+ Selector_type = new(pool) Type_privateData(sig::selector_P);
NSArray_ = objc_getClass("NSArray");
NSBlock_ = objc_getClass("NSBlock");
NSCFType_ = objc_getClass("NSCFType");
NSZombie_ = objc_getClass("_NSZombie_");
-
- banned_.insert(Object_);
- banned_.insert(objc_getClass("__NSAtom"));
- banned_.insert(objc_getClass("__NSGenericDeallocHandler"));
- banned_.insert(objc_getClass("NSMessageBuilder"));
- banned_.insert(objc_getClass("__NSMessageBuilder"));
#else
NSBoolNumber_ = objc_getClass("NSBoolNumber");
#endif
CYSetPrototype(context, CYCastJSObject(context, CYGetProperty(context, Selector, prototype_s)), Function_prototype);
} CYPoolCatch() }
-static CYHooks CYObjectiveCHooks = {
+static CYHook CYObjectiveCHook = {
&CYObjectiveC_ExecuteStart,
&CYObjectiveC_ExecuteEnd,
&CYObjectiveC_CallFunction,
&CYObjectiveC_FromFFI,
};
-struct CYObjectiveC {
- CYObjectiveC() {
- hooks_ = &CYObjectiveCHooks;
- // XXX: evil magic juju to make this actually take effect on a Mac when compiled with autoconf/libtool doom!
- _assert(hooks_ != NULL);
- }
-} CYObjectiveC;
+CYRegisterHook CYObjectiveC(&CYObjectiveCHook);
extern "C" void CydgetSetupContext(JSGlobalContextRef context) { CYObjectiveTry_ {
CYSetupContext(context);