* decl.c (init_decl_processing): Add `throws' field to method
authortromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 24 Aug 2001 17:24:02 +0000 (17:24 +0000)
committertromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 24 Aug 2001 17:24:02 +0000 (17:24 +0000)
descriptor.
* class.c (make_method_value): Compute `throws' field for method.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@45152 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/java/ChangeLog
gcc/java/class.c
gcc/java/decl.c

index e763b18..45b145e 100644 (file)
@@ -1,3 +1,9 @@
+2001-08-21  Tom Tromey  <tromey@redhat.com>
+
+       * decl.c (init_decl_processing): Add `throws' field to method
+       descriptor.
+       * class.c (make_method_value): Compute `throws' field for method.
+
 2001-08-22  Alexandre Petit-Bianco  <apbianco@redhat.com>
 
        * parse.y (resolve_inner_class): Keep local_enclosing to NULL if
index e8f7e6f..e0caeae 100644 (file)
@@ -1151,6 +1151,7 @@ static tree
 make_method_value (mdecl)
      tree mdecl;
 {
+  static int method_name_count = 0;
   tree minit;
   tree code;
 #define ACC_TRANSLATED          0x4000
@@ -1173,6 +1174,44 @@ make_method_value (mdecl)
   }
   PUSH_FIELD_VALUE (minit, "accflags", build_int_2 (accflags, 0));
   PUSH_FIELD_VALUE (minit, "ncode", code);
+
+  {
+    /* Compute the `throws' information for the method.  */
+    tree table = integer_zero_node;
+    if (DECL_FUNCTION_THROWS (mdecl) != NULL_TREE)
+      {
+       int length = 1 + list_length (DECL_FUNCTION_THROWS (mdecl));
+       tree iter, type, array;
+       char buf[60];
+
+       table = tree_cons (NULL_TREE, table, NULL_TREE);
+       for (iter = DECL_FUNCTION_THROWS (mdecl);
+            iter != NULL_TREE;
+            iter = TREE_CHAIN (iter))
+         {
+           tree sig = build_java_signature (TREE_VALUE (iter));
+           tree utf8
+             = build_utf8_ref (unmangle_classname (IDENTIFIER_POINTER (sig),
+                                                   IDENTIFIER_LENGTH (sig)));
+           table = tree_cons (NULL_TREE, utf8, table);
+         }
+       type = build_prim_array_type (ptr_type_node, length);
+       table = build (CONSTRUCTOR, type, NULL_TREE, table);
+       /* Compute something unique enough.  */
+       sprintf (buf, "_methods%d", method_name_count++);
+       array = build_decl (VAR_DECL, get_identifier (buf), type);
+       DECL_INITIAL (array) = table;
+       TREE_STATIC (array) = 1;
+       DECL_ARTIFICIAL (array) = 1;
+       DECL_IGNORED_P (array) = 1;
+       rest_of_decl_compilation (array, (char*) 0, 1, 0);
+
+       table = build1 (ADDR_EXPR, ptr_type_node, array);
+      }
+
+    PUSH_FIELD_VALUE (minit, "throws", table);
+  }
+
   FINISH_RECORD_CONSTRUCTOR (minit);
   return minit;
 }
index ecfa9aa..21cc3bd 100644 (file)
@@ -715,6 +715,7 @@ init_decl_processing ()
   PUSH_FIELD (method_type_node, field, "signature", utf8const_ptr_type);
   PUSH_FIELD (method_type_node, field, "accflags", access_flags_type_node);
   PUSH_FIELD (method_type_node, field, "ncode", nativecode_ptr_type_node);
+  PUSH_FIELD (method_type_node, field, "throws", ptr_type_node);
   FINISH_RECORD (method_type_node);
   build_decl (TYPE_DECL, get_identifier ("Method"), method_type_node);