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