Revision
1905
Author
lsansonetti@apple.com
Date
2009-06-19 22:20:37 -0700 (Fri, 19 Jun 2009)

Log Message

introduce a cache to avoid optimizing+JITing the same function twice

Modified Paths

Diff

Modified: MacRuby/branches/experimental/vm.cpp (1904 => 1905)


--- MacRuby/branches/experimental/vm.cpp	2009-06-20 05:06:56 UTC (rev 1904)
+++ MacRuby/branches/experimental/vm.cpp	2009-06-20 05:20:37 UTC (rev 1905)
@@ -284,6 +284,11 @@
 IMP
 RoxorVM::compile(Function *func)
 {
+    std::map<Function *, IMP>::iterator iter = JITcache.find(func);
+    if (iter != JITcache.end()) {
+	return iter->second;
+    }
+
 #if ROXOR_COMPILER_DEBUG
     if (verifyModule(*RoxorCompiler::module)) {
 	printf("Error during module verification\n");
@@ -296,6 +301,7 @@
     // Optimize & compile.
     optimize(func);
     IMP imp = (IMP)ee->getPointerToFunction(func);
+    JITcache[func] = imp;
 
 #if ROXOR_COMPILER_DEBUG
     uint64_t elapsed = mach_absolute_time() - start;

Modified: MacRuby/branches/experimental/vm.h (1904 => 1905)


--- MacRuby/branches/experimental/vm.h	2009-06-20 05:06:56 UTC (rev 1904)
+++ MacRuby/branches/experimental/vm.h	2009-06-20 05:20:37 UTC (rev 1905)
@@ -429,6 +429,7 @@
 	ExecutionEngine *iee;
 	FunctionPassManager *fpm;
 	bool running;
+	std::map<Function *, IMP> JITcache;
 
 	std::map<IMP, rb_vm_method_node_t *> ruby_imps;
 	std::map<SEL, struct mcache *> mcache;