gjavah.c (decompile_method): Handle all types of `return' opcode.
* gjavah.c (decompile_method): Handle all types of `return' opcode. Decompile `return this' and `return'. (method_access): New global. (print_method_info): Set it. (decompile_method): Don't decompile a synchronized method. From-SVN: r24297
This commit is contained in:
parent
f181d4aea0
commit
cb975f38fb
@ -1,3 +1,11 @@
|
||||
1998-12-13 Tom Tromey <tromey@cygnus.com>
|
||||
|
||||
* gjavah.c (decompile_method): Handle all types of `return'
|
||||
opcode. Decompile `return this' and `return'.
|
||||
(method_access): New global.
|
||||
(print_method_info): Set it.
|
||||
(decompile_method): Don't decompile a synchronized method.
|
||||
|
||||
1998-12-13 Tom Tromey <tromey@cygnus.com>
|
||||
|
||||
* jcf-reader.c (jcf_parse_one_method): Recognize
|
||||
|
@ -124,6 +124,7 @@ static int field_pass;
|
||||
|
||||
#define HANDLE_CONSTANTVALUE(VALUEINDEX) current_field_value = (VALUEINDEX)
|
||||
|
||||
static int method_access = 0;
|
||||
#define HANDLE_METHOD(ACCESS_FLAGS, NAME, SIGNATURE, ATTRIBUTE_COUNT) \
|
||||
if (out) { decompiled = 0; \
|
||||
print_method_info (out, jcf, NAME, SIGNATURE, ACCESS_FLAGS); \
|
||||
@ -398,6 +399,7 @@ DEFUN(print_method_info, (stream, jcf, name_index, sig_index, flags),
|
||||
int length, is_init = 0;
|
||||
char *override = NULL;
|
||||
|
||||
method_access = flags;
|
||||
if (JPOOL_TAG (jcf, name_index) != CONSTANT_Utf8)
|
||||
fprintf (stream, "<not a UTF8 constant>");
|
||||
str = JPOOL_UTF_DATA (jcf, name_index);
|
||||
@ -465,12 +467,20 @@ decompile_method (out, jcf, code_len)
|
||||
int index;
|
||||
uint16 name_and_type, name;
|
||||
|
||||
/* If the method is synchronized, don't touch it. */
|
||||
if ((method_access & ACC_SYNCHRONIZED))
|
||||
return;
|
||||
|
||||
if (code_len == 5
|
||||
&& codes[0] == OPCODE_aload_0
|
||||
&& codes[1] == OPCODE_getfield
|
||||
&& codes[4] == OPCODE_areturn)
|
||||
&& (codes[4] == OPCODE_areturn
|
||||
|| codes[4] == OPCODE_dreturn
|
||||
|| codes[4] == OPCODE_freturn
|
||||
|| codes[4] == OPCODE_ireturn
|
||||
|| codes[4] == OPCODE_lreturn))
|
||||
{
|
||||
/* Found something useful to decompile. */
|
||||
/* Found code like `return FIELD'. */
|
||||
fputs (" { return ", out);
|
||||
index = (codes[2] << 8) | codes[3];
|
||||
/* FIXME: ensure that tag is CONSTANT_Fieldref. */
|
||||
@ -482,6 +492,20 @@ decompile_method (out, jcf, code_len)
|
||||
fputs ("; }", out);
|
||||
decompiled = 1;
|
||||
}
|
||||
else if (code_len == 2
|
||||
&& codes[0] == OPCODE_aload_0
|
||||
&& codes[1] == OPCODE_areturn)
|
||||
{
|
||||
/* Found `return this'. */
|
||||
fputs (" { return this; }", out);
|
||||
decompiled = 1;
|
||||
}
|
||||
else if (code_len == 1 && codes[0] == OPCODE_return)
|
||||
{
|
||||
/* Found plain `return'. */
|
||||
fputs (" { }", out);
|
||||
decompiled = 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* Print one piece of a signature. Returns pointer to next parseable
|
||||
|
Loading…
Reference in New Issue
Block a user