compiler: Incorrect code gen for anon switch with default field
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
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
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di ProtoDef-io/node-protodef
-
`anon` compiler regressionAperta
Difficoltà 4/5 3-5 giorni Idoneità per principianti 35/100
ProtoDef-io/node-protodef#156 · 1 commento ·
-
Difficoltà 5/5 Più di una settimana Idoneità per principianti 25/100
ProtoDef-io/node-protodef#150 · 1 commento ·
-
String encoding not workingAperta
Difficoltà 3/5 1-2 giorni Idoneità per principianti 35/100
ProtoDef-io/node-protodef#139 · 1 commento ·
-
Add validate input optionApertaenhancement
Difficoltà 4/5 3-5 giorni Idoneità per principianti 35/100
ProtoDef-io/node-protodef#128 · 2 commenti ·
-
How it works?Aperta
Difficoltà 3/5 1-2 giorni Idoneità per principianti 20/100
ProtoDef-io/node-protodef#116 ·
Tutte le issue di ProtoDef-io/node-protodef
Issue simili
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 85/100
-
[quality] Nothing keeps docs/skills/manifest.md in sync with docs/skills/*.mdForse già presa @hivecommons-hive l’ha presa oggi. Apertaagent/quality hive/covered-by-pr hive/hosted-available-lke648397-260827-5n31 quality testing
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 77/100
apache/rocketmq-dashboard#6610 ·
I maintainer di solito rispondono entro 3 giorni
-
documentation
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 95/100
githubnext/gh-aw-workshop#4535 ·
I maintainer di solito rispondono entro 1 giorno
-
Global update drops overrideAccess, so Local API updateGlobal fails filterOptions validation (3.90 regression)Forse già presa @PINYOPATTANAWASANPORN l’ha presa oggi. Apertaarea: core Bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
payloadcms/payload#18674 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno