Revision: 1165 http://trac.macosforge.org/projects/ruby/changeset/1165 Author: vincent.isambart@gmail.com Date: 2009-03-26 04:43:50 -0700 (Thu, 26 Mar 2009) Log Message: ----------- fixed a bug in the compilation of the optional arguments (and also removed a useless loop) Modified Paths: -------------- MacRuby/branches/experimental/roxor.cpp Modified: MacRuby/branches/experimental/roxor.cpp =================================================================== --- MacRuby/branches/experimental/roxor.cpp 2009-03-26 11:20:16 UTC (rev 1164) +++ MacRuby/branches/experimental/roxor.cpp 2009-03-26 11:43:50 UTC (rev 1165) @@ -2287,7 +2287,7 @@ ++iter) { ID id = iter->first; - assert(iter->second == NULL); + assert(iter->second == NULL); Value *val = arg++; val->setName(std::string("dyna_") + rb_id2name(id)); @@ -2342,11 +2342,11 @@ lvars[id] = store; } - // compile multiple assignment arguments (def f((a, b, v))) - // (this must also be done after the creation of local variables) - NODE *n = node->nd_args; - if (n != NULL) { - NODE *rest_node = n->nd_next; + NODE *args_node = node->nd_args; + if (args_node != NULL) { + // compile multiple assignment arguments (def f((a, b, v))) + // (this must also be done after the creation of local variables) + NODE *rest_node = args_node->nd_next; if (rest_node != NULL) { NODE *right_req_node = rest_node->nd_next; if (right_req_node != NULL) { @@ -2364,22 +2364,19 @@ } } } - } - // Compile optional arguments. - Function::ArgumentListType::iterator iter = f->arg_begin(); - ++iter; // skip self - ++iter; // skip sel - while (n != NULL) { - if (nd_type(n) == NODE_ARGS) { - for (i = 0; i < n->nd_frml; i++) { - ++iter; // skip mandatory argument + // Compile optional arguments. + Function::ArgumentListType::iterator iter = f->arg_begin(); + ++iter; // skip self + ++iter; // skip sel + NODE *opt_node = args_node->nd_opt; + if (opt_node != NULL) { + int to_skip = dvars.size() + args_node->nd_frml; + for (i = 0; i < to_skip; i++) { + ++iter; // skip dvars and args required on the left-side } - if (n->nd_head != NULL) { - iter = compile_optional_arguments(iter, n->nd_head); - } + iter = compile_optional_arguments(iter, opt_node); } - n = n->nd_next; } }