decl.c (build_result_decl): New method.
authorPer Bothner <bothner@gcc.gnu.org>
Sun, 21 Feb 1999 15:42:22 +0000 (07:42 -0800)
committerPer Bothner <bothner@gcc.gnu.org>
Sun, 21 Feb 1999 15:42:22 +0000 (07:42 -0800)
* decl.c (build_result_decl), java-tree.h:  New method.
(complete_start_java_method):  Handle synchronized methods.
Don't build DECL_RESULT here.  (Ordering dependency problem.)
(start_java_method):  Call build_result_decl here instead  ...
* parse.y (java_complete_expand_method):  ... and here.
(expand_start_java_method): Don't call complete_start_java_method here.
(java_complete_expand_method):  Call it here instead.
* parse.h (BUILD_MONITOR_ENTER, BUILD_MONITOR_EXIT):  Moved to ..
* java-tree.h:  ... here.
* expr.c (force_evaluation_order):  Fix typo, don't handle ARRAY_REF.
* parse.y (java_complete_lhs):  Don't call force_evaluation_order
for ARRAY_REF - it doesn't work when array bounds are checked.
(patch_array_ref):  Handle it here instead.

From-SVN: r25345

gcc/java/jcf-write.c

index 4d7b4403fe9473681631b401d48e1722d40af8ae..42d32d27ffa64fe5bbd7f00cd94595eb64f5424c 100644 (file)
@@ -2760,7 +2760,8 @@ generate_classfile (clas, state)
       i = find_utf8_constant (&state->cpool, name);  PUT2 (i);
       i = find_utf8_constant (&state->cpool, build_java_signature (type));
       PUT2 (i);
-      PUT2 (body != NULL_TREE ? 1 : 0);   /* attributes_count */
+      i = (body != NULL_TREE) + (DECL_FUNCTION_THROWS (part) != NULL_TREE);
+      PUT2 (i);   /* attributes_count */
       if (body != NULL_TREE)
        {
          int code_attributes_count = 0;
@@ -2876,6 +2877,24 @@ generate_classfile (clas, state)
                }
            }
        }
+      if (DECL_FUNCTION_THROWS (part) != NULL_TREE)
+       {
+         tree t = DECL_FUNCTION_THROWS (part);
+         int throws_count = list_length (t);
+         static tree Exceptions_node = NULL_TREE;
+         if (Exceptions_node == NULL_TREE)
+           Exceptions_node = get_identifier ("Exceptions");
+         ptr = append_chunk (NULL, 8 + 2 * throws_count, state);
+         i = find_utf8_constant (&state->cpool, Exceptions_node);
+         PUT2 (i);  /* attribute_name_index */ 
+         i = 2 + 2 * throws_count;  PUT4(i); /* attribute_length */ 
+         i = throws_count;  PUT2 (i); 
+         for (;  t != NULL_TREE;  t = TREE_CHAIN (t))
+           {
+             i = find_class_constant (&state->cpool, TREE_VALUE (t));
+             PUT2 (i);
+           }
+       }
       methods_count++;
       current_function_decl = save_function;
     }