stringio 3.1.1 → 3.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/NEWS.md +53 -0
  3. data/ext/stringio/stringio.c +24 -13
  4. metadata +5 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0f8291051ef78bfdd817200ff02c25db3e2fa495d9b4a164c9737511d6eadb38
4
- data.tar.gz: 8593995f8dbb66e6a3dc9f2755f97d0cc05e2d363e6cd027cc15a7d46deaf60f
3
+ metadata.gz: b9f7204dcb94ef40c0b88ca4b8687976b15343e5d1fd4061f6f950ed233d6559
4
+ data.tar.gz: 2af6f911dcfba01b80c03a0de22ac90edf271f3f4904fc56abd635bb7eb14ee9
5
5
  SHA512:
6
- metadata.gz: 5060643c29e66ccc88df7a7ab4c19943d89ce3779641b9be7e0cfc61ce79db7c53af06367875b1892b80f31d98be32d10da2590445cb86425b7d89f285a30b5f
7
- data.tar.gz: 1a6dcf694eaa38dd0d939b8db9cb4f29cc96db93ac545f5f06d6354ad5e75f92fb9807f529f54ae6801a3f791e7139db7ad371bf8efd6b7ca34f45f61fb10429
6
+ metadata.gz: c7539db6bc763bb420aa5d0e669d91c4da3405bd78f2897af22eba0f10f22863b03dc5e7ba386d1abf7ef08e7af7a3f36880f55f394594f33ecace42166bbd14
7
+ data.tar.gz: 23ad934633417cfb11780d9017a4e9a7446f07eae7cb1ff4cafb9a118301bbf315fc347fd889ea97ebdd2a67819d1ee07c4af7c53d11b4e060ec9eb095ab7925
data/NEWS.md CHANGED
@@ -1,5 +1,58 @@
1
1
  # News
2
2
 
3
+ ## 3.1.5 - 2025-02-21
4
+
5
+ ### Improvements
6
+
7
+ * JRuby: Improved compatibility with CRuby for `StringIO#seek` with
8
+ frozen string.
9
+ * GH-119
10
+ * GH-121
11
+
12
+ ## 3.1.4 - 2025-02-20
13
+
14
+ ### Improvements
15
+
16
+ * JRuby: Improved compatibility with CRuby.
17
+ * GH-116
18
+
19
+ ### Fixes
20
+
21
+ * CRuby: Fixed a bug that `StringIO` may mutate a shared string.
22
+ * GH-117
23
+
24
+ ## 3.1.3 - 2025-02-14
25
+
26
+ ### Fixes
27
+
28
+ * JRuby: Fixed a bug that JRuby may not be able to be started
29
+ * GH-112
30
+ * GH-113
31
+ * Reported by Karol Bucek
32
+
33
+ ### Thanks
34
+
35
+ * Karol Bucek
36
+
37
+ ## 3.1.2 - 2024-11-07
38
+
39
+ ### Improvements
40
+
41
+ * JRuby: Added support for detecting encoding by BOM.
42
+ * GH-100
43
+ * GH-101
44
+
45
+ ### Fixes
46
+
47
+ * CRuby: Fixed a bug that unknown memory may be used by
48
+ `StringIO#ungetc`/`StringIO#ungetbyte`.
49
+ * https://hackerone.com/reports/2805165
50
+ * Reported by manun.
51
+
52
+ ### Thanks
53
+
54
+ * manun
55
+
3
56
  ## 3.1.1 - 2024-06-13
4
57
 
5
58
  ### Improvements
@@ -13,7 +13,7 @@
13
13
  **********************************************************************/
14
14
 
15
15
  static const char *const
16
- STRINGIO_VERSION = "3.1.1";
16
+ STRINGIO_VERSION = "3.1.5";
17
17
 
18
18
  #include <stdbool.h>
19
19
 
@@ -180,6 +180,7 @@ check_modifiable(struct StringIO *ptr)
180
180
  else if (OBJ_FROZEN_RAW(ptr->string)) {
181
181
  rb_raise(rb_eIOError, "not modifiable string");
182
182
  }
183
+ rb_str_modify(ptr->string);
183
184
  }
184
185
 
185
186
  static VALUE
@@ -930,6 +931,18 @@ strio_extend(struct StringIO *ptr, long pos, long len)
930
931
  }
