diff options
Diffstat (limited to 'src/bytecode/objects.c')
-rw-r--r-- | src/bytecode/objects.c | 151 |
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 | |||
3 | Object | ||
4 | make_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 | |||
14 | Object | ||
15 | make_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 | |||
25 | Object | ||
26 | make_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 | |||
36 | void | ||
37 | object_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 | |||
74 | void | ||
75 | object_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 | |||
93 | bool | ||
94 | object_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 | |||
127 | Object | ||
128 | object_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 | } | ||