jcf-write.c (generate_classfile): Don't write ConstantValue attribute if field is not final...

* jcf-write.c (generate_classfile):  Don't write ConstantValue
	attribute if field is not final, for compatibility with jdk.

	* jcf-write.c (generate_classfile):  Convert ConstantValue values
	to correct type.  Work-around for front-end bug.
	* class.c (set_constant_value):  Error if constant has wrong type.

From-SVN: r45298
This commit is contained in:
Per Bothner 2001-08-30 14:08:32 -07:00 committed by Per Bothner
parent b8ec576419
commit 1b9ee7233c
3 changed files with 19 additions and 1 deletions

View File

@ -1,3 +1,12 @@
2001-08-30 Per Bothner <per@bothner.com>
* jcf-write.c (generate_classfile): Don't write ConstantValue
attribute if field is not final, for compatibility with jdk.
* jcf-write.c (generate_classfile): Convert ConstantValue values
to correct type. Work-around for front-end bug.
* class.c (set_constant_value): Error if constant has wrong type.
2001-08-30 Per Bothner <per@bothner.com>
* jcf-dump.c (print_constant): Fix fencepost error so "Float" and

View File

@ -777,6 +777,12 @@ set_constant_value (field, constant)
else
{
DECL_INITIAL (field) = constant;
if (TREE_TYPE (constant) != TREE_TYPE (field)
&& ! (TREE_TYPE (constant) == int_type_node
&& INTEGRAL_TYPE_P (TREE_TYPE (field))
&& TYPE_PRECISION (TREE_TYPE (field)) <= 32))
error ("ConstantValue attribute of field '%s' has wrong type",
IDENTIFIER_POINTER (DECL_NAME (field)));
if (FIELD_FINAL (field))
DECL_FIELD_FINAL_IUD (field) = 1;
}

View File

@ -2884,7 +2884,8 @@ generate_classfile (clas, state)
build_java_signature (TREE_TYPE (part)));
PUT2(i);
have_value = DECL_INITIAL (part) != NULL_TREE
&& FIELD_STATIC (part) && CONSTANT_VALUE_P (DECL_INITIAL (part));
&& FIELD_STATIC (part) && CONSTANT_VALUE_P (DECL_INITIAL (part))
&& FIELD_FINAL (part);
if (have_value)
attr_count++;
@ -2896,6 +2897,8 @@ generate_classfile (clas, state)
{
tree init = DECL_INITIAL (part);
static tree ConstantValue_node = NULL_TREE;
// This conversion is a work-around for front-end bug.
init = convert (TREE_TYPE (part), init);
ptr = append_chunk (NULL, 8, state);
if (ConstantValue_node == NULL_TREE)
ConstantValue_node = get_identifier ("ConstantValue");