diff options
Diffstat (limited to 'src/bytecode/objects.c')
-rw-r--r-- | src/bytecode/objects.c | 126 |
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 | |||
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(void) { | ||
27 | Object obj = { | ||
28 | .type = OBJ_TYPE_LAMBDA, | ||
29 | .chunk = chunk_init(), | ||
30 | }; | ||
31 | return obj; | ||
32 | } | ||
33 | |||
34 | void | ||
35 | object_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 | |||
70 | void | ||
71 | object_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 | |||
81 | bool | ||
82 | object_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 | |||
112 | Object | ||
113 | object_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 | } | ||