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

compiler: Incorrect code gen for anon switch with default field

Aperta
#132 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
4/5
Tempo stimato
3-5 giorni
Idoneità per principianti
35/100
Tipo di issue
Bug
Chiarezza
Abbastanza chiara
Stato di attività
Ferma
Stack tecnologico
javascript
Ambito
compilers

Direzione di ricerca

Start with the anonymous switch and default condition in data/bedrock/1.18.0/protocol.json at lines 6571-6617, then reproduce the generated packet_command_block_update code shown in the issue. Trace the compiler path that expands anonymous switch fields; done means the default branch is emitted once rather than rereading minecart_entity_runtime_id for each following field, while the non-default examples remain correct.

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

Descrizione

https://github.com/PrismarineJS/minecraft-data/blob/c6a1e9af1a144d78d7d020ee55029aa1d3922a34/data/bedrock/1.18.0/protocol.json#L6571-L6617

above uses an anonymous switch field with a default condition, but the compiler generates code that repeatedly reads the default condition (minecart_entity_runtime_id):

packet_command_block_update: (buffer, offset) => {
  let { value: is_block, size: is_blockSize } = (ctx.bool)(buffer, offset)
  let { value: position, size: positionSize } = ((buffer, offset) => {
    switch (is_block) {
      case true: return (ctx.BlockCoordinates)(buffer, offset)
      default: return ((buffer, offset) => {
        let { value: minecart_entity_runtime_id, size: minecart_entity_runtime_idSize } = (ctx.varint64)(buffer, offset) // <==
        return { value: { minecart_entity_runtime_id }, size: minecart_entity_runtime_idSize}
      })(buffer, offset)
    }
  })(buffer, offset + is_blockSize)
  let { value: mode, size: modeSize } = ((buffer, offset) => {
    switch (is_block) {
      case true: return ((buffer, offset) => {
        const { value, size } = (ctx.varint)(buffer, offset)
        return { value: {"0":"impulse","1":"repeat","2":"chain"}[value] || value, size }
      })(buffer, offset)
      default: return ((buffer, offset) => {
        let { value: minecart_entity_runtime_id, size: minecart_entity_runtime_idSize } = (ctx.varint64)(buffer, offset)
        return { value: { minecart_entity_runtime_id }, size: minecart_entity_runtime_idSize}
      })(buffer, offset)
    }
  })(buffer, offset + is_blockSize + positionSize)
  let { value: needs_redstone, size: needs_redstoneSize } = ((buffer, offset) => {
    switch (is_block) {
      case true: return (ctx.bool)(buffer, offset)
      default: return ((buffer, offset) => {
        let { value: minecart_entity_runtime_id, size: minecart_entity_runtime_idSize } = (ctx.varint64)(buffer, offset)
        return { value: { minecart_entity_runtime_id }, size: minecart_entity_runtime_idSize}
      })(buffer, offset)
    }
  })(buffer, offset + is_blockSize + positionSize + modeSize)
  let { value: conditional, size: conditionalSize } = ((buffer, offset) => {
    switch (is_block) {
      case true: return (ctx.bool)(buffer, offset)
      default: return ((buffer, offset) => {
        let { value: minecart_entity_runtime_id, size: minecart_entity_runtime_idSize } = (ctx.varint64)(buffer, offset)
        return { value: { minecart_entity_runtime_id }, size: minecart_entity_runtime_idSize}
      })(buffer, offset)
    }
  })(buffer, offset + is_blockSize + positionSize + modeSize + needs_redstoneSize)
  let { value: minecart_entity_runtime_id, size: minecart_entity_runtime_idSize } = ((buffer, offset) => {
    switch (is_block) {
      default: return (ctx.varint64)(buffer, offset)
    }
  })(buffer, offset + is_blockSize + positionSize + modeSize + needs_redstoneSize + conditionalSize)

not using an anon field or not using default generates correct code, e.g.

  let { value: data, size: dataSize } = ((buffer, offset) => {
        switch (is_block) {
          case true: return ((buffer, offset) => {
            let { value: position1, size: position1Size } = (ctx.BlockCoordinates)(buffer, offset)
            let { value: mode1, size: mode1Size } = ((buffer, offset) => {
              const { value, size } = (ctx.varint)(buffer, offset)
              return { value: {"0":"impulse","1":"repeat","2":"chain"}[value] || value, size }
            })(buffer, offset + position1Size)
            let { value: needs_redstone, size: needs_redstoneSize } = (ctx.bool)(buffer, offset + position1Size + mode1Size)
            let { value: conditional, size: conditionalSize } = (ctx.bool)(buffer, offset + position1Size + mode1Size + needs_redstoneSize)
            return { value: { position: position1, mode: mode1, needs_redstone, conditional }, size: position1Size + mode1Size + needs_redstoneSize + conditionalSize}
          })(buffer, offset)
          default: return ((buffer, offset) => {
            let { value: minecart_entity_runtime_id, size: minecart_entity_runtime_idSize } = (ctx.varint64)(buffer, offset)
            return { value: { minecart_entity_runtime_id }, size: minecart_entity_runtime_idSize}
          })(buffer, offset)
        }
      })(buffer, offset + is_blockSize)
Lingua principale
JavaScript
Stelle
35
Fork
27
Merge medio
4g 10h
PR unite (30g)
3

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 ProtoDef-io/node-protodef

Tutte le issue di ProtoDef-io/node-protodef

Issue simili

Altre issue su JavaScript

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.