Commit 7e29b64e authored by verwaest@chromium.org's avatar verwaest@chromium.org

Reimplement SetProperty using the LookupIterator

BUG=
R=ishell@chromium.org

Review URL: https://codereview.chromium.org/392243002

git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@22482 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 9d2609fe
...@@ -1547,7 +1547,7 @@ void Debug::PrepareStep(StepAction step_action, ...@@ -1547,7 +1547,7 @@ void Debug::PrepareStep(StepAction step_action,
if (is_load_or_store) { if (is_load_or_store) {
// Remember source position and frame to handle step in getter/setter. If // Remember source position and frame to handle step in getter/setter. If
// there is a custom getter/setter it will be handled in // there is a custom getter/setter it will be handled in
// Object::Get/SetPropertyWithCallback, otherwise the step action will be // Object::Get/SetPropertyWithAccessor, otherwise the step action will be
// propagated on the next Debug::Break. // propagated on the next Debug::Break.
thread_local_.last_statement_position_ = thread_local_.last_statement_position_ =
debug_info->code()->SourceStatementPosition(frame->pc()); debug_info->code()->SourceStatementPosition(frame->pc());
......
...@@ -1281,6 +1281,8 @@ MaybeHandle<Object> StoreIC::Store(Handle<Object> object, ...@@ -1281,6 +1281,8 @@ MaybeHandle<Object> StoreIC::Store(Handle<Object> object,
Handle<String> name, Handle<String> name,
Handle<Object> value, Handle<Object> value,
JSReceiver::StoreFromKeyed store_mode) { JSReceiver::StoreFromKeyed store_mode) {
// TODO(verwaest): Let SetProperty do the migration, since storing a property
// might deprecate the current map again, if value does not fit.
if (MigrateDeprecated(object) || object->IsJSProxy()) { if (MigrateDeprecated(object) || object->IsJSProxy()) {
Handle<JSReceiver> receiver = Handle<JSReceiver>::cast(object); Handle<JSReceiver> receiver = Handle<JSReceiver>::cast(object);
Handle<Object> result; Handle<Object> result;
...@@ -1757,6 +1759,8 @@ KeyedAccessStoreMode KeyedStoreIC::GetStoreMode(Handle<JSObject> receiver, ...@@ -1757,6 +1759,8 @@ KeyedAccessStoreMode KeyedStoreIC::GetStoreMode(Handle<JSObject> receiver,
MaybeHandle<Object> KeyedStoreIC::Store(Handle<Object> object, MaybeHandle<Object> KeyedStoreIC::Store(Handle<Object> object,
Handle<Object> key, Handle<Object> key,
Handle<Object> value) { Handle<Object> value) {
// TODO(verwaest): Let SetProperty do the migration, since storing a property
// might deprecate the current map again, if value does not fit.
if (MigrateDeprecated(object)) { if (MigrateDeprecated(object)) {
Handle<Object> result; Handle<Object> result;
ASSIGN_RETURN_ON_EXCEPTION( ASSIGN_RETURN_ON_EXCEPTION(
......
...@@ -144,6 +144,78 @@ bool LookupIterator::HasProperty() { ...@@ -144,6 +144,78 @@ bool LookupIterator::HasProperty() {
} }
void LookupIterator::PrepareForDataProperty(Handle<Object> value) {
ASSERT(has_property_);
ASSERT(HolderIsReceiver());
if (property_encoding_ == DICTIONARY) return;
holder_map_ = Map::PrepareForDataProperty(holder_map_, number_, value);
JSObject::MigrateToMap(GetHolder(), holder_map_);
// Reload property information.
if (holder_map_->is_dictionary_map()) {
property_encoding_ = DICTIONARY;
} else {
property_encoding_ = DESCRIPTOR;
}
CHECK(HasProperty());
}
void LookupIterator::TransitionToDataProperty(
Handle<Object> value, PropertyAttributes attributes,
Object::StoreFromKeyed store_mode) {
ASSERT(!has_property_ || !HolderIsReceiver());
// Can only be called when the receiver is a JSObject. JSProxy has to be
// handled via a trap. Adding properties to primitive values is not
// observable.
Handle<JSObject> receiver = Handle<JSObject>::cast(GetReceiver());
// Properties have to be added to context extension objects through
// SetOwnPropertyIgnoreAttributes.
ASSERT(!receiver->IsJSContextExtensionObject());
if (receiver->IsJSGlobalProxy()) {
PrototypeIterator iter(isolate(), receiver);
receiver =
Handle<JSGlobalObject>::cast(PrototypeIterator::GetCurrent(iter));
}
maybe_holder_ = receiver;
holder_map_ = Map::TransitionToDataProperty(handle(receiver->map()), name_,
value, attributes, store_mode);
JSObject::MigrateToMap(receiver, holder_map_);
// Reload the information.
state_ = NOT_FOUND;
configuration_ = CHECK_OWN_REAL;
state_ = LookupInHolder();
ASSERT(IsFound());
HasProperty();
}
bool LookupIterator::HolderIsReceiver() const {
ASSERT(has_property_ || state_ == INTERCEPTOR || state_ == JSPROXY);
DisallowHeapAllocation no_gc;
Handle<Object> receiver = GetReceiver();
if (!receiver->IsJSReceiver()) return false;
Object* current = *receiver;
JSReceiver* holder = *maybe_holder_.ToHandleChecked();
// JSProxy do not occur as hidden prototypes.
if (current->IsJSProxy()) {
return JSReceiver::cast(current) == holder;
}
PrototypeIterator iter(isolate(), current,
PrototypeIterator::START_AT_RECEIVER);
do {
if (JSReceiver::cast(iter.GetCurrent()) == holder) return true;
ASSERT(!current->IsJSProxy());
iter.Advance();
} while (!iter.IsAtEnd(PrototypeIterator::END_AT_NON_HIDDEN));
return false;
}
Handle<Object> LookupIterator::FetchValue() const { Handle<Object> LookupIterator::FetchValue() const {
Object* result = NULL; Object* result = NULL;
switch (property_encoding_) { switch (property_encoding_) {
...@@ -181,4 +253,29 @@ Handle<Object> LookupIterator::GetDataValue() const { ...@@ -181,4 +253,29 @@ Handle<Object> LookupIterator::GetDataValue() const {
} }
void LookupIterator::WriteDataValue(Handle<Object> value) {
ASSERT(is_guaranteed_to_have_holder());
ASSERT(has_property_);
if (property_encoding_ == DICTIONARY) {
Handle<JSObject> holder = GetHolder();
NameDictionary* property_dictionary = holder->property_dictionary();
if (holder->IsGlobalObject()) {
Handle<PropertyCell> cell(
PropertyCell::cast(property_dictionary->ValueAt(number_)));
PropertyCell::SetValueInferType(cell, value);
} else {
property_dictionary->ValueAtPut(number_, *value);
}
} else if (property_details_.type() == v8::internal::FIELD) {
GetHolder()->WriteToField(number_, *value);
} else {
ASSERT_EQ(v8::internal::CONSTANT, property_details_.type());
}
}
void LookupIterator::InternalizeName() {
if (name_->IsUniqueName()) return;
name_ = factory()->InternalizeString(Handle<String>::cast(name_));
}
} } // namespace v8::internal } } // namespace v8::internal
...@@ -92,11 +92,13 @@ class LookupIterator V8_FINAL BASE_EMBEDDED { ...@@ -92,11 +92,13 @@ class LookupIterator V8_FINAL BASE_EMBEDDED {
Handle<Object> GetReceiver() const { Handle<Object> GetReceiver() const {
return Handle<Object>::cast(maybe_receiver_.ToHandleChecked()); return Handle<Object>::cast(maybe_receiver_.ToHandleChecked());
} }
Handle<Map> holder_map() const { return holder_map_; }
Handle<JSObject> GetHolder() const { Handle<JSObject> GetHolder() const {
ASSERT(IsFound() && state_ != JSPROXY); ASSERT(IsFound() && state_ != JSPROXY);
return Handle<JSObject>::cast(maybe_holder_.ToHandleChecked()); return Handle<JSObject>::cast(maybe_holder_.ToHandleChecked());
} }
Handle<JSReceiver> GetRoot() const; Handle<JSReceiver> GetRoot() const;
bool HolderIsReceiver() const;
/* Dynamically reduce the trapped types. */ /* Dynamically reduce the trapped types. */
void skip_interceptor() { void skip_interceptor() {
...@@ -116,6 +118,10 @@ class LookupIterator V8_FINAL BASE_EMBEDDED { ...@@ -116,6 +118,10 @@ class LookupIterator V8_FINAL BASE_EMBEDDED {
// below can be used. It ensures that we are able to provide a definite // below can be used. It ensures that we are able to provide a definite
// answer, and loads extra information about the property. // answer, and loads extra information about the property.
bool HasProperty(); bool HasProperty();
void PrepareForDataProperty(Handle<Object> value);
void TransitionToDataProperty(Handle<Object> value,
PropertyAttributes attributes,
Object::StoreFromKeyed store_mode);
PropertyKind property_kind() const { PropertyKind property_kind() const {
ASSERT(has_property_); ASSERT(has_property_);
return property_kind_; return property_kind_;
...@@ -124,11 +130,18 @@ class LookupIterator V8_FINAL BASE_EMBEDDED { ...@@ -124,11 +130,18 @@ class LookupIterator V8_FINAL BASE_EMBEDDED {
ASSERT(has_property_); ASSERT(has_property_);
return property_details_; return property_details_;
} }
int descriptor_number() const {
ASSERT(has_property_);
ASSERT_EQ(DESCRIPTOR, property_encoding_);
return number_;
}
Handle<Object> GetAccessors() const; Handle<Object> GetAccessors() const;
Handle<Object> GetDataValue() const; Handle<Object> GetDataValue() const;
void WriteDataValue(Handle<Object> value);
/* JSPROXY */ void InternalizeName();
/* JSPROXY */
Handle<JSProxy> GetJSProxy() const { Handle<JSProxy> GetJSProxy() const {
return Handle<JSProxy>::cast(maybe_holder_.ToHandleChecked()); return Handle<JSProxy>::cast(maybe_holder_.ToHandleChecked());
} }
......
...@@ -2079,23 +2079,12 @@ bool JSObject::HasFastProperties() { ...@@ -2079,23 +2079,12 @@ bool JSObject::HasFastProperties() {
} }
bool JSObject::TooManyFastProperties(StoreFromKeyed store_mode) { bool Map::TooManyFastProperties(StoreFromKeyed store_mode) {
// Allow extra fast properties if the object has more than if (unused_property_fields() != 0) return false;
// kFastPropertiesSoftLimit in-object properties. When this is the case, it is int minimum = store_mode == CERTAINLY_NOT_STORE_FROM_KEYED ? 128 : 12;
// very unlikely that the object is being used as a dictionary and there is a int limit = Max(minimum, inobject_properties());
// good chance that allowing more map transitions will be worth it. int external = NumberOfFields() - inobject_properties();
Map* map = this->map(); return external > limit;
if (map->unused_property_fields() != 0) return false;
int inobject = map->inobject_properties();
int limit;
if (store_mode == CERTAINLY_NOT_STORE_FROM_KEYED) {
limit = Max(inobject, kMaxFastProperties);
} else {
limit = Max(inobject, kFastPropertiesSoftLimit);
}
return properties()->length() > limit;
} }
......
This diff is collapsed.
...@@ -1375,6 +1375,13 @@ class Object { ...@@ -1375,6 +1375,13 @@ class Object {
HEAP_OBJECT_TYPE_LIST(IS_TYPE_FUNCTION_DECL) HEAP_OBJECT_TYPE_LIST(IS_TYPE_FUNCTION_DECL)
#undef IS_TYPE_FUNCTION_DECL #undef IS_TYPE_FUNCTION_DECL
// A non-keyed store is of the form a.x = foo or a["x"] = foo whereas
// a keyed store is of the form a[expression] = foo.
enum StoreFromKeyed {
MAY_BE_STORE_FROM_KEYED,
CERTAINLY_NOT_STORE_FROM_KEYED
};
INLINE(bool IsFixedArrayBase() const); INLINE(bool IsFixedArrayBase() const);
INLINE(bool IsExternal() const); INLINE(bool IsExternal() const);
INLINE(bool IsAccessorInfo() const); INLINE(bool IsAccessorInfo() const);
...@@ -1476,6 +1483,16 @@ class Object { ...@@ -1476,6 +1483,16 @@ class Object {
void Lookup(Handle<Name> name, LookupResult* result); void Lookup(Handle<Name> name, LookupResult* result);
MUST_USE_RESULT static MaybeHandle<Object> GetProperty(LookupIterator* it); MUST_USE_RESULT static MaybeHandle<Object> GetProperty(LookupIterator* it);
MUST_USE_RESULT static MaybeHandle<Object> SetProperty(
LookupIterator* it, Handle<Object> value, StrictMode strict_mode,
StoreFromKeyed store_mode);
MUST_USE_RESULT static MaybeHandle<Object> WriteToReadOnlyProperty(
LookupIterator* it, Handle<Object> value, StrictMode strict_mode);
MUST_USE_RESULT static MaybeHandle<Object> SetDataProperty(
LookupIterator* it, Handle<Object> value);
MUST_USE_RESULT static MaybeHandle<Object> AddDataProperty(
LookupIterator* it, Handle<Object> value, PropertyAttributes attributes,
StrictMode strict_mode, StoreFromKeyed store_mode);
MUST_USE_RESULT static inline MaybeHandle<Object> GetPropertyOrElement( MUST_USE_RESULT static inline MaybeHandle<Object> GetPropertyOrElement(
Handle<Object> object, Handle<Object> object,
Handle<Name> key); Handle<Name> key);
...@@ -1492,12 +1509,9 @@ class Object { ...@@ -1492,12 +1509,9 @@ class Object {
Handle<Name> name, Handle<Name> name,
Handle<JSObject> holder, Handle<JSObject> holder,
Handle<Object> structure); Handle<Object> structure);
MUST_USE_RESULT static MaybeHandle<Object> SetPropertyWithCallback( MUST_USE_RESULT static MaybeHandle<Object> SetPropertyWithAccessor(
Handle<Object> receiver, Handle<Object> receiver, Handle<Name> name, Handle<Object> value,
Handle<Name> name, Handle<JSObject> holder, Handle<Object> structure,
Handle<Object> value,
Handle<JSObject> holder,
Handle<Object> structure,
StrictMode strict_mode); StrictMode strict_mode);
MUST_USE_RESULT static MaybeHandle<Object> GetPropertyWithDefinedGetter( MUST_USE_RESULT static MaybeHandle<Object> GetPropertyWithDefinedGetter(
...@@ -1918,13 +1932,6 @@ class JSReceiver: public HeapObject { ...@@ -1918,13 +1932,6 @@ class JSReceiver: public HeapObject {
FORCE_DELETION FORCE_DELETION
}; };
// A non-keyed store is of the form a.x = foo or a["x"] = foo whereas
// a keyed store is of the form a[expression] = foo.
enum StoreFromKeyed {
MAY_BE_STORE_FROM_KEYED,
CERTAINLY_NOT_STORE_FROM_KEYED
};
// Internal properties (e.g. the hidden properties dictionary) might // Internal properties (e.g. the hidden properties dictionary) might
// be added even though the receiver is non-extensible. // be added even though the receiver is non-extensible.
enum ExtensibilityCheck { enum ExtensibilityCheck {
...@@ -2136,18 +2143,7 @@ class JSObject: public JSReceiver { ...@@ -2136,18 +2143,7 @@ class JSObject: public JSReceiver {
uint32_t limit); uint32_t limit);
MUST_USE_RESULT static MaybeHandle<Object> SetPropertyWithInterceptor( MUST_USE_RESULT static MaybeHandle<Object> SetPropertyWithInterceptor(
Handle<JSObject> object, LookupIterator* it, Handle<Object> value);
Handle<Name> name,
Handle<Object> value,
StrictMode strict_mode);
MUST_USE_RESULT static MaybeHandle<Object> SetPropertyForResult(
Handle<JSObject> object,
LookupResult* result,
Handle<Name> name,
Handle<Object> value,
StrictMode strict_mode,
StoreFromKeyed store_mode = MAY_BE_STORE_FROM_KEYED);
// SetLocalPropertyIgnoreAttributes converts callbacks to fields. We need to // SetLocalPropertyIgnoreAttributes converts callbacks to fields. We need to
// grant an exemption to ExecutableAccessor callbacks in some cases. // grant an exemption to ExecutableAccessor callbacks in some cases.
...@@ -2573,12 +2569,6 @@ class JSObject: public JSReceiver { ...@@ -2573,12 +2569,6 @@ class JSObject: public JSReceiver {
Object* SlowReverseLookup(Object* value); Object* SlowReverseLookup(Object* value);
// Maximal number of fast properties for the JSObject. Used to
// restrict the number of map transitions to avoid an explosion in
// the number of maps for objects used as dictionaries.
inline bool TooManyFastProperties(
StoreFromKeyed store_mode = MAY_BE_STORE_FROM_KEYED);
// Maximal number of elements (numbered 0 .. kMaxElementCount - 1). // Maximal number of elements (numbered 0 .. kMaxElementCount - 1).
// Also maximal value of JSArray's length property. // Also maximal value of JSArray's length property.
static const uint32_t kMaxElementCount = 0xffffffffu; static const uint32_t kMaxElementCount = 0xffffffffu;
...@@ -2606,8 +2596,6 @@ class JSObject: public JSReceiver { ...@@ -2606,8 +2596,6 @@ class JSObject: public JSReceiver {
// "global.Object" and not to arbitrary other JSObject maps. // "global.Object" and not to arbitrary other JSObject maps.
static const int kInitialGlobalObjectUnusedPropertiesCount = 4; static const int kInitialGlobalObjectUnusedPropertiesCount = 4;
static const int kFastPropertiesSoftLimit = 12;
static const int kMaxFastProperties = 128;
static const int kMaxInstanceSize = 255 * kPointerSize; static const int kMaxInstanceSize = 255 * kPointerSize;
// When extending the backing storage for property values, we increase // When extending the backing storage for property values, we increase
// its size by more than the 1 entry necessary, so sequentially adding fields // its size by more than the 1 entry necessary, so sequentially adding fields
...@@ -2734,21 +2722,6 @@ class JSObject: public JSReceiver { ...@@ -2734,21 +2722,6 @@ class JSObject: public JSReceiver {
StrictMode strict_mode, StrictMode strict_mode,
bool check_prototype = true); bool check_prototype = true);
// Searches the prototype chain for property 'name'. If it is found and
// has a setter, invoke it and set '*done' to true. If it is found and is
// read-only, reject and set '*done' to true. Otherwise, set '*done' to
// false. Can throw and return an empty handle with '*done==true'.
MUST_USE_RESULT static MaybeHandle<Object> SetPropertyViaPrototypes(
Handle<JSObject> object,
Handle<Name> name,
Handle<Object> value,
StrictMode strict_mode,
bool* done);
MUST_USE_RESULT static MaybeHandle<Object> SetPropertyPostInterceptor(
Handle<JSObject> object,
Handle<Name> name,
Handle<Object> value,
StrictMode strict_mode);
MUST_USE_RESULT static MaybeHandle<Object> SetPropertyUsingTransition( MUST_USE_RESULT static MaybeHandle<Object> SetPropertyUsingTransition(
Handle<JSObject> object, Handle<JSObject> object,
LookupResult* lookup, LookupResult* lookup,
...@@ -2756,12 +2729,7 @@ class JSObject: public JSReceiver { ...@@ -2756,12 +2729,7 @@ class JSObject: public JSReceiver {
Handle<Object> value, Handle<Object> value,
PropertyAttributes attributes); PropertyAttributes attributes);
MUST_USE_RESULT static MaybeHandle<Object> SetPropertyWithFailedAccessCheck( MUST_USE_RESULT static MaybeHandle<Object> SetPropertyWithFailedAccessCheck(
Handle<JSObject> object, LookupIterator* it, Handle<Object> value, StrictMode strict_mode);
LookupResult* result,
Handle<Name> name,
Handle<Object> value,
bool check_prototype,
StrictMode strict_mode);
// Add a property to an object. // Add a property to an object.
MUST_USE_RESULT static MaybeHandle<Object> AddPropertyInternal( MUST_USE_RESULT static MaybeHandle<Object> AddPropertyInternal(
...@@ -3452,6 +3420,8 @@ class DescriptorArray: public FixedArray { ...@@ -3452,6 +3420,8 @@ class DescriptorArray: public FixedArray {
FixedArray* new_cache, FixedArray* new_cache,
Object* new_index_cache); Object* new_index_cache);
bool CanHoldValue(int descriptor, Object* value);
// Accessors for fetching instance descriptor at descriptor number. // Accessors for fetching instance descriptor at descriptor number.
inline Name* GetKey(int descriptor_number); inline Name* GetKey(int descriptor_number);
inline Object** GetKeySlot(int descriptor_number); inline Object** GetKeySlot(int descriptor_number);
...@@ -6334,6 +6304,10 @@ class Map: public HeapObject { ...@@ -6334,6 +6304,10 @@ class Map: public HeapObject {
StoreMode store_mode, StoreMode store_mode,
const char* reason); const char* reason);
static Handle<Map> PrepareForDataProperty(Handle<Map> old_map,
int descriptor_number,
Handle<Object> value);
static Handle<Map> Normalize(Handle<Map> map, PropertyNormalizationMode mode); static Handle<Map> Normalize(Handle<Map> map, PropertyNormalizationMode mode);
// Returns the constructor name (the name (possibly, inferred name) of the // Returns the constructor name (the name (possibly, inferred name) of the
...@@ -6526,6 +6500,15 @@ class Map: public HeapObject { ...@@ -6526,6 +6500,15 @@ class Map: public HeapObject {
static Handle<Map> CopyForObserved(Handle<Map> map); static Handle<Map> CopyForObserved(Handle<Map> map);
static Handle<Map> CopyForFreeze(Handle<Map> map); static Handle<Map> CopyForFreeze(Handle<Map> map);
// Maximal number of fast properties. Used to restrict the number of map
// transitions to avoid an explosion in the number of maps for objects used as
// dictionaries.
inline bool TooManyFastProperties(StoreFromKeyed store_mode);
static Handle<Map> TransitionToDataProperty(Handle<Map> map,
Handle<Name> name,
Handle<Object> value,
PropertyAttributes attributes,
StoreFromKeyed store_mode);
inline void AppendDescriptor(Descriptor* desc); inline void AppendDescriptor(Descriptor* desc);
...@@ -6834,6 +6817,9 @@ class Map: public HeapObject { ...@@ -6834,6 +6817,9 @@ class Map: public HeapObject {
Handle<Object> prototype, Handle<Object> prototype,
Handle<Map> target_map); Handle<Map> target_map);
static const int kFastPropertiesSoftLimit = 12;
static const int kMaxFastProperties = 128;
DISALLOW_IMPLICIT_CONSTRUCTORS(Map); DISALLOW_IMPLICIT_CONSTRUCTORS(Map);
}; };
...@@ -9968,12 +9954,8 @@ class JSProxy: public JSReceiver { ...@@ -9968,12 +9954,8 @@ class JSProxy: public JSReceiver {
// otherwise set it to false. // otherwise set it to false.
MUST_USE_RESULT MUST_USE_RESULT
static MaybeHandle<Object> SetPropertyViaPrototypesWithHandler( static MaybeHandle<Object> SetPropertyViaPrototypesWithHandler(
Handle<JSProxy> proxy, Handle<JSProxy> proxy, Handle<Object> receiver, Handle<Name> name,
Handle<JSReceiver> receiver, Handle<Object> value, StrictMode strict_mode, bool* done);
Handle<Name> name,
Handle<Object> value,
StrictMode strict_mode,
bool* done);
static PropertyAttributes GetPropertyAttributesWithHandler( static PropertyAttributes GetPropertyAttributesWithHandler(
Handle<JSProxy> proxy, Handle<JSProxy> proxy,
...@@ -9983,6 +9965,9 @@ class JSProxy: public JSReceiver { ...@@ -9983,6 +9965,9 @@ class JSProxy: public JSReceiver {
Handle<JSProxy> proxy, Handle<JSProxy> proxy,
Handle<JSReceiver> receiver, Handle<JSReceiver> receiver,
uint32_t index); uint32_t index);
MUST_USE_RESULT static MaybeHandle<Object> SetPropertyWithHandler(
Handle<JSProxy> proxy, Handle<Object> receiver, Handle<Name> name,
Handle<Object> value, StrictMode strict_mode);
// Turn the proxy into an (empty) JSObject. // Turn the proxy into an (empty) JSObject.
static void Fix(Handle<JSProxy> proxy); static void Fix(Handle<JSProxy> proxy);
...@@ -10022,12 +10007,6 @@ class JSProxy: public JSReceiver { ...@@ -10022,12 +10007,6 @@ class JSProxy: public JSReceiver {
private: private:
friend class JSReceiver; friend class JSReceiver;
MUST_USE_RESULT static MaybeHandle<Object> SetPropertyWithHandler(
Handle<JSProxy> proxy,
Handle<JSReceiver> receiver,
Handle<Name> name,
Handle<Object> value,
StrictMode strict_mode);
MUST_USE_RESULT static inline MaybeHandle<Object> SetElementWithHandler( MUST_USE_RESULT static inline MaybeHandle<Object> SetElementWithHandler(
Handle<JSProxy> proxy, Handle<JSProxy> proxy,
Handle<JSReceiver> receiver, Handle<JSReceiver> receiver,
......
...@@ -581,8 +581,8 @@ RUNTIME_FUNCTION(StoreInterceptorProperty) { ...@@ -581,8 +581,8 @@ RUNTIME_FUNCTION(StoreInterceptorProperty) {
ASSERT(receiver->HasNamedInterceptor()); ASSERT(receiver->HasNamedInterceptor());
Handle<Object> result; Handle<Object> result;
ASSIGN_RETURN_FAILURE_ON_EXCEPTION( ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
isolate, result, JSObject::SetPropertyWithInterceptor( isolate, result,
receiver, name, value, ic.strict_mode())); JSObject::SetProperty(receiver, name, value, ic.strict_mode()));
return *result; return *result;
} }
......
...@@ -1322,7 +1322,9 @@ function ObjectIsSealed(obj) { ...@@ -1322,7 +1322,9 @@ function ObjectIsSealed(obj) {
for (var i = 0; i < names.length; i++) { for (var i = 0; i < names.length; i++) {
var name = names[i]; var name = names[i];
var desc = GetOwnPropertyJS(obj, name); var desc = GetOwnPropertyJS(obj, name);
if (desc.isConfigurable()) return false; if (desc.isConfigurable()) {
return false;
}
} }
return true; return true;
} }
......
...@@ -423,11 +423,8 @@ TEST(ExistsInPrototype) { ...@@ -423,11 +423,8 @@ TEST(ExistsInPrototype) {
// Sanity check to make sure that the holder of the interceptor // Sanity check to make sure that the holder of the interceptor
// really is the prototype object. // really is the prototype object.
{ ExistsInPrototypeContext context; { ExistsInPrototypeContext context;
context.Check("this.x = 87; this.x", context.Check("this.x = 87; this.x", 0, 0, 1, EXPECT_RESULT,
0, Number::New(CcTest::isolate(), 87));
0,
0,
EXPECT_RESULT, Number::New(CcTest::isolate(), 87));
} }
{ ExistsInPrototypeContext context; { ExistsInPrototypeContext context;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment