Skip to content

Commit 55dbc22

Browse files
deps: patch V8 to undefined
Refs: v8/v8@15.5.35.20...15.5.35.22
1 parent 04bd737 commit 55dbc22

8 files changed

Lines changed: 77 additions & 2 deletions

File tree

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
#define V8_MAJOR_VERSION 15
1212
#define V8_MINOR_VERSION 5
1313
#define V8_BUILD_NUMBER 35
14-
#define V8_PATCH_LEVEL 20
14+
#define V8_PATCH_LEVEL 22
1515

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

‎deps/v8/src/maglev/maglev-code-gen-state.h‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
#ifndef V8_MAGLEV_MAGLEV_CODE_GEN_STATE_H_
66
#define V8_MAGLEV_MAGLEV_CODE_GEN_STATE_H_
77

8+
#include <unordered_set>
9+
810
#include "src/codegen/assembler.h"
911
#include "src/codegen/label.h"
1012
#include "src/codegen/machine-type.h"
@@ -132,6 +134,15 @@ class MaglevCodeGenState {
132134

133135
inline BasicBlock* RealJumpTarget(BasicBlock* block);
134136

137+
using RetainedObjects =
138+
std::unordered_set<Handle<HeapObject>, Handle<HeapObject>::hash,
139+
Handle<HeapObject>::equal_to>;
140+
void Retain(Handle<HeapObject> heap_object) {
141+
retained_objects_.insert(heap_object);
142+
}
143+
144+
const RetainedObjects& retained_objects() const { return retained_objects_; }
145+
135146
private:
136147
MaglevCompilationInfo* const compilation_info_;
137148
MaglevSafepointTableBuilder* const safepoint_table_builder_;
@@ -143,6 +154,8 @@ class MaglevCodeGenState {
143154
std::vector<LazyDeoptInfo*> lazy_deopts_;
144155
std::vector<NodeBase*> handlers_;
145156

157+
RetainedObjects retained_objects_;
158+
146159
int untagged_slots_ = 0;
147160
int tagged_slots_ = 0;
148161
uint32_t max_deopted_stack_size_ = kMaxUInt32;

‎deps/v8/src/maglev/maglev-code-generator.cc‎

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1882,6 +1882,7 @@ bool MaglevCodeGenerator::EmitCode() {
18821882
EmitDeferredCode();
18831883
if (!EmitDeopts()) return false;
18841884
EmitExceptionHandlerTrampolines();
1885+
EmitRetainedObjects();
18851886
__ FinishCode();
18861887

18871888
code_gen_succeeded_ = true;
@@ -2031,6 +2032,21 @@ void MaglevCodeGenerator::EmitExceptionHandlerTrampolines() {
20312032
#endif
20322033
}
20332034

2035+
void MaglevCodeGenerator::EmitRetainedObjects() {
2036+
if (code_gen_state_.retained_objects().empty()) return;
2037+
2038+
// This code is never executed; it's just for inserting weak embedded objects
2039+
// into the code.
2040+
__ RecordComment("-- Retained objects");
2041+
__ Trap();
2042+
2043+
MaglevAssembler::TemporaryRegisterScope temps(masm());
2044+
Register scratch = temps.AcquireScratch();
2045+
for (Handle<HeapObject> heap_object : code_gen_state_.retained_objects()) {
2046+
__ Move(scratch, heap_object);
2047+
}
2048+
}
2049+
20342050
void MaglevCodeGenerator::EmitMetadata() {
20352051
// Final alignment before starting on the metadata section.
20362052
masm()->Align(InstructionStream::kMetadataAlignment);

‎deps/v8/src/maglev/maglev-code-generator.h‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ class MaglevCodeGenerator final {
4141
void EmitDeferredCode();
4242
V8_NODISCARD bool EmitDeopts();
4343
void EmitExceptionHandlerTrampolines();
44+
void EmitRetainedObjects();
4445
void EmitMetadata();
4546
void RecordInlinedFunctions();
4647

‎deps/v8/src/maglev/maglev-ir.cc‎

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8162,6 +8162,18 @@ void GenerateTypedArrayLoadFromDataPointer(MaglevAssembler* masm,
81628162
}
81638163
}
81648164

8165+
void RetainConstantTypedArrayBuffer(MaglevAssembler* masm,
8166+
compiler::JSTypedArrayRef typed_array) {
8167+
// The constant typed array comes from a constant-folded source (property
8168+
// cell, const field, ...) which holds it strongly, and the code depends on
8169+
// that source not changing. So the buffer behind the embedded data pointer
8170+
// cannot die while this code is valid. Embed the buffer anyway as defense in
8171+
// depth: with this weak reference, the code is deoptimized when the buffer
8172+
// dies.
8173+
masm->code_gen_state()->Retain(
8174+
typed_array.buffer(masm->compilation_info()->broker()).object());
8175+
}
8176+
81658177
template <typename ResultReg>
81668178
void GenerateTypedArrayLoad(MaglevAssembler* masm, Register object,
81678179
Register index, ResultReg result_reg,
@@ -8189,6 +8201,8 @@ void GenerateConstantTypedArrayLoad(MaglevAssembler* masm,
81898201
compiler::JSTypedArrayRef typed_array,
81908202
Register index, ResultReg result_reg,
81918203
ElementsKind kind) {
8204+
RetainConstantTypedArrayBuffer(masm, typed_array);
8205+
81928206
MaglevAssembler::TemporaryRegisterScope temps(masm);
81938207
Register data_pointer = temps.Acquire();
81948208
__ Move(data_pointer, reinterpret_cast<intptr_t>(typed_array.data_ptr()));
@@ -8250,6 +8264,8 @@ void GenerateConstantTypedArrayStore(MaglevAssembler* masm,
82508264
compiler::JSTypedArrayRef typed_array,
82518265
Register index, ValueReg value,
82528266
ElementsKind elements_kind) {
8267+
RetainConstantTypedArrayBuffer(masm, typed_array);
8268+
82538269
MaglevAssembler::TemporaryRegisterScope temps(masm);
82548270
Register data_pointer = temps.Acquire();
82558271

‎deps/v8/src/objects/js-objects.cc‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -478,6 +478,9 @@ Maybe<bool> JSReceiver::SetOrCopyDataProperties(
478478
InstanceType target_instance_type = target->map()->instance_type();
479479
if (InstanceTypeChecker::IsJSObject(target_instance_type) &&
480480
!InstanceTypeChecker::IsJSGlobalProxy(target_instance_type) &&
481+
// Exclude remote objects (they don't have local properties anyway).
482+
!(InstanceTypeChecker::IsJSSpecialApiObject(target_instance_type) &&
483+
!target->GetCreationContext().has_value()) &&
481484
!InstanceTypeChecker::IsAlwaysSharedSpaceJSObject(
482485
target_instance_type)) {
483486
// Convert to slow properties if we're guaranteed to overflow the number

‎deps/v8/src/objects/map.cc‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1378,8 +1378,10 @@ Handle<Map> Map::Normalize(Isolate* isolate, DirectHandle<Map> fast_map,
13781378
}
13791379
DirectHandle<NormalizedMapCache> cache;
13801380
if (use_cache) {
1381+
Tagged<Object> maybe_native_context = meta_map->native_context_or_null();
1382+
DCHECK(!IsNull(maybe_native_context));
13811383
Tagged<Object> normalized_map_cache =
1382-
meta_map->native_context()->normalized_map_cache();
1384+
Cast<NativeContext>(maybe_native_context)->normalized_map_cache();
13831385
use_cache = !IsUndefined(normalized_map_cache);
13841386
if (use_cache) {
13851387
cache = Cast<NormalizedMapCache>(

‎deps/v8/test/unittests/api/remote-object-unittest.cc‎

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,5 +101,29 @@ TEST_F(RemoteObjectTest, TypeOfRemoteObject) {
101101
EXPECT_STREQ("object", *result);
102102
}
103103

104+
TEST_F(RemoteObjectTest, NormalizeRemoteObject) {
105+
Local<FunctionTemplate> constructor_template =
106+
FunctionTemplate::New(isolate(), Constructor);
107+
constructor_template->InstanceTemplate()->SetAccessCheckCallbackAndHandler(
108+
AccessCheck, NamedPropertyHandlerConfiguration(NamedGetter),
109+
IndexedPropertyHandlerConfiguration());
110+
111+
Local<Object> remote_object =
112+
constructor_template->NewRemoteInstance().ToLocalChecked();
113+
114+
Local<Context> context = Context::New(isolate());
115+
Context::Scope context_scope(context);
116+
117+
context->Global()
118+
->Set(context, String::NewFromUtf8Literal(isolate(), "remoteObj"),
119+
remote_object)
120+
.Check();
121+
122+
TryRunJS(
123+
"const src = {};"
124+
"for (let i = 0; i < 1200; i++) src['p' + i] = 1;"
125+
"try { Object.assign(remoteObj, src); } catch (e) {}");
126+
}
127+
104128
} // namespace remote_object_unittest
105129
} // namespace v8

0 commit comments

Comments
 (0)