Commit 8d62d4be authored by Frank Emrich's avatar Frank Emrich Committed by Commit Bot

[dict-proto] Rollout of SwissNameDictionary in CSA

This CL evokes that when v8_dict_mode_prototypes is enabled,
SwissNameDictionary is used in CSA as the dictionary backing store
for all objects (instead of NameDictionary).

Bug: v8:11330
Change-Id: I2bda0ec60040981f07e0e51aaf772ac1bb8bbc06
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2786856Reviewed-by: 's avatarIgor Sheludko <ishell@chromium.org>
Commit-Queue: Igor Sheludko <ishell@chromium.org>
Cr-Commit-Position: refs/heads/master@{#73690}
parent e292db5d
...@@ -537,7 +537,7 @@ TNode<HeapObject> ConstructorBuiltinsAssembler::CreateShallowObjectLiteral( ...@@ -537,7 +537,7 @@ TNode<HeapObject> ConstructorBuiltinsAssembler::CreateShallowObjectLiteral(
TNode<Map> boilerplate_map = LoadMap(boilerplate); TNode<Map> boilerplate_map = LoadMap(boilerplate);
CSA_ASSERT(this, IsJSObjectMap(boilerplate_map)); CSA_ASSERT(this, IsJSObjectMap(boilerplate_map));
TVARIABLE(FixedArray, var_properties); TVARIABLE(HeapObject, var_properties);
{ {
TNode<Uint32T> bit_field_3 = LoadMapBitField3(boilerplate_map); TNode<Uint32T> bit_field_3 = LoadMapBitField3(boilerplate_map);
GotoIf(IsSetWord32<Map::Bits3::IsDeprecatedBit>(bit_field_3), call_runtime); GotoIf(IsSetWord32<Map::Bits3::IsDeprecatedBit>(bit_field_3), call_runtime);
...@@ -547,14 +547,14 @@ TNode<HeapObject> ConstructorBuiltinsAssembler::CreateShallowObjectLiteral( ...@@ -547,14 +547,14 @@ TNode<HeapObject> ConstructorBuiltinsAssembler::CreateShallowObjectLiteral(
&if_dictionary, &if_fast); &if_dictionary, &if_fast);
BIND(&if_dictionary); BIND(&if_dictionary);
{ {
Comment("Copy dictionary properties");
if (V8_DICT_MODE_PROTOTYPES_BOOL) { if (V8_DICT_MODE_PROTOTYPES_BOOL) {
// TODO(v8:11167) remove once SwissNameDictionary supported. var_properties =
GotoIf(Int32TrueConstant(), call_runtime); CopySwissNameDictionary(CAST(LoadSlowProperties(boilerplate)));
} else {
var_properties = CopyNameDictionary(
CAST(LoadSlowProperties(boilerplate)), call_runtime);
} }
Comment("Copy dictionary properties");
var_properties = CopyNameDictionary(CAST(LoadSlowProperties(boilerplate)),
call_runtime);
// Slow objects have no in-object properties. // Slow objects have no in-object properties.
Goto(&done); Goto(&done);
} }
......
...@@ -521,11 +521,6 @@ TF_BUILTIN(DeleteProperty, DeletePropertyBaseAssembler) { ...@@ -521,11 +521,6 @@ TF_BUILTIN(DeleteProperty, DeletePropertyBaseAssembler) {
Label if_index(this, &var_index), if_unique_name(this), if_notunique(this), Label if_index(this, &var_index), if_unique_name(this), if_notunique(this),
if_notfound(this), slow(this), if_proxy(this); if_notfound(this), slow(this), if_proxy(this);
if (V8_DICT_MODE_PROTOTYPES_BOOL) {
// TODO(v8:11167) remove once SwissNameDictionary supported.
GotoIf(Int32TrueConstant(), &slow);
}
GotoIf(TaggedIsSmi(receiver), &slow); GotoIf(TaggedIsSmi(receiver), &slow);
TNode<Map> receiver_map = LoadMap(CAST(receiver)); TNode<Map> receiver_map = LoadMap(CAST(receiver));
TNode<Uint16T> instance_type = LoadMapInstanceType(receiver_map); TNode<Uint16T> instance_type = LoadMapInstanceType(receiver_map);
...@@ -556,7 +551,7 @@ TF_BUILTIN(DeleteProperty, DeletePropertyBaseAssembler) { ...@@ -556,7 +551,7 @@ TF_BUILTIN(DeleteProperty, DeletePropertyBaseAssembler) {
{ {
InvalidateValidityCellIfPrototype(receiver_map); InvalidateValidityCellIfPrototype(receiver_map);
TNode<NameDictionary> properties = TNode<PropertyDictionary> properties =
CAST(LoadSlowProperties(CAST(receiver))); CAST(LoadSlowProperties(CAST(receiver)));
DeleteDictionaryProperty(CAST(receiver), properties, var_unique.value(), DeleteDictionaryProperty(CAST(receiver), properties, var_unique.value(),
context, &dont_delete, &if_notfound); context, &dont_delete, &if_notfound);
...@@ -991,11 +986,6 @@ TF_BUILTIN(GetProperty, CodeStubAssembler) { ...@@ -991,11 +986,6 @@ TF_BUILTIN(GetProperty, CodeStubAssembler) {
Label if_notfound(this), if_proxy(this, Label::kDeferred), Label if_notfound(this), if_proxy(this, Label::kDeferred),
if_slow(this, Label::kDeferred); if_slow(this, Label::kDeferred);
if (V8_DICT_MODE_PROTOTYPES_BOOL) {
// TODO(v8:11167) remove once SwissNameDictionary supported.
GotoIf(Int32TrueConstant(), &if_slow);
}
CodeStubAssembler::LookupPropertyInHolder lookup_property_in_holder = CodeStubAssembler::LookupPropertyInHolder lookup_property_in_holder =
[=](TNode<HeapObject> receiver, TNode<HeapObject> holder, [=](TNode<HeapObject> receiver, TNode<HeapObject> holder,
TNode<Map> holder_map, TNode<Int32T> holder_instance_type, TNode<Map> holder_map, TNode<Int32T> holder_instance_type,
...@@ -1051,11 +1041,6 @@ TF_BUILTIN(GetPropertyWithReceiver, CodeStubAssembler) { ...@@ -1051,11 +1041,6 @@ TF_BUILTIN(GetPropertyWithReceiver, CodeStubAssembler) {
Label if_notfound(this), if_proxy(this, Label::kDeferred), Label if_notfound(this), if_proxy(this, Label::kDeferred),
if_slow(this, Label::kDeferred); if_slow(this, Label::kDeferred);
if (V8_DICT_MODE_PROTOTYPES_BOOL) {
// TODO(v8:11167) remove once SwissNameDictionary supported.
GotoIf(Int32TrueConstant(), &if_slow);
}
CodeStubAssembler::LookupPropertyInHolder lookup_property_in_holder = CodeStubAssembler::LookupPropertyInHolder lookup_property_in_holder =
[=](TNode<HeapObject> receiver, TNode<HeapObject> holder, [=](TNode<HeapObject> receiver, TNode<HeapObject> holder,
TNode<Map> holder_map, TNode<Int32T> holder_instance_type, TNode<Map> holder_map, TNode<Int32T> holder_instance_type,
......
...@@ -1033,11 +1033,6 @@ TF_BUILTIN(ObjectCreate, ObjectBuiltinsAssembler) { ...@@ -1033,11 +1033,6 @@ TF_BUILTIN(ObjectCreate, ObjectBuiltinsAssembler) {
Label call_runtime(this, Label::kDeferred), prototype_valid(this), Label call_runtime(this, Label::kDeferred), prototype_valid(this),
no_properties(this); no_properties(this);
if (V8_DICT_MODE_PROTOTYPES_BOOL) {
// TODO(v8:11167) remove once SwissNameDictionary supported.
GotoIf(Int32TrueConstant(), &call_runtime);
}
{ {
Comment("Argument 1 check: prototype"); Comment("Argument 1 check: prototype");
GotoIf(IsNull(prototype), &prototype_valid); GotoIf(IsNull(prototype), &prototype_valid);
...@@ -1284,10 +1279,6 @@ TF_BUILTIN(ObjectGetOwnPropertyDescriptor, ObjectBuiltinsAssembler) { ...@@ -1284,10 +1279,6 @@ TF_BUILTIN(ObjectGetOwnPropertyDescriptor, ObjectBuiltinsAssembler) {
Label if_keyisindex(this), if_iskeyunique(this), Label if_keyisindex(this), if_iskeyunique(this),
call_runtime(this, Label::kDeferred), call_runtime(this, Label::kDeferred),
return_undefined(this, Label::kDeferred), if_notunique_name(this); return_undefined(this, Label::kDeferred), if_notunique_name(this);
if (V8_DICT_MODE_PROTOTYPES_BOOL) {
// TODO(v8:11167) remove once SwissNameDictionary supported.
GotoIf(Int32TrueConstant(), &call_runtime);
}
TNode<Map> map = LoadMap(object); TNode<Map> map = LoadMap(object);
TNode<Uint16T> instance_type = LoadMapInstanceType(map); TNode<Uint16T> instance_type = LoadMapInstanceType(map);
...@@ -1371,14 +1362,8 @@ void ObjectBuiltinsAssembler::AddToDictionaryIf( ...@@ -1371,14 +1362,8 @@ void ObjectBuiltinsAssembler::AddToDictionaryIf(
Label done(this); Label done(this);
GotoIfNot(condition, &done); GotoIfNot(condition, &done);
if (V8_DICT_MODE_PROTOTYPES_BOOL) { Add<PropertyDictionary>(CAST(name_dictionary), HeapConstant(name), value,
// TODO(v8:11167) remove once SwissNameDictionary supported. bailout);
CallRuntime(Runtime::kAddDictionaryProperty, context, object,
HeapConstant(name), value);
} else {
Add<NameDictionary>(CAST(name_dictionary), HeapConstant(name), value,
bailout);
}
Goto(&done); Goto(&done);
BIND(&done); BIND(&done);
...@@ -1479,12 +1464,9 @@ TNode<JSObject> ObjectBuiltinsAssembler::FromPropertyDescriptor( ...@@ -1479,12 +1464,9 @@ TNode<JSObject> ObjectBuiltinsAssembler::FromPropertyDescriptor(
js_descriptor = js_desc; js_descriptor = js_desc;
Goto(&return_desc); Goto(&return_desc);
if (!V8_DICT_MODE_PROTOTYPES_BOOL) { BIND(&bailout);
// TODO(v8:11167) make unconditional once SwissNameDictionary supported. CSA_ASSERT(this, Int32Constant(0));
BIND(&bailout); Unreachable();
CSA_ASSERT(this, Int32Constant(0));
Unreachable();
}
} }
BIND(&return_desc); BIND(&return_desc);
......
...@@ -363,28 +363,18 @@ TNode<JSRegExpResult> RegExpBuiltinsAssembler::ConstructNewResultFromMatchInfo( ...@@ -363,28 +363,18 @@ TNode<JSRegExpResult> RegExpBuiltinsAssembler::ConstructNewResultFromMatchInfo(
// - Receiver is extensible // - Receiver is extensible
// - Receiver has no interceptors // - Receiver has no interceptors
Label add_dictionary_property_slow(this, Label::kDeferred); Label add_dictionary_property_slow(this, Label::kDeferred);
if (V8_DICT_MODE_PROTOTYPES_BOOL) { Add<PropertyDictionary>(CAST(properties), name, capture,
// TODO(v8:11167) remove once SwissNameDictionary supported. &add_dictionary_property_slow);
CallRuntime(Runtime::kAddDictionaryProperty, context, group_object,
name, capture);
} else {
Add<NameDictionary>(CAST(properties), name, capture,
&add_dictionary_property_slow);
}
var_i = i_plus_2; var_i = i_plus_2;
Branch(IntPtrGreaterThanOrEqual(var_i.value(), names_length), Branch(IntPtrGreaterThanOrEqual(var_i.value(), names_length),
&maybe_build_indices, &loop); &maybe_build_indices, &loop);
if (!V8_DICT_MODE_PROTOTYPES_BOOL) { BIND(&add_dictionary_property_slow);
// TODO(v8:11167) make unconditional once SwissNameDictionary // If the dictionary needs resizing, the above Add call will jump here
// supported. // before making any changes. This shouldn't happen because we allocated
BIND(&add_dictionary_property_slow); // the dictionary with enough space above.
// If the dictionary needs resizing, the above Add call will jump here Unreachable();
// before making any changes. This shouldn't happen because we allocated
// the dictionary with enough space above.
Unreachable();
}
} }
} }
......
...@@ -8491,6 +8491,31 @@ void CodeStubAssembler::Add(TNode<Dictionary> dictionary, TNode<Name> key, ...@@ -8491,6 +8491,31 @@ void CodeStubAssembler::Add(TNode<Dictionary> dictionary, TNode<Name> key,
enum_index); enum_index);
} }
template <>
void CodeStubAssembler::Add(TNode<SwissNameDictionary> dictionary,
TNode<Name> key, TNode<Object> value,
Label* bailout) {
PropertyDetails d(kData, NONE,
PropertyDetails::kConstIfDictConstnessTracking);
PropertyDetails d_dont_enum(kData, DONT_ENUM,
PropertyDetails::kConstIfDictConstnessTracking);
TNode<Uint8T> details_byte_enum =
UncheckedCast<Uint8T>(Uint32Constant(d.ToByte()));
TNode<Uint8T> details_byte_dont_enum =
UncheckedCast<Uint8T>(Uint32Constant(d_dont_enum.ToByte()));
Label not_private(this);
TVARIABLE(Uint8T, var_details, details_byte_enum);
GotoIfNot(IsPrivateSymbol(key), &not_private);
var_details = details_byte_dont_enum;
Goto(&not_private);
BIND(&not_private);
SwissNameDictionaryAdd(dictionary, key, value, var_details.value(), bailout);
}
template void CodeStubAssembler::Add<NameDictionary>(TNode<NameDictionary>, template void CodeStubAssembler::Add<NameDictionary>(TNode<NameDictionary>,
TNode<Name>, TNode<Object>, TNode<Name>, TNode<Object>,
Label*); Label*);
...@@ -8505,9 +8530,10 @@ TNode<Smi> CodeStubAssembler::GetNumberOfElements( ...@@ -8505,9 +8530,10 @@ TNode<Smi> CodeStubAssembler::GetNumberOfElements(
template <> template <>
TNode<Smi> CodeStubAssembler::GetNumberOfElements( TNode<Smi> CodeStubAssembler::GetNumberOfElements(
TNode<SwissNameDictionary> dictionary) { TNode<SwissNameDictionary> dictionary) {
// TOOD(v8:11330) Dummy implementation until real version exists. TNode<IntPtrT> capacity =
return CallRuntime<Smi>(Runtime::kSwissTableElementsCount, ChangeInt32ToIntPtr(LoadSwissNameDictionaryCapacity(dictionary));
NoContextConstant(), dictionary); return SmiFromIntPtr(
LoadSwissNameDictionaryNumberOfElements(dictionary, capacity));
} }
template TNode<Smi> CodeStubAssembler::GetNumberOfElements( template TNode<Smi> CodeStubAssembler::GetNumberOfElements(
...@@ -8824,13 +8850,8 @@ void CodeStubAssembler::ForEachEnumerableOwnProperty( ...@@ -8824,13 +8850,8 @@ void CodeStubAssembler::ForEachEnumerableOwnProperty(
} }
BIND(&if_found_dict); BIND(&if_found_dict);
{ {
if (V8_DICT_MODE_PROTOTYPES_BOOL) { TNode<PropertyDictionary> dictionary =
// TODO(v8:11167, v8:11177) Only here due to SetDataProperties CAST(var_meta_storage.value());
// workaround.
GotoIf(Int32TrueConstant(), bailout);
}
TNode<NameDictionary> dictionary = CAST(var_meta_storage.value());
TNode<IntPtrT> entry = var_entry.value(); TNode<IntPtrT> entry = var_entry.value();
TNode<Uint32T> details = LoadDetailsByKeyIndex(dictionary, entry); TNode<Uint32T> details = LoadDetailsByKeyIndex(dictionary, entry);
...@@ -8840,7 +8861,8 @@ void CodeStubAssembler::ForEachEnumerableOwnProperty( ...@@ -8840,7 +8861,8 @@ void CodeStubAssembler::ForEachEnumerableOwnProperty(
&next_iteration); &next_iteration);
var_details = details; var_details = details;
var_value = LoadValueByKeyIndex<NameDictionary>(dictionary, entry); var_value =
LoadValueByKeyIndex<PropertyDictionary>(dictionary, entry);
Goto(&if_found); Goto(&if_found);
} }
...@@ -9029,19 +9051,11 @@ void CodeStubAssembler::TryLookupPropertyInSimpleObject( ...@@ -9029,19 +9051,11 @@ void CodeStubAssembler::TryLookupPropertyInSimpleObject(
} }
BIND(&if_isslowmap); BIND(&if_isslowmap);
{ {
if (V8_DICT_MODE_PROTOTYPES_BOOL) { TNode<PropertyDictionary> dictionary = CAST(LoadSlowProperties(object));
TNode<SwissNameDictionary> dictionary = CAST(LoadSlowProperties(object)); *var_meta_storage = dictionary;
*var_meta_storage = dictionary;
NameDictionaryLookup<SwissNameDictionary>(
dictionary, unique_name, if_found_dict, var_name_index, if_not_found);
} else {
TNode<NameDictionary> dictionary = CAST(LoadSlowProperties(object));
*var_meta_storage = dictionary;
NameDictionaryLookup<NameDictionary>( NameDictionaryLookup<PropertyDictionary>(
dictionary, unique_name, if_found_dict, var_name_index, if_not_found); dictionary, unique_name, if_found_dict, var_name_index, if_not_found);
}
} }
} }
...@@ -9265,8 +9279,9 @@ void CodeStubAssembler::LoadPropertyFromFastObject( ...@@ -9265,8 +9279,9 @@ void CodeStubAssembler::LoadPropertyFromFastObject(
Comment("] LoadPropertyFromFastObject"); Comment("] LoadPropertyFromFastObject");
} }
void CodeStubAssembler::LoadPropertyFromNameDictionary( template <typename Dictionary>
TNode<NameDictionary> dictionary, TNode<IntPtrT> name_index, void CodeStubAssembler::LoadPropertyFromDictionary(
TNode<Dictionary> dictionary, TNode<IntPtrT> name_index,
TVariable<Uint32T>* var_details, TVariable<Object>* var_value) { TVariable<Uint32T>* var_details, TVariable<Object>* var_value) {
Comment("LoadPropertyFromNameDictionary"); Comment("LoadPropertyFromNameDictionary");
*var_details = LoadDetailsByKeyIndex(dictionary, name_index); *var_details = LoadDetailsByKeyIndex(dictionary, name_index);
...@@ -9275,23 +9290,6 @@ void CodeStubAssembler::LoadPropertyFromNameDictionary( ...@@ -9275,23 +9290,6 @@ void CodeStubAssembler::LoadPropertyFromNameDictionary(
Comment("] LoadPropertyFromNameDictionary"); Comment("] LoadPropertyFromNameDictionary");
} }
void CodeStubAssembler::LoadPropertyFromSwissNameDictionary(
TNode<SwissNameDictionary> dictionary, TNode<IntPtrT> name_index,
TVariable<Uint32T>* var_details, TVariable<Object>* var_value) {
Comment("[ LoadPropertyFromSwissNameDictionary");
// TOOD(v8:11330) Dummy implementation until real version exists.
TNode<Smi> details =
CallRuntime<Smi>(Runtime::kSwissTableDetailsAt, NoContextConstant(),
dictionary, SmiFromIntPtr(name_index));
*var_details = Unsigned(SmiToInt32(details));
*var_value =
CallRuntime<Object>(Runtime::kSwissTableValueAt, NoContextConstant(),
dictionary, SmiFromIntPtr(name_index));
Comment("] LoadPropertyFromSwissNameDictionary");
}
void CodeStubAssembler::LoadPropertyFromGlobalDictionary( void CodeStubAssembler::LoadPropertyFromGlobalDictionary(
TNode<GlobalDictionary> dictionary, TNode<IntPtrT> name_index, TNode<GlobalDictionary> dictionary, TNode<IntPtrT> name_index,
TVariable<Uint32T>* var_details, TVariable<Object>* var_value, TVariable<Uint32T>* var_details, TVariable<Object>* var_value,
...@@ -9313,6 +9311,14 @@ void CodeStubAssembler::LoadPropertyFromGlobalDictionary( ...@@ -9313,6 +9311,14 @@ void CodeStubAssembler::LoadPropertyFromGlobalDictionary(
Comment("] LoadPropertyFromGlobalDictionary"); Comment("] LoadPropertyFromGlobalDictionary");
} }
template void CodeStubAssembler::LoadPropertyFromDictionary(
TNode<NameDictionary> dictionary, TNode<IntPtrT> name_index,
TVariable<Uint32T>* var_details, TVariable<Object>* var_value);
template void CodeStubAssembler::LoadPropertyFromDictionary(
TNode<SwissNameDictionary> dictionary, TNode<IntPtrT> name_index,
TVariable<Uint32T>* var_details, TVariable<Object>* var_value);
// |value| is the property backing store's contents, which is either a value or // |value| is the property backing store's contents, which is either a value or
// an accessor pair, as specified by |details|. |holder| is a JSObject or a // an accessor pair, as specified by |details|. |holder| is a JSObject or a
// PropertyCell (TODO: use UnionT). Returns either the original value, or the // PropertyCell (TODO: use UnionT). Returns either the original value, or the
...@@ -9475,16 +9481,9 @@ void CodeStubAssembler::TryGetOwnProperty( ...@@ -9475,16 +9481,9 @@ void CodeStubAssembler::TryGetOwnProperty(
} }
BIND(&if_found_dict); BIND(&if_found_dict);
{ {
if (V8_DICT_MODE_PROTOTYPES_BOOL) { TNode<PropertyDictionary> dictionary = CAST(var_meta_storage.value());
TNode<SwissNameDictionary> dictionary = CAST(var_meta_storage.value()); TNode<IntPtrT> entry = var_entry.value();
TNode<IntPtrT> entry = var_entry.value(); LoadPropertyFromDictionary(dictionary, entry, var_details, var_value);
LoadPropertyFromSwissNameDictionary(dictionary, entry, var_details,
var_value);
} else {
TNode<NameDictionary> dictionary = CAST(var_meta_storage.value());
TNode<IntPtrT> entry = var_entry.value();
LoadPropertyFromNameDictionary(dictionary, entry, var_details, var_value);
}
Goto(&if_found); Goto(&if_found);
} }
...@@ -12974,11 +12973,6 @@ TNode<Oddball> CodeStubAssembler::HasProperty(TNode<Context> context, ...@@ -12974,11 +12973,6 @@ TNode<Oddball> CodeStubAssembler::HasProperty(TNode<Context> context,
Label call_runtime(this, Label::kDeferred), return_true(this), Label call_runtime(this, Label::kDeferred), return_true(this),
return_false(this), end(this), if_proxy(this, Label::kDeferred); return_false(this), end(this), if_proxy(this, Label::kDeferred);
if (V8_DICT_MODE_PROTOTYPES_BOOL) {
// TODO(v8:11167) remove once SwissNameDictionary supported.
GotoIf(Int32TrueConstant(), &call_runtime);
}
CodeStubAssembler::LookupPropertyInHolder lookup_property_in_holder = CodeStubAssembler::LookupPropertyInHolder lookup_property_in_holder =
[this, &return_true]( [this, &return_true](
TNode<HeapObject> receiver, TNode<HeapObject> holder, TNode<HeapObject> receiver, TNode<HeapObject> holder,
......
...@@ -2869,12 +2869,18 @@ class V8_EXPORT_PRIVATE CodeStubAssembler ...@@ -2869,12 +2869,18 @@ class V8_EXPORT_PRIVATE CodeStubAssembler
template <class Dictionary> template <class Dictionary>
void SetNumberOfElements(TNode<Dictionary> dictionary, void SetNumberOfElements(TNode<Dictionary> dictionary,
TNode<Smi> num_elements_smi) { TNode<Smi> num_elements_smi) {
// Not supposed to be used for SwissNameDictionary.
STATIC_ASSERT(!(std::is_same<Dictionary, SwissNameDictionary>::value));
StoreFixedArrayElement(dictionary, Dictionary::kNumberOfElementsIndex, StoreFixedArrayElement(dictionary, Dictionary::kNumberOfElementsIndex,
num_elements_smi, SKIP_WRITE_BARRIER); num_elements_smi, SKIP_WRITE_BARRIER);
} }
template <class Dictionary> template <class Dictionary>
TNode<Smi> GetNumberOfDeletedElements(TNode<Dictionary> dictionary) { TNode<Smi> GetNumberOfDeletedElements(TNode<Dictionary> dictionary) {
// Not supposed to be used for SwissNameDictionary.
STATIC_ASSERT(!(std::is_same<Dictionary, SwissNameDictionary>::value));
return CAST(LoadFixedArrayElement( return CAST(LoadFixedArrayElement(
dictionary, Dictionary::kNumberOfDeletedElementsIndex)); dictionary, Dictionary::kNumberOfDeletedElementsIndex));
} }
...@@ -2882,6 +2888,9 @@ class V8_EXPORT_PRIVATE CodeStubAssembler ...@@ -2882,6 +2888,9 @@ class V8_EXPORT_PRIVATE CodeStubAssembler
template <class Dictionary> template <class Dictionary>
void SetNumberOfDeletedElements(TNode<Dictionary> dictionary, void SetNumberOfDeletedElements(TNode<Dictionary> dictionary,
TNode<Smi> num_deleted_smi) { TNode<Smi> num_deleted_smi) {
// Not supposed to be used for SwissNameDictionary.
STATIC_ASSERT(!(std::is_same<Dictionary, SwissNameDictionary>::value));
StoreFixedArrayElement(dictionary, StoreFixedArrayElement(dictionary,
Dictionary::kNumberOfDeletedElementsIndex, Dictionary::kNumberOfDeletedElementsIndex,
num_deleted_smi, SKIP_WRITE_BARRIER); num_deleted_smi, SKIP_WRITE_BARRIER);
...@@ -2889,6 +2898,9 @@ class V8_EXPORT_PRIVATE CodeStubAssembler ...@@ -2889,6 +2898,9 @@ class V8_EXPORT_PRIVATE CodeStubAssembler
template <class Dictionary> template <class Dictionary>
TNode<Smi> GetCapacity(TNode<Dictionary> dictionary) { TNode<Smi> GetCapacity(TNode<Dictionary> dictionary) {
// Not supposed to be used for SwissNameDictionary.
STATIC_ASSERT(!(std::is_same<Dictionary, SwissNameDictionary>::value));
return CAST( return CAST(
UnsafeLoadFixedArrayElement(dictionary, Dictionary::kCapacityIndex)); UnsafeLoadFixedArrayElement(dictionary, Dictionary::kCapacityIndex));
} }
...@@ -3029,13 +3041,11 @@ class V8_EXPORT_PRIVATE CodeStubAssembler ...@@ -3029,13 +3041,11 @@ class V8_EXPORT_PRIVATE CodeStubAssembler
TNode<IntPtrT> name_index, TNode<Uint32T>, TNode<IntPtrT> name_index, TNode<Uint32T>,
TVariable<Object>* var_value); TVariable<Object>* var_value);
void LoadPropertyFromNameDictionary(TNode<NameDictionary> dictionary, template <typename Dictionary>
TNode<IntPtrT> name_index, void LoadPropertyFromDictionary(TNode<Dictionary> dictionary,
TVariable<Uint32T>* var_details, TNode<IntPtrT> name_index,
TVariable<Object>* var_value); TVariable<Uint32T>* var_details,
void LoadPropertyFromSwissNameDictionary( TVariable<Object>* var_value);
TNode<SwissNameDictionary> dictionary, TNode<IntPtrT> name_index,
TVariable<Uint32T>* var_details, TVariable<Object>* var_value);
void LoadPropertyFromGlobalDictionary(TNode<GlobalDictionary> dictionary, void LoadPropertyFromGlobalDictionary(TNode<GlobalDictionary> dictionary,
TNode<IntPtrT> name_index, TNode<IntPtrT> name_index,
TVariable<Uint32T>* var_details, TVariable<Uint32T>* var_details,
......
...@@ -529,17 +529,18 @@ void AccessorAssembler::HandleLoadICSmiHandlerLoadNamedCase( ...@@ -529,17 +529,18 @@ void AccessorAssembler::HandleLoadICSmiHandlerLoadNamedCase(
BIND(&normal); BIND(&normal);
{ {
Comment("load_normal"); Comment("load_normal");
TNode<NameDictionary> properties = CAST(LoadSlowProperties(CAST(holder))); TNode<PropertyDictionary> properties =
CAST(LoadSlowProperties(CAST(holder)));
TVARIABLE(IntPtrT, var_name_index); TVARIABLE(IntPtrT, var_name_index);
Label found(this, &var_name_index); Label found(this, &var_name_index);
NameDictionaryLookup<NameDictionary>(properties, CAST(p->name()), &found, NameDictionaryLookup<PropertyDictionary>(properties, CAST(p->name()),
&var_name_index, miss); &found, &var_name_index, miss);
BIND(&found); BIND(&found);
{ {
TVARIABLE(Uint32T, var_details); TVARIABLE(Uint32T, var_details);
TVARIABLE(Object, var_value); TVARIABLE(Object, var_value);
LoadPropertyFromNameDictionary(properties, var_name_index.value(), LoadPropertyFromDictionary<PropertyDictionary>(
&var_details, &var_value); properties, var_name_index.value(), &var_details, &var_value);
TNode<Object> value = CallGetterIfAccessor( TNode<Object> value = CallGetterIfAccessor(
var_value.value(), CAST(holder), var_details.value(), p->context(), var_value.value(), CAST(holder), var_details.value(), p->context(),
p->receiver(), miss); p->receiver(), miss);
...@@ -740,11 +741,12 @@ void AccessorAssembler::HandleLoadICSmiHandlerHasNamedCase( ...@@ -740,11 +741,12 @@ void AccessorAssembler::HandleLoadICSmiHandlerHasNamedCase(
BIND(&normal); BIND(&normal);
{ {
Comment("has_normal"); Comment("has_normal");
TNode<NameDictionary> properties = CAST(LoadSlowProperties(CAST(holder))); TNode<PropertyDictionary> properties =
CAST(LoadSlowProperties(CAST(holder)));
TVARIABLE(IntPtrT, var_name_index); TVARIABLE(IntPtrT, var_name_index);
Label found(this); Label found(this);
NameDictionaryLookup<NameDictionary>(properties, CAST(p->name()), &found, NameDictionaryLookup<PropertyDictionary>(properties, CAST(p->name()),
&var_name_index, miss); &found, &var_name_index, miss);
BIND(&found); BIND(&found);
exit_point->Return(TrueConstant()); exit_point->Return(TrueConstant());
...@@ -859,11 +861,6 @@ TNode<Object> AccessorAssembler::HandleProtoHandler( ...@@ -859,11 +861,6 @@ TNode<Object> AccessorAssembler::HandleProtoHandler(
BIND(&if_lookup_on_lookup_start_object); BIND(&if_lookup_on_lookup_start_object);
{ {
if (V8_DICT_MODE_PROTOTYPES_BOOL) {
// TODO(v8:11167) remove once SwissNameDictionary supported.
GotoIf(Int32TrueConstant(), miss);
}
// Dictionary lookup on lookup start object is not necessary for // Dictionary lookup on lookup start object is not necessary for
// Load/StoreGlobalIC (which is the only case when the // Load/StoreGlobalIC (which is the only case when the
// lookup_start_object can be a JSGlobalObject) because prototype // lookup_start_object can be a JSGlobalObject) because prototype
...@@ -873,12 +870,12 @@ TNode<Object> AccessorAssembler::HandleProtoHandler( ...@@ -873,12 +870,12 @@ TNode<Object> AccessorAssembler::HandleProtoHandler(
Word32BinaryNot(HasInstanceType( Word32BinaryNot(HasInstanceType(
CAST(p->lookup_start_object()), JS_GLOBAL_OBJECT_TYPE))); CAST(p->lookup_start_object()), JS_GLOBAL_OBJECT_TYPE)));
TNode<NameDictionary> properties = TNode<PropertyDictionary> properties =
CAST(LoadSlowProperties(CAST(p->lookup_start_object()))); CAST(LoadSlowProperties(CAST(p->lookup_start_object())));
TVARIABLE(IntPtrT, var_name_index); TVARIABLE(IntPtrT, var_name_index);
Label found(this, &var_name_index); Label found(this, &var_name_index);
NameDictionaryLookup<NameDictionary>(properties, CAST(p->name()), NameDictionaryLookup<PropertyDictionary>(
&found, &var_name_index, &done); properties, CAST(p->name()), &found, &var_name_index, &done);
BIND(&found); BIND(&found);
{ {
if (on_found_on_lookup_start_object) { if (on_found_on_lookup_start_object) {
...@@ -905,14 +902,14 @@ void AccessorAssembler::HandleLoadICProtoHandler( ...@@ -905,14 +902,14 @@ void AccessorAssembler::HandleLoadICProtoHandler(
// Code sub-handlers are not expected in LoadICs, so no |on_code_handler|. // Code sub-handlers are not expected in LoadICs, so no |on_code_handler|.
nullptr, nullptr,
// on_found_on_lookup_start_object // on_found_on_lookup_start_object
[=](TNode<NameDictionary> properties, TNode<IntPtrT> name_index) { [=](TNode<PropertyDictionary> properties, TNode<IntPtrT> name_index) {
if (access_mode == LoadAccessMode::kHas) { if (access_mode == LoadAccessMode::kHas) {
exit_point->Return(TrueConstant()); exit_point->Return(TrueConstant());
} else { } else {
TVARIABLE(Uint32T, var_details); TVARIABLE(Uint32T, var_details);
TVARIABLE(Object, var_value); TVARIABLE(Object, var_value);
LoadPropertyFromNameDictionary(properties, name_index, &var_details, LoadPropertyFromDictionary<PropertyDictionary>(
&var_value); properties, name_index, &var_details, &var_value);
TNode<Object> value = CallGetterIfAccessor( TNode<Object> value = CallGetterIfAccessor(
var_value.value(), CAST(var_holder->value()), var_details.value(), var_value.value(), CAST(var_holder->value()), var_details.value(),
p->context(), p->receiver(), miss); p->context(), p->receiver(), miss);
...@@ -1051,11 +1048,12 @@ void AccessorAssembler::HandleStoreICHandlerCase( ...@@ -1051,11 +1048,12 @@ void AccessorAssembler::HandleStoreICHandlerCase(
&if_slow); &if_slow);
CSA_ASSERT(this, CSA_ASSERT(this,
Word32Equal(handler_kind, Int32Constant(StoreHandler::kNormal))); Word32Equal(handler_kind, Int32Constant(StoreHandler::kNormal)));
TNode<NameDictionary> properties = CAST(LoadSlowProperties(CAST(holder))); TNode<PropertyDictionary> properties =
CAST(LoadSlowProperties(CAST(holder)));
TVARIABLE(IntPtrT, var_name_index); TVARIABLE(IntPtrT, var_name_index);
Label dictionary_found(this, &var_name_index); Label dictionary_found(this, &var_name_index);
NameDictionaryLookup<NameDictionary>( NameDictionaryLookup<PropertyDictionary>(
properties, CAST(p->name()), &dictionary_found, &var_name_index, miss); properties, CAST(p->name()), &dictionary_found, &var_name_index, miss);
BIND(&dictionary_found); BIND(&dictionary_found);
{ {
...@@ -1072,8 +1070,8 @@ void AccessorAssembler::HandleStoreICHandlerCase( ...@@ -1072,8 +1070,8 @@ void AccessorAssembler::HandleStoreICHandlerCase(
GotoIf(IsPropertyDetailsConst(details), &if_constant); GotoIf(IsPropertyDetailsConst(details), &if_constant);
} }
StoreValueByKeyIndex<NameDictionary>(properties, var_name_index.value(), StoreValueByKeyIndex<PropertyDictionary>(
p->value()); properties, var_name_index.value(), p->value());
Return(p->value()); Return(p->value());
if (V8_DICT_PROPERTY_CONST_TRACKING_BOOL) { if (V8_DICT_PROPERTY_CONST_TRACKING_BOOL) {
...@@ -1552,7 +1550,7 @@ void AccessorAssembler::HandleStoreICProtoHandler( ...@@ -1552,7 +1550,7 @@ void AccessorAssembler::HandleStoreICProtoHandler(
TNode<Object> smi_handler = HandleProtoHandler<StoreHandler>( TNode<Object> smi_handler = HandleProtoHandler<StoreHandler>(
p, handler, on_code_handler, p, handler, on_code_handler,
// on_found_on_lookup_start_object // on_found_on_lookup_start_object
[=](TNode<NameDictionary> properties, TNode<IntPtrT> name_index) { [=](TNode<PropertyDictionary> properties, TNode<IntPtrT> name_index) {
TNode<Uint32T> details = LoadDetailsByKeyIndex(properties, name_index); TNode<Uint32T> details = LoadDetailsByKeyIndex(properties, name_index);
// Check that the property is a writable data property (no accessor). // Check that the property is a writable data property (no accessor).
const int kTypeAndReadOnlyMask = const int kTypeAndReadOnlyMask =
...@@ -1561,8 +1559,8 @@ void AccessorAssembler::HandleStoreICProtoHandler( ...@@ -1561,8 +1559,8 @@ void AccessorAssembler::HandleStoreICProtoHandler(
STATIC_ASSERT(kData == 0); STATIC_ASSERT(kData == 0);
GotoIf(IsSetWord32(details, kTypeAndReadOnlyMask), miss); GotoIf(IsSetWord32(details, kTypeAndReadOnlyMask), miss);
StoreValueByKeyIndex<NameDictionary>(properties, name_index, StoreValueByKeyIndex<PropertyDictionary>(properties, name_index,
p->value()); p->value());
Return(p->value()); Return(p->value());
}, },
miss, ic_mode); miss, ic_mode);
...@@ -1633,9 +1631,9 @@ void AccessorAssembler::HandleStoreICProtoHandler( ...@@ -1633,9 +1631,9 @@ void AccessorAssembler::HandleStoreICProtoHandler(
TNode<Map> receiver_map = LoadMap(CAST(p->receiver())); TNode<Map> receiver_map = LoadMap(CAST(p->receiver()));
InvalidateValidityCellIfPrototype(receiver_map); InvalidateValidityCellIfPrototype(receiver_map);
TNode<NameDictionary> properties = TNode<PropertyDictionary> properties =
CAST(LoadSlowProperties(CAST(p->receiver()))); CAST(LoadSlowProperties(CAST(p->receiver())));
Add<NameDictionary>(properties, CAST(p->name()), p->value(), &slow); Add<PropertyDictionary>(properties, CAST(p->name()), p->value(), &slow);
Return(p->value()); Return(p->value());
BIND(&slow); BIND(&slow);
...@@ -2439,26 +2437,21 @@ void AccessorAssembler::GenericPropertyLoad( ...@@ -2439,26 +2437,21 @@ void AccessorAssembler::GenericPropertyLoad(
BIND(&if_property_dictionary); BIND(&if_property_dictionary);
{ {
if (V8_DICT_MODE_PROTOTYPES_BOOL) {
// TODO(v8:11167) remove once SwissNameDictionary supported.
GotoIf(Int32TrueConstant(), slow);
}
Comment("dictionary property load"); Comment("dictionary property load");
// We checked for LAST_CUSTOM_ELEMENTS_RECEIVER before, which rules out // We checked for LAST_CUSTOM_ELEMENTS_RECEIVER before, which rules out
// seeing global objects here (which would need special handling). // seeing global objects here (which would need special handling).
TVARIABLE(IntPtrT, var_name_index); TVARIABLE(IntPtrT, var_name_index);
Label dictionary_found(this, &var_name_index); Label dictionary_found(this, &var_name_index);
TNode<NameDictionary> properties = TNode<PropertyDictionary> properties =
CAST(LoadSlowProperties(CAST(lookup_start_object))); CAST(LoadSlowProperties(CAST(lookup_start_object)));
NameDictionaryLookup<NameDictionary>(properties, name, &dictionary_found, NameDictionaryLookup<PropertyDictionary>(properties, name,
&var_name_index, &dictionary_found, &var_name_index,
&lookup_prototype_chain); &lookup_prototype_chain);
BIND(&dictionary_found); BIND(&dictionary_found);
{ {
LoadPropertyFromNameDictionary(properties, var_name_index.value(), LoadPropertyFromDictionary<PropertyDictionary>(
&var_details, &var_value); properties, var_name_index.value(), &var_details, &var_value);
Goto(&if_found_on_lookup_start_object); Goto(&if_found_on_lookup_start_object);
} }
} }
......
...@@ -430,7 +430,7 @@ class V8_EXPORT_PRIVATE AccessorAssembler : public CodeStubAssembler { ...@@ -430,7 +430,7 @@ class V8_EXPORT_PRIVATE AccessorAssembler : public CodeStubAssembler {
using OnCodeHandler = std::function<void(TNode<Code> code_handler)>; using OnCodeHandler = std::function<void(TNode<Code> code_handler)>;
using OnFoundOnLookupStartObject = std::function<void( using OnFoundOnLookupStartObject = std::function<void(
TNode<NameDictionary> properties, TNode<IntPtrT> name_index)>; TNode<PropertyDictionary> properties, TNode<IntPtrT> name_index)>;
template <typename ICHandler, typename ICParameters> template <typename ICHandler, typename ICParameters>
TNode<Object> HandleProtoHandler( TNode<Object> HandleProtoHandler(
......
...@@ -29,8 +29,6 @@ LoadHandler::Kind LoadHandler::GetHandlerKind(Smi smi_handler) { ...@@ -29,8 +29,6 @@ LoadHandler::Kind LoadHandler::GetHandlerKind(Smi smi_handler) {
} }
Handle<Smi> LoadHandler::LoadNormal(Isolate* isolate) { Handle<Smi> LoadHandler::LoadNormal(Isolate* isolate) {
// TODO(v8:11167) remove DCHECK once SwissNameDictionary supported.
DCHECK(!V8_DICT_MODE_PROTOTYPES_BOOL);
int config = KindBits::encode(kNormal); int config = KindBits::encode(kNormal);
return handle(Smi::FromInt(config), isolate); return handle(Smi::FromInt(config), isolate);
} }
...@@ -130,8 +128,6 @@ Handle<Smi> StoreHandler::StoreGlobalProxy(Isolate* isolate) { ...@@ -130,8 +128,6 @@ Handle<Smi> StoreHandler::StoreGlobalProxy(Isolate* isolate) {
} }
Handle<Smi> StoreHandler::StoreNormal(Isolate* isolate) { Handle<Smi> StoreHandler::StoreNormal(Isolate* isolate) {
// TODO(v8:11167) remove DCHECK once SwissNameDictionary supported.
DCHECK(!V8_DICT_MODE_PROTOTYPES_BOOL);
int config = KindBits::encode(kNormal); int config = KindBits::encode(kNormal);
return handle(Smi::FromInt(config), isolate); return handle(Smi::FromInt(config), isolate);
} }
......
...@@ -116,9 +116,6 @@ Handle<Object> LoadHandler::LoadFromPrototype( ...@@ -116,9 +116,6 @@ Handle<Object> LoadHandler::LoadFromPrototype(
Isolate* isolate, Handle<Map> lookup_start_object_map, Isolate* isolate, Handle<Map> lookup_start_object_map,
Handle<JSReceiver> holder, Handle<Smi> smi_handler, Handle<JSReceiver> holder, Handle<Smi> smi_handler,
MaybeObjectHandle maybe_data1, MaybeObjectHandle maybe_data2) { MaybeObjectHandle maybe_data1, MaybeObjectHandle maybe_data2) {
// TODO(v8:11167) remove DCHECK once SwissNameDictionary supported.
DCHECK_IMPLIES(V8_DICT_MODE_PROTOTYPES_BOOL,
GetHandlerKind(*smi_handler) != Kind::kNormal);
MaybeObjectHandle data1; MaybeObjectHandle data1;
if (maybe_data1.is_null()) { if (maybe_data1.is_null()) {
data1 = MaybeObjectHandle::Weak(holder); data1 = MaybeObjectHandle::Weak(holder);
...@@ -274,10 +271,6 @@ Handle<Object> StoreHandler::StoreThroughPrototype( ...@@ -274,10 +271,6 @@ Handle<Object> StoreHandler::StoreThroughPrototype(
Isolate* isolate, Handle<Map> receiver_map, Handle<JSReceiver> holder, Isolate* isolate, Handle<Map> receiver_map, Handle<JSReceiver> holder,
Handle<Smi> smi_handler, MaybeObjectHandle maybe_data1, Handle<Smi> smi_handler, MaybeObjectHandle maybe_data1,
MaybeObjectHandle maybe_data2) { MaybeObjectHandle maybe_data2) {
// TODO(v8:11167) remove DCHECK once SwissNameDictionary supported.
DCHECK_IMPLIES(V8_DICT_MODE_PROTOTYPES_BOOL,
KindBits::decode(smi_handler->value()) != Kind::kNormal);
MaybeObjectHandle data1; MaybeObjectHandle data1;
if (maybe_data1.is_null()) { if (maybe_data1.is_null()) {
data1 = MaybeObjectHandle::Weak(holder); data1 = MaybeObjectHandle::Weak(holder);
......
...@@ -927,12 +927,7 @@ Handle<Object> LoadIC::ComputeHandler(LookupIterator* lookup) { ...@@ -927,12 +927,7 @@ Handle<Object> LoadIC::ComputeHandler(LookupIterator* lookup) {
isolate(), map, holder, smi_handler, isolate(), map, holder, smi_handler,
MaybeObjectHandle::Weak(lookup->GetPropertyCell())); MaybeObjectHandle::Weak(lookup->GetPropertyCell()));
} else { } else {
if (V8_DICT_MODE_PROTOTYPES_BOOL) { smi_handler = LoadHandler::LoadNormal(isolate());
// TODO(v8:11167) remove once SwissNameDictionary supported.
smi_handler = LoadHandler::LoadSlow(isolate());
} else {
smi_handler = LoadHandler::LoadNormal(isolate());
}
TRACE_HANDLER_STATS(isolate(), LoadIC_LoadNormalDH); TRACE_HANDLER_STATS(isolate(), LoadIC_LoadNormalDH);
if (holder_is_lookup_start_object) return smi_handler; if (holder_is_lookup_start_object) return smi_handler;
TRACE_HANDLER_STATS(isolate(), LoadIC_LoadNormalFromPrototypeDH); TRACE_HANDLER_STATS(isolate(), LoadIC_LoadNormalFromPrototypeDH);
...@@ -982,12 +977,7 @@ Handle<Object> LoadIC::ComputeHandler(LookupIterator* lookup) { ...@@ -982,12 +977,7 @@ Handle<Object> LoadIC::ComputeHandler(LookupIterator* lookup) {
isolate(), map, holder, smi_handler, isolate(), map, holder, smi_handler,
MaybeObjectHandle::Weak(lookup->GetPropertyCell())); MaybeObjectHandle::Weak(lookup->GetPropertyCell()));
} }
if (V8_DICT_MODE_PROTOTYPES_BOOL) { smi_handler = LoadHandler::LoadNormal(isolate());
// TODO(v8:11167) remove once OrderedNameDictionary supported.
smi_handler = LoadHandler::LoadSlow(isolate());
} else {
smi_handler = LoadHandler::LoadNormal(isolate());
}
TRACE_HANDLER_STATS(isolate(), LoadIC_LoadNormalDH); TRACE_HANDLER_STATS(isolate(), LoadIC_LoadNormalDH);
if (holder_is_lookup_start_object) return smi_handler; if (holder_is_lookup_start_object) return smi_handler;
TRACE_HANDLER_STATS(isolate(), LoadIC_LoadNormalFromPrototypeDH); TRACE_HANDLER_STATS(isolate(), LoadIC_LoadNormalFromPrototypeDH);
...@@ -1823,11 +1813,7 @@ MaybeObjectHandle StoreIC::ComputeHandler(LookupIterator* lookup) { ...@@ -1823,11 +1813,7 @@ MaybeObjectHandle StoreIC::ComputeHandler(LookupIterator* lookup) {
DCHECK_IMPLIES(!V8_DICT_PROPERTY_CONST_TRACKING_BOOL, DCHECK_IMPLIES(!V8_DICT_PROPERTY_CONST_TRACKING_BOOL,
lookup->constness() == PropertyConstness::kMutable); lookup->constness() == PropertyConstness::kMutable);
// TODO(v8:11167) don't create slow hanlder once SwissNameDictionary Handle<Smi> handler = StoreHandler::StoreNormal(isolate());
// supported.
Handle<Smi> handler = V8_DICT_MODE_PROTOTYPES_BOOL
? StoreHandler::StoreSlow(isolate())
: StoreHandler::StoreNormal(isolate());
return MaybeObjectHandle(handler); return MaybeObjectHandle(handler);
} }
......
...@@ -638,7 +638,7 @@ void KeyedStoreGenericAssembler::LookupPropertyOnPrototypeChain( ...@@ -638,7 +638,7 @@ void KeyedStoreGenericAssembler::LookupPropertyOnPrototypeChain(
BIND(&found_dict); BIND(&found_dict);
{ {
TNode<NameDictionary> dictionary = CAST(var_meta_storage.value()); TNode<PropertyDictionary> dictionary = CAST(var_meta_storage.value());
TNode<IntPtrT> entry = var_entry.value(); TNode<IntPtrT> entry = var_entry.value();
TNode<Uint32T> details = LoadDetailsByKeyIndex(dictionary, entry); TNode<Uint32T> details = LoadDetailsByKeyIndex(dictionary, entry);
JumpIfDataProperty(details, &ok_to_write, readonly); JumpIfDataProperty(details, &ok_to_write, readonly);
...@@ -827,19 +827,15 @@ void KeyedStoreGenericAssembler::EmitGenericPropertyStore( ...@@ -827,19 +827,15 @@ void KeyedStoreGenericAssembler::EmitGenericPropertyStore(
BIND(&dictionary_properties); BIND(&dictionary_properties);
{ {
if (V8_DICT_MODE_PROTOTYPES_BOOL) {
// TODO(v8:11167, v8:11177) Only here due to SetDataProperties workaround.
GotoIf(Int32TrueConstant(), slow);
}
Comment("dictionary property store"); Comment("dictionary property store");
// We checked for LAST_CUSTOM_ELEMENTS_RECEIVER before, which rules out // We checked for LAST_CUSTOM_ELEMENTS_RECEIVER before, which rules out
// seeing global objects here (which would need special handling). // seeing global objects here (which would need special handling).
TVARIABLE(IntPtrT, var_name_index); TVARIABLE(IntPtrT, var_name_index);
Label dictionary_found(this, &var_name_index), not_found(this); Label dictionary_found(this, &var_name_index), not_found(this);
TNode<NameDictionary> properties = CAST(LoadSlowProperties(receiver)); TNode<PropertyDictionary> properties = CAST(LoadSlowProperties(receiver));
NameDictionaryLookup<NameDictionary>(properties, name, &dictionary_found, NameDictionaryLookup<PropertyDictionary>(
&var_name_index, &not_found); properties, name, &dictionary_found, &var_name_index, &not_found);
BIND(&dictionary_found); BIND(&dictionary_found);
{ {
Label check_const(this), overwrite(this), done(this); Label check_const(this), overwrite(this), done(this);
...@@ -877,8 +873,8 @@ void KeyedStoreGenericAssembler::EmitGenericPropertyStore( ...@@ -877,8 +873,8 @@ void KeyedStoreGenericAssembler::EmitGenericPropertyStore(
BIND(&overwrite); BIND(&overwrite);
{ {
CheckForAssociatedProtector(name, slow); CheckForAssociatedProtector(name, slow);
StoreValueByKeyIndex<NameDictionary>(properties, var_name_index.value(), StoreValueByKeyIndex<PropertyDictionary>(
p->value()); properties, var_name_index.value(), p->value());
Goto(&done); Goto(&done);
} }
...@@ -916,8 +912,8 @@ void KeyedStoreGenericAssembler::EmitGenericPropertyStore( ...@@ -916,8 +912,8 @@ void KeyedStoreGenericAssembler::EmitGenericPropertyStore(
} }
Label add_dictionary_property_slow(this); Label add_dictionary_property_slow(this);
InvalidateValidityCellIfPrototype(receiver_map, bitfield3); InvalidateValidityCellIfPrototype(receiver_map, bitfield3);
Add<NameDictionary>(properties, name, p->value(), Add<PropertyDictionary>(properties, name, p->value(),
&add_dictionary_property_slow); &add_dictionary_property_slow);
exit_point->Return(p->value()); exit_point->Return(p->value());
BIND(&add_dictionary_property_slow); BIND(&add_dictionary_property_slow);
......
...@@ -18,6 +18,13 @@ ...@@ -18,6 +18,13 @@
namespace v8 { namespace v8 {
namespace internal { namespace internal {
#ifdef V8_DICT_MODE_PROTOTYPES
class SwissNameDictionary;
using PropertyDictionary = SwissNameDictionary;
#else
using PropertyDictionary = NameDictionary;
#endif
template <typename T> template <typename T>
class Handle; class Handle;
......
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