Skip to content

Commit 5bef743

Browse files
committedNov 8, 2021
deps: patch V8 to 9.5.172.25
Refs: v8/v8@9.5.172.21...9.5.172.25 PR-URL: #40604 Reviewed-By: Jiawen Geng <[email protected]> Reviewed-By: Antoine du Hamel <[email protected]>
1 parent d97872d commit 5bef743

File tree

8 files changed

+75
-12
lines changed

8 files changed

+75
-12
lines changed
 

‎deps/v8/include/v8-version.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
#define V8_MAJOR_VERSION 9
1212
#define V8_MINOR_VERSION 5
1313
#define V8_BUILD_NUMBER 172
14-
#define V8_PATCH_LEVEL 21
14+
#define V8_PATCH_LEVEL 25
1515

1616
// Use 1 for candidates and 0 otherwise.
1717
// (Boolean macro values are not supported by all preprocessors.)

‎deps/v8/src/compiler/backend/ia32/code-generator-ia32.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -343,8 +343,8 @@ class OutOfLineRecordWrite final : public OutOfLineCode {
343343
__ CallRecordWriteStubSaveRegisters(object_, scratch1_,
344344
remembered_set_action, save_fp_mode,
345345
StubCallMode::kCallWasmRuntimeStub);
346-
} else {
347346
#endif // V8_ENABLE_WEBASSEMBLY
347+
} else {
348348
__ CallRecordWriteStubSaveRegisters(object_, scratch1_,
349349
remembered_set_action, save_fp_mode);
350350
}

‎deps/v8/src/execution/isolate-inl.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ bool Isolate::has_pending_message() {
5050
}
5151

5252
Object Isolate::pending_exception() {
53-
DCHECK(has_pending_exception());
53+
CHECK(has_pending_exception());
5454
DCHECK(!thread_local_top()->pending_exception_.IsException(this));
5555
return thread_local_top()->pending_exception_;
5656
}

‎deps/v8/src/heap/cppgc/marker.cc

+1
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,7 @@ void MarkerBase::EnterAtomicPause(MarkingConfig::StackState stack_state) {
243243
}
244244
config_.stack_state = stack_state;
245245
config_.marking_type = MarkingConfig::MarkingType::kAtomic;
246+
mutator_marking_state_.set_in_atomic_pause();
246247

247248
// Lock guards against changes to {Weak}CrossThreadPersistent handles, that
248249
// may conflict with marking. E.g., a WeakCrossThreadPersistent may be

‎deps/v8/src/heap/cppgc/marking-state.h

+17-6
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
#include "include/cppgc/trace-trait.h"
1111
#include "include/cppgc/visitor.h"
12+
#include "src/base/logging.h"
1213
#include "src/heap/cppgc/compaction-worklists.h"
1314
#include "src/heap/cppgc/globals.h"
1415
#include "src/heap/cppgc/heap-object-header.h"
@@ -123,6 +124,8 @@ class MarkingStateBase {
123124
discovered_new_ephemeron_pairs_ = false;
124125
}
125126

127+
void set_in_atomic_pause() { in_atomic_pause_ = true; }
128+
126129
protected:
127130
inline void MarkAndPush(HeapObjectHeader&, TraceDescriptor);
128131

@@ -160,6 +163,7 @@ class MarkingStateBase {
160163
size_t marked_bytes_ = 0;
161164
bool in_ephemeron_processing_ = false;
162165
bool discovered_new_ephemeron_pairs_ = false;
166+
bool in_atomic_pause_ = false;
163167
};
164168

