From fbc86cde9da52f61e35d9dd976f70c4c70976e20 Mon Sep 17 00:00:00 2001 From: overlookmotel Date: Tue, 7 Nov 2023 22:07:44 +0000 Subject: [PATCH] TODO --- TODO.md | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 TODO.md diff --git a/TODO.md b/TODO.md new file mode 100644 index 00000000..f5a3b778 --- /dev/null +++ b/TODO.md @@ -0,0 +1,68 @@ +# TODO + +* I think `arguments` needs to be added to reserved var names set if it's used in a function as an internal var, and also set as `isFrozenInternal` +* Tests +* Test for `"use strict"` directive in function not being moved up to outside `with ()` +* Test for multiple `with ()`s between var and its binding +* Test for `with ()` with no `{}` statement block +* TODO comments +* Deal with `with` in `eval()` - or is this done already? + +* Freeze `this` + +Mostly fixed now (except where `this` implicitly used by `super`) but needs tests. + +e.g. this produces wrong result: + +```js +function f() { + with ({y: 1, this$0: {x: 2}}) { + return () => y + this.x; + } +} +module.exports = f.call({x: 1}); +``` + +produces: + +```js +module.exports = (this$0 => with$0 => { + with (with$0) return () => y + this$0.x; +})({x: 1})({y: 1, this$0: {x: 2}}); +``` + +* Fix `arguments`. e.g.: + +Now fixed I think, but need tests. + +```js +function f() { + with ({}) { + return () => arguments[0]; + } +} +module.exports = f(1); +``` + +produces: + +```js +module.exports = (_arguments => (() => with$0 => { + with (with$0) return () => arguments[0]; +}).apply(0, _arguments))(function () { + return arguments; +}(1))({}); +``` + +Problem is `() => with$0` needs to be a full function `function () { return with$0 => { ... } }`. + +* Support interaction with const violations + +e.g. How to deal with this? Whether `x = 2` is a const violation depends on whether `obj` has a property called `x` or not. + +```js +const x = 1; +with (obj) { + module.exports = () => { x = 2; }; +} +```