3 #include "../src/err.h"
8 void uwuvm_free_value(UwUVMValue value)
10 if (value.type == VT_STR)
11 free(value.value.str_value);
12 else if (value.type == VT_NAT)
13 value.value.nat_value.type->delete(value.value.nat_value.data);
16 void uwuvm_free_args(UwUVMArgs *args)
18 if (args->evaluated) {
19 for (size_t i = 0; i < args->num; i++) {
20 UwUVMValue *value = args->evaluated[i];
23 uwuvm_free_value(*value);
28 free(args->evaluated);
32 UwUVMValue uwuvm_copy_value(UwUVMValue value)
34 if (value.type == VT_STR)
35 return uwustr_create(value.value.str_value);
36 else if (value.type == VT_NAT)
41 .type = value.value.nat_value.type,
42 .data = value.value.nat_value.type->copy(value.value.nat_value.data),
50 UwUVMValue uwuvm_get_arg(UwUVMArgs *args, size_t i)
52 if (! args->evaluated[i]) {
53 args->evaluated[i] = malloc(sizeof(UwUVMValue));
54 *(args->evaluated[i]) = uwuvm_evaluate_expression(&args->unevaluated[i], args->super);
57 return *(args->evaluated[i]);
60 UwUVMValue uwuvm_evaluate_expression(UwUVMExpression *expression, UwUVMArgs *args)
62 switch (expression->type) {
64 return uwuint_create(expression->value.int_value);
67 return uwustr_create(expression->value.str_value);
70 if ((size_t) expression->value.int_value >= args->num)
71 error("error: not enough arguments (accessed argument $%d, but only %lu arguments were passed)\n", expression->value.int_value, args->num);
73 return uwuvm_copy_value(uwuvm_get_arg(args, expression->value.int_value));
79 .ref_value = expression->value.ref_value,
84 return uwuvm_run_function(expression->value.cll_value.function, (UwUVMArgs) {
85 .num = expression->value.cll_value.num_args,
86 .evaluated = expression->value.cll_value.num_args == 0 ? NULL : calloc(expression->value.cll_value.num_args, sizeof(UwUVMValue *)),
87 .unevaluated = expression->value.cll_value.args,
92 return (UwUVMValue) {};
96 UwUVMValue uwuvm_run_function(UwUVMFunction *function, UwUVMArgs args)
98 UwUVMValue value = function->type == MODULE_PLAIN
99 ? uwuvm_evaluate_expression(function->value.plain, &args)
100 : function->value.native(&args);
102 uwuvm_free_args(&args);