summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog19
-rw-r--r--gc.c2
-rw-r--r--io.c2
-rw-r--r--string.c18
-rw-r--r--version.h6
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 <matz@ruby-lang.org>
+
+ * string.c (rb_str_locktmp): check STR_TMPLOCK flag before
+ locking. [ruby-dev:24727]
+
Fri Nov 5 18:12:42 2004 Hidetoshi NAGAI <nagai@ai.kyutech.ac.jp>
* ext/tk/lib/tk/scrollable.rb: divide Scrollable module into
@@ -20,6 +25,20 @@ Fri Nov 5 13:17:54 2004 Hidetoshi NAGAI <nagai@ai.kyutech.ac.jp>
* ext/tk/lib/tk/text.rb: bug fix
+Fri Nov 5 08:52:48 2004 Yukihiro Matsumoto <matz@ruby-lang.org>
+
+ * gc.c (gc_mark): stricter GC stack check.
+
+Fri Nov 5 08:34:43 2004 Yukihiro Matsumoto <matz@ruby-lang.org>
+
+ * string.c (str_gsub): should have removed rb_str_unlocktmp(str).
+ [ruby-dev:24708]
+
+Thu Nov 4 21:25:38 2004 Yukihiro Matsumoto <matz@ruby-lang.org>
+
+ * string.c (str_gsub): string modify check no longer based on
+ tmplock. [ruby-dev:24706]
+
Thu Nov 4 19:27:46 2004 NAKAMURA Usaku <usa@ruby-lang.org>
* 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
@@ -463,10 +463,8 @@ io_write(io, str)
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[];