|
|
|
@ -15,23 +15,73 @@ struct wasm_table_entry {
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct wasm_table {
|
|
|
|
|
uint32_t length;
|
|
|
|
|
uint32_t capacity;
|
|
|
|
|
struct wasm_table_entry data[];
|
|
|
|
|
uint32_t length;
|
|
|
|
|
uint32_t capacity;
|
|
|
|
|
struct wasm_table_entry *buffer;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static INLINE struct wasm_table *wasm_table_alloc(void);
|
|
|
|
|
static INLINE int wasm_table_init(struct wasm_table *self, size_t capacity);
|
|
|
|
|
static INLINE struct wasm_table *wasm_table_new(size_t capacity);
|
|
|
|
|
static INLINE void wasm_table_deinit(struct wasm_table *self);
|
|
|
|
|
static INLINE void wasm_table_free(struct wasm_table *self);
|
|
|
|
|
static INLINE void wasm_table_delete(struct wasm_table *self);
|
|
|
|
|
|
|
|
|
|
static INLINE struct wasm_table *
|
|
|
|
|
wasm_table_allocate(size_t capacity)
|
|
|
|
|
wasm_table_alloc(void)
|
|
|
|
|
{
|
|
|
|
|
struct wasm_table *self = (struct wasm_table *)malloc(sizeof(struct wasm_table)
|
|
|
|
|
+ capacity * sizeof(struct wasm_table_entry));
|
|
|
|
|
return (struct wasm_table *)malloc(sizeof(struct wasm_table));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static INLINE int
|
|
|
|
|
wasm_table_init(struct wasm_table *self, size_t capacity)
|
|
|
|
|
{
|
|
|
|
|
assert(self != NULL);
|
|
|
|
|
|
|
|
|
|
if (capacity > 0) {
|
|
|
|
|
self->buffer = calloc(capacity, sizeof(struct wasm_table_entry));
|
|
|
|
|
if (self->buffer == NULL) return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
self->capacity = capacity;
|
|
|
|
|
self->length = 0;
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static INLINE struct wasm_table *
|
|
|
|
|
wasm_table_new(size_t capacity)
|
|
|
|
|
{
|
|
|
|
|
struct wasm_table *self = wasm_table_alloc();
|
|
|
|
|
if (self == NULL) return NULL;
|
|
|
|
|
|
|
|
|
|
int rc = wasm_table_init(self, capacity);
|
|
|
|
|
if (rc < 0) {
|
|
|
|
|
wasm_table_free(self);
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return self;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static INLINE void
|
|
|
|
|
wasm_table_deinit(struct wasm_table *self)
|
|
|
|
|
{
|
|
|
|
|
assert(self != NULL);
|
|
|
|
|
|
|
|
|
|
if (self->capacity > 0) {
|
|
|
|
|
assert(self->buffer == NULL);
|
|
|
|
|
assert(self->length == 0);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
assert(self->buffer != NULL);
|
|
|
|
|
free(self->buffer);
|
|
|
|
|
self->buffer = NULL;
|
|
|
|
|
self->length = 0;
|
|
|
|
|
self->capacity = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static INLINE void
|
|
|
|
|
wasm_table_free(struct wasm_table *self)
|
|
|
|
|
{
|
|
|
|
@ -45,7 +95,7 @@ wasm_table_get(struct wasm_table *self, uint32_t idx, uint32_t type_id)
|
|
|
|
|
assert(self != NULL);
|
|
|
|
|
assert(idx < self->capacity);
|
|
|
|
|
|
|
|
|
|
struct wasm_table_entry f = self->data[idx];
|
|
|
|
|
struct wasm_table_entry f = self->buffer[idx];
|
|
|
|
|
// FIXME: Commented out function type check because of gocr
|
|
|
|
|
// assert(f.type_id == type_id);
|
|
|
|
|
|
|
|
|
@ -62,7 +112,7 @@ wasm_table_set(struct wasm_table *self, uint32_t idx, uint32_t type_id, char *po
|
|
|
|
|
assert(pointer != NULL);
|
|
|
|
|
|
|
|
|
|
/* TODO: atomic for multiple concurrent invocations? Issue #97 */
|
|
|
|
|
if (self->data[idx].type_id == type_id && self->data[idx].func_pointer == pointer) return;
|
|
|
|
|
if (self->buffer[idx].type_id == type_id && self->buffer[idx].func_pointer == pointer) return;
|
|
|
|
|
|
|
|
|
|
self->data[idx] = (struct wasm_table_entry){ .type_id = type_id, .func_pointer = pointer };
|
|
|
|
|
self->buffer[idx] = (struct wasm_table_entry){ .type_id = type_id, .func_pointer = pointer };
|
|
|
|
|
}
|
|
|
|
|