diff --git a/lib/priv.h b/lib/priv.h index 77c8978..422e1ef 100644 --- a/lib/priv.h +++ b/lib/priv.h @@ -30,6 +30,8 @@ typedef struct { } VALUE; TYC_TYPE value_type(VALUE v); +bool type_is_collectable(TYC_TYPE t); + int32_t value_integer(VALUE v); float value_real(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); size_t stack_fp_level(Stack* s); +size_t stack_collectable_array(Stack* s, VALUE** values); + // // HEAP // diff --git a/lib/stack.c b/lib/stack.c index 96a4c84..46a9993 100644 --- a/lib/stack.c +++ b/lib/stack.c @@ -134,4 +134,15 @@ TYC_RESULT stack_pop_fp(Stack* s) size_t stack_fp_level(Stack* s) { return s->fp_n; -} \ No newline at end of file +} + +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; +} diff --git a/lib/value.c b/lib/value.c index 5685254..0c0670c 100644 --- a/lib/value.c +++ b/lib/value.c @@ -9,6 +9,11 @@ TYC_TYPE value_type(VALUE v) 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) { #ifdef CHECK_TYCHE_BUGS diff --git a/test/tests.c b/test/tests.c index cbd6bfa..91c5a41 100644 --- a/test/tests.c +++ b/test/tests.c @@ -4,6 +4,7 @@ #include #include #include +#include #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, "item3"))); - /* + size_t v_sz; + VALUE* v_idx; + 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); stack_pop(s, NULL); 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); 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); - */ heap_destroy(h); stack_destroy(s);