diff options
-rw-r--r-- | src/bytecode/chunk.c | 5 | ||||
-rwxr-xr-x | src/bytecode/chunk.h | 6 | ||||
-rwxr-xr-x | src/bytecode/compiler.h | 2 | ||||
-rwxr-xr-x | src/bytecode/debug.h | 7 | ||||
-rwxr-xr-x | src/bytecode/lexer.c | 6 | ||||
-rwxr-xr-x | src/bytecode/main.c | 2 | ||||
-rw-r--r-- | src/bytecode/objects.c | 4 | ||||
-rwxr-xr-x | src/bytecode/objects.h | 3 | ||||
-rwxr-xr-x | src/bytecode/string_view.c | 4 | ||||
-rwxr-xr-x | src/bytecode/string_view.h | 2 |
10 files changed, 24 insertions, 17 deletions
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 @@ | |||
2 | #include "objects.h" | 2 | #include "objects.h" |
3 | 3 | ||
4 | Chunk * | 4 | Chunk * |
5 | chunk_init(void) { | 5 | chunk_init(StringView name) { |
6 | Chunk *chunk = malloc(sizeof(Chunk)); | 6 | Chunk *chunk = malloc(sizeof(Chunk)); |
7 | array_init(chunk->code, 0); | 7 | array_init(chunk->code, 0); |
8 | array_init(chunk->constants, 0); | 8 | array_init(chunk->constants, 0); |
9 | array_init(chunk->lines, 0); | 9 | array_init(chunk->lines, 0); |
10 | array_init(chunk->name, name.n); | ||
11 | array_insert(chunk->name, name.start, name.n); | ||
10 | return chunk; | 12 | return chunk; |
11 | } | 13 | } |
12 | 14 | ||
@@ -19,6 +21,7 @@ chunk_free(Chunk *chunk) { | |||
19 | } | 21 | } |
20 | array_free(chunk->constants); | 22 | array_free(chunk->constants); |
21 | array_free(chunk->lines); | 23 | array_free(chunk->lines); |
24 | array_free(chunk->name); | ||
22 | free(chunk); | 25 | free(chunk); |
23 | } | 26 | } |
24 | 27 | ||
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 @@ | |||
2 | #define BDL_CHUNK_H | 2 | #define BDL_CHUNK_H |
3 | 3 | ||
4 | #include "darray.h" | 4 | #include "darray.h" |
5 | #include "string_view.h" | ||
5 | 6 | ||
6 | typedef struct Object Object; | 7 | typedef struct Object Object; |
7 | 8 | ||
@@ -14,9 +15,12 @@ typedef struct Chunk { | |||
14 | u8 *code; | 15 | u8 *code; |
15 | Object *constants; | 16 | Object *constants; |
16 | LineInfo *lines; | 17 | LineInfo *lines; |
18 | char *name; | ||
17 | } Chunk; | 19 | } Chunk; |
18 | 20 | ||
19 | Chunk * chunk_init(void); | 21 | #define NEW_CHUNK(NAME) chunk_init((StringView){(NAME), sizeof(NAME)}) |
22 | |||
23 | Chunk * chunk_init(StringView name); | ||
20 | void add_code(Chunk *chunk, u8 byte, size_t line, size_t col); | 24 | void add_code(Chunk *chunk, u8 byte, size_t line, size_t col); |
21 | size_t add_constant(Chunk *chunk, Object obj); | 25 | size_t add_constant(Chunk *chunk, Object obj); |
22 | void chunk_free(Chunk *chunk); | 26 | 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) { | |||
418 | Chunk * | 418 | Chunk * |
419 | compile(Token *tokens) { | 419 | compile(Token *tokens) { |
420 | Chunk *chunk = NULL; | 420 | Chunk *chunk = NULL; |
421 | chunk = chunk_init(); | 421 | chunk = NEW_CHUNK("main"); |
422 | Compiler compiler = (Compiler){ | 422 | Compiler compiler = (Compiler){ |
423 | .tokens = tokens, | 423 | .tokens = tokens, |
424 | .current = 0, | 424 | .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 @@ | |||
4 | #include "chunk.h" | 4 | #include "chunk.h" |
5 | #include "objects.h" | 5 | #include "objects.h" |
6 | 6 | ||
7 | void disassemble_chunk(Chunk *chunk, const char *name); | 7 | void disassemble_chunk(Chunk *chunk); |
8 | size_t disassemble_instruction(Chunk *chunk, size_t offset); | 8 | size_t disassemble_instruction(Chunk *chunk, size_t offset); |
9 | 9 | ||
10 | static const char* ops_str[] = { | 10 | static const char* ops_str[] = { |
@@ -41,8 +41,8 @@ static const char* ops_str[] = { | |||
41 | }; | 41 | }; |
42 | 42 | ||
43 | void | 43 | void |
44 | disassemble_chunk(Chunk *chunk, const char *name) { | 44 | disassemble_chunk(Chunk *chunk) { |
45 | printf("== %s ==\n", name); | 45 | printf("===== %.*s =====\n", (int)array_size(chunk->name), chunk->name); |
46 | printf("code:\n"); | 46 | printf("code:\n"); |
47 | size_t offset = 0; | 47 | size_t offset = 0; |
48 | while (offset < array_size(chunk->code)) { | 48 | while (offset < array_size(chunk->code)) { |
@@ -56,6 +56,7 @@ disassemble_chunk(Chunk *chunk, const char *name) { | |||
56 | printf("\n"); | 56 | printf("\n"); |
57 | offset++; | 57 | offset++; |
58 | } | 58 | } |
59 | printf("\n"); | ||
59 | } | 60 | } |
60 | 61 | ||
61 | size_t | 62 | 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) { | |||
43 | switch (tok.type) { | 43 | switch (tok.type) { |
44 | case TOKEN_FIXNUM: { | 44 | case TOKEN_FIXNUM: { |
45 | printf(" -> "); | 45 | printf(" -> "); |
46 | sv_write(&tok.value, stdout); | 46 | sv_write(&tok.value); |
47 | } break; | 47 | } break; |
48 | case TOKEN_SYMBOL: { | 48 | case TOKEN_SYMBOL: { |
49 | printf(" -> "); | 49 | printf(" -> "); |
50 | sv_write(&tok.value, stdout); | 50 | sv_write(&tok.value); |
51 | } break; | 51 | } break; |
52 | case TOKEN_STRING: { | 52 | case TOKEN_STRING: { |
53 | printf(" -> "); | 53 | printf(" -> "); |
54 | sv_write(&tok.value, stdout); | 54 | sv_write(&tok.value); |
55 | } break; | 55 | } break; |
56 | default: { | 56 | default: { |
57 | } break; | 57 | } 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) { | |||
53 | } | 53 | } |
54 | 54 | ||
55 | #ifdef DEBUG | 55 | #ifdef DEBUG |
56 | disassemble_chunk(chunk, "current chunk"); | 56 | disassemble_chunk(chunk); |
57 | #endif | 57 | #endif |
58 | 58 | ||
59 | // Interpret chunk. | 59 | // 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) { | |||
23 | } | 23 | } |
24 | 24 | ||
25 | Object | 25 | Object |
26 | make_lambda(void) { | 26 | make_lambda(StringView name) { |
27 | Object obj = { | 27 | Object obj = { |
28 | .type = OBJ_TYPE_LAMBDA, | 28 | .type = OBJ_TYPE_LAMBDA, |
29 | .chunk = chunk_init(), | 29 | .chunk = chunk_init(name), |
30 | }; | 30 | }; |
31 | return obj; | 31 | return obj; |
32 | } | 32 | } |
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 { | |||
50 | 50 | ||
51 | Object make_string(StringView sv); | 51 | Object make_string(StringView sv); |
52 | Object make_symbol(StringView sv); | 52 | Object make_symbol(StringView sv); |
53 | Object make_lambda(void); | 53 | Object make_lambda(StringView name); |
54 | void object_display(Object obj); | 54 | void object_display(Object obj); |
55 | void object_free(Object obj); | 55 | void object_free(Object obj); |
56 | bool object_equal(Object a, Object b); | 56 | bool object_equal(Object a, Object b); |
@@ -74,5 +74,4 @@ Object object_copy(Object src); | |||
74 | #define IS_SYMBOL(VAL) ((VAL).type == OBJ_TYPE_SYMBOL) | 74 | #define IS_SYMBOL(VAL) ((VAL).type == OBJ_TYPE_SYMBOL) |
75 | #define IS_LAMBDA(VAL) ((VAL).type == OBJ_TYPE_LAMBDA) | 75 | #define IS_LAMBDA(VAL) ((VAL).type == OBJ_TYPE_LAMBDA) |
76 | 76 | ||
77 | |||
78 | #endif // BDL_OBJECTS_H | 77 | #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) { | |||
33 | } | 33 | } |
34 | 34 | ||
35 | void | 35 | void |
36 | sv_write(const StringView *sv, FILE *file) { | 36 | sv_write(const StringView *sv) { |
37 | for (size_t i = 0; i < sv->n; i++) { | 37 | for (size_t i = 0; i < sv->n; i++) { |
38 | putc(sv->start[i], file); | 38 | putchar(sv->start[i]); |
39 | } | 39 | } |
40 | } | 40 | } |
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); | |||
16 | bool sv_equal(const StringView *a, const StringView *b); | 16 | bool sv_equal(const StringView *a, const StringView *b); |
17 | 17 | ||
18 | // Write a character to the given output stream. | 18 | // Write a character to the given output stream. |
19 | void sv_write(const StringView *sv, FILE *file); | 19 | void sv_write(const StringView *sv); |
20 | 20 | ||
21 | #endif // BDL_STRINGVIEW_H | 21 | #endif // BDL_STRINGVIEW_H |