From 8afd99d671f0aeb4ba8caa2d368b99806ecace6a Mon Sep 17 00:00:00 2001 From: matz Date: Fri, 5 Nov 2004 16:01:53 +0000 Subject: * string.c (rb_str_locktmp): check STR_TMPLOCK flag before locking. [ruby-dev:24727] * gc.c (gc_mark): stricter GC stack check. * string.c (str_gsub): should have removed rb_str_unlocktmp(str). [ruby-dev:24708] * string.c (str_gsub): string modify check no longer based on tmplock. [ruby-dev:24706] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@7216 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 19 +++++++++++++++++++ gc.c | 2 +- io.c | 2 -- string.c | 18 +++++++++++------- version.h | 6 +++--- 5 files changed, 34 insertions(+), 13 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7bac712018..027f0c2a6b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Sat Nov 6 00:46:27 2004 Yukihiro Matsumoto + + * string.c (rb_str_locktmp): check STR_TMPLOCK flag before + locking. [ruby-dev:24727] + Fri Nov 5 18:12:42 2004 Hidetoshi NAGAI * ext/tk/lib/tk/scrollable.rb: divide Scrollable module into @@ -20,6 +25,20 @@ Fri Nov 5 13:17:54 2004 Hidetoshi NAGAI * ext/tk/lib/tk/text.rb: bug fix +Fri Nov 5 08:52:48 2004 Yukihiro Matsumoto + + * gc.c (gc_mark): stricter GC stack check. + +Fri Nov 5 08:34:43 2004 Yukihiro Matsumoto + + * string.c (str_gsub): should have removed rb_str_unlocktmp(str). + [ruby-dev:24708] + +Thu Nov 4 21:25:38 2004 Yukihiro Matsumoto + + * string.c (str_gsub): string modify check no longer based on + tmplock. [ruby-dev:24706] + Thu Nov 4 19:27:46 2004 NAKAMURA Usaku * io.c (rb_f_open): fix typo. diff --git a/gc.c b/gc.c index 912d2cabc6..b00c170927 100644 --- a/gc.c +++ b/gc.c @@ -706,7 +706,7 @@ gc_mark(ptr, lev) if (obj->as.basic.flags & FL_MARK) return; /* already marked */ obj->as.basic.flags |= FL_MARK; - if (lev > GC_LEVEL_MAX) { + if (lev > GC_LEVEL_MAX || (lev == 0 && ruby_stack_check())) { if (!mark_stack_overflow) { if (mark_stack_ptr - mark_stack < MARK_STACK_MAX) { *mark_stack_ptr = ptr; diff --git a/io.c b/io.c index 37a30fa0d0..195392e565 100644 --- a/io.c +++ b/io.c @@ -462,11 +462,9 @@ io_write(io, str) rb_io_check_writable(fptr); f = GetWriteFile(fptr); - rb_str_locktmp(str); rb_str_locktmp(str); n = rb_io_fwrite(RSTRING(str)->ptr, RSTRING(str)->len, f); rb_str_unlocktmp(str); - rb_str_unlocktmp(str); if (n == -1L) rb_sys_fail(fptr->path); if (fptr->mode & FMODE_SYNC) { io_fflush(f, fptr); diff --git a/string.c b/string.c index 48cd779a02..12f0474495 100644 --- a/string.c +++ b/string.c @@ -464,7 +464,6 @@ str_independent(str) VALUE str; { if (FL_TEST(str, STR_TMPLOCK)) { - FL_UNSET(str, STR_TMPLOCK); rb_raise(rb_eRuntimeError, "can't modify string; temporarily locked"); } if (OBJ_FROZEN(str)) rb_error_frozen("string"); @@ -641,6 +640,9 @@ VALUE rb_str_locktmp(str) VALUE str; { + if (FL_TEST(str, STR_TMPLOCK)) { + rb_raise(rb_eRuntimeError, "temporal locking already locked string"); + } FL_SET(str, STR_TMPLOCK); return str; } @@ -649,6 +651,9 @@ VALUE rb_str_unlocktmp(str) VALUE str; { + if (!FL_TEST(str, STR_TMPLOCK)) { + rb_raise(rb_eRuntimeError, "temporal unlocking already unlocked string"); + } FL_UNSET(str, STR_TMPLOCK); return str; } @@ -2034,9 +2039,9 @@ str_gsub(argc, argv, str, bang) VALUE pat, val, repl, match, dest; struct re_registers *regs; long beg, n; - long offset, blen, len; + long offset, blen, slen, len; int iter = 0; - char *buf, *bp, *cp; + char *buf, *bp, *sp, *cp; int tainted = 0; if (argc == 1 && rb_block_given_p()) { @@ -2063,9 +2068,9 @@ str_gsub(argc, argv, str, bang) dest = rb_str_new5(str, 0, blen); buf = RSTRING(dest)->ptr; bp = buf; - cp = RSTRING(str)->ptr; + sp = cp = RSTRING(str)->ptr; + slen = RSTRING(str)->len; - rb_str_locktmp(str); rb_str_locktmp(dest); while (beg >= 0) { n++; @@ -2074,7 +2079,7 @@ str_gsub(argc, argv, str, bang) if (iter) { rb_match_busy(match); val = rb_obj_as_string(rb_yield(rb_reg_nth_match(0, match))); - str_mod_check(dest, buf, blen); + str_mod_check(str, sp, slen); rb_backref_set(match); } else { @@ -2124,7 +2129,6 @@ str_gsub(argc, argv, str, bang) } rb_backref_set(match); *bp = '\0'; - rb_str_unlocktmp(str); rb_str_unlocktmp(dest); if (bang) { if (str_independent(str)) { diff --git a/version.h b/version.h index 4c0d7e2153..0600fbdf68 100644 --- a/version.h +++ b/version.h @@ -1,14 +1,14 @@ #define RUBY_VERSION "1.8.2" -#define RUBY_RELEASE_DATE "2004-11-05" +#define RUBY_RELEASE_DATE "2004-11-06" #define RUBY_VERSION_CODE 182 -#define RUBY_RELEASE_CODE 20041105 +#define RUBY_RELEASE_CODE 20041106 #define RUBY_VERSION_MAJOR 1 #define RUBY_VERSION_MINOR 8 #define RUBY_VERSION_TEENY 2 #define RUBY_RELEASE_YEAR 2004 #define RUBY_RELEASE_MONTH 11 -#define RUBY_RELEASE_DAY 5 +#define RUBY_RELEASE_DAY 6 RUBY_EXTERN const char ruby_version[]; RUBY_EXTERN const char ruby_release_date[]; -- cgit v1.2.3