[es6] Move builtin constructors for primitives to strict mode.

The ES6 specification says that "Built-in functions that are ECMAScript
function objects must be strict mode functions", which in particular
means that you can never test for them using the "caller" field of a
sloppy mode function.

CQ_INCLUDE_TRYBOTS=tryserver.v8:v8_linux_layout_dbg,v8_linux_nosnap_dbg
R=mstarzinger@chromium.org
BUG=v8:105
LOG=n

Review URL: https://codereview.chromium.org/1347663002

Cr-Commit-Position: refs/heads/master@{#30750}
This commit is contained in:
bmeurer 2015-09-15 07:32:25 -07:00 committed by Commit bot
parent 63190721cd
commit e2f1c26982
3 changed files with 8 additions and 2 deletions

View File

@ -36,6 +36,8 @@ utils.Import(function(from) {
//-------------------------------------------------------------------
function StringConstructor(x) {
// TODO(bmeurer): Move this to toplevel.
"use strict";
if (%_ArgumentsLength() == 0) x = '';
if (%_IsConstructCall()) {
%_SetValueOf(this, TO_STRING_INLINE(x));

View File

@ -1341,6 +1341,8 @@ utils.InstallFunctions(GlobalObject, DONT_ENUM, [
// Boolean
function BooleanConstructor(x) {
// TODO(bmeurer): Move this to toplevel.
"use strict";
if (%_IsConstructCall()) {
%_SetValueOf(this, ToBoolean(x));
} else {
@ -1390,6 +1392,8 @@ utils.InstallFunctions(GlobalBoolean.prototype, DONT_ENUM, [
// Number
function NumberConstructor(x) {
// TODO(bmeurer): Move this to toplevel.
"use strict";
var value = %_ArgumentsLength() == 0 ? 0 : ToNumber(x);
if (%_IsConstructCall()) {
%_SetValueOf(this, value);

View File

@ -26,12 +26,12 @@
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
var custom_valueOf = function() {
assertEquals(Number, custom_valueOf.caller);
assertEquals(null, custom_valueOf.caller);
return 2;
}
var custom_toString = function() {
assertEquals(String, custom_toString.caller);
assertEquals(null, custom_toString.caller);
return "I used to be an adventurer like you";
}