`delete` statement leaves its result on the stack

Aperta Adatta ai principianti
#92 1 commento 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
2/5
Tempo stimato
1-3 ore
Idoneità per principianti
79/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
rust
Ambito
compilers

Direzione di ricerca

Inizia da Action::stack_delta in crates/rascal/src/internal/as2_pcode/pcode.rs alle righe collegate, poi segui come codegen usa i delta e truncate_stack per le istruzioni di espressione. Verifica il comportamento generato di delete usato come istruzione rispetto alla riproduzione nell’issue; il lavoro è completato quando il ciclo visita a e b una volta ciascuno.

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

Descrizione

The result of a delete used as a statement is never popped. Inside a for..in loop, the leftover values get enumerated, so the loop doesn't end.

var o = {a: 1, b: 2};
var n = 0;
for (var k in o) {
    delete o.nothing;
    trace(k);
    if (++n == 5) {
        trace("too many iterations");
        break;
    }
}

Expected: a and b, once each.

Actual, in Flash Player (Rascal 0.3.6, SWF 8):

a
false
false
false
false
too many iterations

Assigning the result (var d = delete o.nothing;) works around it.

The cause seems to be the stack deltas in Action::stack_delta:

https://github.com/Dinnerbone/Rascal/blob/3f1a80c85dcc657cf4a67b72754b9c7869a6d9c5/crates/rascal/src/internal/as2_pcode/pcode.rs#L268-L269

Both actions push a boolean result, so these should be -1 (pops an object and a name) and 0 (pops a name). The codegen then believes the stack is already balanced, and truncate_stack emits no Pop for the expression statement.

Lingua principale
Rust
Stelle
22
Fork
2
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 Dinnerbone/Rascal

Tutte le issue di Dinnerbone/Rascal

Issue simili

Altre issue su Rust

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.