From 43282335044e7fc1c12185d8f5fd5739a73e2eb4 Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Fri, 20 Nov 2020 02:51:28 +0100 Subject: [PATCH] Revert "gen: implement labelled break and continue (#6880)" This reverts commit e798326a1a410e79219056c3e42b7c6371974de8. --- vlib/v/ast/ast.v | 10 +--- vlib/v/checker/checker.v | 5 +- vlib/v/gen/cgen.v | 60 +++++------------------- vlib/v/parser/parser.v | 26 ---------- vlib/v/tests/named_break_continue_test.v | 31 ------------ 5 files changed, 16 insertions(+), 116 deletions(-) delete mode 100644 vlib/v/tests/named_break_continue_test.v diff --git a/vlib/v/ast/ast.v b/vlib/v/ast/ast.v index 4374d044db..15c4f6deae 100644 --- a/vlib/v/ast/ast.v +++ b/vlib/v/ast/ast.v @@ -284,9 +284,8 @@ pub mut: // break, continue pub struct BranchStmt { pub: - kind token.Kind - label string - pos token.Position + kind token.Kind + pos token.Position } pub struct CallExpr { @@ -627,8 +626,6 @@ pub: stmts []Stmt is_inf bool // `for {}` pos token.Position -pub mut: - label string // `label: for {` } pub struct ForInStmt { @@ -647,7 +644,6 @@ pub mut: val_type table.Type cond_type table.Type kind table.Kind // array/map/string - label string // `label: for {` } pub struct ForCStmt { @@ -660,8 +656,6 @@ pub: has_inc bool stmts []Stmt pos token.Position -pub mut: - label string // `label: for {` } // #include etc diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 1df3a0b4a5..d7addc0369 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -2410,7 +2410,6 @@ fn (mut c Checker) stmt(node ast.Stmt) { if c.in_for_count == 0 { c.error('$node.kind.str() statement not within a loop', node.pos) } - // TODO: check any node.label is in scope for goto } ast.CompFor { // node.typ = c.expr(node.expr) @@ -2578,9 +2577,7 @@ fn (mut c Checker) stmt(node ast.Stmt) { } } ast.GotoLabel {} - ast.GotoStmt { - // TODO: check label doesn't bypass variable declarations - } + ast.GotoStmt {} ast.HashStmt { c.hash_stmt(mut node) } diff --git a/vlib/v/gen/cgen.v b/vlib/v/gen/cgen.v index 6aabe14843..f00a70aa23 100644 --- a/vlib/v/gen/cgen.v +++ b/vlib/v/gen/cgen.v @@ -821,17 +821,9 @@ fn (mut g Gen) stmt(node ast.Stmt) { } ast.BranchStmt { g.write_v_source_line_info(node.pos) - if node.label.len > 0 { - if node.kind == .key_break { - g.writeln('goto $node.label\__break;') - } else { - assert node.kind == .key_continue - g.writeln('goto $node.label\__continue;') - } - } else { - // continue or break - g.writeln('$node.kind;') - } + // continue or break + g.write(node.kind.str()) + g.writeln(';') } ast.ConstDecl { g.write_v_source_line_info(node.pos) @@ -938,9 +930,6 @@ fn (mut g Gen) stmt(node ast.Stmt) { ast.ForCStmt { g.write_v_source_line_info(node.pos) g.is_vlines_enabled = false - if node.label.len > 0 { - g.writeln('$node.label:') - } g.write('for (') if !node.has_init { g.write('; ') @@ -963,13 +952,7 @@ fn (mut g Gen) stmt(node ast.Stmt) { g.writeln(') {') g.is_vlines_enabled = true g.stmts(node.stmts) - if node.label.len > 0 { - g.writeln('$node.label\__continue: {}') - } g.writeln('}') - if node.label.len > 0 { - g.writeln('$node.label\__break: {}') - } } ast.ForInStmt { g.write_v_source_line_info(node.pos) @@ -978,9 +961,6 @@ fn (mut g Gen) stmt(node ast.Stmt) { ast.ForStmt { g.write_v_source_line_info(node.pos) g.is_vlines_enabled = false - if node.label.len > 0 { - g.writeln('$node.label:') - } g.writeln('for (;;) {') if !node.is_inf { g.indent++ @@ -992,13 +972,7 @@ fn (mut g Gen) stmt(node ast.Stmt) { } g.is_vlines_enabled = true g.stmts(node.stmts) - if node.label.len > 0 { - g.writeln('\t$node.label\__continue: {}') - } g.writeln('}') - if node.label.len > 0 { - g.writeln('$node.label\__break: {}') - } } ast.GlobalDecl { g.global_decl(node) @@ -1123,9 +1097,6 @@ fn (mut g Gen) write_defer_stmts() { } fn (mut g Gen) for_in(it ast.ForInStmt) { - if it.label.len > 0 { - g.writeln('\t$it.label: {}') - } if it.is_range { // `for x in 1..10 {` i := if it.val_var == '_' { g.new_tmp_var() } else { c_name(it.val_var) } @@ -1134,6 +1105,8 @@ fn (mut g Gen) for_in(it ast.ForInStmt) { g.write('; $i < ') g.expr(it.high) g.writeln('; ++$i) {') + g.stmts(it.stmts) + g.writeln('}') } else if it.kind == .array { // `for num in nums {` g.writeln('// FOR IN array') @@ -1163,6 +1136,8 @@ fn (mut g Gen) for_in(it ast.ForInStmt) { g.writeln('\t$styp ${c_name(it.val_var)} = $right;') } } + g.stmts(it.stmts) + g.writeln('}') } else if it.kind == .array_fixed { atmp := g.new_tmp_var() atmp_type := g.typ(it.cond_type) @@ -1188,6 +1163,8 @@ fn (mut g Gen) for_in(it ast.ForInStmt) { } g.writeln(' = (*$atmp)[$i];') } + g.stmts(it.stmts) + g.writeln('}') } else if it.kind == .map { // `for key, val in map {` g.writeln('// FOR IN map') @@ -1224,17 +1201,10 @@ fn (mut g Gen) for_in(it ast.ForInStmt) { if it.key_type == table.string_type && !g.is_builtin_mod { // g.writeln('string_free(&$key);') } - if it.label.len > 0 { - g.writeln('\t$it.label\__continue: {}') - } g.writeln('}') - if it.label.len > 0 { - g.writeln('\t$it.label\__break: {}') - } g.writeln('/*for in map cleanup*/') g.writeln('for (int $idx = 0; $idx < ${keys_tmp}.len; ++$idx) { string_free(&(($key_styp*)${keys_tmp}.data)[$idx]); }') g.writeln('array_free(&$keys_tmp);') - return } else if it.cond_type.has_flag(.variadic) { g.writeln('// FOR IN cond_type/variadic') i := if it.key_var in ['', '_'] { g.new_tmp_var() } else { it.key_var } @@ -1245,6 +1215,8 @@ fn (mut g Gen) for_in(it ast.ForInStmt) { g.write('\t$styp ${c_name(it.val_var)} = ') g.expr(it.cond) g.writeln('.args[$i];') + g.stmts(it.stmts) + g.writeln('}') } else if it.kind == .string { i := if it.key_var in ['', '_'] { g.new_tmp_var() } else { it.key_var } g.write('for (int $i = 0; $i < ') @@ -1255,18 +1227,12 @@ fn (mut g Gen) for_in(it ast.ForInStmt) { g.expr(it.cond) g.writeln('.str[$i];') } + g.stmts(it.stmts) + g.writeln('}') } else { s := g.table.type_to_str(it.cond_type) g.error('for in: unhandled symbol `$it.cond` of type `$s`', it.pos) } - g.stmts(it.stmts) - if it.label.len > 0 { - g.writeln('\t$it.label\__continue: {}') - } - g.writeln('}') - if it.label.len > 0 { - g.writeln('\t$it.label\__break: {}') - } } // use instead of expr() when you need to cast to union sum type (can add other casts also) diff --git a/vlib/v/parser/parser.v b/vlib/v/parser/parser.v index f009833341..5a9105182c 100644 --- a/vlib/v/parser/parser.v +++ b/vlib/v/parser/parser.v @@ -594,26 +594,6 @@ pub fn (mut p Parser) stmt(is_top_level bool) ast.Stmt { spos := p.tok.position() name := p.check_name() p.next() - if p.tok.kind == .key_for { - mut stmt := p.stmt(is_top_level) - match mut stmt { - ast.ForStmt { - stmt.label = name - return *stmt - } - ast.ForInStmt { - stmt.label = name - return *stmt - } - ast.ForCStmt { - stmt.label = name - return *stmt - } - else { - assert false - } - } - } return ast.GotoLabel{ name: name pos: spos.extend(p.tok.position()) @@ -650,15 +630,9 @@ pub fn (mut p Parser) stmt(is_top_level bool) ast.Stmt { } .key_continue, .key_break { tok := p.tok - line := p.tok.line_nr p.next() - mut label := '' - if p.tok.line_nr == line && p.tok.kind == .name { - label = p.check_name() - } return ast.BranchStmt{ kind: tok.kind - label: label pos: tok.position() } } diff --git a/vlib/v/tests/named_break_continue_test.v b/vlib/v/tests/named_break_continue_test.v deleted file mode 100644 index c537528fe1..0000000000 --- a/vlib/v/tests/named_break_continue_test.v +++ /dev/null @@ -1,31 +0,0 @@ -fn test_labelled_for() { - mut i := 4 - goto L1 - L1: for { - i++ - for { - if i < 7 {continue L1} - else {break L1} - } - } - assert i == 7 - - goto L2 - L2: for ;; i++ { - for { - if i < 17 {continue L2} - else {break L2} - } - } - assert i == 17 - - goto L3 - L3: for e in [1,2,3,4] { - i = e - for { - if i < 3 {continue L3} - else {break L3} - } - } - assert i == 3 -}