This commit is contained in:
Andre Wagner
2026-05-12 09:21:04 -05:00
parent 2fd11f879c
commit ad970577b0
4 changed files with 49 additions and 19 deletions

View File

@@ -35,7 +35,8 @@ DEBUG_CFLAGS=-Og -ggdb3 ${WARNINGS} -fno-omit-frame-pointer -fsanitize=address -
-DCHECK_TYCHE_BUGS=1 -DCHECK_TYCHE_BUGS=1
DEBUG_LDFLAGS=-fsanitize=address -fsanitize=undefined DEBUG_LDFLAGS=-fsanitize=address -fsanitize=undefined
UNAME_S := $(shell uname -s) # apple clang doesn't support -fsanitize=leak # apple clang doesn't support -fsanitize=leak
UNAME_S := $(shell uname -s)
ifneq ($(UNAME_S),Darwin) ifneq ($(UNAME_S),Darwin)
DEBUG_CFLAGS += -fsanitize=leak DEBUG_CFLAGS += -fsanitize=leak
DEBUG_LDFLAGS += -fsanitize=leak DEBUG_LDFLAGS += -fsanitize=leak

View File

@@ -55,6 +55,7 @@ static TYC_RESULT stack_peek(Stack* s, VALUE* v_out)
{ {
if (s->stack_n < stack_top_fp(s)) if (s->stack_n < stack_top_fp(s))
return T_ERR_STACK_UNDERFLOW; return T_ERR_STACK_UNDERFLOW;
if (v_out)
*v_out = s->stack[s->stack_n - 1]; *v_out = s->stack[s->stack_n - 1];
return T_OK; return T_OK;
} }
@@ -73,9 +74,17 @@ static size_t stack_len(Stack* s)
return s->stack_n - stack_top_fp(s); return s->stack_n - stack_top_fp(s);
} }
static VALUE stack_get(Stack* s, int32_t key) static TYC_RESULT stack_at(Stack* s, int32_t key, VALUE* v)
{ {
abort(); // TODO if (key >= 0) {
*v = s->stack[stack_top_fp(s) + key];
} else {
if (stack_top_fp(s) + s->stack_n + key < 0)
return T_ERR_STACK_ACCESS_OUT_OF_RANGE;
*v = s->stack[s->stack_n + key];
}
return T_OK;
} }
static void stack_set(Stack* s, int32_t key, VALUE v) static void stack_set(Stack* s, int32_t key, VALUE v)

View File

@@ -7,7 +7,7 @@ typedef enum {
typedef enum { typedef enum {
T_OK = 0, T_OK = 0,
T_ERR_STACK_UNDERFLOW = -1, T_ERR_STACK_FP_UNDERFLOW = -2, T_ERR_STACK_UNDERFLOW = -1, T_ERR_STACK_FP_UNDERFLOW = -2, T_ERR_STACK_ACCESS_OUT_OF_RANGE = -3,
} TYC_RESULT; } TYC_RESULT;
#endif //TYCHE_TYCHE_H #endif //TYCHE_TYCHE_H

View File

@@ -10,21 +10,41 @@
int main() int main()
{ {
// values // values
{
printf("### Values\n"); printf("### Values\n");
assert(value_type(create_value_integer(42)) == TT_INTEGER); assert(value_type(create_value_integer(42)) == TT_INTEGER);
assert(value_integer(create_value_integer(-42)) == -42); assert(value_integer(create_value_integer(-42)) == -42);
assert(fabsf(value_real(create_value_real(42.4f)) - 42.4f) < 0.00001f); assert(fabsf(value_real(create_value_real(42.4f)) - 42.4f) < 0.00001f);
assert(value_idx(create_value_idx(TT_FUNCTION, 42)) == 42); assert(value_idx(create_value_idx(TT_FUNCTION, 42)) == 42);
}
// values // stack
{
printf("### Stack\n"); printf("### Stack\n");
Stack s; Stack s;
stack_init(&s); stack_init(&s);
stack_push(&s, create_value_integer(10)); stack_push(&s, create_value_integer(10));
stack_push(&s, create_value_integer(20)); stack_push(&s, create_value_integer(20));
stack_push(&s, create_value_integer(30)); stack_push(&s, create_value_integer(30));
VALUE v;
assert(stack_len(&s) == 3); assert(stack_len(&s) == 3);
assert(stack_at(&s, 0, &v) == T_OK); assert(value_integer(v) == 10);
assert(stack_at(&s, 1, &v) == T_OK); assert(value_integer(v) == 20);
assert(stack_at(&s, -1, &v) == T_OK); assert(value_integer(v) == 30);
assert(stack_at(&s, -2, &v) == T_OK); assert(value_integer(v) == 20);
assert(stack_pop(&s, NULL) == T_OK);
assert(stack_pop(&s, NULL) == T_OK);
assert(stack_at(&s, -1, &v) == T_OK); assert(value_integer(v) == 10);
assert(stack_pop(&s, NULL) == T_OK);
assert(stack_len(&s) == 0);
assert(stack_pop(&s, NULL) == T_ERR_STACK_UNDERFLOW);
stack_finalize(&s); stack_finalize(&s);
}
} }