Revision: 2883 http://trac.macosforge.org/projects/ruby/changeset/2883 Author: lsansonetti@apple.com Date: 2009-10-22 12:59:54 -0700 (Thu, 22 Oct 2009) Log Message: ----------- parser nodes are now collectable (experimental) Modified Paths: -------------- MacRuby/trunk/gc.c MacRuby/trunk/include/ruby/node.h MacRuby/trunk/include/ruby/ruby.h MacRuby/trunk/parse.y Modified: MacRuby/trunk/gc.c =================================================================== --- MacRuby/trunk/gc.c 2009-10-22 11:27:47 UTC (rev 2882) +++ MacRuby/trunk/gc.c 2009-10-22 19:59:54 UTC (rev 2883) @@ -345,9 +345,6 @@ GC_WB(&n->u2.value, a1); GC_WB(&n->u3.value, a2); - // FIXME this retain is added because the parser is NOT GC-safe at this point - GC_RETAIN(n); - return n; } @@ -989,6 +986,8 @@ static void rb_obj_imp_finalize(void *obj, SEL sel) { +//printf("FINALIZE %p %s\n", obj, class_getName(*(Class *)obj)); + #if 0 // const bool need_protection = // GET_THREAD()->thread_id != pthread_self(); Modified: MacRuby/trunk/include/ruby/node.h =================================================================== --- MacRuby/trunk/include/ruby/node.h 2009-10-22 11:27:47 UTC (rev 2882) +++ MacRuby/trunk/include/ruby/node.h 2009-10-22 19:59:54 UTC (rev 2883) @@ -417,12 +417,12 @@ #define NEW_MATCH(c) NEW_NODE(NODE_MATCH,c,0,0) #define NEW_MATCH2(n1,n2) NEW_NODE(NODE_MATCH2,n1,n2,0) #define NEW_MATCH3(r,n2) NEW_NODE(NODE_MATCH3,r,n2,0) -#define NEW_LIT(l) NEW_NODE(NODE_LIT,l,0,0) -#define NEW_STR(s) NEW_NODE(NODE_STR,s,0,0) -#define NEW_DSTR(s) NEW_NODE(NODE_DSTR,s,1,0) -#define NEW_XSTR(s) NEW_NODE(NODE_XSTR,s,0,0) -#define NEW_DXSTR(s) NEW_NODE(NODE_DXSTR,s,0,0) -#define NEW_DSYM(s) NEW_NODE(NODE_DSYM,s,0,0) +#define NEW_LIT(l) NEW_NODE(NODE_LIT,GC_RETAIN(l),0,0) +#define NEW_STR(s) NEW_NODE(NODE_STR,GC_RETAIN(s),0,0) +#define NEW_DSTR(s) NEW_NODE(NODE_DSTR,GC_RETAIN(s),1,0) +#define NEW_XSTR(s) NEW_NODE(NODE_XSTR,GC_RETAIN(s),0,0) +#define NEW_DXSTR(s) NEW_NODE(NODE_DXSTR,GC_RETAIN(s),0,0) +#define NEW_DSYM(s) NEW_NODE(NODE_DSYM,GC_RETAIN(s),0,0) #define NEW_EVSTR(n) NEW_NODE(NODE_EVSTR,0,(n),0) #if WITH_OBJC && __IN_PARSE_Y__ # define NEW_CALL(r,m,a) process_named_args(NEW_NODE(NODE_CALL,r,m,a)) Modified: MacRuby/trunk/include/ruby/ruby.h =================================================================== --- MacRuby/trunk/include/ruby/ruby.h 2009-10-22 11:27:47 UTC (rev 2882) +++ MacRuby/trunk/include/ruby/ruby.h 2009-10-22 19:59:54 UTC (rev 2883) @@ -1433,7 +1433,7 @@ } return addr; } -#define GC_RELEASE(obj) (rb_objc_retain((const void *)obj)) +#define GC_RELEASE(obj) (rb_objc_release((const void *)obj)) #if RUBY_INCLUDED_AS_FRAMEWORK #include <MacRuby/ruby/missing.h> Modified: MacRuby/trunk/parse.y =================================================================== --- MacRuby/trunk/parse.y 2009-10-22 11:27:47 UTC (rev 2882) +++ MacRuby/trunk/parse.y 2009-10-22 19:59:54 UTC (rev 2883) @@ -2036,7 +2036,7 @@ value_expr($3); if (nd_type($1) == NODE_LIT && FIXNUM_P($1->nd_lit) && nd_type($3) == NODE_LIT && FIXNUM_P($3->nd_lit)) { - GC_WB(&$1->nd_lit, rb_range_new($1->nd_lit, $3->nd_lit, Qfalse)); + GC_WB(&$1->nd_lit, GC_RETAIN(rb_range_new($1->nd_lit, $3->nd_lit, Qfalse))); $$ = $1; } else { @@ -2053,7 +2053,7 @@ value_expr($3); if (nd_type($1) == NODE_LIT && FIXNUM_P($1->nd_lit) && nd_type($3) == NODE_LIT && FIXNUM_P($3->nd_lit)) { - GC_WB(&$1->nd_lit, rb_range_new($1->nd_lit, $3->nd_lit, Qtrue)); + GC_WB(&$1->nd_lit, GC_RETAIN(rb_range_new($1->nd_lit, $3->nd_lit, Qtrue))); $$ = $1; } else { @@ -3929,7 +3929,7 @@ { VALUE src = node->nd_lit; nd_set_type(node, NODE_LIT); - GC_WB(&node->nd_lit, reg_compile(src, options)); + GC_WB(&node->nd_lit, GC_RETAIN(reg_compile(src, options))); } break; default: @@ -5179,29 +5179,21 @@ NODE* rb_compile_file(const char *f, VALUE file, int start) { - VALUE volatile vparser = rb_parser_new(); - - return rb_parser_compile_file(vparser, f, file, start); + return rb_parser_compile_file(rb_parser_new(), f, file, start); } NODE * -rb_parser_compile_file(volatile VALUE vparser, const char *f, VALUE file, +rb_parser_compile_file(VALUE vparser, const char *f, VALUE file, int start) { struct parser_params *parser; - volatile VALUE tmp; - NODE *node; - Data_Get_Struct(vparser, struct parser_params, parser); lex_gets = lex_io_gets; GC_WB(&lex_input, file); lex_pbeg = lex_p = lex_pend = 0; - node = yycompile(parser, f, start); - tmp = vparser; /* prohibit tail call optimization */ - - return node; + return yycompile(parser, f, start); } #endif /* !RIPPER */ @@ -7703,7 +7695,7 @@ int t; #if YYPURE - GC_WB(&parser->parser_yylval, (union tmpyystype*)lval); + parser->parser_yylval = (union tmpyystype*)lval; parser->parser_yylval->val = Qundef; #endif t = parser_yylex(parser); @@ -9188,7 +9180,6 @@ reg_fragment_setenc(str, options); err = rb_errinfo(); re = rb_reg_compile(str, options & RE_OPTION_MASK); - rb_objc_retain((void *)re); if (NIL_P(re)) { ID mesg = rb_intern("mesg"); VALUE m = rb_attr_get(rb_errinfo(), mesg); @@ -10079,8 +10070,16 @@ rb_parser_new(void) { struct parser_params *p = parser_new(); +#if 1 + VALUE c = rb_cData; +#else + static VALUE c = 0; + if (c == 0) { + c = rb_define_class("__Parser", rb_cObject); + } +#endif - return Data_Wrap_Struct(rb_cData, parser_mark, parser_free, p); + return Data_Wrap_Struct(c, parser_mark, parser_free, p); } VALUE
participants (1)
-
source_changes@macosforge.org