vm: TypeError thrown instead of ReferenceError when a Proxy is the vm context
Chưa có ai nhận issue này.
- Ngôn ngữ chính
- JavaScript
- Star
- 122k
- Fork
- 37.3k
- Merge trung bình
- 4 ngày 2 giờ
- Pull request đã merge (30 ngày)
- 283
Mô tả
Version
v22.7.0
Platform
Microsoft Windows NT 10.0.22631.0 x64
Subsystem
vm
What steps will reproduce the bug?
"use strict";
const vm = require("vm");
const context = vm.createContext({
__proto__: new Proxy({}, {
get(target, property, receiver) {
return Reflect.get(target, property, receiver);
}
})
});
vm.runInContext("thisFunctionDoesNotExist()", context);
Output:
How often does it reproduce? Is there a required condition?
Always.
What is the expected behavior? Why is that the expected behavior?
If I instead do
const context = vm.createContext({
__proto__: new Proxy({}, {})
});
vm.runInContext("thisFunctionDoesNotExist()", context);
or simply
const context = vm.createContext({});
vm.runInContext("thisFunctionDoesNotExist()", context);
then I get the expected output:
$ node test.js
evalmachine.<anonymous>:1
thisFunctionDoesNotExist()
^
ReferenceError: thisFunctionDoesNotExist is not defined
at evalmachine.<anonymous>:1:1
at Script.runInContext (node:vm:148:12)
at Object.runInContext (node:vm:300:6)
What do you see instead?
evalmachine.<anonymous>:1
thisFunctionDoesNotExist()
^
TypeError: thisFunctionDoesNotExist is not a function
at evalmachine.<anonymous>:1:1
at Script.runInContext (node:vm:148:12)
at Object.runInContext (node:vm:300:6)
at Object.<anonymous> (C:\Users\d\OneDrive - domenic.me\Code\GitHub\jsdom\jsdom\test.js:31:4)
at Module._compile (node:internal/modules/cjs/loader:1546:14)
at Module._extensions..js (node:internal/modules/cjs/loader:1691:10)
at Module.load (node:internal/modules/cjs/loader:1317:32)
at Module._load (node:internal/modules/cjs/loader:1127:12)
at TracingChannel.traceSync (node:diagnostics_channel:315:14)
at wrapModuleLoad (node:internal/modules/cjs/loader:217:24)
Node.js v22.7.0
Additional information
I am not 100% sure this is a vm bug. It may be a fundamental limitation of Proxy and the complicated ECMAScript spec rules governing ReferenceError vs. TypeError. But I am pretty sure this is a vm limitation instead:
- Browsers manage to give a ReferenceError here
- Browsers have something very similar to proxies (the WindowProperties object) as part of their global object
- I can't see anything in the spec for WindowProperties that cannot be emulated by a Proxy.
This is blocking jsdom from passing the web platform test window-runtime-error.html once I implement the WindowProperties object (https://github.com/jsdom/jsdom/pull/3765).
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
Bắt đầu bằng cách chạy trình tái hiện tối thiểu của vm.createContext và vm.runInContext từ issue, so sánh các biến thể Proxy với context thông thường. Sử dụng bài kiểm thử window-runtime-error.html được liên kết làm mục tiêu tương thích; được xem là hoàn tất khi context dựa trên Proxy báo cáo ReferenceError cho hàm bị thiếu, khớp với trình duyệt và các trường hợp không dùng Proxy.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- javascript, nodejs
- 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
- Ít trao đổi
- Độ rõ ràng
- Khá rõ ràng
- Mức phù hợp với người mới
- 45/100