Revision: 2839 http://trac.macosforge.org/projects/ruby/changeset/2839 Author: vincent.isambart@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;
participants (1)
-
source_changes@macosforge.org