From 70b7b59f5f522f4e2e008ee725568f036ffcaf6b Mon Sep 17 00:00:00 2001
From: Sam Atman <atmanistan@gmail.com>
Date: Sat, 30 Nov 2019 18:37:07 -0800
Subject: [PATCH] Localize ret value and recursively call countedArrays

---
 src/bindings/lua/hammer.lua | 24 +++++++++++++++++-------
 1 file changed, 17 insertions(+), 7 deletions(-)

diff --git a/src/bindings/lua/hammer.lua b/src/bindings/lua/hammer.lua
index 29bc8699..02479245 100644
--- a/src/bindings/lua/hammer.lua
+++ b/src/bindings/lua/hammer.lua
@@ -189,6 +189,19 @@ local hammer = {}
 hammer.parser = ffi.metatype("HParser", mt)
 
 local counted_array
+
+
+
+local function _castCountedArray(array)
+    if array == nil then return nil end
+    if array.elements == nil then return nil end
+    local ret = {}
+    for i = 0, tonumber(array.used) do
+      ret[#ret+1] = array.elements[i]()
+    end
+    return ret
+end
+
 local arr_mt = {
   __index = function(table, key)
     return table.elements[key]
@@ -203,13 +216,7 @@ local arr_mt = {
       end
     end
   end,
-  __call = function(self)
-    ret = {}
-    for i, v in ipairs(self)
-      do ret[#ret+1] = v()
-    end
-    return ret
-  end
+  __call = _castCountedArray,
 }
 counted_array = ffi.metatype("HCountedArray", arr_mt)
 
@@ -235,9 +242,11 @@ local parse_result = ffi.metatype("HParseResult", result_mt)
 
 local token_types = ffi.new("HTokenType")
 
+
 local parsed_token
 local tok_mt = {
   __call = function(self)
+     if self == nil then return nil end
      if self.token_type == ffi.C.TT_BYTES then
        return self.bytes()
      elseif self.token_type == ffi.C.TT_SINT then
@@ -247,6 +256,7 @@ local tok_mt = {
      elseif self.token_type == ffi.C.TT_SEQUENCE then
        return self.seq()
      end
+     return nil
   end
 }
 parsed_token = ffi.metatype("HParsedToken", tok_mt)
-- 
GitLab