mirror of
https://github.com/mkxp-z/mkxp-z.git
synced 2025-08-25 08:13:44 +02:00
Fix memory leaks in sandbox-bindgen
This commit is contained in:
parent
379c22833f
commit
e346343be4
1 changed files with 22 additions and 10 deletions
|
@ -197,8 +197,14 @@ HEADER_START = <<~HEREDOC
|
||||||
typedef std::tuple<wasm_ptr_t, wasm_ptr_t, wasm_ptr_t> key_t;
|
typedef std::tuple<wasm_ptr_t, wasm_ptr_t, wasm_ptr_t> key_t;
|
||||||
|
|
||||||
struct stack_frame {
|
struct stack_frame {
|
||||||
|
struct bindings &bind;
|
||||||
|
void (*destructor)(void *ptr);
|
||||||
boost::typeindex::type_index type;
|
boost::typeindex::type_index type;
|
||||||
wasm_ptr_t ptr;
|
wasm_ptr_t ptr;
|
||||||
|
inline stack_frame(struct bindings &bind, void (*destructor)(void *ptr), boost::typeindex::type_index type, wasm_ptr_t ptr) : bind(bind), destructor(destructor), type(type), ptr(ptr) {}
|
||||||
|
inline ~stack_frame() {
|
||||||
|
destructor(bind.instance->w2c_memory.data + ptr);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct fiber {
|
struct fiber {
|
||||||
|
@ -228,6 +234,10 @@ HEADER_START = <<~HEREDOC
|
||||||
struct fiber &fiber;
|
struct fiber &fiber;
|
||||||
wasm_ptr_t ptr;
|
wasm_ptr_t ptr;
|
||||||
|
|
||||||
|
static void stack_frame_destructor(void *ptr) {
|
||||||
|
((T *)ptr)->~T();
|
||||||
|
}
|
||||||
|
|
||||||
static inline struct fiber &init_fiber(struct bindings &bind) {
|
static inline struct fiber &init_fiber(struct bindings &bind) {
|
||||||
key_t key = {
|
key_t key = {
|
||||||
w2c_#{MODULE_NAME}_#{FIBER_ENTRY_POINT_FUNC}(bind.instance.get()),
|
w2c_#{MODULE_NAME}_#{FIBER_ENTRY_POINT_FUNC}(bind.instance.get()),
|
||||||
|
@ -242,10 +252,12 @@ HEADER_START = <<~HEREDOC
|
||||||
|
|
||||||
static wasm_ptr_t init_inner(struct bindings &bind, struct fiber &fiber) {
|
static wasm_ptr_t init_inner(struct bindings &bind, struct fiber &fiber) {
|
||||||
if (fiber.stack_ptr == fiber.stack.size()) {
|
if (fiber.stack_ptr == fiber.stack.size()) {
|
||||||
fiber.stack.push_back((struct stack_frame){
|
fiber.stack.emplace_back(
|
||||||
.type = boost::typeindex::type_id<T>(),
|
bind,
|
||||||
.ptr = (bind.instance->w2c_0x5F_stack_pointer -= sizeof(T)),
|
stack_frame_destructor,
|
||||||
});
|
boost::typeindex::type_id<T>(),
|
||||||
|
(bind.instance->w2c_0x5F_stack_pointer -= sizeof(T))
|
||||||
|
);
|
||||||
assert(bind.instance->w2c_0x5F_stack_pointer % sizeof(VALUE) == 0);
|
assert(bind.instance->w2c_0x5F_stack_pointer % sizeof(VALUE) == 0);
|
||||||
new(bind.instance->w2c_memory.data + bind.instance->w2c_0x5F_stack_pointer) T(bind);
|
new(bind.instance->w2c_memory.data + bind.instance->w2c_0x5F_stack_pointer) T(bind);
|
||||||
} else if (fiber.stack_ptr > fiber.stack.size()) {
|
} else if (fiber.stack_ptr > fiber.stack.size()) {
|
||||||
|
@ -259,10 +271,12 @@ HEADER_START = <<~HEREDOC
|
||||||
fiber.stack.pop_back();
|
fiber.stack.pop_back();
|
||||||
}
|
}
|
||||||
++fiber.stack_ptr;
|
++fiber.stack_ptr;
|
||||||
fiber.stack.push_back((struct stack_frame){
|
fiber.stack.emplace_back(
|
||||||
.type = boost::typeindex::type_id<T>(),
|
bind,
|
||||||
.ptr = (bind.instance->w2c_0x5F_stack_pointer -= sizeof(T)),
|
stack_frame_destructor,
|
||||||
});
|
boost::typeindex::type_id<T>(),
|
||||||
|
(bind.instance->w2c_0x5F_stack_pointer -= sizeof(T))
|
||||||
|
);
|
||||||
assert(bind.instance->w2c_0x5F_stack_pointer % sizeof(VALUE) == 0);
|
assert(bind.instance->w2c_0x5F_stack_pointer % sizeof(VALUE) == 0);
|
||||||
new(bind.instance->w2c_memory.data + bind.instance->w2c_0x5F_stack_pointer) T(bind);
|
new(bind.instance->w2c_memory.data + bind.instance->w2c_0x5F_stack_pointer) T(bind);
|
||||||
return bind.instance->w2c_0x5F_stack_pointer;
|
return bind.instance->w2c_0x5F_stack_pointer;
|
||||||
|
@ -284,8 +298,6 @@ HEADER_START = <<~HEREDOC
|
||||||
assert(fiber.stack.back().ptr == bind.instance->w2c_0x5F_stack_pointer);
|
assert(fiber.stack.back().ptr == bind.instance->w2c_0x5F_stack_pointer);
|
||||||
assert(fiber.stack.back().type == boost::typeindex::type_id<T>());
|
assert(fiber.stack.back().type == boost::typeindex::type_id<T>());
|
||||||
|
|
||||||
get()->~T();
|
|
||||||
|
|
||||||
fiber.stack.pop_back();
|
fiber.stack.pop_back();
|
||||||
bind.instance->w2c_0x5F_stack_pointer += sizeof(T);
|
bind.instance->w2c_0x5F_stack_pointer += sizeof(T);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue