[vmkit-commits] [vmkit] r198553 - Correctly define the java class of a primitive.

Gael Thomas gael.thomas at lip6.fr
Sun Jan 5 01:46:51 PST 2014


Author: gthomas
Date: Sun Jan  5 03:46:51 2014
New Revision: 198553

URL: http://llvm.org/viewvc/llvm-project?rev=198553&view=rev
Log:
Correctly define the java class of a primitive.

Modified:
    vmkit/branches/mcjit/include/j3/j3class.h
    vmkit/branches/mcjit/include/j3/j3constants.h
    vmkit/branches/mcjit/include/j3/j3typesdef.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/j3classloader.cc
    vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc
    vmkit/branches/mcjit/lib/j3/vm/j3jni.cc
    vmkit/branches/mcjit/lib/j3/vm/j3method.cc
    vmkit/branches/mcjit/lib/j3/vm/j3utf16.cc

Modified: vmkit/branches/mcjit/include/j3/j3class.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3class.h?rev=198553&r1=198552&r2=198553&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3class.h (original)
+++ vmkit/branches/mcjit/include/j3/j3class.h Sun Jan  5 03:46:51 2014
@@ -295,6 +295,7 @@ namespace j3 {
 		uint32_t    logSize()     { return _logSize; }
 		bool        isPrimitive() { return 1; }
 		llvm::Type* llvmType()    { return _llvmType; }
+		void        defineJavaClass(const char* className);
 	};
 }
 

