few optimizations master
authorChristian Thaeter <ct@pipapo.org>
Wed, 8 Mar 2017 14:58:18 +0000 (15:58 +0100)
committerChristian Thaeter <ct@pipapo.org>
Wed, 8 Mar 2017 14:58:18 +0000 (15:58 +0100)
proto.lua

index 9572045..b2c93aa 100644 (file)
--- a/proto.lua
+++ b/proto.lua
@@ -15,7 +15,6 @@
 
 -- Object is the root object for all objects to be created
 local Object = {}
-setmetatable(Object, Object)
 
 local function indexfn (self, key)
     local erased = rawget(self,"__proto_erased")
@@ -23,7 +22,7 @@ local function indexfn (self, key)
         return nil
     end
 
-    local parents = rawget(self,"__proto_parents") or {}
+    local parents = rawget(self,"__proto_parents")
     for i=1,#parents do
         local value = parents[i][key]
         if value then
@@ -40,8 +39,8 @@ end
 ---     - Object references define objects to inherit from
 ---     - Strings define members to copy up
 function Object:proto_clone(newobject)
-    assert(not newobject or type(newobject) == 'table' and newobject.__index == nil, "Wrong argument, pass {...} not (...)")
     newobject = newobject or {}
+    assert (not newobject.proto_clone, "Bad clone, use {...} not (...)")
     setmetatable(newobject, newobject)
     newobject.__index = self
 
@@ -50,6 +49,7 @@ function Object:proto_clone(newobject)
     for i=1,#newobject do
         local subject = newobject[i]
         newobject[i] = nil
+
         if type(subject) == 'string' then
             newobject[subject] = self[subject]
 
@@ -106,7 +106,7 @@ local function next_prototype(state)
 
         if object then
             state.objects_done[object] = true
-            state.state = {oldstate = mystate, parents= rawget(object, "__proto_parents") or {object.__index} or {}}
+            state.state = {oldstate = mystate, parents= rawget(object, "__proto_parents") or {object.__index}}
             return object
         end
 
@@ -127,10 +127,12 @@ local function next_member(state)
     local value, mystate
 
     repeat
-        local erased = rawget(state.object,"__proto_erased") or {}
+        local erased = rawget(state.object,"__proto_erased")
 
-        for e,_ in pairs(erased) do
-            state.members_done[e] = true
+        if erased then
+            for e,_ in pairs(erased) do
+                state.members_done[e] = true
+            end
         end
 
         mystate = state.state
@@ -169,9 +171,11 @@ local function next_value(state)
         state.object = next_prototype(state)
         if state.object then
 
-            local erased = rawget(state.object,"__proto_erased") or {}
-            if erased[state.name] then
-                return state.object, nil
+            local erased = rawget(state.object,"__proto_erased")
+            if erased then
+                if erased[state.name] then
+                    return state.object, nil
+                end
             end
 
             local value = rawget(state.object, state.name)
@@ -200,7 +204,7 @@ function Object:proto_objectof(name)
     if rawget(self, name) then
         return self
     else
-        local parents = rawget(self, "__proto_parents") or {self.__index} or {}
+        local parents = rawget(self, "__proto_parents") or {self.__index}
         for i=1,#parents do
             local obj = parents[i]:proto_objectof(name)
             if obj then
@@ -217,7 +221,7 @@ function Object:proto_isa(prototype)
     if self == prototype then
         return true
     else
-        local parents = rawget(self, "__proto_parents") or {self.__index} or {}
+        local parents = rawget(self, "__proto_parents") or {self.__index}
         for i=1,#parents do
             if parents[i]:proto_isa(prototype) then
                 return true