diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/wasm-binary-reader.c | 26 | ||||
-rw-r--r-- | src/wasm-binary-writer.c | 18 | ||||
-rw-r--r-- | src/wasm-binary.h | 1 |
3 files changed, 33 insertions, 12 deletions
diff --git a/src/wasm-binary-reader.c b/src/wasm-binary-reader.c index 160eeb1d..ef82e252 100644 --- a/src/wasm-binary-reader.c +++ b/src/wasm-binary-reader.c @@ -406,31 +406,43 @@ WasmResult wasm_read_binary(WasmAllocator* allocator, if (skip_until_section(&ctx, WASM_SECTION_INDEX_TYPE)) { CALLBACK0(&ctx, begin_signature_section); uint32_t i; - in_u32_leb128(&ctx, &num_signatures, "signature count"); + in_u32_leb128(&ctx, &num_signatures, "type count"); CALLBACK(&ctx, on_signature_count, num_signatures); for (i = 0; i < num_signatures; ++i) { + uint8_t form; + in_u8(&ctx, &form, "type form"); + RAISE_ERROR_UNLESS(&ctx, form == WASM_BINARY_TYPE_FORM_FUNCTION, + "unexpected type form"); + uint32_t num_params; - in_u32_leb128(&ctx, &num_params, "signature param count"); + in_u32_leb128(&ctx, &num_params, "function param count"); if (num_params > ctx.param_types.capacity) { CHECK_ALLOC( &ctx, wasm_reserve_types(allocator, &ctx.param_types, num_params)); } - uint8_t result_type; - in_u8(&ctx, &result_type, "signature result type"); - RAISE_ERROR_UNLESS(&ctx, is_valid_type(result_type), - "expected valid result type"); uint32_t j; for (j = 0; j < num_params; ++j) { uint8_t param_type; - in_u8(&ctx, ¶m_type, "signature param type"); + in_u8(&ctx, ¶m_type, "function param type"); RAISE_ERROR_UNLESS(&ctx, is_non_void_type(param_type), "expected valid param type"); ctx.param_types.data[j] = param_type; } + uint32_t num_results; + in_u32_leb128(&ctx, &num_results, "function result count"); + RAISE_ERROR_UNLESS(&ctx, num_results <= 1, "result count must be 0 or 1"); + + uint8_t result_type = WASM_TYPE_VOID; + if (num_results) { + in_u8(&ctx, &result_type, "function result type"); + RAISE_ERROR_UNLESS(&ctx, is_valid_type(result_type), + "expected valid result type"); + } + CALLBACK(&ctx, on_signature, i, (WasmType)result_type, num_params, ctx.param_types.data); } diff --git a/src/wasm-binary-writer.c b/src/wasm-binary-writer.c index c2fbea89..ff14082a 100644 --- a/src/wasm-binary-writer.c +++ b/src/wasm-binary-writer.c @@ -785,15 +785,23 @@ static void write_module(WasmContext* ctx, const WasmModule* module) { get_func_signatures(ctx, module, &sigs); if (sigs.size) { begin_section(ctx, WASM_SECTION_NAME_TYPE, leb_size_guess); - write_u32_leb128(&ctx->stream, sigs.size, "num signatures"); + write_u32_leb128(&ctx->stream, sigs.size, "num types"); for (i = 0; i < sigs.size; ++i) { const WasmFuncSignature* sig = &sigs.data[i]; - write_header(ctx, "signature", i); - wasm_write_u8(&ctx->stream, sig->param_types.size, "num params"); - wasm_write_u8(&ctx->stream, sig->result_type, "result_type"); + write_header(ctx, "type", i); + wasm_write_u8(&ctx->stream, WASM_BINARY_TYPE_FORM_FUNCTION, + "function form"); + + uint32_t num_params = sig->param_types.size; + write_u32_leb128(&ctx->stream, num_params, "num params"); size_t j; - for (j = 0; j < sig->param_types.size; ++j) + for (j = 0; j < num_params; ++j) wasm_write_u8(&ctx->stream, sig->param_types.data[j], "param type"); + + uint32_t num_results = sig->result_type == WASM_TYPE_VOID ? 0 : 1; + write_u32_leb128(&ctx->stream, num_results, "num results"); + if (num_results) + wasm_write_u8(&ctx->stream, sig->result_type, "result_type"); } end_section(ctx); } diff --git a/src/wasm-binary.h b/src/wasm-binary.h index 2d2d30fa..5d3171cf 100644 --- a/src/wasm-binary.h +++ b/src/wasm-binary.h @@ -19,6 +19,7 @@ #define WASM_BINARY_MAGIC 0x6d736100 #define WASM_BINARY_VERSION 0x0b +#define WASM_BINARY_TYPE_FORM_FUNCTION 0x40 #define WASM_SECTION_NAME_TYPE "type" #define WASM_SECTION_NAME_IMPORT "import" |