]>
git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blob - tools/perf/util/demangle-java.c
8 #include "demangle-java.h"
15 MODE_CTYPE
= 3, /* class arg */
18 #define BASE_ENT(c, n) [c - 'A']=n
19 static const char *base_types
['Z' - 'A' + 1] = {
20 BASE_ENT('B', "byte" ),
21 BASE_ENT('C', "char" ),
22 BASE_ENT('D', "double" ),
23 BASE_ENT('F', "float" ),
24 BASE_ENT('I', "int" ),
25 BASE_ENT('J', "long" ),
26 BASE_ENT('S', "short" ),
27 BASE_ENT('Z', "bool" ),
31 * demangle Java symbol between str and end positions and stores
32 * up to maxlen characters into buf. The parser starts in mode.
34 * Use MODE_PREFIX to process entire prototype till end position
35 * Use MODE_TYPE to process return type if str starts on return type char
42 __demangle_java_sym(const char *str
, const char *end
, char *buf
, int maxlen
, int mode
)
50 end
= str
+ strlen(str
);
52 for (q
= str
; q
!= end
; q
++) {
54 if (rlen
== (maxlen
- 1))
59 if (mode
== MODE_PREFIX
|| mode
== MODE_CTYPE
) {
60 if (mode
== MODE_CTYPE
) {
62 rlen
+= scnprintf(buf
+ rlen
, maxlen
- rlen
, ", ");
65 rlen
+= scnprintf(buf
+ rlen
, maxlen
- rlen
, "class ");
66 if (mode
== MODE_PREFIX
)
79 if (mode
== MODE_TYPE
) {
81 rlen
+= scnprintf(buf
+ rlen
, maxlen
- rlen
, ", ");
82 rlen
+= scnprintf(buf
+ rlen
, maxlen
- rlen
, "%s", base_types
[*q
- 'A']);
84 rlen
+= scnprintf(buf
+ rlen
, maxlen
- rlen
, "[]");
91 if (mode
== MODE_TYPE
) {
92 rlen
+= scnprintf(buf
+ rlen
, maxlen
- rlen
, "void");
94 rlen
+= scnprintf(buf
+ rlen
, maxlen
- rlen
, "[]");
100 if (mode
!= MODE_TYPE
)
105 if (mode
!= MODE_FUNC
)
111 if (mode
!= MODE_TYPE
)
117 if (mode
!= MODE_CLASS
&& mode
!= MODE_CTYPE
)
119 /* safe because at least one other char to process */
120 if (isalpha(*(q
+ 1)))
121 rlen
+= scnprintf(buf
+ rlen
, maxlen
- rlen
, ".");
122 if (mode
== MODE_CLASS
)
124 else if (mode
== MODE_CTYPE
)
128 if (mode
!= MODE_CLASS
&& mode
!= MODE_CTYPE
)
130 rlen
+= scnprintf(buf
+ rlen
, maxlen
- rlen
, ".");
143 * Demangle Java function signature (openJDK, not GCJ)
145 * str: string to parse. String is not modified
146 * flags: comobination of JAVA_DEMANGLE_* flags to modify demangling
148 * if input can be demangled, then a newly allocated string is returned.
149 * if input cannot be demangled, then NULL is returned
151 * Note: caller is responsible for freeing demangled string
154 java_demangle_sym(const char *str
, int flags
)
163 /* find start of retunr type */
164 p
= strrchr(str
, ')');
169 * expansion factor estimated to 3x
171 len
= strlen(str
) * 3 + 1;
177 if (!(flags
& JAVA_DEMANGLE_NORET
)) {
179 * get return type first
181 ptr
= __demangle_java_sym(p
+ 1, NULL
, buf
, len
, MODE_TYPE
);
185 /* add space between return type and function prototype */
190 /* process function up to return type */
191 ptr
= __demangle_java_sym(str
, p
+ 1, buf
+ l1
, len
- l1
, MODE_PREFIX
);