aboutsummaryrefslogtreecommitdiffstats
path: root/src/bytecode/objects.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/bytecode/objects.h')
-rwxr-xr-xsrc/bytecode/objects.h124
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
7typedef enum ObjectType { 8typedef 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
19struct Environment;
20
21typedef struct Object { 20typedef 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
49void display(Object obj); 51Object make_string(StringView sv);
52Object make_symbol(StringView sv);
53Object make_lambda(void);
54void object_display(Object obj);
55void object_free(Object obj);
56bool object_equal(Object a, Object b);
57Object 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
68Object 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
78Object 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
88void
89display(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
124void
125object_free(Object obj) {
126 if (IS_STRING(obj) || IS_SYMBOL(obj)) {
127 array_free(obj.text);
128 }
129}
130
131bool
132object_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
162Object
163object_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