[vmkit-commits] [vmkit] r198296 - Build java.lang.reflect.Field

Gael Thomas gael.thomas at lip6.fr
Thu Jan 2 02:50:54 PST 2014


Author: gthomas
Date: Thu Jan  2 04:50:54 2014
New Revision: 198296

URL: http://llvm.org/viewvc/llvm-project?rev=198296&view=rev
Log:
Build java.lang.reflect.Field

Modified:
    vmkit/branches/mcjit/include/j3/j3.h
    vmkit/branches/mcjit/include/j3/j3class.h
    vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc
    vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc
    vmkit/branches/mcjit/lib/j3/vm/j3.cc
    vmkit/branches/mcjit/lib/j3/vm/j3class.cc
    vmkit/branches/mcjit/lib/j3/vm/j3field.cc

Modified: vmkit/branches/mcjit/include/j3/j3.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3.h?rev=198296&r1=198295&r2=198296&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3.h (original)
+++ vmkit/branches/mcjit/include/j3/j3.h Thu Jan  2 04:50:54 2014
@@ -86,6 +86,7 @@ namespace j3 {
 		J3Class*         fieldClass;
 		J3Field*         fieldClassClass;
 		J3Field*         fieldClassSlot;
+		J3Field*         fieldClassAccess;
 		J3Method*        fieldClassInit;
 
 		llvm::Type* typeJNIEnvPtr;
@@ -126,6 +127,8 @@ namespace j3 {
 		static void    classFormatError(J3Class* cl, const wchar_t* reason, ...) __attribute__((noreturn));
 		static void    noSuchMethodError(const wchar_t* msg, 
 																		 J3Class* clName, const vmkit::Name* name, const vmkit::Name* sign) __attribute__((noreturn));
+		static void    noSuchFieldError(const wchar_t* msg, 
+																		J3Class* clName, const vmkit::Name* name, J3Type* type) __attribute__((noreturn));
 		static void    linkageError(J3Method* method) __attribute__((noreturn));
 
 		static void    nullPointerException() __attribute__((noreturn));

Modified: vmkit/branches/mcjit/include/j3/j3class.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3class.h?rev=198296&r1=198295&r2=198296&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3class.h (original)
+++ vmkit/branches/mcjit/include/j3/j3class.h Thu Jan  2 04:50:54 2014
@@ -163,6 +163,8 @@ namespace j3 {
 
 		J3Method*         findMethod(const vmkit::Name* name, const vmkit::Name* sign);
 		J3Field*          findField(const vmkit::Name* name, const J3Type* type);
+
+		virtual J3ObjectHandle* extractAttribute(J3Attribute* attr) = 0;
 	};
 
 	class J3StaticLayout : public J3Layout {
@@ -173,6 +175,7 @@ namespace j3 {
 		J3Class* cl() { return _cl; }
 
 		virtual bool      isStaticLayout() { return 1; }
+		J3ObjectHandle*   extractAttribute(J3Attribute* attr);
 	};
 
 	class J3Class : public J3Layout {
@@ -245,8 +248,8 @@ namespace j3 {
 		J3Method*           findVirtualMethod(const vmkit::Name* name, const vmkit::Name* sign, bool error=1);
 		J3Method*           findStaticMethod(const vmkit::Name* name, const vmkit::Name* sign, bool error=1);
 
-		J3Field*            findVirtualField(const vmkit::Name* name, const J3Type* type, bool error=1);
-		J3Field*            findStaticField(const vmkit::Name* name, const J3Type* type, bool error=1);
+		J3Field*            findVirtualField(const vmkit::Name* name, J3Type* type, bool error=1);
+		J3Field*            findStaticField(const vmkit::Name* name, J3Type* type, bool error=1);
 	};
 
 	class J3ArrayClass : public J3ObjectType {

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=198296&r1=198295&r2=198296&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original)
+++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Thu Jan  2 04:50:54 2014
@@ -53,12 +53,15 @@ jstring JNICALL JVM_InternString(JNIEnv*
 	enterJVM(); 
 
 	J3* vm = J3Thread::get()->vm();
+
 	J3ObjectHandle* value = str->getObject(vm->stringClassValue);
 	uint32_t length = value->arrayLength();
-	wchar_t copy[length];
+	wchar_t copy[length+1];
 
 	for(uint32_t i=0; i<length; i++)
-		copy[i] = value->getCharAt(length);
+		copy[i] = value->getCharAt(i);
+
+	copy[length] = 0;
 
 	res = vm->nameToString(vm->names()->get(copy));
 
@@ -420,12 +423,15 @@ jobjectArray JNICALL JVM_GetClassDeclare
 		size_t cur = 0;
 		for(uint32_t i=0; i<cl->nbFields(); i++)
 			if(!publicOnly || J3Cst::isPublic(cl->fields()[i].access()))
-				res->setObjectAt(i, cl->fields()[i].javaField());
+				res->setObjectAt(cur++, cl->fields()[i].javaField());
+		for(uint32_t i=0; i<cl->staticLayout()->nbFields(); i++)
+			if(!publicOnly || J3Cst::isPublic(cl->staticLayout()->fields()[i].access()))
+				res->setObjectAt(cur++, cl->staticLayout()->fields()[i].javaField());
 	} else
 		res = J3ObjectHandle::doNewArray(type->loader()->vm()->fieldClass->getArray(), 0);
 
 	leaveJVM();
- 
+
 	return res;
 }
 

Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc?rev=198296&r1=198295&r2=198296&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc (original)
+++ vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc Thu Jan  2 04:50:54 2014
@@ -3,6 +3,7 @@
 #include "j3/j3thread.h"
 #include "j3/j3class.h"
 #include "j3/j3classloader.h"
+#include "j3/j3field.h"
 #include "j3/j3.h"
 
 #include "llvm/IR/DataLayout.h"
@@ -34,4 +35,19 @@ extern "C" {
 	JNIEXPORT jint JNICALL Java_sun_misc_Unsafe_addressSize(JNIEnv* env, jobject unsafe) {
 		return J3Thread::get()->vm()->objectClass->getSizeInBits()>>3;
 	}
+
+	/// objectFieldOffset - Pointer offset of the specified field
+	///
+	JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_objectFieldOffset(JNIEnv* env, jobject unsafe, jobject field) {
+		J3* vm = J3Thread::get()->vm();
+		J3Class* cl = J3Class::nativeClass(field->getObject(vm->fieldClassClass))->asClass();
+		uint32_t slot = field->getInteger(vm->fieldClassSlot);
+		uint32_t access = field->getInteger(vm->fieldClassAccess);
+		J3Field* fields = J3Cst::isStatic(access) ? cl->staticLayout()->fields() : cl->fields();
+		return fields[slot].offset();
+	}
 }
+
+
+
+

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=198296&r1=198295&r2=198296&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Thu Jan  2 04:50:54 2014
@@ -130,6 +130,8 @@ void J3::run() {
 																			names()->get(L"(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;IILjava/lang/String;[B)V"));
 	fieldClassClass          = z_field(0, fieldClass, L"clazz", classClass);
 	fieldClassSlot           = z_field(0, fieldClass, L"slot", typeInteger);
+	fieldClassAccess         = z_field(0, fieldClass, L"modifiers", typeInteger);
+
 #if 0
 		J3Field*         fieldClassSlot;
 		J3Method*        fieldClassInit;
@@ -194,6 +196,10 @@ void J3::noSuchMethodError(const wchar_t
 	internalError(L"%ls: %ls::%ls %ls", msg, cl->name()->cStr(), name->cStr(), sign->cStr());
 }
 
+void J3::noSuchFieldError(const wchar_t* msg, J3Class* cl, const vmkit::Name* name, J3Type* type) {
+	internalError(L"%ls: %ls::%ls %ls", msg, cl->name()->cStr(), name->cStr(), type->name()->cStr());
+}
+
 void J3::classFormatError(J3Class* cl, const wchar_t* reason, ...) {
 	wchar_t buf[65536];
 	va_list va;
@@ -224,7 +230,8 @@ void J3::vinternalError(const wchar_t* m
 	vswprintf(buf, 65536, msg, va);
 	fprintf(stderr, "Internal error: %ls\n", buf);
 	printStackTrace();
-	exit(1);
+	//	exit(1);
+	abort();
 }
 
 void J3::printStackTrace() {

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=198296&r1=198295&r2=198296&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Thu Jan  2 04:50:54 2014
@@ -249,6 +249,10 @@ J3StaticLayout::J3StaticLayout(J3ClassLo
 	_cl = cl;
 }
 
+J3ObjectHandle* J3StaticLayout::extractAttribute(J3Attribute* attr) { 
+	return cl()->extractAttribute(attr); 
+}
+
 J3Layout::J3Layout(J3ClassLoader* loader, const vmkit::Name* name) : J3ObjectType(loader, name) {
 }
 
@@ -304,9 +308,9 @@ J3Method* J3Class::findVirtualMethod(con
 	resolve();
 
 	J3Class* cur = this;
-	J3Method* res;
+
 	while(1) {
-		res = cur->findMethod(name, sign);
+		J3Method* res = cur->findMethod(name, sign);
 
 		if(res)
 			return res;
@@ -326,9 +330,9 @@ J3Method* J3Class::findStaticMethod(cons
 	resolve();
 
 	J3Class* cur = this;
-	J3Method* res;
+
 	while(1) {
-		res = cur->staticLayout()->findMethod(name, sign);
+		J3Method* res = cur->staticLayout()->findMethod(name, sign);
 
 		if(res)
 			return res;
@@ -341,23 +345,30 @@ J3Method* J3Class::findStaticMethod(cons
 		}
 		cur = cur->super();
 	}
-
-	return res;
 }
 
-J3Field* J3Class::findVirtualField(const vmkit::Name* name, const J3Type* type, bool error) {
-	//loader()->vm()->log(L"Lookup: %ls %ls in %ls", methName->cStr(), methSign->cStr(), name()->cStr());
+J3Field* J3Class::findVirtualField(const vmkit::Name* name, J3Type* type, bool error) {
+	//loader()->vm()->log(L"Lookup: %ls %ls in %ls", type->name()->cStr(), name->cStr(), J3Class::name()->cStr());
 	resolve();
+	J3Class* cur = this;
 
-	J3Field* res = findField(name, type);
+	while(1) {
+		J3Field* res = cur->findField(name, type);
 
-	if(!res)
-		J3::internalError(L"implement me");
+		if(res)
+			return res;
 
-	return res;
+		if(cur == cur->super()) {
+			if(error)
+				J3::noSuchFieldError(L"no such field", this, name, type);
+			else
+				return 0;
+		}
+		cur = cur->super();
+	}
 }
 
-J3Field* J3Class::findStaticField(const vmkit::Name* fname, const J3Type* ftype, bool error) {
+J3Field* J3Class::findStaticField(const vmkit::Name* fname, J3Type* ftype, bool error) {
 	//fprintf(stderr, "Lookup static field %ls %ls::%ls\n", ftype->name()->cStr(), name()->cStr(), fname->cStr());
 	resolve();
 
@@ -630,16 +641,11 @@ void J3Class::readClassBytes(J3Field* hi
 void J3Class::fillFields(J3Field** fields, size_t n) {
 	for(size_t i=0; i<n; i++) {
 		J3Field*  cur = fields[i];
-		J3Layout* layout;
+		J3Layout* layout = J3Cst::isStatic(fields[i]->access()) ? (J3Layout*)staticLayout() : this;
 
-		if(J3Cst::isStatic(fields[i]->access())) {
-			//fprintf(stderr, "   adding static field: %ls %ls::%ls\n", cur->type()->name()->cStr(), name()->cStr(), cur->name()->cStr());
-			layout = staticLayout();
-		} else {
-			layout = this;
-		}
+		//fprintf(stderr, "   adding static field: %ls %ls::%ls\n", cur->type()->name()->cStr(), name()->cStr(), cur->name()->cStr());
 		cur->_offset = layout->structSize();
-		cur->_slot = i;
+		cur->_slot = layout->_nbFields;
 		layout->_structSize += 1 << fields[i]->type()->logSize();
 		layout->fields()[layout->_nbFields++] = *fields[i];
 
@@ -750,7 +756,7 @@ J3Field* J3Class::fieldAt(uint16_t idx,
 
 	check(ntIdx, J3Cst::CONSTANT_NameAndType);
 	const vmkit::Name* name = nameAt(ctpValues[ntIdx] >> 16);
-	const J3Type*      type = loader()->getType(this, nameAt(ctpValues[ntIdx] & 0xffff));
+	J3Type*            type = loader()->getType(this, nameAt(ctpValues[ntIdx] & 0xffff));
 	
 	res = J3Cst::isStatic(access) ? cl->findStaticField(name, type) : cl->findVirtualField(name, type);
 

Modified: vmkit/branches/mcjit/lib/j3/vm/j3field.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3field.cc?rev=198296&r1=198295&r2=198296&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3field.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3field.cc Thu Jan  2 04:50:54 2014
@@ -25,11 +25,11 @@ J3ObjectHandle* J3Field::javaField() {
 																				access(),                         /* access */
 																				slot(),                           /* slot */
 																				vm->nameToString(type()->name()), /* signature */
-																				layout()
-																				->asClass()->extractAttribute(attributes()->lookup(vm->annotationsAttribute)));/* annotations */
+																				layout()->extractAttribute(attributes()->lookup(vm->annotationsAttribute)));/* annotations */
 
 			J3Thread::get()->restore(prev);
 		}
+
 		layout()->unlock();
 	}
 	return _javaField;





More information about the vmkit-commits mailing list