Bug #13085 » 0001-io.c-io_fwrite-temporarily-freeze-string-when-writin.patch
io.c | ||
---|---|---|
return str;
|
||
}
|
||
struct fwrite_tmp_freeze {
|
||
VALUE str;
|
||
union {
|
||
rb_io_t *fptr;
|
||
long written;
|
||
} as;
|
||
int nosync;
|
||
};
|
||
static VALUE
|
||
fwrite_freeze(VALUE p)
|
||
{
|
||
struct fwrite_tmp_freeze *x = (struct fwrite_tmp_freeze *)p;
|
||
const char *ptr;
|
||
long len;
|
||
OBJ_FREEZE_RAW(x->str);
|
||
RSTRING_GETMEM(x->str, ptr, len);
|
||
x->as.written = io_binwrite(x->str, ptr, len, x->as.fptr, x->nosync);
|
||
return Qfalse;
|
||
}
|
||
static VALUE
|
||
fwrite_unfreeze(VALUE str)
|
||
{
|
||
FL_UNSET_RAW(str, FL_FREEZE);
|
||
return Qfalse;
|
||
}
|
||
static long
|
||
io_fwrite(VALUE str, rb_io_t *fptr, int nosync)
|
||
{
|
||
... | ... | |
str = do_writeconv(str, fptr, &converted);
|
||
if (converted)
|
||
OBJ_FREEZE(str);
|
||
else
|
||
str = rb_str_new_frozen(str);
|
||
else if (!OBJ_FROZEN_RAW(str)) {
|
||
struct fwrite_tmp_freeze x;
|
||
x.str = str;
|
||
x.as.fptr = fptr;
|
||
x.nosync = nosync;
|
||
rb_ensure(fwrite_freeze, (VALUE)&x, fwrite_unfreeze, str);
|
||
return x.as.written;
|
||
}
|
||
return io_binwrite(str, RSTRING_PTR(str), RSTRING_LEN(str),
|
||
fptr, nosync);
|
||
-
|