[vmkit-commits] [vmkit] r198314 - Rename utf related classes

Gael Thomas gael.thomas at lip6.fr
Thu Jan 2 08:13:11 PST 2014


Author: gthomas
Date: Thu Jan  2 10:13:10 2014
New Revision: 198314

URL: http://llvm.org/viewvc/llvm-project?rev=198314&view=rev
Log:
Rename utf related classes

Modified:
    vmkit/branches/mcjit/include/j3/j3.h
    vmkit/branches/mcjit/include/j3/j3class.h
    vmkit/branches/mcjit/include/j3/j3method.h
    vmkit/branches/mcjit/include/j3/j3signature.h
    vmkit/branches/mcjit/include/j3/j3utf16.h
    vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc
    vmkit/branches/mcjit/lib/j3/vm/j3.cc
    vmkit/branches/mcjit/lib/j3/vm/j3class.cc
    vmkit/branches/mcjit/lib/j3/vm/j3jni.cc
    vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc
    vmkit/branches/mcjit/lib/j3/vm/j3method.cc
    vmkit/branches/mcjit/lib/j3/vm/j3signature.cc
    vmkit/branches/mcjit/lib/j3/vm/j3utf16.cc

Modified: vmkit/branches/mcjit/include/j3/j3.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3.h?rev=198314&r1=198313&r2=198314&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3.h (original)
+++ vmkit/branches/mcjit/include/j3/j3.h Thu Jan  2 10:13:10 2014
@@ -89,6 +89,11 @@ namespace j3 {
 		J3Field*         fieldClassAccess;
 		J3Method*        fieldClassInit;
 
+		J3Class*         constructorClass;
+		J3Field*         constructorClassClass;
+		J3Field*         constructorClassSlot;
+		J3Method*        constructorClassInit;
+
 		llvm::Type* typeJNIEnvPtr;
 		llvm::Type* typeJ3VirtualTablePtr;
 		llvm::Type* typeJ3Type;

Modified: vmkit/branches/mcjit/include/j3/j3class.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3class.h?rev=198314&r1=198313&r2=198314&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3class.h (original)
+++ vmkit/branches/mcjit/include/j3/j3class.h Thu Jan  2 10:13:10 2014
@@ -195,6 +195,9 @@ namespace j3 {
 		uint32_t*          ctpValues;
 		void**             ctpResolved;
 
+		size_t             _nbConstructors;
+		size_t             _nbPublicConstructors;
+
 		/* GC Object */
 		J3ObjectHandle*    _staticInstance;
 
@@ -214,6 +217,9 @@ namespace j3 {
 	public:
 		J3Class(J3ClassLoader* loader, const vmkit::Name* name, J3ClassBytes* bytes);
 
+		size_t              nbConstructors() { return _nbConstructors; }
+		size_t              nbPublicConstructors() { return _nbPublicConstructors; }
+
 		J3ObjectHandle*     extractAttribute(J3Attribute* attr);
 
 		J3StaticLayout*     staticLayout() { return &_staticLayout; }

Modified: vmkit/branches/mcjit/include/j3/j3method.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3method.h?rev=198314&r1=198313&r2=198314&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3method.h (original)
+++ vmkit/branches/mcjit/include/j3/j3method.h Thu Jan  2 10:13:10 2014
@@ -63,12 +63,14 @@ namespace j3 {
 		J3MethodType*                _methodType;
 		J3Attributes*                _attributes;
 		uint32_t                     _index;
+		uint32_t                     _slot;
 		llvm::Function*              _llvmFunction;
 		void*                        _fnPtr;
 		char* volatile               _llvmAllNames; /* stub + _ + native_name */
 		void*                        _nativeFnPtr;
 		void* volatile               _staticTrampoline;
 		void* volatile               _virtualTrampoline;
+		J3ObjectHandle* volatile     _javaMethod;
 
 		J3Value            internalInvoke(bool statically, J3ObjectHandle* handle, va_list va);
 		J3Value            internalInvoke(bool statically, J3ObjectHandle* handle, J3Value* args);
@@ -77,6 +79,10 @@ namespace j3 {
 	public:
 		J3Method(uint16_t access, J3Class* cl, const vmkit::Name* name, const vmkit::Name* sign);
 
+		uint32_t            slot() { return _slot; }
+
+		J3ObjectHandle*     javaMethod();
+
 		void*               nativeFnPtr() { return _nativeFnPtr; }
 
 		void                markCompiled(llvm::Function* llvmFunction, void* fnPtr);

Modified: vmkit/branches/mcjit/include/j3/j3signature.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3signature.h?rev=198314&r1=198313&r2=198314&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3signature.h (original)
+++ vmkit/branches/mcjit/include/j3/j3signature.h Thu Jan  2 10:13:10 2014
@@ -17,8 +17,10 @@ namespace j3 {
 	class J3LLVMSignature : vmkit::PermanentObject {
 		friend class J3CodeGen;
 
+	public:
 		typedef J3Value (*function_t)(void* fn, J3Value* args);
 
+	private:
 		llvm::FunctionType* _functionType;
 		function_t          _caller;
 

Modified: vmkit/branches/mcjit/include/j3/j3utf16.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3utf16.h?rev=198314&r1=198313&r2=198314&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3utf16.h (original)
+++ vmkit/branches/mcjit/include/j3/j3utf16.h Thu Jan  2 10:13:10 2014
@@ -11,20 +11,20 @@ namespace vmkit {
 namespace j3 {
 	class J3ObjectHandle;
 
-	class J3Utf16Converter {
+	class J3Utf16Encoder {
 		const vmkit::Name* name;
 		size_t             pos;
 	public:
-		J3Utf16Converter(const vmkit::Name* _name);
+		J3Utf16Encoder(const vmkit::Name* _name);
 
 		bool isEof();
 		uint16_t nextUtf16();
 	};
 
-	class J3CharConverter {
+	class J3Utf16Decoder {
 	public:
 		static size_t maxSize(J3ObjectHandle* charArray);
-		static size_t convert(J3ObjectHandle* charArray, char* dest);
+		static size_t decode(J3ObjectHandle* charArray, char* dest);
 	};
 }
 

Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc?rev=198314&r1=198313&r2=198314&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original)
+++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Thu Jan  2 10:13:10 2014
@@ -468,7 +468,27 @@ jobjectArray JNICALL JVM_GetClassDeclare
 	return res;
 }
 
-jobjectArray JNICALL JVM_GetClassDeclaredConstructors(JNIEnv* env, jclass ofClass, jboolean publicOnly) { enterJVM(); NYI(); leaveJVM(); }
+jobjectArray JNICALL JVM_GetClassDeclaredConstructors(JNIEnv* env, jclass ofClass, jboolean publicOnly) { 
+	jobjectArray res;
+	enterJVM(); 
+	J3* vm = J3Thread::get()->vm();
+	J3ObjectType* type = J3ObjectType::nativeClass(ofClass);
+	if(type->isClass()) {
+		J3Class* cl = type->asClass();
+		res = J3ObjectHandle::doNewArray(vm->constructorClass->getArray(), 
+																		 publicOnly ? cl->nbPublicConstructors() : cl->nbConstructors());
+
+		for(uint32_t i=0, pos=0; i<cl->nbMethods(); i++) {
+			J3Method* m = cl->methods()[i];
+			if(m->name() == vm->initName && (!publicOnly || J3Cst::isPublic(m->access())))
+				res->setObjectAt(pos++, m->javaMethod());
+		}
+	} else
+		res = J3ObjectHandle::doNewArray(vm->constructorClass->getArray(), 0);
+
+	leaveJVM(); 
+	return res;
+}
 
 /* Differs from JVM_GetClassModifiers in treatment of inner classes.
    This returns the access flags for the class as specified in the

Modified: vmkit/branches/mcjit/lib/j3/vm/j3.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3.cc?rev=198314&r1=198313&r2=198314&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Thu Jan  2 10:13:10 2014
@@ -127,16 +127,17 @@ void J3::run() {
 		->findVirtualField(names()->get("eetop"), typeLong);
 
 	fieldClass               = z_class("java/lang/reflect/Field");
-	fieldClassInit           = z_method(0, fieldClass, initName, 
-																			names()->get("(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;IILjava/lang/String;[B)V"));
 	fieldClassClass          = z_field(0, fieldClass, "clazz", classClass);
 	fieldClassSlot           = z_field(0, fieldClass, "slot", typeInteger);
 	fieldClassAccess         = z_field(0, fieldClass, "modifiers", typeInteger);
+	fieldClassInit           = z_method(0, fieldClass, initName, 
+																			names()->get("(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;IILjava/lang/String;[B)V"));
 
-#if 0
-		J3Field*         fieldClassSlot;
-		J3Method*        fieldClassInit;
-#endif
+	constructorClass         = z_class("java/lang/reflect/Constructor");
+	constructorClassClass    = z_field(0, constructorClass, "clazz", classClass);
+	constructorClassSlot     = z_field(0, constructorClass, "slot", typeInteger);
+	constructorClassInit     = z_method(0, constructorClass, initName,
+																			names()->get("(Ljava/lang/Class;[Ljava/lang/Class;[Ljava/lang/Class;IILjava/lang/String;[B[B)V"));
 
 	J3Lib::bootstrap(this);
 }
@@ -168,10 +169,10 @@ J3ObjectHandle* J3::nameToString(const v
 		J3ObjectHandle* prev = J3Thread::get()->tell();
 		uint16_t buf[name->length()];
 		size_t pos = 0;
-		J3Utf16Converter converter(name);
+		J3Utf16Encoder encoder(name);
 
-		while(!converter.isEof())
-			buf[pos++] = converter.nextUtf16();
+		while(!encoder.isEof())
+			buf[pos++] = encoder.nextUtf16();
 
 		res = initialClassLoader->globalReferences()->add(J3ObjectHandle::doNewArray(charArrayClass, pos));
 		res->setRegionChar(0, buf, 0, pos);

Modified: vmkit/branches/mcjit/lib/j3/vm/j3class.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3class.cc?rev=198314&r1=198313&r2=198314&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Thu Jan  2 10:13:10 2014
@@ -617,8 +617,9 @@ void J3Class::readClassBytes(J3Field* hi
 		if(J3Cst::isStatic(access)) {
 			nbStaticMethods++;
 			method->setResolved(0);
-		} else
+		} else {
 			nbVirtualMethods++;
+		}
 	}
 
 	staticLayout()->_methods = (J3Method**)loader()->allocator()->allocate(sizeof(J3Method*)*nbStaticMethods);
@@ -628,9 +629,18 @@ void J3Class::readClassBytes(J3Field* hi
 		J3Layout* layout;
 		if(J3Cst::isStatic(methodsTmp[i]->access()))
 			layout = staticLayout();
-		else
+		else {
 			layout = this;
+			if(methodsTmp[i]->name() == loader()->vm()->initName) {
+				_nbConstructors++;
+				if(J3Cst::isPublic(methodsTmp[i]->access()))
+					_nbPublicConstructors++;
+			}
+		}
+
+		methodsTmp[i]->_slot = layout->_nbMethods;
 		layout->_methods[layout->_nbMethods++] = methodsTmp[i];
+
 		if(J3Cst::isPublic(methodsTmp[i]->access()))
 			layout->_nbPublicMethods++;
 	}

Modified: vmkit/branches/mcjit/lib/j3/vm/j3jni.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3jni.cc?rev=198314&r1=198313&r2=198314&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3jni.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3jni.cc Thu Jan  2 10:13:10 2014
@@ -383,8 +383,8 @@ jsize JNICALL GetStringUTFLength(JNIEnv*
 	jsize res;
 	enterJVM(); 
 	jobject content = str->getObject(J3Thread::get()->vm()->stringClassValue);
-	char buf[J3CharConverter::maxSize(content)];
-	res = J3CharConverter::convert(content, buf);
+	char buf[J3Utf16Decoder::maxSize(content)];
+	res = J3Utf16Decoder::decode(content, buf);
 	leaveJVM(); 
 	return res;
 }
@@ -395,8 +395,8 @@ const char* JNICALL GetStringUTFChars(JN
 	enterJVM(); 
 	J3* vm = J3Thread::get()->vm();
 	jobject content = str->getObject(vm->stringClassValue);
-	res = new char[J3CharConverter::maxSize(content)];
-	J3CharConverter::convert(content, res);
+	res = new char[J3Utf16Decoder::maxSize(content)];
+	J3Utf16Decoder::decode(content, res);
 
 	if(isCopy)
 		*isCopy = 1;
@@ -471,7 +471,7 @@ void JNICALL GetStringUTFRegion(JNIEnv*
 	enterJVM(); 
 	J3* vm = J3Thread::get()->vm();
 	jobject content = str->getObject(vm->stringClassValue);
-	J3CharConverter::convert(content, buf);
+	J3Utf16Decoder::decode(content, buf);
 	leaveJVM(); 
 }
 

Modified: vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc?rev=198314&r1=198313&r2=198314&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc Thu Jan  2 10:13:10 2014
@@ -65,11 +65,11 @@ J3Mangler* J3Mangler::mangle(const char*
 }
 
 J3Mangler* J3Mangler::mangle(const vmkit::Name* name) {
-	J3Utf16Converter converter(name);
+	J3Utf16Encoder encoder(name);
 
 	next = cur;
-	while(!converter.isEof()) {
-		uint16_t c = converter.nextUtf16();
+	while(!encoder.isEof()) {
+		uint16_t c = encoder.nextUtf16();
 
 		if(c > 256) {
 			check(6);

Modified: vmkit/branches/mcjit/lib/j3/vm/j3method.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3method.cc?rev=198314&r1=198313&r2=198314&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Thu Jan  2 10:13:10 2014
@@ -118,11 +118,14 @@ J3Value J3Method::internalInvoke(bool st
 	void* fn = fnPtr(1);
 
 	//fprintf(stderr, "Internal invoke %s::%s%s\n", target->cl()->name()->cStr(), target->name()->cStr(), target->sign()->cStr());
-	
-	if(!methodType()->llvmSignature()->caller())
+
+	J3LLVMSignature::function_t caller = methodType()->llvmSignature()->caller();
+	if(!caller) {
 		J3CodeGen::translate(this, 0, 1);
+		caller = methodType()->llvmSignature()->caller();
+	}
 		
-	J3Value res = methodType()->llvmSignature()->caller()(fn, inArgs);
+	J3Value res = caller(fn, inArgs);
 
 	return res;
 }
@@ -280,3 +283,38 @@ void J3Method::registerNative(void* fnPt
 		J3::noSuchMethodError("unable to dynamically modify a native function", cl(), name(), sign());
 	_nativeFnPtr = fnPtr;
 }
+
+J3ObjectHandle* J3Method::javaMethod() {
+	if(!_javaMethod) {
+		cl()->lock();
+		if(!_javaMethod) {
+			J3ObjectHandle* prev = J3Thread::get()->tell();
+			J3* vm = cl()->loader()->vm();
+
+			if(name() == cl()->loader()->vm()->initName) {
+				fprintf(stderr, " slot: %d\n", slot());
+				_javaMethod = cl()->loader()->globalReferences()->add(J3ObjectHandle::doNewObject(vm->constructorClass));
+
+				vm->constructorClassInit->invokeSpecial(_javaMethod,
+																								cl()->javaClass(),
+																								0, //	Class<?>[] parameterTypes,
+																								0, // Class<?>[] checkedExceptions,
+																								access(),
+																								slot(),
+																								vm->nameToString(sign()),
+																								0, //byte[] annotations,
+																								0); //byte[] parameterAnnotations)
+
+				J3::internalError("implement me: java constructor");
+			} else 
+				J3::internalError("implement me: javaMethod");
+
+			J3Thread::get()->restore(prev);
+		}
+		cl()->unlock();
+	}
+
+	return _javaMethod;
+}
+
+

Modified: vmkit/branches/mcjit/lib/j3/vm/j3signature.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3signature.cc?rev=198314&r1=198313&r2=198314&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3signature.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3signature.cc Thu Jan  2 10:13:10 2014
@@ -85,5 +85,5 @@ void J3LLVMSignature::generateCallerIR(J
 
 	builder.CreateRet(res);
 
-	//	caller->dump();
+	caller->dump();
 }

Modified: vmkit/branches/mcjit/lib/j3/vm/j3utf16.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3utf16.cc?rev=198314&r1=198313&r2=198314&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3utf16.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3utf16.cc Thu Jan  2 10:13:10 2014
@@ -5,16 +5,16 @@
 
 using namespace j3;
 
-J3Utf16Converter::J3Utf16Converter(const vmkit::Name* _name) { 
+J3Utf16Encoder::J3Utf16Encoder(const vmkit::Name* _name) { 
 	name = _name; 
 	pos = 0; 
 }
 
-bool J3Utf16Converter::isEof() { 
+bool J3Utf16Encoder::isEof() { 
 	return pos == name->length(); 
 }
 
-uint16_t J3Utf16Converter::nextUtf16() {
+uint16_t J3Utf16Encoder::nextUtf16() {
 	const char* str = name->cStr();
 	size_t   n = 0;
 	size_t   i = 0;
@@ -36,7 +36,7 @@ uint16_t J3Utf16Converter::nextUtf16() {
 	return x;
 }
 
-size_t J3CharConverter::convert(J3ObjectHandle* charArray, char* dest) {
+size_t J3Utf16Decoder::decode(J3ObjectHandle* charArray, char* dest) {
 	size_t length = charArray->arrayLength();
 	size_t pos = 0;
 
@@ -54,7 +54,7 @@ size_t J3CharConverter::convert(J3Object
 	return pos;
 }
 		
-size_t J3CharConverter::maxSize(J3ObjectHandle* charArray) {
+size_t J3Utf16Decoder::maxSize(J3ObjectHandle* charArray) {
 	return 1 + charArray->arrayLength() * 3;
 }
 





More information about the vmkit-commits mailing list