diff options
Diffstat (limited to 'deps/v8/test/mjsunit')
-rw-r--r-- | deps/v8/test/mjsunit/delete.js | 27 | ||||
-rw-r--r-- | deps/v8/test/mjsunit/eval.js | 2 | ||||
-rw-r--r-- | deps/v8/test/mjsunit/keyed-call-ic.js | 205 | ||||
-rw-r--r-- | deps/v8/test/mjsunit/regress/regress-728.js | 42 | ||||
-rw-r--r-- | deps/v8/test/mjsunit/regress/regress-732.js | 46 | ||||
-rw-r--r-- | deps/v8/test/mjsunit/string-charat.js | 91 | ||||
-rw-r--r-- | deps/v8/test/mjsunit/string-charcodeat.js | 4 |
7 files changed, 369 insertions, 48 deletions
diff --git a/deps/v8/test/mjsunit/delete.js b/deps/v8/test/mjsunit/delete.js index 6fc15e926d..8d4636af45 100644 --- a/deps/v8/test/mjsunit/delete.js +++ b/deps/v8/test/mjsunit/delete.js @@ -44,16 +44,11 @@ assertEquals(42, x); assertTrue(delete x); assertTrue(typeof x === 'undefined', "x is gone"); -/**** - * This test relies on DontDelete attributes. This is not - * working yet. - var y = 87; // should have DontDelete attribute assertEquals(87, y); assertFalse(delete y, "don't delete"); assertFalse(typeof y === 'undefined'); assertEquals(87, y); -*/ var o = { x: 42, y: 87 }; assertTrue(has(o, 'x')); @@ -161,3 +156,25 @@ assertFalse(has(a, 1), "delete 1"); assertFalse(has(a, Math.pow(2,30)-1), "delete 2^30-1"); assertFalse(has(a, Math.pow(2,31)-1), "delete 2^31-1"); assertEquals(Math.pow(2,31), a.length); + +// Check that a LoadIC for a dictionary field works, even +// when the dictionary probe misses. +function load_deleted_property_using_IC() { + var x = new Object(); + x.a = 3; + x.b = 4; + x.c = 5; + + delete x.c; + assertEquals(3, load_a(x)); + assertEquals(3, load_a(x)); + delete x.a; + assertTrue(typeof load_a(x) === 'undefined', "x.a is gone"); + assertTrue(typeof load_a(x) === 'undefined', "x.a is gone"); +} + +function load_a(x) { + return x.a; +} + +load_deleted_property_using_IC(); diff --git a/deps/v8/test/mjsunit/eval.js b/deps/v8/test/mjsunit/eval.js index 95357c73d9..25cfcb6231 100644 --- a/deps/v8/test/mjsunit/eval.js +++ b/deps/v8/test/mjsunit/eval.js @@ -50,7 +50,7 @@ global_eval = eval; assertEquals(void 0, eval(eval("var eval = function f(x) { return 'hest';}"))) eval = global_eval; -//Test eval with different number of parameters. +// Test eval with different number of parameters. global_eval = eval; eval = function(x, y) { return x + y; }; assertEquals(4, eval(2, 2)); diff --git a/deps/v8/test/mjsunit/keyed-call-ic.js b/deps/v8/test/mjsunit/keyed-call-ic.js new file mode 100644 index 0000000000..9d82965f1d --- /dev/null +++ b/deps/v8/test/mjsunit/keyed-call-ic.js @@ -0,0 +1,205 @@ +// Copyright 2010 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// A test for keyed call ICs. + +var toStringName = 'toString'; +var global = this; + +function globalFunction1() { + return 'function1'; +} + +function globalFunction2() { + return 'function2'; +} + +assertEquals("[object global]", this[toStringName]()); +assertEquals("[object global]", global[toStringName]()); + +function testGlobals() { + assertEquals("[object global]", this[toStringName]()); + assertEquals("[object global]", global[toStringName]()); +} + +testGlobals(); + + +function F() {} + +F.prototype.one = function() {return 'one'; } +F.prototype.two = function() {return 'two'; } +F.prototype.three = function() {return 'three'; } + +var keys = + ['one', 'one', 'one', 'one', 'two', 'two', 'one', 'three', 'one', 'two']; + +function testKeyTransitions() { + var i, key, result, message; + + var f = new F(); + + // Custom call generators + var array = []; + for (i = 0; i != 10; i++) { + key = (i < 8) ? 'push' : 'pop'; + array[key](i); + } + + assertEquals(6, array.length); + for (i = 0; i != array.length; i++) { + assertEquals(i, array[i]); + } + + for (i = 0; i != 10; i++) { + key = (i < 3) ? 'pop' : 'push'; + array[key](i); + } + + assertEquals(10, array.length); + for (i = 0; i != array.length; i++) { + assertEquals(i, array[i]); + } + + var string = 'ABCDEFGHIJ'; + for (i = 0; i != 10; i++) { + key = ((i < 5) ? 'charAt' : 'charCodeAt'); + result = string[key](i); + message = '\'' + string + '\'[\'' + key + '\'](' + i + ')'; + if (i < 5) { + assertEquals(string.charAt(i), result, message); + } else { + assertEquals(string.charCodeAt(i), result, message); + } + } + + for (i = 0; i != 10; i++) { + key = ((i < 5) ? 'charCodeAt' : 'charAt'); + result = string[key](i); + message = '\'' + string + '\'[\'' + key + '\'](' + i + ')'; + if (i < 5) { + assertEquals(string.charCodeAt(i), result, message); + } else { + assertEquals(string.charAt(i), result, message); + } + } + + // Function is a constant property + key = 'one'; + for (i = 0; i != 10; i++) { + assertEquals(key, f[key]()); + if (i == 5) { + key = 'two'; // the name change should case a miss + } + } + + // Function is a fast property + f.field = function() { return 'field'; } + key = 'field'; + for (i = 0; i != 10; i++) { + assertEquals(key, f[key]()); + if (i == 5) { + key = 'two'; // the name change should case a miss + } + } + + // Calling on slow case object + f.prop = 0; + delete f.prop; // force the object to the slow case + f.four = function() { return 'four'; } + f.five = function() { return 'five'; } + + key = 'four'; + for (i = 0; i != 10; i++) { + assertEquals(key, f[key]()); + if (i == 5) { + key = 'five'; + } + } + + // Calling on global object + key = 'globalFunction1'; + var expect = 'function1'; + for (i = 0; i != 10; i++) { + assertEquals(expect, global[key]()); + if (i == 5) { + key = 'globalFunction2'; + expect = 'function2'; + } + } +} + +testKeyTransitions(); + +function testTypeTransitions() { + var f = new F(); + var s = ''; + var m = 'one'; + var i; + + s = ''; + for (i = 0; i != 10; i++) { + if (i == 5) { F.prototype.one = function() { return '1'; } } + s += f[m](); + } + assertEquals("oneoneoneoneone11111", s); + + s = ''; + for (i = 0; i != 10; i++) { + if (i == 5) { f.__proto__ = { one: function() { return 'I'; } } } + s += f[m](); + } + assertEquals("11111IIIII", s); + + s = ''; + for (i = 0; i != 10; i++) { + if (i == 5) { f.one = function() { return 'ONE'; } } + s += f[m](); + } + assertEquals("IIIIIONEONEONEONEONE", s); + + m = 'toString'; + + s = ''; + var obj = { toString: function() { return '2'; } }; + for (i = 0; i != 10; i++) { + if (i == 5) { obj = "TWO"; } + s += obj[m](); + } + assertEquals("22222TWOTWOTWOTWOTWO", s); + + s = ''; + obj = { toString: function() { return 'ONE'; } }; + m = 'toString'; + for (i = 0; i != 10; i++) { + if (i == 5) { obj = 1; } + s += obj[m](); + } + assertEquals("ONEONEONEONEONE11111", s); +} + +testTypeTransitions(); diff --git a/deps/v8/test/mjsunit/regress/regress-728.js b/deps/v8/test/mjsunit/regress/regress-728.js new file mode 100644 index 0000000000..196b1188a6 --- /dev/null +++ b/deps/v8/test/mjsunit/regress/regress-728.js @@ -0,0 +1,42 @@ +// Copyright 2010 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +var obj = { 0: "obj0" }; + +// Array index k is to big to fit into the string hash field. +var k = 16777217; +var h = "" + k; + +obj[k] = "obj" + k; + +// Force computation of hash for the string representation of array index. +for (var i = 0; i < 10; i++) { ({})[h]; } + +function get(idx) { return obj[idx]; } + +assertEquals(get(0), "obj0"); +assertEquals(get(h), "obj" + h); diff --git a/deps/v8/test/mjsunit/regress/regress-732.js b/deps/v8/test/mjsunit/regress/regress-732.js new file mode 100644 index 0000000000..2b02ea637d --- /dev/null +++ b/deps/v8/test/mjsunit/regress/regress-732.js @@ -0,0 +1,46 @@ +// Copyright 2010 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// idx is a valid array index but is too big to be cached in hash field. +var idx = 10000000; + +// Create a JSObject with NumberDictionary as a backing store for elements. +var obj = { }; +for (var i = 0; i < 100000; i += 100) { obj[i] = "obj" + i; } + +// Set value using numeric index. +obj[idx] = "obj" + idx; + +// Make a string from index. +var str = "" + idx; + +// Force hash computation for the string representation of index. +for (var i = 0; i < 10; i++) { ({})[str]; } + +// Try getting value back using string and number representations of +// the same index. +assertEquals(obj[str], obj[idx]) diff --git a/deps/v8/test/mjsunit/string-charat.js b/deps/v8/test/mjsunit/string-charat.js index f0b0566812..5ce4e89473 100644 --- a/deps/v8/test/mjsunit/string-charat.js +++ b/deps/v8/test/mjsunit/string-charat.js @@ -27,52 +27,58 @@ var s = "test"; +function getTwoByteString() { return "\u1234t"; } +function getCons() { return "testtesttesttest" + getTwoByteString() } + var slowIndex1 = { valueOf: function() { return 1; } }; var slowIndex2 = { toString: function() { return "2"; } }; var slowIndexOutOfRange = { valueOf: function() { return -1; } }; -function basicTest() { - assertEquals("t", s.charAt()); - assertEquals("t", s.charAt("string")); - assertEquals("t", s.charAt(null)); - assertEquals("t", s.charAt(void 0)); - assertEquals("t", s.charAt(false)); - assertEquals("e", s.charAt(true)); - assertEquals("", s.charAt(-1)); - assertEquals("", s.charAt(4)); - assertEquals("", s.charAt(slowIndexOutOfRange)); - assertEquals("", s.charAt(1/0)); - assertEquals("", s.charAt(-1/0)); - assertEquals("t", s.charAt(0)); - assertEquals("t", s.charAt(-0.0)); - assertEquals("t", s.charAt(0.4)); - assertEquals("e", s.charAt(slowIndex1)); - assertEquals("s", s.charAt(slowIndex2)); - assertEquals("t", s.charAt(3)); - assertEquals("t", s.charAt(3.4)); - assertEquals("t", s.charAt(NaN)); - - assertEquals(116, s.charCodeAt()); - assertEquals(116, s.charCodeAt("string")); - assertEquals(116, s.charCodeAt(null)); - assertEquals(116, s.charCodeAt(void 0)); - assertEquals(116, s.charCodeAt(false)); - assertEquals(101, s.charCodeAt(true)); - assertEquals(116, s.charCodeAt(0)); - assertEquals(116, s.charCodeAt(-0.0)); - assertEquals(116, s.charCodeAt(0.4)); - assertEquals(101, s.charCodeAt(slowIndex1)); - assertEquals(115, s.charCodeAt(slowIndex2)); - assertEquals(116, s.charCodeAt(3)); - assertEquals(116, s.charCodeAt(3.4)); - assertEquals(116, s.charCodeAt(NaN)); - assertTrue(isNaN(s.charCodeAt(-1))); - assertTrue(isNaN(s.charCodeAt(4))); - assertTrue(isNaN(s.charCodeAt(slowIndexOutOfRange))); - assertTrue(isNaN(s.charCodeAt(1/0))); - assertTrue(isNaN(s.charCodeAt(-1/0))); +function basicTest(s, len) { + assertEquals("t", s().charAt()); + assertEquals("t", s().charAt("string")); + assertEquals("t", s().charAt(null)); + assertEquals("t", s().charAt(void 0)); + assertEquals("t", s().charAt(false)); + assertEquals("e", s().charAt(true)); + assertEquals("", s().charAt(-1)); + assertEquals("", s().charAt(len)); + assertEquals("", s().charAt(slowIndexOutOfRange)); + assertEquals("", s().charAt(1/0)); + assertEquals("", s().charAt(-1/0)); + assertEquals("t", s().charAt(0)); + assertEquals("t", s().charAt(-0.0)); + assertEquals("t", s().charAt(-0.1)); + assertEquals("t", s().charAt(0.4)); + assertEquals("e", s().charAt(slowIndex1)); + assertEquals("s", s().charAt(slowIndex2)); + assertEquals("t", s().charAt(3)); + assertEquals("t", s().charAt(3.4)); + assertEquals("t", s().charAt(NaN)); + + assertEquals(116, s().charCodeAt()); + assertEquals(116, s().charCodeAt("string")); + assertEquals(116, s().charCodeAt(null)); + assertEquals(116, s().charCodeAt(void 0)); + assertEquals(116, s().charCodeAt(false)); + assertEquals(101, s().charCodeAt(true)); + assertEquals(116, s().charCodeAt(0)); + assertEquals(116, s().charCodeAt(-0.0)); + assertEquals(116, s().charCodeAt(-0.1)); + assertEquals(116, s().charCodeAt(0.4)); + assertEquals(101, s().charCodeAt(slowIndex1)); + assertEquals(115, s().charCodeAt(slowIndex2)); + assertEquals(116, s().charCodeAt(3)); + assertEquals(116, s().charCodeAt(3.4)); + assertEquals(116, s().charCodeAt(NaN)); + assertTrue(isNaN(s().charCodeAt(-1))); + assertTrue(isNaN(s().charCodeAt(len))); + assertTrue(isNaN(s().charCodeAt(slowIndexOutOfRange))); + assertTrue(isNaN(s().charCodeAt(1/0))); + assertTrue(isNaN(s().charCodeAt(-1/0))); } -basicTest(); +basicTest(function() { return s; }, s.length); +basicTest(getCons, getCons().length); // Make sure enough of the one-char string cache is filled. var alpha = ['@']; @@ -122,7 +128,8 @@ stealTest(); // Test custom string IC-s. for (var i = 0; i < 20; i++) { - basicTest(); + basicTest(function() { return s; }, s.length); + basicTest(getCons, getCons().length); stealTest(); } diff --git a/deps/v8/test/mjsunit/string-charcodeat.js b/deps/v8/test/mjsunit/string-charcodeat.js index 3927557752..831f688fd4 100644 --- a/deps/v8/test/mjsunit/string-charcodeat.js +++ b/deps/v8/test/mjsunit/string-charcodeat.js @@ -153,6 +153,10 @@ TestStringType(Slice16End, true); TestStringType(Flat16, true); TestStringType(NotAString16, true); +for (var i = 0; i != 10; i++) { + assertEquals(101, Cons16().charCodeAt(1.1)); + assertEquals('e', Cons16().charAt(1.1)); +} function StupidThing() { // Doesn't return a string from toString! |