| Index: test/mjsunit/strong/implicit-conversions-count.js
|
| diff --git a/test/mjsunit/strong/implicit-conversions-count.js b/test/mjsunit/strong/implicit-conversions-count.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..88ed3c2068cbbb5f8c6820376024701b28db8a44
|
| --- /dev/null
|
| +++ b/test/mjsunit/strong/implicit-conversions-count.js
|
| @@ -0,0 +1,168 @@
|
| +// 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);
|
| + }
|
| +}
|
|
|