diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index d8cdd416544..b6f6e3a694d 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -1,3 +1,13 @@ +2005-06-15 Tom Tromey + + PR libgcj/21906: + * class.c (make_method_value): Use soft_abstractmethod_node for + abstract method. + * java-tree.h (soft_abstractmethod_node): New define. + (JTI_SOFT_ABSTRACTMETHOD_NODE): New enum constant. + * decl.c (java_init_decl_processing): Initialize + soft_abstractmethod_node. + 2005-06-13 Geoffrey Keating * Make-lang.in (rule for installing gcj.1): Depends on installdirs. diff --git a/gcc/java/class.c b/gcc/java/class.c index a555bf09882..f4441214633 100644 --- a/gcc/java/class.c +++ b/gcc/java/class.c @@ -1315,7 +1315,10 @@ make_method_value (tree mdecl) index = integer_minus_one_node; code = null_pointer_node; - if (!METHOD_ABSTRACT (mdecl)) + if (METHOD_ABSTRACT (mdecl)) + code = build1 (ADDR_EXPR, nativecode_ptr_type_node, + soft_abstractmethod_node); + else code = build1 (ADDR_EXPR, nativecode_ptr_type_node, make_local_function_alias (mdecl)); START_RECORD_CONSTRUCTOR (minit, method_type_node); diff --git a/gcc/java/decl.c b/gcc/java/decl.c index 891e4dbe406..5240fbacd3b 100644 --- a/gcc/java/decl.c +++ b/gcc/java/decl.c @@ -1107,6 +1107,15 @@ java_init_decl_processing (void) TREE_THIS_VOLATILE (soft_nullpointer_node) = 1; TREE_SIDE_EFFECTS (soft_nullpointer_node) = 1; + soft_abstractmethod_node + = builtin_function ("_Jv_ThrowAbstractMethodError", + build_function_type (void_type_node, endlink), + 0, NOT_BUILT_IN, NULL, NULL_TREE); + /* Mark soft_abstractmethod_node as a `noreturn' function with side + effects. */ + TREE_THIS_VOLATILE (soft_abstractmethod_node) = 1; + TREE_SIDE_EFFECTS (soft_abstractmethod_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/java-tree.h b/gcc/java/java-tree.h index 5651dc3f643..3d0f2331110 100644 --- a/gcc/java/java-tree.h +++ b/gcc/java/java-tree.h @@ -392,6 +392,7 @@ enum java_tree_index JTI_SOFT_MULTIANEWARRAY_NODE, JTI_SOFT_BADARRAYINDEX_NODE, JTI_SOFT_NULLPOINTER_NODE, + JTI_SOFT_ABSTRACTMETHOD_NODE, JTI_SOFT_CHECKARRAYSTORE_NODE, JTI_SOFT_MONITORENTER_NODE, JTI_SOFT_MONITOREXIT_NODE, @@ -651,6 +652,8 @@ extern GTY(()) tree java_global_trees[JTI_MAX]; java_global_trees[JTI_SOFT_BADARRAYINDEX_NODE] #define soft_nullpointer_node \ java_global_trees[JTI_SOFT_NULLPOINTER_NODE] +#define soft_abstractmethod_node \ + java_global_trees[JTI_SOFT_ABSTRACTMETHOD_NODE] #define soft_checkarraystore_node \ java_global_trees[JTI_SOFT_CHECKARRAYSTORE_NODE] #define soft_monitorenter_node \ diff --git a/libjava/ChangeLog b/libjava/ChangeLog index b832616e94d..813eef1db91 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,14 @@ +2005-06-15 Tom Tromey + + PR libgcj/21906: + * defineclass.cc (handleMethodsEnd): Set ncode for abstract + methods. + * include/jvm.h (_Jv_ThrowAbstractMethodError): Declare. + * link.cc (_Jv_ThrowAbstractMethodError): Renamed. No longer + static. + (append_partial_itable): Use it. + (set_vtable_entries): Likewise. + 2005-06-15 Tom Tromey * gnu/gcj/runtime/SystemClassLoader.java (init): Clear diff --git a/libjava/defineclass.cc b/libjava/defineclass.cc index 111b1fb2ca2..7564957dc43 100644 --- a/libjava/defineclass.cc +++ b/libjava/defineclass.cc @@ -1288,7 +1288,7 @@ void _Jv_ClassReader::handleMethod throw_class_format_error ("erroneous method access flags"); // FIXME: JVM spec S4.6: if ABSTRACT modifier is set, verify other - // flags are not set. Verify flags for interface methods. Verifiy + // flags are not set. Verify flags for interface methods. Verify // modifiers for initializers. } } @@ -1378,6 +1378,7 @@ void _Jv_ClassReader::handleMethodsEnd () { if (def_interp->interpreted_methods[i] != 0) throw_class_format_error ("code provided for abstract method"); + method->ncode = (void *) &_Jv_ThrowAbstractMethodError; } else { diff --git a/libjava/include/jvm.h b/libjava/include/jvm.h index 3a2eb9b923e..606a84ddcbf 100644 --- a/libjava/include/jvm.h +++ b/libjava/include/jvm.h @@ -482,6 +482,8 @@ extern void _Jv_CallAnyMethodA (jobject obj, extern jobject _Jv_NewMultiArray (jclass, jint ndims, jint* dims) __attribute__((__malloc__)); +extern "C" void _Jv_ThrowAbstractMethodError () __attribute__((__noreturn__)); + /* Checked divide subroutines. */ extern "C" { diff --git a/libjava/link.cc b/libjava/link.cc index 3fe073463f9..e97b31bb78e 100644 --- a/libjava/link.cc +++ b/libjava/link.cc @@ -714,8 +714,8 @@ _Jv_ThrowNoSuchMethodError () } // This is put in empty vtable slots. -static void -_Jv_abstractMethodError (void) +void +_Jv_ThrowAbstractMethodError () { throw new java::lang::AbstractMethodError(); } @@ -767,7 +767,7 @@ _Jv_Linker::append_partial_itable (jclass klass, jclass iface, (_Jv_GetMethodString (klass, meth)); if ((meth->accflags & Modifier::ABSTRACT) != 0) - itable[pos] = (void *) &_Jv_abstractMethodError; + itable[pos] = (void *) &_Jv_ThrowAbstractMethodError; else itable[pos] = meth->ncode; } @@ -1228,7 +1228,8 @@ _Jv_Linker::set_vtable_entries (jclass klass, _Jv_VTable *vtable) if ((meth->accflags & Modifier::ABSTRACT)) // FIXME: it might be nice to have a libffi trampoline here, // so we could pass in the method name and other information. - vtable->set_method(meth->index, (void *) &_Jv_abstractMethodError); + vtable->set_method(meth->index, + (void *) &_Jv_ThrowAbstractMethodError); else vtable->set_method(meth->index, meth->ncode); }