Skip to content

Commit a3b5dc9

Browse files
committed
fix && || operators
1 parent 4886a1c commit a3b5dc9

2 files changed

Lines changed: 42 additions & 9 deletions

File tree

modules/gen/gen_pex/gen_expr.v

Lines changed: 41 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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]
312346
fn (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
353387
fn (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())

modules/tests/vm_tests_test.v

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ fn test_builder() {
8787
assert pex3.string_table.len == 158
8888
assert pex3.objects.len == 1
8989
assert pex3.get_string(pex3.objects[0].name) == "OpcodesTest"
90-
assert pex3.objects[0].size == 8503
90+
assert pex3.objects[0].size == 8587
9191
assert pex3.objects[0].variables.len == 21
9292
assert pex3.objects[0].properties.len == 2
9393
assert pex3.objects[0].states.len == 3

0 commit comments

Comments
 (0)