summaryrefslogtreecommitdiff
path: root/src/prebuilt/wasm2c_source_declarations.cc
diff options
context:
space:
mode:
authorKeith Winstein <keithw@cs.stanford.edu>2023-09-06 15:54:12 -0700
committerGitHub <noreply@github.com>2023-09-06 22:54:12 +0000
commitab05e50ec44506dc81220a21fb8f5e8d048772e0 (patch)
tree452bbeab86c82b531447e28037bf47c6e9e23520 /src/prebuilt/wasm2c_source_declarations.cc
parent9008bc8080a4adc703643ea67321dd7b6075fe76 (diff)
downloadwabt-ab05e50ec44506dc81220a21fb8f5e8d048772e0.tar.gz
wabt-ab05e50ec44506dc81220a21fb8f5e8d048772e0.tar.bz2
wabt-ab05e50ec44506dc81220a21fb8f5e8d048772e0.zip
Share reading/validation code between elem exprs & other const exprs (#2288)
This continues the work from #1783 and reduces special handling of elem exprs, by treating them the same as other const expressions (init expressions).
Diffstat (limited to 'src/prebuilt/wasm2c_source_declarations.cc')
-rw-r--r--src/prebuilt/wasm2c_source_declarations.cc36
1 files changed, 31 insertions, 5 deletions
diff --git a/src/prebuilt/wasm2c_source_declarations.cc b/src/prebuilt/wasm2c_source_declarations.cc
index 5970f9a3..23b24b4e 100644
--- a/src/prebuilt/wasm2c_source_declarations.cc
+++ b/src/prebuilt/wasm2c_source_declarations.cc
@@ -936,6 +936,8 @@ R"w2c_template(}
R"w2c_template(
typedef struct {
)w2c_template"
+R"w2c_template( enum { RefFunc, RefNull, GlobalGet } expr_type;
+)w2c_template"
R"w2c_template( wasm_rt_func_type_t type;
)w2c_template"
R"w2c_template( wasm_rt_function_ptr_t func;
@@ -969,20 +971,44 @@ R"w2c_template( TRAP(OOB);
)w2c_template"
R"w2c_template( for (u32 i = 0; i < n; i++) {
)w2c_template"
-R"w2c_template( const wasm_elem_segment_expr_t* src_expr = &src[src_addr + i];
+R"w2c_template( const wasm_elem_segment_expr_t* const src_expr = &src[src_addr + i];
+)w2c_template"
+R"w2c_template( wasm_rt_funcref_t* const dest_val = &(dest->data[dest_addr + i]);
+)w2c_template"
+R"w2c_template( switch (src_expr->expr_type) {
+)w2c_template"
+R"w2c_template( case RefFunc:
+)w2c_template"
+R"w2c_template( *dest_val = (wasm_rt_funcref_t){
+)w2c_template"
+R"w2c_template( src_expr->type, src_expr->func,
+)w2c_template"
+R"w2c_template( (char*)module_instance + src_expr->module_offset};
+)w2c_template"
+R"w2c_template( break;
+)w2c_template"
+R"w2c_template( case RefNull:
+)w2c_template"
+R"w2c_template( *dest_val = wasm_rt_funcref_null_value;
+)w2c_template"
+R"w2c_template( break;
+)w2c_template"
+R"w2c_template( case GlobalGet:
+)w2c_template"
+R"w2c_template( *dest_val = **(wasm_rt_funcref_t**)((char*)module_instance +
)w2c_template"
-R"w2c_template( dest->data[dest_addr + i] =
+R"w2c_template( src_expr->module_offset);
)w2c_template"
-R"w2c_template( (wasm_rt_funcref_t){src_expr->type, src_expr->func,
+R"w2c_template( break;
)w2c_template"
-R"w2c_template( (char*)module_instance + src_expr->module_offset};
+R"w2c_template( }
)w2c_template"
R"w2c_template( }
)w2c_template"
R"w2c_template(}
)w2c_template"
R"w2c_template(
-// Currently Wasm only supports initializing externref tables with ref.null.
+// Currently wasm2c only supports initializing externref tables with ref.null.
)w2c_template"
R"w2c_template(static inline void externref_table_init(wasm_rt_externref_table_t* dest,
)w2c_template"