[macruby-changes] [2886] MacRuby/trunk
source_changes at macosforge.org
source_changes at macosforge.org
Thu Oct 22 17:59:11 PDT 2009
Revision: 2886
http://trac.macosforge.org/projects/ruby/changeset/2886
Author: lsansonetti at apple.com
Date: 2009-10-22 17:59:10 -0700 (Thu, 22 Oct 2009)
Log Message:
-----------
unrelease parser nodes post execution
Modified Paths:
--------------
MacRuby/trunk/gc.c
MacRuby/trunk/parse.y
MacRuby/trunk/vm.cpp
Modified: MacRuby/trunk/gc.c
===================================================================
--- MacRuby/trunk/gc.c 2009-10-22 21:19:58 UTC (rev 2885)
+++ MacRuby/trunk/gc.c 2009-10-23 00:59:10 UTC (rev 2886)
@@ -351,6 +351,111 @@
return n;
}
+const char *ruby_node_name(int node);
+
+void
+rb_node_release(NODE *node)
+{
+ if (node == NULL || node == (NODE *)-1) {
+ return;
+ }
+
+// static int c = 0;
+// printf("%d RELEASE %s %p\n", ++c, ruby_node_name(nd_type(node)), node);
+
+ switch (nd_type(node)) {
+ case NODE_IF: /* 1,2,3 */
+ case NODE_FOR:
+ case NODE_ITER:
+ case NODE_WHEN:
+ case NODE_MASGN:
+ case NODE_RESCUE:
+ case NODE_RESBODY:
+ case NODE_CLASS:
+ case NODE_BLOCK_PASS:
+ rb_node_release(node->u2.node);
+ /* fall through */
+ case NODE_BLOCK: /* 1,3 */
+ case NODE_OPTBLOCK:
+ case NODE_ARRAY:
+ case NODE_ENSURE:
+ case NODE_CALL:
+ case NODE_DEFS:
+ case NODE_OP_ASGN1:
+ case NODE_ARGS:
+ rb_node_release(node->u1.node);
+ /* fall through */
+ case NODE_SUPER: /* 3 */
+ case NODE_FCALL:
+ case NODE_DEFN:
+ case NODE_ARGS_AUX:
+ rb_node_release(node->u3.node);
+ break;
+
+ case NODE_METHOD: /* 1,2 */
+ case NODE_WHILE:
+ case NODE_UNTIL:
+ case NODE_AND:
+ case NODE_OR:
+ case NODE_CASE:
+ case NODE_SCLASS:
+ case NODE_DOT2:
+ case NODE_DOT3:
+ case NODE_FLIP2:
+ case NODE_FLIP3:
+ case NODE_MATCH2:
+ case NODE_MATCH3:
+ case NODE_OP_ASGN_OR:
+ case NODE_OP_ASGN_AND:
+ case NODE_MODULE:
+ case NODE_ARGSCAT:
+ rb_node_release(node->u1.node);
+ /* fall through */
+ case NODE_FBODY: /* 2 */
+ case NODE_GASGN:
+ case NODE_LASGN:
+ case NODE_DASGN:
+ case NODE_DASGN_CURR:
+ case NODE_IASGN:
+ case NODE_IASGN2:
+ case NODE_CVASGN:
+ case NODE_OPT_N:
+ case NODE_EVSTR:
+ case NODE_UNDEF:
+ case NODE_POSTEXE:
+ rb_node_release(node->u2.node);
+ break;
+
+ case NODE_HASH: /* 1 */
+ case NODE_DEFINED:
+ case NODE_RETURN:
+ case NODE_BREAK:
+ case NODE_NEXT:
+ case NODE_YIELD:
+ case NODE_COLON2:
+ case NODE_SPLAT:
+ case NODE_TO_ARY:
+ rb_node_release(node->u1.node);
+ break;
+
+ case NODE_SCOPE: /* 2,3 */
+ case NODE_CDECL:
+ case NODE_OPT_ARG:
+ rb_node_release(node->u3.node);
+ rb_node_release(node->u2.node);
+ break;
+ }
+
+// c--;
+
+ // Some NODE structures are apparently reused somewhere in parserland.
+ const int count = auto_zone_retain_count(__auto_zone, node);
+ if (count > 0) {
+ node->u1.node = node->u2.node = node->u3.node = NULL;
+ GC_RELEASE(node);
+ }
+}
+
VALUE
rb_data_object_alloc(VALUE klass, void *datap, RUBY_DATA_FUNC dmark, RUBY_DATA_FUNC dfree)
{
Modified: MacRuby/trunk/parse.y
===================================================================
--- MacRuby/trunk/parse.y 2009-10-22 21:19:58 UTC (rev 2885)
+++ MacRuby/trunk/parse.y 2009-10-23 00:59:10 UTC (rev 2886)
@@ -10108,7 +10108,7 @@
#ifdef YYMALLOC
#define HEAPCNT(n, size) ((n) * (size) / sizeof(YYSTYPE))
-#define NEWHEAP() rb_node_newnode(NODE_ALLOCA, 0, (VALUE)parser->heap, 0)
+#define NEWHEAP() (NODE *)GC_RELEASE(rb_node_newnode(NODE_ALLOCA, 0, (VALUE)parser->heap, 0))
static inline void *
__add2heap(struct parser_params *parser, NODE *n, size_t c, void *p)
Modified: MacRuby/trunk/vm.cpp
===================================================================
--- MacRuby/trunk/vm.cpp 2009-10-22 21:19:58 UTC (rev 2885)
+++ MacRuby/trunk/vm.cpp 2009-10-23 00:59:10 UTC (rev 2886)
@@ -3338,6 +3338,8 @@
: new RoxorCompiler();
}
+extern "C" void rb_node_release(NODE *node);
+
extern "C"
VALUE
rb_vm_run(const char *fname, NODE *node, rb_vm_binding_t *binding,
@@ -3380,6 +3382,8 @@
GET_CORE()->delenda(function);
}
+ rb_node_release(node);
+
return ret;
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20091022/833a102d/attachment.html>
More information about the macruby-changes
mailing list