parse:
switch (next) {
case '?': type = new(pool) Unknown(); break;
+
+#ifdef CY_OBJECTIVEC
case '#': type = new(pool) Meta(); break;
+#endif
case '(':
type = new(pool) Aggregate(true);
goto aggregate;
case '*': type = new(pool) String(); break;
+
+#ifdef CY_OBJECTIVEC
case ':': type = new(pool) Selector(); break;
case '@': {
}
} break;
+#endif
case 'B': type = new(pool) Primitive<bool>(); break;
case 'C': type = new(pool) Primitive<unsigned char>(); break;
_assert(false); // XXX: why is this here?!?
else {
type = Parse_(pool, encoding, eos, named, callback);
+#ifdef CY_OBJECTIVEC
Aggregate *aggregate(dynamic_cast<Aggregate *>(type));
if (aggregate != NULL && strcmp(aggregate->name, "_objc_class") == 0)
type = new(pool) Meta();
else
+#endif
type = new(pool) Pointer(*type);
}
break;
return "*";
}
+#ifdef CY_OBJECTIVEC
const char *Meta::Encode(CYPool &pool) const {
return "#";
}
const char *Selector::Encode(CYPool &pool) const {
return ":";
}
+#endif
const char *Bits::Encode(CYPool &pool) const {
return pool.strcat("b", pool.itoa(size), NULL);
return pool.strcat("[", pool.itoa(size), type.Encode(pool), "]", NULL);
}
+#ifdef CY_OBJECTIVEC
const char *Object::Encode(CYPool &pool) const {
return name == NULL ? "@" : pool.strcat("@\"", name, "\"", NULL);
}
+#endif
const char *Aggregate::Encode(CYPool &pool) const {
return pool.strcat(overlap ? "(" : "{", name == NULL ? "?" : name, "=", Unparse(pool, &signature), overlap ? ")" : "}", NULL);
return "?";
}
+#ifdef CY_OBJECTIVEC
const char *Block::Encode(CYPool &pool) const {
return "@?";
}
+#endif
const char *Unparse(CYPool &pool, const struct Type *type) {
const char *base(type->Encode(pool));