aboutsummaryrefslogtreecommitdiff
path: root/libjava/defineclass.cc
diff options
context:
space:
mode:
authorTom Tromey <tromey@redhat.com>2003-01-24 19:58:21 +0000
committerTom Tromey <tromey@gcc.gnu.org>2003-01-24 19:58:21 +0000
commit4c98b1b0782cb1ad25a5d1f44391d65b12f9a566 (patch)
treef37c4a601e54ff85516e178f32e45db587bf62ce /libjava/defineclass.cc
parentd291503a6733535c462bf71c03347c2452a523ee (diff)
downloadgcc-4c98b1b0782cb1ad25a5d1f44391d65b12f9a566.zip
gcc-4c98b1b0782cb1ad25a5d1f44391d65b12f9a566.tar.gz
gcc-4c98b1b0782cb1ad25a5d1f44391d65b12f9a566.tar.bz2
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
Diffstat (limited to 'libjava/defineclass.cc')
-rw-r--r--libjava/defineclass.cc21
1 files changed, 20 insertions, 1 deletions
diff --git a/libjava/defineclass.cc b/libjava/defineclass.cc
index 81de5ad..001fa01 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)