summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/wasm-binary-reader.c26
-rw-r--r--src/wasm-binary-writer.c18
-rw-r--r--src/wasm-binary.h1
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, &param_type, "signature param type");
+ in_u8(&ctx, &param_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"