aboutsummaryrefslogtreecommitdiff
path: root/libjava/interpret.cc
diff options
context:
space:
mode:
authorColin Walters <walters@verbum.org>2005-07-08 19:13:30 +0000
committerTom Tromey <tromey@gcc.gnu.org>2005-07-08 19:13:30 +0000
commit3ffa3729c00a1d9ddd52a89813ccd31b28b552f5 (patch)
tree0bf8d5318f0fbf36f3291b621e882cf69a6cd8bb /libjava/interpret.cc
parent1ff54bfbdbfd76a6cc058404d9be7ec934e7d10a (diff)
downloadgcc-3ffa3729c00a1d9ddd52a89813ccd31b28b552f5.zip
gcc-3ffa3729c00a1d9ddd52a89813ccd31b28b552f5.tar.gz
gcc-3ffa3729c00a1d9ddd52a89813ccd31b28b552f5.tar.bz2
verify.cc (class _Jv_BytecodeVerifier): Don't check for abstract classes or interfaces here...
2005-07-06 Colin Walters <walters@verbum.org> * verify.cc (class _Jv_BytecodeVerifier) <op_new>: Don't check for abstract classes or interfaces here; JVM spec says it should throw an exception, so we'll do so later. * interpret.cc (run): Throw an InstantiationException for abstract classes and interfaces. From-SVN: r101788
Diffstat (limited to 'libjava/interpret.cc')
-rw-r--r--libjava/interpret.cc5
1 files changed, 5 insertions, 0 deletions
diff --git a/libjava/interpret.cc b/libjava/interpret.cc
index 8b46dc6..dcda95e 100644
--- a/libjava/interpret.cc
+++ b/libjava/interpret.cc
@@ -30,6 +30,7 @@ details. */
#include <java/lang/NullPointerException.h>
#include <java/lang/ArithmeticException.h>
#include <java/lang/IncompatibleClassChangeError.h>
+#include <java/lang/InstantiationException.h>
#include <java/lang/Thread.h>
#include <java-insns.h>
#include <java-signal.h>
@@ -2942,6 +2943,10 @@ _Jv_InterpMethod::run (void *retp, ffi_raw *args, _Jv_InterpMethod *meth)
int index = GET2U ();
jclass klass = (_Jv_Linker::resolve_pool_entry (meth->defining_class,
index)).clazz;
+ /* VM spec, section 3.11.5 */
+ if ((klass->getModifiers() & Modifier::ABSTRACT)
+ || klass->isInterface())
+ throw new java::lang::InstantiationException;
jobject res = _Jv_AllocObject (klass);
PUSHA (res);