mirror of https://github.com/rxi/json.lua.git
Replaced use of string.sub() + .byte() in parse_string with just .byte()
Provides a noticeable speed improvement on both Lua5.2 and LuaJIT 2.0.2pull/6/head
parent
6fdbd28ed9
commit
425c8b3e88
16
json.lua
16
json.lua
|
@ -196,13 +196,14 @@ local function parse_string(str, i, chr)
|
|||
local has_escape = false
|
||||
local last
|
||||
for j = i + 1, #str do
|
||||
local x = str:sub(j, j)
|
||||
local x = str:byte(j)
|
||||
|
||||
if x:byte() < 32 then
|
||||
if x < 32 then
|
||||
decode_error(str, j, "control character in string")
|
||||
end
|
||||
|
||||
elseif last == "\\" then
|
||||
if x == "u" then
|
||||
if last == 92 then -- "\\" (escape char)
|
||||
if x == 117 then -- "u" (unicode escape sequence)
|
||||
local hex = str:sub(j + 1, j + 5)
|
||||
if not hex:find("%x%x%x%x") then
|
||||
decode_error(str, j, "invalid unicode escape in string")
|
||||
|
@ -213,14 +214,15 @@ local function parse_string(str, i, chr)
|
|||
has_unicode_escape = true
|
||||
end
|
||||
else
|
||||
if not escape_chars[x] then
|
||||
decode_error(str, j, "invalid escape char '" .. x .. "' in string")
|
||||
local c = string.char(x)
|
||||
if not escape_chars[c] then
|
||||
decode_error(str, j, "invalid escape char '" .. c .. "' in string")
|
||||
end
|
||||
has_escape = true
|
||||
end
|
||||
last = nil
|
||||
|
||||
elseif x == '"' then
|
||||
elseif x == 34 then -- '"' (end of string)
|
||||
local s = str:sub(i + 1, j - 1)
|
||||
if has_surrogate_escape then
|
||||
s = s:gsub("\\u[dD][89aAbB]..\\u....", parse_unicode_escape)
|
||||
|
|
Loading…
Reference in New Issue