From d32d148cee5b3aec5e8943738aa30139d442478c Mon Sep 17 00:00:00 2001 From: A404M Date: Thu, 30 Jan 2025 05:18:24 +0330 Subject: clean up --- src/compiler/code-generator.c | 49 +++++++++++++++++++++++++++---------------- src/compiler/code-generator.h | 7 ++++++- 2 files changed, 37 insertions(+), 19 deletions(-) (limited to 'src') diff --git a/src/compiler/code-generator.c b/src/compiler/code-generator.c index b084995..b52c5d3 100644 --- a/src/compiler/code-generator.c +++ b/src/compiler/code-generator.c @@ -33,6 +33,15 @@ void codeGeneratorDelete(CodeGeneratorCodes *code) { free(code); } +CodeGeneratorOperand *newCodeGeneratorOperand(char *value, bool isReference) { + CodeGeneratorOperand *result = a404m_malloc(sizeof(*result)); + + result->value = value; + result->isReference = isReference; + + return result; +} + CodeGeneratorCode createGenerateCode(char *label_begin, char *label_end, CodeGeneratorInstruction instruction, void *metadata) { @@ -84,8 +93,8 @@ CodeGeneratorCodes *codeGenerator(AstTreeRoot *astTreeRoot) { continue; case AST_TREE_TOKEN_VALUE_U64: if (!variable->isConst) { - CodeGeneratorOperand value = - u64ToString((AstTreeU64)variable->value->metadata); + CodeGeneratorOperand *value = newCodeGeneratorOperand( + u64ToString((AstTreeU64)variable->value->metadata), false); generateCodePushCode( codes, createGenerateCode(variable->name_begin, variable->name_end, @@ -142,8 +151,8 @@ bool codeGeneratorAstTreeFunction(char *label_begin, char *label_end, case AST_TREE_TOKEN_KEYWORD_PRINT_U64: { AstTreeSingleChild *metadata = tree.metadata; if (metadata->token == AST_TREE_TOKEN_VALUE_U64) { - CodeGeneratorOperand value = - u64ToString((AstTreeU64)metadata->metadata); + CodeGeneratorOperand *value = newCodeGeneratorOperand( + u64ToString((AstTreeU64)metadata->metadata), false); generateCodePushCode( codes, createGenerateCode(label_begin, label_end, @@ -151,12 +160,12 @@ bool codeGeneratorAstTreeFunction(char *label_begin, char *label_end, } else if (metadata->token == AST_TREE_TOKEN_VARIABLE) { AstTreeVariable *variable = metadata->metadata; if (variable->isConst) { - CodeGeneratorOperand value = - u64ToString((AstTreeU64)variable->value->metadata); + CodeGeneratorOperand *value = newCodeGeneratorOperand( + u64ToString((AstTreeU64)variable->value->metadata), false); generateCodePushCode( - codes, createGenerateCode(label_begin, label_end, - CODE_GENERATOR_INSTRUCTION_PRINT_U64, - (void *)value)); + codes, + createGenerateCode(label_begin, label_end, + CODE_GENERATOR_INSTRUCTION_PRINT_U64, value)); } else { char *name = a404m_malloc( (variable->name_end - variable->name_begin + 1) * sizeof(*name)); @@ -164,9 +173,9 @@ bool codeGeneratorAstTreeFunction(char *label_begin, char *label_end, variable->name_end - variable->name_begin); name[variable->name_end - variable->name_begin] = '\0'; generateCodePushCode( - codes, - createGenerateCode(label_begin, label_end, - CODE_GENERATOR_INSTRUCTION_PRINT_U64, name)); + codes, createGenerateCode(label_begin, label_end, + CODE_GENERATOR_INSTRUCTION_PRINT_U64, + newCodeGeneratorOperand(name, true))); } } else { printLog("Not implemented yet"); @@ -236,12 +245,12 @@ char *codeGeneratorToFlatASM(const CodeGeneratorCodes *codes) { switch (code.instruction) { case CODE_GENERATOR_INSTRUCTION_PRINT_U64: { - CodeGeneratorOperand metadata = (CodeGeneratorOperand)code.metadata; + CodeGeneratorOperand *metadata = code.metadata; char *inst; - if ('0' <= metadata[0] && metadata[0] <= '9') { - asprintf(&inst, "mov rdi,%s\ncall print_u64\n", metadata); + if (metadata->isReference) { + asprintf(&inst, "mov rdi,[%s]\ncall print_u64\n", metadata->value); } else { - asprintf(&inst, "mov rdi,[%s]\ncall print_u64\n", metadata); + asprintf(&inst, "mov rdi,%s\ncall print_u64\n", metadata->value); } codeGeneratorAppendFlatASMCommand(&fasm, &fasm_size, &fasm_inserted, inst, strlen(inst)); @@ -267,9 +276,13 @@ char *codeGeneratorToFlatASM(const CodeGeneratorCodes *codes) { } continue; case CODE_GENERATOR_INSTRUCTION_DEF_VAR64: { - CodeGeneratorOperand metadata = (CodeGeneratorOperand)code.metadata; + CodeGeneratorOperand *metadata = code.metadata; char *inst; - asprintf(&inst, "db %s\n", metadata); + if (metadata->isReference) { + asprintf(&inst, "db [%s]\n", metadata->value); + } else { + asprintf(&inst, "db %s\n", metadata->value); + } codeGeneratorAppendFlatASMCommand(&fasm, &fasm_size, &fasm_inserted, inst, strlen(inst)); free(inst); diff --git a/src/compiler/code-generator.h b/src/compiler/code-generator.h index 05a6bf4..a9c6490 100644 --- a/src/compiler/code-generator.h +++ b/src/compiler/code-generator.h @@ -23,7 +23,10 @@ typedef struct CodeGeneratorCall { char *label_end; } CodeGeneratorCall; -typedef char *CodeGeneratorOperand; +typedef struct CodeGeneratorOperand { + char *value; + bool isReference; +} CodeGeneratorOperand; typedef struct CodeGeneratorCodes { CodeGeneratorCode *codes; @@ -32,6 +35,8 @@ typedef struct CodeGeneratorCodes { void codeGeneratorDelete(CodeGeneratorCodes *code); +CodeGeneratorOperand *newCodeGeneratorOperand(char *value, bool isReference); + CodeGeneratorCode createGenerateCode(char *label_begin, char *label_end, CodeGeneratorInstruction instruction, void *metadata); -- cgit v1.2.3