From d92c745427c8c78f47820f11c2e23c8cfed642a7 Mon Sep 17 00:00:00 2001 From: Boopathi Rajaa Date: Wed, 8 Feb 2017 16:37:14 +0100 Subject: [PATCH] Deopt evaluation of undefined with a local binding. Fix #5204 (#5206) --- packages/babel-traverse/src/path/evaluation.js | 6 +++--- packages/babel-traverse/test/evaluation.js | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/packages/babel-traverse/src/path/evaluation.js b/packages/babel-traverse/src/path/evaluation.js index 57699b561fd8..971a66a4095d 100644 --- a/packages/babel-traverse/src/path/evaluation.js +++ b/packages/babel-traverse/src/path/evaluation.js @@ -176,11 +176,11 @@ export function evaluate(): { confident: boolean; value: any } { return binding.value; } else { if (node.name === "undefined") { - return undefined; + return binding ? deopt(binding.path) : undefined; } else if (node.name === "Infinity") { - return Infinity; + return binding ? deopt(binding.path) : Infinity; } else if (node.name === "NaN") { - return NaN; + return binding ? deopt(binding.path) : NaN; } const resolved = path.resolve(); diff --git a/packages/babel-traverse/test/evaluation.js b/packages/babel-traverse/test/evaluation.js index 5a3d93f76550..148173fa7d01 100644 --- a/packages/babel-traverse/test/evaluation.js +++ b/packages/babel-traverse/test/evaluation.js @@ -101,4 +101,22 @@ describe("evaluation", function () { false ); }); + + it("should evaluate undefined, NaN and Infinity", () => { + assert.strictEqual(getPath("undefined").get("body.0.expression").evaluate().confident, true); + assert.strictEqual(getPath("NaN").get("body.0.expression").evaluate().confident, true); + assert.strictEqual(getPath("Infinity").get("body.0.expression").evaluate().confident, true); + }); + + it("should deopt redefined primitives - undefined, NaN and Infinity", () => { + const eval_undef = getPath("let undefined; undefined;").get("body.1.expression").evaluate(); + const eval_nan = getPath("let NaN; NaN;").get("body.1.expression").evaluate(); + const eval_inf = getPath("let Infinity; Infinity;").get("body.1.expression").evaluate(); + assert.strictEqual(eval_undef.confident, false); + assert.strictEqual(eval_nan.confident, false); + assert.strictEqual(eval_inf.confident, false); + + assert.strictEqual(eval_undef.deopt.type, "VariableDeclarator"); + assert.strictEqual(eval_undef.deopt.parentPath.node.kind, "let"); + }); });