aboutsummaryrefslogtreecommitdiffstats
path: root/src/bytecode
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-10-23 20:30:56 +0200
committerBad Diode <bd@badd10de.dev>2021-10-23 20:30:56 +0200
commit8aa57dd5a87b454ce99a336ed86a6bd4d6f77c1e (patch)
treed432226eba0aa3218a64314f702d17ac155a1f22 /src/bytecode
parentb271ce1d9098c9057fccdca6eba6b0ee0a5245a2 (diff)
downloadbdl-8aa57dd5a87b454ce99a336ed86a6bd4d6f77c1e.tar.gz
bdl-8aa57dd5a87b454ce99a336ed86a6bd4d6f77c1e.zip
Add string and symbol types
Diffstat (limited to 'src/bytecode')
-rwxr-xr-xsrc/bytecode/chunk.h6
-rwxr-xr-xsrc/bytecode/compiler.h11
-rwxr-xr-xsrc/bytecode/darray.h2
-rwxr-xr-xsrc/bytecode/objects.h39
4 files changed, 43 insertions, 15 deletions
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) {
32void 32void
33chunk_free(Chunk *chunk) { 33chunk_free(Chunk *chunk) {
34 array_free(chunk->code); 34 array_free(chunk->code);
35 for (size_t i = 0; i < array_size(chunk->constants); i++) {
36 Object obj = chunk->constants[i];
37 if (IS_STRING(obj) || IS_SYMBOL(obj)) {
38 array_free(obj.text);
39 }
40 }
35 array_free(chunk->constants); 41 array_free(chunk->constants);
36 array_free(chunk->lines); 42 array_free(chunk->lines);
37 free(chunk); 43 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) {
215 return; 215 return;
216 } break; 216 } break;
217 case TOKEN_STRING: { 217 case TOKEN_STRING: {
218 // Object *obj = make_string(); 218 Object obj = make_string(tok.value);
219 // push_root(obj); 219 emit_constant(chunk, tok, obj);
220 // append_string(obj, tok.value);
221 // return obj;
222 return; 220 return;
223 } break; 221 } break;
224 case TOKEN_SYMBOL: { 222 case TOKEN_SYMBOL: {
225 // Object *obj = make_symbol(tok.value); 223 Object obj = make_symbol(tok.value);
226 // push_root(obj); 224 emit_constant(chunk, tok, obj);
227 // return obj;
228 return; 225 return;
229 } break; 226 } break;
230 case TOKEN_NIL: { 227 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
63char * _array_insert(char *arr, const char *src, size_t n_bytes, size_t type_size) { 63char * _array_insert(char *arr, const char *src, size_t n_bytes, size_t type_size) {
64 ArrayHeader *head = array_head(arr); 64 ArrayHeader *head = array_head(arr);
65 size_t new_size = n_bytes + head->size; 65 size_t new_size = n_bytes + head->size;
66 if (new_size >= head->cap * type_size) { 66 if (new_size > head->cap * type_size) {
67 if (head->cap == 0) { 67 if (head->cap == 0) {
68 head->cap = 1; 68 head->cap = 1;
69 } 69 }
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 @@
1#ifndef BDL_OBJECTS_H 1#ifndef BDL_OBJECTS_H
2#define BDL_OBJECTS_H 2#define BDL_OBJECTS_H
3 3
4#include "string_view.h"
5#include "darray.h"
6
4typedef enum ObjectType { 7typedef enum ObjectType {
5 OBJ_TYPE_NIL, 8 OBJ_TYPE_NIL,
6 OBJ_TYPE_TRUE, 9 OBJ_TYPE_TRUE,
@@ -24,9 +27,9 @@ typedef struct Object {
24 27
25 // OBJ_TYPE_STRING 28 // OBJ_TYPE_STRING
26 // OBJ_TYPE_SYMBOL 29 // OBJ_TYPE_SYMBOL
27 // struct { 30 struct {
28 // char *text; 31 char *text;
29 // }; 32 };
30 33
31 // OBJ_TYPE_PAIR 34 // OBJ_TYPE_PAIR
32 // struct { 35 // struct {
@@ -59,6 +62,28 @@ void display(Object obj);
59#define IS_TRUE(VAL) ((VAL).type != OBJ_TYPE_FALSE) 62#define IS_TRUE(VAL) ((VAL).type != OBJ_TYPE_FALSE)
60#define IS_FALSE(VAL) ((VAL).type == OBJ_TYPE_FALSE) 63#define IS_FALSE(VAL) ((VAL).type == OBJ_TYPE_FALSE)
61#define IS_FIXNUM(VAL) ((VAL).type == OBJ_TYPE_FIXNUM) 64#define IS_FIXNUM(VAL) ((VAL).type == OBJ_TYPE_FIXNUM)
65#define IS_STRING(VAL) ((VAL).type == OBJ_TYPE_STRING)
66#define IS_SYMBOL(VAL) ((VAL).type == OBJ_TYPE_SYMBOL)
67
68Object make_string(StringView sv) {
69 Object obj = {
70 .type = OBJ_TYPE_STRING,
71 .text = NULL,
72 };
73 array_init(obj.text, sv.n);
74 array_insert(obj.text, sv.start, sv.n);
75 return obj;
76}
77
78Object make_symbol(StringView sv) {
79 Object obj = {
80 .type = OBJ_TYPE_SYMBOL,
81 .text = NULL,
82 };
83 array_init(obj.text, sv.n);
84 array_insert(obj.text, sv.start, sv.n);
85 return obj;
86}
62 87
63void 88void
64display(Object obj) { 89display(Object obj) {
@@ -67,19 +92,19 @@ display(Object obj) {
67 printf("%zd", obj.fixnum); 92 printf("%zd", obj.fixnum);
68 } break; 93 } break;
69 case OBJ_TYPE_TRUE: { 94 case OBJ_TYPE_TRUE: {
70 printf("true"); 95 printf("true");
71 } break; 96 } break;
72 case OBJ_TYPE_FALSE: { 97 case OBJ_TYPE_FALSE: {
73 printf("false"); 98 printf("false");
74 } break; 99 } break;
75 case OBJ_TYPE_NIL: { 100 case OBJ_TYPE_NIL: {
76 printf("()"); 101 printf("()");
77 } break; 102 } break;
78 case OBJ_TYPE_STRING: { 103 case OBJ_TYPE_STRING: {
79 // printf("\"%.*s\"", (int)array_size(obj.string), obj.string); 104 printf("\"%.*s\"", (int)array_size(obj.text), obj.text);
80 } break; 105 } break;
81 case OBJ_TYPE_SYMBOL: { 106 case OBJ_TYPE_SYMBOL: {
82 // printf(":%.*s", (int)array_size(obj.symbol), obj.symbol); 107 printf(":%.*s", (int)array_size(obj.text), obj.text);
83 } break; 108 } break;
84 case OBJ_TYPE_PAIR: { 109 case OBJ_TYPE_PAIR: {
85 // printf("("); 110 // printf("(");