diff test/call_suite_aggrs/mk-cases.lua @ 521:a2de1d0a73f3

- more test code generator code sharing/abstraction/simplifications
author Tassilo Philipp
date Wed, 13 Apr 2022 10:06:40 +0200
parents 99819b874bac
children f7fec6699e21
line wrap: on
line diff
--- a/test/call_suite_aggrs/mk-cases.lua	Mon Apr 11 22:49:04 2022 +0200
+++ b/test/call_suite_aggrs/mk-cases.lua	Wed Apr 13 10:06:40 2022 +0200
@@ -6,18 +6,10 @@
 require"mk-cases"
 
 
-local max_numargs = 0
 
-
-
-function put_sig_rtype_first(sig)
-  return sig:sub(sig:find(')')+1,-1)..sig:sub(1,sig:find(')')-1)
-end
-
-
--- returns one case as str; accumulates unique idx => aggr-sig in aggrs
--- (sequentially) and aggr-sig => {body,name} in seen_aggrs (depth first for
--- nested aggrs, so sub-aggrs conveniently precede parents)
+-- returns: generated case str, num args; accumulates unique idx => aggr-sig in
+-- aggrs (sequentially) and aggr-sig => {body,name} in seen_aggrs (depth first
+-- for nested aggrs, so sub-aggrs conveniently precede parents)
 function mkcase(id, sig, aggrs, seen_aggrs)
   local sig = trim(sig)
   local fsig = put_sig_rtype_first(sig)
@@ -99,110 +91,13 @@
       end
     end
   end
