summaryrefslogtreecommitdiffstats
path: root/libjava/java
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/java')
-rw-r--r--libjava/java/lang/natClassLoader.cc29
-rw-r--r--libjava/java/lang/natVMClassLoader.cc1
-rw-r--r--libjava/java/lang/reflect/natMethod.cc43
3 files changed, 31 insertions, 42 deletions
diff --git a/libjava/java/lang/natClassLoader.cc b/libjava/java/lang/natClassLoader.cc
index 00292f93dad..b8d87c6062b 100644
--- a/libjava/java/lang/natClassLoader.cc
+++ b/libjava/java/lang/natClassLoader.cc
@@ -252,27 +252,30 @@ _Jv_FindClass (_Jv_Utf8Const *name, java::lang::ClassLoader *loader)
// Not even a bootstrap loader, try the built-in cache.
klass = _Jv_FindClassInCache (name);
- bool found = false;
- for (int i = 0; i < bootstrap_index; ++i)
+ if (klass)
{
- if (bootstrap_class_list[i] == klass)
+ bool found = false;
+ for (int i = 0; i < bootstrap_index; ++i)
{
- found = true;
- break;
+ if (bootstrap_class_list[i] == klass)
+ {
+ found = true;
+ break;
+ }
+ }
+ if (! found)
+ {
+ if (bootstrap_index == BOOTSTRAP_CLASS_LIST_SIZE)
+ abort ();
+ bootstrap_class_list[bootstrap_index++] = klass;
}
- }
- if (! found)
- {
- if (bootstrap_index == BOOTSTRAP_CLASS_LIST_SIZE)
- abort ();
- bootstrap_class_list[bootstrap_index++] = klass;
}
}
}
else
{
- // we need classes to be in the hash while
- // we're loading, so that they can refer to themselves.
+ // We need classes to be in the hash while we're loading, so
+ // that they can refer to themselves.
_Jv_Linker::wait_for_state (klass, JV_STATE_LOADED);
}
diff --git a/libjava/java/lang/natVMClassLoader.cc b/libjava/java/lang/natVMClassLoader.cc
index e6c3b947d24..182b8d72743 100644
--- a/libjava/java/lang/natVMClassLoader.cc
+++ b/libjava/java/lang/natVMClassLoader.cc
@@ -123,6 +123,7 @@ java::lang::VMClassLoader::getPrimitiveClass (jchar type)
char sig[2];
sig[0] = (char) type;
sig[1] = '\0';
+ // Note: this cannot return NULL, since the input is always correct.
return _Jv_FindClassFromSignature (sig, NULL);
}
diff --git a/libjava/java/lang/reflect/natMethod.cc b/libjava/java/lang/reflect/natMethod.cc
index 4329443146c..b616d1bab63 100644
--- a/libjava/java/lang/reflect/natMethod.cc
+++ b/libjava/java/lang/reflect/natMethod.cc
@@ -38,6 +38,7 @@ details. */
#include <java/lang/Class.h>
#include <gcj/method.h>
#include <gnu/gcj/RawData.h>
+#include <java/lang/NoClassDefFoundError.h>
#include <stdlib.h>
@@ -235,6 +236,8 @@ _Jv_GetTypesFromSignature (jmethodID method,
char *ptr = sig->chars();
int numArgs = 0;
/* First just count the number of parameters. */
+ // FIXME: should do some validation here, e.g., that there is only
+ // one return type.
for (; ; ptr++)
{
switch (*ptr)
@@ -271,44 +274,26 @@ _Jv_GetTypesFromSignature (jmethodID method,
jclass* argPtr = elements (args);
for (ptr = sig->chars(); *ptr != '\0'; ptr++)
{
- int num_arrays = 0;
- jclass type;
- for (; *ptr == '['; ptr++)
- num_arrays++;
- switch (*ptr)
+ if (*ptr == '(')
+ continue;
+ if (*ptr == ')')
{
- default:
- return;
- case ')':
argPtr = return_type_out;
continue;
- case '(':
- continue;
- case 'V':
- case 'B':
- case 'C':
- case 'D':
- case 'F':
- case 'S':
- case 'I':
- case 'J':
- case 'Z':
- type = _Jv_FindClassFromSignature(ptr, loader);
- break;
- case 'L':
- type = _Jv_FindClassFromSignature(ptr, loader);
- do
- ptr++;
- while (*ptr != ';' && ptr[1] != '\0');
- break;
}
- while (--num_arrays >= 0)
- type = _Jv_GetArrayClass (type, loader);
+ char *end_ptr;
+ jclass type = _Jv_FindClassFromSignature (ptr, loader, &end_ptr);
+ if (type == NULL)
+ // FIXME: This isn't ideal.
+ throw new java::lang::NoClassDefFoundError (sig->toString());
+
// ARGPTR can be NULL if we are processing the return value of a
// call from Constructor.
if (argPtr)
*argPtr++ = type;
+
+ ptr = end_ptr;
}
*arg_types_out = args;
}
OpenPOWER on IntegriCloud