931
932
  }
932
933
 
934
+ static void
935
+ strio_unget_string(struct StringIO *ptr, VALUE c)
936
+ {
937
+ const char *cp = NULL;
938
+ long cl = RSTRING_LEN(c);
939
+ if (cl > 0) {
940
+ if (c != ptr->string) cp = RSTRING_PTR(c);
941
+ strio_unget_bytes(ptr, cp, cl);
942
+ RB_GC_GUARD(c);
943
+ }
944
+ }
945
+
933
946
  /*
934
947
  * call-seq:
935
948
  * ungetc(character) -> nil
@@ -952,19 +965,22 @@ strio_ungetc(VALUE self, VALUE c)
952
965
 
953
966
  enc = rb_enc_get(ptr->string);
954
967
  len = rb_enc_codelen(cc, enc);
955
- if (len <= 0) rb_enc_uint_chr(cc, enc);
968
+ if (len <= 0) {
969
+ rb_enc_uint_chr(cc, enc); /* to raise an exception */
970
+ UNREACHABLE;
971
+ }
956
972
  rb_enc_mbcput(cc, buf, enc);
957
973
  return strio_unget_bytes(ptr, buf, len);
958
974
  }
959
975
  else {
960
- SafeStringValue(c);
976
+ StringValue(c);
977
+ if (RSTRING_LEN(c) == 0) return Qnil;
961
978
  enc = rb_enc_get(ptr->string);
962
979
  enc2 = rb_enc_get(c);
963
980
  if (enc != enc2 && enc != rb_ascii8bit_encoding()) {
964
981
  c = rb_str_conv_enc(c, enc2, enc);
965
982
  }
966
- strio_unget_bytes(ptr, RSTRING_PTR(c), RSTRING_LEN(c));
967
- RB_GC_GUARD(c);
983
+ strio_unget_string(ptr, c);
968
984
  return Qnil;
969
985
  }
970
986
  }
@@ -991,13 +1007,8 @@ strio_ungetbyte(VALUE self, VALUE c)
991
1007
  strio_unget_bytes(ptr, &cc, 1);
992
1008
  }
993
1009
  else {
994
- long cl;
995
- SafeStringValue(c);
996
- cl = RSTRING_LEN(c);
997
- if (cl > 0) {
998
- strio_unget_bytes(ptr, RSTRING_PTR(c), cl);
999
- RB_GC_GUARD(c);
1000
- }
1010
+ StringValue(c);
1011
+ strio_unget_string(ptr, c);
1001
1012
  }
1002
1013
  return Qnil;
1003
1014
  }
@@ -1028,7 +1039,7 @@ strio_unget_bytes(struct StringIO *ptr, const char *cp, long cl)
1028
1039
  if (rest > cl) memset(s + len, 0, rest - cl);
1029
1040
  pos -= cl;
1030
1041
  }
1031
- memcpy(s + pos, cp, cl);
1042
+ memcpy(s + pos, (cp ? cp : s), cl);
1032
1043
  ptr->pos = pos;
1033
1044
  return Qnil;
1034
1045
  }
metadata CHANGED
@@ -1,15 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stringio
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.1
4
+ version: 3.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nobu Nakada
8
8
  - Charles Oliver Nutter
9
- autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2024-06-13 00:00:00.000000000 Z
11
+ date: 2025-02-21 00:00:00.000000000 Z
13
12
  dependencies: []
14
13
  description: Pseudo `IO` class from/to `String`.
15
14
  email:
@@ -42,8 +41,8 @@ homepage: https://github.com/ruby/stringio
42
41
  licenses:
43
42
  - Ruby
44
43
  - BSD-2-Clause
45
- metadata: {}
46
- post_install_message:
44
+ metadata:
45
+ changelog_uri: https://github.com/ruby/stringio/releases/tag/v3.1.5
47
46
  rdoc_options: []
48
47
  require_paths:
49
48
  - lib
@@ -58,8 +57,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
58
57
  - !ruby/object:Gem::Version
59
58
  version: '0'
60
59
  requirements: []
61
- rubygems_version: 3.5.11
62
- signing_key:
60
+ rubygems_version: 3.6.2
63
61
  specification_version: 4
64
62
  summary: Pseudo IO on String
65
63
  test_files: []