* Merged with default branch at rev 16f3633aaa5a.
authorMichael Starzinger <michi@complang.tuwien.ac.at>
Thu, 30 Aug 2007 21:17:51 +0000 (23:17 +0200)
committerMichael Starzinger <michi@complang.tuwien.ac.at>
Thu, 30 Aug 2007 21:17:51 +0000 (23:17 +0200)
--HG--
branch : exact-gc

80 files changed:
1  2 
configure.ac
src/cacaoh/dummy.c
src/cacaoh/headers.c
src/lib/Makefile.am
src/mm/boehm.c
src/mm/cacao-gc/Makefile.am
src/mm/cacao-gc/compact.c
src/mm/cacao-gc/compact.h
src/mm/cacao-gc/gc.c
src/mm/cacao-gc/gc.h
src/mm/cacao-gc/mark.c
src/mm/gc-common.h
src/mm/memory.c
src/mm/memory.h
src/mm/nogc.c
src/native/Makefile.am
src/native/jni.c
src/native/llni.h
src/native/localref.c
src/native/localref.h
src/native/native.c
src/native/native.h
src/native/vm/Makefile.am
src/native/vm/cldc1.1/java_lang_Object.c
src/native/vm/gnu/gnu_classpath_VMStackWalker.c
src/native/vm/gnu/java_lang_VMClassLoader.c
src/native/vm/gnu/java_lang_VMRuntime.c
src/native/vm/gnu/java_lang_VMSystem.c
src/native/vm/gnu/java_lang_reflect_Constructor.c
src/native/vm/java_lang_Class.c
src/native/vm/java_lang_ClassLoader.c
src/native/vm/java_lang_Thread.c
src/native/vm/nativevm.c
src/native/vm/sun_misc_Unsafe.c
src/threads/native/threads.c
src/threads/native/threads.h
src/threads/none/threads.h
src/threads/threads-common.c
src/vm/builtin.c
src/vm/builtin.h
src/vm/builtintable.inc
src/vm/global.h
src/vm/jit/alpha/codegen.c
src/vm/jit/alpha/linux/md-os.c
src/vm/jit/arm/codegen.c
src/vm/jit/arm/linux/md-os.c
src/vm/jit/code.c
src/vm/jit/code.h
src/vm/jit/codegen-common.c
src/vm/jit/codegen-common.h
src/vm/jit/i386/codegen.c
src/vm/jit/i386/linux/md-os.c
src/vm/jit/m68k/codegen.c
src/vm/jit/m68k/emit.c
src/vm/jit/m68k/linux/md-os.c
src/vm/jit/m68k/md.c
src/vm/jit/mips/irix/md-os.c
src/vm/jit/mips/linux/md-os.c
src/vm/jit/powerpc/codegen.c
src/vm/jit/replace.c
src/vm/jit/replace.h
src/vm/jit/s390/emit.c
src/vm/jit/sparc64/codegen.c
src/vm/jit/sparc64/patcher.c
src/vm/jit/stacktrace.c
src/vm/jit/stacktrace.h
src/vm/jit/x86_64/codegen.c
src/vm/jit/x86_64/linux/md-os.c
src/vm/primitive.c
src/vm/properties.c
src/vm/signal.c
src/vm/signallocal.h
src/vm/vm.c
src/vmcore/class.c
src/vmcore/classcache.h
src/vmcore/linker.c
src/vmcore/loader.c
src/vmcore/loader.h
src/vmcore/rt-timing.c
src/vmcore/rt-timing.h

diff --cc configure.ac
index 2db70071921f72f3cca9c6634451a1d9819a8e1d,20886c8023a544ff29c46979072dc95350253bbd..94ba4b3187efb8383cb63d59329f004c3009542e
@@@ -1040,4 -1012,4 +1029,4 @@@ AC_OUTPU
  ## c-basic-offset: 4
  ## tab-width: 8
  ## compile-command: "automake --add-missing"
--## End:
++## End:
Simple merge
Simple merge
Simple merge
diff --cc src/mm/boehm.c
Simple merge
index 3ddc71f135c8b8e99af84ecc5d55a32d33b403dc,35a486650ca50993beccf7e7296c772b4582e8c7..391e701ecf18027ead89094d9bce45f820149bac
  ## along with this program; if not, write to the Free Software
  ## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
  ## 02110-1301, USA.