Modified: vmkit/branches/mcjit/include/j3/j3constants.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3constants.h?rev=198553&r1=198552&r2=198553&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3constants.h (original)
+++ vmkit/branches/mcjit/include/j3/j3constants.h Sun Jan  5 03:46:51 2014
@@ -81,7 +81,7 @@ namespace j3 {
 
 		static const char ID_Void =        'V';
 		static const char ID_Byte =        'B';
-		static const char ID_Char =        'C';
+		static const char ID_Character =   'C';
 		static const char ID_Double =      'D';
 		static const char ID_Float =       'F';
 		static const char ID_Integer =     'I';

Modified: vmkit/branches/mcjit/include/j3/j3typesdef.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3typesdef.h?rev=198553&r1=198552&r2=198553&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3typesdef.h (original)
+++ vmkit/branches/mcjit/include/j3/j3typesdef.h Sun Jan  5 03:46:51 2014
@@ -5,14 +5,14 @@ namespace j3 {
 
 	/* name, ctype, llvmType, scale size */
 #define onJavaPrimitives(_)																							\
-	_(Boolean, bool,     Int1,   0)																				\
-	_(Byte,    int8_t,   Int8,   0)																				\
-	_(Short,   int16_t,  Int16,  1)																				\
-	_(Char,    uint16_t, Int16,  1)																				\
-	_(Integer, int32_t,  Int32,  2)																				\
-	_(Long,    int64_t,  Int64,  3)																				\
-	_(Float,   float,    Float,  2)																				\
-	_(Double,  double,   Double, 3)																				\
+	_(Boolean,   bool,     Int1,   0)																			\
+	_(Byte,      int8_t,   Int8,   0)																			\
+	_(Short,     int16_t,  Int16,  1)																			\
+	_(Character, uint16_t, Int16,  1)																			\
+	_(Integer,   int32_t,  Int32,  2)																			\
+	_(Long,      int64_t,  Int64,  3)																			\
+	_(Float,     float,    Float,  2)																			\
+	_(Double,    double,   Double, 3)																			\
 
 #define onJavaVoid(_)														\
 	_(Void, void,        Void, 0)																	

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=198553&r1=198552&r2=198553&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original)
+++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Sun Jan  5 03:46:51 2014
@@ -563,9 +563,25 @@ jboolean JNICALL JVM_IsInterface(JNIEnv*
 jobjectArray JNICALL JVM_GetClassSigners(JNIEnv* env, jclass cls) { enterJVM(); NYI(); leaveJVM(); }
 void JNICALL JVM_SetClassSigners(JNIEnv* env, jclass cls, jobjectArray signers) { enterJVM(); NYI(); leaveJVM(); }
 jobject JNICALL JVM_GetProtectionDomain(JNIEnv* env, jclass cls) { enterJVM(); NYI(); leaveJVM(); }
-jboolean JNICALL JVM_IsArrayClass(JNIEnv* env, jclass cls) { enterJVM(); NYI(); leaveJVM(); }
+
+jboolean JNICALL JVM_IsArrayClass(JNIEnv* env, jclass cls) { 
+	jboolean res;
+	enterJVM(); 
+	res = J3ObjectType::nativeClass(cls)->isArrayClass();
+	leaveJVM(); 
+	return res;
+}
+
 jboolean JNICALL JVM_IsPrimitiveClass(JNIEnv* env, jclass cls) { enterJVM(); NYI(); leaveJVM(); }
-jclass JNICALL JVM_GetComponentType(JNIEnv* env, jclass cls) { enterJVM(); NYI(); leaveJVM(); }
+jclass JNICALL JVM_GetComponentType(JNIEnv* env, jclass cls) { 
+	jclass res;
+	enterJVM();
+	J3ObjectType* cl = J3ObjectType::nativeClass(cls);
+	res = cl->isArrayClass() ? cl->asArrayClass()->component()->javaClass() : 0;
+	leaveJVM(); 
+	return res;
+}
+
 jint JNICALL JVM_GetClassModifiers(JNIEnv* env, jclass cls) { 
 	jint res;
 	enterJVM(); 

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=198553&r1=198552&r2=198553&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc (original)
+++ vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc Sun Jan  5 03:46:51 2014
@@ -80,15 +80,15 @@ extern "C" {
 	unsafeCAS(jtype, id, j3id, sign)											\
 	unsafeGetPut(jtype, id, j3id, sign)
 
-	defUnsafe(jobject,  Object,  Object,   Ljava_lang_Object_2);
-	defUnsafe(jboolean, Boolean, Boolean,  Z);
-	defUnsafe(jbyte,    Byte,    Byte,     B);
-	defUnsafe(jchar,    Char,    Char,     C);
-	defUnsafe(jshort,   Short,   Short,    S);
-	defUnsafe(jint,     Int,     Integer,  I);
-	defUnsafe(jlong,    Long,    Long,     J);
-	defUnsafe(jfloat,   Float,   Float,    F);
-	defUnsafe(jdouble,  Double,  Double,   D);
+	defUnsafe(jobject,  Object,  Object,    Ljava_lang_Object_2);
+	defUnsafe(jboolean, Boolean, Boolean,   Z);
+	defUnsafe(jbyte,    Byte,    Byte,      B);
+	defUnsafe(jchar,    Char,    Character, C);
+	defUnsafe(jshort,   Short,   Short,     S);
+	defUnsafe(jint,     Int,     Integer,   I);
+	defUnsafe(jlong,    Long,    Long,      J);
+	defUnsafe(jfloat,   Float,   Float,     F);
+	defUnsafe(jdouble,  Double,  Double,    D);
 }
 
 

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=198553&r1=198552&r2=198553&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Sun Jan  5 03:46:51 2014
@@ -106,7 +106,7 @@ void J3::run() {
 	arrayInterfaces[0]   = z_class("java/lang/Cloneable");
 	arrayInterfaces[1]   = z_class("java/io/Serializable");
 
-	charArrayClass           = typeChar->getArray();
+	charArrayClass           = typeCharacter->getArray();
 	objectClass              = z_class("java/lang/Object");
 	objectClass->resolve();
 	
@@ -137,6 +137,11 @@ void J3::run() {
 	constructorClassInit     = z_method(0, constructorClass, initName,
 																			names()->get("(Ljava/lang/Class;[Ljava/lang/Class;[Ljava/lang/Class;IILjava/lang/String;[B[B)V"));
 
+#define defJavaClassPrimitive(name, ctype, llvmtype, scale)	\
+	type##name->defineJavaClass("java/lang/"#name);
+	onJavaTypes(defJavaClassPrimitive)
+#undef defJavaClassPrimitive
+
 	J3Lib::bootstrap(this);
 }
 
@@ -173,7 +178,7 @@ J3ObjectHandle* J3::nameToString(const v
 			buf[pos++] = encoder.nextUtf16();
 
 		res = initialClassLoader->globalReferences()->add(J3ObjectHandle::doNewArray(charArrayClass, pos));
-		res->setRegionChar(0, buf, 0, pos);
+		res->setRegionCharacter(0, buf, 0, pos);
 		J3Thread::get()->restore(prev);
 
 		nameToCharArrays[name] = res;

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=198553&r1=198552&r2=198553&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Sun Jan  5 03:46:51 2014
@@ -934,3 +934,8 @@ J3Primitive::J3Primitive(J3ClassLoader*
 	_logSize = logSize;
 }
 
+void J3Primitive::defineJavaClass(const char* className) {
+	J3* vm = J3Thread::get()->vm();
+	fprintf(stderr, " ---> %s\n", className);
+	_javaClass = vm->initialClassLoader->loadClass(vm->names()->get(className))->javaClass(0);
+}

Modified: vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc?rev=198553&r1=198552&r2=198553&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc Sun Jan  5 03:46:51 2014
@@ -108,15 +108,10 @@ J3Type* J3ClassLoader::getTypeInternal(J
 
 		switch(type[pos]) {
 			case J3Cst::ID_Array:     prof++; pos++; break;
-			case J3Cst::ID_Void:      res = vm->typeVoid; pos++; break;
-			case J3Cst::ID_Byte:      res = vm->typeByte; pos++; break;
-			case J3Cst::ID_Char:      res = vm->typeChar; pos++; break;
-			case J3Cst::ID_Double:    res = vm->typeDouble; pos++; break;
-			case J3Cst::ID_Float:     res = vm->typeFloat; pos++; break;
-			case J3Cst::ID_Integer:   res = vm->typeInteger; pos++; break;
-			case J3Cst::ID_Long:      res = vm->typeLong; pos++; break;
-			case J3Cst::ID_Short:     res = vm->typeShort; pos++; break;
-			case J3Cst::ID_Boolean:   res = vm->typeBoolean; pos++; break;
+#define doIt(id, ctype, llvmType, scale)				\
+				case J3Cst::ID_##id:    res = vm->type##id; pos++; break;
+				onJavaTypes(doIt)
+#undef doIt
 			case J3Cst::ID_Classname: 
 				if(unify) {
 					uint32_t start = ++pos;

Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc?rev=198553&r1=198552&r2=198553&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Sun Jan  5 03:46:51 2014
@@ -171,7 +171,7 @@ llvm::Value* J3CodeGen::flatten(llvm::Va
 		return v;
 	else if(type == vm->typeBoolean->llvmType() || type == vm->typeByte->llvmType() || type == vm->typeShort->llvmType())
 		return builder->CreateSExt(v, vm->typeInteger->llvmType());
-	else if(type == vm->typeChar->llvmType())
+	else if(type == vm->typeCharacter->llvmType())
 		return builder->CreateZExt(v, vm->typeInteger->llvmType());
 
 	fprintf(stderr, " v: ");
@@ -189,7 +189,7 @@ llvm::Value* J3CodeGen::unflatten(llvm::
 		return v;
 	else if(type == vm->typeBoolean->llvmType() || type == vm->typeByte->llvmType() || type == vm->typeShort->llvmType())
 		return builder->CreateSExtOrTrunc(v, type);
-	else if(type == vm->typeChar->llvmType())
+	else if(type == vm->typeCharacter->llvmType())
 		return builder->CreateZExtOrTrunc(v, type);
 
 	fprintf(stderr, " v: ");
@@ -543,7 +543,7 @@ void J3CodeGen::newArray(uint8_t atype)
 
 	switch(atype) {
 		case J3Cst::T_BOOLEAN: prim = vm->typeBoolean; break;
-		case J3Cst::T_CHAR:    prim = vm->typeChar; break;
+		case J3Cst::T_CHAR:    prim = vm->typeCharacter; break;
 		case J3Cst::T_FLOAT:   prim = vm->typeFloat; break;
 		case J3Cst::T_DOUBLE:  prim = vm->typeDouble; break;
 		case J3Cst::T_BYTE:    prim = vm->typeByte; break;
@@ -1066,7 +1066,7 @@ void J3CodeGen::translate() {
 				break;
 
 			case J3Cst::BC_caload:                        /* 0x34 */
-				arrayLoad(vm->typeChar);
+				arrayLoad(vm->typeCharacter);
 				break;
 
 			case J3Cst::BC_saload:                        /* 0x35 */
@@ -1141,7 +1141,7 @@ void J3CodeGen::translate() {
 				break;
 
 			case J3Cst::BC_castore:                       /* 0x55 */
-				arrayStore(vm->typeChar);
+				arrayStore(vm->typeCharacter);
 				break;
 
 			case J3Cst::BC_sastore:                       /* 0x56 */

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=198553&r1=198552&r2=198553&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3jni.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3jni.cc Sun Jan  5 03:46:51 2014
@@ -319,7 +319,7 @@ jmethodID JNICALL GetStaticMethodID(JNIE
 	defJNIObj(jobject,  Object,  Object);
 	defJNI   (jboolean, Boolean, Boolean);
 	defJNI   (jbyte,    Byte,    Byte);
-	defJNI   (jchar,    Char,    Char);
+	defJNI   (jchar,    Char,    Character);
 	defJNI   (jshort,   Short,   Short);
 	defJNI   (jint,     Int,     Integer);
 	defJNI   (jlong,    Long,    Long);
@@ -407,8 +407,8 @@ jstring JNICALL NewString(JNIEnv* env, c
 	jstring res;
 	enterJVM(); 
 	J3* vm = J3Thread::get()->vm();
-	J3ObjectHandle* content = J3ObjectHandle::doNewArray(vm->typeChar->getArray(), len);
-	content->setRegionChar(0, unicode, 0, len);
+	J3ObjectHandle* content = J3ObjectHandle::doNewArray(vm->typeCharacter->getArray(), len);
+	content->setRegionCharacter(0, unicode, 0, len);
 	res = J3ObjectHandle::doNewObject(vm->stringClass);
 	vm->stringClassInit->invokeSpecial(res, content, 0);
 	leaveJVM(); 
@@ -521,7 +521,7 @@ jint JNICALL GetJavaVM(JNIEnv* env, Java
 
 void JNICALL GetStringRegion(JNIEnv* env, jstring str, jsize start, jsize len, jchar* buf) { 
 	enterJVM(); 
-	str->getObject(J3Thread::get()->vm()->stringClassValue)->getRegionChar(start, buf, 0, len);
+	str->getObject(J3Thread::get()->vm()->stringClassValue)->getRegionCharacter(start, buf, 0, len);
 	leaveJVM(); 
 }
 

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=198553&r1=198552&r2=198553&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Sun Jan  5 03:46:51 2014
@@ -131,24 +131,14 @@ J3Value J3Method::internalInvoke(J3Objec
 	for(llvm::FunctionType::param_iterator cur=fType->param_begin(); cur!=fType->param_end(); cur++, i++) {
 		llvm::Type* t = *cur;
 
-		if(t == vm->typeBoolean->llvmType())
-			args[i].valBoolean = va_arg(va, bool);
-		else if(t == vm->typeByte->llvmType())
-			args[i].valByte = va_arg(va, int8_t);
-		else if(t == vm->typeShort->llvmType())
-			args[i].valShort = va_arg(va, int16_t);
-		else if(t == vm->typeChar->llvmType())
-			args[i].valChar = va_arg(va, uint16_t);
-		else if(t == vm->typeInteger->llvmType())
-			args[i].valInteger = va_arg(va, int32_t);
-		else if(t == vm->typeLong->llvmType())
-			args[i].valLong = va_arg(va, int64_t);
-		else if(t == vm->typeFloat->llvmType())
-			args[i].valFloat = va_arg(va, float);
-		else if(t == vm->typeDouble->llvmType())
-			args[i].valDouble = va_arg(va, double);
+		if(0) {}
+#define doIt(id, ctype, lt, scale)							\
+		else if(t == vm->type##id->llvmType())			\
+			args[i].val##id = va_arg(va, ctype);
+		onJavaPrimitives(doIt)
 		else
 			args[i].valObject = va_arg(va, J3ObjectHandle*);
+#undef doIt
 	}
 
 	return cxxCaller()(fnPtr(), args);

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=198553&r1=198552&r2=198553&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3utf16.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3utf16.cc Sun Jan  5 03:46:51 2014
@@ -41,7 +41,7 @@ size_t J3Utf16Decoder::decode(J3ObjectHa
 	size_t pos = 0;
 
 	for(uint32_t i=0; i<length; i++) {
-		uint16_t c = charArray->getCharAt(i);
+		uint16_t c = charArray->getCharacterAt(i);
 		if(c > 127) {
 			J3::internalError("implement me: fun char");
 		} else {





More information about the vmkit-commits mailing list