return result;
}
+#if USES_NEW_SUBTYPE
+/* fast_subtype_check **********************************************************
+
+ Checks if s is a subtype of t, using both the restricted subtype relation
+ and the overflow array (see Cliff Click and John Rose: Fast subtype checking
+ in the Hotspot JVM.)
+
+ RETURN VALUE:
+ 1......s is a subtype of t.
+ 0......otherwise
+
+*******************************************************************************/
+
+bool fast_subtype_check(struct _vftbl *s, struct _vftbl *t)
+{
+ if (s->subtype_display[t->subtype_depth] == t)
+ return true;
+ if (t->subtype_offset != OFFSET(vftbl_t, subtype_display[DISPLAY_SIZE]))
+ return false;
+ return s->subtype_depth >= t->subtype_depth && s->subtype_overflow[t->subtype_depth - DISPLAY_SIZE] == t;
+}
+#endif
/* builtin_fast_canstore *******************************************************
if (valuevftbl == componentvftbl)
return 1;
- linker_classrenumber_mutex->lock();
+ LOCK_CLASSRENUMBER_LOCK;
baseval = componentvftbl->baseval;
(valuevftbl->interfacetable[baseval] != NULL));
}
else {
+#if USES_NEW_SUBTYPE
+ result = fast_subtype_check(valuevftbl, componentvftbl);
+#else
diffval = valuevftbl->baseval - componentvftbl->baseval;
result = diffval <= (uint32_t) componentvftbl->diffval;
+#endif
}
- linker_classrenumber_mutex->unlock();
+ UNLOCK_CLASSRENUMBER_LOCK;
}
else if (valuedesc == NULL) {
/* {oa has dimension > 1} */
if (valuevftbl == elementvftbl)
return 1;
- linker_classrenumber_mutex->lock();
+ LOCK_CLASSRENUMBER_LOCK;
baseval = elementvftbl->baseval;
(valuevftbl->interfacetable[baseval] != NULL));
}
else {
+#if USES_NEW_SUBTYPE
+ result = fast_subtype_check(valuevftbl, elementvftbl);
+#else
diffval = valuevftbl->baseval - elementvftbl->baseval;
result = diffval <= (uint32_t) elementvftbl->diffval;
+#endif
}
- linker_classrenumber_mutex->unlock();
+ UNLOCK_CLASSRENUMBER_LOCK;
return result;
}
if (valuevftbl == elementvftbl)
return 1;
- linker_classrenumber_mutex->lock();
+ LOCK_CLASSRENUMBER_LOCK;
+#if USES_NEW_SUBTYPE
+ result = fast_subtype_check(valuevftbl, elementvftbl);
+#else
diffval = valuevftbl->baseval - elementvftbl->baseval;
result = diffval <= (uint32_t) elementvftbl->diffval;
+#endif
- linker_classrenumber_mutex->unlock();
+ UNLOCK_CLASSRENUMBER_LOCK;
return result;
}