Skip to content

Commit 4418ed9

Browse files
Add files via upload
1 parent b72f51c commit 4418ed9

File tree

7 files changed

+203
-62
lines changed

7 files changed

+203
-62
lines changed

src/debug.c

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
#include <stdio.h>
2+
#include "machine.h"
3+
#include "io.h"
4+
#include "debug.h"
5+
6+
void print_last_line(struct scanner scanner) {
7+
if (scanner.pos >= scanner.size)
8+
scanner.pos = scanner.size;
9+
while (scanner.pos != 0)
10+
{
11+
if (scanner.source[scanner.pos] == '\n') {
12+
scanner.pos++;
13+
break;
14+
}
15+
scanner.pos--;
16+
}
17+
18+
while (scanner.pos < scanner.size && scanner.source[scanner.pos] != '\n')
19+
printf("%c", scanner.source[scanner.pos++]);
20+
}
21+
22+
void print_instruction_dump(struct chunk* chunk, unsigned int* indent) {
23+
printf("%d", chunk->pos);
24+
char op_code = read(chunk);
25+
26+
for (unsigned int i = 0; i < *indent; i++)
27+
printf("\t");
28+
29+
switch (op_code)
30+
{
31+
case MACHINE_LOAD_VAR:
32+
printf("LOAD VAR, id:%d", read_ulong(chunk));
33+
break;
34+
case MACHINE_STORE_VAR:
35+
printf("STORE VAR, id:%d", read_ulong(chunk));
36+
break;
37+
case MACHINE_LOAD_CONST:
38+
printf("LOAD CONST, const:");
39+
print_value(read_value(chunk));
40+
break;
41+
case MACHINE_EVAL_BIN_OP:
42+
printf("EVAL BIN OP, op: %d", read(chunk));
43+
break;
44+
case MACHINE_EVAL_UNI_OP:
45+
printf("EVAL UNI OP, op: %d", read(chunk));
46+
break;
47+
case MACHINE_SKIP:
48+
printf("SKIP");
49+
(*indent)++;
50+
break;
51+
case MACHINE_END_SKIP:
52+
printf("END_SKIP");
53+
(*indent)--;
54+
break;
55+
case MACHINE_MARK:
56+
printf("MARK");
57+
break;
58+
case MACHINE_GOTO:
59+
printf("GOTO");
60+
break;
61+
case MACHINE_RETURN_GOTO:
62+
printf("GOTO, id:%d", read_ulong(chunk));
63+
break;
64+
case MACHINE_LABEL:
65+
printf("LABEL, id:%d", read_ulong(chunk));
66+
(*indent)++;
67+
break;
68+
case MACHINE_COND_SKIP:
69+
printf("COND SKIP");
70+
(*indent)++;
71+
break;
72+
case MACHINE_COND_RETURN:
73+
printf("COND RETURN");
74+
break;
75+
case MACHINE_FLAG:
76+
printf("SET FLAG");
77+
break;
78+
case MACHINE_RESET_FLAG:
79+
printf("RESET FLAG");
80+
break;
81+
case MACHINE_FLAG_SKIP:
82+
printf("FLAG SKIP");
83+
(*indent)++;
84+
break;
85+
case MACHINE_NEW_FRAME:
86+
printf("NEW FRAME");
87+
break;
88+
case MACHINE_CLEAN:
89+
printf("GC CLEAN");
90+
break;
91+
case MACHINE_BUILD_COL:
92+
printf("BUILD COL, size:%d", read_ulong(chunk));
93+
break;
94+
case MACHINE_SET_INDEX:
95+
printf("SET INDEX");
96+
break;
97+
case MACHINE_GET_INDEX:
98+
printf("GET INDEX");
99+
break;
100+
case MACHINE_PROTECT:
101+
printf("GC PROTECT");
102+
break;
103+
case MACHINE_POP:
104+
printf("POP EVAL");
105+
break;
106+
case MACHINE_CALL_EXTERN:
107+
printf("CALL EXTERN, id:%d args:%d", read_ulong(chunk), read_ulong(chunk));
108+
break;
109+
}
110+
}
111+
112+
void print_dump(struct chunk chunk, int print_ip) {
113+
unsigned long old_pos = chunk.pos;
114+
chunk.pos = 0;
115+
unsigned int indent = 1;
116+
while (!end_chunk(&chunk)) {
117+
int ip_flag = 0;
118+
if (chunk.pos == old_pos && print_ip)
119+
ip_flag = 1;
120+
print_instruction_dump(&chunk, &indent);
121+
if (ip_flag)
122+
printf(" <<< IP");
123+
printf("\n");
124+
}
125+
}

