diff options
author | Keith Winstein <keithw@cs.stanford.edu> | 2023-09-06 15:54:12 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-09-06 22:54:12 +0000 |
commit | ab05e50ec44506dc81220a21fb8f5e8d048772e0 (patch) | |
tree | 452bbeab86c82b531447e28037bf47c6e9e23520 /src/prebuilt/wasm2c_source_declarations.cc | |
parent | 9008bc8080a4adc703643ea67321dd7b6075fe76 (diff) | |
download | wabt-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.cc | 36 |
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" |