From 5a6f4613ab19a9c4bc9ead53da410d7ab9ff5837 Mon Sep 17 00:00:00 2001
From: A404M <ahmadmahmoudiprogrammer@gmail.com>
Date: Fri, 31 Jan 2025 02:46:16 +0330
Subject: make stuff more organized and safer

---
 src/compiler/code-generator.h | 32 ++++++++++++++++++++++++++++----
 1 file changed, 28 insertions(+), 4 deletions(-)

(limited to 'src/compiler/code-generator.h')

diff --git a/src/compiler/code-generator.h b/src/compiler/code-generator.h
index ac47e76..0c388b9 100644
--- a/src/compiler/code-generator.h
+++ b/src/compiler/code-generator.h
@@ -9,9 +9,13 @@ typedef enum CodeGeneratorInstruction : uint8_t {
   CODE_GENERATOR_INSTRUCTION_CALL,
   CODE_GENERATOR_INSTRUCTION_RET,
   CODE_GENERATOR_INSTRUCTION_DEF_VAR64,
-  CODE_GENERATOR_INSTRUCTION_MOV_U64,
+  CODE_GENERATOR_INSTRUCTION_MOV_64,
 } CodeGeneratorInstruction;
 
+typedef enum CodeGeneratorType : uint8_t {
+  CODE_GENERATOR_TYPE_64,
+} CodeGeneratorType;
+
 typedef struct CodeGeneratorCode {
   char *label_begin;
   char *label_end;
@@ -25,7 +29,10 @@ typedef struct CodeGeneratorCall {
 } CodeGeneratorCall;
 
 typedef struct CodeGeneratorOperand {
-  char *value;
+  union {
+    uint64_t value;
+    char *reference;
+  } value;
   bool isReference;
 } CodeGeneratorOperand;
 
@@ -34,25 +41,42 @@ typedef struct CodeGeneratorDoubleOperand {
   CodeGeneratorOperand op1;
 } CodeGeneratorDoubleOperand;
 
+typedef struct CodeGeneratorDefine {
+  char *label_begin;
+  char *label_end;
+  CodeGeneratorOperand operand;
+  CodeGeneratorType type;
+} CodeGeneratorDefine;
+
 typedef struct CodeGeneratorCodes {
   CodeGeneratorCode *codes;
   size_t codes_size;
+  CodeGeneratorDefine *defines;
+  size_t defines_size;
 } CodeGeneratorCodes;
 
+void codeGeneratorOperandDestroy(CodeGeneratorOperand operand);
 void codeGeneratorDelete(CodeGeneratorCodes *code);
 
-CodeGeneratorOperand *newCodeGeneratorOperand(char *value, bool isReference);
+CodeGeneratorOperand *newCodeGeneratorOperand(void *value, bool isReference);
+CodeGeneratorOperand makeCodeGeneratorOperand(void *value, bool isReference);
 
-CodeGeneratorOperand *makeCodeGeneratorOperand(AstTree tree);
+CodeGeneratorOperand *newCodeGeneratorOperandFromAstTree(AstTree tree);
 
 CodeGeneratorCode createGenerateCode(char *label_begin, char *label_end,
                                      CodeGeneratorInstruction instruction,
                                      void *metadata);
 
+CodeGeneratorDefine createGenerateDefine(char *label_begin, char *label_end,
+                                       CodeGeneratorOperand operand,
+                                       CodeGeneratorType type);
+
 CodeGeneratorCode *newGenerateCode(char *label_begin, char *label_end,
                                    CodeGeneratorInstruction instruction);
 
 void generateCodePushCode(CodeGeneratorCodes *codes, CodeGeneratorCode code);
+void generateCodePushDefine(CodeGeneratorCodes *codes,
+                            CodeGeneratorDefine define);
 
 CodeGeneratorCodes *codeGenerator(AstTreeRoot *astTreeRoot);
 
-- 
cgit v1.2.3