summaryrefslogtreecommitdiff
path: root/compiler.c
diff options
context:
space:
mode:
Diffstat (limited to 'compiler.c')
-rw-r--r--compiler.c108
1 files changed, 106 insertions, 2 deletions
diff --git a/compiler.c b/compiler.c
index edcd2b1..f135d9e 100644
--- a/compiler.c
+++ b/compiler.c
@@ -455,6 +455,68 @@ Variable _op_coerce(Variable *base, Variable *to_coerce) {
// with an array => pointer + 8 bytes (length of array at start) + index * size of data
// with a pointer => pointer + index * size of data
+char *_op_get_register(int reg, int size) {
+ Vector out = vect_init(sizeof(char));
+ char add = 'r';
+
+ switch(size) {
+ case 1:
+ case 2:
+ break;
+ case 4:
+ add = 'e';
+ case 8:
+ vect_push(&out, &add);
+ break;
+ default:
+ printf("ERROR: invalid register size %d (this is a compiler issue)\n", size);
+ vect_push(&out, &add);
+ break;
+ }
+
+ switch(reg) {
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ add = 'a' + (reg - 1);
+ break;
+ case 5:
+ case 7:
+ add = 's';
+ break;
+ case 6:
+ add = 'd';
+ break;
+ case 8:
+ add = 'b';
+ break;
+ default:
+ printf("ERROR: Unknown register %d (this is a compiler issue)\n", reg);
+ break;
+ }
+ vect_push(&out, &add);
+
+ //TODO: Ending
+
+ return out.data;
+}
+
+char *_op_get_location(Variable *var, int location) {
+ Vector out = vect_init(sizeof(char));
+ if(location < 0) {
+ } else if (location == 0) {
+ } else {
+ }
+}
+
+void var_swap_register(CompData *out, Variable *swap, int new_reg) {
+ if(swap->location == new_reg)
+ return;
+
+
+}
+
void var_op_reference(CompData *out, Variable *store, Variable *from) {}
void var_op_dereference(CompData *out, Variable *store, Variable *from) {}
void var_op_index(CompData *out, Variable *store, Variable *from, Variable *index) {}
@@ -2326,10 +2388,19 @@ void _p2_handle_method_scope(Module *root, CompData *out, Scope *fs) {
}
+void _p2_func_scope_init(Module *root, CompData *out, Scope *fs) {
+
+}
+
+void _p2_func_scope_end(CompData *out, Scope *fs) {
+
+}
+
void p2_compile_function(Module *root, CompData *out, Vector *tokens, size_t *pos) {
int end = tnsl_find_closing(tokens, *pos);
Token *start = vect_get(tokens, *pos);
+ // Pre-checks for end of function and function name so scope can be initialized
if(end < 0) {
printf("ERROR: Could not find closing for function \"%s\" (%d:%d)\n\n", start->data, start->line, start->col);
p2_error = true;
@@ -2341,6 +2412,9 @@ void p2_compile_function(Module *root, CompData *out, Vector *tokens, size_t *po
t = vect_get(tokens, ++(*pos));
if(tok_str_eq(t, "\n"))
break;
+ else if (t->type == TT_DELIMIT && !tok_str_eq(t, ";/") && !tok_str_eq(t, ";;")) {
+ *pos = tnsl_find_closing(tokens, *pos);
+ }
}
if(t == NULL || t->type != TT_DEFWORD) {
@@ -2354,8 +2428,12 @@ void p2_compile_function(Module *root, CompData *out, Vector *tokens, size_t *po
Function *f = mod_find_func(root, &f_art);
art_end(&f_art);
+ // Scope init
Scope fs = scope_init(t->data, root);
- _p2_handle_method_scope();
+ if(root->name[0] == '@') {
+ _p2_handle_method_scope(root, out, &fs);
+ }
+ _p2_func_scope_init(root, out, &fs);
while(*pos < (size_t)end) {
t = vect_get(tokens, *pos);
@@ -2383,7 +2461,32 @@ void p2_compile_function(Module *root, CompData *out, Vector *tokens, size_t *po
}
} else if (t->type == TT_KEYWORD) {
-
+ if(tok_str_eq(t, "return")) {
+ t = vect_get(tokens, *pos + 1);
+ if (f->outputs.count > 0) {
+ if (*pos + 1 < end && !tok_str_eq(t, "\n"))
+ eval(&fs, out, tokens, pos, true);
+ else {
+ t = vect_get(tokens, *pos);
+ printf("ERROR: Attempt to return from a function without a value, but the function requires one (%d:%d)", t->line, t->col);
+ p2_error = true;
+ }
+ }
+ _p2_func_scope_end(out, &fs);
+ *pos = end;
+ return;
+ } else if (tok_str_eq(t, "asm")) {
+ t = vect_get(tokens, ++(*pos));
+ if(t->type != TT_LITERAL || t->data[0] != '"') {
+ printf("ERROR: Expected string literal after asm keyword (%d:%d)\n", t->line, t->col);
+ p2_error = true;
+ } else {
+ char *m = tnsl_unquote_str(t->data);
+ vect_push_string(&out->text, m);
+ vect_push_string(&out->text, "\n");
+ free(m);
+ }
+ }
} else if (tnsl_is_def(tokens, *pos)) {
p2_compile_def(&fs, out, tokens, pos);
} else {
@@ -2612,6 +2715,7 @@ void p2_file_loop(
char *push = tnsl_unquote_str(t->data);
if (push != NULL) {
vect_push_string(&out->header, push);
+ vect_push_string(&out->header, "\n");
free(push);
}
}