From e00388458d34ab0954df5d12c9d45ee0fd794e58 Mon Sep 17 00:00:00 2001 From: Andrew Haley Date: Thu, 8 Dec 2005 13:52:39 +0000 Subject: [PATCH] java-tree.h (enum java_tree_index): Add JTI_SOFT_NOSUCHFIELD_NODE. 2005-12-08 Andrew Haley * java-tree.h (enum java_tree_index): Add JTI_SOFT_NOSUCHFIELD_NODE. (soft_abstractmethod_node): New. * expr.c (build_field_ref): Add in-line check for missing field. * decl.c (java_init_decl_processing): Add soft_nosuchfield_node. 2005-12-08 Andrew Haley * java/lang/Object.h (throwNoSuchMethodError): New method. * java/lang/Object.java (throwNoSuchMethodError): New method. * include/jvm.h (_Jv_ThrowNoSuchFieldError): Declare. * link.cc (_Jv_ThrowNoSuchFieldError): New. (link_symbol_table): Don't throw a NoSuchFieldError if a field is missing. Instead, set the otable entry to zero. (link_symbol_table): If we don't find a nonstatic method, insert the vtable offset of Object.throwNoSuchMethodError() into the otable. [[Split portion of a mixed commit.]] From-SVN: r108230.2 --- gcc/java/ChangeLog | 7 +++++++ gcc/java/decl.c | 9 +++++++++ gcc/java/expr.c | 11 +++++++++++ gcc/java/java-tree.h | 3 +++ 4 files changed, 30 insertions(+) diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index 477f552698f..9e01fd09022 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -1,3 +1,10 @@ +2005-12-08 Andrew Haley + + * java-tree.h (enum java_tree_index): Add JTI_SOFT_NOSUCHFIELD_NODE. + (soft_abstractmethod_node): New. + * expr.c (build_field_ref): Add in-line check for missing field. + * decl.c (java_init_decl_processing): Add soft_nosuchfield_node. + 2005-12-07 Rafael Ávila de Espíndola * Make-lang.in (java.all.build, java.install-normal): Remove. diff --git a/gcc/java/decl.c b/gcc/java/decl.c index 21488ff5354..7ef1325be90 100644 --- a/gcc/java/decl.c +++ b/gcc/java/decl.c @@ -1116,6 +1116,15 @@ java_init_decl_processing (void) TREE_THIS_VOLATILE (soft_abstractmethod_node) = 1; TREE_SIDE_EFFECTS (soft_abstractmethod_node) = 1; + soft_nosuchfield_node + = builtin_function ("_Jv_ThrowNoSuchFieldError", + build_function_type (void_type_node, endlink), + 0, NOT_BUILT_IN, NULL, NULL_TREE); + /* Mark soft_nosuchfield_node as a `noreturn' function with side + effects. */ + TREE_THIS_VOLATILE (soft_nosuchfield_node) = 1; + TREE_SIDE_EFFECTS (soft_nosuchfield_node) = 1; + t = tree_cons (NULL_TREE, class_ptr_type, tree_cons (NULL_TREE, object_ptr_type_node, endlink)); soft_checkcast_node diff --git a/gcc/java/expr.c b/gcc/java/expr.c index 81bd6fac180..e7b299245a1 100644 --- a/gcc/java/expr.c +++ b/gcc/java/expr.c @@ -1703,6 +1703,17 @@ build_field_ref (tree self_value, tree self_class, tree name) NULL_TREE, NULL_TREE); tree address; + if (DECL_CONTEXT (field_decl) != output_class) + field_offset + = build3 (COND_EXPR, TREE_TYPE (field_offset), + build2 (EQ_EXPR, boolean_type_node, + field_offset, integer_zero_node), + build3 (CALL_EXPR, void_type_node, + build_address_of (soft_nosuchfield_node), + build_tree_list (NULL_TREE, otable_index), + NULL_TREE), + field_offset); + field_offset = fold (convert (sizetype, field_offset)); address = fold_build2 (PLUS_EXPR, diff --git a/gcc/java/java-tree.h b/gcc/java/java-tree.h index d3371318960..d421b514a46 100644 --- a/gcc/java/java-tree.h +++ b/gcc/java/java-tree.h @@ -386,6 +386,7 @@ enum java_tree_index JTI_SOFT_BADARRAYINDEX_NODE, JTI_SOFT_NULLPOINTER_NODE, JTI_SOFT_ABSTRACTMETHOD_NODE, + JTI_SOFT_NOSUCHFIELD_NODE, JTI_SOFT_CHECKARRAYSTORE_NODE, JTI_SOFT_MONITORENTER_NODE, JTI_SOFT_MONITOREXIT_NODE, @@ -648,6 +649,8 @@ extern GTY(()) tree java_global_trees[JTI_MAX]; java_global_trees[JTI_SOFT_NULLPOINTER_NODE] #define soft_abstractmethod_node \ java_global_trees[JTI_SOFT_ABSTRACTMETHOD_NODE] +#define soft_nosuchfield_node \ + java_global_trees[JTI_SOFT_NOSUCHFIELD_NODE] #define soft_checkarraystore_node \ java_global_trees[JTI_SOFT_CHECKARRAYSTORE_NODE] #define soft_monitorenter_node \ -- 2.30.2