diff options
| author | ruki <[email protected]> | 2025-04-27 22:33:55 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2025-08-28 11:35:53 +0800 |
| commit | 8b976dd744fc18d617e00655631cbca8a1f19035 (patch) | |
| tree | 058fdb2342441ac49e7123fe6ae96f5fed4d7aee /xmake/core/base/serialize.lua | |
| parent | ec3153a9254fb8d3f93371b4026dc1000afcae7c (diff) | |
optimize thread load/save
Diffstat (limited to 'xmake/core/base/serialize.lua')
| -rw-r--r-- | xmake/core/base/serialize.lua | 42 |
1 files changed, 14 insertions, 28 deletions
diff --git a/xmake/core/base/serialize.lua b/xmake/core/base/serialize.lua index 665fe04a6..87c810536 100644 --- a/xmake/core/base/serialize.lua +++ b/xmake/core/base/serialize.lua @@ -25,12 +25,26 @@ local stub = serialize._stub or {} serialize._stub = stub serialize._dump = serialize._dump or string._dump or string.dump serialize._BCTAG = xmake._LUAJIT and "\27LJ" or "\27Lua" +stub.isstub = setmetatable({}, { __tostring = function() return "stub indentifier" end }) +stub.__index = stub -- load modules local math = require("base/math") local table = require("base/table") local hashset = require("base/hashset") +function stub:__call(root, fenv) + return self.resolver(root, fenv, table.unpack(self.params, 1, self.params.n)) +end + +function stub:__tostring() + local fparams = {} + for i = 1, self.params.n do + fparams[i] = serialize._make(self.params[i], {}) + end + return string.format("%s(%s)", self.name, table.concat(fparams, ", ")) +end + -- reserved keywords in lua function serialize._keywords() local keywords = serialize._KEYWORDS @@ -339,22 +353,6 @@ function serialize.save(obj, opt) return (#dump < #result) and dump or result end --- init stub metatable -stub.isstub = setmetatable({}, { __tostring = function() return "stub indentifier" end }) -stub.__index = stub - -function stub:__call(root, fenv) - return self.resolver(root, fenv, table.unpack(self.params, 1, self.params.n)) -end - -function stub:__tostring() - local fparams = {} - for i = 1, self.params.n do - fparams[i] = serialize._make(self.params[i], {}) - end - return string.format("%s(%s)", self.name, table.concat(fparams, ", ")) -end - -- called by functions in deserialize environment -- create a function (called stub) to finish deserialization function serialize._createstub(name, resolver, env, ...) @@ -408,23 +406,13 @@ end -- create a env for deserialze load() call function serialize._createenv() - - -- init env local env = { nan = math.nan, inf = math.huge } - - -- resolve reference function env.ref(...) - -- load ref return serialize._createstub("ref", serialize._resolveref, env, ...) end - - -- load function function env.func(...) - -- load func return serialize._createstub("func", serialize._resolvefunction, env, ...) end - - -- return new env return env end @@ -442,7 +430,6 @@ function serialize._load(str) local env = serialize._createenv() local script, errors = load(str, binary and "=(b)" or "=(t)", binary and "b" or "t", env) if script then - -- load obj local ok, obj = pcall(script) if ok then result = obj @@ -451,7 +438,6 @@ function serialize._load(str) result, errors = serialize._resolvestub(result, result, fenv, "<root>") end else - -- error errors = tostring(obj) end end |
