diff options
author | Leo Tenenbaum <pommicket@gmail.com> | 2019-10-27 20:04:54 -0400 |
---|---|---|
committer | Leo Tenenbaum <pommicket@gmail.com> | 2019-10-27 20:05:05 -0400 |
commit | 2d2ee05b901728efca22adc2ba02ec09397fd6a0 (patch) | |
tree | b88148f32d6f5282f1c6ab810d972f095f41c9a3 /eval.c | |
parent | 3f3e320908115c0b257040d187f07f494e16d30b (diff) |
user defined types
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 41 |
1 files changed, 37 insertions, 4 deletions
@@ -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); |