[macruby-changes] [2839] MacRuby/trunk

source_changes at macosforge.org source_changes at macosforge.org
Sat Oct 17 17:19:42 PDT 2009


Revision: 2839
          http://trac.macosforge.org/projects/ruby/changeset/2839
Author:   vincent.isambart at gmail.com
Date:     2009-10-17 17:19:38 -0700 (Sat, 17 Oct 2009)
Log Message:
-----------
a new version of my loast patch to fix an error with verifyModule

The only difference is that know we use unique names for ruby scope
function names in AOT mode.

Modified Paths:
--------------
    MacRuby/trunk/bin/rubyc
    MacRuby/trunk/compiler.cpp
    MacRuby/trunk/compiler.h

Modified: MacRuby/trunk/bin/rubyc
===================================================================
--- MacRuby/trunk/bin/rubyc	2009-10-17 21:50:20 UTC (rev 2838)
+++ MacRuby/trunk/bin/rubyc	2009-10-18 00:19:38 UTC (rev 2839)
@@ -103,7 +103,8 @@
     output ||= File.join(File.dirname(path), base + '.o')
 
     # Generate init function (must be unique).
-    init_func = "MREP_#{File.read(path).hash.abs}"
+    uuid = `uuidgen`.strip.gsub('-', '')
+    init_func = "MREP_#{uuid}"
 
     tmp_objs = []
     @archs.each do |arch|

Modified: MacRuby/trunk/compiler.cpp
===================================================================
--- MacRuby/trunk/compiler.cpp	2009-10-17 21:50:20 UTC (rev 2838)
+++ MacRuby/trunk/compiler.cpp	2009-10-18 00:19:38 UTC (rev 2839)
@@ -58,6 +58,7 @@
     return_from_block_ids = 0;
     ensure_pn = NULL;
     current_scope = NULL;
+    class_declaration = false;
 
     dispatcherFunc = NULL;
     fastPlusFunc = NULL;
@@ -2989,7 +2990,8 @@
 	    {
 		rb_vm_arity_t arity = rb_vm_node_arity(node);
 		const int nargs = bb == NULL ? 0 : arity.real;
-		const bool has_dvars = current_block && current_mid == 0;
+		const bool has_dvars = current_block && current_mid == 0 && !class_declaration;
+		class_declaration = false;
 
 		// Get dynamic vars.
 		if (has_dvars && node->nd_tbl != NULL) {
@@ -3021,8 +3023,18 @@
 		    types.push_back(RubyObjTy);
 		}
 		FunctionType *ft = FunctionType::get(RubyObjTy, types, false);
+
+		char *function_name;
+		if (ruby_aot_compile) {
+		    const int function_name_size = 200;
+		    function_name = (char *)alloca(function_name_size);
+		    snprintf(function_name, function_name_size, "__%s_ruby_scope", RSTRING_PTR(ruby_aot_init_func));
+		}
+		else {
+		    function_name = "__ruby_scope";
+		}
 		Function *f = Function::Create(ft, GlobalValue::ExternalLinkage,
-			"__ruby_scope", module);
+			function_name, module);
 
 		RoxorScope *old_current_scope = current_scope;
 		current_scope = new RoxorScope(fname);
@@ -3882,11 +3894,6 @@
 		NODE *body = node->nd_body;
 		if (body != NULL) {
 		    assert(nd_type(body) == NODE_SCOPE);
-		    ID *tbl = body->nd_tbl;
-		    if (tbl != NULL) {
-			const int args_count = (int)tbl[0];
-			compile_lvars(&tbl[args_count + 1]);
-		    }
 		    if (body->nd_body != NULL) {	
 			Value *old_self = current_self;
 			current_self = classVal;
@@ -3897,7 +3904,12 @@
 				GlobalValue::InternalLinkage, nilVal, "");
 
 			bool old_current_module = current_module;
+			bool old_current_block_chain = current_block_chain;
+			bool old_dynamic_class = dynamic_class;
 
+			current_block_chain = false;
+			dynamic_class = false;
+
 			std::map<ID, Value *> old_ivar_slots_cache
 			    = ivar_slots_cache;
 			ivar_slots_cache.clear();
@@ -3907,11 +3919,18 @@
 			current_module = nd_type(node) == NODE_MODULE;
 
 			compile_set_current_scope(classVal, publicScope);
-			bool old_dynamic_class = dynamic_class;
-			dynamic_class = false;
 
-			Value *val = compile_node(body->nd_body);
+			DEBUG_LEVEL_INC();
+			class_declaration = true;
+			Value *val = compile_node(body);
+			Function *f = cast<Function>(val);
+			DEBUG_LEVEL_DEC();
 
+			std::vector<Value *> params;
+			params.push_back(classVal);
+			params.push_back(compile_const_pointer(NULL));
+			val = compile_protected_call(f, params);
+
 			dynamic_class = old_dynamic_class;
 			compile_set_current_scope(classVal, defaultScope);
 
@@ -3921,6 +3940,7 @@
 			current_self = old_self;
 			current_opened_class = old_class;
 			current_module = old_current_module;
+			current_block_chain = old_current_block_chain;
 
 			ivar_slots_cache = old_ivar_slots_cache;
 

Modified: MacRuby/trunk/compiler.h
===================================================================
--- MacRuby/trunk/compiler.h	2009-10-17 21:50:20 UTC (rev 2838)
+++ MacRuby/trunk/compiler.h	2009-10-18 00:19:38 UTC (rev 2839)
@@ -132,6 +132,7 @@
 	int return_from_block_ids;
 	PHINode *ensure_pn;
 	RoxorScope *current_scope;
+	bool class_declaration;
 
 	Function *dispatcherFunc;
 	Function *fastPlusFunc;
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20091017/4e08c82d/attachment.html>


More information about the macruby-changes mailing list