- ##
- ## $Id$
  
- ## Process this file with automake to produce Makefile.in
  
 -AM_CPPFLAGS = -I$(top_srcdir)/src -I$(top_srcdir)/src/vm/jit/$(ARCH_DIR) -I$(top_srcdir)/src/vm/jit/$(ARCH_DIR)/$(OS_DIR)
 +AM_CPPFLAGS = -I$(top_srcdir)/src -I$(top_srcdir)/src/vm/jit/$(ARCH_DIR) -I$(top_srcdir)/src/vm/jit/$(ARCH_DIR)/$(OS_DIR) -I$(top_builddir)/src
  
  LIBS =
  
index 47dfe2968cde716a03d7e16b255dcba099f2e145,aaf7cabe64d848dcaecc0f7f8ec375f7ff69e92f..2bfb42a41e802a4de39f7c7366f194143c63d80c
     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
     02110-1301, USA.
  
-    $Id$
 -   Contact: cacao@cacaojvm.org
 -
 -   Authors: Michael Starzinger
 -
--
  */
  
  
index 1704f2103c3c05fa37935882bbbb83b89d5a57c4,7b25c22a46a45b61a6c297f2d468fc502f771fca..600b688d517fa788d3b5c370a46697b10efcf36e
     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
     02110-1301, USA.
  
-    $Id$
 -   Contact: cacao@cacaojvm.org
 -
 -   Authors: Michael Starzinger
 -
--
  */
  
  
index c7bd708035bb3960921650d0d40c54b78f2c2d76,8192e0f7c4c0fb0f7a9940de1c9e721bf798deaa..d262bcf778164021861647eaa6631c68ca38dc45
     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
     02110-1301, USA.
  
-    $Id$
 -   Contact: cacao@cacaojvm.org
 -
 -   Authors: Michael Starzinger
 -
--
  */
  
  
index 752c627ee2691885426eae4d2f01ba366a6e7cf8,0a9fbc2214a6d6edbf042ec43d6ac9112a04de63..ff2fa45e56c61abbf636ff3611d01de982c13157
     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
     02110-1301, USA.
  
-    $Id$
 -   Contact: cacao@cacaojvm.org
 -
 -   Authors: Michael Starzinger
 -
--
  */
  
  
index 6798b6ff9fb076d6910cc40c738944f4388dc77d,9d9a38ef34d1f2473947997133f9c9334527ea82..500391b93dc1f8b9fc820493a35bcb5729813c95
     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
     02110-1301, USA.
  
-    $Id$
 -   Contact: cacao@cacaojvm.org
 -
 -   Authors: Michael Starzinger
 -
--
  */
  
  
