From: Jürg Billeter Date: Tue, 23 Mar 2010 06:33:56 +0000 (+0100) Subject: Fix assertion failure on large rollback in parser X-Git-Tag: 0.8.0~64 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=590012f000e4736daf4167be511129186e6f88cb;p=thirdparty%2Fvala.git Fix assertion failure on large rollback in parser Fixes bug 573080. --- diff --git a/vala/valaparser.vala b/vala/valaparser.vala index 4de43ec25..c9563c0ac 100644 --- a/vala/valaparser.vala +++ b/vala/valaparser.vala @@ -159,7 +159,15 @@ public class Vala.Parser : CodeVisitor { void rollback (SourceLocation location) { while (tokens[index].begin.pos != location.pos) { - prev (); + index = (index - 1 + BUFFER_SIZE) % BUFFER_SIZE; + size++; + if (size > BUFFER_SIZE) { + scanner.seek (location); + size = 0; + index = 0; + + next (); + } } } diff --git a/vala/valascanner.vala b/vala/valascanner.vala index 40e19751c..d686a49d5 100644 --- a/vala/valascanner.vala +++ b/vala/valascanner.vala @@ -1,6 +1,6 @@ /* valascanner.vala * - * Copyright (C) 2008-2009 Jürg Billeter + * Copyright (C) 2008-2010 Jürg Billeter * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -66,6 +66,15 @@ public class Vala.Scanner { column = 1; } + public void seek (SourceLocation location) { + current = location.pos; + line = location.line; + column = location.column; + + conditional_stack = null; + state_stack = null; + } + bool in_template () { return (state_stack.length > 0 && state_stack[state_stack.length - 1] == State.TEMPLATE); }