18template <
typename BitField>
20 typename BitField::FieldType value) {
21 int config = smi_handler.value();
22 config = BitField::update(config,
true);
28template <
typename ICHandler,
bool fill_handler = true>
29int InitPrototypeChecksImpl(Isolate* isolate, DirectHandle<ICHandler> handler,
31 DirectHandle<Map> lookup_start_object_map,
32 MaybeObjectDirectHandle data1,
33 MaybeObjectDirectHandle maybe_data2) {
39 lookup_start_object_map->is_prototype_map());
42 lookup_start_object_map->is_access_check_needed()) {
43 DCHECK(!IsJSGlobalObjectMap(*lookup_start_object_map));
55 *smi_handler = SetBitFieldValue<
56 typename ICHandler::DoAccessCheckOnLookupStartObjectBits>(
60 }
else if (lookup_start_object_map->is_dictionary_map() &&
61 !IsJSGlobalObjectMap(*lookup_start_object_map)) {
65 SetBitFieldValue<typename ICHandler::LookupOnLookupStartObjectBits>(
66 isolate, *smi_handler,
true);
70 handler->set_data1(*data1);
72 if (!maybe_data2.is_null()) {
77 handler->set_data2(*maybe_data2);
80 handler->set_data3(*maybe_data2);
92template <
typename ICHandler>
93int GetHandlerDataSize(
95 DirectHandle<Map> lookup_start_object_map, MaybeObjectDirectHandle data1,
96 MaybeObjectDirectHandle maybe_data2 = MaybeObjectDirectHandle()) {
98 return InitPrototypeChecksImpl<ICHandler, false>(
99 isolate, DirectHandle<ICHandler>(), smi_handler, lookup_start_object_map,
103template <
typename ICHandler>
104void InitPrototypeChecks(
105 Isolate* isolate, DirectHandle<ICHandler> handler,
106 DirectHandle<Map> lookup_start_object_map, MaybeObjectDirectHandle data1,
107 MaybeObjectDirectHandle maybe_data2 = MaybeObjectDirectHandle()) {
108 InitPrototypeChecksImpl<ICHandler, true>(
109 isolate, handler,
nullptr, lookup_start_object_map, data1, maybe_data2);
126 int data_size = GetHandlerDataSize<LoadHandler>(
137 InitPrototypeChecks(isolate,
direct_handle(handler), lookup_start_object_map,
148 int data_size = GetHandlerDataSize<LoadHandler>(
159 return smi_handler_handle;
167 InitPrototypeChecks(isolate,
direct_handle(handler), lookup_start_object_map,
176 if (
IsSmi(handler)) {
177 int const raw_handler = handler.ToSmi().value();
192 if (
IsSmi(handler)) {
193 int const raw_handler = handler.ToSmi().value();
222 handler->set_smi_handler(*code);
224 handler->set_data1(
MakeWeak(*transition));
231 bool is_dictionary_map = transition_map->is_dictionary_map();
233 if (!is_dictionary_map) {
236 transition_map->instance_descriptors(isolate), isolate);
238 if (descriptors->GetKey(descriptor)->IsPrivate()) {
248 DCHECK(!transition_map->is_access_check_needed());
251 if (is_dictionary_map) {
252 DCHECK(!IsJSGlobalObjectMap(*transition_map));
264 bool is_dictionary_map = transition_map->is_dictionary_map();
266 if (!is_dictionary_map) {
269 transition_map->instance_descriptors(isolate), isolate);
271 DCHECK(!descriptors->GetKey(descriptor)->IsPrivateName());
273 if (descriptors->GetKey(descriptor)->IsPrivate()) {
283 DCHECK(!transition_map->is_access_check_needed());
287 if (is_dictionary_map || !transition_map->IsPrototypeValidityCellValid()) {
292 if (is_dictionary_map) {
293 DCHECK(!IsJSGlobalObjectMap(*transition_map));
324 int data_size = GetHandlerDataSize<StoreHandler>(
356 if (
IsSmi(handler)) {
361 return IsLoadHandler(handler);
364#if defined(OBJECT_PRINT)
366void PrintSmiLoadHandler(
int raw_handler, std::ostream& os) {
377 os <<
"allow out of bounds = "
381 <<
", alow reading holes = "
383 <<
", elements kind = "
389 os <<
"kIndexedString, allow out of bounds = "
400 os <<
"kField, WasmStruct, type = "
402 <<
", field offset = "
405 os <<
"kField, is in object = "
408 <<
", field index = "
414 os <<
"kConstantFromPrototype";
417 os <<
"kAccessorFromPrototype";
420 os <<
"kNativeDataProperty, descriptor = "
427 os <<
"kInterceptor";
436 os <<
"kNonExistent";
439 os <<
"kModuleExport, exports index = "
443 os <<
"<invalid value " <<
static_cast<int>(
kind) <<
">";
448void PrintSmiStoreHandler(
int raw_handler, std::ostream& os) {
460 os <<
"Field, descriptor = "
462 <<
", is in object = "
464 <<
", representation = " << representation.Mnemonic()
465 <<
", field index = "
470 os <<
"kAccessorFromPrototype";
473 os <<
"kNativeDataProperty, descriptor = "
480 os <<
"kGlobalProxy";
486 os <<
"kInterceptor";
491 os <<
"kSlow, keyed access store mode = " << keyed_access_store_mode;
498 os <<
"kSharedStructField";
508void LoadHandler::PrintHandler(
Tagged<Object> handler, std::ostream& os) {
510 if (
IsSmi(handler)) {
511 int raw_handler = handler.ToSmi().value();
512 os <<
"LoadHandler(Smi)(";
513 PrintSmiLoadHandler(raw_handler, os);
515 }
else if (IsCode(handler)) {
516 os <<
"LoadHandler(Code)("
518 }
else if (IsSymbol(handler)) {
519 os <<
"LoadHandler(Symbol)(" << Brief(
Cast<Symbol>(handler)) <<
")";
520 }
else if (IsLoadHandler(handler)) {
522 int raw_handler =
Cast<Smi>(load_handler->smi_handler()).value();
523 os <<
"LoadHandler(do access check on lookup start object = "
525 <<
", lookup on lookup start object = "
527 PrintSmiLoadHandler(raw_handler, os);
528 if (load_handler->data_field_count() >= 1) {
532 if (load_handler->data_field_count() >= 2) {
536 if (load_handler->data_field_count() >= 3) {
540 os <<
", validity cell = ";
541 ShortPrint(load_handler->validity_cell(), os);
544 os <<
"LoadHandler(<unexpected>)(" << Brief(handler) <<
")";
548void StoreHandler::PrintHandler(
Tagged<Object> handler, std::ostream& os) {
550 if (
IsSmi(handler)) {
551 int raw_handler = handler.ToSmi().value();
552 os <<
"StoreHandler(Smi)(";
553 PrintSmiStoreHandler(raw_handler, os);
554 os <<
")" << std::endl;
555 }
else if (IsStoreHandler(handler)) {
556 os <<
"StoreHandler(";
558 if (IsCode(store_handler->smi_handler())) {
563 int raw_handler =
Cast<Smi>(store_handler->smi_handler()).value();
564 os <<
"do access check on lookup start object = "
566 <<
", lookup on lookup start object = "
568 PrintSmiStoreHandler(raw_handler, os);
570 if (store_handler->data_field_count() >= 1) {
574 if (store_handler->data_field_count() >= 2) {
578 if (store_handler->data_field_count() >= 3) {
582 os <<
", validity cell = ";
583 ShortPrint(store_handler->validity_cell(), os);
584 os <<
")" << std::endl;
585 }
else if (IsMap(handler)) {
586 os <<
"StoreHandler(field transition to " << Brief(handler) <<
")"
588 }
else if (IsCode(handler)) {
590 os <<
"StoreHandler(builtin = ";
592 os <<
")" << std::endl;
594 os <<
"StoreHandler(<unexpected>)(" << Brief(handler) <<
")" << std::endl;
static constexpr T decode(U value)
static constexpr U encode(T value)
static V8_EXPORT_PRIVATE const char * name(Builtin builtin)
Tagged< UnionOf< Smi, Cell > > validity_cell() const
Tagged< UnionOf< Smi, Code > > smi_handler() const
Tagged< MaybeObject > data1() const
static bool CanHandleHolderNotLookupStart(Tagged< Object > handler)
static KeyedAccessLoadMode GetKeyedAccessLoadMode(Tagged< MaybeObject > handler)
static Handle< Object > LoadFromPrototype(Isolate *isolate, DirectHandle< Map > receiver_map, DirectHandle< JSReceiver > holder, Tagged< Smi > smi_handler, MaybeObjectDirectHandle maybe_data1=MaybeObjectDirectHandle(), MaybeObjectDirectHandle maybe_data2=MaybeObjectDirectHandle())
static Handle< Object > LoadFullChain(Isolate *isolate, DirectHandle< Map > receiver_map, const MaybeObjectDirectHandle &holder, Handle< Smi > smi_handler)
static Handle< UnionOf< Smi, Cell > > GetOrCreatePrototypeChainValidityCell(DirectHandle< Map > map, Isolate *isolate)
static MaybeObjectDirectHandle Weak(Tagged< Object > object, Isolate *isolate)
static MaybeObjectHandle Weak(Tagged< Object > object, Isolate *isolate)
PropertyAttributes attributes() const
Representation representation() const
constexpr bool IsNone() const
static constexpr Representation FromKind(Kind kind)
static constexpr Tagged< Smi > FromInt(int value)
static Handle< Object > StoreThroughPrototype(Isolate *isolate, DirectHandle< Map > receiver_map, DirectHandle< JSReceiver > holder, Tagged< Smi > smi_handler, MaybeObjectDirectHandle maybe_data1=MaybeObjectDirectHandle(), MaybeObjectDirectHandle maybe_data2=MaybeObjectDirectHandle())
static KeyedAccessStoreMode GetKeyedAccessStoreMode(Tagged< MaybeObject > handler)
static MaybeObjectHandle StoreGlobal(Handle< PropertyCell > cell)
static MaybeObjectHandle StoreTransition(Isolate *isolate, Handle< Map > transition_map)
static Tagged< Smi > StoreProxy()
static MaybeObjectHandle StoreOwnTransition(Isolate *isolate, Handle< Map > transition_map)
static Handle< Object > StoreElementTransition(Isolate *isolate, DirectHandle< Map > receiver_map, DirectHandle< Map > transition, KeyedAccessStoreMode store_mode, MaybeDirectHandle< UnionOf< Smi, Cell > > prev_validity_cell=kNullMaybeHandle)
static DirectHandle< Code > ElementsTransitionAndStoreBuiltin(Isolate *isolate, KeyedAccessStoreMode mode)
bool IsPrimitiveMap(Tagged< Map > map)
PerThreadAssertScopeDebugOnly< false, SAFEPOINTS_ASSERT, HEAP_ALLOCATION_ASSERT > DisallowGarbageCollection
Tagged(T object) -> Tagged< T >
V8_INLINE constexpr bool IsSmi(TaggedImpl< kRefType, StorageType > obj)
V8_INLINE DirectHandle< T > direct_handle(Tagged< T > object, Isolate *isolate)
const char * ElementsKindToString(ElementsKind kind)
std::ostream & operator<<(std::ostream &os, AtomicMemoryOrder order)
KeyedAccessLoadMode CreateKeyedAccessLoadMode(bool handle_oob, bool handle_holes)
void ShortPrint(Tagged< Object > obj, FILE *out)
typename detail::FlattenUnionHelper< Union<>, Ts... >::type UnionOf
Tagged< MaybeWeak< T > > MakeWeak(Tagged< T > value)
const char * WasmValueType2String(WasmValueType type)
!IsContextMap !IsContextMap native_context
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
static constexpr RelaxedStoreTag kRelaxedStore
#define DCHECK_NOT_NULL(val)
#define DCHECK_IMPLIES(v1, v2)
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)