vm: eval cache mixes up script origins
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 4/5
- Tempo estimado
- 3-5 dias
- Facilidade para iniciantes
- 45/100
- Tipo de issue
- Bug
- Clareza
- Razoavelmente clara
- Status de atividade
- Ativa
- Stack de tecnologia
- cpp, javascript, node.js
- Domínio
- backend
Direção de pesquisa
Reproduza o problema com o test.mjs fornecido usando --experimental-vm-modules e, em seguida, inspecione deps/v8/src/codegen/compiler.cc ao redor do comentário "cache lookup key". Acompanhe a busca no cache de eval e os testes relacionados para entender como as origens dos scripts são representadas. A tarefa estará concluída quando a asserção A/B/A passar com o cache de compilação habilitado, enquanto o comportamento existente sem cache de compilação continuar correto.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
Bug report
- Node.js: v24.19.0, v26.8.1, v27.0.0-pre (local build)
- Platform: Microsoft Windows NT 10.0.26200.0 x64
- Subsystem: vm
// test.mjs
import assert from 'node:assert/strict';
import { Script } from 'node:vm';
const out = [];
function createScript(name) {
return new Script(`globalThis.eval('import("node:fs")')`, {
importModuleDynamically(specifier) {
out.push(name);
return import(specifier);
},
});
}
const a = createScript('A');
const b = createScript('B');
for (const script of [a, b, a]) {
await script.runInThisContext();
}
assert.deepEqual(out, ['A', 'B', 'A']);
Running this example as node --experimental-vm-modules test.mjs will give different wrong answers between v24 and v26 because V8 removed delayed caching some time during those releases. However, running with --no-compilation-cache will pass the test assertion.
The bug is with V8. In deps/v8/src/codegen/compiler.cc, around the "cache lookup key" comment, indirect eval uses kNoSourcePosition (-1), and the cache key does not distinguish the originating script. This allows identical eval source text from different scripts in the same realm to produce a false positive cache hit.
- Linguagem predominante
- JavaScript
- Estrelas
- 122k
- Forks
- 37.4k
- Merge médio
- 4d 2h
- PRs com merge (30d)
- 277
Guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de nodejs/node
-
doc
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 65/100
-
build
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 88/100
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 84/100
-
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 90/100
-
feature request
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 68/100
Todas as issues de nodejs/node
Issues semelhantes
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 70/100
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 75/100
mksglu/context-mode#1200 ·
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 75/100
neondatabase/website#5944 ·
-
module: core
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 75/100
bigbluebutton/bigbluebutton#25849 ·
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 75/100
jaegertracing/jaeger-ui#4506 ·