3 #include "../src/err.h"
9 void uwuvm_free_value(UwUVMValue value)
11 value.type->delete(value.data);
14 void uwuvm_free_args(UwUVMArgs *args)
16 if (args->evaluated) {
17 for (size_t i = 0; i < args->num; i++) {
18 UwUVMValue *value = args->evaluated[i];
21 uwuvm_free_value(*value);
26 free(args->evaluated);
30 UwUVMValue uwuvm_copy_value(UwUVMValue value)
34 .data = value.type->copy(value.data),
38 UwUVMValue uwuvm_get_arg(UwUVMArgs *args, size_t i)
40 if (! args->evaluated[i]) {
41 args->evaluated[i] = malloc(sizeof(UwUVMValue));
42 *(args->evaluated[i]) = uwuvm_evaluate_expression(&args->unevaluated[i], args->super);
45 return *(args->evaluated[i]);
48 UwUVMValue uwuvm_evaluate_expression(UwUVMExpression *expression, UwUVMArgs *args)
50 switch (expression->type) {
52 return uwuint_create(expression->value.int_value);
55 return uwustr_create(expression->value.str_value);
58 if ((size_t) expression->value.int_value >= args->num)
59 error("error: not enough arguments (accessed argument $%d, but only %lu arguments were passed)\n", expression->value.int_value, args->num);
61 return uwuvm_copy_value(uwuvm_get_arg(args, expression->value.int_value));
64 return uwuref_create(expression->value.ref_value);
67 return uwuvm_run_function(expression->value.cll_value.function, (UwUVMArgs) {
68 .num = expression->value.cll_value.num_args,
69 .evaluated = expression->value.cll_value.num_args == 0 ? NULL : calloc(expression->value.cll_value.num_args, sizeof(UwUVMValue *)),
70 .unevaluated = expression->value.cll_value.args,
75 return (UwUVMValue) {};
79 UwUVMValue uwuvm_run_function(UwUVMFunction *function, UwUVMArgs args)
81 UwUVMValue value = function->type == MODULE_PLAIN
82 ? uwuvm_evaluate_expression(function->value.plain, &args)
83 : function->value.native(&args);
85 uwuvm_free_args(&args);