Revision: 1147 http://trac.macosforge.org/projects/ruby/changeset/1147 Author: vincent.isambart@gmail.com Date: 2009-03-25 05:14:55 -0700 (Wed, 25 Mar 2009) Log Message: ----------- added basic code for supporting def f(a=b=c=1) Modified Paths: -------------- MacRuby/branches/experimental/roxor.cpp Modified: MacRuby/branches/experimental/roxor.cpp =================================================================== --- MacRuby/branches/experimental/roxor.cpp 2009-03-25 12:14:50 UTC (rev 1146) +++ MacRuby/branches/experimental/roxor.cpp 2009-03-25 12:14:55 UTC (rev 1147) @@ -710,13 +710,43 @@ Function::ArgumentListType::iterator RoxorCompiler::compile_optional_arguments(Function::ArgumentListType::iterator iter, - NODE *node) + NODE *start_node) { + NODE *node = start_node; assert(nd_type(node) == NODE_OPT_ARG); + // we have to handle the case def f(a = b = c = 1) and create those b and c + // and this before we compile the assignments themselves do { assert(node->nd_value != NULL); + assert(nd_type(node->nd_value) == NODE_LASGN || nd_type(node->nd_value) == NODE_DASGN_CURR); + NODE *assign_node = node->nd_value->nd_value; + while (assign_node != NULL) { + switch (nd_type(assign_node)) { + case NODE_LASGN: + case NODE_DASGN_CURR: + Value *slot = new AllocaInst(RubyObjTy, "", bb); + new StoreInst(nilVal, slot, bb); + lvars[assign_node->nd_vid] = slot; + case NODE_IASGN: + case NODE_GASGN: + assign_node = assign_node->nd_value; + break; + + // TODO: NODE_ATTRASGN + + default: + assign_node = NULL; + } + } + } + while ((node = node->nd_next) != NULL); + + node = start_node; + do { + assert(node->nd_value != NULL); + Value *isUndefInst = new ICmpInst(ICmpInst::ICMP_EQ, iter, undefVal, "", bb); Function *f = bb->getParent();
participants (1)
-
source_changes@macosforge.org