class.c (build_static_field_ref): Check FIELD_FINAL.

* class.c (build_static_field_ref): Check FIELD_FINAL.

* constants.c (alloc_class_constant): Use TYPE_CPOOL_DATA_REF
instead of current_constant_pool_data_ref.
* java-tree.h (current_constant_pool_data_ref): Undefine.
(JTI_CURRENT_CONSTANT_POOL_DATA_REF): Remove.
* jcf-parse.c (init_outgoing_cpool): Don't initialize
current_constant_pool_data_ref.

* except.c (prepare_eh_table_type ): Use DECL_NAME of class type,
not build_internal_class_name.

* parse.y (patch_incomplete_class_ref): Always emit `class$' method.
Use it when class ref isn't certain to be compiled.

From-SVN: r60448
This commit is contained in:
Jeff Sturm 2002-12-23 19:42:09 +00:00 committed by Jeff Sturm
parent 46d40353c3
commit d3ab697ba4
7 changed files with 39 additions and 18 deletions

View File

@ -1,3 +1,20 @@
2002-12-23 Jeff Sturm <jsturm@one-point.com>
* class.c (build_static_field_ref): Check FIELD_FINAL.
* constants.c (alloc_class_constant): Use TYPE_CPOOL_DATA_REF
instead of current_constant_pool_data_ref.
* java-tree.h (current_constant_pool_data_ref): Undefine.
(JTI_CURRENT_CONSTANT_POOL_DATA_REF): Remove.
* jcf-parse.c (init_outgoing_cpool): Don't initialize
current_constant_pool_data_ref.
* except.c (prepare_eh_table_type ): Use DECL_NAME of class type,
not build_internal_class_name.
* parse.y (patch_incomplete_class_ref): Always emit `class$' method.
Use it when class ref isn't certain to be compiled.
2002-12-23 Joseph S. Myers <jsm@polyomino.org.uk> 2002-12-23 Joseph S. Myers <jsm@polyomino.org.uk>
* gcj.texi: Include gcc-common.texi. * gcj.texi: Include gcc-common.texi.

View File

@ -1076,7 +1076,9 @@ build_static_field_ref (fdecl)
{ {
tree fclass = DECL_CONTEXT (fdecl); tree fclass = DECL_CONTEXT (fdecl);
int is_compiled = is_compiled_class (fclass); int is_compiled = is_compiled_class (fclass);
if (is_compiled)
/* Allow static final fields to fold to a constant. */
if (is_compiled || FIELD_FINAL (fdecl))
{ {
if (!DECL_RTL_SET_P (fdecl)) if (!DECL_RTL_SET_P (fdecl))
{ {

View File

@ -388,10 +388,12 @@ alloc_class_constant (clas)
static tree static tree
build_constant_data_ref () build_constant_data_ref ()
{ {
if (TYPE_CPOOL_DATA_REF (current_class)) tree cpool_data_ref = NULL_TREE;
current_constant_pool_data_ref = TYPE_CPOOL_DATA_REF (current_class);
else if (current_constant_pool_data_ref == NULL_TREE) if (TYPE_CPOOL_DATA_REF (current_class))
cpool_data_ref = TYPE_CPOOL_DATA_REF (current_class);
if (cpool_data_ref == NULL_TREE)
{ {
tree decl; tree decl;
tree decl_name = mangled_classname ("_CD_", current_class); tree decl_name = mangled_classname ("_CD_", current_class);
@ -400,10 +402,10 @@ build_constant_data_ref ()
one_elt_array_domain_type)); one_elt_array_domain_type));
TREE_STATIC (decl) = 1; TREE_STATIC (decl) = 1;
make_decl_rtl (decl, NULL); make_decl_rtl (decl, NULL);
TYPE_CPOOL_DATA_REF (current_class) = current_constant_pool_data_ref TYPE_CPOOL_DATA_REF (current_class) = cpool_data_ref
= build1 (ADDR_EXPR, ptr_type_node, decl); = build1 (ADDR_EXPR, ptr_type_node, decl);
} }
return current_constant_pool_data_ref; return cpool_data_ref;
} }
/* Get the pointer value at the INDEX'th element of the constant pool. */ /* Get the pointer value at the INDEX'th element of the constant pool. */

View File

@ -336,7 +336,7 @@ prepare_eh_table_type (type)
else else
exp = fold (build exp = fold (build
(PLUS_EXPR, ptr_type_node, (PLUS_EXPR, ptr_type_node,
build_utf8_ref (build_internal_class_name (type)), build_utf8_ref (DECL_NAME (TYPE_NAME (type))),
size_one_node)); size_one_node));
return exp; return exp;
} }

