aboutsummaryrefslogtreecommitdiff
path: root/deps/v8/src/ic/accessor-assembler.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/ic/accessor-assembler.cc')
-rw-r--r--deps/v8/src/ic/accessor-assembler.cc163
1 files changed, 82 insertions, 81 deletions
diff --git a/deps/v8/src/ic/accessor-assembler.cc b/deps/v8/src/ic/accessor-assembler.cc
index 0cb326763c..0bbc9391b0 100644
--- a/deps/v8/src/ic/accessor-assembler.cc
+++ b/deps/v8/src/ic/accessor-assembler.cc
@@ -6,14 +6,17 @@
#include "src/ast/ast.h"
#include "src/code-factory.h"
-#include "src/code-stubs.h"
#include "src/counters.h"
#include "src/ic/handler-configuration.h"
#include "src/ic/ic.h"
#include "src/ic/keyed-store-generic.h"
#include "src/ic/stub-cache.h"
#include "src/objects-inl.h"
+#include "src/objects/cell.h"
+#include "src/objects/foreign.h"
+#include "src/objects/heap-number.h"
#include "src/objects/module.h"
+#include "src/objects/smi.h"
namespace v8 {
namespace internal {
@@ -59,7 +62,7 @@ TNode<MaybeObject> AccessorAssembler::LoadHandlerDataField(
USE(minimum_size);
CSA_ASSERT(this, UintPtrGreaterThanOrEqual(
LoadMapInstanceSizeInWords(handler_map),
- IntPtrConstant(minimum_size / kPointerSize)));
+ IntPtrConstant(minimum_size / kTaggedSize)));
return LoadMaybeWeakObjectField(handler, offset);
}
@@ -87,7 +90,7 @@ TNode<MaybeObject> AccessorAssembler::TryMonomorphicCase(
TNode<MaybeObject> handler = UncheckedCast<MaybeObject>(
Load(MachineType::AnyTagged(), vector,
- IntPtrAdd(offset, IntPtrConstant(header_size + kPointerSize))));
+ IntPtrAdd(offset, IntPtrConstant(header_size + kTaggedSize))));
*var_handler = handler;
Goto(if_handler);
@@ -159,7 +162,7 @@ void AccessorAssembler::HandlePolymorphicCase(
// Found, now call handler.
TNode<MaybeObject> handler =
- LoadWeakFixedArrayElement(feedback, index, kPointerSize);
+ LoadWeakFixedArrayElement(feedback, index, kTaggedSize);
*var_handler = handler;
Goto(if_handler);
@@ -214,7 +217,8 @@ void AccessorAssembler::HandleLoadCallbackProperty(const LoadICParameters* p,
TNode<WordT> handler_word,
ExitPoint* exit_point) {
Comment("native_data_property_load");
- Node* descriptor = DecodeWord<LoadHandler::DescriptorBits>(handler_word);
+ TNode<IntPtrT> descriptor =
+ Signed(DecodeWord<LoadHandler::DescriptorBits>(handler_word));
Label runtime(this, Label::kDeferred);
Callable callable = CodeFactory::ApiGetter(isolate());
@@ -270,9 +274,10 @@ void AccessorAssembler::HandleLoadAccessor(
Goto(&load);
BIND(&load);
- Callable callable = CodeFactory::CallApiCallback(isolate(), 0);
- exit_point->Return(CallStub(callable, nullptr, context, data,
- api_holder.value(), callback, p->receiver));
+ Callable callable = CodeFactory::CallApiCallback(isolate());
+ TNode<IntPtrT> argc = IntPtrConstant(0);
+ exit_point->Return(CallStub(callable, nullptr, context, callback, argc,
+ data, api_holder.value(), p->receiver));
}
BIND(&runtime);
@@ -287,7 +292,7 @@ void AccessorAssembler::HandleLoadField(Node* holder, Node* handler_word,
ExitPoint* exit_point) {
Comment("field_load");
Node* index = DecodeWord<LoadHandler::FieldIndexBits>(handler_word);
- Node* offset = IntPtrMul(index, IntPtrConstant(kPointerSize));
+ Node* offset = IntPtrMul(index, IntPtrConstant(kTaggedSize));
Label inobject(this), out_of_object(this);
Branch(IsSetWord<LoadHandler::IsInobjectBits>(handler_word), &inobject,
@@ -324,22 +329,15 @@ void AccessorAssembler::HandleLoadField(Node* holder, Node* handler_word,
}
}
-TNode<Object> AccessorAssembler::LoadDescriptorValue(TNode<Map> map,
- Node* descriptor) {
- return CAST(LoadDescriptorValueOrFieldType(map, descriptor));
+TNode<Object> AccessorAssembler::LoadDescriptorValue(
+ TNode<Map> map, TNode<IntPtrT> descriptor_entry) {
+ return CAST(LoadDescriptorValueOrFieldType(map, descriptor_entry));
}
TNode<MaybeObject> AccessorAssembler::LoadDescriptorValueOrFieldType(
- TNode<Map> map, SloppyTNode<IntPtrT> descriptor) {
+ TNode<Map> map, TNode<IntPtrT> descriptor_entry) {
TNode<DescriptorArray> descriptors = LoadMapDescriptors(map);
- TNode<IntPtrT> scaled_descriptor =
- IntPtrMul(descriptor, IntPtrConstant(DescriptorArray::kEntrySize));
- TNode<IntPtrT> value_index = IntPtrAdd(
- scaled_descriptor, IntPtrConstant(DescriptorArray::kFirstIndex +
- DescriptorArray::kEntryValueIndex));
- CSA_ASSERT(this, UintPtrLessThan(descriptor, LoadAndUntagWeakFixedArrayLength(
- descriptors)));
- return LoadWeakFixedArrayElement(descriptors, value_index);
+ return LoadFieldTypeByDescriptorEntry(descriptors, descriptor_entry);
}
void AccessorAssembler::HandleLoadICSmiHandlerCase(
@@ -496,7 +494,8 @@ void AccessorAssembler::HandleLoadICSmiHandlerCase(
BIND(&constant);
{
Comment("constant_load");
- Node* descriptor = DecodeWord<LoadHandler::DescriptorBits>(handler_word);
+ TNode<IntPtrT> descriptor =
+ Signed(DecodeWord<LoadHandler::DescriptorBits>(handler_word));
Node* value = LoadDescriptorValue(LoadMap(holder), descriptor);
exit_point->Return(value);
@@ -525,7 +524,8 @@ void AccessorAssembler::HandleLoadICSmiHandlerCase(
BIND(&accessor);
{
Comment("accessor_load");
- Node* descriptor = DecodeWord<LoadHandler::DescriptorBits>(handler_word);
+ TNode<IntPtrT> descriptor =
+ Signed(DecodeWord<LoadHandler::DescriptorBits>(handler_word));
Node* accessor_pair = LoadDescriptorValue(LoadMap(holder), descriptor);
CSA_ASSERT(this, IsAccessorPair(accessor_pair));
Node* getter = LoadObjectField(accessor_pair, AccessorPair::kGetterOffset);
@@ -826,10 +826,14 @@ void AccessorAssembler::JumpIfDataProperty(Node* details, Label* writable,
void AccessorAssembler::HandleStoreICNativeDataProperty(
const StoreICParameters* p, Node* holder, Node* handler_word) {
Comment("native_data_property_store");
- Node* descriptor = DecodeWord<StoreHandler::DescriptorBits>(handler_word);
+ TNode<IntPtrT> descriptor =
+ Signed(DecodeWord<StoreHandler::DescriptorBits>(handler_word));
Node* accessor_info = LoadDescriptorValue(LoadMap(holder), descriptor);
CSA_CHECK(this, IsAccessorInfo(accessor_info));
+ // TODO(8580): Get the language mode lazily when required to avoid the
+ // computation of GetLanguageMode here. Also make the computation of
+ // language mode not dependent on vector.
Node* language_mode = GetLanguageMode(p->vector, p->slot);
TailCallRuntime(Runtime::kStoreCallbackProperty, p->context, p->receiver,
@@ -985,13 +989,11 @@ void AccessorAssembler::HandleStoreICTransitionMapHandlerCase(
TNode<IntPtrT> last_key_index = UncheckedCast<IntPtrT>(IntPtrAdd(
IntPtrConstant(DescriptorArray::ToKeyIndex(-1)), IntPtrMul(nof, factor)));
if (flags & kValidateTransitionHandler) {
- Node* key = LoadWeakFixedArrayElement(descriptors, last_key_index);
+ TNode<Name> key = LoadKeyByKeyIndex(descriptors, last_key_index);
GotoIf(WordNotEqual(key, p->name), miss);
} else {
- CSA_ASSERT(this,
- WordEqual(BitcastMaybeObjectToWord(LoadWeakFixedArrayElement(
- descriptors, last_key_index)),
- p->name));
+ CSA_ASSERT(this, WordEqual(LoadKeyByKeyIndex(descriptors, last_key_index),
+ p->name));
}
Node* details = LoadDetailsByKeyIndex(descriptors, last_key_index);
if (flags & kValidateTransitionHandler) {
@@ -1062,10 +1064,10 @@ void AccessorAssembler::CheckFieldType(TNode<DescriptorArray> descriptors,
GotoIf(TaggedIsSmi(value), bailout);
TNode<MaybeObject> field_type = LoadFieldTypeByKeyIndex(
descriptors, UncheckedCast<IntPtrT>(name_index));
- intptr_t kNoneType = reinterpret_cast<intptr_t>(FieldType::None());
- intptr_t kAnyType = reinterpret_cast<intptr_t>(FieldType::Any());
- DCHECK_NE(kNoneType, kClearedWeakHeapObject);
- DCHECK_NE(kAnyType, kClearedWeakHeapObject);
+ const Address kNoneType = FieldType::None().ptr();
+ const Address kAnyType = FieldType::Any().ptr();
+ DCHECK_NE(static_cast<uint32_t>(kNoneType), kClearedWeakHeapObjectLower32);
+ DCHECK_NE(static_cast<uint32_t>(kAnyType), kClearedWeakHeapObjectLower32);
// FieldType::None can't hold any value.
GotoIf(WordEqual(BitcastMaybeObjectToWord(field_type),
IntPtrConstant(kNoneType)),
@@ -1128,7 +1130,7 @@ void AccessorAssembler::OverwriteExistingFastDataProperty(
BIND(&inobject);
{
- Node* field_offset = TimesPointerSize(field_index);
+ Node* field_offset = TimesTaggedSize(field_index);
Label tagged_rep(this), double_rep(this);
Branch(
Word32Equal(representation, Int32Constant(Representation::kDouble)),
@@ -1253,7 +1255,8 @@ void AccessorAssembler::CheckPrototypeValidityCell(Node* maybe_validity_cell,
void AccessorAssembler::HandleStoreAccessor(const StoreICParameters* p,
Node* holder, Node* handler_word) {
Comment("accessor_store");
- Node* descriptor = DecodeWord<StoreHandler::DescriptorBits>(handler_word);
+ TNode<IntPtrT> descriptor =
+ Signed(DecodeWord<StoreHandler::DescriptorBits>(handler_word));
Node* accessor_pair = LoadDescriptorValue(LoadMap(holder), descriptor);
CSA_ASSERT(this, IsAccessorPair(accessor_pair));
Node* setter = LoadObjectField(accessor_pair, AccessorPair::kSetterOffset);
@@ -1417,9 +1420,10 @@ void AccessorAssembler::HandleStoreICProtoHandler(
Goto(&store);
BIND(&store);
- Callable callable = CodeFactory::CallApiCallback(isolate(), 1);
- Return(CallStub(callable, nullptr, context, data, api_holder.value(),
- callback, p->receiver, p->value));
+ Callable callable = CodeFactory::CallApiCallback(isolate());
+ TNode<IntPtrT> argc = IntPtrConstant(1);
+ Return(CallStub(callable, nullptr, context, callback, argc, data,
+ api_holder.value(), p->receiver, p->value));
}
BIND(&if_store_global_proxy);
@@ -1450,6 +1454,9 @@ void AccessorAssembler::HandleStoreToProxy(const StoreICParameters* p,
Label if_index(this), if_unique_name(this),
to_name_failed(this, Label::kDeferred);
+ // TODO(8580): Get the language mode lazily when required to avoid the
+ // computation of GetLanguageMode here. Also make the computation of
+ // language mode not dependent on vector.
Node* language_mode = GetLanguageMode(p->vector, p->slot);
if (support_elements == kSupportElements) {
@@ -1584,7 +1591,8 @@ Node* AccessorAssembler::PrepareValueForStore(Node* handler_word, Node* holder,
IntPtrConstant(StoreHandler::kConstField)),
&done);
}
- Node* descriptor = DecodeWord<StoreHandler::DescriptorBits>(handler_word);
+ TNode<IntPtrT> descriptor =
+ Signed(DecodeWord<StoreHandler::DescriptorBits>(handler_word));
TNode<MaybeObject> maybe_field_type =
LoadDescriptorValueOrFieldType(LoadMap(holder), descriptor);
@@ -1713,7 +1721,7 @@ void AccessorAssembler::StoreNamedField(Node* handler_word, Node* object,
}
Node* index = DecodeWord<StoreHandler::FieldIndexBits>(handler_word);
- Node* offset = IntPtrMul(index, IntPtrConstant(kPointerSize));
+ Node* offset = IntPtrMul(index, IntPtrConstant(kTaggedSize));
if (representation.IsDouble()) {
if (!FLAG_unbox_double_fields || !is_inobject) {
// Load the mutable heap number.
@@ -1867,7 +1875,7 @@ void AccessorAssembler::EmitElementLoad(
BIND(&if_typed_array);
{
Comment("typed elements");
- // Check if buffer has been neutered.
+ // Check if buffer has been detached.
Node* buffer = LoadObjectField(object, JSArrayBufferView::kBufferOffset);
GotoIf(IsDetachedBuffer(buffer), miss);
@@ -2305,15 +2313,6 @@ void AccessorAssembler::TryProbeStubCacheTable(
Node* name, Node* map, Label* if_handler,
TVariable<MaybeObject>* var_handler, Label* if_miss) {
StubCache::Table table = static_cast<StubCache::Table>(table_id);
-#ifdef DEBUG
- if (FLAG_test_secondary_stub_cache && table == StubCache::kPrimary) {
- Goto(if_miss);
- return;
- } else if (FLAG_test_primary_stub_cache && table == StubCache::kSecondary) {
- Goto(if_miss);
- return;
- }
-#endif
// The {table_offset} holds the entry offset times four (due to masking
// and shifting optimizations).
const int kMultiplier = sizeof(StubCache::Entry) >> Name::kHashShift;
@@ -2326,18 +2325,19 @@ void AccessorAssembler::TryProbeStubCacheTable(
GotoIf(WordNotEqual(name, entry_key), if_miss);
// Get the map entry from the cache.
- DCHECK_EQ(kPointerSize * 2, stub_cache->map_reference(table).address() -
- stub_cache->key_reference(table).address());
+ DCHECK_EQ(kSystemPointerSize * 2,
+ stub_cache->map_reference(table).address() -
+ stub_cache->key_reference(table).address());
Node* entry_map =
Load(MachineType::Pointer(), key_base,
- IntPtrAdd(entry_offset, IntPtrConstant(kPointerSize * 2)));
+ IntPtrAdd(entry_offset, IntPtrConstant(kSystemPointerSize * 2)));
GotoIf(WordNotEqual(map, entry_map), if_miss);
- DCHECK_EQ(kPointerSize, stub_cache->value_reference(table).address() -
- stub_cache->key_reference(table).address());
+ DCHECK_EQ(kSystemPointerSize, stub_cache->value_reference(table).address() -
+ stub_cache->key_reference(table).address());
TNode<MaybeObject> handler = ReinterpretCast<MaybeObject>(
- Load(MachineType::TaggedPointer(), key_base,
- IntPtrAdd(entry_offset, IntPtrConstant(kPointerSize))));
+ Load(MachineType::AnyTagged(), key_base,
+ IntPtrAdd(entry_offset, IntPtrConstant(kSystemPointerSize))));
// We found the handler.
*var_handler = handler;
@@ -2393,6 +2393,8 @@ void AccessorAssembler::LoadIC_BytecodeHandler(const LoadICParameters* p,
// accident.
Label stub_call(this, Label::kDeferred), miss(this, Label::kDeferred);
+ GotoIf(IsUndefined(p->vector), &miss);
+
// Inlined fast path.
{
Comment("LoadIC_BytecodeHandler_fast");
@@ -2528,7 +2530,7 @@ void AccessorAssembler::LoadIC_Uninitialized(const LoadICParameters* p) {
LoadRoot(RootIndex::kpremonomorphic_symbol),
SKIP_WRITE_BARRIER, 0, SMI_PARAMETERS);
StoreWeakReferenceInFeedbackVector(p->vector, p->slot, receiver_map,
- kPointerSize, SMI_PARAMETERS);
+ kTaggedSize, SMI_PARAMETERS);
{
// Special case for Function.prototype load, because it's very common
@@ -2579,7 +2581,8 @@ void AccessorAssembler::LoadGlobalIC(TNode<FeedbackVector> vector, Node* slot,
TNode<Context> context = lazy_context();
TNode<Name> name = lazy_name();
exit_point->ReturnCallRuntime(Runtime::kLoadGlobalIC_Miss, context, name,
- ParameterToTagged(slot, slot_mode), vector);
+ ParameterToTagged(slot, slot_mode), vector,
+ SmiConstant(typeof_mode));
}
}
@@ -2631,7 +2634,7 @@ void AccessorAssembler::LoadGlobalIC_TryHandlerCase(
Label call_handler(this), non_smi(this);
TNode<MaybeObject> feedback_element =
- LoadFeedbackVectorSlot(vector, slot, kPointerSize, slot_mode);
+ LoadFeedbackVectorSlot(vector, slot, kTaggedSize, slot_mode);
TNode<Object> handler = CAST(feedback_element);
GotoIf(WordEqual(handler, LoadRoot(RootIndex::kuninitialized_symbol)), miss);
@@ -2852,7 +2855,7 @@ void AccessorAssembler::KeyedLoadICPolymorphicName(const LoadICParameters* p) {
// Check if we have a matching handler for the {receiver_map}.
TNode<MaybeObject> feedback_element =
- LoadFeedbackVectorSlot(vector, slot, kPointerSize, SMI_PARAMETERS);
+ LoadFeedbackVectorSlot(vector, slot, kTaggedSize, SMI_PARAMETERS);
TNode<WeakFixedArray> array = CAST(feedback_element);
HandlePolymorphicCase(receiver_map, array, &if_handler, &var_handler, &miss,
1);
@@ -2954,7 +2957,7 @@ void AccessorAssembler::StoreGlobalIC(const StoreICParameters* pp) {
{
Comment("StoreGlobalIC_try_handler");
TNode<MaybeObject> handler = LoadFeedbackVectorSlot(
- pp->vector, pp->slot, kPointerSize, SMI_PARAMETERS);
+ pp->vector, pp->slot, kTaggedSize, SMI_PARAMETERS);
GotoIf(WordEqual(handler, LoadRoot(RootIndex::kuninitialized_symbol)),
&miss);
@@ -3108,7 +3111,7 @@ void AccessorAssembler::KeyedStoreIC(const StoreICParameters* p) {
// If the name comparison succeeded, we know we have a feedback vector
// with at least one map/handler pair.
TNode<MaybeObject> feedback_element = LoadFeedbackVectorSlot(
- p->vector, p->slot, kPointerSize, SMI_PARAMETERS);
+ p->vector, p->slot, kTaggedSize, SMI_PARAMETERS);
TNode<WeakFixedArray> array = CAST(feedback_element);
HandlePolymorphicCase(receiver_map, array, &if_handler, &var_handler,
&miss, 1);
@@ -3191,9 +3194,8 @@ void AccessorAssembler::StoreInArrayLiteralIC(const StoreICParameters* p) {
BIND(&miss);
{
Comment("StoreInArrayLiteralIC_miss");
- // TODO(neis): Introduce Runtime::kStoreInArrayLiteralIC_Miss.
- TailCallRuntime(Runtime::kKeyedStoreIC_Miss, p->context, p->value, p->slot,
- p->vector, p->receiver, p->name);
+ TailCallRuntime(Runtime::kStoreInArrayLiteralIC_Miss, p->context, p->value,
+ p->slot, p->vector, p->receiver, p->name);
}
}
@@ -3517,7 +3519,7 @@ void AccessorAssembler::GenerateCloneObjectIC_Slow() {
Label did_set_proto_if_needed(this);
TNode<BoolT> is_null_proto = SmiNotEqual(
SmiAnd(flags, SmiConstant(ObjectLiteral::kHasNullPrototype)),
- SmiConstant(Smi::kZero));
+ SmiConstant(Smi::zero()));
GotoIfNot(is_null_proto, &did_set_proto_if_needed);
CallRuntime(Runtime::kInternalSetPrototype, context, result,
@@ -3547,13 +3549,12 @@ void AccessorAssembler::GenerateCloneObjectIC_Slow() {
GotoIfNot(IsEmptyFixedArray(LoadElements(CAST(source))), &call_runtime);
- ForEachEnumerableOwnProperty(
- context, map, CAST(source),
- [=](TNode<Name> key, TNode<Object> value) {
- KeyedStoreGenericGenerator::SetPropertyInLiteral(state(), context,
- result, key, value);
- },
- &call_runtime);
+ ForEachEnumerableOwnProperty(context, map, CAST(source),
+ [=](TNode<Name> key, TNode<Object> value) {
+ SetPropertyInLiteral(context, result, key,
+ value);
+ },
+ &call_runtime);
Goto(&done);
BIND(&call_runtime);
@@ -3619,6 +3620,8 @@ void AccessorAssembler::GenerateCloneObjectIC() {
auto mode = INTPTR_PARAMETERS;
var_properties = CAST(AllocatePropertyArray(length, mode));
+ FillPropertyArrayWithUndefined(var_properties.value(), IntPtrConstant(0),
+ length, mode);
CopyPropertyArrayValues(source_properties, var_properties.value(), length,
SKIP_WRITE_BARRIER, mode, DestroySource::kNo);
}
@@ -3638,7 +3641,7 @@ void AccessorAssembler::GenerateCloneObjectIC() {
TNode<IntPtrT> result_start =
LoadMapInobjectPropertiesStartInWords(result_map);
TNode<IntPtrT> field_offset_difference =
- TimesPointerSize(IntPtrSub(result_start, source_start));
+ TimesTaggedSize(IntPtrSub(result_start, source_start));
// If MutableHeapNumbers may be present in-object, allocations may occur
// within this loop, thus the write barrier is required.
@@ -3651,7 +3654,7 @@ void AccessorAssembler::GenerateCloneObjectIC() {
source_start, source_size,
[=](Node* field_index) {
TNode<IntPtrT> field_offset =
- TimesPointerSize(UncheckedCast<IntPtrT>(field_index));
+ TimesTaggedSize(UncheckedCast<IntPtrT>(field_index));
if (may_use_mutable_heap_numbers) {
TNode<Object> field = LoadObjectField(source, field_offset);
@@ -3661,13 +3664,11 @@ void AccessorAssembler::GenerateCloneObjectIC() {
StoreObjectField(object, result_offset, field);
} else {
// Copy fields as raw data.
- TNode<IntPtrT> field = UncheckedCast<IntPtrT>(
- LoadObjectField(source, field_offset, MachineType::IntPtr()));
+ TNode<IntPtrT> field =
+ LoadObjectField<IntPtrT>(source, field_offset);
TNode<IntPtrT> result_offset =
IntPtrAdd(field_offset, field_offset_difference);
- StoreObjectFieldNoWriteBarrier(
- object, result_offset, field,
- MachineType::IntPtr().representation());
+ StoreObjectFieldNoWriteBarrier(object, result_offset, field);
}
},
1, INTPTR_PARAMETERS, IndexAdvanceMode::kPost);