From 8aa57dd5a87b454ce99a336ed86a6bd4d6f77c1e Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Sat, 23 Oct 2021 20:30:56 +0200 Subject: Add string and symbol types --- src/bytecode/chunk.h | 6 ++++++ src/bytecode/compiler.h | 11 ++++------- src/bytecode/darray.h | 2 +- src/bytecode/objects.h | 39 ++++++++++++++++++++++++++++++++------- 4 files changed, 43 insertions(+), 15 deletions(-) (limited to 'src/bytecode') diff --git a/src/bytecode/chunk.h b/src/bytecode/chunk.h index 81fc4cc..aafa0ec 100755 --- a/src/bytecode/chunk.h +++ b/src/bytecode/chunk.h @@ -32,6 +32,12 @@ chunk_init(void) { void chunk_free(Chunk *chunk) { array_free(chunk->code); + for (size_t i = 0; i < array_size(chunk->constants); i++) { + Object obj = chunk->constants[i]; + if (IS_STRING(obj) || IS_SYMBOL(obj)) { + array_free(obj.text); + } + } array_free(chunk->constants); array_free(chunk->lines); free(chunk); diff --git a/src/bytecode/compiler.h b/src/bytecode/compiler.h index 7a25678..02d938f 100755 --- a/src/bytecode/compiler.h +++ b/src/bytecode/compiler.h @@ -215,16 +215,13 @@ parse_tree(Chunk *chunk, Visitor *vs) { return; } break; case TOKEN_STRING: { - // Object *obj = make_string(); - // push_root(obj); - // append_string(obj, tok.value); - // return obj; + Object obj = make_string(tok.value); + emit_constant(chunk, tok, obj); return; } break; case TOKEN_SYMBOL: { - // Object *obj = make_symbol(tok.value); - // push_root(obj); - // return obj; + Object obj = make_symbol(tok.value); + emit_constant(chunk, tok, obj); return; } break; case TOKEN_NIL: { diff --git a/src/bytecode/darray.h b/src/bytecode/darray.h index e8cdc36..fa4e293 100755 --- a/src/bytecode/darray.h +++ b/src/bytecode/darray.h @@ -63,7 +63,7 @@ static inline char * _array_insert(char *arr, const char *src, size_t n_bytes, size_t type_size) { ArrayHeader *head = array_head(arr); size_t new_size = n_bytes + head->size; - if (new_size >= head->cap * type_size) { + if (new_size > head->cap * type_size) { if (head->cap == 0) { head->cap = 1; } diff --git a/src/bytecode/objects.h b/src/bytecode/objects.h index 35a954f..17809d5 100755 --- a/src/bytecode/objects.h +++ b/src/bytecode/objects.h @@ -1,6 +1,9 @@ #ifndef BDL_OBJECTS_H #define BDL_OBJECTS_H +#include "string_view.h" +#include "darray.h" + typedef enum ObjectType { OBJ_TYPE_NIL, OBJ_TYPE_TRUE, @@ -24,9 +27,9 @@ typedef struct Object { // OBJ_TYPE_STRING // OBJ_TYPE_SYMBOL - // struct { - // char *text; - // }; + struct { + char *text; + }; // OBJ_TYPE_PAIR // struct { @@ -59,6 +62,28 @@ void display(Object obj); #define IS_TRUE(VAL) ((VAL).type != OBJ_TYPE_FALSE) #define IS_FALSE(VAL) ((VAL).type == OBJ_TYPE_FALSE) #define IS_FIXNUM(VAL) ((VAL).type == OBJ_TYPE_FIXNUM) +#define IS_STRING(VAL) ((VAL).type == OBJ_TYPE_STRING) +#define IS_SYMBOL(VAL) ((VAL).type == OBJ_TYPE_SYMBOL) + +Object make_string(StringView sv) { + Object obj = { + .type = OBJ_TYPE_STRING, + .text = NULL, + }; + array_init(obj.text, sv.n); + array_insert(obj.text, sv.start, sv.n); + return obj; +} + +Object make_symbol(StringView sv) { + Object obj = { + .type = OBJ_TYPE_SYMBOL, + .text = NULL, + }; + array_init(obj.text, sv.n); + array_insert(obj.text, sv.start, sv.n); + return obj; +} void display(Object obj) { @@ -67,19 +92,19 @@ display(Object obj) { printf("%zd", obj.fixnum); } break; case OBJ_TYPE_TRUE: { - printf("true"); + printf("true"); } break; case OBJ_TYPE_FALSE: { - printf("false"); + printf("false"); } break; case OBJ_TYPE_NIL: { printf("()"); } break; case OBJ_TYPE_STRING: { - // printf("\"%.*s\"", (int)array_size(obj.string), obj.string); + printf("\"%.*s\"", (int)array_size(obj.text), obj.text); } break; case OBJ_TYPE_SYMBOL: { - // printf(":%.*s", (int)array_size(obj.symbol), obj.symbol); + printf(":%.*s", (int)array_size(obj.text), obj.text); } break; case OBJ_TYPE_PAIR: { // printf("("); -- cgit v1.2.1