From f047bbc6344f9aa6665107c64984d7bd5d3d4597 Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Sun, 5 Jul 2015 22:16:47 +0600 Subject: [PATCH] fix `new` detection in `Number` constructor, close #89, https://github.com/babel/babel/issues/1927 --- library/modules/es6.number.constructor.js | 3 ++- modules/es6.number.constructor.js | 3 ++- tests/tests.js | 4 +++- tests/tests/es6.number.constructor.ls | 3 +++ 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/library/modules/es6.number.constructor.js b/library/modules/es6.number.constructor.js index 80d776c58e64..d3fdce1f2380 100644 --- a/library/modules/es6.number.constructor.js +++ b/library/modules/es6.number.constructor.js @@ -1,5 +1,6 @@ 'use strict'; var $ = require('./$') + , cof = require('./$.cof') , isObject = $.isObject , isFunction = $.isFunction , NUMBER = 'Number' @@ -24,7 +25,7 @@ function toNumber(it){ } if($.FW && !($Number('0o1') && $Number('0b1'))){ $Number = function Number(it){ - return this instanceof $Number ? new Base(toNumber(it)) : toNumber(it); + return this instanceof $Number && cof(this) != NUMBER ? new Base(toNumber(it)) : toNumber(it); }; $.each.call($.DESC ? $.getNames(Base) : ( // ES3: diff --git a/modules/es6.number.constructor.js b/modules/es6.number.constructor.js index 80d776c58e64..d3fdce1f2380 100644 --- a/modules/es6.number.constructor.js +++ b/modules/es6.number.constructor.js @@ -1,5 +1,6 @@ 'use strict'; var $ = require('./$') + , cof = require('./$.cof') , isObject = $.isObject , isFunction = $.isFunction , NUMBER = 'Number' @@ -24,7 +25,7 @@ function toNumber(it){ } if($.FW && !($Number('0o1') && $Number('0b1'))){ $Number = function Number(it){ - return this instanceof $Number ? new Base(toNumber(it)) : toNumber(it); + return this instanceof $Number && cof(this) != NUMBER ? new Base(toNumber(it)) : toNumber(it); }; $.each.call($.DESC ? $.getNames(Base) : ( // ES3: diff --git a/tests/tests.js b/tests/tests.js index 15f1cb2003ad..b1f6e58daede 100644 --- a/tests/tests.js +++ b/tests/tests.js @@ -2734,7 +2734,7 @@ return sameEq(x.valueOf(), b, "new Number(" + typeof a + " " + a + ").valueOf() -> " + b); }; test('Number constructor: regression', function(){ - var i, i$, x$, ref$, len$; + var i, i$, x$, ref$, len$, n; ok(toString$.call(Number).slice(8, -1) === 'Function', 'Number is function'); eq(Number.length, 1, 'Number.length is 1'); ok(/native code/.test(Number), 'looks like native'); @@ -2848,6 +2848,8 @@ x$ = ref$[i$]; ok(x$ in Number, x$ + " in Number"); } + n = new Number(42); + eq(typeof n.constructor(n), 'number'); }); test('Number constructor: binary', function(){ check('0b1', 1); diff --git a/tests/tests/es6.number.constructor.ls b/tests/tests/es6.number.constructor.ls index de59921e6b35..dd1334513e6e 100644 --- a/tests/tests/es6.number.constructor.ls +++ b/tests/tests/es6.number.constructor.ls @@ -60,6 +60,9 @@ test 'Number constructor: regression' !-> for <[MAX_VALUE MIN_VALUE NaN NEGATIVE_INFINITY POSITIVE_INFINITY]> ok .. of Number, "#{..} in Number" + + n = new Number 42 + eq typeof n@@(n), \number test 'Number constructor: binary' !-> check \0b1, 1