mirror of
https://github.com/imezx/Warp.git
synced 2026-03-18 00:44:16 +00:00
rewrite(phase2): fix wU16 & experiment a cached machanism
This commit is contained in:
parent
3d32c4c87f
commit
04216ce24b
1 changed files with 17 additions and 6 deletions
|
|
@ -163,7 +163,7 @@ end
|
||||||
|
|
||||||
local function wU16(w: Writer, v: number)
|
local function wU16(w: Writer, v: number)
|
||||||
ensureSpace(w, 2)
|
ensureSpace(w, 2)
|
||||||
buffer.writei16(w.buf, w.cursor, v)
|
buffer.writeu16(w.buf, w.cursor, v)
|
||||||
w.cursor += 2
|
w.cursor += 2
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -210,6 +210,7 @@ local function wString(w: Writer, s: string)
|
||||||
end
|
end
|
||||||
|
|
||||||
local packValue: (w: Writer, v: any) -> ()
|
local packValue: (w: Writer, v: any) -> ()
|
||||||
|
local F32_TEST_BUF = buffer.create(4)
|
||||||
|
|
||||||
local function packNumber(w: Writer, n: number)
|
local function packNumber(w: Writer, n: number)
|
||||||
if n ~= n then
|
if n ~= n then
|
||||||
|
|
@ -267,9 +268,8 @@ local function packNumber(w: Writer, n: number)
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
-- float: try f32 first
|
-- float: try f32 first
|
||||||
local testBuf = buffer.create(4)
|
buffer.writef32(F32_TEST_BUF, 0, n)
|
||||||
buffer.writef32(testBuf, 0, n)
|
local f32Val = buffer.readf32(F32_TEST_BUF, 0)
|
||||||
local f32Val = buffer.readf32(testBuf, 0)
|
|
||||||
|
|
||||||
if f32Val == n or math.abs(n - f32Val) < math.abs(n) * 1e-6 then
|
if f32Val == n or math.abs(n - f32Val) < math.abs(n) * 1e-6 then
|
||||||
wByte(w, T_F32)
|
wByte(w, T_F32)
|
||||||
|
|
@ -1262,13 +1262,24 @@ local function compileReader(s: SchemaType): (buffer, number, { any }?) -> (any,
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local packerCache = setmetatable({}, { __mode = "k" })
|
||||||
|
local readerCache = setmetatable({}, { __mode = "k" })
|
||||||
|
|
||||||
local function packStrict(w: Writer, s: SchemaType, v: any)
|
local function packStrict(w: Writer, s: SchemaType, v: any)
|
||||||
local packer = compilePacker(s)
|
local packer = packerCache[s]
|
||||||
|
if not packer then
|
||||||
|
packer = compilePacker(s)
|
||||||
|
packerCache[s] = packer
|
||||||
|
end
|
||||||
packer(w, v)
|
packer(w, v)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function readStrict(buf: buffer, cursor: number, s: SchemaType, refs: { any }?): (any, number)
|
local function readStrict(buf: buffer, cursor: number, s: SchemaType, refs: { any }?): (any, number)
|
||||||
local reader = compileReader(s)
|
local reader = readerCache[s]
|
||||||
|
if not reader then
|
||||||
|
reader = compileReader(s)
|
||||||
|
readerCache[s] = reader
|
||||||
|
end
|
||||||
return reader(buf, cursor, refs)
|
return reader(buf, cursor, refs)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue