diff options
author | bryce <bryce@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-06-10 03:47:36 +0000 |
---|---|---|
committer | bryce <bryce@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-06-10 03:47:36 +0000 |
commit | 55fb7e7078ba2b32581ddf2afc725e25a0e41135 (patch) | |
tree | b37f58ee3a6c4af026d730a6d84392a97ac25578 | |
parent | e10b9ed84a4906031de8923a363936b5032f76aa (diff) | |
download | gcc-55fb7e7078ba2b32581ddf2afc725e25a0e41135.tar.gz |
* gjavah.c (throwable_p): Accept argument as either a classname or
signature fragment. Create null-terminated classname string for super
when calling itself recursively.
(decode_signature_piece): Skip first character from class name
signature when calling throwable_p.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@54427 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/java/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/java/gjavah.c | 29 |
2 files changed, 27 insertions, 10 deletions
diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index 9dab4a5ebd8..7813997fc4d 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -1,3 +1,11 @@ +2002-06-10 Bryce McKinlay <bryce@waitaki.otago.ac.nz> + + * gjavah.c (throwable_p): Accept argument as either a classname or + signature fragment. Create null-terminated classname string for super + when calling itself recursively. + (decode_signature_piece): Skip first character from class name + signature when calling throwable_p. + 2002-06-08 H.J. Lu (hjl@gnu.org) * jcf-path.c (jcf_path_init): Allocate 1 more byte for string. diff --git a/gcc/java/gjavah.c b/gcc/java/gjavah.c index be3f5f7201c..b4e0a51187c 100644 --- a/gcc/java/gjavah.c +++ b/gcc/java/gjavah.c @@ -1104,11 +1104,12 @@ gcjh_streq (p1, p2) return ! strcmp ((char *) p1, (char *) p2); } -/* Return 1 if the initial (L<classname>;) part of SIGNATURE names a - subclass of throwable, or 0 if not. */ +/* Return 1 if the initial part of CLNAME names a subclass of throwable, + or 0 if not. CLNAME may be extracted from a signature, and can be + terminated with either `;' or NULL. */ static int -throwable_p (signature) - const unsigned char *signature; +throwable_p (clname) + const unsigned char *clname; { int length; unsigned char *current; @@ -1148,12 +1149,12 @@ throwable_p (signature) init_done = 1; } - for (length = 0; signature[length] != ';'; ++length) + for (length = 0; clname[length] != ';' && clname[length] != '\0'; ++length) ; current = (unsigned char *) ALLOC (length); - for (i = 1; signature[i] != ';'; ++i) - current[i - 1] = signature[i] == '/' ? '.' : signature[i]; - current[i - 1] = '\0'; + for (i = 0; i < length; ++i) + current[i] = clname[i] == '/' ? '.' : clname[i]; + current[length] = '\0'; /* We don't compute the hash slot here because the table might be modified by the recursion. In that case the slot could be @@ -1166,6 +1167,8 @@ throwable_p (signature) { JCF jcf; PTR *slot; + unsigned char *super, *tmp; + int super_length = -1; const char *classfile_name = find_class (current, strlen (current), &jcf, 0); @@ -1185,7 +1188,12 @@ throwable_p (signature) } jcf_parse_class (&jcf); - result = throwable_p (super_class_name (&jcf, NULL)); + tmp = (unsigned char *) super_class_name (&jcf, &super_length); + super = (unsigned char *) ALLOC (super_length + 1); + memcpy (super, tmp, super_length); + super[super_length] = '\0'; + + result = throwable_p (super); slot = htab_find_slot (result ? throw_hash : non_throw_hash, current, INSERT); *slot = current; @@ -1317,7 +1325,8 @@ decode_signature_piece (stream, signature, limit, need_space) else if (! strncmp (signature, "Ljava/lang/Class;", sizeof ("Ljava/lang/Class;") - 1)) ctype = "jclass"; - else if (throwable_p (signature)) + /* Skip leading 'L' for throwable_p call. */ + else if (throwable_p (signature + 1)) ctype = "jthrowable"; else ctype = "jobject"; |