4 #include "common/err.h"
9 static void free_expression(UwUVMExpression *expr)
11 if (expr->type == EX_FNCALL) {
12 for (size_t i = 0; i < expr->value.cll_value.num_args; i++)
13 free_expression(&expr->value.cll_value.args[i]);
15 free(expr->value.cll_value.args);
18 if (expr->type == EX_STRLIT)
19 free(expr->value.str_value);
22 void run_module(const char *progname, const char *modname, size_t num_args, char *args[])
27 Program program = load_program(progname, modname);
29 UwUVMValue (*uwuvm_call_function)(UwUVMFunction *, size_t, UwUVMExpression *, UwUVMArgs *) = dlsym(program.api_library, "uwuvm_call_function");
30 char *(*uwuvm_print_value )(UwUVMValue ) = dlsym(program.api_library, "uwuvm_print_value" );
31 void (*uwuvm_delet_value )(UwUVMValue ) = dlsym(program.api_library, "uwuvm_delet_value" );
35 UwUVMExpression arg_expressions[num_args];
37 for (size_t i = 0; i < num_args; i++)
38 arg_expressions[i] = (UwUVMExpression) {
45 UwUVMValue result = uwuvm_call_function(program.main_function, num_args, arg_expressions, NULL);
47 char *str = uwuvm_print_value(result);
51 uwuvm_delet_value(result);
53 for (size_t i = 0; i < program.num_functions; i++) {
54 UwUVMFunction *function = program.functions[i];
56 if (function->type == MODULE_PLAIN) {
57 free_expression(function->value.plain);
58 free(function->value.plain);
64 free(program.functions);
66 for (size_t i = 0; i < program.num_libraries; i++)
67 dlclose(program.libraries[i]);
69 if (program.libraries)
70 free(program.libraries);
72 dlclose(program.api_library);