From 8f5b838a071d010959a3f38a2c73cf49f31a16cf Mon Sep 17 00:00:00 2001 From: Feoramund <161657516+Feoramund@users.noreply.github.com> Date: Mon, 5 Aug 2024 03:49:29 -0400 Subject: [PATCH] Review manual `for` loops in `core:text/regex` --- core/text/regex/optimizer/optimizer.odin | 8 ++++---- core/text/regex/parser/parser.odin | 4 +++- core/text/regex/regex.odin | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/core/text/regex/optimizer/optimizer.odin b/core/text/regex/optimizer/optimizer.odin index 835e5022c..e23cc1bc5 100644 --- a/core/text/regex/optimizer/optimizer.odin +++ b/core/text/regex/optimizer/optimizer.odin @@ -86,7 +86,7 @@ optimize_subtree :: proc(tree: Node, flags: common.Flags) -> (result: Node, chan } // Only recursive optimizations: - for i := 0; i < len(specific.nodes); i += 1 { + #no_bounds_check for i := 0; i < len(specific.nodes); i += 1 { subnode, subnode_changes := optimize_subtree(specific.nodes[i], flags) changes += subnode_changes if subnode == nil { @@ -194,7 +194,7 @@ optimize_subtree :: proc(tree: Node, flags: common.Flags) -> (result: Node, chan new_range.lower = specific.runes[0] new_range.upper = specific.runes[0] - for i := 1; i < len(specific.runes); i += 1 { + #no_bounds_check for i := 1; i < len(specific.runes); i += 1 { r := specific.runes[i] if new_range.lower == -1 { new_range = { r, r } @@ -228,7 +228,7 @@ optimize_subtree :: proc(tree: Node, flags: common.Flags) -> (result: Node, chan // // DO: `[aa-c]` => `[a-c]` for range in specific.ranges { - for i := 0; i < len(specific.runes); i += 1 { + #no_bounds_check for i := 0; i < len(specific.runes); i += 1 { r := specific.runes[i] if range.lower <= r && r <= range.upper { ordered_remove(&specific.runes, i) @@ -244,7 +244,7 @@ optimize_subtree :: proc(tree: Node, flags: common.Flags) -> (result: Node, chan // DO: `[a-cd-e]` => `[a-e]` // DO: `[a-cb-e]` => `[a-e]` slice.sort_by(specific.ranges[:], class_range_sorter) - for i := 0; i < len(specific.ranges) - 1; i += 1 { + #no_bounds_check for i := 0; i < len(specific.ranges) - 1; i += 1 { for j := i + 1; j < len(specific.ranges); j += 1 { left_range := &specific.ranges[i] right_range := specific.ranges[j] diff --git a/core/text/regex/parser/parser.odin b/core/text/regex/parser/parser.odin index 720992cb9..038d4cb85 100644 --- a/core/text/regex/parser/parser.odin +++ b/core/text/regex/parser/parser.odin @@ -225,7 +225,7 @@ null_denotation :: proc(p: ^Parser, token: Token) -> (result: Node, err: Error) node := new(Node_Rune_Class) - for i := 0; i < len(token.text); /**/ { + #no_bounds_check for i := 0; i < len(token.text); /**/ { r, size := utf8.decode_rune(token.text[i:]) if i == 0 && r == '^' { node.negating = true @@ -298,6 +298,8 @@ null_denotation :: proc(p: ^Parser, token: Token) -> (result: Node, err: Error) } if .Case_Insensitive in p.flags { + // These two loops cannot be in the form of `for x in y` because + // they append to the data that they iterate over. length := len(node.runes) #no_bounds_check for i := 0; i < length; i += 1 { r := node.runes[i] diff --git a/core/text/regex/regex.odin b/core/text/regex/regex.odin index 9ff924192..3dc26b5c6 100644 --- a/core/text/regex/regex.odin +++ b/core/text/regex/regex.odin @@ -291,7 +291,7 @@ match_and_allocate_capture :: proc( context.allocator = permanent_allocator num_groups := 0 - for i := 0; i < len(saved); i += 2 { + #no_bounds_check for i := 0; i < len(saved); i += 2 { a, b := saved[i], saved[i + 1] if a == -1 || b == -1 { continue