aboutsummaryrefslogtreecommitdiff
path: root/libjava/java
diff options
context:
space:
mode:
authorTom Tromey <tromey@redhat.com>2003-05-01 21:36:18 +0000
committerTom Tromey <tromey@gcc.gnu.org>2003-05-01 21:36:18 +0000
commit06b021af7b30d4aa8793f2f638b701462788d814 (patch)
tree440306528a8f43570c476adff8f6b799ce240878 /libjava/java
parentc93139b8267b5bf6debc9f697eb49b0d6dfe43d4 (diff)
downloadgcc-06b021af7b30d4aa8793f2f638b701462788d814.zip
gcc-06b021af7b30d4aa8793f2f638b701462788d814.tar.gz
gcc-06b021af7b30d4aa8793f2f638b701462788d814.tar.bz2
re PR libgcj/10582 (array assignment fails in some situations)
PR libgcj/10582: * verify.cc (_Jv_BytecodeVerifier::is_assignable_from_slow): Removed. (type::compatible): Use _Jv_IsAssignableFrom. * java/lang/natClass.cc (iindex_mutex_initialized): Now static. (_Jv_IsAssignableFrom): Work even when source or target class is not prepared. From-SVN: r66348
Diffstat (limited to 'libjava/java')
-rw-r--r--libjava/java/lang/natClass.cc40
1 files changed, 24 insertions, 16 deletions
diff --git a/libjava/java/lang/natClass.cc b/libjava/java/lang/natClass.cc
index 417c059..0db8228 100644
--- a/libjava/java/lang/natClass.cc
+++ b/libjava/java/lang/natClass.cc
@@ -981,14 +981,14 @@ _Jv_IsAssignableFrom (jclass target, jclass source)
{
if (source == target)
return true;
-
+
// If target is array, so must source be.
- if (target->isArray ())
+ while (target->isArray ())
{
if (! source->isArray())
return false;
- return _Jv_IsAssignableFrom(target->getComponentType(),
- source->getComponentType());
+ target = target->getComponentType();
+ source = source->getComponentType();
}
if (target->isInterface())
@@ -998,7 +998,7 @@ _Jv_IsAssignableFrom (jclass target, jclass source)
if (__builtin_expect
(source->idt == NULL || source->isInterface(), false))
return _Jv_InterfaceAssignableFrom (target, source);
-
+
_Jv_IDispatchTable *cl_idt = source->idt;
_Jv_IDispatchTable *if_idt = target->idt;
@@ -1014,23 +1014,31 @@ _Jv_IsAssignableFrom (jclass target, jclass source)
}
return false;
}
-
+
// Primitive TYPE classes are only assignable to themselves.
- if (__builtin_expect (target->isPrimitive(), false))
+ if (__builtin_expect (target->isPrimitive() || source->isPrimitive(), false))
return false;
-
+
if (target == &java::lang::Object::class$)
+ return true;
+ else if (source->ancestors == NULL || target->ancestors == NULL)
{
- if (source->isPrimitive())
- return false;
- return true;
+ // We need this case when either SOURCE or TARGET has not has
+ // its constant-time tables prepared.
+
+ // At this point we know that TARGET can't be Object, so it is
+ // safe to use that as the termination point.
+ while (source && source != &java::lang::Object::class$)
+ {
+ if (source == target)
+ return true;
+ source = source->getSuperclass();
+ }
}
- else if (source->ancestors != NULL
- && target->ancestors != NULL
- && source->depth >= target->depth
+ else if (source->depth >= target->depth
&& source->ancestors[source->depth - target->depth] == target)
return true;
-
+
return false;
}
@@ -1373,7 +1381,7 @@ _Jv_AppendPartialITable (jclass klass, jclass iface, void **itable,
}
static _Jv_Mutex_t iindex_mutex;
-bool iindex_mutex_initialized = false;
+static bool iindex_mutex_initialized = false;
// We need to find the correct offset in the Class Interface Dispatch
// Table for a given interface. Once we have that, invoking an interface