Mercurial > pub > dyncall > dyncall
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()