ruby-zstds 1.0.0 → 1.0.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -3,7 +3,6 @@
3
3
 
4
4
  #include "ruby.h"
5
5
  #include "zstds_ext/buffer.h"
6
- #include "zstds_ext/common.h"
7
6
  #include "zstds_ext/dictionary.h"
8
7
  #include "zstds_ext/io.h"
9
8
  #include "zstds_ext/option.h"
@@ -3,13 +3,9 @@
3
3
 
4
4
  #include "zstds_ext/option.h"
5
5
 
6
- #include <stdbool.h>
7
- #include <stdint.h>
8
- #include <stdlib.h>
9
6
  #include <zstd.h>
10
7
 
11
8
  #include "ruby.h"
12
- #include "zstds_ext/common.h"
13
9
  #include "zstds_ext/dictionary.h"
14
10
  #include "zstds_ext/error.h"
15
11
 
@@ -5,8 +5,6 @@
5
5
  #define ZSTDS_EXT_OPTIONS_H
6
6
 
7
7
  #include <stdbool.h>
8
- #include <stdint.h>
9
- #include <stdlib.h>
10
8
  #include <zstd.h>
11
9
 
12
10
  #include "ruby.h"
@@ -22,9 +20,9 @@ enum {
22
20
  ZSTDS_EXT_OPTION_TYPE_STRATEGY
23
21
  };
24
22
 
25
- typedef uint_fast8_t zstds_ext_option_type_t;
26
- typedef int zstds_ext_option_value_t;
27
- typedef unsigned long long zstds_ext_ull_option_value_t;
23
+ typedef zstds_ext_byte_fast_t zstds_ext_option_type_t;
24
+ typedef int zstds_ext_option_value_t;
25
+ typedef unsigned long long zstds_ext_ull_option_value_t;
28
26
 
29
27
  typedef struct {
30
28
  bool has_value;
@@ -3,12 +3,9 @@
3
3
 
4
4
  #include "zstds_ext/stream/compressor.h"
5
5
 
6
- #include <stdint.h>
7
- #include <stdlib.h>
8
6
  #include <zstd.h>
9
7
 
10
8
  #include "ruby.h"
11
- #include "zstds_ext/common.h"
12
9
  #include "zstds_ext/error.h"
13
10
  #include "zstds_ext/option.h"
14
11
 
@@ -19,7 +16,7 @@ static void free_compressor(zstds_ext_compressor_t* compressor_ptr)
19
16
  ZSTD_freeCCtx(ctx);
20
17
  }
21
18
 
22
- uint8_t* destination_buffer = compressor_ptr->destination_buffer;
19
+ zstds_ext_byte_t* destination_buffer = compressor_ptr->destination_buffer;
23
20
  if (destination_buffer != NULL) {
24
21
  free(destination_buffer);
25
22
  }
@@ -68,7 +65,7 @@ VALUE zstds_ext_initialize_compressor(VALUE self, VALUE options)
68
65
  destination_buffer_length = ZSTD_CStreamOutSize();
69
66
  }
70
67
 
71
- uint8_t* destination_buffer = malloc(destination_buffer_length);
68
+ zstds_ext_byte_t* destination_buffer = malloc(destination_buffer_length);
72
69
  if (destination_buffer == NULL) {
73
70
  ZSTD_freeCCtx(ctx);
74
71
  zstds_ext_raise_error(ZSTDS_EXT_ERROR_ALLOCATE_FAILED);
@@ -185,9 +182,9 @@ VALUE zstds_ext_compressor_read_result(VALUE self)
185
182
  GET_COMPRESSOR(self);
186
183
  DO_NOT_USE_AFTER_CLOSE(compressor_ptr);
187
184
 
188
- uint8_t* destination_buffer = compressor_ptr->destination_buffer;
189
- size_t destination_buffer_length = compressor_ptr->destination_buffer_length;
190
- size_t remaining_destination_buffer_length = compressor_ptr->remaining_destination_buffer_length;
185
+ zstds_ext_byte_t* destination_buffer = compressor_ptr->destination_buffer;
186
+ size_t destination_buffer_length = compressor_ptr->destination_buffer_length;
187
+ size_t remaining_destination_buffer_length = compressor_ptr->remaining_destination_buffer_length;
191
188
 
192
189
  const char* result = (const char*)destination_buffer;
193
190
  size_t result_length = destination_buffer_length - remaining_destination_buffer_length;
@@ -212,7 +209,7 @@ VALUE zstds_ext_compressor_close(VALUE self)
212
209
  compressor_ptr->ctx = NULL;
213
210
  }
