From: adamk@chromium.org Date: Tue, 12 Mar 2013 20:15:03 +0000 (+0000) Subject: Use InternalArray in Object.getOwnPropertyNames() implementation X-Git-Tag: upstream/4.7.83~14868 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=004452bff9e5ad191cd508d21e85191ae38b6b17;p=platform%2Fupstream%2Fv8.git Use InternalArray in Object.getOwnPropertyNames() implementation Review URL: https://codereview.chromium.org/12342003 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@13918 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/array.js b/src/array.js index 1ec6433..7cf744b 100644 --- a/src/array.js +++ b/src/array.js @@ -1553,6 +1553,7 @@ function SetUpArray() { // exposed to user code. // Adding only the functions that are actually used. SetUpLockedPrototype(InternalArray, $Array(), $Array( + "concat", getFunction("concat", ArrayConcat), "indexOf", getFunction("indexOf", ArrayIndexOf), "join", getFunction("join", ArrayJoin), "pop", getFunction("pop", ArrayPop), diff --git a/src/v8natives.js b/src/v8natives.js index cc2e1c5..24ad22d 100644 --- a/src/v8natives.js +++ b/src/v8natives.js @@ -1014,39 +1014,44 @@ function ObjectGetOwnPropertyNames(obj) { return ToNameArray(names, "getOwnPropertyNames", true); } + var nameArrays = new InternalArray(); + // Find all the indexed properties. // Get the local element names. - var propertyNames = %GetLocalElementNames(obj); - for (var i = 0; i < propertyNames.length; ++i) { - propertyNames[i] = %_NumberToString(propertyNames[i]); + var localElementNames = %GetLocalElementNames(obj); + for (var i = 0; i < localElementNames.length; ++i) { + localElementNames[i] = %_NumberToString(localElementNames[i]); } + nameArrays.push(localElementNames); // Get names for indexed interceptor properties. var interceptorInfo = %GetInterceptorInfo(obj); if ((interceptorInfo & 1) != 0) { - var indexedInterceptorNames = - %GetIndexedInterceptorElementNames(obj); - if (indexedInterceptorNames) { - propertyNames = propertyNames.concat(indexedInterceptorNames); + var indexedInterceptorNames = %GetIndexedInterceptorElementNames(obj); + if (!IS_UNDEFINED(indexedInterceptorNames)) { + nameArrays.push(indexedInterceptorNames); } } // Find all the named properties. // Get the local property names. - propertyNames = propertyNames.concat(%GetLocalPropertyNames(obj)); + nameArrays.push(%GetLocalPropertyNames(obj)); // Get names for named interceptor properties if any. if ((interceptorInfo & 2) != 0) { - var namedInterceptorNames = - %GetNamedInterceptorPropertyNames(obj); - if (namedInterceptorNames) { - propertyNames = propertyNames.concat(namedInterceptorNames); + var namedInterceptorNames = %GetNamedInterceptorPropertyNames(obj); + if (!IS_UNDEFINED(namedInterceptorNames)) { + nameArrays.push(namedInterceptorNames); } } - // Property names are expected to be unique names, + var propertyNames = + %Apply(InternalArray.prototype.concat, + nameArrays[0], nameArrays, 1, nameArrays.length - 1); + + // Property names are expected to be unique strings, // but interceptors can interfere with that assumption. if (interceptorInfo != 0) { var propertySet = { __proto__: null }; diff --git a/test/mjsunit/object-get-own-property-names.js b/test/mjsunit/object-get-own-property-names.js index 33aa85e..64607c6 100644 --- a/test/mjsunit/object-get-own-property-names.js +++ b/test/mjsunit/object-get-own-property-names.js @@ -77,6 +77,16 @@ propertyNames.sort(); assertEquals(1, propertyNames.length); assertEquals("getter", propertyNames[0]); +// Check that implementation does not access Array.prototype. +var savedConcat = Array.prototype.concat; +Array.prototype.concat = function() { return []; } +propertyNames = Object.getOwnPropertyNames({0: 'foo', bar: 'baz'}); +assertEquals(2, propertyNames.length); +assertEquals('0', propertyNames[0]); +assertEquals('bar', propertyNames[1]); +assertSame(Array.prototype, propertyNames.__proto__); +Array.prototype.concat = savedConcat; + try { Object.getOwnPropertyNames(4); assertTrue(false);