diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-03-02 10:45:11 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-03-02 10:45:11 +0000 |
commit | 2ad54b00f336da8ca3154f0d0dcb9f7735389d74 (patch) | |
tree | 483a2b2b7e6400be7dc9b9ba93beb0ac3b99451e | |
parent | 8c5244d2ce8bbf30091e05c7f05163ee4b00cf46 (diff) | |
download | ruby-2ad54b00f336da8ca3154f0d0dcb9f7735389d74.tar.gz |
* eval.c (proc_invoke): turn on SCOPE_CLONE flag. a patch from
Chikanaga Tomoyuki <chikanag AT nippon-control-system.co.jp>.
[ruby-dev:30460]
* gc.c (obj_free): check SCOPE_CLONE flag before freeing local_tbl
region.
* parse.y (top_local_setup_gen): ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/matzruby@11958 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 11 | ||||
-rw-r--r-- | env.h | 1 | ||||
-rw-r--r-- | eval.c | 3 | ||||
-rw-r--r-- | gc.c | 2 | ||||
-rw-r--r-- | parse.y | 3 | ||||
-rw-r--r-- | version.h | 8 |
6 files changed, 21 insertions, 7 deletions
@@ -1,3 +1,14 @@ +Fri Mar 2 19:18:13 2007 Yukihiro Matsumoto <matz@ruby-lang.org> + + * eval.c (proc_invoke): turn on SCOPE_CLONE flag. a patch from + Chikanaga Tomoyuki <chikanag AT nippon-control-system.co.jp>. + [ruby-dev:30460] + + * gc.c (obj_free): check SCOPE_CLONE flag before freeing local_tbl + region. + + * parse.y (top_local_setup_gen): ditto. + Thu Feb 1 23:25:21 2007 Nobuyoshi Nakada <nobu@ruby-lang.org> * parse.y (rb_id2str): store Strings for operator symbols. @@ -43,6 +43,7 @@ RUBY_EXTERN struct SCOPE { #define SCOPE_MALLOC 1 #define SCOPE_NOSTACK 2 #define SCOPE_DONT_RECYCLE 4 +#define SCOPE_CLONE 8 RUBY_EXTERN int ruby_in_eval; VALUE ruby_current_class_object(void); @@ -8521,11 +8521,12 @@ proc_invoke(VALUE proc, VALUE args /* OK */, VALUE self, VALUE klass) if (klass) _block.frame.this_class = klass; _block.frame.argc = RARRAY_LEN(args); _block.frame.flags = ruby_frame->flags; - if (_block.frame.argc && (ruby_frame->flags & FRAME_DMETH)) { + if (_block.frame.argc && DMETHOD_P()) { NEWOBJ(scope, struct SCOPE); OBJSETUP(scope, args, T_SCOPE); scope->local_tbl = _block.scope->local_tbl; scope->local_vars = _block.scope->local_vars; + scope->flags |= SCOPE_CLONE; _block.scope = scope; } PUSH_FRAME(Qfalse); @@ -1244,7 +1244,7 @@ obj_free(VALUE obj) if (RANY(obj)->as.scope.local_vars && RANY(obj)->as.scope.flags != SCOPE_ALLOCA) { VALUE *vars = RANY(obj)->as.scope.local_vars-1; - if (vars[0] == 0) + if (!(RANY(obj)->as.scope.flags & SCOPE_CLONE) && vars[0] == 0) RUBY_CRITICAL(free(RANY(obj)->as.scope.local_tbl)); if (RANY(obj)->as.scope.flags & SCOPE_MALLOC) RUBY_CRITICAL(free(vars)); @@ -8112,7 +8112,8 @@ top_local_setup_gen(struct parser_params *parser) rb_mem_clear(ruby_scope->local_vars+i, len-i); } if (ruby_scope->local_tbl && ruby_scope->local_vars[-1] == 0) { - xfree(ruby_scope->local_tbl); + if (!(ruby_scope->flags & SCOPE_CLONE)) + xfree(ruby_scope->local_tbl); } ruby_scope->local_tbl = local_tbl(); } @@ -1,15 +1,15 @@ #define RUBY_VERSION "1.9.0" -#define RUBY_RELEASE_DATE "2007-01-29" +#define RUBY_RELEASE_DATE "2007-03-02" #define RUBY_VERSION_CODE 190 -#define RUBY_RELEASE_CODE 20070129 +#define RUBY_RELEASE_CODE 20070302 #define RUBY_PATCHLEVEL 0 #define RUBY_VERSION_MAJOR 1 #define RUBY_VERSION_MINOR 9 #define RUBY_VERSION_TEENY 0 #define RUBY_RELEASE_YEAR 2007 -#define RUBY_RELEASE_MONTH 1 -#define RUBY_RELEASE_DAY 29 +#define RUBY_RELEASE_MONTH 3 +#define RUBY_RELEASE_DAY 2 RUBY_EXTERN const char ruby_version[]; RUBY_EXTERN const char ruby_release_date[]; |