Fixed parse_string() to handle "\\" correctly, added tests

pull/6/head
rxi 2015-08-19 19:27:52 +01:00
parent 50f4512c2c
commit 7f823abd2e
2 changed files with 9 additions and 4 deletions

View File

@ -214,11 +214,12 @@ local function parse_string(str, i, chr)
has_unicode_escape = true has_unicode_escape = true
end end
else else
if not escape_chars[x] then
decode_error(str, j, "invalid escape char '" .. x .. "' in string")
end
has_escape = true has_escape = true
end end
if not escape_chars[x] then last = nil
decode_error(str, j, "invalid escape char '" .. x .. "' in string")
end
elseif x == '"' then elseif x == '"' then
local s = str:sub(i + 1, j - 1) local s = str:sub(i + 1, j - 1)
@ -232,8 +233,10 @@ local function parse_string(str, i, chr)
s = s:gsub("\\.", escape_char_map_inv) s = s:gsub("\\.", escape_char_map_inv)
end end
return s, j + 1 return s, j + 1
else
last = x
end end
last = x
end end
decode_error(str, i, "expected closing quote for string") decode_error(str, i, "expected closing quote for string")
end end

View File

@ -152,6 +152,8 @@ test("decode escape", function()
[ [["\u263a"]] ] = '', [ [["\u263a"]] ] = '',
[ [["\ud83d\ude02"]] ] = '😂', [ [["\ud83d\ude02"]] ] = '😂',
[ [["\r\n\t\\\""]] ] = '\r\n\t\\"', [ [["\r\n\t\\\""]] ] = '\r\n\t\\"',
[ [["\\"]] ] = '\\',
[ [["\\\\"]] ] = '\\\\',
} }
for k, v in pairs(t) do for k, v in pairs(t) do
local res = json.decode(k) local res = json.decode(k)