From ad970577b021ade44377259347cd41b09184e96c Mon Sep 17 00:00:00 2001 From: Andre Wagner Date: Tue, 12 May 2026 09:21:04 -0500 Subject: [PATCH] . --- Makefile | 3 ++- lib/stack.c | 15 ++++++++++++--- lib/tyche.h | 2 +- test/tests.c | 48 ++++++++++++++++++++++++++++++++++-------------- 4 files changed, 49 insertions(+), 19 deletions(-) diff --git a/Makefile b/Makefile index 4dd5582..b8a6401 100644 --- a/Makefile +++ b/Makefile @@ -35,7 +35,8 @@ DEBUG_CFLAGS=-Og -ggdb3 ${WARNINGS} -fno-omit-frame-pointer -fsanitize=address - -DCHECK_TYCHE_BUGS=1 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) DEBUG_CFLAGS += -fsanitize=leak DEBUG_LDFLAGS += -fsanitize=leak diff --git a/lib/stack.c b/lib/stack.c index 6996e7d..baf9bc3 100644 --- a/lib/stack.c +++ b/lib/stack.c @@ -55,7 +55,8 @@ static TYC_RESULT stack_peek(Stack* s, VALUE* v_out) { if (s->stack_n < stack_top_fp(s)) return T_ERR_STACK_UNDERFLOW; - *v_out = s->stack[s->stack_n - 1]; + if (v_out) + *v_out = s->stack[s->stack_n - 1]; return T_OK; } @@ -73,9 +74,17 @@ static size_t stack_len(Stack* 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) diff --git a/lib/tyche.h b/lib/tyche.h index ec3a9a7..ba94516 100644 --- a/lib/tyche.h +++ b/lib/tyche.h @@ -7,7 +7,7 @@ typedef enum { typedef enum { 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; #endif //TYCHE_TYCHE_H diff --git a/test/tests.c b/test/tests.c index 913eeda..2f6e67a 100644 --- a/test/tests.c +++ b/test/tests.c @@ -10,21 +10,41 @@ int main() { // values - printf("### Values\n"); - assert(value_type(create_value_integer(42)) == TT_INTEGER); - assert(value_integer(create_value_integer(-42)) == -42); - assert(fabsf(value_real(create_value_real(42.4f)) - 42.4f) < 0.00001f); - assert(value_idx(create_value_idx(TT_FUNCTION, 42)) == 42); + { + printf("### Values\n"); + assert(value_type(create_value_integer(42)) == TT_INTEGER); + assert(value_integer(create_value_integer(-42)) == -42); + assert(fabsf(value_real(create_value_real(42.4f)) - 42.4f) < 0.00001f); + assert(value_idx(create_value_idx(TT_FUNCTION, 42)) == 42); + } - // values - printf("### Stack\n"); - Stack s; - stack_init(&s); - stack_push(&s, create_value_integer(10)); - stack_push(&s, create_value_integer(20)); - stack_push(&s, create_value_integer(30)); + // stack + { + printf("### Stack\n"); - assert(stack_len(&s) == 3); + Stack s; + stack_init(&s); + + stack_push(&s, create_value_integer(10)); + stack_push(&s, create_value_integer(20)); + stack_push(&s, create_value_integer(30)); + + VALUE v; + 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); } \ No newline at end of file