summaryrefslogtreecommitdiff
path: root/src/binary-writer.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/binary-writer.c')
-rw-r--r--src/binary-writer.c337
1 files changed, 177 insertions, 160 deletions
diff --git a/src/binary-writer.c b/src/binary-writer.c
index 9e87799b..10d8ee29 100644
--- a/src/binary-writer.c
+++ b/src/binary-writer.c
@@ -78,10 +78,10 @@ static void write_header(Context* ctx, const char* name, int index) {
} while (1)
/* returns the length of the leb128 */
-static uint32_t write_u32_leb128_at(WasmStream* stream,
- uint32_t offset,
- uint32_t value,
- const char* desc) {
+uint32_t wasm_write_u32_leb128_at(WasmStream* stream,
+ uint32_t offset,
+ uint32_t value,
+ const char* desc) {
uint8_t data[MAX_U32_LEB128_BYTES];
uint32_t i = 0;
LEB128_LOOP_UNTIL(value == 0);
@@ -90,31 +90,49 @@ static uint32_t write_u32_leb128_at(WasmStream* stream,
return length;
}
-static uint32_t write_fixed_u32_leb128_at(WasmStream* stream,
- uint32_t offset,
- uint32_t value,
- const char* desc) {
- uint8_t data[MAX_U32_LEB128_BYTES];
+uint32_t wasm_write_fixed_u32_leb128_raw(uint8_t* data,
+ uint8_t* end,
+ uint32_t value) {
+ if (end - data < MAX_U32_LEB128_BYTES)
+ return 0;
data[0] = (value & 0x7f) | 0x80;
data[1] = ((value >> 7) & 0x7f) | 0x80;
data[2] = ((value >> 14) & 0x7f) | 0x80;
data[3] = ((value >> 21) & 0x7f) | 0x80;
data[4] = ((value >> 28) & 0x0f);
- wasm_write_data_at(stream, offset, data, MAX_U32_LEB128_BYTES,
- WASM_DONT_PRINT_CHARS, desc);
return MAX_U32_LEB128_BYTES;
}
-static void write_u32_leb128(WasmStream* stream,
- uint32_t value,
- const char* desc) {
- uint32_t length = write_u32_leb128_at(stream, stream->offset, value, desc);
+uint32_t wasm_write_fixed_u32_leb128_at(WasmStream* stream,
+ uint32_t offset,
+ uint32_t value,
+ const char* desc) {
+ uint8_t data[MAX_U32_LEB128_BYTES];
+ uint32_t length =
+ wasm_write_fixed_u32_leb128_raw(data, data + MAX_U32_LEB128_BYTES, value);
+ wasm_write_data_at(stream, offset, data, length, WASM_DONT_PRINT_CHARS, desc);
+ return length;
+}
+
+void wasm_write_u32_leb128(WasmStream* stream,
+ uint32_t value,
+ const char* desc) {
+ uint32_t length =
+ wasm_write_u32_leb128_at(stream, stream->offset, value, desc);
stream->offset += length;
}
-static void write_i32_leb128(WasmStream* stream,
- int32_t value,
- const char* desc) {
+void wasm_write_fixed_u32_leb128(WasmStream* stream,
+ uint32_t value,
+ const char* desc) {
+ uint32_t length =
+ wasm_write_fixed_u32_leb128_at(stream, stream->offset, value, desc);
+ stream->offset += length;
+}
+
+void wasm_write_i32_leb128(WasmStream* stream,
+ int32_t value,
+ const char* desc) {
uint8_t data[MAX_U32_LEB128_BYTES];
uint32_t i = 0;
if (value < 0)
@@ -180,38 +198,38 @@ static void write_fixup_u32_leb128_size(Context* ctx,
uint32_t dst_offset = offset + leb_size;
wasm_move_data(&ctx->stream, dst_offset, src_offset, size);
}
- write_u32_leb128_at(&ctx->stream, offset, size, desc);
+ wasm_write_u32_leb128_at(&ctx->stream, offset, size, desc);
ctx->stream.offset += leb_size - leb_size_guess;
} else {
uint32_t size = ctx->stream.offset - offset - MAX_U32_LEB128_BYTES;
- write_fixed_u32_leb128_at(&ctx->stream, offset, size, desc);
+ wasm_write_fixed_u32_leb128_at(&ctx->stream, offset, size, desc);
}
}
-static void write_str(WasmStream* stream,
- const char* s,
- size_t length,
- WasmPrintChars print_chars,
- const char* desc) {
- write_u32_leb128(stream, length, "string length");
+void wasm_write_str(WasmStream* stream,
+ const char* s,
+ size_t length,
+ WasmPrintChars print_chars,
+ const char* desc) {
+ wasm_write_u32_leb128(stream, length, "string length");
wasm_write_data_at(stream, stream->offset, s, length, print_chars, desc);
stream->offset += length;
}
-static void write_opcode(WasmStream* stream, uint8_t opcode) {
+void wasm_write_opcode(WasmStream* stream, uint8_t opcode) {
wasm_write_u8(stream, opcode, wasm_get_opcode_name(opcode));
}
-static void write_type(WasmStream* stream, WasmType type) {
- write_i32_leb128(stream, type, wasm_get_type_name(type));
+void wasm_write_type(WasmStream* stream, WasmType type) {
+ wasm_write_i32_leb128(stream, type, wasm_get_type_name(type));
}
static void write_inline_signature_type(WasmStream* stream,
const WasmBlockSignature* sig) {
if (sig->size == 0) {
- write_type(stream, WASM_TYPE_VOID);
+ wasm_write_type(stream, WASM_TYPE_VOID);
} else if (sig->size == 1) {
- write_type(stream, sig->data[0]);
+ wasm_write_type(stream, sig->data[0]);
} else {
/* this is currently unrepresentable */
wasm_write_u8(stream, 0xff, "INVALID INLINE SIGNATURE");
@@ -244,8 +262,8 @@ static void begin_custom_section(Context* ctx,
ctx->last_section_leb_size_guess = leb_size_guess;
ctx->last_section_offset =
write_u32_leb128_space(ctx, leb_size_guess, "section size (guess)");
- write_str(&ctx->stream, name, strlen(name), WASM_PRINT_CHARS,
- "custom section name");
+ wasm_write_str(&ctx->stream, name, strlen(name), WASM_PRINT_CHARS,
+ "custom section name");
}
static void end_section(Context* ctx) {
@@ -272,44 +290,45 @@ static void write_expr(Context* ctx,
const WasmExpr* expr) {
switch (expr->type) {
case WASM_EXPR_TYPE_BINARY:
- write_opcode(&ctx->stream, expr->binary.opcode);
+ wasm_write_opcode(&ctx->stream, expr->binary.opcode);
break;
case WASM_EXPR_TYPE_BLOCK:
- write_opcode(&ctx->stream, WASM_OPCODE_BLOCK);
+ wasm_write_opcode(&ctx->stream, WASM_OPCODE_BLOCK);
write_inline_signature_type(&ctx->stream, &expr->block.sig);
write_expr_list(ctx, module, func, expr->block.first);
- write_opcode(&ctx->stream, WASM_OPCODE_END);
+ wasm_write_opcode(&ctx->stream, WASM_OPCODE_END);
break;
case WASM_EXPR_TYPE_BR:
- write_opcode(&ctx->stream, WASM_OPCODE_BR);
- write_u32_leb128(&ctx->stream, get_label_var_depth(ctx, &expr->br.var),
- "break depth");
+ wasm_write_opcode(&ctx->stream, WASM_OPCODE_BR);
+ wasm_write_u32_leb128(
+ &ctx->stream, get_label_var_depth(ctx, &expr->br.var), "break depth");
break;
case WASM_EXPR_TYPE_BR_IF:
- write_opcode(&ctx->stream, WASM_OPCODE_BR_IF);
- write_u32_leb128(&ctx->stream, get_label_var_depth(ctx, &expr->br_if.var),
- "break depth");
+ wasm_write_opcode(&ctx->stream, WASM_OPCODE_BR_IF);
+ wasm_write_u32_leb128(&ctx->stream,
+ get_label_var_depth(ctx, &expr->br_if.var),
+ "break depth");
break;
case WASM_EXPR_TYPE_BR_TABLE: {
- write_opcode(&ctx->stream, WASM_OPCODE_BR_TABLE);
- write_u32_leb128(&ctx->stream, expr->br_table.targets.size,
- "num targets");
+ wasm_write_opcode(&ctx->stream, WASM_OPCODE_BR_TABLE);
+ wasm_write_u32_leb128(&ctx->stream, expr->br_table.targets.size,
+ "num targets");
size_t i;
uint32_t depth;
for (i = 0; i < expr->br_table.targets.size; ++i) {
depth = get_label_var_depth(ctx, &expr->br_table.targets.data[i]);
- write_u32_leb128(&ctx->stream, depth, "break depth");
+ wasm_write_u32_leb128(&ctx->stream, depth, "break depth");
}
depth = get_label_var_depth(ctx, &expr->br_table.default_target);
- write_u32_leb128(&ctx->stream, depth, "break depth for default");
+ wasm_write_u32_leb128(&ctx->stream, depth, "break depth for default");
break;
}
case WASM_EXPR_TYPE_CALL: {
int index = wasm_get_func_index_by_var(module, &expr->call.var);
assert(ctx->options->is_invalid ||
(index >= 0 && (size_t)index < module->funcs.size));
- write_opcode(&ctx->stream, WASM_OPCODE_CALL);
- write_u32_leb128(&ctx->stream, index, "func index");
+ wasm_write_opcode(&ctx->stream, WASM_OPCODE_CALL);
+ wasm_write_u32_leb128(&ctx->stream, index, "function index");
break;
}
case WASM_EXPR_TYPE_CALL_INDIRECT: {
@@ -317,33 +336,33 @@ static void write_expr(Context* ctx,
wasm_get_func_type_index_by_var(module, &expr->call_indirect.var);
assert(ctx->options->is_invalid ||
(index >= 0 && (size_t)index < module->func_types.size));
- write_opcode(&ctx->stream, WASM_OPCODE_CALL_INDIRECT);
- write_u32_leb128(&ctx->stream, index, "signature index");
- write_u32_leb128(&ctx->stream, 0, "call_indirect reserved");
+ wasm_write_opcode(&ctx->stream, WASM_OPCODE_CALL_INDIRECT);
+ wasm_write_u32_leb128(&ctx->stream, index, "signature index");
+ wasm_write_u32_leb128(&ctx->stream, 0, "call_indirect reserved");
break;
}
case WASM_EXPR_TYPE_COMPARE:
- write_opcode(&ctx->stream, expr->compare.opcode);
+ wasm_write_opcode(&ctx->stream, expr->compare.opcode);
break;
case WASM_EXPR_TYPE_CONST:
switch (expr->const_.type) {
case WASM_TYPE_I32: {
- write_opcode(&ctx->stream, WASM_OPCODE_I32_CONST);
- write_i32_leb128(&ctx->stream, (int32_t)expr->const_.u32,
- "i32 literal");
+ wasm_write_opcode(&ctx->stream, WASM_OPCODE_I32_CONST);
+ wasm_write_i32_leb128(&ctx->stream, (int32_t)expr->const_.u32,
+ "i32 literal");
break;
}
case WASM_TYPE_I64:
- write_opcode(&ctx->stream, WASM_OPCODE_I64_CONST);
+ wasm_write_opcode(&ctx->stream, WASM_OPCODE_I64_CONST);
write_i64_leb128(&ctx->stream, (int64_t)expr->const_.u64,
"i64 literal");
break;
case WASM_TYPE_F32:
- write_opcode(&ctx->stream, WASM_OPCODE_F32_CONST);
+ wasm_write_opcode(&ctx->stream, WASM_OPCODE_F32_CONST);
wasm_write_u32(&ctx->stream, expr->const_.f32_bits, "f32 literal");
break;
case WASM_TYPE_F64:
- write_opcode(&ctx->stream, WASM_OPCODE_F64_CONST);
+ wasm_write_opcode(&ctx->stream, WASM_OPCODE_F64_CONST);
wasm_write_u64(&ctx->stream, expr->const_.f64_bits, "f64 literal");
break;
default:
@@ -351,97 +370,97 @@ static void write_expr(Context* ctx,
}
break;
case WASM_EXPR_TYPE_CONVERT:
- write_opcode(&ctx->stream, expr->convert.opcode);
+ wasm_write_opcode(&ctx->stream, expr->convert.opcode);
break;
case WASM_EXPR_TYPE_CURRENT_MEMORY:
- write_opcode(&ctx->stream, WASM_OPCODE_CURRENT_MEMORY);
- write_u32_leb128(&ctx->stream, 0, "current_memory reserved");
+ wasm_write_opcode(&ctx->stream, WASM_OPCODE_CURRENT_MEMORY);
+ wasm_write_u32_leb128(&ctx->stream, 0, "current_memory reserved");
break;
case WASM_EXPR_TYPE_DROP:
- write_opcode(&ctx->stream, WASM_OPCODE_DROP);
+ wasm_write_opcode(&ctx->stream, WASM_OPCODE_DROP);
break;
case WASM_EXPR_TYPE_GET_GLOBAL: {
int index = wasm_get_global_index_by_var(module, &expr->get_global.var);
- write_opcode(&ctx->stream, WASM_OPCODE_GET_GLOBAL);
- write_u32_leb128(&ctx->stream, index, "global index");
+ wasm_write_opcode(&ctx->stream, WASM_OPCODE_GET_GLOBAL);
+ wasm_write_u32_leb128(&ctx->stream, index, "global index");
break;
}
case WASM_EXPR_TYPE_GET_LOCAL: {
int index = wasm_get_local_index_by_var(func, &expr->get_local.var);
- write_opcode(&ctx->stream, WASM_OPCODE_GET_LOCAL);
- write_u32_leb128(&ctx->stream, index, "local index");
+ wasm_write_opcode(&ctx->stream, WASM_OPCODE_GET_LOCAL);
+ wasm_write_u32_leb128(&ctx->stream, index, "local index");
break;
}
case WASM_EXPR_TYPE_GROW_MEMORY:
- write_opcode(&ctx->stream, WASM_OPCODE_GROW_MEMORY);
- write_u32_leb128(&ctx->stream, 0, "grow_memory reserved");
+ wasm_write_opcode(&ctx->stream, WASM_OPCODE_GROW_MEMORY);
+ wasm_write_u32_leb128(&ctx->stream, 0, "grow_memory reserved");
break;
case WASM_EXPR_TYPE_IF:
- write_opcode(&ctx->stream, WASM_OPCODE_IF);
+ wasm_write_opcode(&ctx->stream, WASM_OPCODE_IF);
write_inline_signature_type(&ctx->stream, &expr->if_.true_.sig);
write_expr_list(ctx, module, func, expr->if_.true_.first);
if (expr->if_.false_) {
- write_opcode(&ctx->stream, WASM_OPCODE_ELSE);
+ wasm_write_opcode(&ctx->stream, WASM_OPCODE_ELSE);
write_expr_list(ctx, module, func, expr->if_.false_);
}
- write_opcode(&ctx->stream, WASM_OPCODE_END);
+ wasm_write_opcode(&ctx->stream, WASM_OPCODE_END);
break;
case WASM_EXPR_TYPE_LOAD: {
- write_opcode(&ctx->stream, expr->load.opcode);
+ wasm_write_opcode(&ctx->stream, expr->load.opcode);
uint32_t align =
wasm_get_opcode_alignment(expr->load.opcode, expr->load.align);
wasm_write_u8(&ctx->stream, log2_u32(align), "alignment");
- write_u32_leb128(&ctx->stream, (uint32_t)expr->load.offset,
- "load offset");
+ wasm_write_u32_leb128(&ctx->stream, (uint32_t)expr->load.offset,
+ "load offset");
break;
}
case WASM_EXPR_TYPE_LOOP:
- write_opcode(&ctx->stream, WASM_OPCODE_LOOP);
+ wasm_write_opcode(&ctx->stream, WASM_OPCODE_LOOP);
write_inline_signature_type(&ctx->stream, &expr->loop.sig);
write_expr_list(ctx, module, func, expr->loop.first);
- write_opcode(&ctx->stream, WASM_OPCODE_END);
+ wasm_write_opcode(&ctx->stream, WASM_OPCODE_END);
break;
case WASM_EXPR_TYPE_NOP:
- write_opcode(&ctx->stream, WASM_OPCODE_NOP);
+ wasm_write_opcode(&ctx->stream, WASM_OPCODE_NOP);
break;
case WASM_EXPR_TYPE_RETURN:
- write_opcode(&ctx->stream, WASM_OPCODE_RETURN);
+ wasm_write_opcode(&ctx->stream, WASM_OPCODE_RETURN);
break;
case WASM_EXPR_TYPE_SELECT:
- write_opcode(&ctx->stream, WASM_OPCODE_SELECT);
+ wasm_write_opcode(&ctx->stream, WASM_OPCODE_SELECT);
break;
case WASM_EXPR_TYPE_SET_GLOBAL: {
int index = wasm_get_global_index_by_var(module, &expr->get_global.var);
- write_opcode(&ctx->stream, WASM_OPCODE_SET_GLOBAL);
- write_u32_leb128(&ctx->stream, index, "global index");
+ wasm_write_opcode(&ctx->stream, WASM_OPCODE_SET_GLOBAL);
+ wasm_write_u32_leb128(&ctx->stream, index, "global index");
break;
}
case WASM_EXPR_TYPE_SET_LOCAL: {
int index = wasm_get_local_index_by_var(func, &expr->get_local.var);
- write_opcode(&ctx->stream, WASM_OPCODE_SET_LOCAL);
- write_u32_leb128(&ctx->stream, index, "local index");
+ wasm_write_opcode(&ctx->stream, WASM_OPCODE_SET_LOCAL);
+ wasm_write_u32_leb128(&ctx->stream, index, "local index");
break;
}
case WASM_EXPR_TYPE_STORE: {
- write_opcode(&ctx->stream, expr->store.opcode);
+ wasm_write_opcode(&ctx->stream, expr->store.opcode);
uint32_t align =
wasm_get_opcode_alignment(expr->store.opcode, expr->store.align);
wasm_write_u8(&ctx->stream, log2_u32(align), "alignment");
- write_u32_leb128(&ctx->stream, (uint32_t)expr->store.offset,
- "store offset");
+ wasm_write_u32_leb128(&ctx->stream, (uint32_t)expr->store.offset,
+ "store offset");
break;
}
case WASM_EXPR_TYPE_TEE_LOCAL: {
int index = wasm_get_local_index_by_var(func, &expr->get_local.var);
- write_opcode(&ctx->stream, WASM_OPCODE_TEE_LOCAL);
- write_u32_leb128(&ctx->stream, index, "local index");
+ wasm_write_opcode(&ctx->stream, WASM_OPCODE_TEE_LOCAL);
+ wasm_write_u32_leb128(&ctx->stream, index, "local index");
break;
}
case WASM_EXPR_TYPE_UNARY:
- write_opcode(&ctx->stream, expr->unary.opcode);
+ wasm_write_opcode(&ctx->stream, expr->unary.opcode);
break;
case WASM_EXPR_TYPE_UNREACHABLE:
- write_opcode(&ctx->stream, WASM_OPCODE_UNREACHABLE);
+ wasm_write_opcode(&ctx->stream, WASM_OPCODE_UNREACHABLE);
break;
}
}
@@ -460,7 +479,7 @@ static void write_init_expr(Context* ctx,
const WasmExpr* expr) {
if (expr)
write_expr(ctx, module, NULL, expr);
- write_opcode(&ctx->stream, WASM_OPCODE_END);
+ wasm_write_opcode(&ctx->stream, WASM_OPCODE_END);
}
static void write_func_locals(Context* ctx,
@@ -468,7 +487,7 @@ static void write_func_locals(Context* ctx,
const WasmFunc* func,
const WasmTypeVector* local_types) {
if (local_types->size == 0) {
- write_u32_leb128(&ctx->stream, 0, "local decl count");
+ wasm_write_u32_leb128(&ctx->stream, 0, "local decl count");
return;
}
@@ -491,7 +510,7 @@ static void write_func_locals(Context* ctx,
}
/* loop through again to write everything out */
- write_u32_leb128(&ctx->stream, local_decl_count, "local decl count");
+ wasm_write_u32_leb128(&ctx->stream, local_decl_count, "local decl count");
current_type = GET_LOCAL_TYPE(FIRST_LOCAL_INDEX);
uint32_t local_type_count = 1;
for (i = FIRST_LOCAL_INDEX + 1; i <= LAST_LOCAL_INDEX; ++i) {
@@ -500,8 +519,8 @@ static void write_func_locals(Context* ctx,
if (current_type == type) {
local_type_count++;
} else {
- write_u32_leb128(&ctx->stream, local_type_count, "local type count");
- write_type(&ctx->stream, current_type);
+ wasm_write_u32_leb128(&ctx->stream, local_type_count, "local type count");
+ wasm_write_type(&ctx->stream, current_type);
local_type_count = 1;
current_type = type;
}
@@ -513,30 +532,28 @@ static void write_func(Context* ctx,
const WasmFunc* func) {
write_func_locals(ctx, module, func, &func->local_types);
write_expr_list(ctx, module, func, func->first_expr);
- write_opcode(&ctx->stream, WASM_OPCODE_END);
+ wasm_write_opcode(&ctx->stream, WASM_OPCODE_END);
}
-static void write_table(Context* ctx, const WasmTable* table) {
- const WasmLimits* limits = &table->elem_limits;
- write_type(&ctx->stream, WASM_TYPE_ANYFUNC);
+void wasm_write_limits(WasmStream* stream, const WasmLimits* limits) {
uint32_t flags = limits->has_max ? WASM_BINARY_LIMITS_HAS_MAX_FLAG : 0;
- write_u32_leb128(&ctx->stream, flags, "table flags");
- write_u32_leb128(&ctx->stream, limits->initial, "table initial elems");
+ wasm_write_u32_leb128(stream, flags, "limits: flags");
+ wasm_write_u32_leb128(stream, limits->initial, "limits: initial");
if (limits->has_max)
- write_u32_leb128(&ctx->stream, limits->max, "table max elems");
+ wasm_write_u32_leb128(stream, limits->max, "limits: max");
+}
+
+static void write_table(Context* ctx, const WasmTable* table) {
+ wasm_write_type(&ctx->stream, WASM_TYPE_ANYFUNC);
+ wasm_write_limits(&ctx->stream, &table->elem_limits);
}
static void write_memory(Context* ctx, const WasmMemory* memory) {
- const WasmLimits* limits = &memory->page_limits;
- uint32_t flags = limits->has_max ? WASM_BINARY_LIMITS_HAS_MAX_FLAG : 0;
- write_u32_leb128(&ctx->stream, flags, "memory flags");
- write_u32_leb128(&ctx->stream, limits->initial, "memory initial pages");
- if (limits->has_max)
- write_u32_leb128(&ctx->stream, limits->max, "memory max pages");
+ wasm_write_limits(&ctx->stream, &memory->page_limits);
}
static void write_global_header(Context* ctx, const WasmGlobal* global) {
- write_type(&ctx->stream, global->type);
+ wasm_write_type(&ctx->stream, global->type);
wasm_write_u8(&ctx->stream, global->mutable_, "global mutability");
}
@@ -551,46 +568,46 @@ static void write_module(Context* ctx, const WasmModule* module) {
if (module->func_types.size) {
begin_known_section(ctx, WASM_BINARY_SECTION_TYPE, leb_size_guess);
- write_u32_leb128(&ctx->stream, module->func_types.size, "num types");
+ wasm_write_u32_leb128(&ctx->stream, module->func_types.size, "num types");
for (i = 0; i < module->func_types.size; ++i) {
const WasmFuncType* func_type = module->func_types.data[i];
const WasmFuncSignature* sig = &func_type->sig;
write_header(ctx, "type", i);
- write_type(&ctx->stream, WASM_TYPE_FUNC);
+ wasm_write_type(&ctx->stream, WASM_TYPE_FUNC);
size_t j;
uint32_t num_params = sig->param_types.size;
uint32_t num_results = sig->result_types.size;
- write_u32_leb128(&ctx->stream, num_params, "num params");
+ wasm_write_u32_leb128(&ctx->stream, num_params, "num params");
for (j = 0; j < num_params; ++j)
- write_type(&ctx->stream, sig->param_types.data[j]);
+ wasm_write_type(&ctx->stream, sig->param_types.data[j]);
- write_u32_leb128(&ctx->stream, num_results, "num results");
+ wasm_write_u32_leb128(&ctx->stream, num_results, "num results");
for (j = 0; j < num_results; ++j)
- write_type(&ctx->stream, sig->result_types.data[j]);
+ wasm_write_type(&ctx->stream, sig->result_types.data[j]);
}
end_section(ctx);
}
if (module->imports.size) {
begin_known_section(ctx, WASM_BINARY_SECTION_IMPORT, leb_size_guess);
- write_u32_leb128(&ctx->stream, module->imports.size, "num imports");
+ wasm_write_u32_leb128(&ctx->stream, module->imports.size, "num imports");
for (i = 0; i < module->imports.size; ++i) {
const WasmImport* import = module->imports.data[i];
write_header(ctx, "import header", i);
- write_str(&ctx->stream, import->module_name.start,
- import->module_name.length, WASM_PRINT_CHARS,
- "import module name");
- write_str(&ctx->stream, import->field_name.start,
- import->field_name.length, WASM_PRINT_CHARS,
- "import field name");
+ wasm_write_str(&ctx->stream, import->module_name.start,
+ import->module_name.length, WASM_PRINT_CHARS,
+ "import module name");
+ wasm_write_str(&ctx->stream, import->field_name.start,
+ import->field_name.length, WASM_PRINT_CHARS,
+ "import field name");
wasm_write_u8(&ctx->stream, import->kind, "import kind");
switch (import->kind) {
case WASM_EXTERNAL_KIND_FUNC:
- write_u32_leb128(&ctx->stream, wasm_get_func_type_index_by_decl(
- module, &import->func.decl),
- "import signature index");
+ wasm_write_u32_leb128(&ctx->stream, wasm_get_func_type_index_by_decl(
+ module, &import->func.decl),
+ "import signature index");
break;
case WASM_EXTERNAL_KIND_TABLE:
write_table(ctx, &import->table);
@@ -613,16 +630,16 @@ static void write_module(Context* ctx, const WasmModule* module) {
uint32_t num_funcs = module->funcs.size - module->num_func_imports;
if (num_funcs) {
begin_known_section(ctx, WASM_BINARY_SECTION_FUNCTION, leb_size_guess);
- write_u32_leb128(&ctx->stream, num_funcs, "num functions");
+ wasm_write_u32_leb128(&ctx->stream, num_funcs, "num functions");
for (i = 0; i < num_funcs; ++i) {
const WasmFunc* func = module->funcs.data[i + module->num_func_imports];
char desc[100];
wasm_snprintf(desc, sizeof(desc), "function %" PRIzd " signature index",
i);
- write_u32_leb128(&ctx->stream,
- wasm_get_func_type_index_by_decl(module, &func->decl),
- desc);
+ wasm_write_u32_leb128(
+ &ctx->stream, wasm_get_func_type_index_by_decl(module, &func->decl),
+ desc);
}
end_section(ctx);
}
@@ -631,7 +648,7 @@ static void write_module(Context* ctx, const WasmModule* module) {
uint32_t num_tables = module->tables.size - module->num_table_imports;
if (num_tables) {
begin_known_section(ctx, WASM_BINARY_SECTION_TABLE, leb_size_guess);
- write_u32_leb128(&ctx->stream, num_tables, "num tables");
+ wasm_write_u32_leb128(&ctx->stream, num_tables, "num tables");
for (i = 0; i < num_tables; ++i) {
const WasmTable* table =
module->tables.data[i + module->num_table_imports];
@@ -645,7 +662,7 @@ static void write_module(Context* ctx, const WasmModule* module) {
uint32_t num_memories = module->memories.size - module->num_memory_imports;
if (num_memories) {
begin_known_section(ctx, WASM_BINARY_SECTION_MEMORY, leb_size_guess);
- write_u32_leb128(&ctx->stream, num_memories, "num memories");
+ wasm_write_u32_leb128(&ctx->stream, num_memories, "num memories");
for (i = 0; i < num_memories; ++i) {
const WasmMemory* memory =
module->memories.data[i + module->num_memory_imports];
@@ -659,7 +676,7 @@ static void write_module(Context* ctx, const WasmModule* module) {
uint32_t num_globals = module->globals.size - module->num_global_imports;
if (num_globals) {
begin_known_section(ctx, WASM_BINARY_SECTION_GLOBAL, leb_size_guess);
- write_u32_leb128(&ctx->stream, num_globals, "num globals");
+ wasm_write_u32_leb128(&ctx->stream, num_globals, "num globals");
for (i = 0; i < num_globals; ++i) {
const WasmGlobal* global =
@@ -672,40 +689,40 @@ static void write_module(Context* ctx, const WasmModule* module) {
if (module->exports.size) {
begin_known_section(ctx, WASM_BINARY_SECTION_EXPORT, leb_size_guess);
- write_u32_leb128(&ctx->stream, module->exports.size, "num exports");
+ wasm_write_u32_leb128(&ctx->stream, module->exports.size, "num exports");
for (i = 0; i < module->exports.size; ++i) {
const WasmExport* export = module->exports.data[i];
- write_str(&ctx->stream, export->name.start, export->name.length,
- WASM_PRINT_CHARS, "export name");
+ wasm_write_str(&ctx->stream, export->name.start, export->name.length,
+ WASM_PRINT_CHARS, "export name");
wasm_write_u8(&ctx->stream, export->kind, "export kind");
switch (export->kind) {
case WASM_EXTERNAL_KIND_FUNC: {
int index = wasm_get_func_index_by_var(module, &export->var);
assert(ctx->options->is_invalid ||
(index >= 0 && (size_t)index < module->funcs.size));
- write_u32_leb128(&ctx->stream, index, "export func index");
+ wasm_write_u32_leb128(&ctx->stream, index, "export func index");
break;
}
case WASM_EXTERNAL_KIND_TABLE: {
int index = wasm_get_table_index_by_var(module, &export->var);
assert(ctx->options->is_invalid ||
(index >= 0 && (size_t)index < module->tables.size));
- write_u32_leb128(&ctx->stream, index, "export table index");
+ wasm_write_u32_leb128(&ctx->stream, index, "export table index");
break;
}
case WASM_EXTERNAL_KIND_MEMORY: {
int index = wasm_get_memory_index_by_var(module, &export->var);
assert(ctx->options->is_invalid ||
(index >= 0 && (size_t)index < module->memories.size));
- write_u32_leb128(&ctx->stream, index, "export memory index");
+ wasm_write_u32_leb128(&ctx->stream, index, "export memory index");
break;
}
case WASM_EXTERNAL_KIND_GLOBAL: {
int index = wasm_get_global_index_by_var(module, &export->var);
assert(ctx->options->is_invalid ||
(index >= 0 && (size_t)index < module->globals.size));
- write_u32_leb128(&ctx->stream, index, "export global index");
+ wasm_write_u32_leb128(&ctx->stream, index, "export global index");
break;
}
case WASM_NUM_EXTERNAL_KINDS:
@@ -720,30 +737,30 @@ static void write_module(Context* ctx, const WasmModule* module) {
int start_func_index = wasm_get_func_index_by_var(module, module->start);
if (start_func_index != -1) {
begin_known_section(ctx, WASM_BINARY_SECTION_START, leb_size_guess);
- write_u32_leb128(&ctx->stream, start_func_index, "start func index");
+ wasm_write_u32_leb128(&ctx->stream, start_func_index, "start func index");
end_section(ctx);
}
}
if (module->tables.size && module->elem_segments.size) {
begin_known_section(ctx, WASM_BINARY_SECTION_ELEM, leb_size_guess);
- write_u32_leb128(&ctx->stream, module->elem_segments.size,
- "num elem segments");
+ wasm_write_u32_leb128(&ctx->stream, module->elem_segments.size,
+ "num elem segments");
for (i = 0; i < module->elem_segments.size; ++i) {
WasmElemSegment* segment = module->elem_segments.data[i];
int table_index =
wasm_get_table_index_by_var(module, &segment->table_var);
write_header(ctx, "elem segment header", i);
- write_u32_leb128(&ctx->stream, table_index, "table index");
+ wasm_write_u32_leb128(&ctx->stream, table_index, "table index");
write_init_expr(ctx, module, segment->offset);
- write_u32_leb128(&ctx->stream, segment->vars.size,
- "num function indices");
+ wasm_write_u32_leb128(&ctx->stream, segment->vars.size,
+ "num function indices");
size_t j;
for (j = 0; j < segment->vars.size; ++j) {
int index = wasm_get_func_index_by_var(module, &segment->vars.data[j]);
assert(ctx->options->is_invalid ||
(index >= 0 && (size_t)index < module->funcs.size));
- write_u32_leb128(&ctx->stream, index, "function index");
+ wasm_write_u32_leb128(&ctx->stream, index, "function index");
}
}
end_section(ctx);
@@ -751,7 +768,7 @@ static void write_module(Context* ctx, const WasmModule* module) {
if (num_funcs) {
begin_known_section(ctx, WASM_BINARY_SECTION_CODE, leb_size_guess);
- write_u32_leb128(&ctx->stream, num_funcs, "num functions");
+ wasm_write_u32_leb128(&ctx->stream, num_funcs, "num functions");
for (i = 0; i < num_funcs; ++i) {
write_header(ctx, "function body", i);
@@ -770,16 +787,16 @@ static void write_module(Context* ctx, const WasmModule* module) {
if (module->memories.size && module->data_segments.size) {
begin_known_section(ctx, WASM_BINARY_SECTION_DATA, leb_size_guess);
- write_u32_leb128(&ctx->stream, module->data_segments.size,
- "num data segments");
+ wasm_write_u32_leb128(&ctx->stream, module->data_segments.size,
+ "num data segments");
for (i = 0; i < module->data_segments.size; ++i) {
const WasmDataSegment* segment = module->data_segments.data[i];
write_header(ctx, "data segment header", i);
int memory_index =
wasm_get_memory_index_by_var(module, &segment->memory_var);
- write_u32_leb128(&ctx->stream, memory_index, "memory index");
+ wasm_write_u32_leb128(&ctx->stream, memory_index, "memory index");
write_init_expr(ctx, module, segment->offset);
- write_u32_leb128(&ctx->stream, segment->size, "data segment size");
+ wasm_write_u32_leb128(&ctx->stream, segment->size, "data segment size");
write_header(ctx, "data segment data", i);
wasm_write_data(&ctx->stream, segment->data, segment->size,
"data segment data");
@@ -793,7 +810,7 @@ static void write_module(Context* ctx, const WasmModule* module) {
char desc[100];
begin_custom_section(ctx, WASM_BINARY_SECTION_NAME, leb_size_guess);
- write_u32_leb128(&ctx->stream, module->funcs.size, "num functions");
+ wasm_write_u32_leb128(&ctx->stream, module->funcs.size, "num functions");
for (i = 0; i < module->funcs.size; ++i) {
const WasmFunc* func = module->funcs.data[i];
uint32_t num_params = wasm_get_num_params(func);
@@ -801,9 +818,9 @@ static void write_module(Context* ctx, const WasmModule* module) {
uint32_t num_params_and_locals = wasm_get_num_params_and_locals(func);
wasm_snprintf(desc, sizeof(desc), "func name %" PRIzd, i);
- write_str(&ctx->stream, func->name.start, func->name.length,
- WASM_PRINT_CHARS, desc);
- write_u32_leb128(&ctx->stream, num_params_and_locals, "num locals");
+ wasm_write_str(&ctx->stream, func->name.start, func->name.length,
+ WASM_PRINT_CHARS, desc);
+ wasm_write_u32_leb128(&ctx->stream, num_params_and_locals, "num locals");
if (num_params_and_locals) {
wasm_make_type_binding_reverse_mapping(
@@ -813,8 +830,8 @@ static void write_module(Context* ctx, const WasmModule* module) {
for (j = 0; j < num_params; ++j) {
WasmStringSlice name = index_to_name.data[j];
wasm_snprintf(desc, sizeof(desc), "local name %" PRIzd, j);
- write_str(&ctx->stream, name.start, name.length, WASM_PRINT_CHARS,
- desc);
+ wasm_write_str(&ctx->stream, name.start, name.length,
+ WASM_PRINT_CHARS, desc);
}
wasm_make_type_binding_reverse_mapping(
@@ -824,8 +841,8 @@ static void write_module(Context* ctx, const WasmModule* module) {
WasmStringSlice name = index_to_name.data[j];
wasm_snprintf(desc, sizeof(desc), "local name %" PRIzd,
num_params + j);
- write_str(&ctx->stream, name.start, name.length, WASM_PRINT_CHARS,
- desc);
+ wasm_write_str(&ctx->stream, name.start, name.length,
+ WASM_PRINT_CHARS, desc);
}
}
}