This commit is contained in:
2026-05-13 08:13:07 -05:00
parent 7501c74712
commit 86858ef26f
4 changed files with 34 additions and 6 deletions

View File

@@ -30,6 +30,8 @@ typedef struct {
} VALUE; } VALUE;
TYC_TYPE value_type(VALUE v); TYC_TYPE value_type(VALUE v);
bool type_is_collectable(TYC_TYPE t);
int32_t value_integer(VALUE v); int32_t value_integer(VALUE v);
float value_real(VALUE v); float value_real(VALUE v);
uint32_t value_idx(VALUE v); uint32_t value_idx(VALUE v);
@@ -63,6 +65,8 @@ TYC_RESULT stack_push_fp(Stack* s);
TYC_RESULT stack_pop_fp(Stack* s); TYC_RESULT stack_pop_fp(Stack* s);
size_t stack_fp_level(Stack* s); size_t stack_fp_level(Stack* s);
size_t stack_collectable_array(Stack* s, VALUE** values);
// //
// HEAP // HEAP
// //

View File

@@ -135,3 +135,14 @@ size_t stack_fp_level(Stack* s)
{ {
return s->fp_n; return s->fp_n;
} }
size_t stack_collectable_array(Stack* s, VALUE** values)
{
size_t j = 0;
*values = xmalloc(stack_len(s) * sizeof(VALUE));
for (size_t i = 0; i < s->stack_n; ++i)
if (type_is_collectable(s->stack[i].type))
(*values)[j++] = s->stack[i];
return j;
}

View File

@@ -9,6 +9,11 @@ TYC_TYPE value_type(VALUE v)
return v.type; return v.type;
} }
bool type_is_collectable(TYC_TYPE t)
{
return t == TT_STRING || t == TT_ARRAY || t == TT_TABLE;
}
int32_t value_integer(VALUE v) int32_t value_integer(VALUE v)
{ {
#ifdef CHECK_TYCHE_BUGS #ifdef CHECK_TYCHE_BUGS

View File

@@ -4,6 +4,7 @@
#include <math.h> #include <math.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <stdlib.h>
#define EQ(a, b) (memcmp(a, b) == 0) #define EQ(a, b) (memcmp(a, b) == 0)
@@ -116,21 +117,28 @@ int main()
stack_push(s, create_value_idx(TT_STRING, heap_add_string(h, "item2"))); stack_push(s, create_value_idx(TT_STRING, heap_add_string(h, "item2")));
stack_push(s, create_value_idx(TT_STRING, heap_add_string(h, "item3"))); stack_push(s, create_value_idx(TT_STRING, heap_add_string(h, "item3")));
/* size_t v_sz;
VALUE* v_idx;
assert(heap_size(h) == 3); assert(heap_size(h) == 3);
heap_gc(h, s->stack, s->stack_n); v_sz = stack_collectable_array(s, &v_idx);
heap_gc(h, v_idx, v_sz);
free(v_idx);
assert(heap_size(h) == 3); assert(heap_size(h) == 3);
stack_pop(s, NULL); stack_pop(s, NULL);
assert(heap_size(h) == 3); assert(heap_size(h) == 3);
heap_gc(&h, s.stack, s.stack_n); v_sz = stack_collectable_array(s, &v_idx);
heap_gc(h, v_idx, v_sz);
free(v_idx);
assert(heap_size(h) == 2); assert(heap_size(h) == 2);
stack_pop(s, NULL); stack_pop(s, NULL);
heap_gc(&h, s.stack, s.stack_n); v_sz = stack_collectable_array(s, &v_idx);
heap_gc(h, v_idx, v_sz);
free(v_idx);
assert(heap_size(h) == 1); assert(heap_size(h) == 1);
*/
heap_destroy(h); heap_destroy(h);
stack_destroy(s); stack_destroy(s);