X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/7341eedbaf526ef2f0986b576c656906050e270a..95be164556de14834c2040ac7bea1632b63e5764:/sig/parse.cpp diff --git a/sig/parse.cpp b/sig/parse.cpp index 8eb0818..b2931ef 100644 --- a/sig/parse.cpp +++ b/sig/parse.cpp @@ -91,7 +91,10 @@ Type *Parse_(CYPool &pool, const char **encoding, char eos, bool named, Callback 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); @@ -99,6 +102,8 @@ Type *Parse_(CYPool &pool, const char **encoding, char eos, bool named, Callback goto aggregate; case '*': type = new(pool) String(); break; + +#ifdef CY_OBJECTIVEC case ':': type = new(pool) Selector(); break; case '@': { @@ -128,6 +133,7 @@ Type *Parse_(CYPool &pool, const char **encoding, char eos, bool named, Callback } } break; +#endif case 'B': type = new(pool) Primitive(); break; case 'C': type = new(pool) Primitive(); break; @@ -151,10 +157,12 @@ Type *Parse_(CYPool &pool, const char **encoding, char eos, bool named, Callback _assert(false); // XXX: why is this here?!? else { type = Parse_(pool, encoding, eos, named, callback); +#ifdef CY_OBJECTIVEC Aggregate *aggregate(dynamic_cast(type)); if (aggregate != NULL && strcmp(aggregate->name, "_objc_class") == 0) type = new(pool) Meta(); else +#endif type = new(pool) Pointer(*type); } break; @@ -172,6 +180,11 @@ Type *Parse_(CYPool &pool, const char **encoding, char eos, bool named, Callback case 's': type = new(pool) Primitive(); break; case 'v': type = new(pool) Void(); break; +#ifdef __SIZEOF_INT128__ + case 't': type = new(pool) Primitive(); break; + case 'T': type = new(pool) Primitive(); break; +#endif + case '{': type = new(pool) Aggregate(false); next = '}'; @@ -274,6 +287,13 @@ const char *Primitive::Encode(CYPool &pool) const { return "i"; } +#ifdef __SIZEOF_INT128__ +template <> +const char *Primitive::Encode(CYPool &pool) const { + return "t"; +} +#endif + template <> const char *Primitive::Encode(CYPool &pool) const { return "l"; @@ -299,6 +319,13 @@ const char *Primitive::Encode(CYPool &pool) const { return "I"; } +#ifdef __SIZEOF_INT128__ +template <> +const char *Primitive::Encode(CYPool &pool) const { + return "T"; +} +#endif + template <> const char *Primitive::Encode(CYPool &pool) const { return "L"; @@ -326,6 +353,7 @@ const char *String::Encode(CYPool &pool) const { return "*"; } +#ifdef CY_OBJECTIVEC const char *Meta::Encode(CYPool &pool) const { return "#"; } @@ -333,6 +361,7 @@ const char *Meta::Encode(CYPool &pool) const { const char *Selector::Encode(CYPool &pool) const { return ":"; } +#endif const char *Bits::Encode(CYPool &pool) const { return pool.strcat("b", pool.itoa(size), NULL); @@ -346,9 +375,15 @@ const char *Array::Encode(CYPool &pool) const { 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 *Enum::Encode(CYPool &pool) const { + return type.Encode(pool); +} const char *Aggregate::Encode(CYPool &pool) const { return pool.strcat(overlap ? "(" : "{", name == NULL ? "?" : name, "=", Unparse(pool, &signature), overlap ? ")" : "}", NULL); @@ -358,9 +393,11 @@ const char *Function::Encode(CYPool &pool) const { 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));