diff --git a/lib/json/stream/buffer.rb b/lib/json/stream/buffer.rb index cbefd8b..f139060 100644 --- a/lib/json/stream/buffer.rb +++ b/lib/json/stream/buffer.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module JSON module Stream # A character buffer that expects a UTF-8 encoded stream of bytes. @@ -29,6 +31,7 @@ def initialize def <<(data) # Avoid state machine for complete UTF-8. if @buffer.empty? + data = data.dup data.force_encoding(Encoding::UTF_8) return data if data.valid_encoding? end diff --git a/lib/json/stream/parser.rb b/lib/json/stream/parser.rb index 33e7925..7e7e22b 100644 --- a/lib/json/stream/parser.rb +++ b/lib/json/stream/parser.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module JSON module Stream # Raised on any invalid JSON text. @@ -102,8 +104,8 @@ def initialize(&block) # Track parse stack. @stack = [] - @unicode = "" - @buf = "" + @unicode = +"" + @buf = +"" @pos = -1 # Register any observers in the block. @@ -178,7 +180,7 @@ def <<(data) @state = :end_key notify(:key, @buf) end - @buf = "" + @buf = +"" when BACKSLASH @state = :start_escape when CONTROL @@ -270,7 +272,7 @@ def <<(data) @buf << ch else end_value(@buf.to_i) - @buf = "" + @buf = +"" @pos -= 1 redo end @@ -291,7 +293,7 @@ def <<(data) @buf << ch else end_value(@buf.to_f) - @buf = "" + @buf = +"" @pos -= 1 redo end @@ -310,7 +312,7 @@ def <<(data) else error('Expected 0-9 digit') unless @buf =~ DIGIT_END end_value(@buf.to_f) - @buf = "" + @buf = +"" @pos -= 1 redo end @@ -326,7 +328,7 @@ def <<(data) @buf << ch else end_value(@buf.to_i) - @buf = "" + @buf = +"" @pos -= 1 redo end @@ -503,7 +505,7 @@ def keyword(word, value, re, ch) if @buf.size == word.size if @buf == word - @buf = "" + @buf = +"" end_value(value) else error("Expected #{word} keyword")