Navigation Menu

Skip to content

Commit

Permalink
fixed yet an other bug found by the module verifier
Browse files Browse the repository at this point in the history
in the code generated for core/module/define_method_spec.rb

git-svn-id: http://svn.macosforge.org/repository/ruby/MacRuby/trunk@2762 23306eb0-4c56-4727-a40e-e92c0eb68959
  • Loading branch information
vincentisambart committed Oct 8, 2009
1 parent 52be3f2 commit 07a8eee
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 9 deletions.
28 changes: 19 additions & 9 deletions compiler.cpp
Expand Up @@ -58,6 +58,7 @@ RoxorCompiler::RoxorCompiler(void)
return_from_block_ids = 0;
ensure_pn = NULL;
current_scope = NULL;
class_declaration = false;

dispatcherFunc = NULL;
fastPlusFunc = NULL;
Expand Down Expand Up @@ -2985,7 +2986,8 @@ RoxorCompiler::compile_node(NODE *node)
{
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) {
Expand Down Expand Up @@ -3874,11 +3876,6 @@ RoxorCompiler::compile_node(NODE *node)
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;
Expand All @@ -3889,6 +3886,11 @@ RoxorCompiler::compile_node(NODE *node)
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;
Expand All @@ -3899,10 +3901,17 @@ RoxorCompiler::compile_node(NODE *node)
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);
Expand All @@ -3913,6 +3922,7 @@ RoxorCompiler::compile_node(NODE *node)
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;

Expand Down
1 change: 1 addition & 0 deletions compiler.h
Expand Up @@ -132,6 +132,7 @@ class RoxorCompiler {
int return_from_block_ids;
PHINode *ensure_pn;
RoxorScope *current_scope;
bool class_declaration;

Function *dispatcherFunc;
Function *fastPlusFunc;
Expand Down

0 comments on commit 07a8eee

Please sign in to comment.