From e862fad917d740657dd1744ebddce142b5566462 Mon Sep 17 00:00:00 2001 From: Delyan Angelov Date: Fri, 9 Oct 2020 22:20:58 +0300 Subject: [PATCH] parser: support `mut static x := y` in -translated mode --- .../checker/tests/static_vars_in_translated_mode.out | 6 ++++++ .../checker/tests/static_vars_in_translated_mode.vv | 12 ++++++++++++ vlib/v/fmt/fmt.v | 3 +++ vlib/v/parser/assign.v | 11 ++++++++++- 4 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 vlib/v/checker/tests/static_vars_in_translated_mode.out create mode 100644 vlib/v/checker/tests/static_vars_in_translated_mode.vv diff --git a/vlib/v/checker/tests/static_vars_in_translated_mode.out b/vlib/v/checker/tests/static_vars_in_translated_mode.out new file mode 100644 index 0000000000..f2974febd8 --- /dev/null +++ b/vlib/v/checker/tests/static_vars_in_translated_mode.out @@ -0,0 +1,6 @@ +vlib/v/checker/tests/static_vars_in_translated_mode.vv:2:13: error: static variables are supported only in -translated mode + 1 | fn counter() int { + 2 | mut static icounter := 0 + | ~~~~~~~~ + 3 | icounter++ + 4 | return icounter diff --git a/vlib/v/checker/tests/static_vars_in_translated_mode.vv b/vlib/v/checker/tests/static_vars_in_translated_mode.vv new file mode 100644 index 0000000000..60e67e1610 --- /dev/null +++ b/vlib/v/checker/tests/static_vars_in_translated_mode.vv @@ -0,0 +1,12 @@ +fn counter() int { + mut static icounter := 0 + icounter++ + return icounter +} + +fn main() { + println(counter()) + println(counter()) + println(counter()) + println(counter()) +} diff --git a/vlib/v/fmt/fmt.v b/vlib/v/fmt/fmt.v index b1b97c5047..48dcb35d5b 100644 --- a/vlib/v/fmt/fmt.v +++ b/vlib/v/fmt/fmt.v @@ -263,6 +263,9 @@ pub fn (mut f Fmt) stmt(node ast.Stmt) { if var_info.is_mut { f.write(var_info.share.str() + ' ') } + if var_info.is_static { + f.write('static ') + } f.expr(left) } else { f.expr(left) diff --git a/vlib/v/parser/assign.v b/vlib/v/parser/assign.v index 74738f519b..362b84dafe 100644 --- a/vlib/v/parser/assign.v +++ b/vlib/v/parser/assign.v @@ -105,6 +105,7 @@ fn (mut p Parser) partial_assign_stmt(left []ast.Expr, left_comments []ast.Comme } } } + mut is_static := false for i, lx in left { match mut lx { ast.Ident { @@ -114,7 +115,14 @@ fn (mut p Parser) partial_assign_stmt(left []ast.Expr, left_comments []ast.Comme } mut share := table.ShareType(0) if lx.info is ast.IdentVar { - share = (lx.info as ast.IdentVar).share + iv := lx.info as ast.IdentVar + share = iv.share + if iv.is_static { + if !p.pref.translated { + p.error_with_pos('static variables are supported only in -translated mode', lx.pos) + } + is_static = true + } } mut v := ast.Var{ name: lx.name @@ -157,5 +165,6 @@ fn (mut p Parser) partial_assign_stmt(left []ast.Expr, left_comments []ast.Comme pos: pos has_cross_var: has_cross_var is_simple: p.inside_for && p.tok.kind == .lcbr + is_static: is_static } }