mirror of git://gcc.gnu.org/git/gcc.git
defineclass.cc (handleMethodsEnd): Precompute code for static method.
* defineclass.cc (handleMethodsEnd): Precompute code for static method. (handleCodeAttribute): Likewise. * resolve.cc (ncode): Use run_class for unsynchronized static methods. * include/java-interp.h (class _Jv_InterpMethod): Declare run_class. * interpret.cc (run_synch_class): Initialize class. (run) [insn_invokestatic]: Don't initialize class. [insn_anewarray]: Likewise. [insn_multianewarray]: Likewise. (run_class): New function. From-SVN: r61727
This commit is contained in:
parent
d291503a67
commit
4c98b1b078
|
|
@ -1,3 +1,18 @@
|
||||||
|
2003-01-24 Tom Tromey <tromey@redhat.com>
|
||||||
|
|
||||||
|
* defineclass.cc (handleMethodsEnd): Precompute code for static
|
||||||
|
method.
|
||||||
|
(handleCodeAttribute): Likewise.
|
||||||
|
* resolve.cc (ncode): Use run_class for unsynchronized static
|
||||||
|
methods.
|
||||||
|
* include/java-interp.h (class _Jv_InterpMethod): Declare
|
||||||
|
run_class.
|
||||||
|
* interpret.cc (run_synch_class): Initialize class.
|
||||||
|
(run) [insn_invokestatic]: Don't initialize class.
|
||||||
|
[insn_anewarray]: Likewise.
|
||||||
|
[insn_multianewarray]: Likewise.
|
||||||
|
(run_class): New function.
|
||||||
|
|
||||||
2003-01-24 Tom Tromey <tromey@redhat.com>
|
2003-01-24 Tom Tromey <tromey@redhat.com>
|
||||||
|
|
||||||
* java/lang/ClassLoader.java (findLoadedClass): Removed erroneous
|
* java/lang/ClassLoader.java (findLoadedClass): Removed erroneous
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
// defineclass.cc - defining a class from .class format.
|
// defineclass.cc - defining a class from .class format.
|
||||||
|
|
||||||
/* Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation
|
/* Copyright (C) 1999, 2000, 2001, 2002, 2003 Free Software Foundation
|
||||||
|
|
||||||
This file is part of libgcj.
|
This file is part of libgcj.
|
||||||
|
|
||||||
|
|
@ -1267,6 +1267,15 @@ void _Jv_ClassReader::handleCodeAttribute
|
||||||
code_length);
|
code_length);
|
||||||
|
|
||||||
def->interpreted_methods[method_index] = method;
|
def->interpreted_methods[method_index] = method;
|
||||||
|
|
||||||
|
if ((method->self->accflags & java::lang::reflect::Modifier::STATIC))
|
||||||
|
{
|
||||||
|
// Precompute the ncode field for a static method. This lets us
|
||||||
|
// call a static method of an interpreted class from precompiled
|
||||||
|
// code without first resolving the class (that will happen
|
||||||
|
// during class initialization instead).
|
||||||
|
method->self->ncode = method->ncode ();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void _Jv_ClassReader::handleExceptionTableEntry
|
void _Jv_ClassReader::handleExceptionTableEntry
|
||||||
|
|
@ -1302,6 +1311,16 @@ void _Jv_ClassReader::handleMethodsEnd ()
|
||||||
m->self = method;
|
m->self = method;
|
||||||
m->function = NULL;
|
m->function = NULL;
|
||||||
def->interpreted_methods[i] = m;
|
def->interpreted_methods[i] = m;
|
||||||
|
|
||||||
|
if ((method->accflags & Modifier::STATIC))
|
||||||
|
{
|
||||||
|
// Precompute the ncode field for a static method.
|
||||||
|
// This lets us call a static method of an
|
||||||
|
// interpreted class from precompiled code without
|
||||||
|
// first resolving the class (that will happen
|
||||||
|
// during class initialization instead).
|
||||||
|
method->ncode = m->ncode ();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ((method->accflags & Modifier::ABSTRACT) != 0)
|
else if ((method->accflags & Modifier::ABSTRACT) != 0)
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
// java-interp.h - Header file for the bytecode interpreter. -*- c++ -*-
|
// java-interp.h - Header file for the bytecode interpreter. -*- c++ -*-
|
||||||
|
|
||||||
/* Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation
|
/* Copyright (C) 1999, 2000, 2001, 2002, 2003 Free Software Foundation
|
||||||
|
|
||||||
This file is part of libgcj.
|
This file is part of libgcj.
|
||||||
|
|
||||||
|
|
@ -132,6 +132,7 @@ class _Jv_InterpMethod : public _Jv_MethodBase
|
||||||
|
|
||||||
static void run_normal (ffi_cif*, void*, ffi_raw*, void*);
|
static void run_normal (ffi_cif*, void*, ffi_raw*, void*);
|
||||||
static void run_synch_object (ffi_cif*, void*, ffi_raw*, void*);
|
static void run_synch_object (ffi_cif*, void*, ffi_raw*, void*);
|
||||||
|
static void run_class (ffi_cif*, void*, ffi_raw*, void*);
|
||||||
static void run_synch_class (ffi_cif*, void*, ffi_raw*, void*);
|
static void run_synch_class (ffi_cif*, void*, ffi_raw*, void*);
|
||||||
|
|
||||||
void run (void*, ffi_raw *);
|
void run (void*, ffi_raw *);
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
// interpret.cc - Code for the interpreter
|
// interpret.cc - Code for the interpreter
|
||||||
|
|
||||||
/* Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation
|
/* Copyright (C) 1999, 2000, 2001, 2002, 2003 Free Software Foundation
|
||||||
|
|
||||||
This file is part of libgcj.
|
This file is part of libgcj.
|
||||||
|
|
||||||
|
|
@ -240,19 +240,21 @@ static jint get4(unsigned char* loc) {
|
||||||
} \
|
} \
|
||||||
while (0)
|
while (0)
|
||||||
|
|
||||||
void _Jv_InterpMethod::run_normal (ffi_cif *,
|
void
|
||||||
void* ret,
|
_Jv_InterpMethod::run_normal (ffi_cif *,
|
||||||
ffi_raw * args,
|
void* ret,
|
||||||
void* __this)
|
ffi_raw * args,
|
||||||
|
void* __this)
|
||||||
{
|
{
|
||||||
_Jv_InterpMethod *_this = (_Jv_InterpMethod *) __this;
|
_Jv_InterpMethod *_this = (_Jv_InterpMethod *) __this;
|
||||||
_this->run (ret, args);
|
_this->run (ret, args);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _Jv_InterpMethod::run_synch_object (ffi_cif *,
|
void
|
||||||
void* ret,
|
_Jv_InterpMethod::run_synch_object (ffi_cif *,
|
||||||
ffi_raw * args,
|
void* ret,
|
||||||
void* __this)
|
ffi_raw * args,
|
||||||
|
void* __this)
|
||||||
{
|
{
|
||||||
_Jv_InterpMethod *_this = (_Jv_InterpMethod *) __this;
|
_Jv_InterpMethod *_this = (_Jv_InterpMethod *) __this;
|
||||||
|
|
||||||
|
|
@ -262,14 +264,27 @@ void _Jv_InterpMethod::run_synch_object (ffi_cif *,
|
||||||
_this->run (ret, args);
|
_this->run (ret, args);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _Jv_InterpMethod::run_synch_class (ffi_cif *,
|
void
|
||||||
void* ret,
|
_Jv_InterpMethod::run_class (ffi_cif *,
|
||||||
ffi_raw * args,
|
void* ret,
|
||||||
void* __this)
|
ffi_raw * args,
|
||||||
|
void* __this)
|
||||||
|
{
|
||||||
|
_Jv_InterpMethod *_this = (_Jv_InterpMethod *) __this;
|
||||||
|
_Jv_InitClass (_this->defining_class);
|
||||||
|
_this->run (ret, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
_Jv_InterpMethod::run_synch_class (ffi_cif *,
|
||||||
|
void* ret,
|
||||||
|
ffi_raw * args,
|
||||||
|
void* __this)
|
||||||
{
|
{
|
||||||
_Jv_InterpMethod *_this = (_Jv_InterpMethod *) __this;
|
_Jv_InterpMethod *_this = (_Jv_InterpMethod *) __this;
|
||||||
|
|
||||||
jclass sync = _this->defining_class;
|
jclass sync = _this->defining_class;
|
||||||
|
_Jv_InitClass (sync);
|
||||||
JvSynchronize mutex (sync);
|
JvSynchronize mutex (sync);
|
||||||
|
|
||||||
_this->run (ret, args);
|
_this->run (ret, args);
|
||||||
|
|
@ -2833,7 +2848,6 @@ _Jv_InterpMethod::run (void *retp, ffi_raw *args)
|
||||||
|
|
||||||
sp -= rmeth->stack_item_count;
|
sp -= rmeth->stack_item_count;
|
||||||
|
|
||||||
_Jv_InitClass (rmeth->klass);
|
|
||||||
fun = (void (*)()) rmeth->method->ncode;
|
fun = (void (*)()) rmeth->method->ncode;
|
||||||
|
|
||||||
#ifdef DIRECT_THREADED
|
#ifdef DIRECT_THREADED
|
||||||
|
|
@ -2903,6 +2917,9 @@ _Jv_InterpMethod::run (void *retp, ffi_raw *args)
|
||||||
{
|
{
|
||||||
int index = GET2U ();
|
int index = GET2U ();
|
||||||
jclass klass = (_Jv_ResolvePoolEntry (defining_class, index)).clazz;
|
jclass klass = (_Jv_ResolvePoolEntry (defining_class, index)).clazz;
|
||||||
|
// We initialize here because otherwise `size_in_bytes' may
|
||||||
|
// not be set correctly, leading us to pass `0' as the size.
|
||||||
|
// FIXME: fix in the allocator? There is a PR for this.
|
||||||
_Jv_InitClass (klass);
|
_Jv_InitClass (klass);
|
||||||
jobject res = _Jv_AllocObject (klass, klass->size_in_bytes);
|
jobject res = _Jv_AllocObject (klass, klass->size_in_bytes);
|
||||||
PUSHA (res);
|
PUSHA (res);
|
||||||
|
|
@ -2938,7 +2955,6 @@ _Jv_InterpMethod::run (void *retp, ffi_raw *args)
|
||||||
int index = GET2U ();
|
int index = GET2U ();
|
||||||
jclass klass = (_Jv_ResolvePoolEntry (defining_class, index)).clazz;
|
jclass klass = (_Jv_ResolvePoolEntry (defining_class, index)).clazz;
|
||||||
int size = POPI();
|
int size = POPI();
|
||||||
_Jv_InitClass (klass);
|
|
||||||
jobject result = _Jv_NewObjectArray (size, klass, 0);
|
jobject result = _Jv_NewObjectArray (size, klass, 0);
|
||||||
PUSHA (result);
|
PUSHA (result);
|
||||||
|
|
||||||
|
|
@ -3072,7 +3088,6 @@ _Jv_InterpMethod::run (void *retp, ffi_raw *args)
|
||||||
|
|
||||||
jclass type
|
jclass type
|
||||||
= (_Jv_ResolvePoolEntry (defining_class, kind_index)).clazz;
|
= (_Jv_ResolvePoolEntry (defining_class, kind_index)).clazz;
|
||||||
_Jv_InitClass (type);
|
|
||||||
jint *sizes = (jint*) __builtin_alloca (sizeof (jint)*dim);
|
jint *sizes = (jint*) __builtin_alloca (sizeof (jint)*dim);
|
||||||
|
|
||||||
for (int i = dim - 1; i >= 0; i--)
|
for (int i = dim - 1; i >= 0; i--)
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
// resolve.cc - Code for linking and resolving classes and pool entries.
|
// resolve.cc - Code for linking and resolving classes and pool entries.
|
||||||
|
|
||||||
/* Copyright (C) 1999, 2000, 2001 , 2002 Free Software Foundation
|
/* Copyright (C) 1999, 2000, 2001, 2002, 2003 Free Software Foundation
|
||||||
|
|
||||||
This file is part of libgcj.
|
This file is part of libgcj.
|
||||||
|
|
||||||
|
|
@ -947,7 +947,10 @@ _Jv_InterpMethod::ncode ()
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fun = (ffi_closure_fun)&_Jv_InterpMethod::run_normal;
|
if (staticp)
|
||||||
|
fun = (ffi_closure_fun)&_Jv_InterpMethod::run_class;
|
||||||
|
else
|
||||||
|
fun = (ffi_closure_fun)&_Jv_InterpMethod::run_normal;
|
||||||
}
|
}
|
||||||
|
|
||||||
FFI_PREP_RAW_CLOSURE (&closure->closure,
|
FFI_PREP_RAW_CLOSURE (&closure->closure,
|
||||||
|
|
@ -959,7 +962,6 @@ _Jv_InterpMethod::ncode ()
|
||||||
return self->ncode;
|
return self->ncode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void *
|
void *
|
||||||
_Jv_JNIMethod::ncode ()
|
_Jv_JNIMethod::ncode ()
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue