vm: eval cache mixes up script origins
Chưa có ai nhận issue này.
- Ngôn ngữ chính
- JavaScript
- Star
- 122k
- Fork
- 37.4k
- Merge trung bình
- 4 ngày 3 giờ
- Pull request đã merge (30 ngày)
- 272
Mô tả
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.
Hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Hướng nghiên cứu
Tái hiện vấn đề bằng test.mjs được cung cấp với --experimental-vm-modules, sau đó kiểm tra deps/v8/src/codegen/compiler.cc xung quanh chú thích "cache lookup key". Theo dõi quá trình tra cứu eval cache và các bài kiểm thử liên quan để hiểu cách các nguồn gốc của script được biểu diễn. Công việc được xem là hoàn tất khi assertion A/B/A vượt qua với compilation caching được bật, trong khi hành vi hiện có khi không có compilation cache vẫn đúng.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- cpp, javascript, node.js
- Lĩnh vực
- backend
- Loại issue
- Lỗi
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức độ hoạt động
- Sôi nổi
- Độ rõ ràng
- Khá rõ ràng
- Mức phù hợp với người mới
- 45/100