Index: eval.c =================================================================== RCS file: /src/ruby/eval.c,v retrieving revision 1.303 diff -u -r1.303 eval.c --- eval.c 2002/06/24 07:20:42 1.303 +++ eval.c 2002/07/01 15:11:18 @@ -507,6 +507,7 @@ extern int ruby_in_compile; VALUE ruby_errinfo = Qnil; +VALUE ruby_whenval = Qnil; extern NODE *ruby_eval_tree_begin; extern NODE *ruby_eval_tree; extern int ruby_nerrs; @@ -2358,7 +2359,7 @@ if (TYPE(v) != T_ARRAY) v = rb_ary_to_ary(v); for (i=0; ilen; i++) { - if (RTEST(rb_funcall2(RARRAY(v)->ptr[i], eqq, 1, &val))){ + if (RTEST(ruby_whenval = rb_funcall2(RARRAY(v)->ptr[i], eqq, 1, &val))){ node = node->nd_body; goto again; } @@ -2366,7 +2367,7 @@ tag = tag->nd_next; continue; } - if (RTEST(rb_funcall2(rb_eval(self, tag->nd_head), eqq, 1, &val))) { + if (RTEST(ruby_whenval = rb_funcall2(rb_eval(self, tag->nd_head), eqq, 1, &val))) { node = node->nd_body; goto again; } @@ -6069,6 +6070,7 @@ rb_define_virtual_variable("$@", errat_getter, errat_setter); rb_define_hooked_variable("$!", &ruby_errinfo, 0, errinfo_setter); + rb_define_hooked_variable("$^", &ruby_whenval, 0, 0); rb_define_global_function("eval", rb_f_eval, -1); rb_define_global_function("iterator?", rb_f_block_given_p, 0); Index: parse.y =================================================================== RCS file: /src/ruby/parse.y,v retrieving revision 1.196 diff -u -r1.196 parse.y --- parse.y 2002/06/28 14:39:59 1.196 +++ parse.y 2002/07/01 15:11:32 @@ -1702,6 +1702,14 @@ { $$ = NEW_WHEN($2, $4, $5); } + | kWHEN when_args tASSOC lhs then + compstmt + cases + { + $4 = node_assign($4, NEW_GVAR(rb_intern("$^"))); + $6 = block_append($4, $6); + $$ = NEW_WHEN($2, $6, $7); + } ; when_args : args @@ -4000,6 +4008,7 @@ case '<': /* $<: reading filename */ case '>': /* $>: default output handle */ case '\"': /* $": already loaded files */ + case '^': /* $^: when-clause */ tokadd('$'); tokadd(c); tokfix();