diff options
-rw-r--r-- | Makefile | 6 | ||||
-rw-r--r-- | README.md | 2 | ||||
-rw-r--r-- | api/int.c | 2 | ||||
-rw-r--r-- | api/ref.c | 2 | ||||
-rw-r--r-- | api/util.c | 2 | ||||
-rw-r--r-- | api/vm.c | 2 | ||||
-rw-r--r-- | api/vm.h | 23 | ||||
-rw-r--r-- | common/err.h (renamed from src/err.h) | 0 | ||||
-rw-r--r-- | common/str.h (renamed from src/util.h) | 0 | ||||
-rw-r--r-- | example/print_args.uwu | 5 | ||||
-rw-r--r-- | src/collect.h | 8 | ||||
-rw-r--r-- | src/expression.h | 14 | ||||
-rw-r--r-- | src/load.c (renamed from src/collect.c) | 52 | ||||
-rw-r--r-- | src/load.h | 19 | ||||
-rw-r--r-- | src/main.c | 51 | ||||
-rw-r--r-- | src/parse.c | 2 | ||||
-rw-r--r-- | src/parse.h | 4 | ||||
-rw-r--r-- | src/run.c | 74 | ||||
-rw-r--r-- | src/run.h | 8 | ||||
-rw-r--r-- | src/vm.c | 52 | ||||
-rw-r--r-- | src/vm.h | 6 | ||||
-rw-r--r-- | std/bool.c | 9 | ||||
-rw-r--r-- | std/int.c | 10 | ||||
-rw-r--r-- | std/nil.c | 6 | ||||
-rw-r--r-- | std/ref.c | 6 | ||||
-rw-r--r-- | std/str.c | 6 |
26 files changed, 172 insertions, 199 deletions
@@ -1,7 +1,7 @@ all: uwu std api uwu: src/*.c src/*.h - gcc -g src/*.c -o uwu -ldl -D_GNU_SOURCE + gcc -g -I. src/*.c -o uwu -D_GNU_SOURCE -ldl .PHONY: std api @@ -9,10 +9,10 @@ std: std/bool.so std/int.so std/str.so std/nil.so std/ref.so api: api/api.so std/%.so: std/%.c - gcc -g -shared -fpic $< -o $@ -D_GNU_SOURCE + gcc -g -I. -shared -fpic $< -o $@ -D_GNU_SOURCE api/api.so: api/*.c api/*.h - gcc -g -shared -fpic api/*.c -o api/api.so -D_GNU_SOURCE + gcc -g -I. -shared -fpic api/*.c -o api/api.so -D_GNU_SOURCE .PHONY: clean @@ -34,7 +34,7 @@ make To run: ``` -./uwu <module> +./uwu <module> <args> ``` `<module>` is a path relative to the current directory. @@ -1,5 +1,5 @@ #include <stdlib.h> -#include "../src/util.h" +#include "common/str.h" #include "int.h" UwUVMValue uwuint_create(int value) @@ -1,4 +1,4 @@ -#include "../src/util.h" +#include "common/str.h" #include "ref.h" UwUVMValue uwuref_create(UwUVMFunction *value) @@ -1,4 +1,4 @@ -#include "../src/err.h" +#include "common/err.h" #include "util.h" #include "bool.h" @@ -1,6 +1,6 @@ #include <stdio.h> #include <stdlib.h> -#include "../src/err.h" +#include "common/err.h" #include "vm.h" #include "str.h" #include "ref.h" @@ -3,7 +3,6 @@ #include <stddef.h> #include <stdbool.h> -#include "../src/expression.h" typedef enum { @@ -11,6 +10,16 @@ typedef enum MODULE_NATIVE, } UwUVMModuleType; +typedef enum +{ + EX_UNINIT, + EX_INTLIT, + EX_STRLIT, + EX_ARGNUM, + EX_FNNAME, + EX_FNCALL, +} UwUVMExpressionType; + typedef struct { void *(*clone)(void *data); @@ -46,7 +55,7 @@ typedef struct typedef struct UwUVMExpression { - ExpressionType type; + UwUVMExpressionType type; union { struct @@ -61,16 +70,6 @@ typedef struct UwUVMExpression } value; } UwUVMExpression; -typedef struct -{ - void *api_library; - UwUVMFunction *main_function; - UwUVMFunction **functions; - size_t num_functions; - void **libraries; - size_t num_libraries; -} UwUVMProgram; - UwUVMValue uwuvm_clone_value(UwUVMValue value); void uwuvm_delet_value(UwUVMValue value); char *uwuvm_print_value(UwUVMValue value); diff --git a/src/util.h b/common/str.h index b0baa37..b0baa37 100644 --- a/src/util.h +++ b/common/str.h diff --git a/example/print_args.uwu b/example/print_args.uwu new file mode 100644 index 0000000..2256a88 --- /dev/null +++ b/example/print_args.uwu @@ -0,0 +1,5 @@ +main :str:cat( + $0, + $1, + $2 +) diff --git a/src/collect.h b/src/collect.h deleted file mode 100644 index da118a5..0000000 --- a/src/collect.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef _COLLECT_H_ -#define _COLLECT_H_ - -#include "../api/vm.h" - -UwUVMProgram create_program(const char *progname, const char *modname); - -#endif diff --git a/src/expression.h b/src/expression.h deleted file mode 100644 index 55d10f7..0000000 --- a/src/expression.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef _EXPRESSION_H_ -#define _EXPRESSION_H_ - -typedef enum -{ - EX_UNINIT, - EX_INTLIT, - EX_STRLIT, - EX_ARGNUM, - EX_FNNAME, - EX_FNCALL, -} ExpressionType; - -#endif diff --git a/src/collect.c b/src/load.c index ae15513..edeba97 100644 --- a/src/collect.c +++ b/src/load.c @@ -4,9 +4,9 @@ #include <stdarg.h> #include <libgen.h> #include <dlfcn.h> -#include "err.h" -#include "util.h" -#include "collect.h" +#include "common/err.h" +#include "common/str.h" +#include "load.h" #include "parse.h" #define DEBUG 0 @@ -79,8 +79,8 @@ typedef struct char *std_path; // path to standard library - UwUVMProgram program; // the result program -} CollectorState; + Program program; // the result program +} LoadState; // functions @@ -108,7 +108,7 @@ static inline char *get_filename(const char *module_path) } // module_path is a mallocated string -static Module *require_module(CollectorState *state, char *module_path) +static Module *require_module(LoadState *state, char *module_path) { for (size_t i = 0; i < state->num_modules; i++) { Module *module = state->modules[i]; @@ -150,13 +150,13 @@ static Module *require_module(CollectorState *state, char *module_path) char *err = dlerror(); if (err) - error("%s\n", err); + error("library error: %s\n", err); } return module; } -static UwUVMFunction *require_function(CollectorState *state, Module *module, const char *name) +static UwUVMFunction *require_function(LoadState *state, Module *module, const char *name) { for (size_t i = 0; i < module->num_functions; i++) { FunctionLink *link = &module->functions[i]; @@ -180,7 +180,7 @@ static UwUVMFunction *require_function(CollectorState *state, Module *module, co return ref; } -static UwUVMFunction *resolve_function(CollectorState *state, Module *caller_module, const char *full_name) +static UwUVMFunction *resolve_function(LoadState *state, Module *caller_module, const char *full_name) { size_t len = strlen(full_name); @@ -221,7 +221,7 @@ static UwUVMFunction *resolve_function(CollectorState *state, Module *caller_mod return require_function(state, callee_module, fnname); } -static void translate_expression(CollectorState *state, Module *module, UwUVMExpression *vm_expr, ParseExpression *parse_expr) +static void translate_expression(LoadState *state, Module *module, UwUVMExpression *vm_expr, ParseExpression *parse_expr) { UwUVMFunction *vm_function; @@ -263,13 +263,10 @@ static void translate_expression(CollectorState *state, Module *module, UwUVMExp free(parse_expr); } -static void load_functions(CollectorState *state, Module *module) +static void load_functions(LoadState *state, Module *module) { for (; module->loaded_functions < module->num_functions; module->loaded_functions++) { - FunctionLink *linkptr = &module->functions[module->loaded_functions]; - FunctionLink link = *linkptr; - - bool found = false; + FunctionLink *link = &module->functions[module->loaded_functions]; if (module->type == MODULE_PLAIN) { ParseFunction **function = NULL; @@ -277,34 +274,31 @@ static void load_functions(CollectorState *state, Module *module) for (size_t i = 0; i < module->handle.ast.num_functions; i++) { ParseFunction **fn = &module->handle.ast.functions[i]; - if (*fn && strcmp((*fn)->name, link.name) == 0) { + if (*fn && strcmp((*fn)->name, link->name) == 0) { function = fn; break; } } if (function) { - found = true; - linkptr = NULL; - - translate_expression(state, module, link.ref->value.plain = malloc(sizeof(UwUVMExpression)), (*function)->expression); + translate_expression(state, module, link->ref->value.plain = malloc(sizeof(UwUVMExpression)), (*function)->expression); free((*function)->name); free(*function); *function = NULL; + } else { + error("error: no function %s in module %s\n", link->name, module->filename); } } else { - char *symbol = asprintf_wrapper("uwu_%s", link.name); - linkptr->ref->value.native = dlsym(module->handle.lib, symbol); + char *symbol = asprintf_wrapper("uwu_%s", link->name); + link->ref->value.native = dlsym(module->handle.lib, symbol); - if (! dlerror()) - found = true; + char *err = dlerror(); + if (err) + error("library error: %s\n", err); free(symbol); } - - if (! found) - error("error: no function %s in module %s\n", link.name, module->filename); } } @@ -324,12 +318,12 @@ static void free_expression(ParseExpression *expr) free(expr); } -UwUVMProgram create_program(const char *progname, const char *modname) +Program load_program(const char *progname, const char *modname) { char *prog_dirname = dirname_wrapper(progname); char *api_path = asprintf_wrapper("%s/api/api.so", prog_dirname); - CollectorState state = { + LoadState state = { .modules = NULL, .num_modules = 0, .std_path = asprintf_wrapper("%s/std", prog_dirname), diff --git a/src/load.h b/src/load.h new file mode 100644 index 0000000..5d6b00e --- /dev/null +++ b/src/load.h @@ -0,0 +1,19 @@ +#ifndef _LOAD_H_ +#define _LOAD_H_ + +#include <stddef.h> +#include "api/vm.h" + +typedef struct +{ + void *api_library; + UwUVMFunction *main_function; + UwUVMFunction **functions; + size_t num_functions; + void **libraries; + size_t num_libraries; +} Program; + +Program load_program(const char *progname, const char *modname); + +#endif @@ -1,56 +1,11 @@ -#include "err.h" -#include "vm.h" +#include "common/err.h" +#include "run.h" int main(int argc, char *argv[]) { if (argc < 2) error("usage: %s <module>\n", argv[0]); - vm_run_file(argv[0], argv[1]); + run_module(argv[0], argv[1], argc > 2 ? (size_t) argc - 2 : 0, &argv[2]); return 0; } - -/* - -0123 -"asd" -$arg -&fnname -func(asd) - -:int:add -:str:cat -:boo:and -:arr:arr -:set:set - -integer::add() -integer::sub() -integer::mul() -integer::div() -integer::mod() -integer::pow() - -string::concat() -string::split() -string::find() - -array::array() -array::select() -array::insert() -array::length() -array::reduce() -array::map() - -set::set() -set::pair() -set::select() -set::insert() -set::remove() -set::contains() - -boolean::and() -boolean::or() -boolean::xor() - -*/ diff --git a/src/parse.c b/src/parse.c index c8b430d..ed09de9 100644 --- a/src/parse.c +++ b/src/parse.c @@ -1,7 +1,7 @@ #include <stdio.h> #include <stdlib.h> #include <ctype.h> -#include "err.h" +#include "common/err.h" #include "parse.h" #define DEBUG 0 diff --git a/src/parse.h b/src/parse.h index 7aca6af..46f4542 100644 --- a/src/parse.h +++ b/src/parse.h @@ -3,11 +3,11 @@ #include <stddef.h> #include <stdbool.h> -#include "expression.h" +#include "api/vm.h" typedef struct ParseExpression { - ExpressionType type; + UwUVMExpressionType type; union { int int_value; diff --git a/src/run.c b/src/run.c new file mode 100644 index 0000000..7733c8d --- /dev/null +++ b/src/run.c @@ -0,0 +1,74 @@ +#include <dlfcn.h> +#include <stdlib.h> +#include <stdio.h> +#include "common/err.h" +#include "load.h" +#include "run.h" + +static void free_expression(UwUVMExpression *expr) +{ + if (expr->type == EX_FNCALL) { + for (size_t i = 0; i < expr->value.cll_value.num_args; i++) + free_expression(&expr->value.cll_value.args[i]); + + free(expr->value.cll_value.args); + } + + if (expr->type == EX_STRLIT) + free(expr->value.str_value); +} + +void run_module(const char *progname, const char *modname, size_t num_args, char *args[]) +{ + (void) num_args; + (void) args; + + Program program = load_program(progname, modname); + + UwUVMValue (*uwuvm_call_function)(UwUVMFunction *, size_t, UwUVMExpression *, UwUVMArgs *) = dlsym(program.api_library, "uwuvm_call_function"); + char *(*uwuvm_print_value )(UwUVMValue ) = dlsym(program.api_library, "uwuvm_print_value" ); + void (*uwuvm_delet_value )(UwUVMValue ) = dlsym(program.api_library, "uwuvm_delet_value" ); + + char *err = dlerror(); + if (err) + error("library error: %s\n", err); + + UwUVMExpression arg_expressions[num_args]; + + for (size_t i = 0; i < num_args; i++) + arg_expressions[i] = (UwUVMExpression) { + .type = EX_STRLIT, + .value = { + .str_value = args[i], + }, + }; + + UwUVMValue result = uwuvm_call_function(program.main_function, num_args, arg_expressions, NULL); + + char *str = uwuvm_print_value(result); + printf("%s\n", str); + free(str); + + uwuvm_delet_value(result); + + for (size_t i = 0; i < program.num_functions; i++) { + UwUVMFunction *function = program.functions[i]; + + if (function->type == MODULE_PLAIN) { + free_expression(function->value.plain); + free(function->value.plain); + } + + free(function); + } + + free(program.functions); + + for (size_t i = 0; i < program.num_libraries; i++) + dlclose(program.libraries[i]); + + if (program.libraries) + free(program.libraries); + + dlclose(program.api_library); +} diff --git a/src/run.h b/src/run.h new file mode 100644 index 0000000..010dec0 --- /dev/null +++ b/src/run.h @@ -0,0 +1,8 @@ +#ifndef _RUN_H_ +#define _RUN_H_ + +#include <stddef.h> + +void run_module(const char *progname, const char *modname, size_t num_args, char *args[]); + +#endif diff --git a/src/vm.c b/src/vm.c deleted file mode 100644 index 8b1b13a..0000000 --- a/src/vm.c +++ /dev/null @@ -1,52 +0,0 @@ -#include <dlfcn.h> -#include <stdlib.h> -#include <stdio.h> -#include "collect.h" -#include "vm.h" - -static void free_expression(UwUVMExpression *expr) -{ - if (expr->type == EX_FNCALL) { - for (size_t i = 0; i < expr->value.cll_value.num_args; i++) - free_expression(&expr->value.cll_value.args[i]); - - free(expr->value.cll_value.args); - } - - if (expr->type == EX_STRLIT) - free(expr->value.str_value); -} - -void vm_run_file(const char *progname, const char *modname) -{ - UwUVMProgram program = create_program(progname, modname); - UwUVMValue result = ((UwUVMValue (*)(UwUVMFunction *, size_t, UwUVMExpression *, UwUVMArgs *)) dlsym(program.api_library, "uwuvm_call_function"))(program.main_function, 0, NULL, NULL); - - char *str = ((char *(*)(UwUVMValue)) dlsym(program.api_library, "uwuvm_print_value"))(result); - - printf("%s\n", str); - free(str); - - ((void (*)(UwUVMValue)) dlsym(program.api_library, "uwuvm_delet_value"))(result); - - for (size_t i = 0; i < program.num_functions; i++) { - UwUVMFunction *function = program.functions[i]; - - if (function->type == MODULE_PLAIN) { - free_expression(function->value.plain); - free(function->value.plain); - } - - free(function); - } - - free(program.functions); - - for (size_t i = 0; i < program.num_libraries; i++) - dlclose(program.libraries[i]); - - if (program.libraries) - free(program.libraries); - - dlclose(program.api_library); -} diff --git a/src/vm.h b/src/vm.h deleted file mode 100644 index 5e23c8b..0000000 --- a/src/vm.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef _VM_H_ -#define _VM_H_ - -void vm_run_file(const char *progname, const char *modname); - -#endif @@ -1,10 +1,9 @@ #include <stdio.h> #include <stdlib.h> -#include "../src/err.h" -#include "../api/vm.h" -#include "../api/util.h" -#include "../api/bool.h" - +#include "common/err.h" +#include "api/vm.h" +#include "api/util.h" +#include "api/bool.h" static inline bool get_bool_arg(UwUVMArgs *args, size_t i) { @@ -1,10 +1,10 @@ #include <stdio.h> #include <stdlib.h> -#include "../src/err.h" -#include "../api/vm.h" -#include "../api/int.h" -#include "../api/bool.h" -#include "../api/util.h" +#include "common/err.h" +#include "api/vm.h" +#include "api/int.h" +#include "api/bool.h" +#include "api/util.h" typedef enum { @@ -1,6 +1,6 @@ -#include "../src/err.h" -#include "../api/nil.h" -#include "../api/util.h" +#include "common/err.h" +#include "api/nil.h" +#include "api/util.h" UwUVMValue uwu_nil(UwUVMArgs *args) { @@ -1,6 +1,6 @@ -#include "../src/err.h" -#include "../api/ref.h" -#include "../api/util.h" +#include "common/err.h" +#include "api/ref.h" +#include "api/util.h" UwUVMValue uwu_call(UwUVMArgs *args) { @@ -1,8 +1,8 @@ #include <string.h> #include <stdlib.h> -#include "../api/vm.h" -#include "../api/str.h" -#include "../api/util.h" +#include "api/vm.h" +#include "api/str.h" +#include "api/util.h" UwUVMValue uwu_cat(UwUVMArgs *args) { |