.
This commit is contained in:
3
Makefile
3
Makefile
@@ -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
|
||||||
|
|||||||
13
lib/stack.c
13
lib/stack.c
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
22
test/tests.c
22
test/tests.c
@@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user