[macruby-changes] [2875] MacRuby/trunk

source_changes at macosforge.org source_changes at macosforge.org
Wed Oct 21 13:46:37 PDT 2009


Revision: 2875
          http://trac.macosforge.org/projects/ruby/changeset/2875
Author:   lsansonetti at apple.com
Date:     2009-10-21 13:46:32 -0700 (Wed, 21 Oct 2009)
Log Message:
-----------
now deleting internal structures, IR and machinec code of main functions created by #eval

Modified Paths:
--------------
    MacRuby/trunk/compiler.cpp
    MacRuby/trunk/compiler.h
    MacRuby/trunk/vm.cpp
    MacRuby/trunk/vm.h

Modified: MacRuby/trunk/compiler.cpp
===================================================================
--- MacRuby/trunk/compiler.cpp	2009-10-21 03:17:53 UTC (rev 2874)
+++ MacRuby/trunk/compiler.cpp	2009-10-21 20:46:32 UTC (rev 2875)
@@ -673,7 +673,6 @@
     params.push_back(sel);
 
     params.push_back(compile_const_pointer(new_function));
-    rb_objc_retain((void *)body);
     params.push_back(compile_arity(arity));
     params.push_back(ConstantInt::get(Int32Ty, rb_vm_node_flags(body)));
 
@@ -4969,7 +4968,6 @@
 
 		current_block_func = cast<Function>(block);
 		current_block_node = node->nd_body;
-		rb_objc_retain((void *)current_block_node);
 
 		Value *caller;
 		assert(node->nd_iter != NULL);
@@ -5177,8 +5175,6 @@
 Function *
 RoxorCompiler::compile_main_function(NODE *node)
 {
-    rb_objc_retain((void *)node);
-
     current_instance_method = true;
 
     Value *val = compile_node(node);

Modified: MacRuby/trunk/compiler.h
===================================================================
--- MacRuby/trunk/compiler.h	2009-10-21 03:17:53 UTC (rev 2874)
+++ MacRuby/trunk/compiler.h	2009-10-21 20:46:32 UTC (rev 2875)
@@ -76,6 +76,16 @@
 	    return i == scopes.end() ? NULL : i->second;
 	}
 
+	bool delete_scope(Function *f) {
+	    std::map<Function *, RoxorScope *>::iterator i = scopes.find(f);
+	    if (i != scopes.end()) {
+		scopes.erase(i);
+		delete i->second;
+		return true;
+	    } 
+	    return false;
+	}
+
 	void clear_scopes(void) {
 	    scopes.clear();
 	}

Modified: MacRuby/trunk/vm.cpp
===================================================================
--- MacRuby/trunk/vm.cpp	2009-10-21 03:17:53 UTC (rev 2874)
+++ MacRuby/trunk/vm.cpp	2009-10-21 20:46:32 UTC (rev 2875)
@@ -64,6 +64,7 @@
     unsigned char *start;
     unsigned char *end;
     void *imp;
+    std::vector<unsigned char *> ehs;
 
     RoxorFunction(Function *_f, RoxorScope *_scope, unsigned char *_start,
 	    unsigned char *_end) {
@@ -107,6 +108,20 @@
 	     return NULL;
 	}
 
+	RoxorFunction *delete_function(Function *func) {
+	    std::vector<struct RoxorFunction *>::iterator iter = 
+		functions.begin();
+	    while (iter != functions.end()) {
+		RoxorFunction *f = *iter;
+		if (f->f == func) {
+		    functions.erase(iter);
+		    return f;
+		}
+		++iter;
+	    }
+	    return NULL;
+	}
+
 	void setMemoryWritable(void) { 
 	    mm->setMemoryWritable(); 
 	}
@@ -170,6 +185,8 @@
 
 	void endExceptionTable(const Function *F, uint8_t *TableStart, 
 		uint8_t *TableEnd, uint8_t* FrameRegister) {
+	    assert(!functions.empty());
+	    functions.back()->ehs.push_back(FrameRegister);
 	    mm->endExceptionTable(F, TableStart, TableEnd, FrameRegister);
 	}
 
@@ -410,6 +427,42 @@
     return imp;
 }
 
+// in libgcc
+extern "C" void __deregister_frame(const void *);
+
+void
+RoxorCore::delenda(Function *func)
+{
+    assert(func->use_empty());
+
+    // Remove from cache.
+    std::map<Function *, IMP>::iterator iter = JITcache.find(func);
+    if (iter != JITcache.end()) {
+	JITcache.erase(iter);
+    }
+
+    // Delete for JIT memory manager list.
+    RoxorFunction *f = jmm->delete_function(func);
+    assert(f != NULL);
+
+    // Unregister each dwarf exception handler.
+    // XXX this should really be done by LLVM...
+    for (std::vector<unsigned char *>::iterator i = f->ehs.begin();
+	    i != f->ehs.end(); ++i) {
+	__deregister_frame((const void *)*i);
+    }
+
+    // Remove the compiler scope.
+    RoxorCompiler::shared->delete_scope(func);
+    delete f;
+
+    // Delete machine code.
+    ee->freeMachineCodeForFunction(func);
+
+    // Delete IR.
+    func->eraseFromParent();
+}
+
 bool
 RoxorCore::symbolize_call_address(void *addr, void **startp, char *path,
 	size_t path_len, unsigned long *ln, char *name, size_t name_len)
@@ -3289,35 +3342,43 @@
 	  bool inside_eval)
 {
     RoxorVM *vm = GET_VM();
+    RoxorCompiler *compiler = RoxorCompiler::shared;
 
+    // Compile IR.
     if (binding != NULL) {
 	vm->push_current_binding(binding, false);
     }
-
-    RoxorCompiler *compiler = RoxorCompiler::shared;
-
     bool old_inside_eval = compiler->is_inside_eval();
     compiler->set_inside_eval(inside_eval);
     compiler->set_fname(fname);
     Function *function = compiler->compile_main_function(node);
     compiler->set_fname(NULL);
     compiler->set_inside_eval(old_inside_eval);
-
     if (binding != NULL) {
 	vm->pop_current_binding(false);
     }
 
+    // JIT compile the function.
     IMP imp = GET_CORE()->compile(function);
 
-    // For symbolication.
+    // Register it for symbolication.
     rb_vm_method_node_t *mnode = GET_CORE()->method_node_get(imp, true);
     mnode->klass = 0;
     mnode->arity = rb_vm_arity(2);
     mnode->sel = sel_registerName("<main>");
     mnode->objc_imp = mnode->ruby_imp = imp;
     mnode->flags = 0;
-    
-    return ((VALUE(*)(VALUE, SEL))imp)(vm->get_current_top_object(), 0);
+
+    // Execute the function.
+    VALUE ret = ((VALUE(*)(VALUE, SEL))imp)(vm->get_current_top_object(), 0);
+
+    if (inside_eval) {
+	// XXX We only delete functions created by #eval. In theory it should
+	// also work for other functions, but it makes spec:ci crash.
+	GET_CORE()->delenda(function);
+    }
+
+    return ret;
 }
 
 extern "C"

Modified: MacRuby/trunk/vm.h
===================================================================
--- MacRuby/trunk/vm.h	2009-10-21 03:17:53 UTC (rev 2874)
+++ MacRuby/trunk/vm.h	2009-10-21 20:46:32 UTC (rev 2875)
@@ -633,6 +633,7 @@
 
 	void optimize(Function *func);
 	IMP compile(Function *func);
+	void delenda(Function *func);
 
 	void load_bridge_support(const char *path, const char *framework_path,
 		int options);
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20091021/8b044755/attachment.html>


More information about the macruby-changes mailing list