aboutsummaryrefslogtreecommitdiffstats
path: root/src/bytecode/objects.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/bytecode/objects.c')
-rw-r--r--src/bytecode/objects.c151
1 files changed, 0 insertions, 151 deletions
diff --git a/src/bytecode/objects.c b/src/bytecode/objects.c
deleted file mode 100644
index c2fb989..0000000
--- a/src/bytecode/objects.c
+++ /dev/null
@@ -1,151 +0,0 @@
1#include "objects.h"
2
3Object
4make_string(StringView sv) {
5 Object obj = {
6 .type = OBJ_TYPE_STRING,
7 .text = NULL,
8 };
9 array_init(obj.text, sv.n);
10 array_insert(obj.text, sv.start, sv.n);
11 return obj;
12}
13
14Object
15make_symbol(StringView sv) {
16 Object obj = {
17 .type = OBJ_TYPE_SYMBOL,
18 .text = NULL,
19 };
20 array_init(obj.text, sv.n);
21 array_insert(obj.text, sv.start, sv.n);
22 return obj;
23}
24
25Object
26make_lambda(Chunk *chunk) {
27 Object obj = {
28 .type = OBJ_TYPE_LAMBDA,
29 };
30 obj.closure = malloc(sizeof(Closure));
31 obj.closure->chunk = chunk;
32 array_init(obj.closure->values, 0);
33 return obj;
34}
35
36void
37object_display(Object obj) {
38 switch (obj.type) {
39 case OBJ_TYPE_FIXNUM: {
40 printf("%zd", obj.fixnum);
41 } break;
42 case OBJ_TYPE_TRUE: {
43 printf("true");
44 } break;
45 case OBJ_TYPE_FALSE: {
46 printf("false");
47 } break;
48 case OBJ_TYPE_NIL: {
49 printf("()");
50 } break;
51 case OBJ_TYPE_STRING: {
52 printf("\"%.*s\"", (int)array_size(obj.text), obj.text);
53 } break;
54 case OBJ_TYPE_SYMBOL: {
55 printf(":%.*s", (int)array_size(obj.text), obj.text);
56 } break;
57 case OBJ_TYPE_PAIR: {
58 // printf("(");
59 // display_pair(obj);
60 // printf(")");
61 } break;
62 case OBJ_TYPE_LAMBDA: {
63 Chunk *chunk = obj.closure->chunk;
64 printf("#{procedure:%.*s}",
65 (int)array_size(chunk->name), chunk->name);
66 } break;
67 case OBJ_TYPE_ERR: {
68 printf("#{error}");
69 } break;
70 }
71 return;
72}
73
74void
75object_free(Object *obj) {
76 if (IS_STRING(*obj) || IS_SYMBOL(*obj)) {
77 array_free(obj->text);
78 return;
79 }
80 if (IS_LAMBDA(*obj)) {
81 Closure *closure = obj->closure;
82 for (size_t i = 0; i < array_size(closure->values); i++) {
83 object_free(&closure->values[i]);
84 }
85 array_free(closure->values);
86 // NOTE: we are leaking memory without this, we'll need a GC
87 // soon...
88 // chunk_free(closure->chunk);
89 free(closure);
90 }
91}
92
93bool
94object_equal(Object a, Object b) {
95 if (a.type != b.type) {
96 return false;
97 }
98 switch (a.type) {
99 case OBJ_TYPE_TRUE:
100 case OBJ_TYPE_FALSE: {
101 return true;
102 } break;
103 case OBJ_TYPE_FIXNUM: {
104 return a.fixnum == b.fixnum;
105 } break;
106 case OBJ_TYPE_SYMBOL:
107 case OBJ_TYPE_STRING: {
108 if (array_size(a.text) != array_size(b.text)) {
109 return false;
110 }
111 for (size_t i = 0; i < array_size(a.text); i++) {
112 if (a.text[i] != b.text[i]) {
113 return false;
114 }
115 }
116 } break;
117 case OBJ_TYPE_LAMBDA: {
118 return a.closure == b.closure;
119 } break;
120 default: {
121 return false;
122 } break;
123 }
124 return true;
125}
126
127Object
128object_copy(Object src) {
129 switch (src.type) {
130 case OBJ_TYPE_SYMBOL:
131 case OBJ_TYPE_STRING: {
132 Object copy = src;
133 copy.text = NULL;
134 array_init(copy.text, array_size(src.text));
135 array_insert(copy.text, src.text, array_size(src.text));
136 return copy;
137 } break;
138 case OBJ_TYPE_LAMBDA: {
139 // Object copy = src;
140 // StringView name = (StringView){
141 // .start = src.chunk->name,
142 // .n = array_size(src.chunk->name),
143 // };
144 // // TODO: copy full chunk?
145 // // copy.chunk = chunk_init(name);
146 // return copy;
147 } break;
148 default: { break; } break;
149 }
150 return src;
151}