@@ -83,15 +83,32 @@ fn (mut g Gen) gen_infix_operator(mut expr ast.InfixExpr) pex.VariableValue {
8383 // opcode: 'assign', args: [ident(a), integer(2)]
8484 // opcode: 'jmp', args: [integer(1)]
8585
86- mut result_value := g.get_operand_from_expr (mut & expr.left)
86+ // true && true
87+ // false && true
88+
89+ mut left_value := g.get_operand_from_expr (mut & expr.left)
90+ g.free_temp (left_value)
91+
92+ mut result_value := g.get_free_temp (ast.bool_type)
93+
94+ g.cur_fn.info.instructions << pex.Instruction{
95+ op: pex.OpCode.assign
96+ args: [ result_value, left_value ]
97+ }
98+
8799 left_jmp_index := g.cur_fn.info.instructions.len
88100 g.cur_fn.info.instructions << pex.Instruction{
89101 op: pex.OpCode.jmpf
90102 args: [ result_value ]
91103 }
92104
93- g.free_temp (result_value)
94- result_value = g.get_operand_from_expr (mut & expr.right)
105+ right_value := g.get_operand_from_expr (mut & expr.right)
106+ g.free_temp (right_value)
107+
108+ g.cur_fn.info.instructions << pex.Instruction{
109+ op: pex.OpCode.assign
110+ args: [ result_value, right_value ]
111+ }
95112
96113 g.cur_fn.info.instructions[left_jmp_index].args << pex.value_integer (g.cur_fn.info.instructions.len - left_jmp_index)
97114
@@ -108,15 +125,32 @@ fn (mut g Gen) gen_infix_operator(mut expr ast.InfixExpr) pex.VariableValue {
108125 // opcode: 'assign', args: [ident(a), integer(2)]
109126 // opcode: 'jmp', args: [integer(1)]
110127
111- mut result_value := g.get_operand_from_expr (mut & expr.left)
128+ // true || true
129+ // false || true
130+
131+ mut left_value := g.get_operand_from_expr (mut & expr.left)
132+ g.free_temp (left_value)
133+
134+ mut result_value := g.get_free_temp (ast.bool_type)
135+
136+ g.cur_fn.info.instructions << pex.Instruction{
137+ op: pex.OpCode.assign
138+ args: [ result_value, left_value ]
139+ }
140+
112141 left_jmp_index := g.cur_fn.info.instructions.len
113142 g.cur_fn.info.instructions << pex.Instruction{
114143 op: pex.OpCode.jmpt
115144 args: [ result_value ]
116145 }
117146
118- g.free_temp (result_value)
119- result_value = g.get_operand_from_expr (mut & expr.right)
147+ right_value := g.get_operand_from_expr (mut & expr.right)
148+ g.free_temp (right_value)
149+
150+ g.cur_fn.info.instructions << pex.Instruction{
151+ op: pex.OpCode.assign
152+ args: [ result_value, right_value ]
153+ }
120154
121155 g.cur_fn.info.instructions[left_jmp_index].args << pex.value_integer (g.cur_fn.info.instructions.len - left_jmp_index)
122156
@@ -310,7 +344,6 @@ fn (mut g Gen) gen_array_get_element(mut expr ast.IndexExpr) pex.VariableValue {
310344
311345@[inline]
312346fn (mut g Gen) gen_selector (mut expr ast.SelectorExpr) pex.VariableValue {
313-
314347 if expr.field_name.to_lower () == "length" {
315348 // opcode: 'array_length', args: [ident(::temp1), ident(myArray)]
316349
@@ -350,6 +383,7 @@ fn (mut g Gen) gen_selector(mut expr ast.SelectorExpr) pex.VariableValue {
350383 return result_value
351384}
352385
386+ // TODO rename gen_expr
353387fn (mut g Gen) get_operand_from_expr (mut expr ast.Expr) pex.VariableValue {
354388 mut result_value := pex.value_none ()
355389
@@ -392,7 +426,6 @@ fn (mut g Gen) get_operand_from_expr(mut expr ast.Expr) pex.VariableValue {
392426 }
393427 ast.IntegerLiteral {
394428 return pex.value_integer (expr.val.int ())
395-
396429 }
397430 ast.FloatLiteral {
398431 return pex.value_float (expr.val.f32 ())
0 commit comments