vm: Function declarations should use [[Define]] instead of [[Set]] on the global object
未关闭
还没有人认领这个 Issue。
v8 engine
vm
- 主要语言
- JavaScript
- 星标
- 122k
- 派生
- 37.3k
- 平均合并
- 4 天 2 小时
- 30 天内合并 PR
- 283
描述
- Version: v13.8.0
- Platform: All; tested on Travis CI (Ubuntu 16.04.6 LTS)
- Subsystem: vm
What steps will reproduce the bug?
const vm = require("vm");
let impl = { status: "" };
let ctx = vm.createContext();
Object.defineProperty(ctx, "status", {
configurable: true,
enumerable: true,
get() {
return impl.status;
},
set(v) {
impl.status = `${v}`;
},
});
// https://github.com/web-platform-tests/wpt/blob/master/xhr/status-async.htm
vm.runInContext(`
function statusRequest(...args) {
console.log(args.map(JSON.stringify).join("\t"));
}
function status(code, text, content, type) {
statusRequest("GET", code, text, content, type);
statusRequest("HEAD", code, text, content, type);
statusRequest("CHICKEN", code, text, content, type);
}
status(204, "UNICORNSWIN", "", "")
status(401, "OH HELLO", "Not today.", "")
status(402, "FIVE BUCKS", "<x>402<\/x>", "text/xml")
status(402, "FREE", "Nice!", "text/doesnotmatter")
status(402, "402 TEH AWESOME", "", "")
status(502, "YO", "", "")
status(502, "lowercase", "SWEET POTATO", "text/plain")
status(503, "HOUSTON WE HAVE A", "503", "text/plain")
status(699, "WAY OUTTA RANGE", "699", "text/plain")
`, ctx);
How often does it reproduce? Is there a required condition?
Always.
What is the expected behavior?
The functions get defined using [[DefineOwnProperty]] as specified in ECMA‑262 § 8.1.1.4.18 CreateGlobalFunctionBinding.
Expected log output
| "GET" | 204 | "UNICORNSWIN" | "" | "" |
| "HEAD" | 204 | "UNICORNSWIN" | "" | "" |
| "CHICKEN" | 204 | "UNICORNSWIN" | "" | "" |
| "GET" | 401 | "OH HELLO" | "Not today." | "" |
| "HEAD" | 401 | "OH HELLO" | "Not today." | "" |
| "CHICKEN" | 401 | "OH HELLO" | "Not today." | "" |
| "GET" | 402 | "FIVE BUCKS" | "402" | "text/xml" |
| "HEAD" | 402 | "FIVE BUCKS" | "402" | "text/xml" |
| "CHICKEN" | 402 | "FIVE BUCKS" | "402" | "text/xml" |
| "GET" | 402 | "FREE" | "Nice!" | "text/doesnotmatter" |
| "HEAD" | 402 | "FREE" | "Nice!" | "text/doesnotmatter" |
| "CHICKEN" | 402 | "FREE" | "Nice!" | "text/doesnotmatter" |
| "GET" | 402 | "402 TEH AWESOME" | "" | "" |
| "HEAD" | 402 | "402 TEH AWESOME" | "" | "" |
| "CHICKEN" | 402 | "402 TEH AWESOME" | "" | "" |
| "GET" | 502 | "YO" | "" | "" |
| "HEAD" | 502 | "YO" | "" | "" |
| "CHICKEN" | 502 | "YO" | "" | "" |
| "GET" | 502 | "lowercase" | "SWEET POTATO" | "text/plain" |
| "HEAD" | 502 | "lowercase" | "SWEET POTATO" | "text/plain" |
| "CHICKEN" | 502 | "lowercase" | "SWEET POTATO" | "text/plain" |
| "GET" | 503 | "HOUSTON WE HAVE A" | "503" | "text/plain" |
| "HEAD" | 503 | "HOUSTON WE HAVE A" | "503" | "text/plain" |
| "CHICKEN" | 503 | "HOUSTON WE HAVE A" | "503" | "text/plain" |
| "GET" | 699 | "WAY OUTTA RANGE" | "699" | "text/plain" |
| "HEAD" | 699 | "WAY OUTTA RANGE" | "699" | "text/plain" |
| "CHICKEN" | 699 | "WAY OUTTA RANGE" | "699" | "text/plain" |
What do you see instead?
evalmachine.<anonymous>:10
status(204, "UNICORNSWIN", "", "")
^
Uncaught TypeError: status is not a function
at evalmachine.<anonymous>:10:1
at Script.runInContext (vm.js:131:20)
at Object.runInContext (vm.js:295:6)
at repl:1:4
at Script.runInThisContext (vm.js:120:20)
at REPLServer.defaultEval (repl.js:432:29)
at bound (domain.js:429:14)
at REPLServer.runBound [as eval] (domain.js:442:12)
at REPLServer.onLine (repl.js:759:10)
at REPLServer.emit (events.js:333:22)
Additional information
Discovered in: https://github.com/jsdom/jsdom/pull/2835#discussion_r379706437
See also
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
从堆栈跟踪中显示的 vm.js 位置开始,运行提供的 vm.runInContext 复现代码。跟踪函数声明如何安装到上下文的全局对象上,然后验证这些函数不再触发访问器,并且生成预期的日志输出。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- javascript
- 领域
- backend
- Issue 类型
- 缺陷
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 活跃度
- 冷清
- 描述清晰度
- 基本清楚
- 新手友好度
- 48/100