From b9644b4ccda5abee01fd0704ddc42b08b68e5b5d Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Mon, 25 Oct 2021 12:37:25 +0200 Subject: Change chunk to store a name --- src/bytecode/chunk.c | 5 ++++- src/bytecode/chunk.h | 6 +++++- src/bytecode/compiler.h | 2 +- src/bytecode/debug.h | 7 ++++--- src/bytecode/lexer.c | 6 +++--- src/bytecode/main.c | 2 +- src/bytecode/objects.c | 4 ++-- src/bytecode/objects.h | 3 +-- src/bytecode/string_view.c | 4 ++-- src/bytecode/string_view.h | 2 +- 10 files changed, 24 insertions(+), 17 deletions(-) (limited to 'src') diff --git a/src/bytecode/chunk.c b/src/bytecode/chunk.c index 3dc2421..8b87d0d 100644 --- a/src/bytecode/chunk.c +++ b/src/bytecode/chunk.c @@ -2,11 +2,13 @@ #include "objects.h" Chunk * -chunk_init(void) { +chunk_init(StringView name) { Chunk *chunk = malloc(sizeof(Chunk)); array_init(chunk->code, 0); array_init(chunk->constants, 0); array_init(chunk->lines, 0); + array_init(chunk->name, name.n); + array_insert(chunk->name, name.start, name.n); return chunk; } @@ -19,6 +21,7 @@ chunk_free(Chunk *chunk) { } array_free(chunk->constants); array_free(chunk->lines); + array_free(chunk->name); free(chunk); } diff --git a/src/bytecode/chunk.h b/src/bytecode/chunk.h index 3e1c005..1e88ea0 100755 --- a/src/bytecode/chunk.h +++ b/src/bytecode/chunk.h @@ -2,6 +2,7 @@ #define BDL_CHUNK_H #include "darray.h" +#include "string_view.h" typedef struct Object Object; @@ -14,9 +15,12 @@ typedef struct Chunk { u8 *code; Object *constants; LineInfo *lines; + char *name; } Chunk; -Chunk * chunk_init(void); +#define NEW_CHUNK(NAME) chunk_init((StringView){(NAME), sizeof(NAME)}) + +Chunk * chunk_init(StringView name); void add_code(Chunk *chunk, u8 byte, size_t line, size_t col); size_t add_constant(Chunk *chunk, Object obj); void chunk_free(Chunk *chunk); diff --git a/src/bytecode/compiler.h b/src/bytecode/compiler.h index d7d7920..3b68868 100755 --- a/src/bytecode/compiler.h +++ b/src/bytecode/compiler.h @@ -418,7 +418,7 @@ parse_tree(Chunk *chunk, Compiler *compiler) { Chunk * compile(Token *tokens) { Chunk *chunk = NULL; - chunk = chunk_init(); + chunk = NEW_CHUNK("main"); Compiler compiler = (Compiler){ .tokens = tokens, .current = 0, diff --git a/src/bytecode/debug.h b/src/bytecode/debug.h index 7673703..534ff80 100755 --- a/src/bytecode/debug.h +++ b/src/bytecode/debug.h @@ -4,7 +4,7 @@ #include "chunk.h" #include "objects.h" -void disassemble_chunk(Chunk *chunk, const char *name); +void disassemble_chunk(Chunk *chunk); size_t disassemble_instruction(Chunk *chunk, size_t offset); static const char* ops_str[] = { @@ -41,8 +41,8 @@ static const char* ops_str[] = { }; void -disassemble_chunk(Chunk *chunk, const char *name) { - printf("== %s ==\n", name); +disassemble_chunk(Chunk *chunk) { + printf("===== %.*s =====\n", (int)array_size(chunk->name), chunk->name); printf("code:\n"); size_t offset = 0; while (offset < array_size(chunk->code)) { @@ -56,6 +56,7 @@ disassemble_chunk(Chunk *chunk, const char *name) { printf("\n"); offset++; } + printf("\n"); } size_t diff --git a/src/bytecode/lexer.c b/src/bytecode/lexer.c index c16673b..a80c845 100755 --- a/src/bytecode/lexer.c +++ b/src/bytecode/lexer.c @@ -43,15 +43,15 @@ print_token(Token tok) { switch (tok.type) { case TOKEN_FIXNUM: { printf(" -> "); - sv_write(&tok.value, stdout); + sv_write(&tok.value); } break; case TOKEN_SYMBOL: { printf(" -> "); - sv_write(&tok.value, stdout); + sv_write(&tok.value); } break; case TOKEN_STRING: { printf(" -> "); - sv_write(&tok.value, stdout); + sv_write(&tok.value); } break; default: { } break; diff --git a/src/bytecode/main.c b/src/bytecode/main.c index f938e36..d1fbac2 100755 --- a/src/bytecode/main.c +++ b/src/bytecode/main.c @@ -53,7 +53,7 @@ process_source(const StringView *source) { } #ifdef DEBUG - disassemble_chunk(chunk, "current chunk"); + disassemble_chunk(chunk); #endif // Interpret chunk. diff --git a/src/bytecode/objects.c b/src/bytecode/objects.c index 515a19d..14dc057 100644 --- a/src/bytecode/objects.c +++ b/src/bytecode/objects.c @@ -23,10 +23,10 @@ make_symbol(StringView sv) { } Object -make_lambda(void) { +make_lambda(StringView name) { Object obj = { .type = OBJ_TYPE_LAMBDA, - .chunk = chunk_init(), + .chunk = chunk_init(name), }; return obj; } diff --git a/src/bytecode/objects.h b/src/bytecode/objects.h index 72f7420..419a7f8 100755 --- a/src/bytecode/objects.h +++ b/src/bytecode/objects.h @@ -50,7 +50,7 @@ typedef struct Object { Object make_string(StringView sv); Object make_symbol(StringView sv); -Object make_lambda(void); +Object make_lambda(StringView name); void object_display(Object obj); void object_free(Object obj); bool object_equal(Object a, Object b); @@ -74,5 +74,4 @@ Object object_copy(Object src); #define IS_SYMBOL(VAL) ((VAL).type == OBJ_TYPE_SYMBOL) #define IS_LAMBDA(VAL) ((VAL).type == OBJ_TYPE_LAMBDA) - #endif // BDL_OBJECTS_H diff --git a/src/bytecode/string_view.c b/src/bytecode/string_view.c index 39fabe9..8247bd4 100755 --- a/src/bytecode/string_view.c +++ b/src/bytecode/string_view.c @@ -33,8 +33,8 @@ sv_equal(const StringView *a, const StringView *b) { } void -sv_write(const StringView *sv, FILE *file) { +sv_write(const StringView *sv) { for (size_t i = 0; i < sv->n; i++) { - putc(sv->start[i], file); + putchar(sv->start[i]); } } diff --git a/src/bytecode/string_view.h b/src/bytecode/string_view.h index 42273ab..64c8d8e 100755 --- a/src/bytecode/string_view.h +++ b/src/bytecode/string_view.h @@ -16,6 +16,6 @@ char sv_peek(const StringView *sv); bool sv_equal(const StringView *a, const StringView *b); // Write a character to the given output stream. -void sv_write(const StringView *sv, FILE *file); +void sv_write(const StringView *sv); #endif // BDL_STRINGVIEW_H -- cgit v1.2.1