diff options
Diffstat (limited to 'src/bytecode/objects.h')
-rwxr-xr-x | src/bytecode/objects.h | 124 |
1 files changed, 12 insertions, 112 deletions
diff --git a/src/bytecode/objects.h b/src/bytecode/objects.h index 9744071..72f7420 100755 --- a/src/bytecode/objects.h +++ b/src/bytecode/objects.h | |||
@@ -3,6 +3,7 @@ | |||
3 | 3 | ||
4 | #include "string_view.h" | 4 | #include "string_view.h" |
5 | #include "darray.h" | 5 | #include "darray.h" |
6 | #include "chunk.h" | ||
6 | 7 | ||
7 | typedef enum ObjectType { | 8 | typedef enum ObjectType { |
8 | OBJ_TYPE_NIL, | 9 | OBJ_TYPE_NIL, |
@@ -16,8 +17,6 @@ typedef enum ObjectType { | |||
16 | OBJ_TYPE_ERR, | 17 | OBJ_TYPE_ERR, |
17 | } ObjectType; | 18 | } ObjectType; |
18 | 19 | ||
19 | struct Environment; | ||
20 | |||
21 | typedef struct Object { | 20 | typedef struct Object { |
22 | ObjectType type; | 21 | ObjectType type; |
23 | bool marked; | 22 | bool marked; |
@@ -38,6 +37,9 @@ typedef struct Object { | |||
38 | // }; | 37 | // }; |
39 | 38 | ||
40 | // OBJ_TYPE_LAMBDA | 39 | // OBJ_TYPE_LAMBDA |
40 | struct { | ||
41 | Chunk *chunk; | ||
42 | }; | ||
41 | // struct { | 43 | // struct { |
42 | // struct Object *params; | 44 | // struct Object *params; |
43 | // struct Object *body; | 45 | // struct Object *body; |
@@ -46,7 +48,13 @@ typedef struct Object { | |||
46 | }; | 48 | }; |
47 | } Object; | 49 | } Object; |
48 | 50 | ||
49 | void display(Object obj); | 51 | Object make_string(StringView sv); |
52 | Object make_symbol(StringView sv); | ||
53 | Object make_lambda(void); | ||
54 | void object_display(Object obj); | ||
55 | void object_free(Object obj); | ||
56 | bool object_equal(Object a, Object b); | ||
57 | Object object_copy(Object src); | ||
50 | 58 | ||
51 | // Value initialization. | 59 | // Value initialization. |
52 | #define NIL_VAL ((Object){.type = OBJ_TYPE_NIL}) | 60 | #define NIL_VAL ((Object){.type = OBJ_TYPE_NIL}) |
@@ -64,115 +72,7 @@ void display(Object obj); | |||
64 | #define IS_FIXNUM(VAL) ((VAL).type == OBJ_TYPE_FIXNUM) | 72 | #define IS_FIXNUM(VAL) ((VAL).type == OBJ_TYPE_FIXNUM) |
65 | #define IS_STRING(VAL) ((VAL).type == OBJ_TYPE_STRING) | 73 | #define IS_STRING(VAL) ((VAL).type == OBJ_TYPE_STRING) |
66 | #define IS_SYMBOL(VAL) ((VAL).type == OBJ_TYPE_SYMBOL) | 74 | #define IS_SYMBOL(VAL) ((VAL).type == OBJ_TYPE_SYMBOL) |
75 | #define IS_LAMBDA(VAL) ((VAL).type == OBJ_TYPE_LAMBDA) | ||
67 | 76 | ||
68 | Object 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 | |||
78 | Object 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 | } | ||
87 | |||
88 | void | ||
89 | display(Object obj) { | ||
90 | switch (obj.type) { | ||
91 | case OBJ_TYPE_FIXNUM: { | ||
92 | printf("%zd", obj.fixnum); | ||
93 | } break; | ||
94 | case OBJ_TYPE_TRUE: { | ||
95 | printf("true"); | ||
96 | } break; | ||
97 | case OBJ_TYPE_FALSE: { | ||
98 | printf("false"); | ||
99 | } break; | ||
100 | case OBJ_TYPE_NIL: { | ||
101 | printf("()"); | ||
102 | } break; | ||
103 | case OBJ_TYPE_STRING: { | ||
104 | printf("\"%.*s\"", (int)array_size(obj.text), obj.text); | ||
105 | } break; | ||
106 | case OBJ_TYPE_SYMBOL: { | ||
107 | printf(":%.*s", (int)array_size(obj.text), obj.text); | ||
108 | } break; | ||
109 | case OBJ_TYPE_PAIR: { | ||
110 | // printf("("); | ||
111 | // display_pair(obj); | ||
112 | // printf(")"); | ||
113 | } break; | ||
114 | case OBJ_TYPE_LAMBDA: { | ||
115 | printf("#{procedure}"); | ||
116 | } break; | ||
117 | case OBJ_TYPE_ERR: { | ||
118 | printf("#{error}"); | ||
119 | } break; | ||
120 | } | ||
121 | return; | ||
122 | } | ||
123 | |||
124 | void | ||
125 | object_free(Object obj) { | ||
126 | if (IS_STRING(obj) || IS_SYMBOL(obj)) { | ||
127 | array_free(obj.text); | ||
128 | } | ||
129 | } | ||
130 | |||
131 | bool | ||
132 | object_equal(Object a, Object b) { | ||
133 | if (a.type != b.type) { | ||
134 | return false; | ||
135 | } | ||
136 | switch (a.type) { | ||
137 | case OBJ_TYPE_TRUE: | ||
138 | case OBJ_TYPE_FALSE: { | ||
139 | return true; | ||
140 | } break; | ||
141 | case OBJ_TYPE_FIXNUM: { | ||
142 | return a.fixnum == b.fixnum; | ||
143 | } break; | ||
144 | case OBJ_TYPE_SYMBOL: | ||
145 | case OBJ_TYPE_STRING: { | ||
146 | if (array_size(a.text) != array_size(b.text)) { | ||
147 | return false; | ||
148 | } | ||
149 | for (size_t i = 0; i < array_size(a.text); i++) { | ||
150 | if (a.text[i] != b.text[i]) { | ||
151 | return false; | ||
152 | } | ||
153 | } | ||
154 | } break; | ||
155 | default: { | ||
156 | return false; | ||
157 | } break; | ||
158 | } | ||
159 | return true; | ||
160 | } | ||
161 | |||
162 | Object | ||
163 | object_copy(Object src) { | ||
164 | switch (src.type) { | ||
165 | case OBJ_TYPE_SYMBOL: | ||
166 | case OBJ_TYPE_STRING: { | ||
167 | Object copy = src; | ||
168 | copy.text = NULL; | ||
169 | array_init(copy.text, array_size(src.text)); | ||
170 | array_insert(copy.text, src.text, array_size(src.text)); | ||
171 | return copy; | ||
172 | } break; | ||
173 | default: { break; } break; | ||
174 | } | ||
175 | return src; | ||
176 | } | ||
177 | 77 | ||
178 | #endif // BDL_OBJECTS_H | 78 | #endif // BDL_OBJECTS_H |