From d32d148cee5b3aec5e8943738aa30139d442478c Mon Sep 17 00:00:00 2001
From: A404M <ahmadmahmoudiprogrammer@gmail.com>
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/compiler')

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