X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/f33b048af6516bdeff373d3eb709f3d445233dc4..697d6fd2b2bf66a1f0bf1f28de0ced96fc14cbfc:/sig/parse.cpp diff --git a/sig/parse.cpp b/sig/parse.cpp index 1c0ec23..57e5a10 100644 --- a/sig/parse.cpp +++ b/sig/parse.cpp @@ -43,7 +43,7 @@ #include "minimal/stdlib.h" -#include +#include #include @@ -118,7 +118,10 @@ struct Type *Parse_(apr_pool_t *pool, const char **name, char eos, bool named, C case '#': type->primitive = typename_P; break; case '(': - type->primitive = union_P; + if (type->data.signature.count < 2) + type->primitive = struct_P; + else + type->primitive = union_P; next = ')'; goto aggregate; @@ -157,13 +160,13 @@ struct Type *Parse_(apr_pool_t *pool, const char **name, char eos, bool named, C case '^': type->primitive = pointer_P; - if (**name == 'v') { - type->data.data.type = NULL; - ++*name; - } else if (**name == '"') { + if (**name == '"') { type->data.data.type = NULL; } 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; @@ -275,7 +278,7 @@ const char *Unparse(apr_pool_t *pool, struct Type *type) { return apr_psprintf(pool, "[%lu%s]", type->data.data.size, value); } break; - case pointer_P: return apr_psprintf(pool, "^%s", type->data.data.type == NULL ? "" : Unparse(pool, type->data.data.type)); + case pointer_P: return apr_psprintf(pool, "^%s", type->data.data.type == NULL ? "v" : Unparse(pool, type->data.data.type)); case bit_P: return apr_psprintf(pool, "b%zu", type->data.data.size); case char_P: return "c"; case double_P: return "d";