X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/9a39f7051ad983d4377917e66222727dcbe6c099..674115e8e5e4afdcbb67ef088efb2c88612a8839:/sig/parse.cpp?ds=inline diff --git a/sig/parse.cpp b/sig/parse.cpp index da590a8..3a8a7af 100644 --- a/sig/parse.cpp +++ b/sig/parse.cpp @@ -84,8 +84,6 @@ void Parse_(CYPool &pool, struct Signature *signature, const char **name, char e Type *Parse_(CYPool &pool, const char **name, char eos, bool named, Callback callback) { char next = *(*name)++; - if (next == '?') - return NULL; Type *type(new(pool) Type()); _assert(type != NULL); @@ -93,6 +91,7 @@ Type *Parse_(CYPool &pool, const char **name, char eos, bool named, Callback cal parse: switch (next) { + case '?': type->primitive = unknown_P; break; case '#': type->primitive = typename_P; break; case '(': @@ -149,14 +148,11 @@ Type *Parse_(CYPool &pool, const char **name, char eos, bool named, Callback cal case '^': type->primitive = pointer_P; - if (**name == '"') { + if (**name == '"') + // XXX: why is this here? type->data.data.type = NULL; - } else { + else type->data.data.type = Parse_(pool, name, eos, named, callback); - sig::Type *&target(type->data.data.type); - if (target != NULL && target->primitive == void_P) - target = NULL; - } break; case 'b': @@ -261,6 +257,7 @@ const char *Unparse_(CYPool &pool, struct Type *type) { return pool.strdup(out.str().c_str()); } break; + case unknown_P: return "?"; case typename_P: return "#"; case union_P: return pool.strcat("(", Unparse(pool, &type->data.signature), ")", NULL); case string_P: return "*"; @@ -280,9 +277,9 @@ const char *Unparse_(CYPool &pool, struct Type *type) { } break; case pointer_P: { - if (type->data.data.type == NULL) - return "^v"; - else if (type->data.data.type->primitive == function_P) + // XXX: protect against the weird '"' check in Parse_ + _assert(type->data.data.type != NULL); + if (type->data.data.type->primitive == function_P) return "^?"; else return pool.strcat("^", Unparse(pool, type->data.data.type), NULL);