Simple merge
diff --cc src/mm/memory.c
Simple merge
diff --cc src/mm/memory.h
Simple merge
diff --cc src/mm/nogc.c
Simple merge
Simple merge
index 2a938e88bab339dac619289217e42596c945426d,9f4ae3e1e500495ec2e238e0ee478c45fc52eb83..b2af15cb919a91500ad4fd39c3d2c1437c0e0207
@@@ -933,21 -959,18 +958,21 @@@ jclass _Jv_JNI_DefineClass(JNIEnv *env
                                                   const jbyte *buf, jsize bufLen)
  {
  #if defined(ENABLE_JAVASE)
 -      utf         *u;
 -      classloader *cl;
 -      classinfo   *c;
 +      utf             *u;
 +      classloader     *cl;
 +      classinfo       *c;
 +      java_lang_Class *co;
  
-       TRACEJNICALLS("_Jv_JNI_DefineClass(env=%p, name=%s, loader=%p, buf=%p, bufLen=%d", env, name, loader, buf, bufLen);
+       TRACEJNICALLS("_Jv_JNI_DefineClass(env=%p, name=%s, loader=%p, buf=%p, bufLen=%d)", env, name, loader, buf, bufLen);
  
        u  = utf_new_char(name);
 -      cl = (classloader *) loader;
 +      cl = loader_hashtable_classloader_add((java_handle_t *) loader);
  
 -      c = class_define(u, cl, bufLen, (const uint8_t *) buf, NULL);
 +      c = class_define(u, cl, bufLen, (const uint8_t *) buf);
  
 -      return (jclass) _Jv_JNI_NewLocalRef(env, (jobject) c);
 +      co = LLNI_classinfo_wrap(c);
 +
 +      return (jclass) _Jv_JNI_NewLocalRef(env, (jobject) co);
  #else
        vm_abort("_Jv_JNI_DefineClass: not implemented in this configuration");
  
@@@ -1152,23 -1169,19 +1177,22 @@@ jthrowable _Jv_JNI_ExceptionOccurred(JN
  void _Jv_JNI_ExceptionDescribe(JNIEnv *env)
  {
        java_handle_t *o;
 +      classinfo     *c;
        methodinfo    *m;
  
-       STATISTICS(jniinvokation());
-       o = exceptions_get_exception();
+       TRACEJNICALLS("_Jv_JNI_ExceptionDescribe(env=%p)", env);
  
-       if (o == NULL) {
-               /* clear exception, because we are calling jit code again */
+       /* Clear exception, because we are probably calling Java code
+          again. */
  
-               exceptions_clear_exception();
+       o = exceptions_get_and_clear_exception();
  
 -              /* Get printStackTrace method from exception class. */
+       if (o != NULL) {
 +              /* get printStackTrace method from exception class */
 +
 +              LLNI_class_get(o, c);
  
 -              m = class_resolveclassmethod(o->vftbl->class,
 +              m = class_resolveclassmethod(c,
                                                                         utf_printStackTrace,
                                                                         utf_void__void,
                                                                         NULL,
@@@ -1650,7 -1698,7 +1673,6 @@@ jfieldID _Jv_JNI_FromReflectedField(JNI
  
  jobject _Jv_JNI_ToReflectedMethod(JNIEnv* env, jclass cls, jmethodID methodID,
                                                                  jboolean isStatic)
--{
  #if defined(ENABLE_JAVASE)
        methodinfo                    *m;
        java_lang_reflect_Constructor *rc;
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index 43a4f87b4f5c5e69e62aaafbed6dfd75e1b116f6,0e17e73a8b6ac283d79ad0a0470203083ca7bcf7..5eaed828ca99a386a0c5e6547d8d2283c8a67524
   */
  java_lang_Class *_Jv_java_lang_ClassLoader_defineClass(java_lang_ClassLoader *cl, java_lang_String *name, java_handle_bytearray_t *data, s4 offset, s4 len, java_security_ProtectionDomain *pd)
  {
-       utf               *utfname;
-       classinfo         *c;
-       classloader       *loader;
-       java_lang_Class   *o;
 -      classloader     *loader;
+       utf             *utfname;
+       classinfo       *c;
++      classloader     *loader;
+       java_lang_Class *o;
  
  #if defined(ENABLE_JVMTI)
        jint new_class_data_len = 0;
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
diff --cc src/vm/global.h
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index 49b3f424e3b463872457a9f71bebd1c8ec29f591,1eef3c8c036cf6296dbf5cb245e40a2f3a3c80dc..1f2e6f0762df2146e08ae720582126628ca102df
@@@ -434,11 -649,10 +654,11 @@@ void properties_system_add(java_handle_
  #if defined(ENABLE_JAVASE)
  void properties_system_add_all(java_handle_t *p)
  {
-       list_properties_entry *pe;
-       classinfo             *c;
-       methodinfo            *m;
-       java_handle_t         *key;
-       java_handle_t         *value;
+       list_properties_entry_t *pe;
++      classinfo               *c;
+       methodinfo              *m;
+       java_handle_t           *key;
+       java_handle_t           *value;
  
        /* search for method to add properties */
  
diff --cc src/vm/signal.c
Simple merge
Simple merge
diff --cc src/vm/vm.c
Simple merge
Simple merge
Simple merge
Simple merge
index 5e33409541320906ab0ee0a6347b6c2bfbbbc965,58612a75a7b318e47d1c4ca74c592f568406bda6..68e0edf4426a5ced0805df5e68f024cd2ce042a7
  #endif
  
  
- /* loader_init *****************************************************************
 +/* global variables ***********************************************************/
 +
 +static hashtable *hashtable_classloader;
 +
 +
+ /* loader_preinit **************************************************************
  
-    Initializes all lists and loads all classes required for the system
-    or the compiler.
+    Initializes the classpath list and loads classes required for the
+    primitive table.
  
  *******************************************************************************/
   
@@@ -101,23 -93,16 +99,21 @@@ void loader_preinit(void
        /* Initialize the monitor pointer for zip/jar file locking. */
  
        for (lce = list_first(list_classpath_entries); lce != NULL;
-                lce = list_next(list_classpath_entries, lce))
+                lce = list_next(list_classpath_entries, lce)) {
                if (lce->type == CLASSPATH_ARCHIVE)
                        LOCK_INIT_OBJECT_LOCK(lce);
+       }
  #endif
  
-       /* load some important classes */
 +      /* initialize classloader hashtable, 10 entries should be enough */
 +
 +      hashtable_classloader = NEW(hashtable);
 +      hashtable_create(hashtable_classloader, 10);
 +
+       /* Load the most basic class. */
  
        if (!(class_java_lang_Object = load_class_bootstrap(utf_java_lang_Object)))
-               return false;
-       if (!(class_java_lang_String = load_class_bootstrap(utf_java_lang_String)))
-               return false;
+               vm_abort("loader_preinit: loading java/lang/Object failed");
  
  #if defined(ENABLE_JAVASE)
        if (!(class_java_lang_Cloneable =
@@@ -238,147 -234,22 +245,147 @@@ void loader_init(void
  
        if (!(arrayclass_java_lang_Object =
                  load_class_bootstrap(utf_new_char("[Ljava/lang/Object;"))))
 -              vm_abort("loader_init: loading failed");
 +              return false;
  
- #if defined(ENABLE_ANNOTATIONS)
+ # if defined(ENABLE_ANNOTATIONS)
        /* needed by annotation support */
        if (!(class_sun_reflect_ConstantPool = 
-                 load_class_bootstrap(utf_sun_reflect_ConstantPool)))
-               return false;
+                 load_class_bootstrap(utf_new_char("sun/reflect/ConstantPool"))))
+               vm_abort("loader_init: loading failed");
  
- #if defined(WITH_CLASSPATH_GNU)
+ #  if defined(WITH_CLASSPATH_GNU)
        /* needed by GNU Classpaths annotation support */
        if (!(class_sun_reflect_annotation_AnnotationParser = 
-                 load_class_bootstrap(utf_sun_reflect_annotation_AnnotationParser)))
-               return false;
- #endif
- #endif
+                 load_class_bootstrap(utf_new_char("sun/reflect/annotation/AnnotationParser"))))
+               vm_abort("loader_init: loading failed");
+ #  endif
+ # endif
  #endif
 +
 +
 +      return true;
 +}
 +
 +
 +/* loader_hashtable_classloader_add ********************************************
 +
 +   Adds an entry to the classloader hashtable.
 +
 +   REMEMBER: Also use this to register native loaders!
 +
 +*******************************************************************************/
 +
 +classloader *loader_hashtable_classloader_add(java_handle_t *cl)
 +{
 +      hashtable_classloader_entry *cle;
 +      u4   key;
 +      u4   slot;
 +
 +      if (cl == NULL)
 +              return NULL;
 +
 +      LOCK_MONITOR_ENTER(hashtable_classloader->header);
 +
 +      LLNI_CRITICAL_START;
 +
 +      /* key for entry is the hashcode of the classloader;
 +         aligned to 16-byte boundaries */
 +
 +#if defined(ENABLE_GC_CACAO)
 +      key  = heap_get_hashcode(LLNI_DIRECT(cl)) >> 4;
 +#else
 +      key  = ((u4) (ptrint) cl) >> 4;
 +#endif
 +
 +      slot = key & (hashtable_classloader->size - 1);
 +      cle  = hashtable_classloader->ptr[slot];
 +
 +      /* search hashchain for existing entry */
 +
 +      while (cle) {
 +              if (cle->object == LLNI_DIRECT(cl))
 +                      break;
 +
 +              cle = cle->hashlink;
 +      }
 +
 +      LLNI_CRITICAL_END;
 +
 +      /* if no classloader was found, we create a new entry here */
 +
 +      if (cle == NULL) {
 +              cle = NEW(hashtable_classloader_entry);
 +
 +#if defined(ENABLE_GC_CACAO)
 +              /* register the classloader object with the GC */
 +
 +              gc_reference_register(&(cle->object), GC_REFTYPE_CLASSLOADER);
 +#endif
 +
 +              LLNI_CRITICAL_START;
 +
 +              cle->object = LLNI_DIRECT(cl);
 +
 +              LLNI_CRITICAL_END;
 +
 +              /* insert entry into hashtable */
 +
 +              cle->hashlink = hashtable_classloader->ptr[slot];
 +              hashtable_classloader->ptr[slot] = cle;
 +
 +              /* update number of entries */
 +
 +              hashtable_classloader->entries++;
 +      }
 +
 +
 +      LOCK_MONITOR_EXIT(hashtable_classloader->header);
 +
 +      return cle;
 +}
 +
 +
 +/* loader_hashtable_classloader_find *******************************************
 +
 +   Find an entry in the classloader hashtable.
 +
 +*******************************************************************************/
 +
 +classloader *loader_hashtable_classloader_find(java_handle_t *cl)
 +{
 +      hashtable_classloader_entry *cle;
 +      u4   key;
 +      u4   slot;
 +
 +      if (cl == NULL)
 +              return NULL;
 +
 +      LLNI_CRITICAL_START;
 +
 +      /* key for entry is the hashcode of the classloader;
 +         aligned to 16-byte boundaries */
 +
 +#if defined(ENABLE_GC_CACAO)
 +      key  = heap_get_hashcode(LLNI_DIRECT(cl)) >> 4;
 +#else
 +      key  = ((u4) (ptrint) cl) >> 4;
 +#endif
 +
 +      slot = key & (hashtable_classloader->size - 1);
 +      cle  = hashtable_classloader->ptr[slot];
 +
 +      /* search hashchain for existing entry */
 +
 +      while (cle) {
 +              if (cle->object == LLNI_DIRECT(cl))
 +                      break;
 +
 +              cle = cle->hashlink;
 +      }
 +
 +      LLNI_CRITICAL_END;
 +
 +      return cle;
  }
  
  
@@@ -1123,15 -991,24 +1130,24 @@@ classinfo *load_class_from_classloader(
                        }
                }
                
-               assert(class_java_lang_Object);
+ #if defined(WITH_CLASSPATH_SUN)
+               /* OpenJDK uses this internal function because it's
+                  synchronized. */
  
 -              lc = class_resolveclassmethod(cl->vftbl->class,
 +              lc = class_resolveclassmethod(cl->object->vftbl->class,
+                                                                         utf_loadClassInternal,
+                                                                         utf_java_lang_String__java_lang_Class,
+                                                                         NULL,
+                                                                         true);
+ #else
+               lc = class_resolveclassmethod(cl->vftbl->class,
                                                                          utf_loadClass,
                                                                          utf_java_lang_String__java_lang_Class,
-                                                                         class_java_lang_Object,
+                                                                         NULL,
                                                                          true);
+ #endif
  
-               if (!lc)
+               if (lc == NULL)
                        return false; /* exception */
  
                /* move return value into `o' and cast it afterwards to a classinfo* */
index 09a382e918ec1919b8776a13994ea3a7bf138e1b,9195307d771bc725540f11760c0c96eb7d29d1b2..3295ef6b570324ef30b448b8dfdcdaaffdd4df2a
@@@ -132,13 -115,9 +131,13 @@@ typedef hashtable_classloader_entry cla
  
  /* function prototypes ********************************************************/
  
- /* initialize loader, load important systemclasses */
bool loader_init(void);
+ void loader_preinit(void);
void loader_init(void);
  
 +/* classloader management functions */
 +classloader *loader_hashtable_classloader_add(java_handle_t *cl);
 +classloader *loader_hashtable_classloader_find(java_handle_t *cl);
 +
  void loader_load_all_classes(void);
  
  bool loader_skip_attribute_body(classbuffer *cb);
Simple merge
Simple merge