summaryrefslogtreecommitdiff
path: root/eval.c
diff options
context:
space:
mode:
authorLeo Tenenbaum <pommicket@gmail.com>2019-10-27 20:04:54 -0400
committerLeo Tenenbaum <pommicket@gmail.com>2019-10-27 20:05:05 -0400
commit2d2ee05b901728efca22adc2ba02ec09397fd6a0 (patch)
treeb88148f32d6f5282f1c6ab810d972f095f41c9a3 /eval.c
parent3f3e320908115c0b257040d187f07f494e16d30b (diff)
user defined types
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c41
1 files changed, 37 insertions, 4 deletions
diff --git a/eval.c b/eval.c
index 445e5c8..de3d1ac 100644
--- a/eval.c
+++ b/eval.c
@@ -57,6 +57,8 @@ static size_t compiler_sizeof(Type *t) {
return sizeof(Slice);
case TYPE_TYPE:
return sizeof(Type *);
+ case TYPE_USER:
+ return compiler_sizeof(ident_typeval(t->user.name));
case TYPE_VOID:
case TYPE_UNKNOWN:
return 0;
@@ -92,6 +94,7 @@ static bool val_truthiness(Value *v, Type *t) {
case TYPE_FN: return v->fn != NULL;
case TYPE_ARR: return t->arr.n > 0;
case TYPE_SLICE: return v->slice.n > 0;
+ case TYPE_USER:
case TYPE_TYPE:
case TYPE_TUPLE:
break;
@@ -181,6 +184,9 @@ static void val_copy(Evaluator *ev, Value *dest, Value *src, Type *t) {
dest->tuple = err_malloc(bytes);
memcpy(dest->tuple, src->tuple, bytes);
} break;
+ case TYPE_USER:
+ val_copy(ev, dest, src, ident_typeval(t->user.name));
+ break;
}
}
@@ -198,6 +204,8 @@ static void *val_ptr_to_free(Value *v, Type *t) {
return v->arr;
case TYPE_TUPLE:
return v->tuple;
+ case TYPE_USER:
+ return val_ptr_to_free(v, ident_typeval(t->user.name));
}
assert(0); return NULL;
}
@@ -285,10 +293,14 @@ static void val_cast(Value *vin, Type *from, Value *vout, Type *to) {
return;
}
switch (from->kind) {
- case TYPE_VOID: assert(0); break;
- case TYPE_UNKNOWN: assert(0); break;
- case TYPE_TUPLE: assert(0); break;
- case TYPE_TYPE: assert(0); break;
+ case TYPE_VOID:
+ case TYPE_UNKNOWN:
+ case TYPE_TUPLE:
+ case TYPE_TYPE:
+ assert(0); break;
+ case TYPE_USER:
+ *vout = *vin;
+ break;
case TYPE_BUILTIN:
switch (to->kind) {
case TYPE_BUILTIN:
@@ -307,6 +319,9 @@ static void val_cast(Value *vin, Type *from, Value *vout, Type *to) {
default: assert(0); break;
}
break;
+ case TYPE_USER:
+ *vout = *vin;
+ break;
case TYPE_SLICE:
case TYPE_VOID:
case TYPE_UNKNOWN:
@@ -327,6 +342,9 @@ static void val_cast(Value *vin, Type *from, Value *vout, Type *to) {
case TYPE_FN:
vout->fn = vin->fn;
break;
+ case TYPE_USER:
+ *vout = *vin;
+ break;
case TYPE_SLICE:
case TYPE_UNKNOWN:
case TYPE_TUPLE:
@@ -359,6 +377,9 @@ static void val_cast(Value *vin, Type *from, Value *vout, Type *to) {
case TYPE_FN:
vout->fn = vin->ptr;
break;
+ case TYPE_USER:
+ *vout = *vin;
+ break;
case TYPE_SLICE:
case TYPE_UNKNOWN:
case TYPE_TUPLE:
@@ -377,6 +398,9 @@ static void val_cast(Value *vin, Type *from, Value *vout, Type *to) {
case TYPE_ARR:
vout->arr = vin->arr;
break;
+ case TYPE_USER:
+ *vout = *vin;
+ break;
case TYPE_SLICE:
case TYPE_FN:
case TYPE_UNKNOWN:
@@ -398,6 +422,9 @@ static void val_cast(Value *vin, Type *from, Value *vout, Type *to) {
case TYPE_SLICE:
vout->slice = vin->slice;
break;
+ case TYPE_USER:
+ *vout = *vin;
+ break;
case TYPE_FN:
case TYPE_UNKNOWN:
case TYPE_TUPLE:
@@ -439,6 +466,9 @@ static void eval_deref(Value *v, void *ptr, Type *type) {
case TYPE_TYPE:
v->type = *(Type **)ptr;
break;
+ case TYPE_USER:
+ eval_deref(v, ptr, ident_typeval(type->user.name));
+ break;
case TYPE_VOID:
case TYPE_UNKNOWN:
assert(0);
@@ -474,6 +504,9 @@ static void eval_deref_set(void *set, Value *to, Type *type) {
case TYPE_TYPE:
*(Type **)set = to->type;
break;
+ case TYPE_USER:
+ eval_deref_set(set, to, ident_typeval(type->user.name));
+ break;
case TYPE_VOID:
case TYPE_UNKNOWN:
assert(0);