class.c (uncache_this_class_ref): New.
authorAndrew Haley <aph@redhat.com>
Wed, 7 Feb 2007 18:28:20 +0000 (18:28 +0000)
committerAndrew Haley <aph@gcc.gnu.org>
Wed, 7 Feb 2007 18:28:20 +0000 (18:28 +0000)
2007-02-07  Andrew Haley  <aph@redhat.com>

        * class.c (uncache_this_class_ref): New.
        * expr.c (build_jni_stub): Initialize the class.
        (expand_byte_code): Call uncache_this_class_ref after generating
        code.

From-SVN: r121695

gcc/java/ChangeLog
gcc/java/class.c
gcc/java/expr.c
gcc/java/java-tree.h

index 1361a6e..03c4f96 100644 (file)
@@ -1,3 +1,10 @@
+2007-02-07  Andrew Haley  <aph@redhat.com>
+
+       * class.c (uncache_this_class_ref): New.
+       * expr.c (build_jni_stub): Initialize the class.
+       (expand_byte_code): Call uncache_this_class_ref after generating
+       code.
+
 2007-02-06  Tom Tromey  <tromey@redhat.com>
 
        PR java/30714:
index ec94a3c..804c239 100644 (file)
@@ -1047,6 +1047,15 @@ cache_this_class_ref (tree fndecl)
     }
 }
 
+/* Remove the reference to the local variable that holds the current
+   class$.  */
+
+void
+uncache_this_class_ref (tree fndecl ATTRIBUTE_UNUSED)
+{
+  this_classdollar = build_classdollar_field (output_class);
+}
+
 /* Build a reference to the class TYPE.
    Also handles primitive types and array types. */
 
index f7d35c6..ed5103f 100644 (file)
@@ -2799,6 +2799,21 @@ build_jni_stub (tree method)
                 build1 (RETURN_EXPR, res_type, res_var));
   TREE_SIDE_EFFECTS (body) = 1;
   
+  /* Prepend class initialization for static methods reachable from
+     other classes.  */
+  if (METHOD_STATIC (method)
+      && (! METHOD_PRIVATE (method)
+          || INNER_CLASS_P (DECL_CONTEXT (method))))
+    {
+      tree init = build3 (CALL_EXPR, void_type_node,
+                         build_address_of (soft_initclass_node),
+                         build_tree_list (NULL_TREE, 
+                                          klass),
+                         NULL_TREE);
+      body = build2 (COMPOUND_EXPR, void_type_node, init, body);
+      TREE_SIDE_EFFECTS (body) = 1;
+    }
+
   bind = build3 (BIND_EXPR, void_type_node, BLOCK_VARS (block), 
                 body, block);
   return bind;
@@ -3227,6 +3242,8 @@ expand_byte_code (JCF *jcf, tree method)
       maybe_poplevels (PC);
     } /* for */
 
+  uncache_this_class_ref (method);
+
   if (dead_code_index != -1)
     {
       /* We've just reached the end of a region of dead code.  */
index ab3ff47..732e0cd 100644 (file)
@@ -1130,6 +1130,7 @@ extern int get_interface_method_index (tree, tree);
 extern tree layout_class_method (tree, tree, tree, tree);
 extern void layout_class_methods (tree);
 extern void cache_this_class_ref (tree);
+extern void uncache_this_class_ref (tree);
 extern tree build_class_ref (tree);
 extern tree build_dtable_decl (tree);
 extern tree build_internal_class_name (tree);