This commit is contained in:
2026-05-13 07:19:33 -05:00
parent 15f2794133
commit 19bff9b32f
9 changed files with 377 additions and 132 deletions

View File

@@ -1,13 +1,10 @@
#include "stack.c"
#include "priv.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "khash.h"
typedef int HEAP_KEY;
typedef enum {
TH_STRING, TH_ARRAY, TH_TABLE,
} TYC_HEAP_TYPE;
@@ -21,13 +18,15 @@ typedef struct {
} HeapValue;
KHASH_MAP_INIT_INT64(HEAP, HeapValue)
typedef struct {
struct Heap {
khash_t(HEAP) *items;
} Heap;
};
static void heap_init(Heap* h)
Heap* heap_new()
{
Heap* h = calloc(1, sizeof(Heap));
h->items = kh_init(HEAP);
return h;
}
static void heap_free_item(HeapValue value)
@@ -42,10 +41,12 @@ static void heap_free_item(HeapValue value)
case TH_TABLE:
abort(); // not implemented yet
break;
default:
__builtin_unreachable();
}
}
static void heap_finalize(Heap* h)
void heap_destroy(Heap* h)
{
for (khiter_t k = kh_begin(h->items); k != kh_end(h->items); ++k) {
if (kh_exist(h->items, k)) {
@@ -54,9 +55,10 @@ static void heap_finalize(Heap* h)
}
}
kh_destroy(HEAP, h->items);
free(h);
}
static HEAP_KEY heap_add_string(Heap* h, const char* value)
HEAP_KEY heap_add_string(Heap* h, const char* value)
{
int ret;
khiter_t k;
@@ -76,8 +78,7 @@ static HEAP_KEY heap_add_string(Heap* h, const char* value)
return key;
}
#include <stdio.h>
static TYC_RESULT heap_get_string(Heap* h, HEAP_KEY key, const char** value)
TYC_RESULT heap_get_string(Heap* h, HEAP_KEY key, const char** value)
{
khiter_t k = kh_get(HEAP, h->items, key);
bool is_missing = (k == kh_end(h->items));
@@ -87,7 +88,7 @@ static TYC_RESULT heap_get_string(Heap* h, HEAP_KEY key, const char** value)
return T_OK;
}
static size_t heap_size(Heap* h)
size_t heap_size(Heap* h)
{
return kh_size(h->items);
}
@@ -98,7 +99,7 @@ static size_t heap_size(Heap* h)
KHASH_MAP_INIT_INT64(MARK, bool)
static void heap_gc(Heap* h, VALUE const* roots, size_t n_roots)
void heap_gc(Heap* h, VALUE const* roots, size_t n_roots)
{
//
// mark

75
lib/priv.h Normal file
View File

@@ -0,0 +1,75 @@
#ifndef TYCHE_PRIV_H
#define TYCHE_PRIV_H
#include "tyche.h"
#include <stdbool.h>
#include <stdint.h>
#include <stddef.h>
//
// VALUE
//
typedef struct {
TYC_TYPE type;
union {
int32_t i;
float f;
uint32_t idx;
} v;
} VALUE;
TYC_TYPE value_type(VALUE v);
int32_t value_integer(VALUE v);
float value_real(VALUE v);
uint32_t value_idx(VALUE v);
bool value_is_zero(VALUE v);
VALUE create_value_nil();
VALUE create_value_integer(int32_t v);
VALUE create_value_real(float f);
VALUE create_value_idx(TYC_TYPE type, uint32_t idx);
//
// STACK
//
typedef struct Stack Stack;
Stack* stack_new();
void stack_destroy(Stack* s);
TYC_RESULT stack_push(Stack* s, VALUE v);
TYC_RESULT stack_peek(Stack* s, VALUE* v_out);
TYC_RESULT stack_pop(Stack* s, VALUE* v_out);
size_t stack_len(Stack* s);
TYC_RESULT stack_at(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);
TYC_RESULT stack_push_fp(Stack* s);
TYC_RESULT stack_pop_fp(Stack* s);
size_t stack_fp_level(Stack* s);
//
// HEAP
//
typedef struct Heap Heap;
typedef int HEAP_KEY;
Heap* heap_new();
void heap_destroy(Heap* h);
HEAP_KEY heap_add_string(Heap* h, const char* value);
TYC_RESULT heap_get_string(Heap* h, HEAP_KEY key, const char** value);
size_t heap_size(Heap* h);
void heap_gc(Heap* h, VALUE const* roots, size_t n_roots);
#endif //TYCHE_PRIV_H

View File

@@ -1,20 +1,21 @@
#include "value.c"
#include "priv.h"
#include <assert.h>
#include <stdlib.h>
typedef struct {
struct Stack {
VALUE* stack;
size_t stack_n;
size_t stack_cap;
uint32_t* fp;
size_t fp_n;
size_t fp_cap;
} Stack;
};
static TYC_RESULT stack_push_fp(Stack* s);
static void stack_init(Stack* s)
Stack* stack_new()
{
Stack* s = calloc(1, sizeof(Stack));
s->stack_n = s->fp_n = 0;
s->stack_cap = 64;
s->fp_cap = 8;
@@ -25,15 +26,18 @@ static void stack_init(Stack* s)
assert(s->fp);
stack_push_fp(s);
return s;
}
static void stack_finalize(Stack* s)
void stack_destroy(Stack* s)
{
free(s->stack);
free(s->fp);
free(s);
}
static TYC_RESULT stack_push(Stack* s, VALUE v)
TYC_RESULT stack_push(Stack* s, VALUE v)
{
if (s->stack_n == s->stack_cap) {
s->stack_cap *= 2;
@@ -46,12 +50,12 @@ static TYC_RESULT stack_push(Stack* s, VALUE v)
return T_OK;
}
static size_t stack_top_fp(Stack* s)
size_t stack_top_fp(Stack* s)
{
return s->fp[s->fp_n - 1];
}
static TYC_RESULT stack_peek(Stack* s, VALUE* v_out)
TYC_RESULT stack_peek(Stack* s, VALUE* v_out)
{
if (s->stack_n <= stack_top_fp(s))
return T_ERR_STACK_UNDERFLOW;
@@ -60,7 +64,7 @@ static TYC_RESULT stack_peek(Stack* s, VALUE* v_out)
return T_OK;
}
static TYC_RESULT stack_pop(Stack* s, VALUE* v_out)
TYC_RESULT stack_pop(Stack* s, VALUE* v_out)
{
TYC_RESULT err = stack_peek(s, v_out);
if (err)
@@ -69,12 +73,12 @@ static TYC_RESULT stack_pop(Stack* s, VALUE* v_out)
return T_OK;
}
static size_t stack_len(Stack* s)
size_t stack_len(Stack* s)
{
return s->stack_n - stack_top_fp(s);
}
static TYC_RESULT stack_at(Stack* s, int32_t key, VALUE* v)
TYC_RESULT stack_at(Stack* s, int32_t key, VALUE* v)
{
if (key >= 0) {
if ((int) stack_top_fp(s) + key >= (int) s->stack_n)
@@ -89,7 +93,7 @@ static TYC_RESULT stack_at(Stack* s, int32_t key, VALUE* v)
return T_OK;
}
static TYC_RESULT stack_set(Stack* s, int32_t key, VALUE v)
TYC_RESULT stack_set(Stack* s, int32_t key, VALUE v)
{
if (key >= 0) {
if ((int) stack_top_fp(s) + key >= (int) s->stack_n)
@@ -104,7 +108,7 @@ static TYC_RESULT stack_set(Stack* s, int32_t key, VALUE v)
return T_OK;
}
static TYC_RESULT stack_push_fp(Stack* s)
TYC_RESULT stack_push_fp(Stack* s)
{
if (s->fp_n == s->fp_cap) {
s->fp_cap *= 2;
@@ -117,7 +121,7 @@ static TYC_RESULT stack_push_fp(Stack* s)
return T_OK;
}
static TYC_RESULT stack_pop_fp(Stack* s)
TYC_RESULT stack_pop_fp(Stack* s)
{
if (s->fp_n == 1)
return T_ERR_STACK_FP_UNDERFLOW;
@@ -126,7 +130,7 @@ static TYC_RESULT stack_pop_fp(Stack* s)
return T_OK;
}
static size_t stack_fp_level(Stack* s)
size_t stack_fp_level(Stack* s)
{
return s->fp_n;
}

View File

@@ -1,25 +1,15 @@
#include "tyche.h"
#include "priv.h"
#include <assert.h>
#include <stdbool.h>
#include <stdlib.h>
#include <stdint.h>
typedef struct {
TYC_TYPE type;
union {
int32_t i;
float f;
uint32_t idx;
} v;
} VALUE;
static TYC_TYPE value_type(VALUE v)
TYC_TYPE value_type(VALUE v)
{
return v.type;
}
static int32_t value_integer(VALUE v)
int32_t value_integer(VALUE v)
{
#ifdef CHECK_TYCHE_BUGS
if (v.type != TT_INTEGER)
@@ -28,7 +18,7 @@ static int32_t value_integer(VALUE v)
return v.v.i;
}
static float value_real(VALUE v)
float value_real(VALUE v)
{
#ifdef CHECK_TYCHE_BUGS
if (v.type != TT_REAL)
@@ -37,7 +27,7 @@ static float value_real(VALUE v)
return v.v.f;
}
static uint32_t value_idx(VALUE v)
uint32_t value_idx(VALUE v)
{
#ifdef CHECK_TYCHE_BUGS
if (v.type != TT_FUNCTION && v.type != TT_NATIVE_PTR && v.type != TT_ARRAY && v.type != TT_TABLE && v.type != TT_STRING && v.type != TT_STRING_CONST)
@@ -46,22 +36,22 @@ static uint32_t value_idx(VALUE v)
return v.v.idx;
}
static VALUE create_value_nil()
VALUE create_value_nil()
{
return (VALUE) { .type = TT_NIL };
}
static VALUE create_value_integer(int32_t v)
VALUE create_value_integer(int32_t v)
{
return (VALUE) { .type = TT_INTEGER, .v = { .i = v } };
}
static VALUE create_value_real(float f)
VALUE create_value_real(float f)
{
return (VALUE) { .type = TT_REAL, .v = { .f = f } };
}
static VALUE create_value_idx(TYC_TYPE type, uint32_t idx)
VALUE create_value_idx(TYC_TYPE type, uint32_t idx)
{
#ifdef CHECK_TYCHE_BUGS
if (type != TT_FUNCTION && type != TT_NATIVE_PTR && type != TT_ARRAY && type != TT_TABLE && type != TT_STRING && type != TT_STRING_CONST)
@@ -70,7 +60,7 @@ static VALUE create_value_idx(TYC_TYPE type, uint32_t idx)
return (VALUE) { .type = type, .v = { .idx = idx } };
}
static bool value_is_zero(VALUE v)
bool value_is_zero(VALUE v)
{
return v.type == TT_NIL || (v.type == TT_INTEGER && v.v.i == 0);
}

View File

@@ -1 +1 @@
#include "heap.c"
#include "priv.h"