Commit 8b8e6c64 by Tom Tromey Committed by Tom Tromey

parse.y (resolve_field_access): Initialize class if field is found in another static field.

	* parse.y (resolve_field_access): Initialize class if field is
	found in another static field.
	* expr.c (build_class_init): Don't optimize out initialization of
	implemented interface.

From-SVN: r64185
parent 218d1401
2003-03-11 Tom Tromey <tromey@redhat.com>
* parse.y (resolve_field_access): Initialize class if field is
found in another static field.
* expr.c (build_class_init): Don't optimize out initialization of
implemented interface.
2003-03-11 Andrew Haley <aph@redhat.com> 2003-03-11 Andrew Haley <aph@redhat.com>
* jcf-io.c (caching_stat): Initialize origsep to remove compiler * jcf-io.c (caching_stat): Initialize origsep to remove compiler
......
...@@ -1672,7 +1672,14 @@ tree ...@@ -1672,7 +1672,14 @@ tree
build_class_init (tree clas, tree expr) build_class_init (tree clas, tree expr)
{ {
tree init; tree init;
if (inherits_from_p (current_class, clas))
/* An optimization: if CLAS is a superclass of the class we're
compiling, we don't need to initialize it. However, if CLAS is
an interface, it won't necessarily be initialized, even if we
implement it. */
if ((! CLASS_INTERFACE (TYPE_NAME (clas))
&& inherits_from_p (current_class, clas))
|| current_class == clas)
return expr; return expr;
if (always_initialize_class_p) if (always_initialize_class_p)
......
...@@ -9301,6 +9301,19 @@ resolve_field_access (tree qual_wfl, tree *field_decl, tree *field_type) ...@@ -9301,6 +9301,19 @@ resolve_field_access (tree qual_wfl, tree *field_decl, tree *field_type)
return error_mark_node; return error_mark_node;
if (is_static) if (is_static)
field_ref = maybe_build_class_init_for_field (decl, field_ref); field_ref = maybe_build_class_init_for_field (decl, field_ref);
/* If we're looking at a static field, we may need to generate a
class initialization for it. This can happen when the access
looks like `field.ref', where `field' is a static field in an
interface we implement. */
if (!flag_emit_class_files
&& !flag_emit_xref
&& TREE_CODE (where_found) == VAR_DECL
&& FIELD_STATIC (where_found))
{
build_static_field_ref (where_found);
field_ref = build_class_init (DECL_CONTEXT (where_found), field_ref);
}
} }
else else
field_ref = decl; field_ref = decl;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment