[macruby-changes] [2883] MacRuby/trunk

source_changes at macosforge.org source_changes at macosforge.org
Thu Oct 22 12:59:56 PDT 2009


Revision: 2883
          http://trac.macosforge.org/projects/ruby/changeset/2883
Author:   lsansonetti at 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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20091022/2581a6aa/attachment.html>


More information about the macruby-changes mailing list