.
This commit is contained in:
27
lib/heap.c
27
lib/heap.c
@@ -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
75
lib/priv.h
Normal 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
|
||||
38
lib/stack.c
38
lib/stack.c
@@ -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;
|
||||
}
|
||||
30
lib/value.c
30
lib/value.c
@@ -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);
|
||||
}
|
||||
Reference in New Issue
Block a user