* src/vm/builtin.c: Restored all previous code, predicating subtype-related
authorStefan Ring <stefan@complang.tuwien.ac.at>
Fri, 31 Oct 2008 17:14:06 +0000 (18:14 +0100)
committerStefan Ring <stefan@complang.tuwien.ac.at>
Fri, 31 Oct 2008 17:14:06 +0000 (18:14 +0100)
changes with USES_NEW_SUBTYPE.
* src/vm/builtin.h: Likewise.
* src/vmcore/class.c: Likewise.
* src/vmcore/linker.c: Likewise.
* src/vmcore/linker.h: Likewise.

* src/vm/jit/alpha/arch.h: Switched on USES_NEW_SUBTYPE for alpha.
* src/vm/jit/i386/arch.h: Likewise for i386.
* src/vm/jit/x86_64/arch.h: Likewise for x86_64.

--HG--
branch : subtype

src/vm/builtin.c
src/vm/builtin.h
src/vm/jit/alpha/arch.h
src/vm/jit/i386/arch.h
src/vm/jit/x86_64/arch.h
src/vmcore/class.c
src/vmcore/linker.c
src/vmcore/linker.h

index 9106a72553ed99c73257276477b3ddfb63d3d812..773ba915c36749d3a26772a7f7a3bce7c2b39891 100644 (file)
@@ -654,6 +654,27 @@ bool builtin_canstore(java_handle_objectarray_t *oa, java_handle_t *o)
        return result;
 }
 
+#if USES_NEW_SUBTYPE
+/* fast_subtype_check **********************************************************
+
+   Checks if s is a subtype of t, using the restricted subtype relation (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 *******************************************************
 
@@ -667,15 +688,6 @@ bool builtin_canstore(java_handle_objectarray_t *oa, java_handle_t *o)
 
 *******************************************************************************/
 
-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;
-}
-
 bool builtin_fast_canstore(java_objectarray_t *oa, java_object_t *o)
 {
        arraydescriptor *desc;
@@ -708,6 +720,8 @@ bool builtin_fast_canstore(java_objectarray_t *oa, java_object_t *o)
                if (valuevftbl == componentvftbl)
                        return 1;
 
+               LOCK_CLASSRENUMBER_LOCK;
+
                baseval = componentvftbl->baseval;
 
                if (baseval <= 0) {
@@ -717,8 +731,15 @@ bool builtin_fast_canstore(java_objectarray_t *oa, java_object_t *o)
                                          (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
                }
+
+               UNLOCK_CLASSRENUMBER_LOCK;
        }
        else if (valuedesc == NULL) {
                /* {oa has dimension > 1} */
@@ -770,6 +791,8 @@ bool builtin_fast_canstore_onedim(java_objectarray_t *a, java_object_t *o)
        if (valuevftbl == elementvftbl)
                return 1;
 
+       LOCK_CLASSRENUMBER_LOCK;
+
        baseval = elementvftbl->baseval;
 
        if (baseval <= 0) {
@@ -778,9 +801,16 @@ bool builtin_fast_canstore_onedim(java_objectarray_t *a, java_object_t *o)
                                  (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
        }
 
+       UNLOCK_CLASSRENUMBER_LOCK;
+
        return result;
 }
 
@@ -814,7 +844,16 @@ bool builtin_fast_canstore_onedim_class(java_objectarray_t *a, java_object_t *o)
        if (valuevftbl == elementvftbl)
                return 1;
 
+       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
+
+       UNLOCK_CLASSRENUMBER_LOCK;
 
        return result;
 }
index 773d5c21785afd1c5a25d3276f2fdc27f3e91626..e310acdf00be7366b52c6f99dd4f9e3b4ee3ae8e 100644 (file)
@@ -120,7 +120,9 @@ bool builtintable_replace_function(void *iptr);
  * ICMD_BUILTIN3.)
  */
 
+#if USES_NEW_SUBTYPE
 bool fast_subtype_check(struct _vftbl *, struct _vftbl *);
+#endif
 
 bool builtin_instanceof(java_handle_t *obj, classinfo *class);
 /* NOT AN OP */
index c2e78ccbef21423971537c549c701c2cc7b04545..8fdeed30fc7b300a04c2c0e082f500f922f806d5 100644 (file)
 
 #define REPLACEMENT_PATCH_SIZE           4 /* bytes */
 
+/* subtype ********************************************************************/
+
+#define USES_NEW_SUBTYPE                 1
+
 #endif /* _ARCH_H */
 
 
index 9d68a824cb9dc77a6d3424bc04354d1ae37cc107..ec23f8cd0da4863edb19b09abc4975a839690b01 100644 (file)
 
 #define REPLACEMENT_PATCH_SIZE           2       /* bytes */
 
+/* subtype ********************************************************************/
+
+#define USES_NEW_SUBTYPE                 1
+
 #endif /* _ARCH_H */
 
 
index 331e3afc70b53391ac9ffb90e9f36a6a05819991..4144b4f197527f6974275e26a9daac6b3fce81d3 100644 (file)
 
 #define REPLACEMENT_PATCH_SIZE           2             /* bytes */
 
+/* subtype ********************************************************************/
+
+#define USES_NEW_SUBTYPE                 1
+
 #endif /* _ARCH_H */
 
 
index c680d0a0ffbb9393ae5732d86ef4ceb5ecccfb8b..983339f99fa1019b599878d4c5edea9f2427d322 100644 (file)
@@ -1591,7 +1591,16 @@ bool class_isanysubclass(classinfo *sub, classinfo *super)
                if (sub->flags & ACC_INTERFACE)
                        return (super == class_java_lang_Object);
 
