From ab3d450a54ad9407548a36f01cb3775a6533c3d7 Mon Sep 17 00:00:00 2001 From: knu Date: Thu, 22 May 2008 03:31:43 +0000 Subject: Merge from ruby_1_8. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@16521 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 15 +++++++++++++++ array.c | 3 +++ eval.c | 13 +++++++++---- 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index c4f198c0ec..798ecefe20 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +Thu May 22 08:28:49 2008 Yukihiro Matsumoto + + * array.c (flatten): free memo hash table before raising exception. + [ruby-dev:34789] + +Thu May 22 06:30:10 2008 Hidetoshi NAGAI + + * array.c (flatten): fix memory leak. + +Thu May 22 05:45:30 2008 Yukihiro Matsumoto + + * proc.c (proc_dup): should copy safe_level from src proc + properly. a patch from Keita Yamaguchi + + Wed May 21 23:31:44 2008 Nobuyoshi Nakada * eval.c (rb_get_method_body, rb_alias, rb_eval): should not cache diff --git a/array.c b/array.c index 1121b0f193..e3d92bac2d 100644 --- a/array.c +++ b/array.c @@ -3124,6 +3124,7 @@ flatten(ary, level, modified) *modified = 1; id = (st_data_t)tmp; if (st_lookup(memo, id, 0)) { + st_free_table(memo); rb_raise(rb_eArgError, "tried to flatten recursive array"); } st_insert(memo, id, (st_data_t)Qtrue); @@ -3143,6 +3144,8 @@ flatten(ary, level, modified) ary = rb_ary_pop(stack); } + st_free_table(memo); + return result; } diff --git a/eval.c b/eval.c index e52bc2c6e8..b0dd27e636 100644 --- a/eval.c +++ b/eval.c @@ -8408,16 +8408,25 @@ proc_clone(self) * MISSING: documentation */ +#define PROC_TSHIFT (FL_USHIFT+1) +#define PROC_TMASK (FL_USER1|FL_USER2|FL_USER3) +#define PROC_TMAX (PROC_TMASK >> PROC_TSHIFT) + +static int proc_get_safe_level(VALUE); + static VALUE proc_dup(self) VALUE self; { struct BLOCK *orig, *data; VALUE bind; + int safe = proc_get_safe_level(self); Data_Get_Struct(self, struct BLOCK, orig); bind = Data_Make_Struct(rb_obj_class(self),struct BLOCK,blk_mark,blk_free,data); blk_dup(data, orig); + if (safe > PROC_TMAX) safe = PROC_TMAX; + FL_SET(bind, (safe << PROC_TSHIFT) & PROC_TMASK); return bind; } @@ -8521,10 +8530,6 @@ bind_eval(argc, argv, bindval) return rb_f_eval(argc+1, args, Qnil /* self will be searched in eval */); } -#define PROC_TSHIFT (FL_USHIFT+1) -#define PROC_TMASK (FL_USER1|FL_USER2|FL_USER3) -#define PROC_TMAX (PROC_TMASK >> PROC_TSHIFT) - #define SAFE_LEVEL_MAX PROC_TMASK static void -- cgit v1.2.3