214
211
 
215
- uint8_t* destination_buffer = compressor_ptr->destination_buffer;
212
+ zstds_ext_byte_t* destination_buffer = compressor_ptr->destination_buffer;
216
213
  if (destination_buffer != NULL) {
217
214
  free(destination_buffer);
218
215
 
@@ -4,18 +4,17 @@
4
4
  #if !defined(ZSTDS_EXT_STREAM_COMPRESSOR_H)
5
5
  #define ZSTDS_EXT_STREAM_COMPRESSOR_H
6
6
 
7
- #include <stdint.h>
8
- #include <stdlib.h>
9
7
  #include <zstd.h>
10
8
 
11
9
  #include "ruby.h"
10
+ #include "zstds_ext/common.h"
12
11
 
13
12
  typedef struct {
14
- ZSTD_CCtx* ctx;
15
- uint8_t* destination_buffer;
16
- size_t destination_buffer_length;
17
- uint8_t* remaining_destination_buffer;
18
- size_t remaining_destination_buffer_length;
13
+ ZSTD_CCtx* ctx;
14
+ zstds_ext_byte_t* destination_buffer;
15
+ size_t destination_buffer_length;
16
+ zstds_ext_byte_t* remaining_destination_buffer;
17
+ size_t remaining_destination_buffer_length;
19
18
  } zstds_ext_compressor_t;
20
19
 
21
20
  VALUE zstds_ext_allocate_compressor(VALUE klass);
@@ -3,12 +3,9 @@
3
3
 
4
4
  #include "zstds_ext/stream/decompressor.h"
5
5
 
6
- #include <stdint.h>
7
- #include <stdlib.h>
8
6
  #include <zstd.h>
9
7
 
10
8
  #include "ruby.h"
11
- #include "zstds_ext/common.h"
12
9
  #include "zstds_ext/error.h"
13
10
  #include "zstds_ext/option.h"
14
11
 
@@ -19,7 +16,7 @@ static void free_decompressor(zstds_ext_decompressor_t* decompressor_ptr)
19
16
  ZSTD_freeDCtx(ctx);
20
17
  }
21
18
 
22
- uint8_t* destination_buffer = decompressor_ptr->destination_buffer;
19
+ zstds_ext_byte_t* destination_buffer = decompressor_ptr->destination_buffer;
23
20
  if (destination_buffer != NULL) {
24
21
  free(destination_buffer);
25
22
  }
@@ -68,7 +65,7 @@ VALUE zstds_ext_initialize_decompressor(VALUE self, VALUE options)
68
65
  destination_buffer_length = ZSTD_DStreamOutSize();
69
66
  }
70
67
 
71
- uint8_t* destination_buffer = malloc(destination_buffer_length);
68
+ zstds_ext_byte_t* destination_buffer = malloc(destination_buffer_length);
72
69
  if (destination_buffer == NULL) {
73
70
  ZSTD_freeDCtx(ctx);
74
71
  zstds_ext_raise_error(ZSTDS_EXT_ERROR_ALLOCATE_FAILED);
@@ -129,9 +126,9 @@ VALUE zstds_ext_decompressor_read_result(VALUE self)
129
126
  GET_DECOMPRESSOR(self);
130
127
  DO_NOT_USE_AFTER_CLOSE(decompressor_ptr);
131
128
 
132
- uint8_t* destination_buffer = decompressor_ptr->destination_buffer;
133
- size_t destination_buffer_length = decompressor_ptr->destination_buffer_length;
134
- size_t remaining_destination_buffer_length = decompressor_ptr->remaining_destination_buffer_length;
129
+ zstds_ext_byte_t* destination_buffer = decompressor_ptr->destination_buffer;
130
+ size_t destination_buffer_length = decompressor_ptr->destination_buffer_length;
131
+ size_t remaining_destination_buffer_length = decompressor_ptr->remaining_destination_buffer_length;
135
132
 
136
133
  const char* result = (const char*)destination_buffer;
137
134
  size_t result_length = destination_buffer_length - remaining_destination_buffer_length;
@@ -156,7 +153,7 @@ VALUE zstds_ext_decompressor_close(VALUE self)
156
153
  decompressor_ptr->ctx = NULL;
157
154
  }
