Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

Difference in SIMD and non-SIMD process_token tokens

Aperta
#797 1 commento 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
3/5
Tempo stimato
Mezza giornata
Idoneità per principianti
66/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
rust
Ambito
performance

Direzione di ricerca

Start at the step function in html5ever/src/tokenizer/mod.rs, comparing the small_char_set! used by pop_except_from (via BufferQueue) with the trailing-byte loop in data_state_simd_fast_path, which skips stopping at \n. Decide which path matches the HTML tokenizer spec, then align the two so process_token receives identical tokens with SIMD forced off (patch is_x86_feature_detected! to false). Done when both paths produce the same token stream; verify with cargo test and the tokenizer test suite.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

Summary

SIMD and non-SIMD paths produce different process_token calls.
As the maintainers of html5ever do you think this inconsistency is a bug or normal behaviour?

How it was discovered

The lychee test fails on riscv machine:
https://github.com/lycheeverse/lychee/issues/2263

Inside lychee-lib/src/extract/html/html5ever.rs process_token recieves
different tokens (example in the issue is given). This incosistency breaks tests.

Reason behind it

The step function inside html5ever/src/tokenizer/mod.rs contains following lines:

// ...
let set = small_char_set!('\r' '\0' '&' '<' '\n' );

#[cfg(any(target_arch = "x86", target_arch = "x86_64", target_arch = "aarch64"))]
// ...
let result = unsafe { self.data_state_simd_fast_path(&mut front_buffer) };
// ...

#[cfg(not(any(
    target_arch = "x86",
    target_arch = "x86_64",
    target_arch = "aarch64"
)))]
let set_result = self.pop_except_from(input, set);
// ...
SIMD path

Note how data_state_simd_fast_path processes remaining bytes:

// ...

// Process any remaining bytes (less than STRIDE)
while let Some(c) = input.as_bytes().get(i) {
    if matches!(*c, b'<' | b'&' | b'\r' | b'\0') {
        break;
    }
    if *c == b'\n' {
        n_newlines += 1;
    }
    i += 1;
}

// ...
non-SIMD path

Note how pop_except_from processes bytes:

let d = input.pop_except_from(set);

input is BufferQueue and set is small_char_set!('\r' '\0' '&' '<' '\n' ). So countrary to the SIMD part this pop stops after \n.

How to reproduce

I was able to reproduce this issue on x86_64 machine by turning SIMD off.

  1. git clone https://github.com/lycheeverse/lychee && cd lychee
  2. cargo vendor # don't forget to change .cargo/config.toml
  3. patch html5ever
--- a/vendor/html5ever/src/tokenizer/mod.rs
+++ b/vendor/html5ever/src/tokenizer/mod.rs
@@ -1921,7 +1921,7 @@ impl<Sink: TokenSink> Tokenizer<Sink> {
     fn is_supported_simd_feature_detected() -> bool {
         #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
         {
-            is_x86_feature_detected!("sse2")
+            false
         }

         #[cfg(target_arch = "aarch64")]
  1. Fix checksums
sed -i -e 's/"files":{[^}]*}/"files":{}/' \
     ./vendor/html5ever/.cargo-checksum.json
  1. cargo test --frozen -p lychee-lib --lib html5ever::tests::test_include_verbatim
Lingua principale
Rust
Stelle
2.6k
Fork
295
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Preparare l'ambiente

Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di servo/html5ever

Tutte le issue di servo/html5ever

Issue simili

Altre issue su Rust

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.