[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