[vmkit-commits] [vmkit] r69318 - in /vmkit/trunk/lib/JnJVM: Classpath/ClasspathVMClassLoader.cpp VMCore/Jnjvm.cpp VMCore/Jnjvm.h

Nicolas Geoffray nicolas.geoffray at lip6.fr
Thu Apr 16 15:17:35 PDT 2009


Author: geoffray
Date: Thu Apr 16 17:17:34 2009
New Revision: 69318

URL: http://llvm.org/viewvc/llvm-project?rev=69318&view=rev
Log:
Throw a linkage error when a class is being defined twice.


Modified:
    vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp
    vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp
    vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h

Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp?rev=69318&r1=69317&r2=69318&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp Thu Apr 16 17:17:34 2009
@@ -125,9 +125,16 @@
   
   JavaString* str = (JavaString*)_str;
   const UTF8* name = str->value->javaToInternal(vm, str->offset, str->count);
-  UserClass* cl = JCL->constructClass(name, (ArrayUInt8*)bytes);
+  UserCommonClass* cl = JCL->lookupClass(name);
+  
+  if (!cl) {
+    UserClass* cl = JCL->constructClass(name, (ArrayUInt8*)bytes);
 
-  res = (jclass)(cl->getClassDelegatee(vm, (JavaObject*)pd));
+    res = (jclass)(cl->getClassDelegatee(vm, (JavaObject*)pd));
+  } else {
+    JavaObject* obj = vm->CreateLinkageError("duplicate class definition");
+    JavaThread::get()->throwException(obj);
+  }
 
   END_NATIVE_EXCEPTION
 

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Thu Apr 16 17:17:34 2009
@@ -331,6 +331,11 @@
                      upcalls->InitClassCastException, "");
 }
 
+JavaObject* Jnjvm::CreateLinkageError(const char* msg) {
+  return CreateError(upcalls->LinkageError,
+                     upcalls->InitLinkageError, msg);
+}
+
 void Jnjvm::illegalAccessException(const char* msg) {
   error(upcalls->IllegalAccessException,
         upcalls->InitIllegalAccessException, msg);

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h Thu Apr 16 17:17:34 2009
@@ -251,6 +251,7 @@
   JavaObject* CreateIndexOutOfBoundsException(sint32 entry);
   JavaObject* CreateNegativeArraySizeException();
   JavaObject* CreateClassCastException(JavaObject* obj, UserCommonClass* cl);
+  JavaObject* CreateLinkageError(const char* msg = "");
   
   /// Exceptions - These are the only exceptions VMKit will make.
   ///





More information about the vmkit-commits mailing list