diff options
author | tromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-02-04 20:49:27 +0000 |
---|---|---|
committer | tromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-02-04 20:49:27 +0000 |
commit | 2e1ddfaaaeb7479c9719878f400ada9d01d3773a (patch) | |
tree | f2e35a2ea96bcecfa7499a5ec8161bd2528c22d5 /libjava/defineclass.cc | |
parent | a61eb77ebc7e5552d9502bc5c1ab36cf8b0f9f6f (diff) | |
download | gcc-2e1ddfaaaeb7479c9719878f400ada9d01d3773a.tar.gz |
* defineclass.cc (handleMethodsBegin): Allocate _Jv_MethodBase
pointers.
(handleMethodsEnd): Fixed error messages. Create a _Jv_JNIMethod
if the method is native.
* resolve.cc (ncode): Don't handle native methods.
(_Jv_JNIMethod::ncode): New method.
(_Jv_PrepareClass): Handle native methods.
* jni.cc (call): Renamed from _Jv_JNI_conversion_call.
Include AbstractMethodError.h.
(add_char): New function.
(mangled_name): Likewise.
* include/java-interp.h (class _Jv_JNIMethod): New class.
(class _Jv_MethodBase): New class.
(class _Jv_InterpMethod): Derive from _Jv_MethodBase.
(_Jv_InterpClass): Changed `interpreted_methods' field to type
`_Jv_MethodBase'.
* include/jvm.h (_Jv_FindSymbolInExecutable): Declare.
* java/lang/natRuntime.cc (libraries_size, libraries_count,
libraries): New globals.
(add_library): New function.
(_Jv_FindSymbolInExecutable): New function.
* java/lang/natClassLoader.cc (initiated_classes, loaded_classes):
Now static.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@31790 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava/defineclass.cc')
-rw-r--r-- | libjava/defineclass.cc | 33 |
1 files changed, 24 insertions, 9 deletions
diff --git a/libjava/defineclass.cc b/libjava/defineclass.cc index a439834a647..215fc23cfb0 100644 --- a/libjava/defineclass.cc +++ b/libjava/defineclass.cc @@ -1142,13 +1142,15 @@ void _Jv_ClassReader::handleFieldsEnd () -void _Jv_ClassReader::handleMethodsBegin (int count) +void +_Jv_ClassReader::handleMethodsBegin (int count) { def->methods = (_Jv_Method*) _Jv_AllocBytesChecked (sizeof (_Jv_Method)*count); - def->interpreted_methods = (_Jv_InterpMethod**) - _Jv_AllocBytesChecked (sizeof (_Jv_InterpMethod*) * count); + def->interpreted_methods + = (_Jv_MethodBase **) _Jv_AllocBytesChecked (sizeof (_Jv_MethodBase *) + * count); for (int i = 0; i < count; i++) def->interpreted_methods[i] = 0; @@ -1230,7 +1232,8 @@ void _Jv_ClassReader::handleExceptionTableEntry (int method_index, int exc_index, int start_pc, int end_pc, int handler_pc, int catch_type) { - _Jv_InterpMethod *method = def->interpreted_methods[method_index]; + _Jv_InterpMethod *method = reinterpret_cast<_Jv_InterpMethod *> + (def->interpreted_methods[method_index]); _Jv_InterpException *exc = method->exceptions (); exc[exc_index].start_pc = start_pc; @@ -1246,17 +1249,29 @@ void _Jv_ClassReader::handleMethodsEnd () for (int i = 0; i < def->method_count; i++) { _Jv_Method *method = &def->methods[i]; - if (method->accflags & (Modifier::NATIVE | Modifier::ABSTRACT)) + if ((method->accflags & Modifier::NATIVE) != 0) + { + if (def->interpreted_methods[i] != 0) + throw_class_format_error ("code provided for native method"); + else + { + _Jv_JNIMethod *m = (_Jv_JNIMethod *) + _Jv_AllocBytesChecked (sizeof (_Jv_JNIMethod)); + m->defining_class = def; + m->self = method; + m->function = NULL; + def->interpreted_methods[i] = m; + } + } + else if ((method->accflags & Modifier::ABSTRACT) != 0) { if (def->interpreted_methods[i] != 0) - throw_class_format_error ("code provided " - "for abstract or native method"); + throw_class_format_error ("code provided for abstract method"); } else { if (def->interpreted_methods[i] == 0) - throw_class_format_error ("abstract or native method " - "with no code"); + throw_class_format_error ("method with no code"); } } |