diff options
author | tromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-01-24 19:58:21 +0000 |
---|---|---|
committer | tromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-01-24 19:58:21 +0000 |
commit | 82733f8decd8b228c8152ae27fd102701250c456 (patch) | |
tree | f37c4a601e54ff85516e178f32e45db587bf62ce /libjava | |
parent | 1c681b131ccb08de78b30381f9e9bd38c144dbfa (diff) | |
download | gcc-82733f8decd8b228c8152ae27fd102701250c456.tar.gz |
* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@61727 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava')
-rw-r--r-- | libjava/ChangeLog | 15 | ||||
-rw-r--r-- | libjava/defineclass.cc | 21 | ||||
-rw-r--r-- | libjava/include/java-interp.h | 3 | ||||
-rw-r--r-- | libjava/interpret.cc | 47 | ||||
-rw-r--r-- | libjava/resolve.cc | 8 |
5 files changed, 73 insertions, 21 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 6eb3f1bcfca..1b9a81ce5e2 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,5 +1,20 @@ 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> + * java/lang/ClassLoader.java (findLoadedClass): Removed erroneous comment. diff --git a/libjava/defineclass.cc b/libjava/defineclass.cc index 81de5ad7da2..001fa0131f0 100644 --- a/libjava/defineclass.cc +++ b/libjava/defineclass.cc @@ -1,6 +1,6 @@ // 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. @@ -1267,6 +1267,15 @@ void _Jv_ClassReader::handleCodeAttribute code_length); 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 @@ -1302,6 +1311,16 @@ void _Jv_ClassReader::handleMethodsEnd () m->self = method; m->function = NULL; 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) diff --git a/libjava/include/java-interp.h b/libjava/include/java-interp.h index a00f4db0a1d..c801274f4cb 100644 --- a/libjava/include/java-interp.h +++ b/libjava/include/java-interp.h @@ -1,6 +1,6 @@ // 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. @@ -132,6 +132,7 @@ class _Jv_InterpMethod : public _Jv_MethodBase static void run_normal (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*); void run (void*, ffi_raw *); diff --git a/libjava/interpret.cc b/libjava/interpret.cc index 15fb413e835..43d627921fb 100644 --- a/libjava/interpret.cc +++ b/libjava/interpret.cc @@ -1,6 +1,6 @@ // 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. @@ -240,19 +240,21 @@ static jint get4(unsigned char* loc) { } \ while (0) -void _Jv_InterpMethod::run_normal (ffi_cif *, - void* ret, - ffi_raw * args, - void* __this) +void +_Jv_InterpMethod::run_normal (ffi_cif *, + void* ret, + ffi_raw * args, + void* __this) { _Jv_InterpMethod *_this = (_Jv_InterpMethod *) __this; _this->run (ret, args); } -void _Jv_InterpMethod::run_synch_object (ffi_cif *, - void* ret, - ffi_raw * args, - void* __this) +void +_Jv_InterpMethod::run_synch_object (ffi_cif *, + void* ret, + ffi_raw * args, + void* __this) { _Jv_InterpMethod *_this = (_Jv_InterpMethod *) __this; @@ -262,14 +264,27 @@ void _Jv_InterpMethod::run_synch_object (ffi_cif *, _this->run (ret, args); } -void _Jv_InterpMethod::run_synch_class (ffi_cif *, - void* ret, - ffi_raw * args, - void* __this) +void +_Jv_InterpMethod::run_class (ffi_cif *, + void* ret, + 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; jclass sync = _this->defining_class; + _Jv_InitClass (sync); JvSynchronize mutex (sync); _this->run (ret, args); @@ -2833,7 +2848,6 @@ _Jv_InterpMethod::run (void *retp, ffi_raw *args) sp -= rmeth->stack_item_count; - _Jv_InitClass (rmeth->klass); fun = (void (*)()) rmeth->method->ncode; #ifdef DIRECT_THREADED @@ -2903,6 +2917,9 @@ _Jv_InterpMethod::run (void *retp, ffi_raw *args) { int index = GET2U (); 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); jobject res = _Jv_AllocObject (klass, klass->size_in_bytes); PUSHA (res); @@ -2938,7 +2955,6 @@ _Jv_InterpMethod::run (void *retp, ffi_raw *args) int index = GET2U (); jclass klass = (_Jv_ResolvePoolEntry (defining_class, index)).clazz; int size = POPI(); - _Jv_InitClass (klass); jobject result = _Jv_NewObjectArray (size, klass, 0); PUSHA (result); @@ -3072,7 +3088,6 @@ _Jv_InterpMethod::run (void *retp, ffi_raw *args) jclass type = (_Jv_ResolvePoolEntry (defining_class, kind_index)).clazz; - _Jv_InitClass (type); jint *sizes = (jint*) __builtin_alloca (sizeof (jint)*dim); for (int i = dim - 1; i >= 0; i--) diff --git a/libjava/resolve.cc b/libjava/resolve.cc index 00785eed8fc..e69341e385f 100644 --- a/libjava/resolve.cc +++ b/libjava/resolve.cc @@ -1,6 +1,6 @@ // 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. @@ -947,7 +947,10 @@ _Jv_InterpMethod::ncode () } 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, @@ -959,7 +962,6 @@ _Jv_InterpMethod::ncode () return self->ncode; } - void * _Jv_JNIMethod::ncode () { |