[vmkit-commits] [vmkit] r61543 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaClass.cpp JavaClass.h JavaJIT.cpp

Nicolas Geoffray nicolas.geoffray at lip6.fr
Thu Jan 1 09:50:52 PST 2009


Author: geoffray
Date: Thu Jan  1 11:50:51 2009
New Revision: 61543

URL: http://llvm.org/viewvc/llvm-project?rev=61543&view=rev
Log:
Initialization optimisation when a class does not have a clinit method and
static fields.


Modified:
    vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h
    vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp

Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp?rev=61543&r1=61542&r2=61543&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Thu Jan  1 11:50:51 2009
@@ -896,6 +896,9 @@
       Mod->resolveVirtualClass(this);
       Mod->resolveStaticClass(this);
       setResolved();
+      if (!needsInitialisationCheck()) {
+        setInitializationState(ready);
+      }
       broadcastClass();
       release();
     } else {
@@ -1228,3 +1231,24 @@
 
   return false;
 }
+
+bool UserClass::needsInitialisationCheck() {
+  
+  if (!isClassRead()) return true;
+
+  if (isReady()) return false;
+
+  if (super && super->needsInitialisationCheck())
+    return true;
+
+  if (nbStaticFields) return true;
+
+  JavaMethod* meth = 
+    lookupMethodDontThrow(classLoader->bootstrapLoader->clinitName,
+                          classLoader->bootstrapLoader->clinitType, 
+                          true, false, 0);
+  
+  if (meth) return true;
+
+  return false;
+}

Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h?rev=61543&r1=61542&r2=61543&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Thu Jan  1 11:50:51 2009
@@ -806,11 +806,15 @@
     IsolateInfo[0].status = classRead;
   }
 
-  /// isResolving - IS the class currently being resolved?
+  /// isResolving - Is the class currently being resolved?
   ///
   bool isResolving() {
     return IsolateInfo[0].status == classRead;
   }
+
+  bool isClassRead() {
+    return IsolateInfo[0].status >= classRead;
+  }
   
 #else
   TaskClassMirror& getCurrentTaskClassMirror();
@@ -831,6 +835,10 @@
     getCurrentTaskClassMirror().status = st;
   }
   
+  bool isClassRead() {
+    return getCurrentTaskClassMirror().status >= classRead;
+  }
+  
   bool isReady() {
     return getCurrentTaskClassMirror().status == ready;
   }
@@ -874,7 +882,13 @@
   }
 #endif
 
+  /// isNativeOverloaded - Is the method overloaded with a native function?
+  ///
   bool isNativeOverloaded(JavaMethod* meth);
+
+  /// needsInitialisationCheck - Does the method need an initialisation check?
+  ///
+  bool needsInitialisationCheck();
    
 };
 

Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp?rev=61543&r1=61542&r2=61543&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp Thu Jan  1 11:50:51 2009
@@ -48,7 +48,19 @@
 #ifdef SERVICE
   return true;
 #else
-  return !(cl->isReadyForCompilation() || compilingClass->subclassOf(cl)); 
+
+  if (cl->isReadyForCompilation() || compilingClass->subclassOf(cl)) {
+    return false;
+  }
+
+  if (!cl->needsInitialisationCheck()) {
+    if (!cl->isReady()) {
+      cl->setInitializationState(ready);
+    }
+    return false;
+  }
+
+  return true;
 #endif
 }
 





More information about the vmkit-commits mailing list