This commit is contained in:
2026-05-13 11:01:18 -05:00
parent 9607c77939
commit f61348456b
6 changed files with 114 additions and 21 deletions

View File

@@ -77,7 +77,7 @@ uninstall:
# executable files # executable files
# #
LIB_SRC=lib/value.o lib/stack.o lib/array.o lib/heap.o lib/vm.o lib/utils.o LIB_SRC=lib/value.o lib/stack.o lib/array.o lib/table.o lib/heap.o lib/vm.o lib/utils.o
tyche: CFLAGS += ${RELEASE_CFLAGS} tyche: CFLAGS += ${RELEASE_CFLAGS}
tyche: LDFLAGS += ${RELEASE_LDFLAGS} tyche: LDFLAGS += ${RELEASE_LDFLAGS}

View File

@@ -24,12 +24,12 @@ void array_destroy(Array* a)
free(a); free(a);
} }
size_t array_len(Array* a) size_t array_len(Array const* a)
{ {
return a->n; return a->n;
} }
VALUE array_get(Array* a, size_t pos) VALUE array_get(Array const* a, size_t pos)
{ {
if (pos >= a->n) if (pos >= a->n)
return create_value_nil(); return create_value_nil();

View File

@@ -83,7 +83,7 @@ HEAP_KEY heap_add_string(Heap* h, const char* value)
return key; return key;
} }
TYC_RESULT heap_get_string(Heap* h, HEAP_KEY key, const char** value) TYC_RESULT heap_get_string(Heap const* h, HEAP_KEY key, const char** value)
{ {
khiter_t k = kh_get(HEAP, h->items, key); khiter_t k = kh_get(HEAP, h->items, key);
bool is_missing = (k == kh_end(h->items)); bool is_missing = (k == kh_end(h->items));
@@ -93,7 +93,7 @@ TYC_RESULT heap_get_string(Heap* h, HEAP_KEY key, const char** value)
return T_OK; return T_OK;
} }
size_t heap_size(Heap* h) size_t heap_size(Heap const* h)
{ {
return kh_size(h->items); return kh_size(h->items);
} }

View File

@@ -52,20 +52,20 @@ Stack* stack_new(void);
void stack_destroy(Stack* s); void stack_destroy(Stack* s);
TYC_RESULT stack_push(Stack* s, VALUE v); TYC_RESULT stack_push(Stack* s, VALUE v);
TYC_RESULT stack_peek(Stack* s, VALUE* v_out); TYC_RESULT stack_peek(Stack const* s, VALUE* v_out);
TYC_RESULT stack_pop(Stack* s, VALUE* v_out); TYC_RESULT stack_pop(Stack* s, VALUE* v_out);
size_t stack_len(Stack* s); size_t stack_len(Stack const* s);
TYC_RESULT stack_at(Stack* s, int32_t key, VALUE* v); TYC_RESULT stack_at(Stack const* s, int32_t key, VALUE* v);
TYC_RESULT stack_set(Stack* s, int32_t key, VALUE v); TYC_RESULT stack_set(Stack* s, int32_t key, VALUE v);
size_t stack_top_fp(Stack* s); size_t stack_top_fp(Stack const* s);
TYC_RESULT stack_push_fp(Stack* s); 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 const* s);
size_t stack_collectable_array(Stack* s, VALUE** values); size_t stack_collectable_array(Stack const* s, VALUE** values);
// //
// HEAP ARRAY // HEAP ARRAY
@@ -76,11 +76,24 @@ typedef struct Array Array;
Array* array_new(void); Array* array_new(void);
void array_destroy(Array* a); void array_destroy(Array* a);
size_t array_len(Array* a); size_t array_len(Array const* a);
VALUE array_get(Array* a, size_t pos); VALUE array_get(Array const* a, size_t pos);
void array_set(Array* a, size_t pos, VALUE v); void array_set(Array* a, size_t pos, VALUE v);
void array_append(Array* a, VALUE v); void array_append(Array* a, VALUE v);
//
// HEAP TABLE
//
typedef struct Table Table;
Table* table_new(void);
void table_destroy(Table* t);
size_t table_len(Table* t);
VALUE table_get(Table const* t, VALUE key);
void table_set(Table* t, VALUE key, VALUE value);
// //
// HEAP // HEAP
// //
@@ -93,9 +106,9 @@ Heap* heap_new(void);
void heap_destroy(Heap* h); void heap_destroy(Heap* h);
HEAP_KEY heap_add_string(Heap* h, const char* value); HEAP_KEY heap_add_string(Heap* h, const char* value);
TYC_RESULT heap_get_string(Heap* h, HEAP_KEY key, const char** value); TYC_RESULT heap_get_string(Heap const* h, HEAP_KEY key, const char** value);
size_t heap_size(Heap* h); size_t heap_size(Heap const* h);
void heap_gc(Heap* h, VALUE const* roots, size_t n_roots); void heap_gc(Heap* h, VALUE const* roots, size_t n_roots);

