Compare commits

..

2 Commits

Author SHA1 Message Date
Mid
3d8b09167b table.insert test 2025-09-06 15:45:54 +03:00
Mid
3edff81d89 finish table_insert interface 2025-09-06 15:45:47 +03:00
3 changed files with 33 additions and 4 deletions

7
main.c
View File

@ -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) { 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 *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; return 0;
} }

17
table.h
View File

@ -241,9 +241,20 @@ static inline size_t ltable_len(LTable *self) {
return ret; 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); lrwl_write_lock(&self->lock);
index = ltable_len_nolock(self) + 1; size_t len = ltable_len_nolock(self);
ltable_set_nolock(self, lvalue_from_int32(index), val); 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); lrwl_write_unlock(&self->lock);
return success;
} }

13
table_insert.lua Normal file
View File

@ -0,0 +1,13 @@
t = {}
for i = 50, 1, -1 do
table.insert(t, 1, i)
end
for i = 50, 1, -1 do
table.insert(t, i)
end
for i = 1, #t do
print(t[i])
end