-  max_numargs = math.max(max_numargs, pos)
   h[#h] = "){"
   if #h[6] == 1 then
     t[#t+1] = "ret_"..h[6].."("..pos..")}\n"
   else
     t[#t+1] = "ret_a("..pos..","..h[6]..")}\n"
   end
-  return table.concat(h,"")..table.concat(t,"")
-end
-
-
-function mkaggrdefs(aggrs, seen_aggrs)
-  local agg_defs  = { }
-  local agg_sizes = { }
-  local agg_sigs  = { }
-  local agg_names = { }
-
-  for a = 1, #aggrs do
-    local k = aggrs[a]
-    local v = seen_aggrs[k]
-    local am = v[1]            -- aggregate members
-    local at = v[2]            -- aggregate type
-    local an = at:match('A.*') -- aggregate name (w/o struct or union)
-
-    -- aggregate def
-    aggr_def = '/* '..k..' */\n'
-    if aggrpacking ~= 0 then
-      local pack = aggrpacking
-      if pack < 0 then
-        pack = math.floor(math.pow(2,math.floor(math.log(math.random(math.abs(pack)),2))))
-      end
-      aggr_def = aggr_def..'#pragma pack(push,'..pack..')\n'
-    end
-
-    aggr_def = aggr_def..at..' { '
-    for i = 1, #am, 2 do
-      aggr_def = aggr_def..am[i]..' '..am[i+1]..'; '
-    end
-    aggr_def = aggr_def..'};\n'
-
-    if aggrpacking ~= 0 then
-      aggr_def = aggr_def..'#pragma pack(pop)\n'
-    end
-
-    -- aggregate cp and cmp funcs
-    s = {
-      'void f_cp'..an..'('..at..' *x, const '..at..' *y) { ',
-      'int f_cmp'..an..'(const '..at..' *x, const '..at..' *y) { return '
-    }
-    o = { '=', '==', 'f_cp', 'f_cmp', '; ', ' && ', '', '1' }
-    for t = 1, 2 do
-      if t ~= 1 or aggrcpsimple == false then
-        aggr_def = aggr_def..s[t]
-        local b = {}
-        for i = 1, #am, 2 do
-          local mn, mc = split_array_decl(am[i+1]) -- aggr member name and (array) count
-          local fmt = ''
-          if mc ~= nil then -- need array suffixes?
-            fmt = '[%d]'
-          else
-            mc = 1
-          end
-       
-          for j = 1, mc do
-            name = mn..fmt:format(j-1)
-			amn = am[i]:match('A.*')
-            if amn then -- is aggr?
-              b[#b+1] = o[t+2]..amn..'(&x->'..name..', &y->'..name..')'
-            else
-              b[#b+1] = 'x->'..name..' '..o[t]..' y->'..name
-            end
-          end
-        end
-        if #b == 0 then  -- to handle empty aggregates
-          b[1] = o[t+6]
-        end
-        aggr_def = aggr_def..table.concat(b,o[t+4])..'; };\n'
-      end
-    end
-
-    -- write convenient dcNewAggr() helper/wrapper funcs
-    aggr_def = aggr_def..'DCaggr* f_touchdcst'..an..'() {\n\tstatic DCaggr* a = NULL;\n\tif(!a) {\n\t\ta = dcNewAggr('..(#am>>1)..', sizeof('..at..'));\n\t\t'
-    for i = 1, #am, 2 do
-      local mn, mc = split_array_decl(am[i+1])
-      if mc == nil then
-        mc = 1
-      end
-      amn = am[i]:match('A.*')
-      if amn then -- is aggr?
-        --aggr_def = aggr_def..'dcAggrField(at, DC_SIGCHAR_AGGREGATE, offsetof('..at..', '..mn..'), '..mc..', f_touchdcst'..amn..'());\n\t\t'
-        aggr_def = aggr_def.."AFa("..at..','..mn..','..mc..','..amn..')\n\t\t'
-      else
-        --aggr_def = aggr_def.."dcAggrField(at, '"..am[i].."', offsetof("..at..', '..mn..'), '..mc..');\n\t\t'
-        aggr_def = aggr_def.."AF('"..am[i].."',"..at..','..mn..','..mc..')\n\t\t'
-      end
-    end
-
-    agg_defs [#agg_defs  + 1] = aggr_def..'dcCloseAggr(a);\n\t}\n\treturn a;\n};'
-    agg_sizes[#agg_sizes + 1] = 'sizeof('..at..')'
-    agg_sigs [#agg_sigs  + 1] = k
-    agg_names[#agg_names + 1] = an
-  end
-
-  return agg_defs, agg_sizes, agg_sigs, agg_names
+  return table.concat(h,"")..table.concat(t,""), pos
 end
 
 
@@ -212,16 +107,18 @@
   local cases = ''
   local aggrs = { }
   local seen_aggrs = { }
-
+  local max_numargs = 0
 
   for line in io.lines() do
     local sig = trim(line)
-    cases = cases..mkcase(lineno, sig, aggrs, seen_aggrs)
+	local c, n = mkcase(lineno, sig, aggrs, seen_aggrs)
+    cases = cases..c
+    max_numargs = math.max(max_numargs, n)
     sigtab[#sigtab+1] = sig
     lineno = lineno + 1
   end
 
-  local agg_defs, agg_sizes, agg_sigs, agg_names = mkaggrdefs(aggrs, seen_aggrs)
+  local agg_defs, agg_sizes, agg_sigs, agg_names = mkaggrdefs(aggrs, seen_aggrs, aggrpacking, aggrpackingseed)
 
   -- make table.concat work
   if #agg_names > 0 then
@@ -234,11 +131,10 @@
   io.write(mksigtab(sigtab, '', 'G_sigtab'))
   io.write('const char* G_agg_sigs[]  = {\n\t"'..table.concat(agg_sigs, '",\n\t"')..'"\n};\n')
   io.write('int G_agg_sizes[] = {\n\t'..table.concat(agg_sizes, ',\n\t')..'\n};\n')
-  io.write('funptr G_agg_touchdcstfuncs[] = {'..string.sub(table.concat(agg_names, ',\n\t(funptr)&f_touchdcst'),2)..'\n};\n')
+  io.write('funptr G_agg_touchAfuncs[] = {'..string.sub(table.concat(agg_names, ',\n\t(funptr)&f_touch'),2)..'\n};\n')
   io.write('funptr G_agg_cmpfuncs[] = {'..string.sub(table.concat(agg_names, ',\n\t(funptr)&f_cmp'),2)..'\n};\n')
   io.write("int G_maxargs = "..max_numargs..";\n")
 end
 
-math.randomseed(seed)
 mkall()