diff --git a/.gitignore b/.gitignore index e586fc2..303b11a 100644 --- a/.gitignore +++ b/.gitignore @@ -17,4 +17,5 @@ embedder *_n.c -profiling-results.txt \ No newline at end of file +profiling-results.txt +tokens.txt \ No newline at end of file diff --git a/examples/http_server/request.noja b/examples/http_server/request.noja index 9d2c4ee..5ce7c97 100644 --- a/examples/http_server/request.noja +++ b/examples/http_server/request.noja @@ -65,7 +65,7 @@ fun fromSocket(fd: int, max_head: int = 1024) { request, error, parsed_bytes = parseHead(text); if error != none: return none, error, false; - + # Split the received data into head and body. head_bytes = buffer.sliceUp(head_buffer, 0, parsed_bytes); body_bytes = buffer.sliceUp(head_buffer, parsed_bytes, count(head_buffer) - parsed_bytes); diff --git a/src/cli/main.c b/src/cli/main.c index 62bae10..0a3ea3e 100644 --- a/src/cli/main.c +++ b/src/cli/main.c @@ -33,10 +33,8 @@ #include #include #include -#include "../lib/runtime/run.h" -#include "../lib/runtime/runtime.h" -#include "../lib/runtime/builtins_api.h" -#include "../lib/runtime/serialize_profiling.h" +#include "../lib/run.h" +#include "../lib/runtime.h" static void usage(FILE *stream, const char *name) { diff --git a/src/lib/assembler/assemble.c b/src/lib/assembler/assemble.c index 9fb732e..89ec85c 100644 --- a/src/lib/assembler/assemble.c +++ b/src/lib/assembler/assemble.c @@ -2,10 +2,10 @@ #include #include #include +#include "../executable.h" #include "../utils/error.h" #include "../utils/source.h" #include "../utils/labellist.h" -#include "../common/executable.h" typedef struct { const char *str; diff --git a/src/lib/assembler/assemble.h b/src/lib/assembler/assemble.h index 32baeb3..16f3c40 100644 --- a/src/lib/assembler/assemble.h +++ b/src/lib/assembler/assemble.h @@ -1,7 +1,7 @@ #ifndef ASSEMBLE_H #define ASSEMBLE_H +#include "../executable.h" #include "../utils/error.h" #include "../utils/source.h" -#include "../common/executable.h" Executable *assemble(Source *src, Error *error, int *error_offset); #endif /* ASSEMBLE_H */ \ No newline at end of file diff --git a/src/lib/builtins/basic.c b/src/lib/builtins/basic.c index fa2f530..3d2ca18 100644 --- a/src/lib/builtins/basic.c +++ b/src/lib/builtins/basic.c @@ -40,11 +40,11 @@ #include "string.h" #include "buffer.h" #include "random.h" +#include "../defs.h" #include "../utils/defs.h" -#include "../common/defs.h" #include "../objects/objects.h" -#include "../runtime/runtime.h" -#include "../runtime/run.h" +#include "../runtime.h" +#include "../run.h" static int bin_getCurrentWorkingDirectory(Runtime *runtime, Object **argv, unsigned int argc, Object *rets[static MAX_RETS], Error *error) { diff --git a/src/lib/builtins/basic.h b/src/lib/builtins/basic.h index f60e3e4..562226b 100644 --- a/src/lib/builtins/basic.h +++ b/src/lib/builtins/basic.h @@ -28,6 +28,6 @@ ** +--------------------------------------------------------------------------+ */ -#include "../runtime/runtime.h" +#include "../runtime.h" void bins_basic_init(StaticMapSlot slots[]); extern StaticMapSlot bins_basic[]; \ No newline at end of file diff --git a/src/lib/builtins/buffer.c b/src/lib/builtins/buffer.c index 3de0063..7683b0b 100644 --- a/src/lib/builtins/buffer.c +++ b/src/lib/builtins/buffer.c @@ -2,7 +2,7 @@ #include "utils.h" #include "../utils/defs.h" #include "../utils/utf8.h" -#include "../runtime/runtime.h" +#include "../runtime.h" static int bin_new(Runtime *runtime, Object **argv, unsigned int argc, Object *rets[static MAX_RETS], Error *error) { @@ -30,24 +30,14 @@ static int bin_sliceUp(Runtime *runtime, Object **argv, unsigned int argc, Objec { UNUSED(argc); ASSERT(argc == 3); - - if(!Object_IsInt(argv[1])) - { - Error_Report(error, ErrorType_RUNTIME, "Argument 1 is not an int"); + + ParsedArgument pargs[3]; + if (!parseArgs(error, argv, argc, pargs, "Bii")) return -1; - } - - if(!Object_IsInt(argv[2])) - { - Error_Report(error, ErrorType_RUNTIME, "Argument 2 is not an int"); - return -1; - } - - long long int offset = Object_GetInt(argv[1]); - long long int length = Object_GetInt(argv[2]); + long long int offset = pargs[1].as_int; + long long int length = pargs[2].as_int; Object *temp = Object_SliceBuffer(argv[0], offset, length, Runtime_GetHeap(runtime), error); - if(temp == NULL) return -1; diff --git a/src/lib/builtins/buffer.h b/src/lib/builtins/buffer.h index cd8f3f1..db34189 100644 --- a/src/lib/builtins/buffer.h +++ b/src/lib/builtins/buffer.h @@ -1,2 +1,2 @@ -#include "../runtime/runtime.h" +#include "../runtime.h" extern StaticMapSlot bins_buffer[]; \ No newline at end of file diff --git a/src/lib/builtins/files.h b/src/lib/builtins/files.h index 98b0bf0..290b882 100644 --- a/src/lib/builtins/files.h +++ b/src/lib/builtins/files.h @@ -28,5 +28,5 @@ ** +--------------------------------------------------------------------------+ */ -#include "../runtime/runtime.h" +#include "../runtime.h" extern StaticMapSlot bins_files[]; \ No newline at end of file diff --git a/src/lib/builtins/math.h b/src/lib/builtins/math.h index 560d8fc..5d39a0f 100644 --- a/src/lib/builtins/math.h +++ b/src/lib/builtins/math.h @@ -28,5 +28,5 @@ ** +--------------------------------------------------------------------------+ */ -#include "../runtime/runtime.h" +#include "../runtime.h" extern StaticMapSlot bins_math[]; \ No newline at end of file diff --git a/src/lib/builtins/net.h b/src/lib/builtins/net.h index b4031d7..f6e0a10 100644 --- a/src/lib/builtins/net.h +++ b/src/lib/builtins/net.h @@ -1,2 +1,2 @@ -#include "../runtime/runtime.h" +#include "../runtime.h" extern StaticMapSlot bins_net[]; \ No newline at end of file diff --git a/src/lib/builtins/random.h b/src/lib/builtins/random.h index 5414952..84040c4 100644 --- a/src/lib/builtins/random.h +++ b/src/lib/builtins/random.h @@ -1,2 +1,2 @@ -#include "../runtime/runtime.h" +#include "../runtime.h" extern StaticMapSlot bins_random[]; \ No newline at end of file diff --git a/src/lib/builtins/string.c b/src/lib/builtins/string.c index 508079a..8f1d53d 100644 --- a/src/lib/builtins/string.c +++ b/src/lib/builtins/string.c @@ -6,7 +6,7 @@ #include "string.h" #include "../utils/defs.h" #include "../utils/utf8.h" -#include "../runtime/runtime.h" +#include "../runtime.h" static int bin_ord(Runtime *runtime, Object **argv, unsigned int argc, Object *rets[static MAX_RETS], Error *error) { diff --git a/src/lib/builtins/string.h b/src/lib/builtins/string.h index 781be8e..c1910be 100644 --- a/src/lib/builtins/string.h +++ b/src/lib/builtins/string.h @@ -1,2 +1,2 @@ -#include "../runtime/runtime.h" +#include "../runtime.h" extern StaticMapSlot bins_string[]; \ No newline at end of file diff --git a/src/lib/builtins/utils.h b/src/lib/builtins/utils.h index f0f7240..40c1cf5 100644 --- a/src/lib/builtins/utils.h +++ b/src/lib/builtins/utils.h @@ -2,7 +2,7 @@ #include #include "../utils/error.h" #include "../objects/objects.h" -#include "../runtime/runtime.h" +#include "../runtime.h" typedef struct { bool defined; diff --git a/src/lib/compiler/ASTi.h b/src/lib/compiler/ASTi.h index c5efcfc..43fbd43 100644 --- a/src/lib/compiler/ASTi.h +++ b/src/lib/compiler/ASTi.h @@ -158,7 +158,6 @@ typedef struct { Node *set; } IndexSelectionExprNode; -#warning "temp" typedef struct { ExprNode base; Node *argv; diff --git a/src/lib/compiler/codegen.h b/src/lib/compiler/codegen.h index cec25e8..95be2ed 100644 --- a/src/lib/compiler/codegen.h +++ b/src/lib/compiler/codegen.h @@ -30,9 +30,9 @@ #ifndef CODEGEN_H #define CODEGEN_H +#include "../executable.h" #include "../utils/error.h" #include "../utils/bpalloc.h" -#include "../common/executable.h" #include "AST.h" Executable *codegen(AST *ast, BPAlloc *alloc, Error *error, int *error_offset); #endif /* CODEGEN_H */ \ No newline at end of file diff --git a/src/lib/compiler/codegenctx.h b/src/lib/compiler/codegenctx.h index bc2a4f1..bfd5c37 100644 --- a/src/lib/compiler/codegenctx.h +++ b/src/lib/compiler/codegenctx.h @@ -1,7 +1,7 @@ #ifndef CODEGENCTX_H #define CODEGENCTX_H #include -#include "../common/executable.h" +#include "../executable.h" typedef struct CodegenContext CodegenContext; CodegenContext *CodegenContext_New(Error *error, BPAlloc *alloc); diff --git a/src/lib/compiler/compile.h b/src/lib/compiler/compile.h index 27fa25f..5ec3d79 100644 --- a/src/lib/compiler/compile.h +++ b/src/lib/compiler/compile.h @@ -1,7 +1,7 @@ #ifndef COMPILE_H #define COMPILE_H +#include "../executable.h" #include "../utils/error.h" #include "../utils/source.h" -#include "../common/executable.h" Executable *compile(Source *src, Error *error, int *error_offset); -#endif /* COMPILE_H */ \ No newline at end of file +#endif /* COMPILE_H */ diff --git a/src/lib/compiler/parse.c b/src/lib/compiler/parse.c index bd5be45..e459e20 100644 --- a/src/lib/compiler/parse.c +++ b/src/lib/compiler/parse.c @@ -62,6 +62,11 @@ #include "parse.h" #include "ASTi.h" +#ifdef DEBUG +#include +FILE *token_dest; +#endif + typedef enum { TOPT = '?', @@ -438,6 +443,10 @@ AST *parse(Source *src, BPAlloc *alloc, Error *error, int *error_offset) assert(alloc != NULL); assert(error != NULL); +#ifdef DEBUG + token_dest = fopen("tokens.txt", "wb"); +#endif + AST *ast = BPAlloc_Malloc(alloc, sizeof(AST)); if(ast == NULL) @@ -482,10 +491,7 @@ static inline TokenKind current(Context *ctx) return current_token(ctx)->kind; } -// Compile with -DDEBUG to get debugging messages printed to stderr. #ifdef DEBUG -#include - static inline TokenKind next(Context *ctx, const char *file, int line) { assert(ctx != NULL); @@ -495,12 +501,12 @@ static inline TokenKind next(Context *ctx, const char *file, int line) Token *prev = ctx->token; ctx->token = ctx->token->next; -/* - fprintf(stderr, "NEXT [%.*s] -> [%.*s] from %s:%d\n", + + fprintf(token_dest, "NEXT [%.*s] -> [%.*s] from %s:%d\n", prev->length, ctx->src + prev->offset, ctx->token->length, ctx->src + ctx->token->offset, file, line); -*/ + return current(ctx); } @@ -517,7 +523,7 @@ static inline TokenKind prev(Context *ctx) static void Error_Report_(Error *error, const char *file, const char *func, int line, _Bool internal, const char *fmt, ...) { - fprintf(stderr, "Reporting error at %s:%d (in %s)\n", file, line, func); + //fprintf(stderr, "Reporting error at %s:%d (in %s)\n", file, line, func); va_list args; va_start(args, fmt); diff --git a/src/lib/common/defs.h b/src/lib/defs.h similarity index 100% rename from src/lib/common/defs.h rename to src/lib/defs.h diff --git a/src/lib/common/executable.c b/src/lib/executable.c similarity index 99% rename from src/lib/common/executable.c rename to src/lib/executable.c index 5e76fa1..0d35f4c 100644 --- a/src/lib/common/executable.c +++ b/src/lib/executable.c @@ -32,9 +32,9 @@ #include #include #include -#include "../utils/defs.h" -#include "../utils/bucketlist.h" #include "executable.h" +#include "utils/defs.h" +#include "utils/bucketlist.h" #define MAX_OPS 3 #define MAX_OPCODE_NAME_SIZE 127 diff --git a/src/lib/common/executable.h b/src/lib/executable.h similarity index 98% rename from src/lib/common/executable.h rename to src/lib/executable.h index fa7dbc8..75b553f 100644 --- a/src/lib/common/executable.h +++ b/src/lib/executable.h @@ -31,8 +31,8 @@ #ifndef EXECUTABLE_H #define EXECUTABLE_H #include -#include "../utils/source.h" -#include "../utils/promise.h" +#include "utils/source.h" +#include "utils/promise.h" typedef enum { OPTP_IDX, diff --git a/src/lib/runtime/o_staticmap.c b/src/lib/o_staticmap.c similarity index 98% rename from src/lib/runtime/o_staticmap.c rename to src/lib/o_staticmap.c index 0f79d35..8f727f0 100644 --- a/src/lib/runtime/o_staticmap.c +++ b/src/lib/o_staticmap.c @@ -47,9 +47,9 @@ */ #include #include -#include "../runtime/runtime.h" -#include "../utils/defs.h" -#include "../objects/objects.h" +#include "runtime.h" +#include "utils/defs.h" +#include "objects/objects.h" typedef struct { Object base; diff --git a/src/lib/objects/o_any.c b/src/lib/objects/o_any.c index 6a25f7e..c7affba 100644 --- a/src/lib/objects/o_any.c +++ b/src/lib/objects/o_any.c @@ -1,4 +1,4 @@ -#include "../common/defs.h" +#include "../defs.h" #include "../utils/defs.h" #include "objects.h" diff --git a/src/lib/objects/o_bool.c b/src/lib/objects/o_bool.c index 563bc48..50e9c42 100644 --- a/src/lib/objects/o_bool.c +++ b/src/lib/objects/o_bool.c @@ -30,8 +30,8 @@ #include #include "objects.h" +#include "../defs.h" #include "../utils/defs.h" -#include "../common/defs.h" static void print(Object *obj, FILE *fp); static _Bool op_eql(Object *self, Object *other); diff --git a/src/lib/objects/o_buffer.c b/src/lib/objects/o_buffer.c index b4f450d..63744f8 100644 --- a/src/lib/objects/o_buffer.c +++ b/src/lib/objects/o_buffer.c @@ -31,8 +31,8 @@ #include #include #include "objects.h" +#include "../defs.h" #include "../utils/defs.h" -#include "../common/defs.h" typedef struct { size_t refs, size; diff --git a/src/lib/objects/o_dir.c b/src/lib/objects/o_dir.c index bb53547..43942b8 100644 --- a/src/lib/objects/o_dir.c +++ b/src/lib/objects/o_dir.c @@ -29,7 +29,7 @@ */ #include "objects.h" -#include "../common/defs.h" +#include "../defs.h" typedef struct { Object base; diff --git a/src/lib/objects/o_file.c b/src/lib/objects/o_file.c index 7c62e98..6249b29 100644 --- a/src/lib/objects/o_file.c +++ b/src/lib/objects/o_file.c @@ -29,7 +29,7 @@ */ #include "objects.h" -#include "../common/defs.h" +#include "../defs.h" typedef struct { Object base; diff --git a/src/lib/objects/o_float.c b/src/lib/objects/o_float.c index 8ca59f1..567b2a2 100644 --- a/src/lib/objects/o_float.c +++ b/src/lib/objects/o_float.c @@ -32,7 +32,7 @@ #include "objects.h" #include "../utils/defs.h" #include "../utils/hash.h" -#include "../common/defs.h" +#include "../defs.h" static void print(Object *obj, FILE *fp); static _Bool op_eql(Object *self, Object *other); diff --git a/src/lib/objects/o_int.c b/src/lib/objects/o_int.c index 1f69773..2bee6f3 100644 --- a/src/lib/objects/o_int.c +++ b/src/lib/objects/o_int.c @@ -32,7 +32,7 @@ #include "objects.h" #include "../utils/defs.h" #include "../utils/hash.h" -#include "../common/defs.h" +#include "../defs.h" static void print(Object *obj, FILE *fp); static _Bool op_eql(Object *self, Object *other); diff --git a/src/lib/objects/o_list.c b/src/lib/objects/o_list.c index e8f2a0a..84af9c2 100644 --- a/src/lib/objects/o_list.c +++ b/src/lib/objects/o_list.c @@ -31,7 +31,7 @@ #include #include "objects.h" #include "../utils/defs.h" -#include "../common/defs.h" +#include "../defs.h" typedef struct { Object base; diff --git a/src/lib/objects/o_map.c b/src/lib/objects/o_map.c index 72aba02..a57f97c 100644 --- a/src/lib/objects/o_map.c +++ b/src/lib/objects/o_map.c @@ -30,7 +30,7 @@ #include "objects.h" #include "../utils/defs.h" -#include "../common/defs.h" +#include "../defs.h" typedef struct { Object base; diff --git a/src/lib/objects/o_none.c b/src/lib/objects/o_none.c index 65a4076..58cebf3 100644 --- a/src/lib/objects/o_none.c +++ b/src/lib/objects/o_none.c @@ -31,7 +31,7 @@ #include #include "objects.h" #include "../utils/defs.h" -#include "../common/defs.h" +#include "../defs.h" static _Bool op_eql(Object *self, Object *other); static void print(Object *obj, FILE *fp); diff --git a/src/lib/objects/o_nullable.c b/src/lib/objects/o_nullable.c index bf9df4e..46aa1ef 100644 --- a/src/lib/objects/o_nullable.c +++ b/src/lib/objects/o_nullable.c @@ -1,4 +1,4 @@ -#include "../common/defs.h" +#include "../defs.h" #include "objects.h" static void walk(Object *self, void (*callback)(Object **referer, void *userp), void *userp); diff --git a/src/lib/objects/o_string.c b/src/lib/objects/o_string.c index d70cde8..d774c01 100644 --- a/src/lib/objects/o_string.c +++ b/src/lib/objects/o_string.c @@ -33,7 +33,7 @@ #include "../utils/defs.h" #include "../utils/hash.h" #include "../utils/utf8.h" -#include "../common/defs.h" +#include "../defs.h" typedef struct { Object base; diff --git a/src/lib/objects/o_sum.c b/src/lib/objects/o_sum.c index 13f6a55..53c7055 100644 --- a/src/lib/objects/o_sum.c +++ b/src/lib/objects/o_sum.c @@ -1,4 +1,4 @@ -#include "../common/defs.h" +#include "../defs.h" #include "objects.h" static void walk(Object *self, void (*callback)(Object **referer, void *userp), void *userp); diff --git a/src/lib/objects/objects.c b/src/lib/objects/objects.c index 0343e9e..53bb360 100644 --- a/src/lib/objects/objects.c +++ b/src/lib/objects/objects.c @@ -30,7 +30,7 @@ #include "objects.h" #include "../utils/defs.h" -#include "../common/defs.h" +#include "../defs.h" static _Bool op_eql(Object *self, Object *other); static bool istypeof(Object *self, Object *other, Heap *heap, Error *error); diff --git a/src/lib/runtime/run.c b/src/lib/run.c similarity index 95% rename from src/lib/runtime/run.c rename to src/lib/run.c index 2adc04e..0a0f1de 100644 --- a/src/lib/runtime/run.c +++ b/src/lib/run.c @@ -2,10 +2,10 @@ #include #include #include "runtime.h" -#include "../utils/defs.h" -#include "../utils/path.h" -#include "../compiler/compile.h" -#include "../assembler/assemble.h" +#include "utils/defs.h" +#include "utils/path.h" +#include "compiler/compile.h" +#include "assembler/assemble.h" static int runExecutableAtIndex(Runtime *runtime, Error *error, Executable *exe, int index, @@ -1040,7 +1040,7 @@ static _Bool runInstruction(Runtime *runtime, Error *error) UNUSED(retc); ASSERT(retc >= 0); ASSERT(retc <= MAX_RETS); - ASSERT(retc == Runtime_GetFrameStackUsage(runtime)); + ASSERT((size_t) retc == Runtime_GetFrameStackUsage(runtime)); return 0; } diff --git a/src/lib/runtime/run.h b/src/lib/run.h similarity index 100% rename from src/lib/runtime/run.h rename to src/lib/run.h diff --git a/src/lib/runtime/runtime.c b/src/lib/runtime.c similarity index 79% rename from src/lib/runtime/runtime.c rename to src/lib/runtime.c index c5f3901..b7dc696 100644 --- a/src/lib/runtime/runtime.c +++ b/src/lib/runtime.c @@ -28,11 +28,15 @@ ** +--------------------------------------------------------------------------+ */ +#include +#include #include +#include "run.h" #include "runtime.h" -#include "../utils/path.h" -#include "../utils/defs.h" -#include "../utils/stack.h" +#include "utils/path.h" +#include "utils/defs.h" +#include "utils/stack.h" +#include "builtins/basic.h" #define MAX_FRAME_STACK 16 #define MAX_FRAMES 16 @@ -184,7 +188,7 @@ static void printFrame(Frame *frame, int depth, FILE *stream) const char *body = Source_GetBody(source); int i = 0; - + while(i < offset) { if(body[i] == '\n') @@ -216,6 +220,74 @@ void Runtime_PrintStackTrace(Runtime *runtime, FILE *stream) } } +// Returns the length written in buff (not considering the zero byte) +size_t Runtime_GetCurrentScriptFolder(Runtime *runtime, char *buff, size_t buffsize) +{ + const char *path = Runtime_GetCurrentScriptAbsolutePath(runtime); + if(path == NULL) { + if(getcwd(buff, buffsize) == NULL) + return 0; + size_t cwdlen = strlen(buff); + if (buff[cwdlen-1] == '/') + return cwdlen; + else { + if (cwdlen+1 >= buffsize) + return 0; + buff[cwdlen] = '/'; + return cwdlen+1; + } + } + + // This following block is a custom implementation + // of [dirname], which doesn't write into the input + // string and is way buggier. It will for sure give + // problems in the future!! + size_t dir_len; + { + // This is buggy code!! + size_t path_len = strlen(path); + ASSERT(path_len > 0); // Not empty + ASSERT(Path_IsAbsolute(path)); // Is absolute + ASSERT(path[path_len-1] != '/'); // Doesn't end with a slash. + + size_t popped = 0; + while(path[path_len-1-popped] != '/') + popped += 1; + + ASSERT(path_len > popped); + + dir_len = path_len - popped; + + ASSERT(dir_len < path_len); + ASSERT(path[dir_len-1] == '/'); + } + + if(dir_len >= buffsize) + return 0; + + memcpy(buff, path, dir_len); + buff[dir_len] = '\0'; + return dir_len; +} + +const char *Runtime_GetCurrentScriptAbsolutePath(Runtime *runtime) +{ + Executable *exe = Runtime_GetMostRecentExecutable(runtime); + if (exe == NULL) + return NULL; + + Source *src = Executable_GetSource(exe); + if(src == NULL) + return NULL; + + const char *path = Source_GetAbsolutePath(src); + if(path == NULL) + return NULL; + + ASSERT(path[0] != '\0'); + return path; +} + Executable *Runtime_GetMostRecentExecutable(Runtime *runtime) { Frame *frame = runtime->frame; @@ -657,4 +729,85 @@ bool Runtime_CollectGarbage(Runtime *runtime, Error *error) } return Heap_StopCollection(runtime->heap); +} + + +bool Runtime_plugBuiltinsFromStaticMap(Runtime *runtime, StaticMapSlot *bin_table, void (*bin_table_constructor)(StaticMapSlot*), Error *error) +{ + Object *object = Object_NewStaticMap(bin_table, bin_table_constructor, runtime, error); + if (object == NULL) + return false; + return Runtime_plugBuiltins(runtime, object, error); +} + +bool Runtime_plugBuiltinsFromSource(Runtime *runtime, Source *source, Error *error) +{ + Object *rets[8]; + int retc = runSource(runtime, source, rets, error); + if(retc < 0) + return false; + if (retc == 0) + return true; + return Runtime_plugBuiltins(runtime, rets[0], error); +} + +bool Runtime_plugBuiltinsFromFile(Runtime *runtime, const char *file, Error *error) +{ + Source *source = Source_FromFile(file, error); + if (source == NULL) + return false; + + bool result = Runtime_plugBuiltinsFromSource(runtime, source, error); + + Source_Free(source); + return result; +} + +bool Runtime_plugBuiltinsFromString(Runtime *runtime, const char *string, Error *error) +{ + Source *source = Source_FromString("", string, -1, error); + if (source == NULL) + return false; + + bool result = Runtime_plugBuiltinsFromSource(runtime, source, error); + + Source_Free(source); + return result; +} + +bool Runtime_plugDefaultBuiltins(Runtime *runtime, Error *error) +{ + extern char start_noja[]; + return Runtime_plugBuiltinsFromStaticMap(runtime, bins_basic, bins_basic_init, error) + && Runtime_plugBuiltinsFromString(runtime, start_noja, error); +} + +void Runtime_SerializeProfilingResultsToStream(Runtime *runtime, FILE *stream) +{ + TimingTable *table = Runtime_GetTimingTable(runtime); + if (table == NULL) + return; // Runtime wasn't profiling + + size_t count; + const FunctionExecutionSummary *summary = TimingTable_getSummary(table, &count); + + for (size_t i = 0; i < count; i++) { + if (summary[i].calls > 0) { + fprintf(stream, "%20s - %s - %ld calls - %.2lfus\n", + summary[i].name, + Source_GetName(summary[i].src), + summary[i].calls, + summary[i].time * 1000000); + } + } +} + +bool Runtime_SerializeProfilingResultsToFile(Runtime *runtime, const char *file) +{ + FILE *stream = fopen(file, "wb"); + if (stream == NULL) + return false; + Runtime_SerializeProfilingResultsToStream(runtime, stream); + fclose(stream); + return true; } \ No newline at end of file diff --git a/src/lib/runtime/runtime.h b/src/lib/runtime.h similarity index 87% rename from src/lib/runtime/runtime.h rename to src/lib/runtime.h index 5133301..e563fd8 100644 --- a/src/lib/runtime/runtime.h +++ b/src/lib/runtime.h @@ -33,10 +33,10 @@ #include // meh.. just for the definition of FILE. #include "timing.h" -#include "../utils/error.h" -#include "../utils/stack.h" -#include "../objects/objects.h" -#include "../common/executable.h" +#include "executable.h" +#include "utils/error.h" +#include "utils/stack.h" +#include "objects/objects.h" typedef struct xRuntime Runtime; typedef struct xSnapshot Snapshot; @@ -57,6 +57,13 @@ typedef struct { Runtime* Runtime_New(RuntimeConfig config); void Runtime_Free(Runtime *runtime); +bool Runtime_plugDefaultBuiltins(Runtime *runtime, Error *error); +bool Runtime_plugBuiltinsFromString(Runtime *runtime, const char *string, Error *error); +bool Runtime_plugBuiltinsFromFile(Runtime *runtime, const char *file, Error *error); +bool Runtime_plugBuiltinsFromStaticMap(Runtime *runtime, StaticMapSlot *bin_table, void (*bin_table_constructor)(StaticMapSlot*), Error *error); +bool Runtime_plugBuiltinsFromSource(Runtime *runtime, Source *source, Error *error); +void Runtime_SerializeProfilingResultsToStream(Runtime *runtime, FILE *stream); +bool Runtime_SerializeProfilingResultsToFile(Runtime *runtime, const char *file); Object *Runtime_Top(Runtime *runtime, int n); bool Runtime_Pop (Runtime *runtime, Error *error, Object **p, unsigned int n); bool Runtime_Push(Runtime *runtime, Error *error, Object *obj); @@ -71,6 +78,8 @@ Object *Runtime_GetLocals(Runtime *runtime); Object *Runtime_GetClosure(Runtime *runtime); size_t Runtime_GetFrameStackUsage(Runtime *runtime); bool Runtime_WasInterrupted(Runtime *runtime); +const char *Runtime_GetCurrentScriptAbsolutePath(Runtime *runtime); +size_t Runtime_GetCurrentScriptFolder(Runtime *runtime, char *buff, size_t buffsize); RuntimeCallback Runtime_GetCallback(Runtime *runtime); bool Runtime_CollectGarbage(Runtime *runtime, Error *error); void Runtime_PrintStackTrace(Runtime *runtime, FILE *stream); diff --git a/src/lib/runtime/builtins_api.c b/src/lib/runtime/builtins_api.c deleted file mode 100644 index a8cdad7..0000000 --- a/src/lib/runtime/builtins_api.c +++ /dev/null @@ -1,54 +0,0 @@ -#include "run.h" -#include "builtins_api.h" -#include "../builtins/basic.h" - -bool Runtime_plugBuiltinsFromStaticMap(Runtime *runtime, StaticMapSlot *bin_table, void (*bin_table_constructor)(StaticMapSlot*), Error *error) -{ - Object *object = Object_NewStaticMap(bin_table, bin_table_constructor, runtime, error); - if (object == NULL) - return false; - return Runtime_plugBuiltins(runtime, object, error); -} - -bool Runtime_plugBuiltinsFromSource(Runtime *runtime, Source *source, Error *error) -{ - Object *rets[8]; - int retc = runSource(runtime, source, rets, error); - if(retc < 0) - return false; - if (retc == 0) - return true; - return Runtime_plugBuiltins(runtime, rets[0], error); -} - -bool Runtime_plugBuiltinsFromFile(Runtime *runtime, const char *file, Error *error) -{ - Source *source = Source_FromFile(file, error); - if (source == NULL) - return false; - - bool result = Runtime_plugBuiltinsFromSource(runtime, source, error); - - Source_Free(source); - return result; -} - -bool Runtime_plugBuiltinsFromString(Runtime *runtime, const char *string, Error *error) -{ - Source *source = Source_FromString("", string, -1, error); - if (source == NULL) - return false; - - bool result = Runtime_plugBuiltinsFromSource(runtime, source, error); - - Source_Free(source); - return result; -} - -bool Runtime_plugDefaultBuiltins(Runtime *runtime, Error *error) -{ - extern char start_noja[]; - return Runtime_plugBuiltinsFromStaticMap(runtime, bins_basic, bins_basic_init, error) - && Runtime_plugBuiltinsFromString(runtime, start_noja, error) - && Runtime_plugBuiltinsFromString(runtime, "XXX=999;", error); -} \ No newline at end of file diff --git a/src/lib/runtime/builtins_api.h b/src/lib/runtime/builtins_api.h deleted file mode 100644 index 6d42237..0000000 --- a/src/lib/runtime/builtins_api.h +++ /dev/null @@ -1,6 +0,0 @@ -#include "runtime.h" -bool Runtime_plugDefaultBuiltins(Runtime *runtime, Error *error); -bool Runtime_plugBuiltinsFromString(Runtime *runtime, const char *string, Error *error); -bool Runtime_plugBuiltinsFromFile(Runtime *runtime, const char *file, Error *error); -bool Runtime_plugBuiltinsFromStaticMap(Runtime *runtime, StaticMapSlot *bin_table, void (*bin_table_constructor)(StaticMapSlot*), Error *error); -bool Runtime_plugBuiltinsFromSource(Runtime *runtime, Source *source, Error *error); diff --git a/src/lib/runtime/path.c b/src/lib/runtime/path.c deleted file mode 100644 index d1cb9ee..0000000 --- a/src/lib/runtime/path.c +++ /dev/null @@ -1,73 +0,0 @@ -#include -#include -#include "path.h" -#include "../utils/defs.h" -#include "../utils/path.h" - -// Returns the length written in buff (not considering the zero byte) -size_t Runtime_GetCurrentScriptFolder(Runtime *runtime, char *buff, size_t buffsize) -{ - const char *path = Runtime_GetCurrentScriptAbsolutePath(runtime); - if(path == NULL) { - if(getcwd(buff, buffsize) == NULL) - return 0; - size_t cwdlen = strlen(buff); - if (buff[cwdlen-1] == '/') - return cwdlen; - else { - if (cwdlen+1 >= buffsize) - return 0; - buff[cwdlen] = '/'; - return cwdlen+1; - } - } - - // This following block is a custom implementation - // of [dirname], which doesn't write into the input - // string and is way buggier. It will for sure give - // problems in the future!! - size_t dir_len; - { - // This is buggy code!! - size_t path_len = strlen(path); - ASSERT(path_len > 0); // Not empty - ASSERT(Path_IsAbsolute(path)); // Is absolute - ASSERT(path[path_len-1] != '/'); // Doesn't end with a slash. - - size_t popped = 0; - while(path[path_len-1-popped] != '/') - popped += 1; - - ASSERT(path_len > popped); - - dir_len = path_len - popped; - - ASSERT(dir_len < path_len); - ASSERT(path[dir_len-1] == '/'); - } - - if(dir_len >= buffsize) - return 0; - - memcpy(buff, path, dir_len); - buff[dir_len] = '\0'; - return dir_len; -} - -const char *Runtime_GetCurrentScriptAbsolutePath(Runtime *runtime) -{ - Executable *exe = Runtime_GetMostRecentExecutable(runtime); - if (exe == NULL) - return NULL; - - Source *src = Executable_GetSource(exe); - if(src == NULL) - return NULL; - - const char *path = Source_GetAbsolutePath(src); - if(path == NULL) - return NULL; - - ASSERT(path[0] != '\0'); - return path; -} diff --git a/src/lib/runtime/path.h b/src/lib/runtime/path.h deleted file mode 100644 index 4e0de34..0000000 --- a/src/lib/runtime/path.h +++ /dev/null @@ -1,4 +0,0 @@ -#include -#include "runtime.h" -const char *Runtime_GetCurrentScriptAbsolutePath(Runtime *runtime); -size_t Runtime_GetCurrentScriptFolder(Runtime *runtime, char *buff, size_t buffsize); diff --git a/src/lib/runtime/serialize_profiling.c b/src/lib/runtime/serialize_profiling.c deleted file mode 100644 index d2890d8..0000000 --- a/src/lib/runtime/serialize_profiling.c +++ /dev/null @@ -1,31 +0,0 @@ -#include "serialize_profiling.h" - -void Runtime_SerializeProfilingResultsToStream(Runtime *runtime, FILE *stream) -{ - TimingTable *table = Runtime_GetTimingTable(runtime); - if (table == NULL) - return; // Runtime wasn't profiling - - size_t count; - const FunctionExecutionSummary *summary = TimingTable_getSummary(table, &count); - - for (size_t i = 0; i < count; i++) { - if (summary[i].calls > 0) { - fprintf(stream, "%20s - %s - %ld calls - %.2lfus\n", - summary[i].name, - Source_GetName(summary[i].src), - summary[i].calls, - summary[i].time * 1000000); - } - } -} - -bool Runtime_SerializeProfilingResultsToFile(Runtime *runtime, const char *file) -{ - FILE *stream = fopen(file, "wb"); - if (stream == NULL) - return false; - Runtime_SerializeProfilingResultsToStream(runtime, stream); - fclose(stream); - return true; -} \ No newline at end of file diff --git a/src/lib/runtime/serialize_profiling.h b/src/lib/runtime/serialize_profiling.h deleted file mode 100644 index 1ca940d..0000000 --- a/src/lib/runtime/serialize_profiling.h +++ /dev/null @@ -1,4 +0,0 @@ -#include "runtime.h" - -void Runtime_SerializeProfilingResultsToStream(Runtime *runtime, FILE *stream); -bool Runtime_SerializeProfilingResultsToFile(Runtime *runtime, const char *file); diff --git a/src/lib/runtime/timing.c b/src/lib/timing.c similarity index 93% rename from src/lib/runtime/timing.c rename to src/lib/timing.c index 0d48b0c..e870b11 100644 --- a/src/lib/runtime/timing.c +++ b/src/lib/timing.c @@ -1,7 +1,7 @@ #include #include #include "timing.h" -#include "../utils/defs.h" +#include "utils/defs.h" struct TimingTable { FunctionExecutionSummary *entries; diff --git a/src/lib/runtime/timing.h b/src/lib/timing.h similarity index 91% rename from src/lib/runtime/timing.h rename to src/lib/timing.h index 16b6be6..7c09f78 100644 --- a/src/lib/runtime/timing.h +++ b/src/lib/timing.h @@ -2,7 +2,7 @@ #define TIMING_H #include -#include "../utils/source.h" +#include "utils/source.h" typedef struct { size_t calls; diff --git a/src/test/main.c b/src/test/main.c index 41f136c..5f0f9ad 100644 --- a/src/test/main.c +++ b/src/test/main.c @@ -4,9 +4,9 @@ #include #include #include +#include "../lib/executable.h" #include "../lib/utils/source.h" #include "../lib/compiler/compile.h" -#include "../lib/common/executable.h" #include "../lib/assembler/assemble.h" //Regular text