From: Jay Freeman (saurik) Date: Sun, 12 Jan 2014 05:58:27 +0000 (-0800) Subject: Make @encode(char *) and new Type("r*") both work. X-Git-Tag: v0.9.500~69 X-Git-Url: https://git.saurik.com/cycript.git/commitdiff_plain/02873b722f8aed4f64b6ed533f1fa4c0eae457f7?ds=sidebyside Make @encode(char *) and new Type("r*") both work. --- diff --git a/Decode.cpp b/Decode.cpp index 7901515..f99f61f 100644 --- a/Decode.cpp +++ b/Decode.cpp @@ -36,7 +36,7 @@ CYTypedIdentifier *Decode_(CYPool &pool, struct sig::Type *type) { case sig::typename_P: return $ CYTypedIdentifier($V("Class")); case sig::union_P: _assert(false); break; - case sig::string_P: return $ CYTypedIdentifier($V("char"), $ CYTypeConstant($ CYTypePointerTo())); + case sig::string_P: return $ CYTypedIdentifier($V("char"), $ CYTypePointerTo()); case sig::selector_P: return $ CYTypedIdentifier($V("SEL")); case sig::block_P: _assert(false); break; @@ -89,7 +89,11 @@ CYTypedIdentifier *Decode_(CYPool &pool, struct sig::Type *type) { CYTypedIdentifier *Decode(CYPool &pool, struct sig::Type *type) { CYTypedIdentifier *typed(Decode_(pool, type)); - if ((type->flags & JOC_TYPE_CONST) != 0) - typed = typed->Modify($ CYTypeConstant()); + if ((type->flags & JOC_TYPE_CONST) != 0) { + if (type->primitive == sig::string_P) + typed->modifier_ = $ CYTypeConstant(typed->modifier_); + else + typed = typed->Modify($ CYTypeConstant()); + } return typed; } diff --git a/Execute.cpp b/Execute.cpp index 4282965..eb1970e 100644 --- a/Execute.cpp +++ b/Execute.cpp @@ -1139,11 +1139,18 @@ static JSValueRef Type_callAsFunction_pointerTo(JSContextRef context, JSObjectRe sig::Type type; type.name = NULL; - type.flags = 0; - type.primitive = sig::pointer_P; - type.data.data.type = internal->type_; - type.data.data.size = 0; + if (internal->type_->primitive == sig::char_P) { + type.flags = internal->type_->flags; + type.primitive = sig::string_P; + type.data.data.type = NULL; + type.data.data.size = 0; + } else { + type.flags = 0; + type.primitive = sig::pointer_P; + type.data.data.type = internal->type_; + type.data.data.size = 0; + } return CYMakeType(context, &type); } CYCatch(NULL) }