diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-08-05 17:25:35 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-08-05 17:25:35 +0000 |
commit | fb25833690a4e75bf3eb1d8afa65a2334d7282b1 (patch) | |
tree | 5675f800cf21be22a937deb1c1c1ef2bd6fc94db /node.c | |
parent | 7918dc352f5e93bc660e5083be638f38e07f7205 (diff) |
node.c: NODE_ALLOCA for ALLOCV
* node.c (rb_alloc_tmp_buffer): use NODE_ALLOCA to mark locations
like as builtin alloca. [ruby-core:70251] [Bug #11418]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@51492 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'node.c')
-rw-r--r-- | node.c | 24 |
1 files changed, 24 insertions, 0 deletions
@@ -1075,3 +1075,27 @@ rb_gc_mark_node(NODE *obj) } return 0; } + +void * +rb_alloc_tmp_buffer(volatile VALUE *store, long len) +{ + NODE *s = rb_node_newnode(NODE_ALLOCA, 0, 0, 0); + void *ptr = xmalloc(len); + s->u1.node = ptr; + s->u3.cnt = len / sizeof(VALUE); + *store = (VALUE)s; + return ptr; +} + +void +rb_free_tmp_buffer(volatile VALUE *store) +{ + VALUE s = *store; + *store = 0; + if (s) { + void *ptr = RNODE(s)->u1.node; + RNODE(s)->u1.node = 0; + RNODE(s)->u3.cnt = 0; + xfree(ptr); + } +} |