#endif
#include "mm/gc.hpp"
-#include "mm/memory.h"
+#include "mm/memory.hpp"
#include "native/llni.h"
#include "threads/mutex.hpp"
#include "threads/thread.hpp"
-#include "toolbox/logging.h"
+#include "toolbox/logging.hpp"
#include "toolbox/util.h"
#include "vm/array.hpp"
#include "vm/global.h"
#include "vm/globals.hpp"
#include "vm/initialize.hpp"
-#include "vm/linker.h"
+#include "vm/linker.hpp"
#include "vm/loader.hpp"
#include "vm/options.h"
#include "vm/primitive.hpp"
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;
}