19258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org// Copyright 2008 the V8 project authors. All rights reserved. 29a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Redistribution and use in source and binary forms, with or without 39a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// modification, are permitted provided that the following conditions are 49a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// met: 59a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// 69a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// * Redistributions of source code must retain the above copyright 79a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// notice, this list of conditions and the following disclaimer. 89a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// * Redistributions in binary form must reproduce the above 99a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// copyright notice, this list of conditions and the following 109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// disclaimer in the documentation and/or other materials provided 119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// with the distribution. 129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// * Neither the name of Google Inc. nor the names of its 139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// contributors may be used to endorse or promote products derived 149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// from this software without specific prior written permission. 159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// 169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Flags: --expose-gc 299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comfunction for_in_null() { 319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com try { 329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com for (var x in null) { 339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com return false; 349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 359a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } catch(e) { 369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com return false; 379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com return true; 399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comfunction for_in_undefined() { 429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com try { 439a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com for (var x in undefined) { 449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com return false; 459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 469a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } catch(e) { 479a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com return false; 489a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com return true; 509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 519a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comfor (var i = 0; i < 10; ++i) { 539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com assertTrue(for_in_null()); 549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com gc(); 559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comfor (var j = 0; j < 10; ++j) { 589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com assertTrue(for_in_undefined()); 599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com gc(); 609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(10, i); 639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(10, j); 649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 65ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org 66ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.orgfunction Accumulate(x) { 67ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org var accumulator = ""; 68ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org for (var i in x) { 69ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org accumulator += i; 70ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org } 71ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org return accumulator; 72ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org} 73ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org 74ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.orgfor (var i = 0; i < 3; ++i) { 75ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org var elements = Accumulate("abcd"); 76ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org // We do not assume that for-in enumerates elements in order. 77ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org assertTrue(-1 != elements.indexOf("0")); 78ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org assertTrue(-1 != elements.indexOf("1")); 79ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org assertTrue(-1 != elements.indexOf("2")); 80ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org assertTrue(-1 != elements.indexOf("3")); 81ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org assertEquals(4, elements.length); 82ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org} 83ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org 84ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.orgfunction for_in_string_prototype() { 85ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org 86ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org var x = new String("abc"); 87ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org x.foo = 19; 88ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org function B() { 89ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org this.bar = 5; 90ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org this[7] = 4; 91ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org } 92ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org B.prototype = x; 93ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org 94ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org var y = new B(); 95ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org y.gub = 13; 96ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org 97ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org var elements = Accumulate(y); 98ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org var elements1 = Accumulate(y); 99ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org // If for-in returns elements in a different order on multiple calls, this 100ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org // assert will fail. If that happens, consider if that behavior is OK. 101ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org assertEquals(elements, elements1, "For-in elements not the same both times."); 102ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org // We do not assume that for-in enumerates elements in order. 103ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org assertTrue(-1 != elements.indexOf("0")); 104ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org assertTrue(-1 != elements.indexOf("1")); 105ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org assertTrue(-1 != elements.indexOf("2")); 106ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org assertTrue(-1 != elements.indexOf("7")); 107ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org assertTrue(-1 != elements.indexOf("foo")); 108ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org assertTrue(-1 != elements.indexOf("bar")); 109ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org assertTrue(-1 != elements.indexOf("gub")); 110ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org assertEquals(13, elements.length); 111ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org 112ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org elements = Accumulate(x); 113ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org assertTrue(-1 != elements.indexOf("0")); 114ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org assertTrue(-1 != elements.indexOf("1")); 115ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org assertTrue(-1 != elements.indexOf("2")); 116ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org assertTrue(-1 != elements.indexOf("foo")); 117ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org assertEquals(6, elements.length); 118ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org} 119ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org 120ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.orgfor_in_string_prototype(); 121ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.orgfor_in_string_prototype(); 122