Mercurial > prosody-hg
comparison util/json.lua @ 5561:52eef11cd8af
util.json: Optimize long string parsing.
| author | Waqas Hussain <waqas20@gmail.com> |
|---|---|
| date | Sun, 05 May 2013 15:02:33 -0400 |
| parents | 9d7349bbe4d2 |
| children | a6b8fb827e2a |
comparison
equal
deleted
inserted
replaced
| 5553:7baf59444b31 | 5561:52eef11cd8af |
|---|---|
| 256 checkandskip(c); | 256 checkandskip(c); |
| 257 end | 257 end |
| 258 return val; | 258 return val; |
| 259 end | 259 end |
| 260 local function readstring() | 260 local function readstring() |
| 261 local s = ""; | 261 local s = {}; |
| 262 checkandskip("\""); | 262 checkandskip("\""); |
| 263 while ch do | 263 while ch do |
| 264 while ch and ch ~= "\\" and ch ~= "\"" do | 264 while ch and ch ~= "\\" and ch ~= "\"" do |
| 265 s = s..ch; next(); | 265 t_insert(s, ch); next(); |
| 266 end | 266 end |
| 267 if ch == "\\" then | 267 if ch == "\\" then |
| 268 next(); | 268 next(); |
| 269 if unescapes[ch] then | 269 if unescapes[ch] then |
| 270 s = s..unescapes[ch]; | 270 t_insert(s, unescapes[ch]); |
| 271 next(); | 271 next(); |
| 272 elseif ch == "u" then | 272 elseif ch == "u" then |
| 273 local seq = ""; | 273 local seq = ""; |
| 274 for i=1,4 do | 274 for i=1,4 do |
| 275 next(); | 275 next(); |
| 276 if not ch then error("unexpected eof in string"); end | 276 if not ch then error("unexpected eof in string"); end |
| 277 if not ch:match("[0-9a-fA-F]") then error("invalid unicode escape sequence in string"); end | 277 if not ch:match("[0-9a-fA-F]") then error("invalid unicode escape sequence in string"); end |
| 278 seq = seq..ch; | 278 seq = seq..ch; |
| 279 end | 279 end |
| 280 s = s..codepoint_to_utf8(tonumber(seq, 16)); | 280 t_insert(s, codepoint_to_utf8(tonumber(seq, 16))); |
| 281 next(); | 281 next(); |
| 282 else error("invalid escape sequence in string"); end | 282 else error("invalid escape sequence in string"); end |
| 283 end | 283 end |
| 284 if ch == "\"" then | 284 if ch == "\"" then |
| 285 next(); | 285 next(); |
| 286 return s; | 286 return t_concat(s); |
| 287 end | 287 end |
| 288 end | 288 end |
| 289 error("eof while reading string"); | 289 error("eof while reading string"); |
| 290 end | 290 end |
| 291 local function readnumber() | 291 local function readnumber() |
