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
This commit is contained in:
Colin Walters 2005-07-08 19:13:30 +00:00 committed by Tom Tromey
parent 1ff54bfbdb
commit 3ffa3729c0
3 changed files with 15 additions and 2 deletions

View File

@ -1,3 +1,11 @@
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.
2005-07-08 Andrew Haley <aph@redhat.com>
* posix-threads.cc (_Jv_ThreadSetPriority): Use SCHED_OTHER

View File

@ -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);

View File

@ -2926,8 +2926,8 @@ private:
case op_new:
{
type t = check_class_constant (get_ushort ());
if (t.isarray () || t.isinterface (this) || t.isabstract (this))
verify_fail ("type is array, interface, or abstract");
if (t.isarray ())
verify_fail ("type is array");
t.set_uninitialized (start_PC, this);
push_type (t);
}