View File

@ -399,7 +399,6 @@ enum java_tree_index
JTI_NATIVECODE_PTR_ARRAY_TYPE_NODE, JTI_NATIVECODE_PTR_ARRAY_TYPE_NODE,
JTI_WFL_OPERATOR, JTI_WFL_OPERATOR,
JTI_CURRENT_CONSTANT_POOL_DATA_REF,
JTI_MAIN_CLASS, JTI_MAIN_CLASS,
JTI_CURRENT_CLASS, JTI_CURRENT_CLASS,
@ -685,10 +684,6 @@ extern GTY(()) tree java_global_trees[JTI_MAX];
/* They need to be reset before processing each class */ /* They need to be reset before processing each class */
extern struct CPool *outgoing_cpool; extern struct CPool *outgoing_cpool;
/* If non-NULL, an ADDR_EXPR referencing a VAR_DECL containing
the constant data array for the current class. */
#define current_constant_pool_data_ref \
java_global_trees[JTI_CURRENT_CONSTANT_POOL_DATA_REF]
#define wfl_operator \ #define wfl_operator \
java_global_trees[JTI_WFL_OPERATOR] java_global_trees[JTI_WFL_OPERATOR]

View File

@ -709,7 +709,6 @@ load_inner_classes (cur_class)
void void
init_outgoing_cpool () init_outgoing_cpool ()
{ {
current_constant_pool_data_ref = NULL_TREE;
outgoing_cpool = xmalloc (sizeof (struct CPool)); outgoing_cpool = xmalloc (sizeof (struct CPool));
memset (outgoing_cpool, 0, sizeof (struct CPool)); memset (outgoing_cpool, 0, sizeof (struct CPool));
} }

View File

@ -14073,7 +14073,16 @@ patch_incomplete_class_ref (node)
if (!(ref_type = resolve_type_during_patch (type))) if (!(ref_type = resolve_type_during_patch (type)))
return error_mark_node; return error_mark_node;
if (!flag_emit_class_files || JPRIMITIVE_TYPE_P (ref_type) /* Generate the synthetic static method `class$'. (Previously we
deferred this, causing different method tables to be emitted
for native code and bytecode.) */
if (!TYPE_DOT_CLASS (current_class))
build_dot_class_method (current_class);
/* If we're not emitting class files and we know ref_type is a
compiled class, build a direct reference. */
if ((! flag_emit_class_files && is_compiled_class (ref_type))
|| JPRIMITIVE_TYPE_P (ref_type)
|| TREE_CODE (ref_type) == VOID_TYPE) || TREE_CODE (ref_type) == VOID_TYPE)
{ {
tree dot = build_class_ref (ref_type); tree dot = build_class_ref (ref_type);
@ -14084,10 +14093,7 @@ patch_incomplete_class_ref (node)
} }
/* If we're emitting class files and we have to deal with non /* If we're emitting class files and we have to deal with non
primitive types, we invoke (and consider generating) the primitive types, we invoke the synthetic static method `class$'. */
synthetic static method `class$'. */
if (!TYPE_DOT_CLASS (current_class))
build_dot_class_method (current_class);
ref_type = build_dot_class_method_invocation (ref_type); ref_type = build_dot_class_method_invocation (ref_type);
return java_complete_tree (ref_type); return java_complete_tree (ref_type);
} }