checker/cgen: support lock expressions `x := rlock s { s.get() }` (#8540)
parent
cee00a3551
commit
f013e65670
|
@ -4589,8 +4589,19 @@ pub fn (mut c Checker) lock_expr(mut node ast.LockExpr) table.Type {
|
|||
c.stmts(node.stmts)
|
||||
c.rlocked_names = []
|
||||
c.locked_names = []
|
||||
// void for now... maybe sometime `x := lock a { a.getval() }`
|
||||
return table.void_type
|
||||
// handle `x := rlock a { a.getval() }`
|
||||
mut ret_type := table.void_type
|
||||
if node.stmts.len > 0 {
|
||||
last_stmt := node.stmts[node.stmts.len - 1]
|
||||
if last_stmt is ast.ExprStmt {
|
||||
ret_type = last_stmt.typ
|
||||
}
|
||||
}
|
||||
if ret_type != table.void_type {
|
||||
node.is_expr = true
|
||||
}
|
||||
node.typ = ret_type
|
||||
return ret_type
|
||||
}
|
||||
|
||||
pub fn (mut c Checker) unsafe_expr(mut node ast.UnsafeExpr) table.Type {
|
||||
|
|
|
@ -876,7 +876,7 @@ fn (mut g Gen) stmts_with_tmp_var(stmts []ast.Stmt, tmp_var string) {
|
|||
// Handle if expressions, set the value of the last expression to the temp var.
|
||||
g.stmt_path_pos << g.out.len
|
||||
g.skip_stmt_pos = true
|
||||
g.writeln('$tmp_var = /* if expr set */')
|
||||
g.write('$tmp_var = ')
|
||||
}
|
||||
g.stmt(stmt)
|
||||
g.skip_stmt_pos = false
|
||||
|
@ -3407,6 +3407,13 @@ fn (mut g Gen) infix_expr(node ast.InfixExpr) {
|
|||
}
|
||||
|
||||
fn (mut g Gen) lock_expr(node ast.LockExpr) {
|
||||
tmp_result := if node.is_expr { g.new_tmp_var() } else { '' }
|
||||
mut cur_line := ''
|
||||
if node.is_expr {
|
||||
styp := g.typ(node.typ)
|
||||
cur_line = g.go_before_stmt(0)
|
||||
g.writeln('$styp $tmp_result;')
|
||||
}
|
||||
mut mtxs := ''
|
||||
if node.lockeds.len == 0 {
|
||||
// this should not happen
|
||||
|
@ -3449,7 +3456,7 @@ fn (mut g Gen) lock_expr(node ast.LockExpr) {
|
|||
g.writeln('}')
|
||||
}
|
||||
g.writeln('/*lock*/ {')
|
||||
g.stmts(node.stmts)
|
||||
g.stmts_with_tmp_var(node.stmts, tmp_result)
|
||||
g.writeln('}')
|
||||
if node.lockeds.len == 0 {
|
||||
// this should not happen
|
||||
|
@ -3469,6 +3476,11 @@ fn (mut g Gen) lock_expr(node ast.LockExpr) {
|
|||
g.writeln('\t\tsync__RwMutex_unlock((sync__RwMutex*)_arr_$mtxs[$mtxs]);')
|
||||
g.write('}')
|
||||
}
|
||||
if node.is_expr {
|
||||
g.writeln('')
|
||||
g.write(cur_line)
|
||||
g.write('$tmp_result')
|
||||
}
|
||||
}
|
||||
|
||||
fn (mut g Gen) match_expr(node ast.MatchExpr) {
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
struct St {
|
||||
mut:
|
||||
i int
|
||||
}
|
||||
|
||||
fn test_lock_expr() {
|
||||
shared xx := St{ i: 173 }
|
||||
shared y := St{ i: -57 }
|
||||
mut m := 0
|
||||
m = lock y { y.i }
|
||||
n := rlock xx { xx.i }
|
||||
assert m == -57
|
||||
assert n == 173
|
||||
}
|
Loading…
Reference in New Issue