diff --git a/main.c b/main.c index 35cee0b..34f6c34 100644 --- a/main.c +++ b/main.c @@ -32,7 +32,12 @@ static size_t native_print(LVM *lvm, void *ud, size_t argn, set_LValueU *heap, L static size_t table_insert(LVM *lvm, void *ud, size_t argn, set_LValueU *heap, LRegSet *regset) { LTable *tbl = (LTable*) (regset->regs[0].u & ~LTAG_MASK); - ltable_insert(tbl, regset->regs[1], 0); + if(argn == 2) { + ltable_insert(tbl, regset->regs[1], 0); + } else if(argn > 2) { + size_t idx = lvalue_to_int32(regset->regs[1]); + ltable_insert(tbl, regset->regs[2], idx); + } return 0; } diff --git a/table.h b/table.h index bcdc7e9..240d7a6 100644 --- a/table.h +++ b/table.h @@ -241,9 +241,20 @@ static inline size_t ltable_len(LTable *self) { return ret; } -static inline void ltable_insert(LTable *self, LValue val, size_t index) { +static inline bool ltable_insert(LTable *self, LValue val, size_t index) { lrwl_write_lock(&self->lock); - index = ltable_len_nolock(self) + 1; - ltable_set_nolock(self, lvalue_from_int32(index), val); + size_t len = ltable_len_nolock(self); + if(index == 0) { + index = len + 1; + } + bool success = false; + if(index <= len + 1) { + for(size_t i = len; i >= index; i--) { + ltable_set_nolock(self, lvalue_from_int32(i + 1), ltable_get_nolock(self, lvalue_from_int32(i))); + } + ltable_set_nolock(self, lvalue_from_int32(index), val); + success = true; + } lrwl_write_unlock(&self->lock); + return success; }