all: allow functions to return `shared` object (#8606)
parent
fe9d062b41
commit
5343f1374b
|
@ -2548,7 +2548,7 @@ fn (mut g Gen) expr(node ast.Expr) {
|
|||
node.return_type.clear_flag(.optional)
|
||||
}
|
||||
mut shared_styp := ''
|
||||
if g.is_shared {
|
||||
if g.is_shared && !ret_type.has_flag(.shared_f) {
|
||||
ret_sym := g.table.get_type_symbol(ret_type)
|
||||
shared_typ := ret_type.set_flag(.shared_f)
|
||||
shared_styp = g.typ(shared_typ)
|
||||
|
@ -2576,7 +2576,7 @@ fn (mut g Gen) expr(node ast.Expr) {
|
|||
g.strs_to_free0 = []
|
||||
// println('pos=$node.pos.pos')
|
||||
}
|
||||
if g.is_shared {
|
||||
if g.is_shared && !ret_type.has_flag(.shared_f) {
|
||||
g.writeln('}, sizeof($shared_styp))')
|
||||
}
|
||||
// if g.autofree && node.autofree_pregen != '' { // g.strs_to_free0.len != 0 {
|
||||
|
|
|
@ -207,6 +207,9 @@ fn (mut p Parser) fn_decl() ast.FnDecl {
|
|||
p.warn_with_pos('use `(mut f Foo)` instead of `(f mut Foo)`', lpar_pos.extend(p.peek_tok2.position()))
|
||||
}
|
||||
}
|
||||
if p.tok.kind == .key_shared {
|
||||
p.error_with_pos('use `(shared f Foo)` instead of `(f shared Foo)`', lpar_pos.extend(p.peek_tok2.position()))
|
||||
}
|
||||
receiver_pos = rec_start_pos.extend(p.tok.position())
|
||||
is_amp := p.tok.kind == .amp
|
||||
if p.tok.kind == .name && p.tok.lit == 'JS' {
|
||||
|
@ -685,6 +688,9 @@ fn (mut p Parser) fn_args() ([]table.Param, bool, bool) {
|
|||
}
|
||||
is_mut = true
|
||||
}
|
||||
if p.tok.kind == .key_shared {
|
||||
p.error_with_pos('use `shared f Foo` instead of `f shared Foo`', p.tok.position())
|
||||
}
|
||||
if p.tok.kind == .ellipsis {
|
||||
p.next()
|
||||
is_variadic = true
|
||||
|
|
|
@ -0,0 +1,54 @@
|
|||
struct St {
|
||||
mut:
|
||||
x f64
|
||||
}
|
||||
|
||||
fn f() shared St {
|
||||
shared x := St{ x: 3.25 }
|
||||
return x
|
||||
}
|
||||
|
||||
fn g(good bool) ?shared St {
|
||||
if !good {
|
||||
return error('no shared St created')
|
||||
}
|
||||
shared x := St{ x: 12.75 }
|
||||
return x
|
||||
}
|
||||
|
||||
fn test_shared_fn_return() {
|
||||
shared x := f()
|
||||
val := rlock x { x.x }
|
||||
assert val == 3.25
|
||||
}
|
||||
|
||||
fn shared_opt_propagate(good bool) ?f64 {
|
||||
shared x := g(good) ?
|
||||
ret := rlock x { x.x }
|
||||
return ret
|
||||
}
|
||||
|
||||
fn test_shared_opt_propagate() {
|
||||
x := shared_opt_propagate(true) or { 1.25 }
|
||||
y := shared_opt_propagate(false) or { 2.125 }
|
||||
assert x == 12.75
|
||||
assert y == 2.125
|
||||
}
|
||||
|
||||
fn test_shared_opt_good() {
|
||||
shared yy := g(true) or {
|
||||
shared my_default := St{ x: 37.5 }
|
||||
my_default
|
||||
}
|
||||
val := rlock yy { yy.x }
|
||||
assert val == 12.75
|
||||
}
|
||||
|
||||
fn test_shared_opt_bad() {
|
||||
shared yy := g(false) or {
|
||||
shared my_default := St{ x: 37.5 }
|
||||
my_default
|
||||
}
|
||||
val := rlock yy { yy.x }
|
||||
assert val == 37.5
|
||||
}
|
|
@ -427,7 +427,7 @@ pub fn (tok Kind) is_relational() bool {
|
|||
}
|
||||
|
||||
pub fn (k Kind) is_start_of_type() bool {
|
||||
return k in [.name, .lpar, .amp, .lsbr, .question]
|
||||
return k in [.name, .lpar, .amp, .lsbr, .question, .key_shared]
|
||||
}
|
||||
|
||||
pub fn (kind Kind) is_prefix() bool {
|
||||
|
|
Loading…
Reference in New Issue