From 2ed0f880eee6f28958907b5da26590c106bb5fbb Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Thu, 30 Sep 2021 17:17:21 +0100 Subject: [PATCH] LibWeb: Add TokenStream::rewind_to_position() Parsing media queries sometimes requires significant back-tracking, so `reconsume_current_input_token()` was not good enough. `rewind_to_position()` lets you reconsume an erbitrary number of tokens to return to an earlier point in the stream, which you previously saved from `TokenStream::position()`. --- Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp | 7 +++++++ Userland/Libraries/LibWeb/CSS/Parser/Parser.h | 3 +++ 2 files changed, 10 insertions(+) diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp index 39be9f7d04..5599f2d5bd 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp @@ -106,6 +106,13 @@ void TokenStream::reconsume_current_input_token() --m_iterator_offset; } +template +void TokenStream::rewind_to_position(int position) +{ + VERIFY(position <= m_iterator_offset); + m_iterator_offset = position; +} + template void TokenStream::skip_whitespace() { diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.h b/Userland/Libraries/LibWeb/CSS/Parser/Parser.h index fabe517920..0eace6cfc2 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.h +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.h @@ -61,6 +61,9 @@ public: T const& current_token(); void reconsume_current_input_token(); + int position() const { return m_iterator_offset; } + void rewind_to_position(int); + void skip_whitespace(); void dump_all_tokens();