Revision: 2886 http://trac.macosforge.org/projects/ruby/changeset/2886 Author: lsansonetti@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; }
participants (1)
-
source_changes@macosforge.org