gen: fix multiple call of expression in match (#6324)

pull/6358/head
Enzo 2020-09-08 00:38:24 +02:00 committed by GitHub
parent 5258f52497
commit 18034bb95c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 56 additions and 37 deletions

View File

@ -7,13 +7,10 @@ fn main() {
args := os.args args := os.args
args_string := args[1..].join(' ') args_string := args[1..].join(' ')
params := args_string.all_before('build-examples') params := args_string.all_before('build-examples')
if testing.v_build_failing(params, 'examples') {
if testing.v_build_failing(params, 'examples'){
exit(1) exit(1)
} }
if testing.v_build_failing(params + '-live', os.join_path('examples', 'hot_reload')) {
if testing.v_build_failing(params + '-live', os.join_path( 'examples', 'hot_reload')){
exit(1) exit(1)
} }
} }

View File

@ -94,7 +94,7 @@ fn new_board(sb []string) Board {
mut b := Board{} mut b := Board{}
for y := 0; y < 4; y++ { for y := 0; y < 4; y++ {
for x := 0; x < 4; x++ { for x := 0; x < 4; x++ {
b.field[y][x] = sb[y][x] - 64 b.field[y][x] = sb[y][x] - 64
} }
} }
return b return b
@ -180,7 +180,9 @@ fn (t TileLine) to_left() TileLine {
fn (b Board) to_left() Board { fn (b Board) to_left() Board {
mut res := b mut res := b
for y := 0; y < 4; y++ { for y := 0; y < 4; y++ {
mut hline := TileLine{ypos: y} mut hline := TileLine{
ypos: y
}
for x := 0; x < 4; x++ { for x := 0; x < 4; x++ {
hline.field[x] = b.field[y][x] hline.field[x] = b.field[y][x]
} }
@ -264,8 +266,8 @@ fn (app &App) draw() {
fn (app &App) draw_background() { fn (app &App) draw_background() {
tw, th := 128, 128 tw, th := 128, 128
for y := 30; y <= window_height; y+=tw { for y := 30; y <= window_height; y += tw {
for x := 0; x <= window_width; x+=th { for x := 0; x <= window_width; x += th {
app.gg.draw_image(x, y, tw, th, app.tiles[0].image) app.gg.draw_image(x, y, tw, th, app.tiles[0].image)
} }
} }
@ -379,7 +381,8 @@ fn (mut app App) game_over() {
app.state = .over app.state = .over
} }
type BoardMoveFN fn(b Board) Board type BoardMoveFN = fn (b Board) Board
fn (mut app App) move(move_fn BoardMoveFN) { fn (mut app App) move(move_fn BoardMoveFN) {
old := app.board old := app.board
new := move_fn(old) new := move_fn(old)
@ -400,7 +403,7 @@ fn (mut app App) on_key_down(key sapp.KeyCode) {
.n { .n {
app.new_game() app.new_game()
} }
//.t {/* fast setup for a victory situation: */ app.board = new_board(['JJ@@', '@@@@', '@@@@', '@@@@'])} // .t {/* fast setup for a victory situation: */ app.board = new_board(['JJ@@', '@@@@', '@@@@', '@@@@'])}
.backspace { .backspace {
if app.undo.len > 0 { if app.undo.len > 0 {
app.state = .play app.state = .play

View File

@ -36,7 +36,10 @@ mut:
fn (mut a App) init() { fn (mut a App) init() {
a.frame = 0 a.frame = 0
a.last = time.ticks() a.last = time.ticks()
a.ps = particle.System{width: a.width, height: a.height} a.ps = particle.System{
width: a.width
height: a.height
}
a.ps.init(particle.SystemConfig{ a.ps.init(particle.SystemConfig{
pool: 20000 pool: 20000
}) })
@ -59,7 +62,6 @@ fn (mut a App) run() {
html5_canvas_name: title.str html5_canvas_name: title.str
cleanup_userdata_cb: cleanup cleanup_userdata_cb: cleanup
} }
sapp.run(&desc) sapp.run(&desc)
} }
@ -119,13 +121,10 @@ fn event(ev &C.sapp_event, user_data voidptr) {
} }
} }
} }
if ev.@type == .touches_began || ev.@type == .touches_moved { if ev.@type == .touches_began || ev.@type == .touches_moved {
if ev.num_touches > 0 { if ev.num_touches > 0 {
touch_point := ev.touches[0] touch_point := ev.touches[0]
app.ps.explode(touch_point.pos_x, touch_point.pos_y) app.ps.explode(touch_point.pos_x, touch_point.pos_y)
} }
} }
} }

View File

@ -24,21 +24,20 @@ pub fn (mut app App) init_once() {
app.vweb.handle_static('assets') app.vweb.handle_static('assets')
// This would make available all known static mime types from current // This would make available all known static mime types from current
// directory and below. // directory and below.
//app.vweb.handle_static('.') // app.vweb.handle_static('.')
} }
pub fn (mut app App) init() {} pub fn (mut app App) init() {
}
pub fn (mut app App) index() { pub fn (mut app App) index() {
// We can dynamically specify which assets are to be used in template. // We can dynamically specify which assets are to be used in template.
mut am := assets.new_manager() mut am := assets.new_manager()
am.add_css('assets/index.css') am.add_css('assets/index.css')
css := am.include_css(false) css := am.include_css(false)
title := 'VWeb Assets Example' title := 'VWeb Assets Example'
subtitle := 'VWeb can serve static assets too!' subtitle := 'VWeb can serve static assets too!'
message := 'It also has an Assets Manager that allows dynamically specifying which CSS and JS files to be used.' message := 'It also has an Assets Manager that allows dynamically specifying which CSS and JS files to be used.'
$vweb.html() $vweb.html()
} }

View File

@ -2561,15 +2561,17 @@ fn (mut g Gen) match_expr(node ast.MatchExpr) {
g.match_sumtype_syms.pop() g.match_sumtype_syms.pop()
} }
} }
mut tmp := '' cur_line := if is_expr {
if type_sym.kind != .void { g.empty_line = true
tmp = g.new_tmp_var() g.go_before_stmt(0)
} else {
''
} }
// styp := g.typ(node.expr_type) cond_var := g.new_tmp_var()
// g.write('$styp $tmp = ') g.write('${g.typ(node.cond_type)} $cond_var = ')
// g.expr(node.cond) g.expr(node.cond)
// g.writeln(';') // $it.blocks.len') g.writeln(';')
// mut sum_type_str = '' g.write(cur_line)
for j, branch in node.branches { for j, branch in node.branches {
is_last := j == node.branches.len - 1 is_last := j == node.branches.len - 1
if branch.is_else || (node.is_expr && is_last) { if branch.is_else || (node.is_expr && is_last) {
@ -2596,7 +2598,7 @@ fn (mut g Gen) match_expr(node ast.MatchExpr) {
} }
for i, expr in branch.exprs { for i, expr in branch.exprs {
if node.is_sum_type { if node.is_sum_type {
g.expr(node.cond) g.write(cond_var)
sym := g.table.get_type_symbol(node.cond_type) sym := g.table.get_type_symbol(node.cond_type)
// branch_sym := g.table.get_type_symbol(branch.typ) // branch_sym := g.table.get_type_symbol(branch.typ)
if sym.kind == .sum_type { if sym.kind == .sum_type {
@ -2610,26 +2612,23 @@ fn (mut g Gen) match_expr(node ast.MatchExpr) {
g.expr(expr) g.expr(expr)
} else if type_sym.kind == .string { } else if type_sym.kind == .string {
g.write('string_eq(') g.write('string_eq(')
// g.write(cond_var)
g.expr(node.cond)
g.write(', ') g.write(', ')
// g.write('string_eq($tmp, ')
g.expr(expr) g.expr(expr)
g.write(')') g.write(')')
} else if expr is ast.RangeExpr { } else if expr is ast.RangeExpr {
g.write('(') g.write('(')
g.expr(node.cond) g.write(cond_var)
g.write(' >= ') g.write(' >= ')
g.expr(expr.low) g.expr(expr.low)
g.write(' && ') g.write(' && ')
g.expr(node.cond) g.write(cond_var)
g.write(' <= ') g.write(' <= ')
g.expr(expr.high) g.expr(expr.high)
g.write(')') g.write(')')
} else { } else {
g.expr(node.cond) g.write(cond_var)
g.write(' == ') g.write(' == ')
// g.write('$tmp == ')
g.expr(expr) g.expr(expr)
} }
if i < branch.exprs.len - 1 { if i < branch.exprs.len - 1 {
@ -2652,7 +2651,7 @@ fn (mut g Gen) match_expr(node ast.MatchExpr) {
it_type := g.typ(first_expr.typ) it_type := g.typ(first_expr.typ)
// g.writeln('$it_type* it = ($it_type*)${tmp}.obj; // ST it') // g.writeln('$it_type* it = ($it_type*)${tmp}.obj; // ST it')
g.write('\t$it_type* it = ($it_type*)') g.write('\t$it_type* it = ($it_type*)')
g.expr(node.cond) g.write(cond_var)
dot_or_ptr := if node.cond_type.is_ptr() { '->' } else { '.' } dot_or_ptr := if node.cond_type.is_ptr() { '->' } else { '.' }
g.write(dot_or_ptr) g.write(dot_or_ptr)
g.writeln('_object; // ST it') g.writeln('_object; // ST it')

View File

@ -118,6 +118,28 @@ fn test_match_enums() {
assert b == .blue assert b == .blue
} }
struct Counter {
mut:
val int
}
fn (mut c Counter) next() int {
c.val++
return c.val
}
fn test_method_call() {
mut c := Counter{
val: 1
}
assert match c.next() {
1 { false }
2 { true }
3 { false }
else { false }
}
}
type Sum = A1 | B1 type Sum = A1 | B1
struct A1 { struct A1 {