[vmkit-commits] [vmkit] r198410 - Lazily create ins/out from a signature.

Gael Thomas gael.thomas at lip6.fr
Fri Jan 3 04:29:15 PST 2014


Author: gthomas
Date: Fri Jan  3 06:29:15 2014
New Revision: 198410

URL: http://llvm.org/viewvc/llvm-project?rev=198410&view=rev
Log:
Lazily create ins/out from a signature.

Modified:
    vmkit/branches/mcjit/include/j3/j3signature.h
    vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc
    vmkit/branches/mcjit/lib/j3/vm/j3signature.cc

Modified: vmkit/branches/mcjit/include/j3/j3signature.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3signature.h?rev=198410&r1=198409&r2=198410&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3signature.h (original)
+++ vmkit/branches/mcjit/include/j3/j3signature.h Fri Jan  3 06:29:15 2014
@@ -26,23 +26,20 @@ namespace j3 {
 		J3LLVMSignature*             _virtualLLVMSignature;
 		J3Type*                      _out;
 		uint32_t                     _nbIns;
-		J3Type*                      _ins[1];
+		J3Type**                     _ins;
+
+		void checkInOut();
 
 	public:
-		J3Signature(J3ClassLoader* loader, const vmkit::Name* name, J3Type** args, size_t nbArgs);
+		J3Signature(J3ClassLoader* loader, const vmkit::Name* name);
 
 		const vmkit::Name*  name() { return _name; }
 		J3ClassLoader*      loader() { return _loader; }
 		void                setLLVMSignature(uint32_t access, J3LLVMSignature* llvmSignature);
 		J3LLVMSignature*    llvmSignature(uint32_t access);
-		J3Type*             out() { return _out; }
-		uint32_t            nbIns() { return _nbIns; }
-		J3Type*             ins(uint32_t idx) { return _ins[idx]; }
-
-		void* operator new(size_t unused, vmkit::BumpAllocator* allocator, size_t n) {
-			return vmkit::PermanentObject::operator new(sizeof(J3Signature) + (n - 1) * sizeof(J3Type*), allocator);
-		}
-
+		J3Type*             out() { checkInOut(); return _out; }
+		uint32_t            nbIns() { checkInOut(); return _nbIns; }
+		J3Type*             ins(uint32_t idx) { checkInOut(); return _ins[idx]; }
 	};
 
 	class J3LLVMSignature : vmkit::PermanentObject {

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=198410&r1=198409&r2=198410&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc Fri Jan  3 06:29:15 2014
@@ -171,25 +171,11 @@ J3Type* J3ClassLoader::getType(J3ObjectT
 
 J3Signature* J3ClassLoader::getSignature(J3ObjectType* from, const vmkit::Name* signature) {
 	pthread_mutex_lock(&_mutexMethodTypes);
-	J3Signature* res = methodTypes[signature];
-
-	if(!res) {
-		J3Type*            args[1+signature->length()];
-		uint32_t           nbArgs = 0;
-		uint32_t           cur = 1;
 
-		if(signature->cStr()[0] != J3Cst::ID_Left)
-			wrongType(from, signature);
+	J3Signature* res = methodTypes[signature];
+	if(!res)
+		methodTypes[signature] = res = new(allocator()) J3Signature(this, signature);
 
-		while(signature->cStr()[cur] != J3Cst::ID_Right) {
-			args[nbArgs++] = getTypeInternal(from, signature, cur, &cur);
-	}
-		args[nbArgs++] = getTypeInternal(from, signature, cur+1, &cur);
-		if(cur != signature->length())
-			wrongType(from, signature);
-		
-		methodTypes[signature] = res = new(allocator(), nbArgs - 1) J3Signature(this, signature, args, nbArgs);
-	}
 	pthread_mutex_unlock(&_mutexMethodTypes);
 
 	return res;

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=198410&r1=198409&r2=198410&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3signature.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3signature.cc Fri Jan  3 06:29:15 2014
@@ -1,6 +1,7 @@
 #include "j3/j3signature.h"
 #include "j3/j3object.h"
 #include "j3/j3codegen.h"
+#include "j3/j3classloader.h"
 #include "j3/j3.h"
 
 #include "llvm/IR/Function.h"
@@ -9,13 +10,31 @@
 
 using namespace j3;
 
-J3Signature::J3Signature(J3ClassLoader* loader, const vmkit::Name* name, J3Type** args, size_t nbArgs) {
+J3Signature::J3Signature(J3ClassLoader* loader, const vmkit::Name* name) {
 	_loader = loader;
 	_name = name;
-	_out = args[nbArgs-1];
-	_nbIns = nbArgs-1;
-	memcpy(_ins, args, (nbArgs-1)*sizeof(J3Type*));
-			
+}
+
+void J3Signature::checkInOut() {
+	if(!_out) {
+		J3Type*            args[1+name()->length()];
+		uint32_t           nbArgs = 0;
+		uint32_t           cur = 1;
+		
+		if(name()->cStr()[0] != J3Cst::ID_Left)
+			loader()->wrongType(0, name());
+
+		while(name()->cStr()[cur] != J3Cst::ID_Right)
+			args[nbArgs++] = loader()->getTypeInternal(0, name(), cur, &cur);
+
+		_nbIns = nbArgs;
+		_ins = (J3Type**)loader()->allocator()->allocate(nbArgs*sizeof(J3Type*));
+		memcpy(_ins, args, nbArgs*sizeof(J3Type*));
+
+		_out = loader()->getTypeInternal(0, name(), cur+1, &cur);
+		if(cur != name()->length())
+			loader()->wrongType(0, name());
+	}
 }
 
 void J3Signature::setLLVMSignature(uint32_t access, J3LLVMSignature* llvmSignature) { 





More information about the vmkit-commits mailing list