165169
MarkingStateBase::MarkingStateBase(HeapBase& heap,
@@ -300,12 +304,19 @@ void MarkingStateBase::ProcessEphemeron(const void* key, const void* value,
300304
// would break the main marking loop.
301305
DCHECK(!in_ephemeron_processing_);
302306
in_ephemeron_processing_ = true;
303-
// Filter out already marked keys. The write barrier for WeakMember
304-
// ensures that any newly set value after this point is kept alive and does
305-
// not require the callback.
306-
if (!HeapObjectHeader::FromObject(key)
307-
.IsInConstruction<AccessMode::kAtomic>() &&
308-
HeapObjectHeader::FromObject(key).IsMarked<AccessMode::kAtomic>()) {
307+
// Keys are considered live even in incremental/concurrent marking settings
308+
// because the write barrier for WeakMember ensures that any newly set value
309+
// after this point is kept alive and does not require the callback.
310+
const bool key_in_construction =
311+
HeapObjectHeader::FromObject(key).IsInConstruction<AccessMode::kAtomic>();
312+
const bool key_considered_as_live =
313+
key_in_construction
314+
? in_atomic_pause_
315+
: HeapObjectHeader::FromObject(key).IsMarked<AccessMode::kAtomic>();
316+
DCHECK_IMPLIES(
317+
key_in_construction && in_atomic_pause_,
318+
HeapObjectHeader::FromObject(key).IsMarked<AccessMode::kAtomic>());
319+
if (key_considered_as_live) {
309320
if (value_desc.base_object_payload) {
310321
MarkAndPush(value_desc.base_object_payload, value_desc);
311322
} else {

‎deps/v8/src/ic/accessor-assembler.cc

+2-2
Original file line numberDiff line numberDiff line change
@@ -846,8 +846,8 @@ void AccessorAssembler::HandleLoadICSmiHandlerLoadNamedCase(
846846
Comment("module export");
847847
TNode<UintPtrT> index =
848848
DecodeWord<LoadHandler::ExportsIndexBits>(handler_word);
849-
TNode<Module> module = LoadObjectField<Module>(
850-
CAST(p->receiver()), JSModuleNamespace::kModuleOffset);
849+
TNode<Module> module =
850+
LoadObjectField<Module>(CAST(holder), JSModuleNamespace::kModuleOffset);
851851
TNode<ObjectHashTable> exports =
852852
LoadObjectField<ObjectHashTable>(module, Module::kExportsOffset);
853853
TNode<Cell> cell = CAST(LoadFixedArrayElement(exports, index));

‎deps/v8/src/ic/ic.cc

+7-1
Original file line numberDiff line numberDiff line change
@@ -989,7 +989,13 @@ Handle<Object> LoadIC::ComputeHandler(LookupIterator* lookup) {
989989
// We found the accessor, so the entry must exist.
990990
DCHECK(entry.is_found());
991991
int index = ObjectHashTable::EntryToValueIndex(entry);
992-
return LoadHandler::LoadModuleExport(isolate(), index);
992+
Handle<Smi> smi_handler =
993+
LoadHandler::LoadModuleExport(isolate(), index);
994+
if (holder_is_lookup_start_object) {
995+
return smi_handler;
996+
}
997+
return LoadHandler::LoadFromPrototype(isolate(), map, holder,
998+
smi_handler);
993999
}
9941000

9951001
Handle<Object> accessors = lookup->GetAccessors();

‎deps/v8/test/unittests/heap/cppgc/ephemeron-pair-unittest.cc

+45
Original file line numberDiff line numberDiff line change
@@ -242,5 +242,50 @@ TEST_F(EphemeronPairTest, EphemeronPairWithEmptyMixinValue) {
242242
FinishMarking();
243243
}
244244

245+
namespace {
246+
247+
class KeyWithCallback final : public GarbageCollected<KeyWithCallback> {
248+
public:
249+
template <typename Callback>
250+
explicit KeyWithCallback(Callback callback) {
251+
callback(this);
252+
}
253+
void Trace(Visitor*) const {}
254+
};
255+
256+
class EphemeronHolderForKeyWithCallback final
257+
: public GarbageCollected<EphemeronHolderForKeyWithCallback> {
258+
public:
259+
EphemeronHolderForKeyWithCallback(KeyWithCallback* key, GCed* value)
260+
: ephemeron_pair_(key, value) {}
261+
void Trace(cppgc::Visitor* visitor) const { visitor->Trace(ephemeron_pair_); }
262+
263+
private:
264+
const EphemeronPair<KeyWithCallback, GCed> ephemeron_pair_;
265+
};
266+
267+
} // namespace
268+
269+
TEST_F(EphemeronPairTest, EphemeronPairWithKeyInConstruction) {
270+
GCed* value = MakeGarbageCollected<GCed>(GetAllocationHandle());
271+
Persistent<EphemeronHolderForKeyWithCallback> holder;
272+
InitializeMarker(*Heap::From(GetHeap()), GetPlatformHandle().get());
273+
FinishSteps();
274+
MakeGarbageCollected<KeyWithCallback>(
275+
GetAllocationHandle(), [this, &holder, value](KeyWithCallback* thiz) {
276+
// The test doesn't use conservative stack scanning to retain key to
277+
// avoid retaining value as a side effect.
278+
EXPECT_TRUE(HeapObjectHeader::FromObject(thiz).TryMarkAtomic());
279+
holder = MakeGarbageCollected<EphemeronHolderForKeyWithCallback>(
280+
GetAllocationHandle(), thiz, value);
281+
// Finishing marking at this point will leave an ephemeron pair
282+
// reachable where the key is still in construction. The GC needs to
283+
// mark the value for such pairs as live in the atomic pause as they key
284+
// is considered live.
285+
FinishMarking();
286+
});
287+
EXPECT_TRUE(HeapObjectHeader::FromObject(value).IsMarked());
288+
}
289+
245290
} // namespace internal
246291
} // namespace cppgc

0 commit comments

Comments
 (0)
Please sign in to comment.