diff options
author | Michaël Zasso <targos@protonmail.com> | 2021-06-08 14:04:59 +0200 |
---|---|---|
committer | Michaël Zasso <targos@protonmail.com> | 2021-06-10 11:10:13 +0200 |
commit | a7cbf19a82c75e9a65e90fb8ba4947e2fc52ef39 (patch) | |
tree | dadfaa9c63c5d8db997b7c7aacc313b04131157c /deps/v8/src/builtins/builtins-internal-gen.cc | |
parent | 8834ec9f5c522f7d800d85b245a9806418515b7c (diff) | |
download | node-new-a7cbf19a82c75e9a65e90fb8ba4947e2fc52ef39.tar.gz |
deps: update V8 to 9.1.269.36
PR-URL: https://github.com/nodejs/node/pull/38273
Reviewed-By: Jiawen Geng <technicalcute@gmail.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com>
Reviewed-By: Michael Dawson <midawson@redhat.com>
Reviewed-By: Mary Marchini <oss@mmarchini.me>
Diffstat (limited to 'deps/v8/src/builtins/builtins-internal-gen.cc')
-rw-r--r-- | deps/v8/src/builtins/builtins-internal-gen.cc | 108 |
1 files changed, 64 insertions, 44 deletions
diff --git a/deps/v8/src/builtins/builtins-internal-gen.cc b/deps/v8/src/builtins/builtins-internal-gen.cc index 29cca9d93a..0c4131dba9 100644 --- a/deps/v8/src/builtins/builtins-internal-gen.cc +++ b/deps/v8/src/builtins/builtins-internal-gen.cc @@ -312,6 +312,9 @@ TF_BUILTIN(RecordWrite, RecordWriteCodeStubAssembler) { Label incremental_wb(this); Label exit(this); + // In this method we limit the allocatable registers so we have to use + // UncheckedParameter. Parameter does not work because the checked cast needs + // more registers. auto remembered_set = UncheckedParameter<Smi>(Descriptor::kRememberedSet); Branch(ShouldEmitRememberSet(remembered_set), &generational_wb, &incremental_wb); @@ -333,8 +336,7 @@ TF_BUILTIN(RecordWrite, RecordWriteCodeStubAssembler) { BIND(&test_old_to_young_flags); { // TODO(ishell): do a new-space range check instead. - TNode<IntPtrT> value = - BitcastTaggedToWord(Load(MachineType::TaggedPointer(), slot)); + TNode<IntPtrT> value = BitcastTaggedToWord(Load<HeapObject>(slot)); // TODO(albertnetymk): Try to cache the page flag for value and object, // instead of calling IsPageFlagSet each time. @@ -343,7 +345,7 @@ TF_BUILTIN(RecordWrite, RecordWriteCodeStubAssembler) { GotoIfNot(value_is_young, &incremental_wb); TNode<IntPtrT> object = - BitcastTaggedToWord(UntypedParameter(Descriptor::kObject)); + BitcastTaggedToWord(UncheckedParameter<Object>(Descriptor::kObject)); TNode<BoolT> object_is_young = IsPageFlagSet(object, MemoryChunk::kIsInYoungGenerationMask); Branch(object_is_young, &incremental_wb, &store_buffer_incremental_wb); @@ -353,7 +355,7 @@ TF_BUILTIN(RecordWrite, RecordWriteCodeStubAssembler) { { auto fp_mode = UncheckedParameter<Smi>(Descriptor::kFPMode); TNode<IntPtrT> object = - BitcastTaggedToWord(UntypedParameter(Descriptor::kObject)); + BitcastTaggedToWord(UncheckedParameter<Object>(Descriptor::kObject)); InsertIntoRememberedSetAndGoto(object, slot, fp_mode, &exit); } @@ -361,7 +363,7 @@ TF_BUILTIN(RecordWrite, RecordWriteCodeStubAssembler) { { auto fp_mode = UncheckedParameter<Smi>(Descriptor::kFPMode); TNode<IntPtrT> object = - BitcastTaggedToWord(UntypedParameter(Descriptor::kObject)); + BitcastTaggedToWord(UncheckedParameter<Object>(Descriptor::kObject)); InsertIntoRememberedSetAndGoto(object, slot, fp_mode, &incremental_wb); } } @@ -371,8 +373,7 @@ TF_BUILTIN(RecordWrite, RecordWriteCodeStubAssembler) { Label call_incremental_wb(this); auto slot = UncheckedParameter<IntPtrT>(Descriptor::kSlot); - TNode<IntPtrT> value = - BitcastTaggedToWord(Load(MachineType::TaggedPointer(), slot)); + TNode<IntPtrT> value = BitcastTaggedToWord(Load<HeapObject>(slot)); // There are two cases we need to call incremental write barrier. // 1) value_is_white @@ -384,7 +385,7 @@ TF_BUILTIN(RecordWrite, RecordWriteCodeStubAssembler) { &exit); TNode<IntPtrT> object = - BitcastTaggedToWord(UntypedParameter(Descriptor::kObject)); + BitcastTaggedToWord(UncheckedParameter<Object>(Descriptor::kObject)); Branch( IsPageFlagSet(object, MemoryChunk::kSkipEvacuationSlotsRecordingMask), &exit, &call_incremental_wb); @@ -395,7 +396,7 @@ TF_BUILTIN(RecordWrite, RecordWriteCodeStubAssembler) { ExternalReference::write_barrier_marking_from_code_function()); auto fp_mode = UncheckedParameter<Smi>(Descriptor::kFPMode); TNode<IntPtrT> object = - BitcastTaggedToWord(UntypedParameter(Descriptor::kObject)); + BitcastTaggedToWord(UncheckedParameter<Object>(Descriptor::kObject)); CallCFunction2WithCallerSavedRegistersMode<Int32T, IntPtrT, IntPtrT>( function, object, slot, fp_mode, &exit); } @@ -413,9 +414,12 @@ TF_BUILTIN(EphemeronKeyBarrier, RecordWriteCodeStubAssembler) { ExternalReference::ephemeron_key_write_barrier_function()); TNode<ExternalReference> isolate_constant = ExternalConstant(ExternalReference::isolate_address(isolate())); + // In this method we limit the allocatable registers so we have to use + // UncheckedParameter. Parameter does not work because the checked cast needs + // more registers. auto address = UncheckedParameter<IntPtrT>(Descriptor::kSlotAddress); TNode<IntPtrT> object = - BitcastTaggedToWord(UntypedParameter(Descriptor::kObject)); + BitcastTaggedToWord(UncheckedParameter<Object>(Descriptor::kObject)); TNode<Smi> fp_mode = UncheckedParameter<Smi>(Descriptor::kFPMode); CallCFunction3WithCallerSavedRegistersMode<Int32T, IntPtrT, IntPtrT, ExternalReference>( @@ -431,20 +435,10 @@ class DeletePropertyBaseAssembler : public AccessorAssembler { explicit DeletePropertyBaseAssembler(compiler::CodeAssemblerState* state) : AccessorAssembler(state) {} - void DeleteDictionaryProperty(TNode<Object> receiver, + void DictionarySpecificDelete(TNode<JSReceiver> receiver, TNode<NameDictionary> properties, - TNode<Name> name, TNode<Context> context, - Label* dont_delete, Label* notfound) { - TVARIABLE(IntPtrT, var_name_index); - Label dictionary_found(this, &var_name_index); - NameDictionaryLookup<NameDictionary>(properties, name, &dictionary_found, - &var_name_index, notfound); - - BIND(&dictionary_found); - TNode<IntPtrT> key_index = var_name_index.value(); - TNode<Uint32T> details = LoadDetailsByKeyIndex(properties, key_index); - GotoIf(IsSetWord32(details, PropertyDetails::kAttributesDontDeleteMask), - dont_delete); + TNode<IntPtrT> key_index, + TNode<Context> context) { // Overwrite the entry itself (see NameDictionary::SetEntry). TNode<Oddball> filler = TheHoleConstant(); DCHECK(RootsTable::IsImmortalImmovable(RootIndex::kTheHoleValue)); @@ -468,9 +462,49 @@ class DeletePropertyBaseAssembler : public AccessorAssembler { TNode<Smi> capacity = GetCapacity<NameDictionary>(properties); GotoIf(SmiGreaterThan(new_nof, SmiShr(capacity, 2)), &shrinking_done); GotoIf(SmiLessThan(new_nof, SmiConstant(16)), &shrinking_done); - CallRuntime(Runtime::kShrinkPropertyDictionary, context, receiver); + + TNode<NameDictionary> new_properties = + CAST(CallRuntime(Runtime::kShrinkNameDictionary, context, properties)); + + StoreJSReceiverPropertiesOrHash(receiver, new_properties); + Goto(&shrinking_done); BIND(&shrinking_done); + } + + void DictionarySpecificDelete(TNode<JSReceiver> receiver, + TNode<SwissNameDictionary> properties, + TNode<IntPtrT> key_index, + TNode<Context> context) { + Label shrunk(this), done(this); + TVARIABLE(SwissNameDictionary, shrunk_table); + + SwissNameDictionaryDelete(properties, key_index, &shrunk, &shrunk_table); + Goto(&done); + BIND(&shrunk); + StoreJSReceiverPropertiesOrHash(receiver, shrunk_table.value()); + Goto(&done); + + BIND(&done); + } + + template <typename Dictionary> + void DeleteDictionaryProperty(TNode<JSReceiver> receiver, + TNode<Dictionary> properties, TNode<Name> name, + TNode<Context> context, Label* dont_delete, + Label* notfound) { + TVARIABLE(IntPtrT, var_name_index); + Label dictionary_found(this, &var_name_index); + NameDictionaryLookup<Dictionary>(properties, name, &dictionary_found, + &var_name_index, notfound); + + BIND(&dictionary_found); + TNode<IntPtrT> key_index = var_name_index.value(); + TNode<Uint32T> details = LoadDetailsByKeyIndex(properties, key_index); + GotoIf(IsSetWord32(details, PropertyDetails::kAttributesDontDeleteMask), + dont_delete); + + DictionarySpecificDelete(receiver, properties, key_index, context); Return(TrueConstant()); } @@ -487,11 +521,6 @@ TF_BUILTIN(DeleteProperty, DeletePropertyBaseAssembler) { Label if_index(this, &var_index), if_unique_name(this), if_notunique(this), if_notfound(this), slow(this), if_proxy(this); - if (V8_DICT_MODE_PROTOTYPES_BOOL) { - // TODO(v8:11167) remove once OrderedNameDictionary supported. - GotoIf(Int32TrueConstant(), &slow); - } - GotoIf(TaggedIsSmi(receiver), &slow); TNode<Map> receiver_map = LoadMap(CAST(receiver)); TNode<Uint16T> instance_type = LoadMapInstanceType(receiver_map); @@ -514,17 +543,17 @@ TF_BUILTIN(DeleteProperty, DeletePropertyBaseAssembler) { Label dictionary(this), dont_delete(this); GotoIf(IsDictionaryMap(receiver_map), &dictionary); - // Fast properties need to clear recorded slots, which can only be done - // in C++. + // Fast properties need to clear recorded slots and mark the deleted + // property as mutable, which can only be done in C++. Goto(&slow); BIND(&dictionary); { InvalidateValidityCellIfPrototype(receiver_map); - TNode<NameDictionary> properties = + TNode<PropertyDictionary> properties = CAST(LoadSlowProperties(CAST(receiver))); - DeleteDictionaryProperty(receiver, properties, var_unique.value(), + DeleteDictionaryProperty(CAST(receiver), properties, var_unique.value(), context, &dont_delete, &if_notfound); } @@ -926,7 +955,8 @@ void Builtins::Generate_MemMove(MacroAssembler* masm) { // TODO(v8:11421): Remove #if once baseline compiler is ported to other // architectures. -#if V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64 +#if V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64 || \ + V8_TARGET_ARCH_ARM void Builtins::Generate_BaselineLeaveFrame(MacroAssembler* masm) { EmitReturnBaseline(masm); } @@ -956,11 +986,6 @@ TF_BUILTIN(GetProperty, CodeStubAssembler) { Label if_notfound(this), if_proxy(this, Label::kDeferred), if_slow(this, Label::kDeferred); - if (V8_DICT_MODE_PROTOTYPES_BOOL) { - // TODO(v8:11167) remove once OrderedNameDictionary supported. - GotoIf(Int32TrueConstant(), &if_slow); - } - CodeStubAssembler::LookupPropertyInHolder lookup_property_in_holder = [=](TNode<HeapObject> receiver, TNode<HeapObject> holder, TNode<Map> holder_map, TNode<Int32T> holder_instance_type, @@ -1016,11 +1041,6 @@ TF_BUILTIN(GetPropertyWithReceiver, CodeStubAssembler) { Label if_notfound(this), if_proxy(this, Label::kDeferred), if_slow(this, Label::kDeferred); - if (V8_DICT_MODE_PROTOTYPES_BOOL) { - // TODO(v8:11167) remove once OrderedNameDictionary supported. - GotoIf(Int32TrueConstant(), &if_slow); - } - CodeStubAssembler::LookupPropertyInHolder lookup_property_in_holder = [=](TNode<HeapObject> receiver, TNode<HeapObject> holder, TNode<Map> holder_map, TNode<Int32T> holder_instance_type, |