diff --git a/compiler.cpp b/compiler.cpp index c0090b17b..b4454d9ff 100644 --- a/compiler.cpp +++ b/compiler.cpp @@ -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; @@ -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) { @@ -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; @@ -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 old_ivar_slots_cache = ivar_slots_cache; @@ -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(val); + DEBUG_LEVEL_DEC(); + + std::vector 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); @@ -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; diff --git a/compiler.h b/compiler.h index 1986987d6..9b99ae47b 100644 --- a/compiler.h +++ b/compiler.h @@ -132,6 +132,7 @@ class RoxorCompiler { int return_from_block_ids; PHINode *ensure_pn; RoxorScope *current_scope; + bool class_declaration; Function *dispatcherFunc; Function *fastPlusFunc;