diff options
author | Andrew Haley <aph@redhat.com> | 2009-06-29 17:50:59 +0000 |
---|---|---|
committer | Andrew Haley <aph@gcc.gnu.org> | 2009-06-29 17:50:59 +0000 |
commit | 3ad1aba1f8d179027d2b5532d43024edfa7e903e (patch) | |
tree | 3cfe7282cd5664c854b8f591c178d778224cc35e /gcc | |
parent | 356ecb153076b45d402faf66da6812e01e276906 (diff) | |
download | gcc-3ad1aba1f8d179027d2b5532d43024edfa7e903e.zip gcc-3ad1aba1f8d179027d2b5532d43024edfa7e903e.tar.gz gcc-3ad1aba1f8d179027d2b5532d43024edfa7e903e.tar.bz2 |
re PR java/40590 (namespace namespace broken in CNI)
2009-06-29 Andrew Haley <aph@redhat.com>
PR java/40590
* tools/gnu/classpath/tools/javah/FieldHelper.java (print):
Use printName().
* tools/gnu/classpath/tools/javah/MethodHelper.java (print):
Use printName().
* tools/gnu/classpath/tools/javah/CniStubPrinter.java (printDecl):
Use printName().
* tools/gnu/classpath/tools/javah/Keywords.java (words): Replace
with keywords list from gcc/java/mangle.c.
* tools/gnu/classpath/tools/javah/ClassWrapper.java (printMethods):
Don't pre-convert a C++ keyword.
(print(CniPrintStream)): Call CniPrintStream.printName().
(printContents): Likewise.
* tools/gnu/classpath/tools/javah/CniPrintStream.java
(getClassName): Don't call replaceAll("/", "::").
(print(Type)): Add ""::" befor name, " *" after. Use printName(), not
print.
(printName(PrintStream, String), printName(String), printlnName):
New methods.
(moveToPackage): Use printName().
2009-06-29 Andrew Haley <aph@redhat.com>
PR java/40590
* java-tree.h (cxx_keyword_p): New declaration.
* mangle_name.c (utf8_cmp): Move here from mangle.c.
(cxx_keywords): Likewise.
(cxx_keyword_p): Likewise.
(MANGLE_CXX_KEYWORDS): New macro.
(append_gpp_mangled_name): Use MANGLE_CXX_KEYWORDS.
(append_gpp_mangled_name): Likewise.
* mangle.c: Move code to mangle_name.c.
(mangle_member_name): Don't call cxx_keyword_p.
From-SVN: r149059
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/java/ChangeLog | 13 | ||||
-rw-r--r-- | gcc/java/java-tree.h | 2 | ||||
-rw-r--r-- | gcc/java/mangle.c | 165 | ||||
-rw-r--r-- | gcc/java/mangle_name.c | 193 |
4 files changed, 205 insertions, 168 deletions
diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index b3daaa8..5e41e13 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -1,3 +1,16 @@ +2009-06-29 Andrew Haley <aph@redhat.com> + + PR java/40590 + * java-tree.h (cxx_keyword_p): New declaration. + * mangle_name.c (utf8_cmp): Move here from mangle.c. + (cxx_keywords): Likewise. + (cxx_keyword_p): Likewise. + (MANGLE_CXX_KEYWORDS): New macro. + (append_gpp_mangled_name): Use MANGLE_CXX_KEYWORDS. + (append_gpp_mangled_name): Likewise. + * mangle.c: Move code to mangle_name.c. + (mangle_member_name): Don't call cxx_keyword_p. + 2009-06-12 Aldy Hernandez <aldyh@redhat.com> * java-gimplify.c (java_gimplify_block): New argument to diff --git a/gcc/java/java-tree.h b/gcc/java/java-tree.h index 98352a2..6bf2ecd 100644 --- a/gcc/java/java-tree.h +++ b/gcc/java/java-tree.h @@ -1224,6 +1224,8 @@ extern void java_read_sourcefilenames (const char *fsource_filename); extern void rewrite_reflection_indexes (void *); +int cxx_keyword_p (const char *name, int length); + #define DECL_FINAL(DECL) DECL_LANG_FLAG_3 (DECL) /* Access flags etc for a method (a FUNCTION_DECL): */ diff --git a/gcc/java/mangle.c b/gcc/java/mangle.c index 61594d9..4630f6d 100644 --- a/gcc/java/mangle.c +++ b/gcc/java/mangle.c @@ -72,167 +72,6 @@ struct obstack *mangle_obstack; /* atms: array template mangled string. */ static GTY(()) tree atms; -static int -utf8_cmp (const unsigned char *str, int length, const char *name) -{ - const unsigned char *limit = str + length; - int i; - - for (i = 0; name[i]; ++i) - { - int ch = UTF8_GET (str, limit); - if (ch != name[i]) - return ch - name[i]; - } - - return str == limit ? 0 : 1; -} - -/* A sorted list of all C++ keywords. */ -static const char *const cxx_keywords[] = -{ - "_Complex", - "__alignof", - "__alignof__", - "__asm", - "__asm__", - "__attribute", - "__attribute__", - "__builtin_va_arg", - "__complex", - "__complex__", - "__const", - "__const__", - "__extension__", - "__imag", - "__imag__", - "__inline", - "__inline__", - "__label__", - "__null", - "__real", - "__real__", - "__restrict", - "__restrict__", - "__signed", - "__signed__", - "__typeof", - "__typeof__", - "__volatile", - "__volatile__", - "and", - "and_eq", - "asm", - "auto", - "bitand", - "bitor", - "bool", - "break", - "case", - "catch", - "char", - "class", - "compl", - "const", - "const_cast", - "continue", - "default", - "delete", - "do", - "double", - "dynamic_cast", - "else", - "enum", - "explicit", - "export", - "extern", - "false", - "float", - "for", - "friend", - "goto", - "if", - "inline", - "int", - "long", - "mutable", - "namespace", - "new", - "not", - "not_eq", - "operator", - "or", - "or_eq", - "private", - "protected", - "public", - "register", - "reinterpret_cast", - "return", - "short", - "signed", - "sizeof", - "static", - "static_cast", - "struct", - "switch", - "template", - "this", - "throw", - "true", - "try", - "typedef", - "typeid", - "typename", - "typeof", - "union", - "unsigned", - "using", - "virtual", - "void", - "volatile", - "wchar_t", - "while", - "xor", - "xor_eq" -}; - -/* Return true if NAME is a C++ keyword. */ -static int -cxx_keyword_p (const char *name, int length) -{ - int last = ARRAY_SIZE (cxx_keywords); - int first = 0; - int mid = (last + first) / 2; - int old = -1; - - for (mid = (last + first) / 2; - mid != old; - old = mid, mid = (last + first) / 2) - { - int kwl = strlen (cxx_keywords[mid]); - int min_length = kwl > length ? length : kwl; - int r = utf8_cmp ((const unsigned char *) name, min_length, cxx_keywords[mid]); - - if (r == 0) - { - int i; - /* We've found a match if all the remaining characters are `$'. */ - for (i = min_length; i < length && name[i] == '$'; ++i) - ; - if (i == length) - return 1; - r = 1; - } - - if (r < 0) - last = mid; - else - first = mid; - } - return 0; -} - /* This is the mangling interface: a decl, a class field (.class) and the vtable. */ @@ -392,10 +231,6 @@ mangle_member_name (tree name) { append_gpp_mangled_name (IDENTIFIER_POINTER (name), IDENTIFIER_LENGTH (name)); - - /* If NAME happens to be a C++ keyword, add `$'. */ - if (cxx_keyword_p (IDENTIFIER_POINTER (name), IDENTIFIER_LENGTH (name))) - obstack_1grow (mangle_obstack, '$'); } /* Append the mangled name of TYPE onto OBSTACK. */ diff --git a/gcc/java/mangle_name.c b/gcc/java/mangle_name.c index b4d8677..a0e6887 100644 --- a/gcc/java/mangle_name.c +++ b/gcc/java/mangle_name.c @@ -41,6 +41,185 @@ static int unicode_mangling_length (const char *, int); extern struct obstack *mangle_obstack; +static int +utf8_cmp (const unsigned char *str, int length, const char *name) +{ + const unsigned char *limit = str + length; + int i; + + for (i = 0; name[i]; ++i) + { + int ch = UTF8_GET (str, limit); + if (ch != name[i]) + return ch - name[i]; + } + + return str == limit ? 0 : 1; +} + +/* A sorted list of all C++ keywords. If you change this, be sure + also to change the list in + libjava/classpath/tools/gnu/classpath/tools/javah/Keywords.java. */ +static const char *const cxx_keywords[] = +{ + "_Complex", + "__alignof", + "__alignof__", + "__asm", + "__asm__", + "__attribute", + "__attribute__", + "__builtin_va_arg", + "__complex", + "__complex__", + "__const", + "__const__", + "__extension__", + "__imag", + "__imag__", + "__inline", + "__inline__", + "__label__", + "__null", + "__real", + "__real__", + "__restrict", + "__restrict__", + "__signed", + "__signed__", + "__typeof", + "__typeof__", + "__volatile", + "__volatile__", + "and", + "and_eq", + "asm", + "auto", + "bitand", + "bitor", + "bool", + "break", + "case", + "catch", + "char", + "class", + "compl", + "const", + "const_cast", + "continue", + "default", + "delete", + "do", + "double", + "dynamic_cast", + "else", + "enum", + "explicit", + "export", + "extern", + "false", + "float", + "for", + "friend", + "goto", + "if", + "inline", + "int", + "long", + "mutable", + "namespace", + "new", + "not", + "not_eq", + "operator", + "or", + "or_eq", + "private", + "protected", + "public", + "register", + "reinterpret_cast", + "return", + "short", + "signed", + "sizeof", + "static", + "static_cast", + "struct", + "switch", + "template", + "this", + "throw", + "true", + "try", + "typedef", + "typeid", + "typename", + "typeof", + "union", + "unsigned", + "using", + "virtual", + "void", + "volatile", + "wchar_t", + "while", + "xor", + "xor_eq" +}; + +/* Return true if NAME is a C++ keyword. */ +int +cxx_keyword_p (const char *name, int length) +{ + int last = ARRAY_SIZE (cxx_keywords); + int first = 0; + int mid = (last + first) / 2; + int old = -1; + + for (mid = (last + first) / 2; + mid != old; + old = mid, mid = (last + first) / 2) + { + int kwl = strlen (cxx_keywords[mid]); + int min_length = kwl > length ? length : kwl; + int r = utf8_cmp ((const unsigned char *) name, min_length, cxx_keywords[mid]); + + if (r == 0) + { + int i; + /* We've found a match if all the remaining characters are `$'. */ + for (i = min_length; i < length && name[i] == '$'; ++i) + ; + if (i == length) + return 1; + r = 1; + } + + if (r < 0) + last = mid; + else + first = mid; + } + return 0; +} + +/* If NAME happens to be a C++ keyword, add `$'. */ +#define MANGLE_CXX_KEYWORDS(NAME, LEN) \ +do \ + { \ + if (cxx_keyword_p ((NAME), (LEN))) \ + { \ + char *tmp_buf = (char *)alloca ((LEN)+1); \ + memcpy (tmp_buf, (NAME), (LEN)); \ + tmp_buf[LEN]= '$'; \ + (NAME) = tmp_buf; \ + (LEN)++; \ + } \ + } \ +while (0) + + /* If the assembler doesn't support UTF8 in symbol names, some characters might need to be escaped. */ @@ -54,10 +233,14 @@ extern struct obstack *mangle_obstack; void append_gpp_mangled_name (const char *name, int len) { - int encoded_len = unicode_mangling_length (name, len); - int needs_escapes = encoded_len > 0; + int encoded_len, needs_escapes; char buf[6]; + MANGLE_CXX_KEYWORDS (name, len); + + encoded_len = unicode_mangling_length (name, len); + needs_escapes = encoded_len > 0; + sprintf (buf, "%d", (needs_escapes ? encoded_len : len)); obstack_grow (mangle_obstack, buf, strlen (buf)); @@ -195,10 +378,14 @@ void append_gpp_mangled_name (const char *name, int len) { const unsigned char *ptr; - const unsigned char *limit = (const unsigned char *)name + len; + const unsigned char *limit; int encoded_len; char buf [6]; + MANGLE_CXX_KEYWORDS (name, len); + + limit = (const unsigned char *)name + len; + /* Compute the length of the string we wish to mangle. */ for (encoded_len = 0, ptr = (const unsigned char *) name; ptr < limit; encoded_len++) |