summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-03-02 10:45:11 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-03-02 10:45:11 +0000
commit2ad54b00f336da8ca3154f0d0dcb9f7735389d74 (patch)
tree483a2b2b7e6400be7dc9b9ba93beb0ac3b99451e
parent8c5244d2ce8bbf30091e05c7f05163ee4b00cf46 (diff)
downloadruby-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--ChangeLog11
-rw-r--r--env.h1
-rw-r--r--eval.c3
-rw-r--r--gc.c2
-rw-r--r--parse.y3
-rw-r--r--version.h8
6 files changed, 21 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog
index 0f5498d6f3..c46dc67f7a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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.
diff --git a/env.h b/env.h
index c6b079d301..76ac0d07c0 100644
--- a/env.h
+++ b/env.h
@@ -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);
diff --git a/eval.c b/eval.c
index bd5b614176..b29ddb522b 100644
--- a/eval.c
+++ b/eval.c
@@ -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);
diff --git a/gc.c b/gc.c
index dcad5a10fb..c662cbaedb 100644
--- a/gc.c
+++ b/gc.c
@@ -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));
diff --git a/parse.y b/parse.y
index 7e994a5206..1062d27941 100644
--- a/parse.y
+++ b/parse.y
@@ -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();
}
diff --git a/version.h b/version.h
index 77c77bf9a1..b96d002878 100644
--- a/version.h
+++ b/version.h
@@ -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[];