From: Minero Aoki Date: 2001-01-05T01:38:43+09:00 Subject: [ruby-talk:8634] Re: rb_iterate() In mail "[ruby-talk:8632] Re: rb_iterate()" ts wrote: > M> Maybe you are right. (As you know) rb_gc_mark() is not needed > M> because it is on the stack frame, > > I'm agree with you, but the problem is that it's not a _valid_ object and > ruby call rb_gc_mark() for this object. This is rb_gc_mark() which is > trying to interpret this structure as a Ruby object. Sorry for my incomplete explanation. I intended to rb_gc_mark() for NODE_IFUNC is unnecessary, because an argument is on the stack frame, if it is really a VALUE (need to mark). But if racc had passed only VALUE to rb_iterate(), racc is not effected either rb_gc_mark() is called or not. Minero Aoki (to make up for my discription, I attach my modification.) --- cparse.c 2000/12/24 17:37:34 1.13 +++ cparse.c 2001/01/04 07:07:21 @@ -24,6 +24,7 @@ #define vFINAL_TOK INT2FIX(FINAL_TOK) static VALUE RaccBug; +static VALUE CparseParams; static ID id_yydebug; static ID id_nexttoken; @@ -83,6 +84,8 @@ struct cparse_params { + VALUE vv; + VALUE parser; VALUE recv; ID mid; @@ -127,7 +130,7 @@ #define REDUCE(v, act) \ v->ruleno = -act * 3; \ tmp = rb_iterate(catch_iter, v->parser, \ - do_reduce, (VALUE)v); \ + do_reduce, v->vv); \ code = FIX2INT(tmp); \ tmp = rb_ivar_get(v->parser, id_errstatus); \ v->errstatus = FIX2INT(tmp); \ @@ -214,7 +217,7 @@ { struct cparse_params *v; - v = (struct cparse_params*)data; + Data_Get_Struct(data, struct cparse_params, v); rb_funcall(v->recv, v->mid, 0); return Qnil; @@ -227,7 +230,7 @@ struct cparse_params *v; VALUE tok, val; - v = (struct cparse_params*)data; + Data_Get_Struct(data, struct cparse_params, v); check_nexttoken_value(arr); tok = AREF(arr, 0); val = AREF(arr, 1); @@ -242,8 +245,8 @@ wrap_yyparse(v) struct cparse_params *v; { - rb_iterate(call_scaniter, (VALUE)v, - catch_scaniter, (VALUE)v); + rb_iterate(call_scaniter, v->vv, + catch_scaniter, v->vv); } static void @@ -257,6 +260,8 @@ VALUE debugp; + v->vv = Data_Wrap_Struct(CparseParams, 0, 0, v); + v->parser = parser; v->recv = recv; if (mid) @@ -571,7 +576,7 @@ long i, k1, k2; VALUE ret; - v = (struct cparse_params*)data; + Data_Get_Struct(data, struct cparse_params, v); reduce_len = RARRAY(v->reduce_table)->ptr[v->ruleno]; reduce_to = RARRAY(v->reduce_table)->ptr[v->ruleno+1]; method_id = RARRAY(v->reduce_table)->ptr[v->ruleno+2]; @@ -665,12 +670,16 @@ void Init_cparse() { + VALUE Racc; VALUE Parser; Parser = rb_eval_string("::Racc::Parser"); rb_define_private_method(Parser, "_racc_do_parse_c", racc_cparse, 2); rb_define_private_method(Parser, "_racc_yyparse_c", racc_yyparse, 4); rb_define_const(Parser, "Racc_c_parser_version", rb_str_new2(RACC_VERSION)); + + Racc = rb_eval_string("::Racc"); + CparseParams = rb_define_class_under(Racc, "RaccCparseParams", rb_cObject); RaccBug = rb_eRuntimeError;