+#if USES_NEW_SUBTYPE
                result = fast_subtype_check(sub->vftbl, super->vftbl);
+#else
+               LOCK_CLASSRENUMBER_LOCK;
+
+               diffval = sub->vftbl->baseval - super->vftbl->baseval;
+               result  = diffval <= (uint32_t) super->vftbl->diffval;
+
+               UNLOCK_CLASSRENUMBER_LOCK;
+#endif
        }
 
        return result;
index 221440966331bd00aa300cd89eb3cee286649ef1..7e53af80ef127dc0051774bcaf0787d838c28c45 100644 (file)
@@ -92,6 +92,10 @@ classinfo *resolve_classref_or_classinfo_eager(classref_or_classinfo cls, bool c
 static s4 interfaceindex;       /* sequential numbering of interfaces         */
 static s4 classvalue;
 
+#if !USES_NEW_SUBTYPE
+java_object_t *linker_classrenumber_lock;
+#endif
+
 
 /* private functions **********************************************************/
 
@@ -163,6 +167,14 @@ void linker_preinit(void)
 
        interfaceindex = 0;
 
+#if defined(ENABLE_THREADS) && !USES_NEW_SUBTYPE
+       /* create the global lock object */
+
+       linker_classrenumber_lock = NEW(java_object_t);
+
+       LOCK_INIT_OBJECT_LOCK(linker_classrenumber_lock);
+#endif
+
        /* Link the most basic classes. */
 
        if (!link_class(class_java_lang_Object))
@@ -547,6 +559,7 @@ static bool linker_overwrite_method(methodinfo *mg,
        
 *******************************************************************************/
 
+#if USES_NEW_SUBTYPE
 static int build_display_inner(classinfo *topc, classinfo *c, int i)
 {
        int depth;
@@ -608,6 +621,7 @@ static void build_display(classinfo *c)
                        c->vftbl->subtype_display[i] = NULL;
        }
 }
+#endif
 
 static classinfo *link_class_intern(classinfo *c)
 {
@@ -1028,7 +1042,9 @@ static classinfo *link_class_intern(classinfo *c)
        /* FIXME: this is completely useless now */
        RT_TIMING_GET_TIME(time_subclasses);
 
+#if USES_NEW_SUBTYPE
        build_display(c);
+#endif
 
        /* revert the linking state and class is linked */
 
@@ -1233,10 +1249,14 @@ static void linker_compute_subclasses(classinfo *c)
        threads_stopworld();
 #endif
 
+       LOCK_CLASSRENUMBER_LOCK;
+
        if (!(c->flags & ACC_INTERFACE)) {
                c->nextsub = NULL;
                c->sub     = NULL;
+#if USES_NEW_SUBTYPE
                c->vftbl->baseval = 1; /* so it does not look like an interface */
+#endif
        }
 
        if (!(c->flags & ACC_INTERFACE) && (c->super != NULL)) {
@@ -1246,6 +1266,14 @@ static void linker_compute_subclasses(classinfo *c)
 
        classvalue = 0;
 
+#if !USES_NEW_SUBTYPE
+       /* compute class values */
+
+       linker_compute_class_values(class_java_lang_Object);
+#endif
+
+       UNLOCK_CLASSRENUMBER_LOCK;
+
 #if 0 && defined(ENABLE_THREADS) && !defined(DISABLE_GC)
        threads_startworld();
 #endif
index 83a6e90a093fcbd3d09b9ab9382a8b043a44b187..309ba6f5218d4640ffa7afebd07dd827a1c74b9d 100644 (file)
@@ -100,7 +100,9 @@ typedef struct primitivetypeinfo primitivetypeinfo;
 
 *******************************************************************************/
 
+#if USES_NEW_SUBTYPE
 #define DISPLAY_SIZE 4
+#endif
 
 struct _vftbl {
        methodptr   *interfacetable[1];    /* interface table (access via macro)  */
@@ -112,10 +114,12 @@ struct _vftbl {
                                           /* (-index for interfaces)             */
        s4           diffval;              /* high - base for runtime type check  */
 
+#if USES_NEW_SUBTYPE
        s4 subtype_depth;
        s4 subtype_offset;
        struct _vftbl *subtype_display[DISPLAY_SIZE+1];  /* the last one is cache */
        struct _vftbl **subtype_overflow;
+#endif
 
        s4          *interfacevftbllength; /* length of interface vftbls          */
        methodptr    table[1];             /* class vftbl                         */
@@ -141,6 +145,25 @@ struct arraydescriptor {
 };
 
 
+/* global variables ***********************************************************/
+
+/* This lock must be taken while renumbering classes or while atomically      */
+/* accessing classes.                                                         */
+
+#if USES_NEW_SUBTYPE
+
+#define LOCK_CLASSRENUMBER_LOCK   /* nothing */
+#define UNLOCK_CLASSRENUMBER_LOCK /* nothing */
+
+#else
+extern java_object_t *linker_classrenumber_lock;
+
+#define LOCK_CLASSRENUMBER_LOCK   LOCK_MONITOR_ENTER(linker_classrenumber_lock)
+#define UNLOCK_CLASSRENUMBER_LOCK LOCK_MONITOR_EXIT(linker_classrenumber_lock)
+
+#endif
+
+
 /* function prototypes ********************************************************/
 
 void       linker_preinit(void);