Adds support for Moonscript classes (#6)

Many thanks to @buckle2000
This commit is contained in:
buckle2000 2017-01-08 09:18:11 +08:00 committed by Robin Wellner
parent 3b8dae1dde
commit 3571bdb928
3 changed files with 43 additions and 4 deletions

View File

@ -47,5 +47,5 @@ send me a pull request!
## You can register classes? ## You can register classes?
Yes. At the moment, bitser supports MiddleClass, SECL, hump.class and Slither (and Yes. At the moment, bitser supports MiddleClass, SECL, hump.class, Slither and Moonscript classes (and
probably some other class libraries by accident). probably some other class libraries by accident).

View File

@ -176,7 +176,8 @@ local function write_table(value, seen)
local classname = (class_name_registry[value.class] -- MiddleClass local classname = (class_name_registry[value.class] -- MiddleClass
or class_name_registry[value.__baseclass] -- SECL or class_name_registry[value.__baseclass] -- SECL
or class_name_registry[getmetatable(value)] -- hump.class or class_name_registry[getmetatable(value)] -- hump.class
or class_name_registry[value.__class__]) -- Slither or class_name_registry[value.__class__] -- Slither
or class_name_registry[value.__class]) -- Moonscript class
if classname then if classname then
classkey = classkey_registry[classname] classkey = classkey_registry[classname]
Buffer_write_byte(242) Buffer_write_byte(242)
@ -354,6 +355,10 @@ local function deserialize_Slither(instance, class)
return getmetatable(class).allocate(instance) return getmetatable(class).allocate(instance)
end end
local function deserialize_Moonscript(instance, class)
return setmetatable(instance, class.__base)
end
return {dumps = function(value) return {dumps = function(value)
serialize(value) serialize(value)
return ffi.string(buf, buf_pos) return ffi.string(buf, buf_pos)
@ -381,7 +386,7 @@ end, unregister = function(name)
end, registerClass = function(name, class, classkey, deserializer) end, registerClass = function(name, class, classkey, deserializer)
if not class then if not class then
class = name class = name
name = class.__name__ or class.name name = class.__name__ or class.name or class.__name
end end
if not classkey then if not classkey then
if class.__instanceDict then if class.__instanceDict then
@ -391,7 +396,7 @@ end, registerClass = function(name, class, classkey, deserializer)
-- assume SECL -- assume SECL
classkey = '__baseclass' classkey = '__baseclass'
end end
-- assume hump.class, Slither, or something else that doesn't store the -- assume hump.class, Slither, Moonscript class or something else that doesn't store the
-- class directly on the instance -- class directly on the instance
end end
if not deserializer then if not deserializer then
@ -407,6 +412,9 @@ end, registerClass = function(name, class, classkey, deserializer)
elseif class.__name__ then elseif class.__name__ then
-- assume Slither -- assume Slither
deserializer = deserialize_Slither deserializer = deserialize_Slither
elseif class.__base then
-- assume Moonscript class
deserializer = deserialize_Moonscript
else else
error("no deserializer given for unsupported class library") error("no deserializer given for unsupported class library")
end end

View File

@ -163,6 +163,37 @@ describe("bitser", function()
assert.is_true(class.isinstance(serdeser(bojack), Horse)) assert.is_true(class.isinstance(serdeser(bojack), Horse))
bitser.unregisterClass('Horse') bitser.unregisterClass('Horse')
end) end)
it("serializes Moonscript class instances", function()
local Horse
do
local _class_0
local _base_0 = {}
_base_0.__index = _base_0
_class_0 = setmetatable({
__init = function(self, name)
self.name = name
self[1] = 'instance can be sequence'
end,
__base = _base_0,
__name = "Horse"}, {
__index = _base_0,
__call = function(cls, ...)
local _self_0 = setmetatable({}, _base_0)
cls.__init(_self_0, ...)
return _self_0
end
})
_base_0.__class = _class_0
Horse = _class_0
end
assert.are.same(Horse.__name, "Horse") -- to shut coveralls up
bitser.registerClass(Horse)
local bojack = Horse('Bojack Horseman')
test_serdeser(bojack)
local new_bojack = serdeser(bojack)
assert.are.equal(new_bojack.__class, Horse)
bitser.unregisterClass('Horse')
end)
it("serializes custom class instances", function() it("serializes custom class instances", function()
local Horse_mt = bitser.registerClass('Horse', {__index = {}}, nil, setmetatable) local Horse_mt = bitser.registerClass('Horse', {__index = {}}, nil, setmetatable)
local function Horse(name) local function Horse(name)