diff --git a/src/messages.js b/src/messages.js index bdcbf918ec..f313719b62 100644 --- a/src/messages.js +++ b/src/messages.js @@ -178,7 +178,8 @@ function FormatMessage(message) { result_not_primitive: "Result of %0 must be a primitive, was %1", invalid_json: "String '%0' is not valid JSON", circular_structure: "Converting circular structure to JSON", - object_keys_non_object: "Object.keys called on non-object" + object_keys_non_object: "Object.keys called on non-object", + object_get_prototype_non_object: "Object.getPrototypeOf called on non-object" }; } var format = kMessages[message.type]; diff --git a/src/v8natives.js b/src/v8natives.js index a664095580..9494693c2e 100644 --- a/src/v8natives.js +++ b/src/v8natives.js @@ -448,6 +448,15 @@ function DefineOwnProperty(obj, p, desc, should_throw) { } +// ES5 section 15.2.3.2. +function ObjectGetPrototypeOf(obj) { + if (!IS_OBJECT(obj) && !IS_FUNCTION(obj)) { + throw MakeTypeError("object_get_prototype_non_object", [obj]); + } + return obj.__proto__; +} + + // ES5 section 15.2.3.5. function ObjectCreate(proto, properties) { if (!IS_OBJECT(proto) && !IS_NULL(proto)) { @@ -512,7 +521,8 @@ function SetupObject() { )); InstallFunctions($Object, DONT_ENUM, $Array( "keys", ObjectKeys, - "create", ObjectCreate + "create", ObjectCreate, + "getPrototypeOf", ObjectGetPrototypeOf )); } diff --git a/test/es5conform/es5conform.status b/test/es5conform/es5conform.status index 49cffb2801..ebcbc2b37e 100644 --- a/test/es5conform/es5conform.status +++ b/test/es5conform/es5conform.status @@ -38,7 +38,6 @@ chapter13: UNIMPLEMENTED chapter14: UNIMPLEMENTED chapter15/15.1: UNIMPLEMENTED chapter15/15.2/15.2.3/15.2.3.1: UNIMPLEMENTED -chapter15/15.2/15.2.3/15.2.3.2: UNIMPLEMENTED chapter15/15.2/15.2.3/15.2.3.3: UNIMPLEMENTED chapter15/15.2/15.2.3/15.2.3.4: UNIMPLEMENTED chapter15/15.2/15.2.3/15.2.3.5: UNIMPLEMENTED @@ -51,6 +50,9 @@ chapter15/15.2/15.2.3/15.2.3.11: UNIMPLEMENTED chapter15/15.2/15.2.3/15.2.3.12: UNIMPLEMENTED chapter15/15.2/15.2.3/15.2.3.13: UNIMPLEMENTED +# Object.getPrototypeOf +chapter15/15.2/15.2.3/15.2.3.2: PASS + # Object.keys chapter15/15.2/15.2.3/15.2.3.14: PASS diff --git a/test/mjsunit/get-prototype-of.js b/test/mjsunit/get-prototype-of.js new file mode 100644 index 0000000000..6475bde651 --- /dev/null +++ b/test/mjsunit/get-prototype-of.js @@ -0,0 +1,68 @@ +// 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. + + +function TryGetPrototypeOfNonObject(x) { + var caught = 0; + try { + Object.getPrototypeOf(x); + } catch (e) { + caught = e; + } + + assertTrue(caught instanceof TypeError); +}; + +function GetPrototypeOfObject(x) { + assertDoesNotThrow(Object.getPrototypeOf(x)); + assertNotNull(Object.getPrototypeOf(x)); + assertEquals(Object.getPrototypeOf(x), x.__proto__); +} + +function F(){}; + +// Non object +var x = 10; + +// Object +var y = new F(); + +// Make sure that TypeError exceptions are thrown when non-objects are passed +// as argument +TryGetPrototypeOfNonObject(0); +TryGetPrototypeOfNonObject(null); +TryGetPrototypeOfNonObject('Testing'); +TryGetPrototypeOfNonObject(x); + +// Make sure the real objects have this method and that it returns the +// actual prototype object. Also test for Functions and RegExp. +GetPrototypeOfObject(this); +GetPrototypeOfObject(y); +GetPrototypeOfObject({x:5}); +GetPrototypeOfObject(F); +GetPrototypeOfObject(RegExp); + diff --git a/tools/presubmit.py b/tools/presubmit.py index 3f27c001a1..04952e0b4a 100755 --- a/tools/presubmit.py +++ b/tools/presubmit.py @@ -221,7 +221,7 @@ class CppLintProcessor(SourceFileProcessor): COPYRIGHT_HEADER_PATTERN = re.compile( - r'Copyright [\d-]*200[8-9] the V8 project authors. All rights reserved.') + r'Copyright [\d-]*20[0-1][0-9] the V8 project authors. All rights reserved.') class SourceProcessor(SourceFileProcessor): """