summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>2005-06-15 19:11:43 +0000
committertromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>2005-06-15 19:11:43 +0000
commitbeb3619b397cda4a2bc36d3b926b653fc67627fd (patch)
treed75a57626d585261ba5d3eae3b74954aa5b37586
parentc8c2d11079530635a3bc051c8a6ef73dd2190d29 (diff)
downloadppe42-gcc-beb3619b397cda4a2bc36d3b926b653fc67627fd.tar.gz
ppe42-gcc-beb3619b397cda4a2bc36d3b926b653fc67627fd.zip
gcc/java/:
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. libjava/: 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@100992 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/java/ChangeLog10
-rw-r--r--gcc/java/class.c5
-rw-r--r--gcc/java/decl.c9
-rw-r--r--gcc/java/java-tree.h3
-rw-r--r--libjava/ChangeLog11
-rw-r--r--libjava/defineclass.cc3
-rw-r--r--libjava/include/jvm.h2
-rw-r--r--libjava/link.cc9
8 files changed, 46 insertions, 6 deletions
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 <tromey@redhat.com>
+
+ 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 <geoffk@apple.com>
* 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,5 +1,16 @@
2005-06-15 Tom Tromey <tromey@redhat.com>
+ 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 <tromey@redhat.com>
+
* gnu/gcj/runtime/SystemClassLoader.java (init): Clear
last_was_sep in loop.
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);
}
OpenPOWER on IntegriCloud