cursor = section_start + section_size;
}
- if (func_name_section == 0) return;
-
bh_printf("TRACE:\n");
wasm_frame_vec_t frames;
wasm_trap_trace(trap, &frames);
i32 func_idx = wasm_frame_func_index(frames.data[i]);
i32 mod_offset = wasm_frame_module_offset(frames.data[i]);
- i32 cursor = func_name_section + 4 * func_idx;
- i32 func_offset = *(i32 *) (wasm_raw_bytes.data + cursor);
- char* func_name = wasm_raw_bytes.data + func_name_section + func_offset;
+ if (func_name_section > 0) {
+ i32 cursor = func_name_section + 4 * func_idx;
+ i32 func_offset = *(i32 *) (wasm_raw_bytes.data + cursor);
+ char* func_name = wasm_raw_bytes.data + func_name_section + func_offset;
- bh_printf(" func[%d]:%p at %s\n", func_idx, mod_offset, func_name);
+ bh_printf(" func[%d]:%p at %s\n", func_idx, mod_offset, func_name);
+ } else {
+ bh_printf(" func[%d]\n", func_idx);
+ }
}
}
wasm_runtime.wasm_imports = wasm_imports;
wasm_runtime.wasm_memory = wasm_memory;
wasm_runtime.wasm_instance = wasm_instance;
+ wasm_runtime.wasm_store = wasm_store;
wasm_runtime.wasm_func_table = wasm_extern_as_table(
wasm_extern_lookup_by_name(wasm_module, wasm_instance, "__indirect_function_table")
);
use core.alloc
use core.net
use core.io
-use core.iter
+use core.slice
use core.encoding.osad
use runtime
memdebug_proc :: (m: &MemDebugState, action: AllocationAction, size: u32, align: u32, oldptr: rawptr) -> rawptr {
newptr := m.wrapped_allocator.func(m.wrapped_allocator.data, action, size, align, oldptr);
- trace := iter.as_iter(runtime.info.get_stack_trace())
- |> iter.map(frame => {
- info := frame.info;
- return MemDebugStackNode.{
- info.file, info.line, frame.current_line, info.func_name
+ trace: [] MemDebugStackNode = .[];
+ stack_trace := runtime.info.get_stack_trace();
+ if stack_trace {
+ slice.init(&trace, stack_trace.count, context.temp_allocator);
+ for i: stack_trace.count {
+ info := stack_trace[i].info;
+ trace[i] = .{
+ info.file, info.line, stack_trace[i].current_line, info.func_name
};
- })
- |> iter.collect(context.temp_allocator);
+ }
+ }
memdebug_send_message(m, .{
Action = .{
#define OVM_TYPE_F32 0x05
#define OVM_TYPE_F64 0x06
#define OVM_TYPE_V128 0x07
+#define OVM_TYPE_ERR 0xff
struct ovm_value_t {
union {
ovm_static_integer_array_t data_elem = state->program->static_data[instr->a];
if (VAL(instr->b).u32 >= (u32) data_elem.len) {
OVMI_EXCEPTION_HOOK;
+ ovm_value_t bad_val;
+ bad_val.type = OVM_TYPE_ERR;
+ return bad_val;
}
VAL(instr->r).i32 = state->program->static_integers[data_elem.start_idx + VAL(instr->b).u32];
ovm_engine_t *engine;
ovm_state_t *state;
ovm_program_t *program;
+
+ wasm_instance_t *instance;
};
typedef struct ovm_wasm_binding ovm_wasm_binding;
(w).kind = WASM_F64; \
(w).of.f64 = (o).f64; \
break; \
+ \
+ case OVM_TYPE_ERR: \
+ (w).kind = WASM_I32; \
+ (w).of.i32 = 0; \
+ break; \
\
default: \
printf("INVALID: %d\n", (o).type); \
}
ovm_value_t ovm_res = ovm_func_call(binding->engine, binding->state, binding->program, binding->func_idx, args->size, vals);
+
+ // Check for error (trap).
+ if (ovm_res.type == OVM_TYPE_ERR) {
+ wasm_byte_vec_t msg;
+ wasm_byte_vec_new(&msg, 9, "Hit error");
+ wasm_trap_t *trap = wasm_trap_new(binding->instance->store, (void *) &msg);
+ return trap;
+ }
+
if (!res || res->size == 0) return NULL;
OVM_TO_WASM(ovm_res, res->data[0]);
binding->func_idx = bh_arr_length(instance->funcs);
binding->program = ovm_program;
binding->state = ovm_state;
+ binding->instance = instance;
wasm_func_t *func = wasm_func_new_with_env(instance->store, instance->module->functypes.data[i],
wasm_to_ovm_func_call_binding, binding, NULL);
instance->store = store;
instance->module = module;
- if (store->instance) {
- bh_printf("A WASM store should only be used for a single instance!\n");
- return NULL;
+ if (!store->instance) {
+ store->instance = instance;
}
- store->instance = instance;
-
instance->funcs = NULL;
instance->memories = NULL;
instance->tables = NULL;
}
void wasm_trap_trace(const wasm_trap_t *trap, wasm_frame_vec_t *frames) {
- frames->size = 0;
- frames->data = NULL;
+ frames->size = trap->frames.size;
+ frames->data = trap->frames.data;
}
#endif
OnyxThread *thread = (OnyxThread *) data;
- wasm_store_t *wasm_store = runtime->wasm_store_new(runtime->wasm_engine);
-
wasm_trap_t* traps = NULL;
- thread->instance = runtime->wasm_instance_new(wasm_store, runtime->wasm_module, &runtime->wasm_imports, &traps);
+ thread->instance = runtime->wasm_instance_new(runtime->wasm_store, runtime->wasm_module, &runtime->wasm_imports, &traps);
+ assert(thread->instance);
wasm_extern_t* start_extern = runtime->wasm_extern_lookup_by_name(runtime->wasm_module, thread->instance, "_thread_start");
wasm_func_t* start_func = runtime->wasm_extern_as_func(start_extern);
}
runtime->wasm_instance_delete(thread->instance);
- runtime->wasm_store_delete(wasm_store);
return 0;
}
void (*(*wasm_func_from_idx)(wasm_table_t *table, unsigned int index, char *signature))(void);
void (*wasm_instance_delete)(wasm_instance_t *instance);
+
+ wasm_store_t *wasm_store;
} OnyxRuntime;
OnyxRuntime* runtime;