.
This commit is contained in:
@@ -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
|
||||||
//
|
//
|
||||||
|
|||||||
13
lib/stack.c
13
lib/stack.c
@@ -134,4 +134,15 @@ TYC_RESULT stack_pop_fp(Stack* s)
|
|||||||
size_t stack_fp_level(Stack* s)
|
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;
|
||||||
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
18
test/tests.c
18
test/tests.c
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user