aboutsummaryrefslogtreecommitdiffstats
path: root/src/bytecode/objects.c
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-10-24 18:26:42 +0200
committerBad Diode <bd@badd10de.dev>2021-10-24 18:26:42 +0200
commite2c284b57641b5feec9a8d04313b0cd6d556e860 (patch)
tree3edf7d008f0d68b57727c234a22a0123fe91e383 /src/bytecode/objects.c
parent35f93683d56d8b7f57c3f27fa7085847e2ad4598 (diff)
downloadbdl-e2c284b57641b5feec9a8d04313b0cd6d556e860.tar.gz
bdl-e2c284b57641b5feec9a8d04313b0cd6d556e860.zip
Add lambda type and minor file cleanup
Diffstat (limited to 'src/bytecode/objects.c')
-rw-r--r--src/bytecode/objects.c126
1 files changed, 126 insertions, 0 deletions
diff --git a/src/bytecode/objects.c b/src/bytecode/objects.c
new file mode 100644
index 0000000..515a19d
--- /dev/null
+++ b/src/bytecode/objects.c
@@ -0,0 +1,126 @@
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(void) {
27 Object obj = {
28 .type = OBJ_TYPE_LAMBDA,
29 .chunk = chunk_init(),
30 };
31 return obj;
32}
33
34void
35object_display(Object obj) {
36 switch (obj.type) {
37 case OBJ_TYPE_FIXNUM: {
38 printf("%zd", obj.fixnum);
39 } break;
40 case OBJ_TYPE_TRUE: {
41 printf("true");
42 } break;
43 case OBJ_TYPE_FALSE: {
44 printf("false");
45 } break;
46 case OBJ_TYPE_NIL: {
47 printf("()");
48 } break;
49 case OBJ_TYPE_STRING: {
50 printf("\"%.*s\"", (int)array_size(obj.text), obj.text);
51 } break;
52 case OBJ_TYPE_SYMBOL: {
53 printf(":%.*s", (int)array_size(obj.text), obj.text);
54 } break;
55 case OBJ_TYPE_PAIR: {
56 // printf("(");
57 // display_pair(obj);
58 // printf(")");
59 } break;
60 case OBJ_TYPE_LAMBDA: {
61 printf("#{procedure}");
62 } break;
63 case OBJ_TYPE_ERR: {
64 printf("#{error}");
65 } break;
66 }
67 return;
68}
69
70void
71object_free(Object obj) {
72 if (IS_STRING(obj) || IS_SYMBOL(obj)) {
73 array_free(obj.text);
74 return;
75 }
76 if (IS_LAMBDA(obj)) {
77 chunk_free(obj.chunk);
78 }
79}
80
81bool
82object_equal(Object a, Object b) {
83 if (a.type != b.type) {
84 return false;
85 }
86 switch (a.type) {
87 case OBJ_TYPE_TRUE:
88 case OBJ_TYPE_FALSE: {
89 return true;
90 } break;
91 case OBJ_TYPE_FIXNUM: {
92 return a.fixnum == b.fixnum;
93 } break;
94 case OBJ_TYPE_SYMBOL:
95 case OBJ_TYPE_STRING: {
96 if (array_size(a.text) != array_size(b.text)) {
97 return false;
98 }
99 for (size_t i = 0; i < array_size(a.text); i++) {
100 if (a.text[i] != b.text[i]) {
101 return false;
102 }
103 }
104 } break;
105 default: {
106 return false;
107 } break;
108 }
109 return true;
110}
111
112Object
113object_copy(Object src) {
114 switch (src.type) {
115 case OBJ_TYPE_SYMBOL:
116 case OBJ_TYPE_STRING: {
117 Object copy = src;
118 copy.text = NULL;
119 array_init(copy.text, array_size(src.text));
120 array_insert(copy.text, src.text, array_size(src.text));
121 return copy;
122 } break;
123 default: { break; } break;
124 }
125 return src;
126}