| function shouldBe(actual, expected) { |
| if (actual !== expected) |
| throw new Error(`bad value: ${String(actual)}`); |
| } |
| |
| function shouldThrow(func, errorMessage) { |
| var errorThrown = false; |
| var error = null; |
| try { |
| func(); |
| } catch (e) { |
| errorThrown = true; |
| error = e; |
| } |
| if (!errorThrown) |
| throw new Error('not thrown'); |
| if (String(error) !== errorMessage) |
| throw new Error(`bad error: ${String(error)}`); |
| } |
| var globalEval = eval; |
| var global = this; |
| |
| // EvalContextType. |
| { |
| function hello() |
| { |
| return eval('new.target'); |
| } |
| shouldBe(hello(), undefined); |
| shouldBe(hello(), undefined); |
| shouldBe(hello(), undefined); |
| globalEval(` |
| var thrown = false; |
| try { |
| eval('new.target'); |
| } catch (e) { |
| thrown = true; |
| shouldBe(String(e), "SyntaxError: new.target is only valid inside functions."); |
| } |
| shouldBe(thrown, true); |
| `); |
| |
| var thrown = false; |
| try { |
| globalEval('new.target'); |
| } catch (e) { |
| thrown = true; |
| shouldBe(String(e), "SyntaxError: new.target is only valid inside functions."); |
| } |
| shouldBe(thrown, true); |
| } |
| |
| // DerivedContextType. |
| { |
| var object = { |
| hello() |
| { |
| return eval('super.ok'); |
| } |
| }; |
| object.__proto__ = { ok: 42 }; |
| shouldBe(object.hello(), 42); |
| |
| var test = { |
| hello: function () { |
| return eval('super.ok'); |
| } |
| }; |
| test.__proto__ = { ok: 42 }; |
| shouldThrow(function () { |
| test.hello(); |
| }, `SyntaxError: super is not valid in this context.`); |
| } |
| |
| // isArrowFunctionContext. |
| { |
| globalEval(` |
| function ok() |
| { |
| return eval('this'); |
| } |
| shouldBe(ok(), global) |
| var hello = { |
| hello() |
| { |
| var arrow = () => eval('this'); |
| shouldBe(arrow(), hello); |
| } |
| }; |
| hello.hello(); |
| `); |
| } |