c9394016bf
- the vendored version of cssparser fails to build with current rust - glibc-2.30 introduced gettid as a function [ci skip]
90 lines
3.8 KiB
Diff
90 lines
3.8 KiB
Diff
backport of:
|
|
|
|
From 3c98d22c5de3b696bf1fde2b6c90069812312aa6 Mon Sep 17 00:00:00 2001
|
|
From: Simon Sapin <simon.sapin@exyr.org>
|
|
Date: Tue, 23 Apr 2019 13:47:25 +0200
|
|
Subject: [PATCH] Fix a future-compat warning
|
|
|
|
```
|
|
warning[E0506]: cannot assign to `self.input.cached_token` because it is borrowed
|
|
--> src/parser.rs:591:17
|
|
|
|
|
566 | pub fn next_including_whitespace_and_comments(&mut self) -> Result<&Token<'i>, BasicParseError<'i>> {
|
|
| - let's call the lifetime of this reference `'1`
|
|
...
|
|
579 | Some(ref cached_token)
|
|
| ---------------- borrow of `self.input.cached_token` occurs here
|
|
...
|
|
591 | self.input.cached_token = Some(CachedToken {
|
|
| ^^^^^^^^^^^^^^^^^^^^^^^ assignment to borrowed `self.input.cached_token` occurs here
|
|
...
|
|
603 | Ok(token)
|
|
| --------- returning this value requires that `self.input.cached_token.0` is borrowed for `'1`
|
|
|
|
|
= warning: this error has been downgraded to a warning for backwards compatibility with previous releases
|
|
= warning: this represents potential undefined behavior in your code and this warning will become a hard error in the future
|
|
```
|
|
---
|
|
src/parser.rs | 50 +++++++++++++++++++++++++++-----------------------
|
|
1 file changed, 27 insertions(+), 23 deletions(-)
|
|
|
|
diff --git a/src/parser.rs b/src/parser.rs
|
|
index 51f441e4..7cef117c 100644
|
|
--- third_party/rust/cssparser/src/parser.rs
|
|
+++ third_party/rust/cssparser/src/parser.rs
|
|
@@ -555,28 +555,34 @@
|
|
}
|
|
|
|
let token_start_position = self.input.tokenizer.position();
|
|
- let token;
|
|
- match self.input.cached_token {
|
|
- Some(ref cached_token)
|
|
- if cached_token.start_position == token_start_position => {
|
|
- self.input.tokenizer.reset(&cached_token.end_state);
|
|
- match cached_token.token {
|
|
- Token::Function(ref name) => self.input.tokenizer.see_function(name),
|
|
- _ => {}
|
|
- }
|
|
- token = &cached_token.token
|
|
+ let using_cached_token = self
|
|
+ .input
|
|
+ .cached_token
|
|
+ .as_ref()
|
|
+ .map_or(false, |cached_token| {
|
|
+ cached_token.start_position == token_start_position
|
|
+ });
|
|
+ let token = if using_cached_token {
|
|
+ let cached_token = self.input.cached_token.as_ref().unwrap();
|
|
+ self.input.tokenizer.reset(&cached_token.end_state);
|
|
+ match cached_token.token {
|
|
+ Token::Function(ref name) => self.input.tokenizer.see_function(name),
|
|
+ _ => {}
|
|
}
|
|
- _ => {
|
|
- let new_token = self.input.tokenizer.next()
|
|
- .map_err(|()| self.new_basic_error(BasicParseErrorKind::EndOfInput))?;
|
|
- self.input.cached_token = Some(CachedToken {
|
|
- token: new_token,
|
|
- start_position: token_start_position,
|
|
- end_state: self.input.tokenizer.state(),
|
|
- });
|
|
- token = self.input.cached_token_ref()
|
|
- }
|
|
- }
|
|
+ &cached_token.token
|
|
+ } else {
|
|
+ let new_token = self
|
|
+ .input
|
|
+ .tokenizer
|
|
+ .next()
|
|
+ .map_err(|()| self.new_basic_error(BasicParseErrorKind::EndOfInput))?;
|
|
+ self.input.cached_token = Some(CachedToken {
|
|
+ token: new_token,
|
|
+ start_position: token_start_position,
|
|
+ end_state: self.input.tokenizer.state(),
|
|
+ });
|
|
+ self.input.cached_token_ref()
|
|
+ };
|
|
|
|
if let Some(block_type) = BlockType::opening(token) {
|
|
self.at_start_of = Some(block_type);
|