Add workaround for redefinition of __proto__ property.
This is a temporary workaround when the __proto__ property is being redefined (e.g. by Object.freeze()) to not loose the foreign callback. Once the __proto__ property is a real JavaScript accessor this hack is no longer necessary. This change also makes __proto__ configurable. R=rossberg@chromium.org BUG=v8:2565 TEST=mjsunit/regress/regress-2565 Review URL: https://codereview.chromium.org/12398010 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@13817 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
867b23246a
commit
2aabf6257d
@ -493,8 +493,7 @@ Handle<JSFunction> Genesis::CreateEmptyFunction(Isolate* isolate) {
|
||||
|
||||
Handle<Foreign> object_prototype(
|
||||
factory->NewForeign(&Accessors::ObjectPrototype));
|
||||
PropertyAttributes attribs = static_cast<PropertyAttributes>(
|
||||
DONT_ENUM | DONT_DELETE);
|
||||
PropertyAttributes attribs = static_cast<PropertyAttributes>(DONT_ENUM);
|
||||
object_prototype_map->set_instance_descriptors(*prototype_descriptors);
|
||||
|
||||
{ // Add __proto__.
|
||||
|
@ -4099,6 +4099,14 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_DefineOrRedefineDataProperty) {
|
||||
if (callback->IsAccessorInfo()) {
|
||||
return isolate->heap()->undefined_value();
|
||||
}
|
||||
// TODO(mstarzinger): The __proto__ property should actually be a real
|
||||
// JavaScript accessor instead of a foreign callback. But for now we just
|
||||
// avoid changing the writability and configurability attribute of this
|
||||
// property.
|
||||
Handle<Name> proto_string = isolate->factory()->proto_string();
|
||||
if (callback->IsForeign() && proto_string->Equals(*name)) {
|
||||
attr = static_cast<PropertyAttributes>(attr & ~(READ_ONLY | DONT_DELETE));
|
||||
}
|
||||
// Avoid redefining foreign callback as data property, just use the stored
|
||||
// setter to update the value instead.
|
||||
// TODO(mstarzinger): So far this only works if property attributes don't
|
||||
|
32
test/mjsunit/regress/regress-2565.js
Normal file
32
test/mjsunit/regress/regress-2565.js
Normal file
@ -0,0 +1,32 @@
|
||||
// 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.
|
||||
|
||||
Object.freeze(Object.prototype);
|
||||
var p = {};
|
||||
var o = Object.create(p);
|
||||
assertSame(p, o.__proto__);
|
||||
assertSame(p, Object.getPrototypeOf(o));
|
Loading…
Reference in New Issue
Block a user