Mercurial > pub > dyncall > dyncall
annotate test/common/mk-cases.lua @ 522:f7fec6699e21
- test code generator code: var abstraction
author | Tassilo Philipp |
---|---|
date | Wed, 13 Apr 2022 10:19:49 +0200 |
parents | a2de1d0a73f3 |
children |
rev | line source |
---|---|
514 | 1 function trim(s) |
2 return s:gsub("^%s+",""):gsub("%s+$","") | |
3 end | |
4 | |
521
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
5 |
519 | 6 -- parse array notation, e.g. returns "a", 4 for "a[4]" |
7 function split_array_decl(s) | |
8 local name = s | |
9 local n = nil -- not an array | |
10 local i = s:find('%[') | |
11 if i ~= nil then | |
12 name = name:sub(1, i-1) | |
13 n = tonumber(s:sub(i):match('[0123456789]+')) | |
14 end | |
15 return name, n | |
16 end | |
17 | |
521
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
18 |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
19 -- returns sig with return type first, and no ')' separator, e.g.: |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
20 -- 'ijf)v' -> 'vijf' |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
21 -- '){ii}' -> '{ii}' |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
22 function put_sig_rtype_first(sig) |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
23 return sig:sub(sig:find(')')+1,-1)..sig:sub(1,sig:find(')')-1) |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
24 end |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
25 |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
26 |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
27 -- aggrs: (sequential) idx => aggr-sig |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
28 -- seen_aggrs: aggr-sig => {{type0, name0, ...}, aggr_name} |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
29 -- packing: 0=off, pos values set fixed packing, neg values set a random |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
30 -- power-of-2 packing per aggregate, within [1,abs(aggrpacking)] |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
31 -- packing_seed: seed for random packing (if used) |
522
f7fec6699e21
- test code generator code: var abstraction
Tassilo Philipp
parents:
521
diff
changeset
|
32 -- cpsimple: whether or not to copy aggregates via '=' or field by field |
521
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
33 function mkaggrdefs(aggrs, seen_aggrs, packing, packingseed) |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
34 local agg_defs = { } |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
35 local agg_sizes = { } |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
36 local agg_sigs = { } |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
37 local agg_names = { } |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
38 |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
39 math.randomseed(packingseed) |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
40 |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
41 for a = 1, #aggrs do |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
42 local k = aggrs[a] |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
43 local v = seen_aggrs[k] |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
44 local am = v[1] -- aggregate members |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
45 local at = v[2] -- aggregate type |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
46 local an = at:match('A.*') -- aggregate name (w/o struct or union) |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
47 |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
48 -- aggregate def |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
49 aggr_def = '/* '..k..' */\n' |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
50 if packing ~= 0 then |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
51 local pack = packing |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
52 if pack < 0 then |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
53 pack = math.floor(math.pow(2,math.floor(math.log(math.random(math.abs(pack)),2)))) |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
54 end |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
55 aggr_def = aggr_def..'#pragma pack(push,'..pack..')\n' |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
56 end |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
57 |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
58 aggr_def = aggr_def..at..' { ' |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
59 for i = 1, #am, 2 do |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
60 aggr_def = aggr_def..am[i]..' '..am[i+1]..'; ' |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
61 end |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
62 aggr_def = aggr_def..'};\n' |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
63 |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
64 if packing ~= 0 then |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
65 aggr_def = aggr_def..'#pragma pack(pop)\n' |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
66 end |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
67 |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
68 -- aggregate cp and cmp funcs |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
69 s = { |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
70 'void f_cp'..an..'('..at..' *x, const '..at..' *y) { ', |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
71 'int f_cmp'..an..'(const '..at..' *x, const '..at..' *y) { return ' |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
72 } |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
73 o = { '=', '==', 'f_cp', 'f_cmp', '; ', ' && ', '', '1' } |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
74 for t = 1, 2 do |
522
f7fec6699e21
- test code generator code: var abstraction
Tassilo Philipp
parents:
521
diff
changeset
|
75 if t ~= 1 or cpsimple == false then |
521
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
76 aggr_def = aggr_def..s[t] |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
77 local b = {} |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
78 for i = 1, #am, 2 do |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
79 local mn, mc = split_array_decl(am[i+1]) -- aggr member name and (array) count |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
80 local fmt = '' |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
81 if mc ~= nil then -- need array suffixes? |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
82 fmt = '[%d]' |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
83 else |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
84 mc = 1 |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
85 end |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
86 |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
87 for j = 1, mc do |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
88 name = mn..fmt:format(j-1) |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
89 amn = am[i]:match('A.*') |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
90 if amn then -- is aggr? |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
91 b[#b+1] = o[t+2]..amn..'(&x->'..name..', &y->'..name..')' |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
92 else |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
93 b[#b+1] = 'x->'..name..' '..o[t]..' y->'..name |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
94 end |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
95 end |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
96 end |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
97 if #b == 0 then -- to handle empty aggregates |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
98 b[1] = o[t+6] |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
99 end |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
100 aggr_def = aggr_def..table.concat(b,o[t+4])..'; };\n' |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
101 end |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
102 end |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
103 |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
104 -- write convenient dcNewAggr() helper/wrapper funcs |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
105 aggr_def = aggr_def..'DCaggr* f_touch'..an..'() {\n\tstatic DCaggr* a = NULL;\n\tif(!a) {\n\t\ta = dcNewAggr('..(#am>>1)..', sizeof('..at..'));\n\t\t' |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
106 for i = 1, #am, 2 do |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
107 local mn, mc = split_array_decl(am[i+1]) |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
108 if mc == nil then |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
109 mc = 1 |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
110 end |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
111 amn = am[i]:match('A.*') |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
112 if amn then -- is aggr? |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
113 --aggr_def = aggr_def..'dcAggrField(at, DC_SIGCHAR_AGGREGATE, offsetof('..at..', '..mn..'), '..mc..', f_touch'..amn..'());\n\t\t' |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
114 aggr_def = aggr_def.."AFa("..at..','..mn..','..mc..','..amn..')\n\t\t' |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
115 else |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
116 --aggr_def = aggr_def.."dcAggrField(at, '"..am[i].."', offsetof("..at..', '..mn..'), '..mc..');\n\t\t' |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
117 aggr_def = aggr_def.."AF('"..am[i].."',"..at..','..mn..','..mc..')\n\t\t' |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
118 end |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
119 end |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
120 |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
121 agg_defs [#agg_defs + 1] = aggr_def..'dcCloseAggr(a);\n\t}\n\treturn a;\n};' |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
122 agg_sizes[#agg_sizes + 1] = 'sizeof('..at..')' |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
123 agg_sigs [#agg_sigs + 1] = k |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
124 agg_names[#agg_names + 1] = an |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
125 end |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
126 |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
127 return agg_defs, agg_sizes, agg_sigs, agg_names |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
128 end |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
129 |
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
130 |
512 | 131 function mkfuntab(n, prefix, t, array_name, with_cast) |
132 local s = { t.." "..array_name.."[] = {\n"} | |
133 local cast = '' | |
134 if with_cast == true then | |
135 cast = '('..t..')' | |
136 end | |
137 for i = 0, n-1 do | |
138 s[#s+1] = "\t"..cast.."&"..prefix..i..",\n" | |
139 end | |
140 s[#s+1] = "};\n" | |
141 return table.concat(s,"") | |
142 end | |
143 | |
521
a2de1d0a73f3
- more test code generator code sharing/abstraction/simplifications
Tassilo Philipp
parents:
519
diff
changeset
|
144 |
512 | 145 -- @@@ sigprefix should be added by generators, not here |
146 function mksigtab(sigs, sigprefix, array_name) | |
147 local s = { "const char * "..array_name.."[] = {\n"} | |
148 for k,v in pairs(sigs) do | |
149 s[#s+1] = '\t"'..sigprefix..v..'",\n' | |
150 end | |
151 s[#s+1] = "};\n" | |
152 return table.concat(s,"") | |
153 end | |
154 |