|
27 | 27 | #include "../vm/cpu.h"
|
28 | 28 | #include "../interpreter/module_new.h"
|
29 | 29 |
|
30 |
| -typedef struct i64_array i64_array; |
| 30 | +typedef struct KaosIR KaosIR; |
| 31 | +typedef struct KaosInst KaosInst; |
| 32 | +typedef struct KaosOp KaosOp; |
31 | 33 |
|
32 |
| -typedef struct i64_array { |
33 |
| - i64* arr; |
| 34 | +typedef struct KaosIR { |
| 35 | + KaosInst* arr; |
34 | 36 | i64 capacity;
|
35 | 37 | i64 size;
|
36 |
| - i64 heap; |
37 |
| - i64 start; |
38 | 38 | i64 hlt_count;
|
39 |
| - i64_array* ast_ref; |
40 |
| -} i64_array; |
| 39 | +} KaosIR; |
41 | 40 |
|
42 |
| -i64_array* compile(ASTRoot* ast_root); |
| 41 | +typedef struct KaosInst { |
| 42 | + i64 op_code; |
| 43 | + KaosOp* op1; |
| 44 | + KaosOp* op2; |
| 45 | + KaosOp* op3; |
| 46 | + void* ast_ref; |
| 47 | +} KaosInst; |
| 48 | + |
| 49 | + |
| 50 | +enum IRType { IR_REG, IR_VAL }; |
| 51 | +enum IRValueType { IR_INT, IR_FLOAT, IR_STRING }; |
| 52 | + |
| 53 | +typedef struct KaosOp { |
| 54 | + enum IRType type; |
| 55 | + i64 reg; |
| 56 | + enum IRValueType value_type; |
| 57 | + union IRValue { |
| 58 | + i64 i; |
| 59 | + f64 f; |
| 60 | + byte *s; |
| 61 | + } value; |
| 62 | +} KaosOp; |
| 63 | + |
| 64 | +KaosIR* compile(ASTRoot* ast_root); |
43 | 65 | void initCallJumps();
|
44 |
| -void fillCallJumps(i64_array* program); |
45 |
| -void compileImports(ASTRoot* ast_root, i64_array* program); |
46 |
| -void compileStmtList(i64_array* program, StmtList* stmt_list); |
47 |
| -void compileStmt(i64_array* program, Stmt* stmt); |
48 |
| -unsigned short compileExpr(i64_array* program, Expr* expr); |
49 |
| -void compileDecl(i64_array* program, Decl* decl); |
50 |
| -void compileSpecList(i64_array* program, SpecList* spec_list); |
51 |
| -unsigned short compileSpec(i64_array* program, Spec* spec); |
52 |
| - |
53 |
| -void push_instr(i64_array* program, i64 el); |
54 |
| -void pushProgram(i64_array* program, i64 el); |
55 |
| -i64 popProgram(i64_array* program); |
56 |
| -void freeProgram(i64_array* program); |
57 |
| -i64_array* initProgram(); |
58 |
| -void shift_registers(i64_array* program, size_t shift); |
59 |
| - |
60 |
| -Symbol* store_bool(i64_array* program, char *name, bool is_any); |
61 |
| -Symbol* store_int(i64_array* program, char *name, bool is_any); |
62 |
| -Symbol* store_float(i64_array* program, char *name, bool is_any); |
63 |
| -Symbol* store_string(i64_array* program, char *name, size_t len, bool is_any, bool is_dynamic); |
64 |
| -Symbol* store_list(i64_array* program, char *name, size_t len, bool is_dynamic); |
65 |
| -Symbol* store_dict(i64_array* program, char *name, size_t len, bool is_dynamic); |
66 |
| -Symbol* store_any(i64_array* program, char *name); |
67 |
| - |
68 |
| -void load_bool(i64_array* program, Symbol* symbol); |
69 |
| -void load_int(i64_array* program, Symbol* symbol); |
70 |
| -void load_float(i64_array* program, Symbol* symbol); |
71 |
| -void load_string(i64_array* program, Symbol* symbol); |
72 |
| -void load_list(i64_array* program, Symbol* symbol); |
73 |
| -void load_dict(i64_array* program, Symbol* symbol); |
74 |
| -void load_any(i64_array* program, Symbol* symbol); |
| 66 | +void fillCallJumps(KaosIR* program); |
| 67 | +void compileImports(ASTRoot* ast_root, KaosIR* program); |
| 68 | +void compileStmtList(KaosIR* program, StmtList* stmt_list); |
| 69 | +void compileStmt(KaosIR* program, Stmt* stmt); |
| 70 | +unsigned short compileExpr(KaosIR* program, Expr* expr); |
| 71 | +void compileDecl(KaosIR* program, Decl* decl); |
| 72 | +void compileSpecList(KaosIR* program, SpecList* spec_list); |
| 73 | +unsigned short compileSpec(KaosIR* program, Spec* spec); |
| 74 | + |
| 75 | +void push_instr(KaosIR* program, i64 el); |
| 76 | +void pushProgram(KaosIR* program, i64 el); |
| 77 | +KaosInst popProgram(KaosIR* program); |
| 78 | +void freeProgram(KaosIR* program); |
| 79 | +KaosIR* initProgram(); |
| 80 | +void shift_registers(KaosIR* program, size_t shift); |
| 81 | + |
| 82 | +Symbol* store_bool(KaosIR* program, char *name, bool is_any); |
| 83 | +Symbol* store_int(KaosIR* program, char *name, bool is_any); |
| 84 | +Symbol* store_float(KaosIR* program, char *name, bool is_any); |
| 85 | +Symbol* store_string(KaosIR* program, char *name, size_t len, bool is_any, bool is_dynamic); |
| 86 | +Symbol* store_list(KaosIR* program, char *name, size_t len, bool is_dynamic); |
| 87 | +Symbol* store_dict(KaosIR* program, char *name, size_t len, bool is_dynamic); |
| 88 | +Symbol* store_any(KaosIR* program, char *name); |
| 89 | + |
| 90 | +void load_bool(KaosIR* program, Symbol* symbol); |
| 91 | +void load_int(KaosIR* program, Symbol* symbol); |
| 92 | +void load_float(KaosIR* program, Symbol* symbol); |
| 93 | +void load_string(KaosIR* program, Symbol* symbol); |
| 94 | +void load_list(KaosIR* program, Symbol* symbol); |
| 95 | +void load_dict(KaosIR* program, Symbol* symbol); |
| 96 | +void load_any(KaosIR* program, Symbol* symbol); |
75 | 97 |
|
76 | 98 | char* compile_module_selector(Expr* module_selector);
|
77 |
| -bool declare_function(Stmt* stmt, File* file, i64_array* program); |
78 |
| -void declare_functions(ASTRoot* ast_root, i64_array* program); |
79 |
| -void compile_functions(ASTRoot* ast_root, i64_array* program); |
| 99 | +bool declare_function(Stmt* stmt, File* file, KaosIR* program); |
| 100 | +void declare_functions(ASTRoot* ast_root, KaosIR* program); |
| 101 | +void compile_functions(ASTRoot* ast_root, KaosIR* program); |
80 | 102 |
|
81 | 103 | void strongly_type(Symbol* symbol_x, Symbol* symbol_y, _Function* function, Expr* expr, enum ValueType value_type);
|
82 | 104 | void strongly_type_basic_check(unsigned short code, char *str1, char *str2, enum Type type, enum ValueType value_type);
|
|
0 commit comments