summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorA404M <ahmadmahmoudiprogrammer@gmail.com>2025-01-30 05:18:24 +0330
committerA404M <ahmadmahmoudiprogrammer@gmail.com>2025-01-30 05:18:24 +0330
commitd32d148cee5b3aec5e8943738aa30139d442478c (patch)
tree6207455ee2f089a4fd6fddd04eb80e00a2333431 /src
parente6122f465cd8b8eebcc2657321cf7cf5732408a8 (diff)
clean up
Diffstat (limited to 'src')
-rw-r--r--src/compiler/code-generator.c49
-rw-r--r--src/compiler/code-generator.h7
2 files changed, 37 insertions, 19 deletions
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);