You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by ge...@apache.org on 2006/08/01 21:45:41 UTC

svn commit: r427693 [2/2] - in /incubator/harmony/enhanced/drlvm/trunk: build/make/components/extra/ vm/em/src/ vm/gc/src/ vm/include/open/ vm/interpreter/src/ vm/jitrino/src/codegenerator/ia32/ vm/jitrino/src/jet/ vm/jitrino/src/optimizer/ vm/port/src...

Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/java/lang/FinalizerThread.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/java/lang/FinalizerThread.java?rev=427693&r1=427692&r2=427693&view=diff
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/java/lang/FinalizerThread.java (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/java/lang/FinalizerThread.java Tue Aug  1 12:45:38 2006
@@ -61,7 +61,9 @@
      * Initializes finalization system. Starts permanent thread.
      */
     static void initialize() {
-        trace("FinalizerThread: static initialization started");
+        if (TRACE) {
+            trace("FinalizerThread: static initialization started");
+        }
 
         String p = System.getProperty("vm.finalize");
         processorsQuantity = getProcessorsQuantity();
@@ -74,15 +76,20 @@
             (new FinalizerThread(true)).start();
             enabled = true;
         }
-        
-        trace("FinalizerThread: static initialization complete");
+
+        if (TRACE) {
+            trace("FinalizerThread: static initialization complete");
+        }
     }
 
     /**
      * VM calls this method to request finalizer thread shutdown.
      */
     static void shutdown() {
-        trace("shutting down finalizer thread");
+        if (TRACE) {
+            trace("shutting down finalizer thread");
+        }
+
         if (startFinalizationOnExit) {
             doFinalizationOnExit();
         }
@@ -110,21 +117,27 @@
     // Maximum quantity of finalizers threads
     private static final int MAX_THREADS = 256;
 
+    // create separate class for finalizer workLock to easier debugging
+    private static class FinalizerWorkLock {};
+
     // Lock used to wake up permanent finalizer threads and synchronize change of state of work
-    private static Object workLock = new Object();
+    private static Object workLock = new FinalizerWorkLock();
 
     // Shows that finalizers works in state on exit
     // Used by VM. It should be package private to eliminate compiler warning.
     static boolean onExit = false;
 
+    // create separate class for finalizer waitFinishLock to easier debugging
+    private static class FinalizerWaitFinishLock {};
+
     /*
      * Lock used to to synchronize quantity of active threads and to wake up finalizer starter thread
      * when new finalization tasks aren't available and finalizer threads finish work.
      */
-    private static Object waitFinishLock = new Object();
+    private static Object waitFinishLock = new FinalizerWaitFinishLock();
 
     /*
-     * The Quantity of active finalizer threads which shoud be stopped to wake up finalizer starter 
+     * The Quantity of active finalizer threads which shoud be stopped to wake up finalizer starter
      * thread. When is thread is started this counter is incremented when thread is stoppig it's decremeted.
      * Zero means finalization tasks aren't available and finalizer threads aren't working.
      */
@@ -200,20 +213,27 @@
      * It is called from startFinalization() only.
      */
     private static void spawnBalanceThreads() {
+        /* finalizer threads shouldn't be spawn by finalizer thread,
+         * in this case balancing can't work
+         */
+        if (isFinalizerThread()) {
+            return;
+        }
+
         FinalizerThread newThread = null;
         if (waitFinishCounter >= MAX_THREADS) {
-            // do nothing   
+            // do nothing
         } else {
             try {
                 for (int i = 0; i < processorsQuantity; i++) {
                     newThread = new FinalizerThread(false);
-                    
-                    synchronized (newThread){
+
+                    synchronized (newThread.startLock){
                         newThread.start();
-                        
+
                         // waiting when new thread will be started
                         try {
-                            newThread.wait();
+                            newThread.startLock.wait();
                         } catch (InterruptedException e) {}
                     }
                 }
@@ -262,6 +282,8 @@
         }
     }
 
+    private static final boolean TRACE = false;
+
     /**
      * debug output.
      */
@@ -283,7 +305,12 @@
     public FinalizerThread () {
         this (true);
     }
-    
+
+    // create separate class for finalizer startLock to easier debugging
+    private class FinalizerStartLock {};
+
+    private FinalizerStartLock startLock = new FinalizerStartLock();
+
     protected FinalizerThread (boolean permanent) {
         super(threadGroup, "FinalizerThread");
         this.permanent = permanent;
@@ -291,28 +318,41 @@
     }
 
     public void run() {
-        trace((permanent ? "permanent":"temporary") 
-                + " finalization thread started");
-        
+        // don't put any code here, before try block
+
         try {
             synchronized (waitFinishLock) {
                 waitFinishCounter ++;
             }
 
-            // notify that finalizer thread has started
-            synchronized (this) {
-                notify();
+            /* notify that finalizer thread has started.
+             * Don't put any code whith any memory allocation before here!
+             * It should be granted that notify is called in any case!
+             */
+            synchronized (startLock) {
+                startLock.notify();
             }
-            
+
+            if (TRACE) {
+                if (permanent) {
+                    trace("permanent finalization thread started");
+                } else {
+                    trace("temporary finalization thread started");
+                }
+            }
+
             while (true) {
                 int n = doFinalization(128);
 
                 synchronized (workLock) {
                     if (shutdown) {
-                        trace("terminated by shutdown request");
+
+                        if (TRACE) {
+                            trace("terminated by shutdown request");
+                        }
                         break;
                     }
-                } 
+                }
                 
                 if (0 == n) {
                     if (permanent) {
@@ -322,9 +362,9 @@
                     }
                 }
             }
-        } catch (Throwable e) {
-            warn("FinalizerThread terminated by " + e);
-            throw new RuntimeException("FinalizerThread interrupted", e);
+        } catch (Throwable th) {
+            warn("FinalizerThread terminated by " + th);
+            throw new RuntimeException("FinalizerThread interrupted", th);
         } finally {
             synchronized (waitFinishLock) {
                 waitFinishCounter --;
@@ -333,7 +373,10 @@
                     waitFinishLock.notifyAll();
                 }
             }
-            trace("FinalizerThread completed");
+
+            if (TRACE) {
+                trace("FinalizerThread completed");
+            }
         }
     }
 

Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/java/lang/Thread.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/java/lang/Thread.java?rev=427693&r1=427692&r2=427693&view=diff
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/java/lang/Thread.java (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/java/lang/Thread.java Tue Aug  1 12:45:38 2006
@@ -781,10 +781,11 @@
             localValues.put(local, value);
             return value;
         }
-        if ((value = localValues.get(local)) == null) {
-            value = local.initialValue();
-            localValues.put(local, value);
+        if (localValues.containsKey(local)) {
+            return localValues.get(local);
         }
+        value = local.initialValue();
+        localValues.put(local, value);
         return value;
     }
     

Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/java/lang/ThreadGroup.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/java/lang/ThreadGroup.java?rev=427693&r1=427692&r2=427693&view=diff
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/java/lang/ThreadGroup.java (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/java/lang/ThreadGroup.java Tue Aug  1 12:45:38 2006
@@ -24,7 +24,7 @@
 import java.util.LinkedList;
 import java.util.Iterator;
 import java.util.WeakHashMap;
-import java.util.Set;
+import java.util.ConcurrentModificationException;
 
 /**
  * @com.intel.drl.spec_ref 
@@ -110,17 +110,17 @@
      */
     public int activeCount() {
         int count = 0;
-        List groupsListCopy = null; // a copy of subgroups list
-        Set threadsCopy = null; // threads
+        List groupsListCopy = null;  // a copy of subgroups list
+        Object[] threadsCopy = null; // a copy of threads list
         synchronized (this) {
             if (destroyed) {
                 return 0;
             }
-         	groupsListCopy = (List)groups.clone();
-            threadsCopy = threads.keySet();
+            threadsCopy = copyThreads();
+            groupsListCopy = (List)groups.clone();
         }
-        for (Iterator it = threadsCopy.iterator(); it.hasNext();) {
-            if ( ((Thread)it.next()).isAlive()) {
+        for (int i = 0; i < threadsCopy.length; i++) {
+            if (((Thread) threadsCopy[i]).isAlive()) {
                 count++;
             }
         }
@@ -391,6 +391,21 @@
         }
         groups.add(group);
     }
+    
+    /**
+     * Copies this ThreadGroup's threads to an array which is used in iteration
+     * over threads because iteration over a WeakHashMap object can lead to
+     * ConcurrentModificationException.
+     */
+    private Object[] copyThreads() {
+        while (true) {
+            try {
+                // toArray() can throw ConcurrentModificationException
+                return threads.keySet().toArray();
+            } catch (ConcurrentModificationException e) {
+            }
+        }
+    }
 
     /**
      * Copies all the threads contained in the snapshot of this thread group to
@@ -407,21 +422,20 @@
      *         done
      */
     private int enumerate(Thread[] list, int offset, boolean recurse) {
-        if (destroyed) {
-            return offset;
-        }
-        List groupsListCopy = null; // a copy of subgroups list
-        Set threadsCopy = null; // a copy of threads list
+        List groupsListCopy = null;  // a copy of subgroups list
+        Object[] threadsCopy = null; // a copy of threads list
         synchronized (this) {
-            threadsCopy = threads.keySet();
+            if (destroyed) {
+                return offset;
+            }
+            threadsCopy = copyThreads();
             if (recurse) {
                 groupsListCopy = (List)groups.clone();
             }
         }
-        for (Iterator it = threadsCopy.iterator(); it.hasNext();) {
-            Thread nextThread = (Thread)it.next();
-            if (nextThread.isAlive()) {
-                list[offset++] = nextThread;
+        for (int i = 0; i < threadsCopy.length; i++) {
+            if (((Thread) threadsCopy[i]).isAlive()) {
+                list[offset++] = (Thread) threadsCopy[i];
                 if (offset == list.length) {
                     return offset;
                 }
@@ -480,14 +494,15 @@
     private void list(String prefix) {
         System.out.println(prefix + toString());
         prefix += LISTING_INDENT;
-        List groupsListCopy = null; // a copy of subgroups list
-        Set threadsCopy = threads.keySet();
+        List groupsListCopy = null;   // a copy of subgroups list
+        Object[] threadsCopy = null;  // a copy of threads list
         synchronized (this) {
-            for (Iterator it = threadsCopy.iterator(); it.hasNext();) {
-                System.out.println(prefix + it.next());
-            }
+            threadsCopy = copyThreads();
             groupsListCopy = (List)groups.clone();
         }
+        for (int i = 0; i < threadsCopy.length; i++) {
+            System.out.println(prefix + (Thread) threadsCopy[i]);
+        }
         for (Iterator it = groupsListCopy.iterator(); it.hasNext();) {
             ((ThreadGroup)it.next()).list(prefix);
         }
@@ -514,8 +529,9 @@
      * method to avoid calls to the checkAccess() method on subgroups
      */
     private synchronized void nonsecureInterrupt() {
-        for (Iterator it = threads.keySet().iterator(); it.hasNext();) {
-            ((Thread)it.next()).interrupt();
+        Object[] threadsCopy = copyThreads(); // a copy of threads list
+        for (int i = 0; i < threadsCopy.length; i++) {
+            ((Thread) threadsCopy[i]).interrupt();
         }
         for (Iterator it = groups.iterator(); it.hasNext();) {
             ((ThreadGroup)it.next()).nonsecureInterrupt();
@@ -527,8 +543,9 @@
      * to avoid calls to the checkAccess() method on subgroups
      */
     private synchronized void nonsecureResume() {
-        for (Iterator it = threads.keySet().iterator(); it.hasNext();) {
-            ((Thread)it.next()).resume();
+        Object[] threadsCopy = copyThreads();
+        for (int i = 0; i < threadsCopy.length; i++) {
+            ((Thread) threadsCopy[i]).resume();
         }
         for (Iterator it = groups.iterator(); it.hasNext();) {
             ((ThreadGroup)it.next()).nonsecureResume();
@@ -556,8 +573,9 @@
      * We add this method to avoid calls to the checkAccess() method on subgroups
      */
     private synchronized void nonsecureStop() {
-        for (Iterator it = threads.keySet().iterator(); it.hasNext();) {
-            ((Thread)it.next()).stop();
+        Object[] threadsCopy = copyThreads();
+        for (int i = 0; i < threadsCopy.length; i++) {
+            ((Thread) threadsCopy[i]).stop();
         }
         for (Iterator it = groups.iterator(); it.hasNext();) {
             ((ThreadGroup)it.next()).nonsecureStop();
@@ -569,8 +587,9 @@
      * We add this method to avoid calls to the checkAccess() method on subgroups
      */
     private synchronized void nonsecureSuspend() {
-        for (Iterator it = threads.keySet().iterator(); it.hasNext();) {
-            ((Thread)it.next()).suspend();
+        Object[] threadsCopy = copyThreads(); // a copy of threads list
+        for (int i = 0; i < threadsCopy.length; i++) {
+            ((Thread) threadsCopy[i]).suspend();
         }
         for (Iterator it = groups.iterator(); it.hasNext();) {
             ((ThreadGroup)it.next()).nonsecureSuspend();

Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/java/lang/VMStart.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/java/lang/VMStart.java?rev=427693&r1=427692&r2=427693&view=diff
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/java/lang/VMStart.java (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/java/lang/VMStart.java Tue Aug  1 12:45:38 2006
@@ -115,7 +115,7 @@
                 // load and start main class
                 ClassLoader loader = ClassLoader.getSystemClassLoader();
                 Class cl = Class.forName(mainClass, true, loader);
-                final Method mainMethod = cl.getDeclaredMethod("main", 
+                final Method mainMethod = cl.getMethod("main", 
                         new Class[]{String[].class});
                 int expectedModifiers = (Modifier.PUBLIC | Modifier.STATIC);
                 if ((mainMethod.getModifiers() & expectedModifiers) != expectedModifiers 

Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/java/lang/reflect/AccessibleObject.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/java/lang/reflect/AccessibleObject.java?rev=427693&r1=427692&r2=427693&view=diff
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/java/lang/reflect/AccessibleObject.java (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/java/lang/reflect/AccessibleObject.java Tue Aug  1 12:45:38 2006
@@ -211,7 +211,7 @@
      *         Class
      */
     private void setAccessible0(boolean flag) throws SecurityException {
-        if (this instanceof Constructor
+        if (flag && this instanceof Constructor
             && ((Constructor)this).getDeclaringClass() == Class.class) {
             throw new SecurityException(
                 "Can not make the java.lang.Class class constructor accessible");

Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/java_lang_VMClassRegistry.cpp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/java_lang_VMClassRegistry.cpp?rev=427693&r1=427692&r2=427693&view=diff
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/java_lang_VMClassRegistry.cpp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/java_lang_VMClassRegistry.cpp Tue Aug  1 12:45:38 2006
@@ -422,7 +422,7 @@
     Java_java_lang_VMClassRegistry_linkClass(jenv, unused, clazz);
     if(jenv->ExceptionCheck())
         return;
-    class_initialize_from_jni(clss, false);
+    class_initialize_from_jni(clss);
 }
 
 /*

Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/util/ia32/base/jit_runtime_support_ia32.cpp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/util/ia32/base/jit_runtime_support_ia32.cpp?rev=427693&r1=427692&r2=427693&view=diff
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/util/ia32/base/jit_runtime_support_ia32.cpp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/util/ia32/base/jit_runtime_support_ia32.cpp Tue Aug  1 12:45:38 2006
@@ -246,13 +246,21 @@
              jc r=0,not_initialized; \
              ret; \
              :not_initialized; \
-             push_m2n 0, 0; \
+             push_m2n 0, %1i; \
              in2out platform:void; \
-             call %1i; \
+             call %2i; \
+             l1 = ts; \
+             ld l1, [l1 + %3i:ref]; \
+             jc l1 != 0,_exn_raised; \
              pop_m2n; \
-             ret;",
-            (void *)is_class_initialized,
-            (void *)class_initialize);
+             ret; \
+             :_exn_raised; \
+             out platform::void; \
+             call.noret %4i;",
+             (void *)is_class_initialized,
+             FRAME_JNI,
+             (void *)class_initialize,
+             OFFSET(VM_thread, p_exception_object), (void*)rethrow_current_thread_exception);
         assert(lil_is_valid(cs));
         addr = LilCodeGenerator::get_platform()->compile(cs, "vm_initialize_class_naked", dump_stubs);
         lil_free_code_stub(cs);

Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/util/ipf/base/jit_runtime_support_ipf.cpp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/util/ipf/base/jit_runtime_support_ipf.cpp?rev=427693&r1=427692&r2=427693&view=diff
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/util/ipf/base/jit_runtime_support_ipf.cpp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/util/ipf/base/jit_runtime_support_ipf.cpp Tue Aug  1 12:45:38 2006
@@ -1123,7 +1123,7 @@
     emitter.ipf_brret(br_many, br_sptk, br_none, BRANCH_RETURN_LINK_REG, SCRATCH_PRED_REG);
 
     // push m2n frame
-    unsigned out_arg0 = m2n_gen_push_m2n(&emitter, NULL, FRAME_UNKNOWN, false, 0, 0, 1);
+    unsigned out_arg0 = m2n_gen_push_m2n(&emitter, NULL, FRAME_JNI, false, 0, 0, 1);
     emitter.ipf_mov(out_arg0+0, IN_REG0);
     void (*p_class_initialize)(Class *clss);
     p_class_initialize = class_initialize;

Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/util/jarfile_support.cpp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/util/jarfile_support.cpp?rev=427693&r1=427692&r2=427693&view=diff
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/util/jarfile_support.cpp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/util/jarfile_support.cpp Tue Aug  1 12:45:38 2006
@@ -173,7 +173,7 @@
 
     lseek(fp, offsetCD, SEEK_SET);
 
-    buf = (unsigned char *)STD_MALLOC(fsize - offsetCD);
+    buf = (unsigned char *)STD_ALLOCA(fsize - offsetCD);
     fsize = read(fp, buf, fsize - offsetCD);
 
     off = 0;
@@ -204,4 +204,3 @@
 #ifndef PLATFORM_POSIX
 #pragma warning( default: 4786 ) // identifier was truncated to 255 characters in the browser information
 #endif
-

Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/util/mem_alloc.cpp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/util/mem_alloc.cpp?rev=427693&r1=427692&r2=427693&view=diff
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/util/mem_alloc.cpp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/util/mem_alloc.cpp Tue Aug  1 12:45:38 2006
@@ -41,8 +41,8 @@
 unsigned page_size_for_allocation = 0;
 size_t   initial_code_pool_size = 0;
 
-Pool_Descriptor* jit_code_pool;
-Pool_Descriptor* vtable_data_pool;
+Pool_Descriptor* jit_code_pool = NULL;
+Pool_Descriptor* vtable_data_pool = NULL;
 
 static apr_pool_t* aux_pool;
 static apr_thread_mutex_t* aux_mutex;
@@ -283,6 +283,10 @@
 
 void vm_mem_dealloc()
 {
+    delete vtable_data_pool;
+    vtable_data_pool = NULL;
+    delete jit_code_pool;
+    jit_code_pool = NULL;
     std::vector<port_vmem_t *>::iterator it;
     for (it = m_allocated_memory_ptrs.begin(); it != m_allocated_memory_ptrs.end(); it++)
     {

Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/util/vm_stats.cpp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/util/vm_stats.cpp?rev=427693&r1=427692&r2=427693&view=diff
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/util/vm_stats.cpp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/util/vm_stats.cpp Tue Aug  1 12:45:38 2006
@@ -32,6 +32,7 @@
 #include "classloader.h"
 
 #include "vm_stats.h"
+#include "GlobalClassLoaderIterator.h"
 
 VM_Statistics vm_stats_total;
 
@@ -471,28 +472,31 @@
 static void print_methods()
 {
     printf("--------- begin native method execution counts (total and slow-path):\n");
-    ClassTable* ct = VM_Global_State::loader_env->bootstrap_class_loader->
-        GetLoadedClasses();
-    ClassTable::iterator it;
-    for (it = ct->begin(); it != ct->end(); it++)
-    {
-        Class *c = it->second;
-        int n_methods = c->n_methods;
-        for(int i = 0; i < n_methods; i++) {
-            Method *m = &(c->methods[i]);
-            if (m->is_fake_method()) {
-                continue;   // ignore fake methods
-            }
-            if(m->num_accesses) {
-                const char *cname = c->name->bytes;
-                const char *mname = m->get_name()->bytes;
-                const char *descr = m->get_descriptor()->bytes;
-                printf("%11" FMT64 "u : %11" FMT64 "u ::: %s.%s%s\n",
-                       m->num_accesses,
-                       m->num_slow_accesses,
-                       cname,
-                       mname,
-                       descr);
+    GlobalClassLoaderIterator clIterator;
+    ClassLoader *cl;
+    for(cl = clIterator.first(); cl; cl = clIterator.next()) {
+        ClassTable* ct = cl->GetLoadedClasses();
+        ClassTable::iterator it;
+        for (it = ct->begin(); it != ct->end(); it++)
+        {
+            Class *c = it->second;
+            int n_methods = c->n_methods;
+            for(int i = 0; i < n_methods; i++) {
+                Method *m = &(c->methods[i]);
+                if (m->is_fake_method()) {
+                    continue;   // ignore fake methods
+                }
+                if(m->num_accesses) {
+                    const char *cname = c->name->bytes;
+                    const char *mname = m->get_name()->bytes;
+                    const char *descr = m->get_descriptor()->bytes;
+                    printf("%11" FMT64 "u : %11" FMT64 "u ::: %s.%s%s\n",
+                        m->num_accesses,
+                        m->num_slow_accesses,
+                        cname,
+                        mname,
+                        descr);
+                }
             }
         }
     }

Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/verifier/Verifier.cpp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/verifier/Verifier.cpp?rev=427693&r1=427692&r2=427693&view=diff
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/verifier/Verifier.cpp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/verifier/Verifier.cpp Tue Aug  1 12:45:38 2006
@@ -3614,6 +3614,14 @@
             << ") Must call initializers using invokespecial" );
         return VER_ErrorConstantPool;
     }
+    // check number of arguments
+    if( cp_parse.method.m_inlen > 255 ) {
+        VERIFY_REPORT( ctex, "(class: " << class_get_name( ctex->m_class ) 
+            << ", method: " << method_get_name( ctex->m_method )
+            << method_get_descriptor( ctex->m_method )
+            << ") The number of method parameters is limited to 255" );
+        return VER_ErrorInstruction;
+    }
     // set stack modifier for instruction
     vf_set_stack_modifier( code, cp_parse.method.m_outlen - cp_parse.method.m_inlen );
     // set minimal stack for instruction
@@ -3649,6 +3657,14 @@
     if( result != VER_OK ) {
         return result;
     }
+    // check number of arguments
+    if( cp_parse.method.m_inlen > 255 ) {
+        VERIFY_REPORT( ctex, "(class: " << class_get_name( ctex->m_class ) 
+            << ", method: " << method_get_name( ctex->m_method )
+            << method_get_descriptor( ctex->m_method )
+            << ") The number of method parameters is limited to 255" );
+        return VER_ErrorInstruction;
+    }
     // set stack modifier for instruction
     vf_set_stack_modifier( code, cp_parse.method.m_outlen - cp_parse.method.m_inlen );
     // set minimal stack for instruction
@@ -4008,6 +4024,13 @@
     unsigned short index;
     for( index = 0; array[index] == '['; index++ ) {
         continue;
+    }
+    if( index > 255 ) {
+        VERIFY_REPORT( ctex, "(class: " << class_get_name( ctex->m_class ) 
+            << ", method: " << method_get_name( ctex->m_method )
+            << method_get_descriptor( ctex->m_method )
+            << ") Array with too many dimensions" );
+        return VER_ErrorInstruction;
     }
     if( dimension == 0 || index < dimension ) {
         VERIFY_REPORT( ctex, "(class: " << class_get_name( ctex->m_class ) 

Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/verifier/ver_dataflow.cpp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/verifier/ver_dataflow.cpp?rev=427693&r1=427692&r2=427693&view=diff
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/verifier/ver_dataflow.cpp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/verifier/ver_dataflow.cpp Tue Aug  1 12:45:38 2006
@@ -802,7 +802,7 @@
                 VERIFY_REPORT( ctex, "(class: " << class_get_name( ctex->m_class ) 
                     << ", method: " << method_get_name( ctex->m_method )
                     << method_get_descriptor( ctex->m_method )
-                    << ") Data flow analysis error" );
+                    << ") Data flow analysis error (uninitialized)" );
                 return result;
             }
             copy = true;

Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/verifier/ver_utils.cpp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/verifier/ver_utils.cpp?rev=427693&r1=427692&r2=427693&view=diff
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/verifier/ver_utils.cpp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/verifier/ver_utils.cpp Tue Aug  1 12:45:38 2006
@@ -1225,7 +1225,7 @@
     // get instance class
     class_handler instance = vf_resolve_class( instance_name, false, ctex );
     if( !instance ) {
-        // inctance class isn't loaded
+        // instance class isn't loaded
         return VER_ClassNotLoaded;
     }
 
@@ -1336,10 +1336,11 @@
     }
 
     /**
-     * Verifier which is built on Java Spec recommendation of verification proccess
-     * doesn't check interfaces usage. Unfortunately, a lot of Java applications
-     * depends on this neglect. To be compatible with those applications we should
-     * do full constraint checks only if -Xverify option is present in command line.
+     * Verifier which is built on Java VM Specification 2nd Edition (4.9.2)
+     * recommendation of verification proccess doesn't check interfaces usage.
+     * Unfortunately, a lot of Java applications depends on this neglect.
+     * To be compatible with those applications we should do full constraint
+     * checks only if -Xverify option is present in command line.
      */
     if( !ctex->m_dump.m_verify && class_is_interface_( target ) ) {
         // no need to check