[vmkit-commits] [vmkit] r198522 - Implements some jni function and fixes a bug in the j3mangler

Gael Thomas gael.thomas at lip6.fr
Sat Jan 4 15:42:33 PST 2014


Author: gthomas
Date: Sat Jan  4 17:42:33 2014
New Revision: 198522

URL: http://llvm.org/viewvc/llvm-project?rev=198522&view=rev
Log:
Implements some jni function and fixes a bug in the j3mangler

Modified:
    vmkit/branches/mcjit/include/j3/j3mangler.h
    vmkit/branches/mcjit/lib/j3/vm/j3jni.cc
    vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc

Modified: vmkit/branches/mcjit/include/j3/j3mangler.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3mangler.h?rev=198522&r1=198521&r2=198522&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3mangler.h (original)
+++ vmkit/branches/mcjit/include/j3/j3mangler.h Sat Jan  4 17:42:33 2014
@@ -22,7 +22,7 @@ namespace j3 {
 		char*    next;
 
 		void     check(size_t n);
-
+		char     hex(uint32_t n);
 	public:
 		static const char*    j3Id;
 		static const char*    javaId;

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=198522&r1=198521&r2=198522&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3jni.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3jni.cc Sat Jan  4 17:42:33 2014
@@ -406,7 +406,18 @@ jlong JNICALL GetStaticLongField(JNIEnv*
 jfloat JNICALL GetStaticFloatField(JNIEnv* env, jclass clazz, jfieldID fieldID) { enterJVM(); leaveJVM(); NYI(); }
 jdouble JNICALL GetStaticDoubleField(JNIEnv* env, jclass clazz, jfieldID fieldID) { enterJVM(); leaveJVM(); NYI(); }
 
-jstring JNICALL NewString(JNIEnv* env, const jchar* unicode, jsize len) { enterJVM(); leaveJVM(); NYI(); }
+jstring JNICALL NewString(JNIEnv* env, const jchar* unicode, jsize len) { 
+	jstring res;
+	enterJVM(); 
+	J3* vm = J3Thread::get()->vm();
+	J3ObjectHandle* content = J3ObjectHandle::doNewArray(vm->typeChar->getArray(), len);
+	content->setRegionChar(0, unicode, 0, len);
+	res = J3ObjectHandle::doNewObject(vm->stringClass);
+	vm->stringClassInit->invokeSpecial(res, content, 0);
+	leaveJVM(); 
+	return res;
+}
+
 jsize JNICALL GetStringLength(JNIEnv* env, jstring str) { 
 	jsize res;
 	enterJVM(); 
@@ -462,7 +473,13 @@ void JNICALL ReleaseStringUTFChars(JNIEn
 }
 
 
-jsize JNICALL GetArrayLength(JNIEnv* env, jarray array) { enterJVM(); leaveJVM(); NYI(); }
+jsize JNICALL GetArrayLength(JNIEnv* env, jarray array) { 
+	jsize res;
+	enterJVM();
+	res = array->arrayLength();
+	leaveJVM(); 
+	return res;
+}
 
 jobjectArray JNICALL NewObjectArray(JNIEnv* env, jsize len, jclass clazz, jobject init) { enterJVM(); leaveJVM(); NYI(); }
 jobject JNICALL GetObjectArrayElement(JNIEnv* env, jobjectArray array, jsize index) { enterJVM(); leaveJVM(); NYI(); }
@@ -514,7 +531,11 @@ jint JNICALL MonitorExit(JNIEnv* env, jo
 
 jint JNICALL GetJavaVM(JNIEnv* env, JavaVM** vm) { enterJVM(); leaveJVM(); NYI(); }
 
-void JNICALL GetStringRegion(JNIEnv* env, jstring str, jsize start, jsize len, jchar* buf) { enterJVM(); leaveJVM(); NYI(); }
+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);
+	leaveJVM(); 
+}
 
 void JNICALL GetStringUTFRegion(JNIEnv* env, jstring str, jsize start, jsize len, char* buf) { 
 	enterJVM(); 

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=198522&r1=198521&r2=198522&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc Sat Jan  4 17:42:33 2014
@@ -77,51 +77,58 @@ J3Mangler* J3Mangler::mangle(const vmkit
 }
 
 J3Mangler* J3Mangler::mangle(uint16_t c) {
-	if(c > 256) {
-		check(6);
-		*cur++ = '_';
-		*cur++ = '0';
-		*cur++ = (c >> 24 & 0xf) + '0';
-		*cur++ = (c >> 16 & 0xf) + '0';
-		*cur++ = (c >> 8  & 0xf) + '0';
-		*cur++ = (c >> 0  & 0xf) + '0';
-	} else {
-
-		switch(c) {
-			case '<':
-			case '>':
-				break; /* do not encode at all */
-			case '(':
-			case ')':
-				J3Thread::get()->vm()->internalError("should not try to encode a special character such as %c", (char)c);
-			case '_': 
-				check(2);
-				*cur++ = '_'; 
-				*cur++ = '1'; 
-				break;
-			case ';': 
-				check(2);
-				*cur++ = '_'; 
-				*cur++ = '2'; 
-				break;
-			case '[': 
-				check(2);
-				*cur++ = '_'; 
-				*cur++ = '3'; 
-				break;
-			case '/': 
-				c = '_';
-			default: 
+	switch(c) {
+		case '<':
+		case '>':
+			break; /* do not encode at all */
+		case '(':
+		case ')':
+			J3Thread::get()->vm()->internalError("should not try to encode a special character such as %c", (char)c);
+		case '_': 
+			check(2);
+			*cur++ = '_'; 
+			*cur++ = '1'; 
+			break;
+		case ';': 
+			check(2);
+			*cur++ = '_'; 
+			*cur++ = '2'; 
+			break;
+		case '[': 
+			check(2);
+			*cur++ = '_'; 
+			*cur++ = '3'; 
+			break;
+		case '/': 
+			c = '_';
+		default: 
+			if((c >= 'a' && c <= 'z') ||
+				 (c >= 'A' && c <= 'Z') ||
+				 (c >= '0' && c <= '9') ||
+				 (c == '_')) {
 				check(1);
 				*cur++ = c;
-		}
-
+			} else {
+				check(6);
+				*cur++ = '_';
+				*cur++ = '0';
+				*cur++ = hex(c >> 12);
+				*cur++ = hex(c >> 8);
+				*cur++ = hex(c >> 4);
+				*cur++ = hex(c >> 0);
+			} 
 	}
+
 	cur = next;
 
 	return this;
 }
 
+char J3Mangler::hex(uint32_t n) {
+	n = n & 0xf;
+	return n < 10 ? (n + '0') : (n + 'a' - 10);
+}
+
 void J3Mangler::check(size_t n) {
 	next = cur + n;
 	if((next+1) >= (buf + max))





More information about the vmkit-commits mailing list