[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