3 #include "common/err.h"
9 UwUVMValue uwuvm_clone_value(UwUVMValue value)
13 .data = value.type->clone(value.data),
17 void uwuvm_delet_value(UwUVMValue value)
19 value.type->delet(value.data);
22 char *uwuvm_print_value(UwUVMValue value)
24 return value.type->print(value.data);
27 UwUVMValue uwuvm_get_arg(UwUVMArgs *args, size_t i)
29 if (! args->evaluated[i]) {
30 args->evaluated[i] = malloc(sizeof(UwUVMValue));
31 *(args->evaluated[i]) = uwuvm_evaluate_expression(&args->unevaluated[i], args->super);
34 return *(args->evaluated[i]);
37 UwUVMValue uwuvm_evaluate_expression(UwUVMExpression *expression, UwUVMArgs *args)
39 switch (expression->type) {
41 return uwuint_create(expression->value.int_value);
44 return uwustr_create(expression->value.str_value);
47 if ((size_t) expression->value.int_value >= args->num)
48 error("error: not enough arguments (accessed argument $%d, but only %lu arguments were passed)\n", expression->value.int_value, args->num);
50 return uwuvm_clone_value(uwuvm_get_arg(args, expression->value.int_value));
53 return uwuref_create(expression->value.ref_value);
56 return uwuvm_call_function(
57 expression->value.cll_value.function,
58 expression->value.cll_value.num_args,
59 expression->value.cll_value.args,
64 return (UwUVMValue) {};
68 UwUVMValue uwuvm_call_function(UwUVMFunction *function, size_t num_args, UwUVMExpression *unevaluated_args, UwUVMArgs *super_args)
70 UwUVMValue *evaluated_args[num_args];
72 for (size_t i = 0; i < num_args; i++)
73 evaluated_args[i] = NULL;
77 .evaluated = evaluated_args,
78 .unevaluated = unevaluated_args,
82 UwUVMValue return_value = function->type == MODULE_PLAIN
83 ? uwuvm_evaluate_expression(function->value.plain, &args)
84 : function->value.native(&args);
87 for (size_t i = 0; i < num_args; i++) {
88 UwUVMValue *value = evaluated_args[i];
91 uwuvm_delet_value(*value);