From b4dee8db54816b7325629a65e94dc75c0ce9ebf0 Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Thu, 26 Feb 2015 15:36:15 +0000 Subject: [PATCH] elua: update eo bindings for lualian generated code --- src/bindings/luajit/eo.lua | 82 ++++++++++++++++++++++++---------------------- 1 file changed, 43 insertions(+), 39 deletions(-) diff --git a/src/bindings/luajit/eo.lua b/src/bindings/luajit/eo.lua index 8ebbb38..09add8b 100644 --- a/src/bindings/luajit/eo.lua +++ b/src/bindings/luajit/eo.lua @@ -174,19 +174,52 @@ M.eo_class_get = function(name) return eo_classes[name] end -M.class_register = function(name, parent, body, eocl) - parent = classes[parent] - if body.__events then - body.__events = parent.__events:clone(body.__events) +local inherit_meta = function(body, field, parents, mixins) + local o = body[field] + if o then + o = parents[1][field]:clone(o) + for i = 2, #parents do o:add_parent(parents[i][field]) end + for i = 1, #mixins do o:add_mixin (mixins [i][field]) end + body[field] = o end - if body.__properties then - body.__properties = parent.__properties:clone(body.__properties) +end + +M.class_register = function(name, parents, mixins, body, eocl) + -- map given names to objects + local pars = {} + for i = 1, #parents do pars[i] = classes[parents[i]] end + -- for mixins, we need to check if it hasn't already been mixed in + -- in some parent (doesn't matter how deep down the tree), because + -- if it has, we need to skip it (for proper inheritance lookup order) + local mins = {} + local midx = 1 + for i = 1, #mixins do + local mixin = mixins[i] + local ck, hasmi = "__mixin_" .. mixin, false + if mixin[ck] then + for i = 1, #pars do + if pars[i][ck] then + hasmi = true + break + end + end + end + if not hasmi then + mins[midx] = mixin + midx = midx + 1 + end end + + inherit_meta(body, "__events" , pars, mins) + inherit_meta(body, "__properties", pars, mins) + + local lcl = pars[1]:clone(body) + for i = 2, #pars do lcl:add_parent(pars[i]) end + for i = 1, #mins do lcl:add_mixin (mins[i]) end + local addr = eo_class_addr_get(eocl) - classes[name] = parent:clone(body) - classes[addr] = classes[name] - eo_classes[name] = eocl - eo_classes[addr] = eocl + classes [name], classes [addr] = lcl , lcl + eo_classes[name], eo_classes[addr] = eocl, eocl end M.class_unregister = function(name) @@ -197,35 +230,6 @@ M.class_unregister = function(name) eo_classes[addr] = nil end -local mixin_tbl = function(cl, mixin, field) - local mxt = mixin[field] - if mxt then - local clt = rawget(cl, field) - if not clt then - -- will always succeed, even if it means deep lookups - clt = cl.__protos[1][field]:clone() - rawset(cl, field, clt) - end - for k, v in pairs(mxt) do clt[k] = v end - end -end - -M.class_mixin = function(name, mixin) - local cl = classes[name] - local mi = classes[mixin] - local ck = "__mixin_" .. mixin - -- do not mixin if it already has been mixed in previously - -- but only do it for mixins, not for ifaces, for proper lookup order - if mi[ck] and cl[ck] then - return - end - -- mixin properties/events - mixin_tbl(cl, mi, "__properties") - mixin_tbl(cl, mi, "__events") - -- mixin the rest - cl:mixin(classes[mixin]) -end - local obj_gccb = function(obj) eo.eo_unref(obj) end -- 2.7.4