View File

@@ -51,12 +51,12 @@ TYC_RESULT stack_push(Stack* s, VALUE v)
return T_OK; return T_OK;
} }
size_t stack_top_fp(Stack* s) size_t stack_top_fp(Stack const* s)
{ {
return s->fp[s->fp_n - 1]; return s->fp[s->fp_n - 1];
} }
TYC_RESULT stack_peek(Stack* s, VALUE* v_out) TYC_RESULT stack_peek(Stack const* 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;
@@ -74,12 +74,12 @@ TYC_RESULT stack_pop(Stack* s, VALUE* v_out)
return T_OK; return T_OK;
} }
size_t stack_len(Stack* s) size_t stack_len(Stack const* s)
{ {
return s->stack_n - stack_top_fp(s); return s->stack_n - stack_top_fp(s);
} }
TYC_RESULT stack_at(Stack* s, int32_t key, VALUE* v) TYC_RESULT stack_at(Stack const* s, int32_t key, VALUE* v)
{ {
if (key >= 0) { if (key >= 0) {
if ((int) stack_top_fp(s) + key >= (int) s->stack_n) if ((int) stack_top_fp(s) + key >= (int) s->stack_n)
@@ -131,12 +131,12 @@ TYC_RESULT stack_pop_fp(Stack* s)
return T_OK; return T_OK;
} }
size_t stack_fp_level(Stack* s) size_t stack_fp_level(Stack const* s)
{ {
return s->fp_n; return s->fp_n;
} }
size_t stack_collectable_array(Stack* s, VALUE** values) size_t stack_collectable_array(Stack const* s, VALUE** values)
{ {
size_t j = 0; size_t j = 0;
*values = xmalloc(stack_len(s) * sizeof(VALUE)); *values = xmalloc(stack_len(s) * sizeof(VALUE));

80
lib/table.c Normal file
View File

@@ -0,0 +1,80 @@
#include "priv.h"
#include "khash.h"
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wconversion"
KHASH_MAP_INIT_INT64(TABLE_INT, VALUE)
KHASH_MAP_INIT_STR(TABLE_STR, VALUE)
#pragma GCC diagnostic pop
struct Table {
khash_t(TABLE_INT) *tbl_int;
khash_t(TABLE_STR) *tbl_str;
};
Table* table_new(void)
{
Table* t = xcalloc(1, sizeof(Table));
t->tbl_int = kh_init(TABLE_INT);
t->tbl_str = kh_init(TABLE_STR);
return t;
}
void table_destroy(Table* t)
{
kh_destroy(TABLE_INT, t->tbl_int);
kh_destroy(TABLE_STR, t->tbl_str);
free(t);
}
size_t table_len(Table* t)
{
return kh_size(t->tbl_int) + kh_size(t->tbl_str);
}
static int64_t value_hash(VALUE v)
{
switch (value_type(v)) {
case TT_NIL:
return 0;
case TT_INTEGER:
return value_integer(v);
case TT_REAL: {
uint32_t vv;
float f = value_real(v);
memcpy(&vv, &f, sizeof(uint32_t));
break;
}
case TT_STRING_CONST:
return (int64_t) value_idx(v) | ((int64_t) 1 << 33);
case TT_ARRAY:
return (int64_t) value_idx(v) | ((int64_t) 1 << 34);
case TT_TABLE:
return (int64_t) value_idx(v) | ((int64_t) 1 << 35);
case TT_FUNCTION:
return (int64_t) value_idx(v) | ((int64_t) 1 << 36);
case TT_NATIVE_PTR:
return (int64_t) value_idx(v) | ((int64_t) 1 << 37);
case TT_STRING:
default:
__builtin_unreachable();
}
return 0;
}
VALUE table_get(Table const* t, VALUE key)
{
}
void table_set(Table* t, VALUE key, VALUE value)
{
/*
if (value_type(key) == TT_STRING) {
khiter_t k = kh_get(TABLE_STR, t->tbl_str, value_);
} else {
}
*/
}