[vmkit-commits] [vmkit] r198415 - J3Mangler does not use ins() anymore, it also does not use J3Method anymore.

Gael Thomas gael.thomas at lip6.fr
Fri Jan 3 06:04:09 PST 2014


Author: gthomas
Date: Fri Jan  3 08:04:09 2014
New Revision: 198415

URL: http://llvm.org/viewvc/llvm-project?rev=198415&view=rev
Log:
J3Mangler does not use ins() anymore, it also does not use J3Method anymore.

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

Modified: vmkit/branches/mcjit/include/j3/j3mangler.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3mangler.h?rev=198415&r1=198414&r2=198415&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3mangler.h (original)
+++ vmkit/branches/mcjit/include/j3/j3mangler.h Fri Jan  3 08:04:09 2014
@@ -2,6 +2,7 @@
 #define _J3_MANGLER_H_
 
 #include <stdint.h>
+#include <sys/types.h>
 
 namespace vmkit {
 	class Name;
@@ -10,16 +11,17 @@ namespace vmkit {
 namespace j3 {
 	class J3Class;
 	class J3Method;
+	class J3Signature;
 
 	class J3Mangler {
-		static const uint32_t max = 65536;
+		static const size_t max = 65536;
 
 		J3Class* from;
 		char     buf[max];
 		char*    cur;
 		char*    next;
 
-		void     check(uint32_t n);
+		void     check(size_t n);
 
 	public:
 		static const char*    j3Id;
@@ -28,12 +30,14 @@ namespace j3 {
 		J3Mangler(J3Class* from);
 
 		char*    cStr() { return buf; }
-		uint32_t length() { return cur - buf; }
+		size_t   length() { return cur - buf; }
 
+		J3Mangler* mangle(uint16_t utf16);
 		J3Mangler* mangle(const char* prefix);
+		J3Mangler* mangle(const char* prefix, size_t length);
 		J3Mangler* mangle(const vmkit::Name* name);
-		J3Mangler* mangle(J3Method* method);
-		J3Mangler* mangleType(J3Method* method);
+		J3Mangler* mangle(J3Signature* signature);
+		J3Mangler* mangle(const vmkit::Name* clName, const vmkit::Name* name);
 	};
 }
 

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=198415&r1=198414&r2=198415&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Fri Jan  3 08:04:09 2014
@@ -1701,9 +1701,9 @@ llvm::Type* J3CodeGen::doNativeType(J3Ty
 llvm::Function* J3CodeGen::lookupNative() {
 	J3Mangler      mangler(cl);
 
-	mangler.mangle(mangler.javaId)->mangle(method);
+	mangler.mangle(mangler.javaId)->mangle(method->cl()->name(), method->name());
 	uint32_t length = mangler.length();
-	mangler.mangleType(method);
+	mangler.mangle(method->signature());
 
 	void* fnPtr = method->nativeFnPtr();
 
@@ -1712,7 +1712,7 @@ llvm::Function* J3CodeGen::lookupNative(
 
 	if(!fnPtr) {
 		mangler.cStr()[length] = 0;
-		fnPtr = loader->lookupNativeFunctionPointer(method, mangler.mangleType(method)->cStr());
+		fnPtr = loader->lookupNativeFunctionPointer(method, mangler.cStr());
 	}
 
 	if(!fnPtr)

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=198415&r1=198414&r2=198415&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc Fri Jan  3 08:04:09 2014
@@ -3,6 +3,7 @@
 #include "j3/j3classloader.h"
 #include "j3/j3method.h"
 #include "j3/j3utf16.h"
+#include "j3/j3thread.h"
 #include "j3/j3.h"
 
 using namespace j3;
@@ -16,47 +17,45 @@ J3Mangler::J3Mangler(J3Class* _from) {
 	cur  = buf;
 }
 
-void J3Mangler::check(uint32_t n) {
-	next = cur + n;
-	if((next+1) >= (buf + max))
-		J3::internalError("unable to mangle: not enough space");
-}
+J3Mangler* J3Mangler::mangle(J3Signature* signature) {
+	const vmkit::Name* name = signature->name();
 
-J3Mangler* J3Mangler::mangleType(J3Method* method) {
-	J3Signature* type = method->signature();
+	if(name->cStr()[1] == J3Cst::ID_Right)
+		return this;
 
-	if(type->nbIns()) {
-		check(2);
-		cur[0] = '_';
-		cur[1] = '_';
-		cur = next;
-		
-		for(uint32_t i=0; i<type->nbIns(); i++) {
-			check(type->ins(i)->nativeNameLength());
-			memcpy(cur, type->ins(i)->nativeName(), type->ins(i)->nativeNameLength());
-			cur = next;
-		}
+	check(2);
+	cur[0] = '_';
+	cur[1] = '_';
+	cur = next;
+
+	J3Utf16Encoder encoder(name);
+	encoder.nextUtf16();
+	uint16_t c;
+
+	while(!encoder.isEof() && ((c = encoder.nextUtf16()) != J3Cst::ID_Right)) {
+		mangle(c);
 	}
-	check(1);
+
 	*cur = 0;
-	
+
 	return this;
 }
 
-J3Mangler* J3Mangler::mangle(J3Method* method) {
-	check(method->cl()->nativeNameLength() - 3);
-	memcpy(cur, method->cl()->nativeName() + 1, method->cl()->nativeNameLength() - 3);
-	*next = '_';
-	cur = next+1;
-
-	mangle(method->name());
+J3Mangler* J3Mangler::mangle(const vmkit::Name* clName, const vmkit::Name* name) {
+	mangle(clName);
+	check(1);
+	*cur = '_';
+	cur = next;
+	mangle(name);
 
 	return this;
 }
 
 J3Mangler* J3Mangler::mangle(const char* prefix) {
-	uint32_t length = strlen(prefix);
+	return mangle(prefix, strlen(prefix));
+}
 
+J3Mangler* J3Mangler::mangle(const char* prefix, size_t length) {
 	check(length);
 	memcpy(cur, prefix, length);
 	*next = 0;
@@ -68,48 +67,8 @@ J3Mangler* J3Mangler::mangle(const char*
 J3Mangler* J3Mangler::mangle(const vmkit::Name* name) {
 	J3Utf16Encoder encoder(name);
 
-	next = cur;
 	while(!encoder.isEof()) {
-		uint16_t c = encoder.nextUtf16();
-
-		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 '>':
-				case '(':
-				case ')':
-					break;
-				case '_': 
-					check(2);
-					*cur++ = '_'; 
-					*cur++ = '1'; 
-					break;
-				case ';': 
-					check(2);
-					*cur++ = '_'; 
-					*cur++ = '2'; 
-					break;
-				case '[': 
-					check(2);
-					*cur++ = '_'; 
-					*cur++ = '3'; 
-					break;
-				case '/': 
-					c = '_';
-				default: 
-					check(1);
-					*cur++ = c;
-			}
-		}
-		cur = next;
+		mangle(encoder.nextUtf16());
 	}
 
 	*cur = 0;
@@ -117,3 +76,54 @@ J3Mangler* J3Mangler::mangle(const vmkit
 	return this;
 }
 
+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: 
+				check(1);
+				*cur++ = c;
+		}
+
+	}
+	cur = next;
+
+	return this;
+}
+
+void J3Mangler::check(size_t n) {
+	next = cur + n;
+	if((next+1) >= (buf + max))
+		J3::internalError("unable to mangle: not enough space");
+}

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=198415&r1=198414&r2=198415&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Fri Jan  3 08:04:09 2014
@@ -223,7 +223,7 @@ void J3Method::buildLLVMNames(J3Class* f
 	uint32_t plen = 5;
 	J3Mangler mangler(from);
 
-	mangler.mangle(mangler.j3Id)->mangle(this)->mangleType(this);
+	mangler.mangle(mangler.j3Id)->mangle(cl()->name(), name())->mangle(signature());
 
 	uint32_t length = mangler.length() + plen;
 	_llvmAllNames = (char*)cl()->loader()->allocator()->allocate(length + 1);





More information about the vmkit-commits mailing list