X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/3fe283c53edc2a98d0164d893a4a667245da8e78..f6fa3c2112ee8b0aa26ab0765674601a9800db77:/Decode.cpp diff --git a/Decode.cpp b/Decode.cpp index e31b469..bdef46b 100644 --- a/Decode.cpp +++ b/Decode.cpp @@ -26,6 +26,8 @@ CYTypedIdentifier *Decode_(CYPool &pool, struct sig::Type *type) { switch (type->primitive) { + case sig::unknown_P: return $ CYTypedIdentifier($ CYTypeError()); + case sig::function_P: { _assert(type->data.signature.count != 0); CYTypedParameter *parameter(NULL); @@ -40,11 +42,14 @@ CYTypedIdentifier *Decode_(CYPool &pool, struct sig::Type *type) { case sig::selector_P: return $ CYTypedIdentifier($ CYTypeVariable("SEL")); case sig::block_P: { - _assert(type->data.signature.count != 0); - CYTypedParameter *parameter(NULL); - for (size_t i(type->data.signature.count - 1); i != 0; --i) - parameter = $ CYTypedParameter(Decode(pool, type->data.signature.elements[i].type), parameter); - return Decode(pool, type->data.signature.elements[0].type)->Modify($ CYTypeBlockWith(parameter)); + if (type->data.signature.count == 0) + return $ CYTypedIdentifier($ CYTypeVariable("NSBlock"), $ CYTypePointerTo()); + else { + CYTypedParameter *parameter(NULL); + for (size_t i(type->data.signature.count - 1); i != 0; --i) + parameter = $ CYTypedParameter(Decode(pool, type->data.signature.elements[i].type), parameter); + return Decode(pool, type->data.signature.elements[0].type)->Modify($ CYTypeBlockWith(parameter)); + } } break; case sig::object_P: {