Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/core/extension/make_wrappers.py
9903 views
1
proto_mod = """
2
#define MODBIND$VER($RETTYPE m_name$ARG) \\
3
virtual $RETVAL _##m_name($FUNCARGS) $CONST; \\
4
_FORCE_INLINE_ virtual $RETVAL m_name($FUNCARGS) $CONST override { \\
5
$RETX _##m_name($CALLARGS);\\
6
}
7
"""
8
9
10
def generate_mod_version(argcount, const=False, returns=False):
11
s = proto_mod
12
sproto = str(argcount)
13
if returns:
14
sproto += "R"
15
s = s.replace("$RETTYPE", "m_ret, ")
16
s = s.replace("$RETVAL", "m_ret")
17
s = s.replace("$RETX", "return")
18
19
else:
20
s = s.replace("$RETTYPE", "")
21
s = s.replace("$RETVAL", "void")
22
s = s.replace("$RETX", "")
23
24
if const:
25
sproto += "C"
26
s = s.replace("$CONST", "const")
27
else:
28
s = s.replace("$CONST", "")
29
30
s = s.replace("$VER", sproto)
31
argtext = ""
32
funcargs = ""
33
callargs = ""
34
35
for i in range(argcount):
36
if i > 0:
37
funcargs += ", "
38
callargs += ", "
39
40
argtext += ", m_type" + str(i + 1)
41
funcargs += "m_type" + str(i + 1) + " arg" + str(i + 1)
42
callargs += "arg" + str(i + 1)
43
44
if argcount:
45
s = s.replace("$ARG", argtext)
46
s = s.replace("$FUNCARGS", funcargs)
47
s = s.replace("$CALLARGS", callargs)
48
else:
49
s = s.replace("$ARG", "")
50
s = s.replace("$FUNCARGS", funcargs)
51
s = s.replace("$CALLARGS", callargs)
52
53
return s
54
55
56
proto_ex = """
57
#define EXBIND$VER($RETTYPE m_name$ARG) \\
58
GDVIRTUAL$VER_REQUIRED($RETTYPE_##m_name$ARG)\\
59
virtual $RETVAL m_name($FUNCARGS) $CONST override { \\
60
$RETPRE\\
61
GDVIRTUAL_CALL(_##m_name$CALLARGS$RETREF);\\
62
$RETPOST\\
63
}
64
"""
65
66
67
def generate_ex_version(argcount, const=False, returns=False):
68
s = proto_ex
69
sproto = str(argcount)
70
if returns:
71
sproto += "R"
72
s = s.replace("$RETTYPE", "m_ret, ")
73
s = s.replace("$RETVAL", "m_ret")
74
s = s.replace("$RETPRE", "m_ret ret; ZeroInitializer<m_ret>::initialize(ret);\\\n")
75
s = s.replace("$RETPOST", "return ret;\\\n")
76
77
else:
78
s = s.replace("$RETTYPE", "")
79
s = s.replace("$RETVAL", "void")
80
s = s.replace("$RETPRE", "")
81
s = s.replace("$RETPOST", "return;")
82
83
if const:
84
sproto += "C"
85
s = s.replace("$CONST", "const")
86
else:
87
s = s.replace("$CONST", "")
88
89
s = s.replace("$VER", sproto)
90
argtext = ""
91
funcargs = ""
92
callargs = ""
93
94
for i in range(argcount):
95
if i > 0:
96
funcargs += ", "
97
98
argtext += ", m_type" + str(i + 1)
99
funcargs += "m_type" + str(i + 1) + " arg" + str(i + 1)
100
callargs += ", arg" + str(i + 1)
101
102
if argcount:
103
s = s.replace("$ARG", argtext)
104
s = s.replace("$FUNCARGS", funcargs)
105
s = s.replace("$CALLARGS", callargs)
106
else:
107
s = s.replace("$ARG", "")
108
s = s.replace("$FUNCARGS", funcargs)
109
s = s.replace("$CALLARGS", callargs)
110
111
if returns:
112
s = s.replace("$RETREF", ", ret")
113
else:
114
s = s.replace("$RETREF", "")
115
116
return s
117
118
119
def run(target, source, env):
120
max_versions = 12
121
122
txt = "#pragma once"
123
124
for i in range(max_versions + 1):
125
txt += "\n/* Extension Wrapper " + str(i) + " Arguments */\n"
126
txt += generate_ex_version(i, False, False)
127
txt += generate_ex_version(i, False, True)
128
txt += generate_ex_version(i, True, False)
129
txt += generate_ex_version(i, True, True)
130
131
for i in range(max_versions + 1):
132
txt += "\n/* Module Wrapper " + str(i) + " Arguments */\n"
133
txt += generate_mod_version(i, False, False)
134
txt += generate_mod_version(i, False, True)
135
txt += generate_mod_version(i, True, False)
136
txt += generate_mod_version(i, True, True)
137
138
with open(str(target[0]), "w", encoding="utf-8", newline="\n") as f:
139
f.write(txt)
140
141