[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