diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-11-04 12:27:57 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-11-04 12:27:57 +0000 |
commit | 67ae0fb9aced8cf56de10a1fd400a236bd753b60 (patch) | |
tree | 4249b9622223c3d0390ba702f81eb872d972a987 | |
parent | e4a65e442737a45016db4a36ffcf3b41df01c707 (diff) |
* 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/trunk@7202 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | ext/socket/socket.c | 12 | ||||
-rw-r--r-- | string.c | 11 |
3 files changed, 17 insertions, 11 deletions
@@ -1,3 +1,8 @@ +Thu Nov 4 21:25:38 2004 Yukihiro Matsumoto <[email protected]> + + * string.c (str_gsub): string modify check no longer based on + tmplock. [ruby-dev:24706] + Thu Nov 4 21:13:48 2004 Masaki Suketa <[email protected]> * ext/win32ole/win32ole.c(typelib_file_from_typelib): search "win16" diff --git a/ext/socket/socket.c b/ext/socket/socket.c index 4cc9adc072..cbd3dd86ce 100644 --- a/ext/socket/socket.c +++ b/ext/socket/socket.c @@ -1303,8 +1303,7 @@ static VALUE unixsock_connect_internal(arg) struct unixsock_arg *arg; { - return (VALUE)ruby_connect(arg->fd, arg->sockaddr, sizeof(*arg->sockaddr), - 0); + return (VALUE)ruby_connect(arg->fd, arg->sockaddr, sizeof(*arg->sockaddr), 0); } static VALUE @@ -1984,18 +1983,21 @@ sock_connect(sock, addr) VALUE sock, addr; { OpenFile *fptr; - int fd; + int fd, n; StringValue(addr); rb_str_modify(addr); GetOpenFile(sock, fptr); fd = fileno(fptr->f); - if (ruby_connect(fd, (struct sockaddr*)RSTRING(addr)->ptr, RSTRING(addr)->len, 0) < 0) { + rb_str_locktmp(addr); + n = ruby_connect(fd, (struct sockaddr*)RSTRING(addr)->ptr, RSTRING(addr)->len, 0); + rb_str_unlocktmp(addr); + if (n < 0) { rb_sys_fail("connect(2)"); } - return INT2FIX(0); + return INT2FIX(n); } static VALUE @@ -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"); @@ -2045,9 +2044,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()) { @@ -2074,9 +2073,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++; @@ -2085,7 +2084,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 { |