From e25920da19353ff83f3ad235461dec45e8f5d277 Mon Sep 17 00:00:00 2001 From: "yangguo@chromium.org" Date: Wed, 23 Oct 2013 16:19:24 +0000 Subject: [PATCH] Make Array.prototype.pop throw if the last element is not configurable. Popping an element from an array should call [[Delete]] internal method and pass true as the second argument (ECMA-262/5.1/#sec-15.4.4.6). When the last element can't be deleted, throw a Type Error. Not throwing the error would result in endless loop in the following test. TEST=var a=[];Object.defineProperty(a,0,{});while(a.length)a.pop(); By the way fix another bug, or else i can't post any issues. "presubmit.py" throw a "missing a correct copyright header" on windows. Both the slash and the backslash are valid path separator on windows. R=yangguo@chromium.org Review URL: https://codereview.chromium.org/29513004 Patch from Yanagi . git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@17346 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/array.js | 2 +- .../regress/regress-array-pop-nonconfigurable.js | 31 ++++++++++++++++++++++ tools/presubmit.py | 6 ++--- 3 files changed, 35 insertions(+), 4 deletions(-) create mode 100644 test/mjsunit/regress/regress-array-pop-nonconfigurable.js diff --git a/src/array.js b/src/array.js index 2649798..e98d7f5 100644 --- a/src/array.js +++ b/src/array.js @@ -430,7 +430,7 @@ function ArrayPop() { n--; var value = this[n]; - delete this[n]; + Delete(this, ToName(n), true); this.length = n; return value; } diff --git a/test/mjsunit/regress/regress-array-pop-nonconfigurable.js b/test/mjsunit/regress/regress-array-pop-nonconfigurable.js new file mode 100644 index 0000000..129e198 --- /dev/null +++ b/test/mjsunit/regress/regress-array-pop-nonconfigurable.js @@ -0,0 +1,31 @@ +// Copyright 2013 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 a = []; +Object.defineProperty(a, 0, {}); +assertThrows(function() { a.pop(); }); + diff --git a/tools/presubmit.py b/tools/presubmit.py index 780dab9..1ab6347 100755 --- a/tools/presubmit.py +++ b/tools/presubmit.py @@ -282,8 +282,8 @@ class SourceProcessor(SourceFileProcessor): Check that all files include a copyright notice and no trailing whitespaces. """ - RELEVANT_EXTENSIONS = ['.js', '.cc', '.h', '.py', '.c', 'SConscript', - 'SConstruct', '.status', '.gyp', '.gypi'] + RELEVANT_EXTENSIONS = ['.js', '.cc', '.h', '.py', '.c', + '.status', '.gyp', '.gypi'] # Overwriting the one in the parent class. def FindFilesIn(self, path): @@ -292,7 +292,7 @@ class SourceProcessor(SourceFileProcessor): stdout=PIPE, cwd=path, shell=True) result = [] for file in output.stdout.read().split(): - for dir_part in os.path.dirname(file).split(os.sep): + for dir_part in os.path.dirname(file).replace(os.sep, '/').split('/'): if self.IgnoreDir(dir_part): break else: -- 2.7.4