diff --git a/native/v8_extensions/onig_scanner.mm b/native/v8_extensions/onig_scanner.mm index 2dc89d069..7ce69c44b 100644 --- a/native/v8_extensions/onig_scanner.mm +++ b/native/v8_extensions/onig_scanner.mm @@ -56,8 +56,11 @@ class OnigScannerUserData : public CefBase { bool useCachedResult = false; OnigResult *result = NULL; - - if (useCachedResults && index <= maxCachedIndex) { + + // In Oniguruma, \G is based on the start position of the match, so the result + // changes based on the start position. So it can't be cached. + BOOL containsBackslashG = [regExp.expression rangeOfString:@"\\G"].location != NSNotFound; + if (useCachedResults && index <= maxCachedIndex && ! containsBackslashG) { result = cachedResults[index]; useCachedResult = (result == NULL || [result locationAt:0] >= startLocation); } diff --git a/spec/app/text-mate-grammar-spec.coffee b/spec/app/text-mate-grammar-spec.coffee index 2ef054b0d..0281a152a 100644 --- a/spec/app/text-mate-grammar-spec.coffee +++ b/spec/app/text-mate-grammar-spec.coffee @@ -239,3 +239,8 @@ describe "TextMateGrammar", -> expect(tokens.length).toBe 2 expect(tokens[0].value).toBe "//" expect(tokens[1].value).toBe " a singleLineComment" + + it "does not loop infinitley (regression)", -> + grammar = TextMateBundle.grammarForFileName("hello.js") + {tokens, stack} = grammar.getLineTokens("// line comment") + {tokens, stack} = grammar.getLineTokens(" // second line comment with a single leading space", stack)