added not instruction and escape sequences
This commit is contained in:
@@ -30,8 +30,6 @@ class X86_64Generator(Generator):
|
||||
|
||||
var = scope.lookup(var_name)
|
||||
var_pos = self.get_var_pos(var_name, scope)
|
||||
|
||||
print(self.stack_size, var_name, var_pos)
|
||||
|
||||
if isinstance(var_pos, str): # in a reg, not on the stack
|
||||
waste = {
|
||||
@@ -50,7 +48,6 @@ class X86_64Generator(Generator):
|
||||
lines.append(f"mov {reg}, {var_pos}\n\t")
|
||||
else:
|
||||
try:
|
||||
#print(var["type"])
|
||||
if var["type"] == FloatNode:
|
||||
conversion = {
|
||||
"rax": "xmm0",
|
||||
@@ -132,7 +129,6 @@ class X86_64Generator(Generator):
|
||||
self.push("rax", lines)
|
||||
lines.append(f"mov rax, {string_len[1:-1]}\n\t")
|
||||
self.push("rax", lines)
|
||||
print(self.stack_size)
|
||||
|
||||
elif type(starting_value) == BoolNode:
|
||||
self.push("1" if starting_value.value else "0", lines)
|
||||
@@ -268,7 +264,6 @@ class X86_64Generator(Generator):
|
||||
#self.generate_InstructionNode(inst, self.function_lines)
|
||||
|
||||
def generate_InstructionNode(self, node: InstructionNode, lines = None):
|
||||
print(node.instruction, self.stack_size)
|
||||
lines = lines or self.lines
|
||||
|
||||
### MISC ###
|
||||
@@ -538,6 +533,27 @@ class X86_64Generator(Generator):
|
||||
self.create_variable(lines, var_name, "rax", BoolNode)
|
||||
else:
|
||||
self.change_variable(lines, var_name, "rax")
|
||||
elif node.instruction == "not":
|
||||
self.clamp_instruction_args(node, 2, 2)
|
||||
if type(node.arguments[0]) not in [VarRefNode,BoolNode]:
|
||||
traceback(self.code, "TypeError", f"Argument 1 of \"not\" must be a boolean or variable reference, not \"{node.arguments[0]}\"")
|
||||
elif not isinstance(node.arguments[1], VarPointerNode):
|
||||
traceback(self.code, "TypeError", f"Argument 2 of \"not\" must be a variable pointer, not \"{node.arguments[1]}\"")
|
||||
|
||||
result = ""
|
||||
if isinstance(node.arguments[0], BoolNode):
|
||||
result = BoolNode(not node.arguments[0].value)
|
||||
elif isinstance(node.arguments[0], VarRefNode):
|
||||
var_type = self.get_variable(lines, node.arguments[0].var_name, "rax")
|
||||
if var_type != BoolNode:
|
||||
traceback(self.code, "TypeError", f"Argument 1 of \"not\" must be a boolean or variable reference, not \"{var_type(0).__repr__()}\"")
|
||||
result = "rax"
|
||||
lines.append("xor rax, 1\n\t")
|
||||
|
||||
if self.current_var_scope.table.get(node.arguments[1].var_name):
|
||||
self.change_variable(lines, node.arguments[1].var_name, result)
|
||||
else:
|
||||
self.create_variable(lines, node.arguments[1].var_name, result, BoolNode)
|
||||
|
||||
elif node.instruction == "endfun":
|
||||
return
|
||||
|
Reference in New Issue
Block a user