class.c (uncache_this_class_ref): New.

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
This commit is contained in:
Andrew Haley 2007-02-07 18:28:20 +00:00 committed by Andrew Haley
parent 08452f4553
commit 56c9f04bb7
4 changed files with 34 additions and 0 deletions

View 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:

View 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. */

View 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. */

View 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);