[vmkit-commits] [vmkit] r145687 - in /vmkit/trunk/lib/j3: ClassLib/GNUClasspath/JavaUpcalls.cpp ClassLib/GNUClasspath/JavaUpcalls.h Compiler/JavaAOTCompiler.cpp VMCore/JavaString.cpp VMCore/JavaString.h VMCore/Jnjvm.cpp VMCore/Jnjvm.h VMCore/LockedMap.cpp VMCore/LockedMap.h VMCore/VirtualTables.cpp
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Fri Dec 2 09:52:24 PST 2011
Author: geoffray
Date: Fri Dec 2 11:52:23 2011
New Revision: 145687
URL: http://llvm.org/viewvc/llvm-project?rev=145687&view=rev
Log:
Use VMString.intern to intern strings, instead of using our own ad-hoc c++ weak reference.
Removed:
vmkit/trunk/lib/j3/VMCore/LockedMap.cpp
Modified:
vmkit/trunk/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.cpp
vmkit/trunk/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.h
vmkit/trunk/lib/j3/Compiler/JavaAOTCompiler.cpp
vmkit/trunk/lib/j3/VMCore/JavaString.cpp
vmkit/trunk/lib/j3/VMCore/JavaString.h
vmkit/trunk/lib/j3/VMCore/Jnjvm.cpp
vmkit/trunk/lib/j3/VMCore/Jnjvm.h
vmkit/trunk/lib/j3/VMCore/LockedMap.h
vmkit/trunk/lib/j3/VMCore/VirtualTables.cpp
Modified: vmkit/trunk/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.cpp?rev=145687&r1=145686&r2=145687&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.cpp (original)
+++ vmkit/trunk/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.cpp Fri Dec 2 11:52:23 2011
@@ -94,6 +94,7 @@
JavaMethod* Classpath::InitDirectByteBuffer;
Class* Classpath::newClassLoader;
Class* Classpath::cloneableClass;
+JavaMethod* Classpath::internString;
JavaField* Classpath::boolValue;
@@ -377,27 +378,6 @@
END_NATIVE_EXCEPTION
}
-extern "C" JavaString* Java_java_lang_VMString_intern__Ljava_lang_String_2(
- JavaString* obj) {
- const ArrayUInt16* array = 0;
- JavaString* res = 0;
- llvm_gcroot(obj, 0);
- llvm_gcroot(array, 0);
- llvm_gcroot(res, 0);
- // If the string is already interned, just return.
- if (obj->getVirtualTable() == JavaString::internStringVT) return obj;
-
- BEGIN_NATIVE_EXCEPTION(0)
-
- Jnjvm* vm = JavaThread::get()->getJVM();
- array = JavaString::strToArray(obj, vm);
- res = vm->constructString(array);
-
- END_NATIVE_EXCEPTION
-
- return res;
-}
-
extern "C" uint8 Java_java_lang_Class_isArray__(JavaObjectClass* klass) {
llvm_gcroot(klass, 0);
UserCommonClass* cl = 0;
@@ -742,10 +722,9 @@
UPCALL_METHOD(loader, "java/lang/ClassLoader", "loadClass",
"(Ljava/lang/String;)Ljava/lang/Class;", ACC_VIRTUAL);
- JavaMethod* internString =
+ internString =
UPCALL_METHOD(loader, "java/lang/VMString", "intern",
"(Ljava/lang/String;)Ljava/lang/String;", ACC_STATIC);
- internString->setNative();
JavaMethod* isArray =
UPCALL_METHOD(loader, "java/lang/Class", "isArray", "()Z", ACC_VIRTUAL);
Modified: vmkit/trunk/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.h?rev=145687&r1=145686&r2=145687&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.h (original)
+++ vmkit/trunk/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.h Fri Dec 2 11:52:23 2011
@@ -155,6 +155,7 @@
ISOLATE_STATIC JavaMethod* getUncaughtExceptionHandler;
ISOLATE_STATIC JavaMethod* uncaughtException;
ISOLATE_STATIC UserClass* inheritableThreadLocal;
+ ISOLATE_STATIC JavaMethod* internString;
ISOLATE_STATIC UserClass* InvocationTargetException;
Modified: vmkit/trunk/lib/j3/Compiler/JavaAOTCompiler.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/Compiler/JavaAOTCompiler.cpp?rev=145687&r1=145686&r2=145687&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/Compiler/JavaAOTCompiler.cpp (original)
+++ vmkit/trunk/lib/j3/Compiler/JavaAOTCompiler.cpp Fri Dec 2 11:52:23 2011
@@ -2210,6 +2210,10 @@
}
bootstrapLoader->setCompiler(M);
}
+
+ // We don't want strings to be interned when AOT'ing, otherwise
+ // we would call Java code.
+ bootstrapLoader->upcalls->internString = NULL;
// Set the thread as the owner of the classes, so that it knows it
// has to compile them.
Modified: vmkit/trunk/lib/j3/VMCore/JavaString.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaString.cpp?rev=145687&r1=145686&r2=145687&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaString.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaString.cpp Fri Dec 2 11:52:23 2011
@@ -13,27 +13,18 @@
#include "JavaThread.h"
#include "JavaUpcalls.h"
#include "Jnjvm.h"
-#include "LockedMap.h"
-using namespace j3;
+namespace j3 {
-JavaVirtualTable* JavaString::internStringVT = 0;
-
-JavaString* JavaString::stringDup(const ArrayUInt16 *const& _array, Jnjvm* vm) {
+JavaString* JavaString::create(const ArrayUInt16 * array, Jnjvm* vm) {
JavaString* res = 0;
- const ArrayUInt16* array = _array;
llvm_gcroot(array, 0);
llvm_gcroot(res, 0);
UserClass* cl = vm->upcalls->newString;
res = (JavaString*)cl->doNew(vm);
- // It's a hashed string, set the destructor so that the string
- // removes itself from the vm string map. Do this only if
- // internStringVT exists (in case of AOT).
- if (internStringVT) res->setVirtualTable(internStringVT);
-
// No need to call the Java function: both the Java function and
// this function do the same thing.
JavaString::setValue(res, array);
@@ -91,17 +82,6 @@
}
}
-void JavaString::stringDestructor(JavaString* str) {
- const ArrayUInt16* value = NULL;
- llvm_gcroot(str, 0);
- llvm_gcroot(value, 0);
- value = JavaString::getValue(str);
-
- Jnjvm* vm = JavaThread::get()->getJVM();
- assert(vm && "No vm when destroying a string");
- if (value != NULL) vm->hashStr.removeUnlocked(value, str);
-}
-
JavaString* JavaString::internalToJava(const UTF8* name, Jnjvm* vm) {
ArrayUInt16* array = 0;
@@ -139,3 +119,5 @@
const UTF8* res = map->lookupOrCreateReader(java, self->count);
return res;
}
+
+}
Modified: vmkit/trunk/lib/j3/VMCore/JavaString.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaString.h?rev=145687&r1=145686&r2=145687&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaString.h (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaString.h Fri Dec 2 11:52:23 2011
@@ -47,7 +47,7 @@
return self->value;
}
- static JavaString* stringDup(const ArrayUInt16 *const & array, Jnjvm* vm);
+ static JavaString* create(const ArrayUInt16 * array, Jnjvm* vm);
/// internalToJava - Creates a copy of the UTF8 at its given offset and size
/// with all its '.' replaced by '/'. The JVM bytecode reference classes in
@@ -56,15 +56,12 @@
///
static JavaString* internalToJava(const UTF8* utf8, Jnjvm* vm);
- static void stringDestructor(JavaString*);
static char* strToAsciiz(JavaString* self);
static char* strToAsciiz(JavaString* self, vmkit::ThreadAllocator* allocator);
static const ArrayUInt16* strToArray(JavaString* self, Jnjvm* vm);
/// javaToInternal - Replaces all '/' into '.'.
static const UTF8* javaToInternal(const JavaString* self, UTF8Map* map);
-
- static JavaVirtualTable* internStringVT;
};
} // end namespace j3
Modified: vmkit/trunk/lib/j3/VMCore/Jnjvm.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/Jnjvm.cpp?rev=145687&r1=145686&r2=145687&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/Jnjvm.cpp Fri Dec 2 11:52:23 2011
@@ -733,17 +733,21 @@
for (uint32 i = 0; i < size; i++) {
ArrayUInt16::setElement(tmp, utf8->elements[i], i);
}
-
- return hashStr.lookupOrCreate(const_cast<const ArrayUInt16*&>(tmp), this,
- JavaString::stringDup);
+
+ return constructString(tmp);
}
JavaString* Jnjvm::constructString(const ArrayUInt16* array) {
- JavaString* res = NULL;
+ JavaString* key = NULL;
llvm_gcroot(array, 0);
- llvm_gcroot(res, 0);
- res = hashStr.lookupOrCreate(array, this, JavaString::stringDup);
- return res;
+ llvm_gcroot(key, 0);
+ key = JavaString::create(array, this);
+ if (upcalls->internString) {
+ return (JavaString*)upcalls->internString->invokeJavaObjectStatic(
+ this, upcalls->internString->classDef, &key);
+ } else {
+ return key;
+ }
}
JavaString* Jnjvm::asciizToStr(const char* asciiz) {
@@ -1085,28 +1089,7 @@
cl->resolveClass(); \
cl->initialiseClass(this);
- // If a string belongs to the vm hashmap, we must remove it when
- // it's destroyed. So we define a new VT for strings that will be
- // placed in the hashmap. This VT will have its destructor set so
- // that the string is removed when deallocated.
- upcalls->newString->resolveClass();
- if (JavaString::internStringVT == NULL) {
- JavaVirtualTable* stringVT = upcalls->newString->getVirtualVT();
- uint32 size = upcalls->newString->virtualTableSize * sizeof(word_t);
-
- JavaString::internStringVT =
- (JavaVirtualTable*)bootstrapLoader->allocator.Allocate(size, "String VT");
-
- memcpy(JavaString::internStringVT, stringVT, size);
-
- JavaString::internStringVT->destructor =
- (word_t)JavaString::stringDestructor;
-
- // Tell the finalizer that this is a native destructor.
- JavaString::internStringVT->operatorDelete =
- (word_t)JavaString::stringDestructor;
- }
- upcalls->newString->initialiseClass(this);
+ LOAD_CLASS(upcalls->newString);
// The initialization code of the classes initialized below may require
// to get the Java thread, so we create the Java thread object first.
Modified: vmkit/trunk/lib/j3/VMCore/Jnjvm.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/Jnjvm.h?rev=145687&r1=145686&r2=145687&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/Jnjvm.h (original)
+++ vmkit/trunk/lib/j3/VMCore/Jnjvm.h Fri Dec 2 11:52:23 2011
@@ -28,6 +28,7 @@
namespace j3 {
class ArrayObject;
+class ArrayUInt16;
class Classpath;
class CommonClass;
class FinalizerThread;
@@ -243,10 +244,6 @@
///
JnjvmClassLoader* appClassLoader;
- /// hashStr - Hash map of java/lang/String objects allocated by this JVM.
- ///
- StringMap hashStr;
-
public:
/// CreateExceptions - These are the runtime exceptions thrown by Java code
Removed: vmkit/trunk/lib/j3/VMCore/LockedMap.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/LockedMap.cpp?rev=145686&view=auto
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/LockedMap.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/LockedMap.cpp (removed)
@@ -1,40 +0,0 @@
-//===------- LockedMap.cpp - Implementation of the UTF8 map ---------------===//
-//
-// The VMKit project
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include <map>
-
-#include "JavaArray.h"
-#include "JavaString.h"
-#include "LockedMap.h"
-
-namespace j3 {
-
-bool ltarray16::operator()(const ArrayUInt16* s1, const ArrayUInt16* s2) const {
- llvm_gcroot(s1, 0);
- llvm_gcroot(s2, 0);
- if (ArrayUInt16::getSize(s1) < ArrayUInt16::getSize(s2)) return true;
- else if (ArrayUInt16::getSize(s1) > ArrayUInt16::getSize(s2)) return false;
- else return memcmp((const char*)ArrayUInt16::getElements(s1),
- (const char*)ArrayUInt16::getElements(s2),
- ArrayUInt16::getSize(s1) * sizeof(uint16)) < 0;
-}
-
-void StringMap::insert(JavaString* str) {
- const ArrayUInt16* array = NULL;
- llvm_gcroot(str, 0);
- llvm_gcroot(array, 0);
- array = JavaString::getValue(str);
- StringMap::iterator it = map.insert(std::make_pair(array, str)).first;
- assert(map.find(array)->second == str);
- assert(map.find(array)->first == array);
- assert(&(map.find(array)->second) == &(it->second));
- assert(&(map.find(array)->first) == &(it->first));
-}
-
-}
Modified: vmkit/trunk/lib/j3/VMCore/LockedMap.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/LockedMap.h?rev=145687&r1=145686&r2=145687&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/LockedMap.h (original)
+++ vmkit/trunk/lib/j3/VMCore/LockedMap.h Fri Dec 2 11:52:23 2011
@@ -30,83 +30,9 @@
namespace j3 {
-class ArrayUInt16;
-class JavaString;
-class JnjvmClassLoader;
class Signdef;
class Typedef;
class UserCommonClass;
-class UserClassArray;
-
-struct ltarray16 {
- bool operator()(const ArrayUInt16 *const s1, const ArrayUInt16 *const s2) const;
-};
-
-class StringMap : public vmkit::PermanentObject {
-public:
- typedef std::map<const ArrayUInt16 *const, JavaString*, ltarray16>::iterator iterator;
- typedef JavaString* (*funcCreate)(const ArrayUInt16 *const& V, Jnjvm* vm);
-
- vmkit::LockNormal lock;
- std::map<const ArrayUInt16 *const, JavaString*, ltarray16,
- std::allocator<std::pair<const ArrayUInt16 *const, JavaString*> > > map;
-
- inline JavaString* lookupOrCreate(const ArrayUInt16 *const array, Jnjvm* vm, funcCreate func) {
- JavaString* res = 0;
- llvm_gcroot(res, 0);
- llvm_gcroot(array, 0);
- lock.lock();
- iterator End = map.end();
- iterator I = map.find(array);
- if (I == End) {
- res = func(array, vm);
- map.insert(std::make_pair(array, res));
- lock.unlock();
- return res;
- } else {
- lock.unlock();
- return ((JavaString*)(I->second));
- }
- }
-
- inline void remove(const ArrayUInt16 *const array) {
- llvm_gcroot(array, 0);
- lock.lock();
- map.erase(array);
- lock.unlock();
- }
-
- inline JavaString* lookup(const ArrayUInt16 *const array) {
- llvm_gcroot(array, 0);
- lock.lock();
- iterator End = map.end();
- iterator I = map.find(array);
- lock.unlock();
- return I != End ? ((JavaString*)(I->second)) : 0;
- }
-
- inline void hash(const ArrayUInt16 *const array, JavaString* str) {
- llvm_gcroot(array, 0);
- llvm_gcroot(str, 0);
- lock.lock();
- map.insert(std::make_pair(array, str));
- lock.unlock();
- }
-
- inline void removeUnlocked(const ArrayUInt16 *const array, JavaString* str) {
- llvm_gcroot(str, 0);
- llvm_gcroot(array, 0);
- iterator End = map.end();
- iterator I = map.find(array);
-
- if (I != End && I->second == str) map.erase(I);
- }
-
- ~StringMap() {}
-
- void insert(JavaString* str);
-};
-
class ClassMap : public vmkit::PermanentObject {
public:
Modified: vmkit/trunk/lib/j3/VMCore/VirtualTables.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/VirtualTables.cpp?rev=145687&r1=145686&r2=145687&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/VirtualTables.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/VirtualTables.cpp Fri Dec 2 11:52:23 2011
@@ -284,26 +284,17 @@
start = start->next;
}
- // (4) Trace the interned strings.
- for (StringMap::iterator i = hashStr.map.begin(), e = hashStr.map.end();
- i!= e; ++i) {
- JavaString** str = &(i->second);
- vmkit::Collector::markAndTraceRoot(str, closure);
- ArrayUInt16** key = const_cast<ArrayUInt16**>(&(i->first));
- vmkit::Collector::markAndTraceRoot(key, closure);
- }
-
- // (5) Trace the finalization queue.
+ // (4) Trace the finalization queue.
for (uint32 i = 0; i < finalizerThread->CurrentFinalizedIndex; ++i) {
vmkit::Collector::markAndTraceRoot(finalizerThread->ToBeFinalized + i, closure);
}
- // (6) Trace the reference queue
+ // (5) Trace the reference queue
for (uint32 i = 0; i < referenceThread->ToEnqueueIndex; ++i) {
vmkit::Collector::markAndTraceRoot(referenceThread->ToEnqueue + i, closure);
}
- // (7) Trace the locks and their associated object.
+ // (6) Trace the locks and their associated object.
uint32 i = 0;
for (; i < vmkit::LockSystem::GlobalSize; i++) {
vmkit::FatLock** array = lockSystem.LockTable[i];
More information about the vmkit-commits
mailing list