Merged branch subtype-trunk into default.
[cacao.git] / src / vm / class.cpp
index 34c641ded0d9eb67fb4ab36dd00be6b8672cdb1e..698356d11566973010920c69af5720f75694445d 100644 (file)
 
 #include "arch.h"
 
-#include "mm/memory.h"
+#include "mm/memory.hpp"
 
 #include "native/llni.h"
 
 #include "threads/lock.hpp"
 #include "threads/mutex.hpp"
 
-#include "toolbox/logging.h"
+#include "toolbox/logging.hpp"
 
 #include "vm/array.hpp"
 #include "vm/jit/builtin.hpp"
 #include "vm/class.hpp"
-#include "vm/classcache.h"
+#include "vm/classcache.hpp"
 #include "vm/exceptions.hpp"
 #include "vm/global.h"
 #include "vm/globals.hpp"
 #include "vm/javaobjects.hpp"
-#include "vm/jit/jitcache.hpp"
-#include "vm/linker.h"
+#include "vm/linker.hpp"
 #include "vm/loader.hpp"
 #include "vm/options.h"
 #include "vm/resolve.hpp"
@@ -177,9 +176,6 @@ classinfo *class_create_classinfo(utf *classname)
 
        if (classname != utf_not_named_yet)
                class_set_packagename(c);
-#if defined (ENABLE_JITCACHE)
-    c->cache_file_fd = 0;
-#endif
 
        c->object.header.lockword.init();
 
@@ -724,11 +720,6 @@ void class_free(classinfo *c)
        s4 i;
        vftbl_t *v;
 
-#if defined(ENABLE_JITCACHE)
-/* TODO: Find a way around the linker problem */
-/*    jitcache_freeclass(c);*/
-#endif
-
        class_freecpool(c);
 
        if (c->interfaces != NULL)
@@ -1480,7 +1471,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;
@@ -2117,6 +2117,13 @@ int32_t class_get_modifiers(classinfo *c, bool ignoreInnerClassesAttrib)
        classref_or_classinfo  outer;
        utf                   *innername;
        int                    i;
+       int32_t                flags;
+
+       /* default to flags of passed class */
+
+       flags = c->flags;
+
+       /* if requested we check if passed class is inner class */
 
        if (!ignoreInnerClassesAttrib && (c->innerclasscount != 0)) {
                /* search for passed class as inner class */
@@ -2137,16 +2144,16 @@ int32_t class_get_modifiers(classinfo *c, bool ignoreInnerClassesAttrib)
 
                                if (outer.any)
                                        /* return flags got from the outer class file */
-                                       return c->innerclass[i].flags & ACC_CLASS_REFLECT_MASK;
-                               else
-                                       return c->flags & ACC_CLASS_REFLECT_MASK;
+                                       flags = c->innerclass[i].flags;
+
+                               break;
                        }
                }
        }
 
-       /* passed class is no inner class or it was not requested */
+       /* remove ACC_SUPER bit from flags */
 
-       return c->flags & ACC_CLASS_REFLECT_MASK;
+       return flags & ~ACC_SUPER & ACC_CLASS_REFLECT_MASK;
 }