decl2.c (acceptable_java_type): Allow references too.
authorAlexandre Petit-Bianco <apbianco@cygnus.com>
Wed, 10 Jan 2001 19:20:52 +0000 (19:20 +0000)
committerAlexandre Petit-Bianco <apbianco@gcc.gnu.org>
Wed, 10 Jan 2001 19:20:52 +0000 (11:20 -0800)
2001-01-07  Alexandre Petit-Bianco  <apbianco@cygnus.com>

        * decl2.c (acceptable_java_type): Allow references too.
        * init.c (build_java_class_ref): When using the new ABI, search
        `class$' and have it mangled with `mangle_decl.'
        * mangle.c (write_java_integer_type_codes): New function.
        (write_builtin_type): Detect and mangle Java integer and real
        types.

(http://gcc.gnu.org/ml/gcc-patches/2001-01/msg00756.html)

From-SVN: r38875

gcc/cp/ChangeLog
gcc/cp/decl2.c
gcc/cp/init.c
gcc/cp/mangle.c

index c10022c677822a89051fdb8878ef4dd4e016af04..d431ffee9f49f71f0993136e485f3cfad39d993d 100644 (file)
        Set IDENTIFIER_CLASS_VALUE when replacing an existing binding.
        Don't set TREE_VALUE on the class_shadowed list.
 
+2001-01-07  Alexandre Petit-Bianco  <apbianco@cygnus.com>
+       * decl2.c (acceptable_java_type): Allow references too. 
+       * init.c (build_java_class_ref): When using the new ABI, search
+       `class$' and have it mangled with `mangle_decl.'
+       * mangle.c (write_java_integer_type_codes): New function.
+       (write_builtin_type): Detect and mangle Java integer and real
+       types.
 2001-01-07  Mark Mitchell  <mark@codesourcery.com>
 
        * decl2.c (grokfield): Don't accept `asm' specifiers for
index 4da673bd488e2ba9f705c80b1f710ffe710d612c..c41126aa777d7a402304924161cb5257e5540cb3 100644 (file)
@@ -1336,7 +1336,7 @@ acceptable_java_type (type)
 {
   if (TREE_CODE (type) == VOID_TYPE || TYPE_FOR_JAVA (type))
     return 1;
-  if (TREE_CODE (type) == POINTER_TYPE)
+  if (TREE_CODE (type) == POINTER_TYPE || TREE_CODE (type) == REFERENCE_TYPE)
     {
       type = TREE_TYPE (type);
       if (TREE_CODE (type) == RECORD_TYPE)
index 9d20955a7533f2f52d44e87367e16c01d8fb55fd..e9eddf9118efc3f77ba32c3088338d1c24790f13 100644 (file)
@@ -2206,7 +2206,23 @@ build_java_class_ref (type)
        fatal("call to Java constructor, while `jclass' undefined");
       jclass_node = TREE_TYPE (jclass_node);
     }
-  name = build_static_name (type, CL_suffix);
+
+  /* Mangle the class$ field, new and old ABI */
+  if (flag_new_abi)
+    {
+      tree field;
+      for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
+       if (DECL_NAME (field) == CL_suffix)
+         {
+           name = mangle_decl (field);
+           break;
+         }
+      if (!field)
+       fatal ("Can't find class$");
+    }
+  else
+    name = build_static_name (type, CL_suffix);
+
   class_decl = IDENTIFIER_GLOBAL_VALUE (name);
   if (class_decl == NULL_TREE)
     {
index 001a9e8f36ffc44c3813fd0f75f47bb4affed522..b4bb686d79f1157fb17952613d9a565752cb5995 100644 (file)
@@ -189,6 +189,10 @@ static inline void start_mangling PARAMS ((void));
 static inline const char *finish_mangling PARAMS ((void));
 static tree mangle_special_for_type PARAMS ((tree, const char *));
 
+/* Foreign language functions. */
+
+static void write_java_integer_type_codes PARAMS ((tree));
+
 /* Append a single character to the end of the mangled
    representation.  */
 #define write_char(CHAR)                                              \
@@ -1446,6 +1450,8 @@ write_builtin_type (type)
         integer_type_nodes.  */
       if (type == wchar_type_node)
        write_char ('w');
+      if (TYPE_FOR_JAVA (type))
+       write_java_integer_type_codes (type);
       else
        {
          size_t itk;
@@ -1473,9 +1479,11 @@ write_builtin_type (type)
       break;
 
     case REAL_TYPE:
-      if (type == float_type_node)
+      if (type == float_type_node
+         || type == java_float_type_node)
        write_char ('f');
-      else if (type == double_type_node)
+      else if (type == double_type_node
+              || type == java_double_type_node)
        write_char ('d');
       else if (type == long_double_type_node)
        write_char ('e');
@@ -2280,3 +2288,30 @@ mangle_guard_variable (variable)
   write_name (variable, /*ignore_local_scope=*/0);
   return get_identifier (finish_mangling ());
 }
+
+\f
+
+/* Foreign language type mangling section.  */
+
+/* How to write the type codes for the integer Java type.  */
+
+static void
+write_java_integer_type_codes (type)
+     tree type;
+{
+  if (type == java_int_type_node)
+    write_char ('i');
+  else if (type == java_short_type_node)
+    write_char ('s');
+  else if (type == java_byte_type_node)
+    write_char ('c');
+  else if (type == java_char_type_node)
+    write_char ('w');
+  else if (type == java_long_type_node)
+    write_char ('x');
+  else if (type == java_boolean_type_node)
+    write_char ('b');
+  else
+    my_friendly_abort (20001207);
+}
+