[vmkit-commits] [vmkit] r145089 - in /vmkit/trunk/lib/j3/ClassLib: DefineClass.inc GNUClasspath/ClasspathVMClassLoader.inc OpenJDK/OpenJDK.inc

Will Dietz wdietz2 at illinois.edu
Tue Nov 22 15:54:58 PST 2011


Author: wdietz2
Date: Tue Nov 22 17:54:58 2011
New Revision: 145089

URL: http://llvm.org/viewvc/llvm-project?rev=145089&view=rev
Log:
Refactor class definition to DefineClass.inc

Lends OpenJDK's defineClass implementation the magic and duplicate checks.

Added:
    vmkit/trunk/lib/j3/ClassLib/DefineClass.inc
Modified:
    vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMClassLoader.inc
    vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc

Added: vmkit/trunk/lib/j3/ClassLib/DefineClass.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/DefineClass.inc?rev=145089&view=auto
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/DefineClass.inc (added)
+++ vmkit/trunk/lib/j3/ClassLib/DefineClass.inc Tue Nov 22 17:54:58 2011
@@ -0,0 +1,31 @@
+// DefineClass.inc
+
+UserClass* defineClass(JnjvmClassLoader * JCL, const UTF8* className,
+  const char* buf, size_t bufLen) {
+  JavaObject* excp = 0;
+  llvm_gcroot(excp, 0);
+
+  Jnjvm* vm = JavaThread::get()->getJVM();
+  ClassBytes * classBytes = new (JCL->allocator, bufLen) ClassBytes(bufLen);
+  memcpy(classBytes->elements, buf, bufLen);
+  Reader reader(classBytes);
+
+  // Before creating a class, do a check on the bytes.
+  uint32 magic = reader.readU4();
+  if (magic != Jnjvm::Magic) {
+    JavaThread::get()->getJVM()->classFormatError("bad magic number");
+    UNREACHABLE();
+  }
+
+  // Also check that we don't already have a class for this name
+  if (JCL->lookupClass(className)) {
+    excp = vm->CreateLinkageError("duplicate class definition");
+    JavaThread::get()->throwException(excp);
+    UNREACHABLE();
+  }
+
+  // Construct the class
+  UserClass* cl = JCL->constructClass(className, classBytes);
+  cl->resolveClass();
+  return cl;
+}

Modified: vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMClassLoader.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMClassLoader.inc?rev=145089&r1=145088&r2=145089&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMClassLoader.inc (original)
+++ vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMClassLoader.inc Tue Nov 22 17:54:58 2011
@@ -10,6 +10,7 @@
 #include "types.h"
 
 #include "Classpath.h"
+#include "DefineClass.inc"
 #include "JavaArray.h"
 #include "JavaClass.h"
 #include "JavaObject.h"
@@ -120,48 +121,27 @@
 JavaObject* pd) {
   
   JavaObject* res = 0;
-  JavaObject* excp = 0;
   llvm_gcroot(loader, 0);
   llvm_gcroot(str, 0);
   llvm_gcroot(bytes, 0);
   llvm_gcroot(pd, 0);
   llvm_gcroot(res, 0);
-  llvm_gcroot(excp, 0);
 
   BEGIN_NATIVE_EXCEPTION(0)
-  
+
   // We need a name, which is unfortunately not required by the spec.
   verifyNull(str);
 
   Jnjvm* vm = JavaThread::get()->getJVM();
 
-  JnjvmClassLoader* JCL = 
+  JnjvmClassLoader* JCL =
     JnjvmClassLoader::getJnjvmLoaderFromJavaObject(loader, vm);
- 
-  int32_t size = JavaArray::getSize(bytes);
-  ClassBytes* classBytes = new (JCL->allocator, size) ClassBytes(size);
-  memcpy(classBytes->elements, JavaArray::getElements(bytes), size);
-   
-  // Before creating a class, do a check on the bytes.  
-  Reader reader(classBytes);
-  uint32 magic = reader.readU4();
-  if (magic != Jnjvm::Magic) {
-    JavaThread::get()->getJVM()->classFormatError("bad magic number");
-  }
 
-  
   const UTF8* name = JavaString::javaToInternal(str, JCL->hashUTF8);
-  UserCommonClass* cl = JCL->lookupClass(name);
-  
-  if (!cl) {
-    UserClass* cl = JCL->constructClass(name, classBytes);
-    cl->resolveClass();
-
-    res = cl->getClassDelegatee(vm, pd);
-  } else {
-    excp = vm->CreateLinkageError("duplicate class definition");
-    JavaThread::get()->throwException(excp);
-  }
+
+  UserClass* cl = defineClass(JCL, name,
+    (const char*)JavaArray::getElements(bytes), JavaArray::getSize(bytes));
+  res = cl->getClassDelegatee(vm, pd);
 
   END_NATIVE_EXCEPTION
 

Modified: vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc?rev=145089&r1=145088&r2=145089&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc (original)
+++ vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc Tue Nov 22 17:54:58 2011
@@ -13,6 +13,7 @@
 
 #include "ArrayCopy.inc"
 #include "ClassContext.inc"
+#include "DefineClass.inc"
 #include "SetProperties.inc"
 
 #include <errno.h>
@@ -1115,18 +1116,16 @@
 
   loader = _loader ? *(JavaObject**)_loader : 0;
 
-  jclass res;
+  jclass res = 0;
 
   Jnjvm* vm = JavaThread::get()->getJVM();
   JnjvmClassLoader* JCL = NULL;
   JCL = JnjvmClassLoader::getJnjvmLoaderFromJavaObject(loader, vm);
-
-  ClassBytes * bytes = new (JCL->allocator, len) ClassBytes(len);
-  memcpy(bytes->elements,buf,len);
   const UTF8* utfName = JCL->asciizConstructUTF8(name);
-  UserClass *cl = JCL->constructClass(utfName, bytes);
 
-  if (cl) res = (jclass)cl->getClassDelegateePtr(vm);
+  UserClass* cl = defineClass(JCL, utfName, (const char*)buf, len);
+
+  res = (jclass)cl->getClassDelegateePtr(vm, pd ? *(JavaObject**)pd : 0);
 
   RETURN_FROM_JNI(res);
 





More information about the vmkit-commits mailing list