158
155
 
159
- uint8_t* destination_buffer = decompressor_ptr->destination_buffer;
156
+ zstds_ext_byte_t* destination_buffer = decompressor_ptr->destination_buffer;
160
157
  if (destination_buffer != NULL) {
161
158
  free(destination_buffer);
162
159
 
@@ -4,18 +4,17 @@
4
4
  #if !defined(ZSTDS_EXT_STREAM_DECOMPRESSOR_H)
5
5
  #define ZSTDS_EXT_STREAM_DECOMPRESSOR_H
6
6
 
7
- #include <stdint.h>
8
- #include <stdlib.h>
9
7
  #include <zstd.h>
10
8
 
11
9
  #include "ruby.h"
10
+ #include "zstds_ext/common.h"
12
11
 
13
12
  typedef struct {
14
- ZSTD_DCtx* ctx;
15
- uint8_t* destination_buffer;
16
- size_t destination_buffer_length;
17
- uint8_t* remaining_destination_buffer;
18
- size_t remaining_destination_buffer_length;
13
+ ZSTD_DCtx* ctx;
14
+ zstds_ext_byte_t* destination_buffer;
15
+ size_t destination_buffer_length;
16
+ zstds_ext_byte_t* remaining_destination_buffer;
17
+ size_t remaining_destination_buffer_length;
19
18
  } zstds_ext_decompressor_t;
20
19
 
21
20
  VALUE zstds_ext_allocate_decompressor(VALUE klass);
@@ -3,13 +3,10 @@
3
3
 
4
4
  #include "zstds_ext/string.h"
5
5
 
6
- #include <stdint.h>
7
- #include <stdlib.h>
8
6
  #include <zstd.h>
9
7
 
10
8
  #include "ruby.h"
11
9
  #include "zstds_ext/buffer.h"
12
- #include "zstds_ext/common.h"
13
10
  #include "zstds_ext/error.h"
14
11
  #include "zstds_ext/macro.h"
15
12
  #include "zstds_ext/option.h"
@@ -65,7 +62,7 @@ static inline zstds_ext_result_t compress(
65
62
  size_t remaining_destination_buffer_length = destination_buffer_length;
66
63
 
67
64
  while (true) {
68
- out_buffer.dst = (uint8_t*)RSTRING_PTR(destination_value) + destination_length;
65
+ out_buffer.dst = (zstds_ext_byte_t*)RSTRING_PTR(destination_value) + destination_length;
69
66
  out_buffer.size = remaining_destination_buffer_length;
70
67
  out_buffer.pos = 0;
71
68
 
@@ -166,7 +163,7 @@ static inline zstds_ext_result_t decompress(
166
163
  size_t remaining_destination_buffer_length = destination_buffer_length;
167
164
 
168
165
  while (true) {
169
- out_buffer.dst = (uint8_t*)RSTRING_PTR(destination_value) + destination_length;
166
+ out_buffer.dst = (zstds_ext_byte_t*)RSTRING_PTR(destination_value) + destination_length;
170
167
  out_buffer.size = remaining_destination_buffer_length;
171
168
  out_buffer.pos = 0;
172
169
 
@@ -22,6 +22,8 @@ module ZSTDS
22
22
  open_files(source, destination) do |source_io, destination_io|
23
23
  ZSTDS._native_compress_io source_io, destination_io, options
24
24
  end
25
+
26
+ nil
25
27
  end
26
28
 
27
29
  def self.decompress(source, destination, options = {})
@@ -33,6 +35,8 @@ module ZSTDS
33
35
  open_files(source, destination) do |source_io, destination_io|
34
36
  ZSTDS._native_decompress_io source_io, destination_io, options
35
37
  end
38
+
39
+ nil
36
40
  end
37
41
 
38
42
  private_class_method def self.open_files(source, destination, &_block)
@@ -166,9 +166,8 @@ module ZSTDS
166
166
  end
167
167
 
168
168
  dictionary = options[:dictionary]
169
- unless dictionary.nil?
170
- raise ValidateError, "invalid dictionary" unless dictionary.is_a? Dictionary
171
- end
169
+ raise ValidateError, "invalid dictionary" unless
170
+ dictionary.nil? || dictionary.is_a?(Dictionary)
172
171
 
173
172
  options
174
173
  end
@@ -17,23 +17,19 @@ module ZSTDS
17
17
 
18
18
  include Delegates
19
19
 
20
- attr_reader :io
21
- attr_reader :stat
22
- attr_reader :external_encoding
23
- attr_reader :internal_encoding
24
- attr_reader :transcode_options
25
- attr_reader :pos
20
+ attr_reader :io, :stat, :external_encoding, :internal_encoding, :transcode_options, :pos
21
+
26
22
  alias tell pos
27
23
 
28
- def initialize(io, external_encoding: nil, internal_encoding: nil, transcode_options: {})
24
+ def initialize(io, options = {})
29
25
  @raw_stream = create_raw_stream
30
26
 
31
27
  Validation.validate_io io
32
28
  @io = io
33
29
 
34
- @stat = Stat.new @io.stat
30
+ @stat = Stat.new @io.stat if @io.respond_to? :stat
35
31
 
36
- set_encoding external_encoding, internal_encoding, transcode_options
32
+ set_encoding options[:external_encoding], options[:internal_encoding], options[:transcode_options]
37
33
  reset_buffer
38
34
  reset_io_advise
39
35
 
@@ -50,8 +46,8 @@ module ZSTDS
50
46
 
51
47
  protected def reset_io_advise
52
48
  # Both compressor and decompressor need sequential io access.
53
- @io.advise :sequential
54
- rescue ::Errno::ESPIPE # rubocop:disable Lint/HandleExceptions
49
+ @io.advise :sequential if @io.respond_to? :advise
50
+ rescue ::Errno::ESPIPE
55
51
  # ok
56
52
  end
57
53
 
@@ -126,7 +122,8 @@ module ZSTDS
126
122
  def rewind
127
123
  @raw_stream = create_raw_stream
128
124
 
129
- @io.rewind
125
+ @io.rewind if @io.respond_to? :rewind
126
+
130
127
  reset_buffer
131
128
  reset_io_advise
132
129
 
@@ -19,11 +19,13 @@ module ZSTDS
19
19
 
20
20
  def flush(&writer)
21
21
  write_result(&writer)
22
+
23
+ nil
22
24
  end
23
25
 
24
- protected def flush_destination_buffer(&writer)
26
+ protected def more_destination(&writer)
25
27
  result_bytesize = write_result(&writer)
26
- raise NotEnoughDestinationError, "not enough destination" if result_bytesize == 0
28
+ raise NotEnoughDestinationError, "not enough destination" if result_bytesize.zero?
27
29
  end
28
30
 
29
31
  protected def write_result(&_writer)
@@ -44,6 +46,8 @@ module ZSTDS
44
46
 
45
47
  @native_stream.close
46
48
  @is_closed = true
49
+
50
+ nil
47
51
  end
48
52
 
49
53
  def closed?
@@ -39,13 +39,15 @@ module ZSTDS
39
39
 
40
40
  if need_more_destination
41
41
  source = source.byteslice bytes_written, source.bytesize - bytes_written
42
- flush_destination_buffer(&writer)
42
+ more_destination(&writer)
43
43
  next
44
44
  end
45
45
 
46
46
  unless bytes_written == source.bytesize
47
+ # :nocov:
47
48
  # Compressor write should eat all provided "source" without remainder.
48
49
  raise UnexpectedError, "unexpected error"
50
+ # :nocov:
49
51
  end
50
52
 
51
53
  break
@@ -63,7 +65,7 @@ module ZSTDS
63
65
  need_more_destination = @native_stream.flush
64
66
 
65
67
  if need_more_destination
66
- flush_destination_buffer(&writer)
68
+ more_destination(&writer)
67
69
  next
68
70
  end
69
71
 
@@ -71,8 +73,6 @@ module ZSTDS
71
73
  end
72
74
 
73
75
  super
74
-
75
- nil
76
76
  end
77
77
 
78
78
  def close(&writer)
@@ -84,7 +84,7 @@ module ZSTDS
84
84
  need_more_destination = @native_stream.finish
85
85
 
86
86
  if need_more_destination
87
- flush_destination_buffer(&writer)
87
+ more_destination(&writer)
88
88
  next
89
89
  end
90
90
 
@@ -92,8 +92,6 @@ module ZSTDS
92
92
  end
93
93
 
94
94
  super
95
-
96
- nil
97
95
  end
98
96
  end
99
97
  end
@@ -34,7 +34,7 @@ module ZSTDS
34
34
 
35
35
  if need_more_destination
36
36
  source = source.byteslice bytes_read, source.bytesize - bytes_read
37
- flush_destination_buffer(&writer)
37
+ more_destination(&writer)
38
38
  next
39
39
  end
40
40
 
@@ -51,8 +51,6 @@ module ZSTDS
51
51
  Validation.validate_proc writer
52
52
 
53
53
  super
54
-
55
- nil
56
54
  end
57
55
 
58
56
  def close(&writer)
@@ -61,8 +59,6 @@ module ZSTDS
61
59
  Validation.validate_proc writer
62
60
 
63
61
  super
64
-
65
- nil
66
62
  end
67
63
  end
68
64
  end
@@ -20,79 +20,60 @@ module ZSTDS
20
20
 
21
21
  initialize_source_buffer_length
22
22
  reset_io_remainder
23
+ reset_need_to_flush
23
24
 
24
25
  @lineno = 0
25
26
  end
26
27
 
28
+ protected def create_raw_stream
29
+ Raw::Decompressor.new @options
30
+ end
31
+
27
32
  protected def initialize_source_buffer_length
28
33
  source_buffer_length = @options[:source_buffer_length]
29
34
  Validation.validate_not_negative_integer source_buffer_length unless source_buffer_length.nil?
30
35
 
31
36
  source_buffer_length = Buffer::DEFAULT_SOURCE_BUFFER_LENGTH_FOR_DECOMPRESSOR \
32
- if source_buffer_length == 0 || source_buffer_length.nil?
37
+ if source_buffer_length.nil? || source_buffer_length.zero?
33
38
 
34
39
  @source_buffer_length = source_buffer_length
35
40
  end
36
41
 
37
- protected def create_raw_stream
38
- Raw::Decompressor.new @options
39
- end
40
-
41
42
  protected def reset_io_remainder
42
43
  @io_remainder = ::String.new :encoding => ::Encoding::BINARY
43
44
  end
44
45
 
46
+ protected def reset_need_to_flush
47
+ @need_to_flush = false
48
+ end
49
+
45
50
  # -- synchronous --
46
51
 
47
52
  def read(bytes_to_read = nil, out_buffer = nil)
48
53
  Validation.validate_not_negative_integer bytes_to_read unless bytes_to_read.nil?
49
54
  Validation.validate_string out_buffer unless out_buffer.nil?
50
55
 
51
- return ::String.new :encoding => ::Encoding::BINARY if bytes_to_read == 0
52
-
53
56
  unless bytes_to_read.nil?
57
+ return ::String.new :encoding => ::Encoding::BINARY if bytes_to_read.zero?
54
58
  return nil if eof?
55
59
 
56
- read_more_from_buffer until @buffer.bytesize >= bytes_to_read || @io.eof?
60
+ append_io_data @io.read(@source_buffer_length) while @buffer.bytesize < bytes_to_read && !@io.eof?
61
+ flush_io_data if @buffer.bytesize < bytes_to_read
57
62
 
58
63
  return read_bytes_from_buffer bytes_to_read, out_buffer
59
64
  end
60
65
 
61
- read_more_from_buffer until @io.eof?
62
-
63
- result = @buffer
64
- reset_buffer
65
- @pos += result.bytesize
66
+ append_io_data @io.read(@source_buffer_length) until @io.eof?
67
+ flush_io_data
66
68
 
67
- result.force_encoding @external_encoding unless @external_encoding.nil?
68
- result = transcode_to_internal result
69
- result = out_buffer.replace result unless out_buffer.nil?
70
-
71
- result
72
- end
73
-
74
- protected def read_more_from_buffer
75
- io_data = @io.read @source_buffer_length
76
- append_io_data_to_buffer io_data
77
- end
78
-
79
- def readpartial(bytes_to_read = nil, out_buffer = nil)
80
- raise ::EOFError if eof?
81
-
82
- readpartial_from_buffer until @buffer.bytesize >= bytes_to_read || @io.eof?
83
-
84
- read_bytes_from_buffer bytes_to_read, out_buffer
85
- end
86
-
87
- protected def readpartial_from_buffer
88
- io_data = @io.readpartial @source_buffer_length
89
- append_io_data_to_buffer io_data
69
+ read_buffer out_buffer
90
70
  end
91
71
 
92
72
  def rewind
93
73
  raw_wrapper :close
94
74
 
95
75
  reset_io_remainder
76
+ reset_need_to_flush
96
77
 
97
78
  super
98
79
  end
@@ -103,25 +84,61 @@ module ZSTDS
103
84
  super
104
85
  end
105
86
 
87
+ def eof?
88
+ empty? && @io.eof?
89
+ end
90
+
106
91
  # -- asynchronous --
107
92
 
93
+ def readpartial(bytes_to_read, out_buffer = nil)
94
+ read_more_nonblock(bytes_to_read, out_buffer) { @io.readpartial @source_buffer_length }
95
+ end
96
+
108
97
  def read_nonblock(bytes_to_read, out_buffer = nil, *options)
109
- raise ::EOFError if eof?
98
+ read_more_nonblock(bytes_to_read, out_buffer) { @io.read_nonblock(@source_buffer_length, *options) }
99
+ end
100
+
101
+ protected def read_more_nonblock(bytes_to_read, out_buffer, &_block)
102
+ Validation.validate_not_negative_integer bytes_to_read
103
+ Validation.validate_string out_buffer unless out_buffer.nil?
104
+
105
+ return ::String.new :encoding => ::Encoding::BINARY if bytes_to_read.zero?
106
+
107
+ io_provided_eof_error = false
110
108
 
111
- read_more_from_buffer_nonblock(*options) until @buffer.bytesize >= bytes_to_read || @io.eof?
109
+ if @buffer.bytesize < bytes_to_read
110
+ begin
111
+ append_io_data yield
112
+ rescue ::EOFError
113
+ io_provided_eof_error = true
114
+ end
115
+ end
116
+
117
+ flush_io_data if @buffer.bytesize < bytes_to_read
118
+ raise ::EOFError if empty? && io_provided_eof_error
112
119
 
113
120
  read_bytes_from_buffer bytes_to_read, out_buffer
114
121
  end
115
122
 
116
- protected def read_more_from_buffer_nonblock(*options)
117
- io_data = @io.read_nonblock @source_buffer_length, *options
118
- append_io_data_to_buffer io_data
123
+ # -- common --
124
+
125
+ protected def append_io_data(io_data)
126
+ io_portion = @io_remainder + io_data
127
+ bytes_read = raw_wrapper :read, io_portion
128
+ @io_remainder = io_portion.byteslice bytes_read, io_portion.bytesize - bytes_read
129
+
130
+ # Even empty io data may require flush.
131
+ @need_to_flush = true
119
132
  end
120
133
 
121
- # -- common --
134
+ protected def flush_io_data
135
+ raw_wrapper :flush
122
136
 
123
- def eof?
124
- @io.eof? && @buffer.bytesize == 0
137
+ @need_to_flush = false
138
+ end
139
+
140
+ protected def empty?
141
+ !@need_to_flush && @buffer.bytesize.zero?
125
142
  end
126
143
 
127
144
  protected def read_bytes_from_buffer(bytes_to_read, out_buffer)
@@ -136,18 +153,20 @@ module ZSTDS
136
153
  result
137
154
  end
138
155
 
139
- protected def append_io_data_to_buffer(io_data)
140
- io_portion = @io_remainder + io_data
141
- bytes_read = raw_wrapper :read, io_portion
142
- @io_remainder = io_portion.byteslice bytes_read, io_portion.bytesize - bytes_read
156
+ protected def read_buffer(out_buffer)
157
+ result = @buffer
158
+ reset_buffer
159
+ @pos += result.bytesize
143
160
 
144
- # We should just ignore case when "io.eof?" appears but "io_remainder" is not empty.
145
- # Ancient compress implementations can write bytes from not initialized buffer parts to output.
146
- raw_wrapper :flush if @io.eof?
161
+ result.force_encoding @external_encoding unless @external_encoding.nil?
162
+ result = transcode_to_internal result
163
+
164
+ result = out_buffer.replace result unless out_buffer.nil?
165
+ result
147
166
  end
148
167
 
149
168
  protected def transcode_to_internal(data)
150
- data = data.encode @internal_encoding, @transcode_options unless @internal_encoding.nil?
169
+ data = data.encode @internal_encoding, **@transcode_options unless @internal_encoding.nil?
151
170
  data
152
171
  end
153
172