Skip to content

Commit 6e1119f

Browse files
committed
[TS] Redo C -> TS call function naming to make it harder to screw up
1 parent f93b58b commit 6e1119f

File tree

2 files changed

+45
-47
lines changed

2 files changed

+45
-47
lines changed

ts/js-wasm.h

Lines changed: 32 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -10,40 +10,37 @@ extern size_t strlen(const char *s);
1010
// to use proper types.
1111

1212
typedef uint32_t JSValue;
13-
extern uint64_t js_invoke_function_u(JSValue,JSValue,JSValue,JSValue,JSValue,JSValue,JSValue,JSValue,JSValue,JSValue,JSValue,JSValue) __attribute__((import_name("js_invoke_function_u")));
14-
extern uint64_t js_invoke_function_b(JSValue,JSValue,uint64_t,uint64_t,uint64_t,uint64_t,uint64_t,uint64_t,uint64_t,uint64_t,uint64_t,uint64_t) __attribute__((import_name("js_invoke_function_b")));
15-
16-
static inline JSValue js_invoke_function_u_(JSValue obj, JSValue fn){
17-
return js_invoke_function_u(obj,fn,0,0,0,0,0,0,0,0,0,0);
18-
}
19-
static inline JSValue js_invoke_function_u_u(JSValue obj, JSValue fn, JSValue a){
20-
return js_invoke_function_u(obj,fn,a,0,0,0,0,0,0,0,0,0);
21-
}
22-
static inline JSValue js_invoke_function_u_uu(JSValue obj, JSValue fn, JSValue a, JSValue b){
23-
return js_invoke_function_u(obj,fn,a,b,0,0,0,0,0,0,0,0);
24-
}
25-
static inline JSValue js_invoke_function_u_uuu(JSValue obj, JSValue fn, JSValue a, JSValue b, JSValue c){
26-
return js_invoke_function_u(obj,fn,a,b,c,0,0,0,0,0,0,0);
27-
}
28-
static inline JSValue js_invoke_function_u_uuuu(JSValue obj, JSValue fn, JSValue a, JSValue b, JSValue c, JSValue d){
29-
return js_invoke_function_u(obj,fn,a,b,c,d,0,0,0,0,0,0);
30-
}
31-
static inline JSValue js_invoke_function_u_uuuuu(JSValue obj, JSValue fn, JSValue a, JSValue b, JSValue c, JSValue d, JSValue e){
32-
return js_invoke_function_u(obj,fn,a,b,c,d,e,0,0,0,0,0);
33-
}
34-
35-
static inline uint64_t js_invoke_function_b_(JSValue obj, JSValue fn){
36-
return js_invoke_function_u(obj,fn,0,0,0,0,0,0,0,0,0,0);
37-
}
38-
39-
static inline uint64_t js_invoke_function_b_uuuu(JSValue obj, JSValue fn, JSValue a, JSValue b, JSValue c, JSValue d){
40-
return js_invoke_function_u(obj,fn,a,b,c,d,0,0,0,0,0,0);
41-
}
42-
static inline JSValue js_invoke_function_u_b(JSValue obj, JSValue fn, uint64_t a){
43-
return js_invoke_function_b(obj,fn,a,0,0,0,0,0,0,0,0,0);
44-
}
45-
static inline JSValue js_invoke_function_u_bb(JSValue obj, JSValue fn, uint64_t a, uint64_t b){
46-
return js_invoke_function_b(obj,fn,a,b,0,0,0,0,0,0,0,0);
47-
}
13+
14+
#define N_TYPE_u uint32_t
15+
#define N_TYPE_b uint64_t
16+
17+
#define TOK(a) a
18+
#define R_CAT2(a, b) a ## b
19+
#define CAT2(a, b) R_CAT2(a, b)
20+
#define R_CAT3(a, b, c) a ## b ## c
21+
#define CAT3(a, b, c) R_CAT3(a, b, c)
22+
#define R_CAT4(a, b, c, d) a ## b ## c ## d
23+
#define CAT4(a, b, c, d) R_CAT4(a, b, c, d)
24+
#define R_CAT5(a, b, c, d, e) a ## b ## c ## d ## e
25+
#define CAT5(a, b, c, d, e) R_CAT5(a, b, c, d, e)
26+
#define R_CAT6(a, b, c, d, e, f) a ## b ## c ## d ## e ## f
27+
#define CAT6(a, b, c, d, e, f) R_CAT6(a, b, c, d, e, f)
28+
29+
#define _GET_CONCAT(_1, _2, _3, _4, _5, _6, CONC, ...) CONC
30+
#define CAT(...) _GET_CONCAT(__VA_ARGS__, CAT6, CAT5, CAT4, CAT3, CAT2, TOK)(__VA_ARGS__)
31+
32+
#define DO_STRING(a) #a
33+
#define STRINGIZE(a) DO_STRING(a)
34+
35+
#define DECL_IMPORT(A1, A2, A3, A4, A5, A6) \
36+
extern uint64_t CAT(js_invoke_function_, CAT(A1, A2, A3, A4, A5, A6)) \
37+
(JSValue obj, JSValue fn, N_TYPE_##A1, N_TYPE_##A2, N_TYPE_##A3, N_TYPE_##A4, N_TYPE_##A5, N_TYPE_##A6) \
38+
__attribute__((import_name(STRINGIZE(CAT(js_invoke_function_, CAT(A1, A2, A3, A4, A5, A6))))));
39+
40+
DECL_IMPORT(u, u, u, u, u, u)
41+
DECL_IMPORT(b, u, u, u, u, u)
42+
DECL_IMPORT(b, b, b, b, b, b)
43+
DECL_IMPORT(u, b, u, u, u, u)
44+
DECL_IMPORT(u, u, b, u, u, u)
4845

4946
#endif

typescript_strings.py

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -125,19 +125,19 @@ def __init__(self, DEBUG: bool, target: Target, outdir: str, **kwargs):
125125
isWasmInitialized = true;
126126
}
127127
128+
const fn_list = ["uuuuuu", "buuuuu", "bbbbbb", "ubuuuu", "uubuuu"];
129+
128130
/* @internal */
129131
export async function initializeWasmFromUint8Array(wasmBinary: Uint8Array) {
130-
imports.env["js_invoke_function_u"] = js_invoke;
131-
imports.env["js_invoke_function_b"] = js_invoke;
132+
for (const fn of fn_list) { imports.env["js_invoke_function_" + fn] = js_invoke; }
132133
const { instance: wasmInstance } = await WebAssembly.instantiate(wasmBinary, imports);
133134
await finishInitializeWasm(wasmInstance);
134135
}
135136
136137
/* @internal */
137138
export async function initializeWasmFetch(uri: string) {
139+
for (const fn of fn_list) { imports.env["js_invoke_function_" + fn] = js_invoke; }
138140
const stream = fetch(uri);
139-
imports.env["js_invoke_function_u"] = js_invoke;
140-
imports.env["js_invoke_function_b"] = js_invoke;
141141
const { instance: wasmInstance } = await WebAssembly.instantiateStreaming(stream, imports);
142142
await finishInitializeWasm(wasmInstance);
143143
}"""
@@ -388,7 +388,7 @@ def __init__(self, DEBUG: bool, target: Target, outdir: str, **kwargs):
388388
this.script_pubkey = bindings.decodeUint8Array(bindings.TxOut_get_script_pubkey(ptr));
389389
this.value = bindings.TxOut_get_value(ptr);
390390
}
391-
public constructor_new(value: bigint, script_pubkey: Uint8Array): TxOut {
391+
public static constructor_new(value: bigint, script_pubkey: Uint8Array): TxOut {
392392
return new TxOut(null, bindings.TxOut_new(bindings.encodeUint8Array(script_pubkey), value));
393393
}
394394
}"""
@@ -1034,15 +1034,14 @@ class {struct_name}Holder {{
10341034
out_c = out_c + arg_info.ret_conv[1].replace('\n', '\n\t') + "\n"
10351035

10361036
fn_suffix = ""
1037-
if fn_line.ret_ty_info.c_ty == "uint64_t" or fn_line.ret_ty_info.c_ty == "int64_t":
1038-
fn_suffix += "b_"
1039-
else:
1040-
fn_suffix += "u_"
1041-
for arg in fn_line.args_ty:
1037+
assert len(fn_line.args_ty) < 6
1038+
for arg_info in fn_line.args_ty:
10421039
if arg_info.c_ty == "uint64_t" or arg_info.c_ty == "int64_t":
10431040
fn_suffix += "b"
10441041
else:
10451042
fn_suffix += "u"
1043+
for i in range(0, 6 - len(fn_line.args_ty)):
1044+
fn_suffix += "u"
10461045
if fn_line.ret_ty_info.c_ty.endswith("Array"):
10471046
out_c += "\t" + fn_line.ret_ty_info.c_ty + " ret = (" + fn_line.ret_ty_info.c_ty + ")"
10481047
out_c += "js_invoke_function_" + fn_suffix + "(j_calls->instance_ptr, " + str(self.function_ptr_counter)
@@ -1060,9 +1059,11 @@ class {struct_name}Holder {{
10601059

10611060
for idx, arg_info in enumerate(fn_line.args_ty):
10621061
if arg_info.ret_conv is not None:
1063-
out_c = out_c + ", (uint32_t)" + arg_info.ret_conv_name
1062+
out_c += ", (uint32_t)" + arg_info.ret_conv_name
10641063
else:
1065-
out_c = out_c + ", (uint32_t)" + arg_info.arg_name
1064+
out_c += ", (uint32_t)" + arg_info.arg_name
1065+
for i in range(0, 6 - len(fn_line.args_ty)):
1066+
out_c += ", 0"
10661067
out_c = out_c + ");\n"
10671068
if fn_line.ret_ty_info.arg_conv is not None:
10681069
out_c = out_c + "\t" + fn_line.ret_ty_info.arg_conv.replace("\n", "\n\t") + "\n\treturn " + fn_line.ret_ty_info.arg_conv_name + ";\n"

0 commit comments

Comments
 (0)