X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/8d7447c170dd11c91d0a07768f32a2699177fa54..e71ad0798f509366384257df77b925b33ab5ef66:/sig/parse.cpp
diff --git a/sig/parse.cpp b/sig/parse.cpp
index 51782d2..a0e1a96 100644
--- a/sig/parse.cpp
+++ b/sig/parse.cpp
@@ -1,20 +1,20 @@
/* Cycript - Optimizing JavaScript Compiler/Runtime
- * Copyright (C) 2009-2012 Jay Freeman (saurik)
+ * Copyright (C) 2009-2013 Jay Freeman (saurik)
*/
-/* GNU Lesser General Public License, Version 3 {{{ */
+/* GNU General Public License, Version 3 {{{ */
/*
- * Cycript is free software: you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the
- * Free Software Foundation, either version 3 of the License, or (at your
- * option) any later version.
+ * Cycript is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation, either version 3 of the License,
+ * or (at your option) any later version.
*
- * Cycript is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
- * License for more details.
+ * Cycript is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
*
- * You should have received a copy of the GNU Lesser General Public License
+ * You should have received a copy of the GNU General Public License
* along with Cycript. If not, see .
**/
/* }}} */
@@ -117,7 +117,10 @@ struct Type *Parse_(apr_pool_t *pool, const char **name, char eos, bool named, C
if (next == '"') {
const char *quote = strchr(*name + 1, '"');
- if (!named || quote[1] == eos || quote[1] == '"') {
+ if (quote == NULL) {
+ printf("unterminated specific id type {%s}\n", *name - 10);
+ _assert(false);
+ } else if (!named || quote[1] == eos || quote[1] == '"') {
type->name = apr_pstrmemdup(pool, *name + 1, quote - *name - 1);
*name = quote + 1;
}
@@ -237,10 +240,8 @@ const char *Unparse(apr_pool_t *pool, struct Signature *signature) {
return value;
}
-const char *Unparse(apr_pool_t *pool, struct Type *type) {
- if (type == NULL)
- return "?";
- else switch (type->primitive) {
+const char *Unparse_(apr_pool_t *pool, struct Type *type) {
+ switch (type->primitive) {
case typename_P: return "#";
case union_P: return apr_psprintf(pool, "(%s)", Unparse(pool, &type->data.signature));
case string_P: return "*";
@@ -276,4 +277,37 @@ const char *Unparse(apr_pool_t *pool, struct Type *type) {
return NULL;
}
+const char *Unparse(apr_pool_t *pool, struct Type *type) {
+ if (type == NULL)
+ return "?";
+
+ const char *base(Unparse_(pool, type));
+ if (type->flags == 0)
+ return base;
+
+ #define iovec_(base, size) \
+ (struct iovec) {const_cast(base), size}
+
+ struct iovec parts[8];
+ memset(parts, 0, sizeof(parts));
+
+ if ((type->flags & JOC_TYPE_INOUT) != 0)
+ parts[0] = iovec_("N", 1);
+ if ((type->flags & JOC_TYPE_IN) != 0)
+ parts[1] = iovec_("n", 1);
+ if ((type->flags & JOC_TYPE_BYCOPY) != 0)
+ parts[2] = iovec_("O", 1);
+ if ((type->flags & JOC_TYPE_OUT) != 0)
+ parts[3] = iovec_("o", 1);
+ if ((type->flags & JOC_TYPE_BYREF) != 0)
+ parts[4] = iovec_("R", 1);
+ if ((type->flags & JOC_TYPE_CONST) != 0)
+ parts[5] = iovec_("r", 1);
+ if ((type->flags & JOC_TYPE_ONEWAY) != 0)
+ parts[6] = iovec_("V", 1);
+
+ parts[7] = iovec_(base, strlen(base));
+ return apr_pstrcatv(pool, parts, 8, NULL);
+}
+
}