diff options
Diffstat (limited to 'src/binary-writer-spec.c')
-rw-r--r-- | src/binary-writer-spec.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/src/binary-writer-spec.c b/src/binary-writer-spec.c index 35d52ab1..3a48ccf7 100644 --- a/src/binary-writer-spec.c +++ b/src/binary-writer-spec.c @@ -162,6 +162,13 @@ static void write_var(Context* ctx, const WasmVar* var) { write_escaped_string_slice(ctx, var->name); } +static void write_type_object(Context* ctx, WasmType type) { + wasm_writef(&ctx->json_stream, "{"); + write_key(ctx, "type"); + write_string(ctx, wasm_get_type_name(type)); + wasm_writef(&ctx->json_stream, "}"); +} + static void write_const(Context* ctx, const WasmConst* const_) { wasm_writef(&ctx->json_stream, "{"); write_key(ctx, "type"); @@ -249,6 +256,36 @@ static void write_action(Context* ctx, const WasmAction* action) { wasm_writef(&ctx->json_stream, "}"); } +static void write_action_result_type(Context* ctx, + WasmScript* script, + const WasmAction* action) { + const WasmModule* module = + wasm_get_module_by_var(script, &action->module_var); + const WasmExport* export; + wasm_writef(&ctx->json_stream, "["); + switch (action->type) { + case WASM_ACTION_TYPE_INVOKE: { + export = wasm_get_export_by_name(module, &action->invoke.name); + assert(export->kind == WASM_EXTERNAL_KIND_FUNC); + WasmFunc* func = wasm_get_func_by_var(module, &export->var); + size_t num_results = wasm_get_num_results(func); + size_t i; + for (i = 0; i < num_results; ++i) + write_type_object(ctx, wasm_get_result_type(func, i)); + break; + } + + case WASM_ACTION_TYPE_GET: { + export = wasm_get_export_by_name(module, &action->get.name); + assert(export->kind == WASM_EXTERNAL_KIND_GLOBAL); + WasmGlobal* global = wasm_get_global_by_var(module, &export->var); + write_type_object(ctx, global->type); + break; + } + } + wasm_writef(&ctx->json_stream, "]"); +} + static void write_module(Context* ctx, char* filename, const WasmModule* module) { @@ -398,6 +435,10 @@ static void write_commands(Context* ctx, WasmScript* script) { write_location(ctx, &command->assert_return_nan.action.loc); write_separator(ctx); write_action(ctx, &command->assert_return_nan.action); + write_separator(ctx); + write_key(ctx, "expected"); + write_action_result_type(ctx, script, + &command->assert_return_nan.action); break; case WASM_COMMAND_TYPE_ASSERT_TRAP: |