comparison test/callback_suite/mk-cases.lua @ 513:95f6f43178ed

test/callback_suite simplifications: - more generator code sharing - changing how explicit callconv is specified - fix to handle signatures with calling convention prefixes, correctly
author Tassilo Philipp
date Sun, 10 Apr 2022 16:10:10 +0200
parents f3d44195dbdf
children 01f928eb9584
comparison
equal deleted inserted replaced
512:4d0541bf9b38 513:95f6f43178ed
1 require "config" 1 require "config"
2 2
3 function trim(l) return l:gsub("^%s+",""):gsub("%s+$","") end 3 function trim(l) return l:gsub("^%s+",""):gsub("%s+$","") end
4 function mkcase(id,sig) 4 function mkcase(id,sig)
5 local nargs = string.len(sig) - 2 -- @@@ wrong, b/c ignores callconv prefixes
6 local rtype = string.sub(sig, -1) 5 local rtype = string.sub(sig, -1)
7 local s = "F" .. nargs .. "(f" .. id .. "," .. rtype 6 local i = 1
8 for i = 1, nargs do 7 local args = { rtype }
9 local type = string.sub(sig, i, i) 8 while i < #sig do
10 s = s .. "," .. type 9 c = string.sub(sig, i, i)
10 if(c == ')') then
11 break
12 end
13 if(c == '_') then -- filter out prefixes
14 i = i + 1
15 else
16 args[#args+1] = c
17 end
18 i = i + 1
11 end 19 end
12 s = s .. ")\n" 20 return "F" .. (#args-1) .. "(f" .. id .. "," .. table.concat(args,',') .. ")\n"
13 return s
14 end 21 end
15 22
16 function mkfuntab(n) 23 -- use shared helpers to generate cases
17 local s = { "funptr G_funtab[] = {\n"} 24 package.path = '../common/?.lua;' .. package.path
18 for i = 0, n-1 do 25 require"mk-cases"
19 s[#s+1] = "\t&f"..i..",\n"
20 end
21 s[#s+1] = "};\n"
22 return table.concat(s,"")
23 end
24 26
25 function mksigtab(sigs)
26 local s = { "const char * G_sigtab[] = {\n"}
27 for k,v in pairs(sigs) do
28 s[#s+1] = '\t"'..v..'",\n'
29 end
30 s[#s+1] = "};\n"
31 return table.concat(s,"")
32 end
33 27
34 function mkall() 28 function mkall()
35 -- force minargs for ordered mode 29 -- force minargs for ordered mode
36 if mode == "ordered" then 30 if mode == "ordered" then
37 minargs = 0 31 minargs = 0
53 end 47 end
54 argdef = argdef .. "M" .. j 48 argdef = argdef .. "M" .. j
55 argset = argset .. "K_##M" .. j .. "[" .. j .. "]" 49 argset = argset .. "K_##M" .. j .. "[" .. j .. "]"
56 end 50 end
57 end 51 end
58 line = line .. argdef .. ") void ID(void* addr) { write_V_##R(" .. i .. ", ((CONFIG_API R(*)(" .. argdef .. "))addr)(" .. argset .. "));}\n" 52 line = line .. argdef .. ") void ID(void* addr) { write_V_##R(" .. i .. ", ((" .. api .. " R(*)(" .. argdef .. "))addr)(" .. argset .. "));}\n"
59 io.write(line) 53 io.write(line)
60 end 54 end
61 55
62 -- cases 56 -- cases
63 local lineno = 0 57 local lineno = 0
69 sigtab[#sigtab+1] = sig 63 sigtab[#sigtab+1] = sig
70 lineno = lineno + 1 64 lineno = lineno + 1
71 end 65 end
72 66
73 io.write(cases) 67 io.write(cases)
74 io.write(mkfuntab(lineno)) 68 io.write(mkfuntab(lineno, 'f', 'funptr', 'G_funtab', false))
75 io.write(mksigtab(sigtab)) 69 io.write(mksigtab(sigtab, ccprefix, 'G_sigtab'))
76 io.write("int G_maxargs = "..maxargs..";\n") 70 io.write("int G_maxargs = "..maxargs..";\n")
77 end 71 end
78 72
79 mkall() 73 mkall()
80 74