blob: 88ed3c2068cbbb5f8c6820376024701b28db8a44 [file] [log] [blame]
// Copyright 2015 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Flags: --strong-mode --allow-natives-syntax
"use strict";
function pre_inc(x) {
return ++x;
}
function post_inc(x) {
return x++;
}
function pre_dec(x) {
return --x;
}
function post_dec(x) {
return x--;
}
function getTestFuncs() {
return [
function(x){
"use strong";
let y = x;
assertEquals(++y, pre_inc(x));
try {
assertEquals(x+1, y)
} catch (e) {
assertUnreachable();
}
},
function(x){
"use strong";
let y = x;
assertEquals(y++, post_inc(x));
try {
assertEquals(x+1, y)
} catch (e) {
assertUnreachable();
}
},
function(x){
"use strong";
let y = x;
assertEquals(--y, pre_dec(x));
try {
assertEquals(x-1, y)
} catch (e) {
assertUnreachable();
}
},
function(x){
"use strong";
let y = x;
assertEquals(y--, post_dec(x));
try {
assertEquals(x-1, y)
} catch (e) {
assertUnreachable();
}
},
function(x){
"use strong";
let obj = { foo: x };
let y = ++obj.foo;
assertEquals(y, pre_inc(x));
try {
assertEquals(x+1, obj.foo)
} catch (e) {
assertUnreachable();
}
},
function(x){
"use strong";
let obj = { foo: x };
let y = obj.foo++;
assertEquals(y, post_inc(x));
try {
assertEquals(x+1, obj.foo)
} catch (e) {
assertUnreachable();
}
},
function(x){
"use strong";
let obj = { foo: x };
let y = --obj.foo;
assertEquals(y, pre_dec(x));
try {
assertEquals(x-1, obj.foo)
} catch (e) {
assertUnreachable();
}
},
function(x){
"use strong";
let obj = { foo: x };
let y = obj.foo--;
assertEquals(y, post_dec(x));
try {
assertEquals(x-1, obj.foo)
} catch (e) {
assertUnreachable();
}
},
];
}
let nonNumberValues = [
{},
(function(){}),
[],
(class Foo {}),
"",
"foo",
"NaN",
Object(""),
false,
null,
undefined
];
// Check prior input of None works
for (let func of getTestFuncs()) {
for (let value of nonNumberValues) {
assertThrows(function(){func(value)}, TypeError);
assertThrows(function(){func(value)}, TypeError);
assertThrows(function(){func(value)}, TypeError);
%OptimizeFunctionOnNextCall(func);
assertThrows(function(){func(value)}, TypeError);
%DeoptimizeFunction(func);
}
}
// Check prior input of Smi works
for (let func of getTestFuncs()) {
func(1);
func(1);
func(1);
for (let value of nonNumberValues) {
assertThrows(function(){func(value)}, TypeError);
assertThrows(function(){func(value)}, TypeError);
assertThrows(function(){func(value)}, TypeError);
%OptimizeFunctionOnNextCall(func);
assertThrows(function(){func(value)}, TypeError);
%DeoptimizeFunction(func);
}
}
// Check prior input of Number works
for (let func of getTestFuncs()) {
func(9999999999999);
func(9999999999999);
func(9999999999999);
for (let value of nonNumberValues) {
assertThrows(function(){func(value)}, TypeError);
assertThrows(function(){func(value)}, TypeError);
assertThrows(function(){func(value)}, TypeError);
%OptimizeFunctionOnNextCall(func);
assertThrows(function(){func(value)}, TypeError);
%DeoptimizeFunction(func);
}
}