src/debug.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#pragma once
2+
3+
#ifndef DEBUG_H
4+
#define DEBUG_H
5+
6+
#include "scanner.h"
7+
#include "chunk.h"
8+
9+
void print_last_line(struct scanner scanner);
10+
void print_dump(struct chunk chunk, int print_ip);
11+
12+
#endif // !DEBUG_H

src/garbage.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,17 @@ void free_gcollect(struct garbage_collector* garbage_collector) {
2424
free(garbage_collector->frame_stack);
2525
}
2626

27-
void register_value(struct garbage_collector* garbage_collector, struct value* value) {
27+
void register_value(struct garbage_collector* garbage_collector, struct value* value, int noreg_head) {
2828
if (value->gc_flag != garbage_uninit)
2929
return;
3030
value->gc_flag = garbage_collect;
3131
struct garbage_frame* gframe = &garbage_collector->frame_stack[garbage_collector->frames - 1];
32-
gframe->to_collect[gframe->values++] = value;
32+
if(!noreg_head)
33+
gframe->to_collect[gframe->values++] = value;
3334

3435
if (value->type == collection) {
3536
for (unsigned long i = 0; i < value->payload.collection->size; i++)
36-
register_value(garbage_collector, value->payload.collection->inner_collection[i]);
37+
register_value(garbage_collector, value->payload.collection->inner_collection[i], 0);
3738
}
3839
}
3940

@@ -61,7 +62,7 @@ void gc_protect(struct value* value) {
6162

6263
void reset_flags(struct garbage_frame* garbage_frame) {
6364
for (unsigned long i = 0; i < garbage_frame->values; i++)
64-
if(garbage_frame->to_collect[i]->gc_flag != garbage_protected)
65+
if (garbage_frame->to_collect[i]->gc_flag != garbage_protected)
6566
garbage_frame->to_collect[i]->gc_flag = garbage_collect;
6667
}
6768

@@ -73,7 +74,7 @@ void trace_frame(struct garbage_frame* garbage_frame) {
7374
void gc_collect(struct garbage_collector* garbage_collector) {
7475
reset_flags(&garbage_collector->frame_stack[garbage_collector->frames - 1]);
7576
if (garbage_collector->frames > 1) {
76-
reset_flags(&garbage_collector->frame_stack[garbage_collector->frames - 2]);
77+
//reset_flags(&garbage_collector->frame_stack[garbage_collector->frames - 2], 0);
7778
for (unsigned long i = 0; i < garbage_collector->frame_stack[garbage_collector->frames - 2].values; i++)
7879
trace_value(garbage_collector->frame_stack[garbage_collector->frames - 2].to_collect[i]);
7980
}

src/garbage.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ void init_gcollect(struct garbage_collector* garbage_collector);
2424

2525
void free_gcollect(struct garbage_collector* garbage_collector);
2626

27-
void register_value(struct garbage_collector* garbage_collector, struct value* value);
27+
void register_value(struct garbage_collector* garbage_collector, struct value* value, int noreg_head);
2828

2929
inline void new_gframe(struct garbage_collector* garbage_collector) {
3030
init_gframe(&garbage_collector->frame_stack[garbage_collector->frames++]);

src/machine.c

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -57,16 +57,21 @@ void init_machine(struct machine* machine) {
5757
declare_builtin_proc(&machine->builtin_register, 271190290, print);
5858
}
5959

60-
void free_machine(struct machine* machine) {
60+
void reset_stack(struct machine* machine) {
6161
while (machine->evals) {
6262
if (machine->eval_flags[machine->evals - 1] == EVAL_FLAG_CPY) {
6363
free_value(machine->evaluation_stack[machine->evals - 1]);
6464
free(machine->evaluation_stack[machine->evals - 1]);
6565
}
6666
machine->evals--;
6767
}
68+
while (machine->call_size > 1)
69+
free_var_context(&machine->var_stack[--machine->call_size]);
70+
}
6871

69-
while (machine->call_size > 0)
72+
void free_machine(struct machine* machine) {
73+
reset_stack(machine);
74+
if (machine->call_size > 0)
7075
free_var_context(&machine->var_stack[--machine->call_size]);
7176

7277
free(machine->position_stack);
@@ -117,13 +122,14 @@ int store_var(struct machine* machine, struct chunk* chunk) {
117122
if (machine->eval_flags[machine->evals] == EVAL_FLAG_CPY) {
118123
struct value* varptr = retrieve_var(&machine->var_stack[machine->call_size - 1], id);
119124
if (varptr == NULL) {
120-
register_value(&machine->garbage_collector, setptr);
125+
register_value(&machine->garbage_collector, setptr, 0);
121126
emplace_var(&machine->var_stack[machine->call_size - 1], id, setptr);
122127
}
123128
else {
124129
free_value(varptr);
125130
memcpy(varptr, setptr, sizeof(struct value));
126131
free(setptr);
132+
register_value(&machine->garbage_collector, varptr, 1);
127133
}
128134
}
129135
else
@@ -337,9 +343,6 @@ int execute(struct machine* machine, struct chunk* chunk) {
337343
machine->position_stack[machine->positions] = chunk->pos - 1;
338344
machine->position_flags[machine->positions++] = 0;
339345
break;
340-
case MACHINE_RETURN:
341-
jump_to(chunk, machine->position_stack[--machine->positions]);
342-
break;
343346
case MACHINE_GOTO:
344347
machine->position_stack[machine->positions] = chunk->pos + sizeof(unsigned long);
345348
machine->position_flags[machine->positions++] = 1;
@@ -363,8 +366,9 @@ int execute(struct machine* machine, struct chunk* chunk) {
363366
skip(chunk, 0);
364367
break;
365368
case MACHINE_COND_RETURN:
369+
--machine->positions;
366370
if (condition_check(machine))
367-
jump_to(chunk, machine->position_stack[--machine->positions]);
371+
jump_to(chunk, machine->position_stack[machine->positions]);
368372
break;
369373
case MACHINE_FLAG:
370374
machine->std_flag = 1;

src/machine.h

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -24,31 +24,30 @@
2424
#define MACHINE_END_SKIP 7
2525

2626
#define MACHINE_MARK 8
27-
#define MACHINE_RETURN 9
2827

29-
#define MACHINE_GOTO 10
30-
#define MACHINE_RETURN_GOTO 11
31-
#define MACHINE_LABEL 12
28+
#define MACHINE_GOTO 9
29+
#define MACHINE_RETURN_GOTO 10
30+
#define MACHINE_LABEL 11
3231

33-
#define MACHINE_COND_SKIP 13
34-
#define MACHINE_COND_RETURN 14
32+
#define MACHINE_COND_SKIP 12
33+
#define MACHINE_COND_RETURN 13
3534

36-
#define MACHINE_FLAG 15
37-
#define MACHINE_RESET_FLAG 16
38-
#define MACHINE_FLAG_SKIP 17
35+
#define MACHINE_FLAG 14
36+
#define MACHINE_RESET_FLAG 15
37+
#define MACHINE_FLAG_SKIP 16
3938

40-
#define MACHINE_NEW_FRAME 18
41-
#define MACHINE_CLEAN 19
39+
#define MACHINE_NEW_FRAME 17
40+
#define MACHINE_CLEAN 18
4241

43-
#define MACHINE_BUILD_COL 20
42+
#define MACHINE_BUILD_COL 19
4443

45-
#define MACHINE_GET_INDEX 21
46-
#define MACHINE_SET_INDEX 22
44+
#define MACHINE_GET_INDEX 20
45+
#define MACHINE_SET_INDEX 21
4746

48-
#define MACHINE_PROTECT 23
49-
#define MACHINE_POP 24
47+
#define MACHINE_PROTECT 22
48+
#define MACHINE_POP 23
5049

51-
#define MACHINE_CALL_EXTERN 25
50+
#define MACHINE_CALL_EXTERN 24
5251

5352
struct machine {
5453
unsigned long* position_stack;
@@ -74,6 +73,8 @@ struct machine {
7473
void init_machine(struct machine* machine);
7574
void free_machine(struct machine* machine);
7675

76+
void reset_stack(struct machine* machine);
77+
7778
int execute(struct machine* machine, struct chunk* chunk);
7879

7980
#endif // !MACHINE_H

src/source.c

Lines changed: 30 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#include <stdlib.h>
33
#include <string.h>
44

5+
#include "debug.h"
56
#include "compiler.h"
67

78
#undef _DEBUG
@@ -18,22 +19,6 @@ unsigned int block_check(const char* src, unsigned int length) {
1819
return blocks;
1920
}
2021

21-
void print_last_line(struct scanner scanner) {
22-
if (scanner.pos >= scanner.size)
23-
scanner.pos = scanner.size;
24-
while (scanner.pos != 0)
25-
{
26-
if (scanner.source[scanner.pos] == '\n') {
27-
scanner.pos++;
28-
break;
29-
}
30-
scanner.pos--;
31-
}
32-
33-
while (scanner.pos < scanner.size && scanner.source[scanner.pos] != '\n')
34-
printf("%c", scanner.source[scanner.pos++]);
35-
}
36-
3722
int main() {
3823
printf("North-Hollywood Minima, version 1.0\n");
3924
printf("Written by Michael Wang in 2021\n\n");
@@ -70,28 +55,41 @@ int main() {
7055

7156
if (!strcmp(src_buf, "quit\n"))
7257
break;
73-
74-
init_compiler(&compiler, src_buf);
75-
76-
if (!compile(&compiler, 1)) {
77-
printf("\n***Syntax Error***\nError No. %d\n", compiler.last_err);
78-
print_last_line(compiler.scanner);
79-
printf("\n");
58+
else if (!strcmp(src_buf, "dump\n")) {
59+
printf("\nGLOBAL DUMP:\n");
60+
struct chunk global_chunk = build_chunk(&global_build);
61+
global_chunk.pos = ip;
62+
print_dump(global_chunk, 1);
8063
}
8164
else {
82-
struct chunk new_chunk = build_chunk(&compiler.chunk_builder);
83-
write_chunk(&global_build, new_chunk);
65+
init_compiler(&compiler, src_buf);
8466

85-
struct chunk global_chunk = build_chunk(&global_build);
86-
global_chunk.pos = ip;
67+
if (!compile(&compiler, 1)) {
68+
printf("\n***Syntax Error***\nError No. %d\n", compiler.last_err);
69+
print_last_line(compiler.scanner);
70+
printf("\n");
71+
}
72+
else {
73+
struct chunk new_chunk = build_chunk(&compiler.chunk_builder);
74+
write_chunk(&global_build, new_chunk);
8775

88-
int err = execute(&machine, &global_chunk);
89-
if (err) {
90-
printf("\n***Runtime Error***\nError No. %d\n", err);
76+
struct chunk global_chunk = build_chunk(&global_build);
9177
global_chunk.pos = ip;
78+
79+
int err = execute(&machine, &global_chunk);
80+
if (err) {
81+
printf("\n***Runtime Error***\nError No. %d\n", err);
82+
printf("\nERROR DUMP:\n");
83+
print_dump(new_chunk, 0);
84+
printf("\nGLOBAL DUMP:\n");
85+
print_dump(global_chunk, 1);
86+
87+
global_build.size = ip;
88+
reset_stack(&machine);
89+
}
90+
else
91+
ip = global_chunk.pos;
9292
}
93-
else
94-
ip = global_chunk.pos;
9593
}
9694
}
9795

0 commit comments

Comments
 (0)