re GNATS gcj/129 (Static array length access bug in gcj)

2000-05-02  Alexandre Petit-Bianco  <apbianco@cygnus.com>

        * parse.y (resolve_field_access): Call the appropriate <clinit>
        before accessing the length of a static array. Craft a decl for
        the field while its time.

(Fixes the PR #129:
 http://sourceware.cygnus.com/ml/java-prs/2000-q1/msg00013.html)

From-SVN: r34340
This commit is contained in:
Alexandre Petit-Bianco 2000-06-01 16:04:14 +00:00 committed by Alexandre Petit-Bianco
parent 079b71f5ab
commit 611a4b873e
3 changed files with 30 additions and 0 deletions

View File

@ -34,6 +34,12 @@
`wfl_operator', to maybe_build_primttype_type_ref.
Fixes PR gcj/235.
2000-05-02 Alexandre Petit-Bianco <apbianco@cygnus.com>
* parse.y (resolve_field_access): Call the appropriate <clinit>
before accessing the length of a static array. Craft a decl for
the field while its time. Fixes PR gcj/129.
2000-05-01 Alexandre Petit-Bianco <apbianco@cygnus.com>
* parse.y (resolve_package): Correctly set `*next' (was off by

View File

@ -11348,6 +11348,18 @@ resolve_field_access (qual_wfl, field_decl, field_type)
tree length = build_java_array_length_access (where_found);
field_ref =
build_java_arraynull_check (type_found, length, int_type_node);
/* In case we're dealing with a static array, we need to
initialize its class before the array length can be fetched.
It's also a good time to create a DECL_RTL for the field if
none already exists, otherwise if the field was declared in a
class found in an external file and hasn't been (and won't
be) accessed for its value, none will be created. */
if (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);
}
}
/* We might have been trying to resolve field.method(). In which
case, the resolution is over and decl is the answer */

View File

@ -8650,6 +8650,18 @@ resolve_field_access (qual_wfl, field_decl, field_type)
tree length = build_java_array_length_access (where_found);
field_ref =
build_java_arraynull_check (type_found, length, int_type_node);
/* In case we're dealing with a static array, we need to
initialize its class before the array length can be fetched.
It's also a good time to create a DECL_RTL for the field if
none already exists, otherwise if the field was declared in a
class found in an external file and hasn't been (and won't
be) accessed for its value, none will be created. */
if (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);
}
}
/* We might have been trying to resolve field.method(). In which
case, the resolution is over and decl is the answer */