summaryrefslogtreecommitdiff
path: root/ext/stringio
diff options
context:
space:
mode:
authorÉtienne Barrié <[email protected]>2024-03-27 17:57:51 +0100
committerNobuyoshi Nakada <[email protected]>2024-03-28 02:27:19 +0900
commit0f5ab4ad5289d6385b74e800a73de005a48737b6 ()
tree550613727a57793b913ba527b5712e4622b58591 /ext/stringio
parentdb5686a8ba7f6157deb2b49f3e16196f1506fa83 (diff)
[ruby/stringio] Eagerly defrost chilled strings
[Feature #20390] https://.com/ruby/stringio/commit/17ee957f34 Co-authored-by: Jean Boussier <[email protected]>
-rw-r--r--ext/stringio/stringio.c24
1 files changed, 20 insertions, 4 deletions
@@ -15,6 +15,8 @@
static const char *const
STRINGIO_VERSION = "3.1.1";
#include "ruby.h"
#include "ruby/io.h"
#include "ruby/encoding.h"
@@ -49,6 +51,13 @@ static long strio_write(VALUE self, VALUE str);
#define IS_STRIO(obj) (rb_typeddata_is_kind_of((obj), &strio_data_type))
#define error_inval(msg) (rb_syserr_fail(EINVAL, msg))
#define get_enc(ptr) ((ptr)->enc ? (ptr)->enc : !NIL_P((ptr)->string) ? rb_enc_get((ptr)->string) : NULL)
static struct StringIO *
strio_alloc(void)
@@ -166,8 +175,14 @@ writable(VALUE strio)
static void
check_modifiable(struct StringIO *ptr)
{
- if (OBJ_FROZEN(ptr->string)) {
- rb_raise(rb_eIOError, "not modifiable string");
}
}
@@ -287,7 +302,8 @@ strio_init(int argc, VALUE *argv, struct StringIO *ptr, VALUE self)
else if (!argc) {
string = rb_enc_str_new("", 0, rb_default_external_encoding());
}
- if (!NIL_P(string) && OBJ_FROZEN_RAW(string)) {
if (ptr->flags & FMODE_WRITABLE) {
rb_syserr_fail(EACCES, 0);
}
@@ -481,7 +497,7 @@ strio_set_string(VALUE self, VALUE string)
rb_io_taint_check(self);
ptr->flags &= ~FMODE_READWRITE;
StringValue(string);
- ptr->flags = OBJ_FROZEN(string) ? FMODE_READABLE : FMODE_READWRITE;
ptr->pos = 0;
ptr->lineno = 0;
RB_OBJ_WRITE(self, &ptr->string, string);