4 #include "common/err.h"
8 static void free_expression(UwUVMExpression *expr)
10 if (expr->type == EX_FNCALL) {
11 for (size_t i = 0; i < expr->value.cll_value.num_args; i++)
12 free_expression(&expr->value.cll_value.args[i]);
14 free(expr->value.cll_value.args);
17 if (expr->type == EX_STRLIT)
18 free(expr->value.str_value);
21 void run_module(const char *progname, const char *modname, size_t num_args, char *args[])
26 Program program = load_program(progname, modname);
28 UwUVMValue (*uwuvm_call_function)(UwUVMFunction *, size_t, UwUVMExpression *, UwUVMArgs *) = dlsym(program.api_library, "uwuvm_call_function");
29 char *(*uwuvm_print_value )(UwUVMValue ) = dlsym(program.api_library, "uwuvm_print_value" );
30 void (*uwuvm_delet_value )(UwUVMValue ) = dlsym(program.api_library, "uwuvm_delet_value" );
32 char *err = dlerror();
34 error("library error: %s\n", err);
36 UwUVMExpression arg_expressions[num_args];
38 for (size_t i = 0; i < num_args; i++)
39 arg_expressions[i] = (UwUVMExpression) {
46 UwUVMValue result = uwuvm_call_function(program.main_function, num_args, arg_expressions, NULL);
48 char *str = uwuvm_print_value(result);
52 uwuvm_delet_value(result);
54 for (size_t i = 0; i < program.num_functions; i++) {
55 UwUVMFunction *function = program.functions[i];
57 if (function->type == MODULE_PLAIN) {
58 free_expression(function->value.plain);
59 free(function->value.plain);
65 free(program.functions);
67 for (size_t i = 0; i < program.num_libraries; i++)
68 dlclose(program.libraries[i]);
70 if (program.libraries)
71 free(program.libraries);
73 dlclose(program.api_library);