Skip to content

Commit b8e264d

Browse files
authored
src: tag v8 aligned pointer slots with embedder data type tags
PR-URL: #60602 Fixes: #60589 Reviewed-By: Joyee Cheung <[email protected]> Reviewed-By: Colin Ihrig <[email protected]> Reviewed-By: Anna Henningsen <[email protected]> Reviewed-By: Yagiz Nizipli <[email protected]> Reviewed-By: Juan José Arboleda <[email protected]> Reviewed-By: Matteo Collina <[email protected]>
1 parent ca91969 commit b8e264d

18 files changed

+120
-58
lines changed

src/README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -126,10 +126,10 @@ Typical ways of working with internal fields are:
126126
* `obj->GetInternalField(i)` to get a JavaScript value from an internal field.
127127
* `obj->SetInternalField(i, v)` to store a JavaScript value in an
128128
internal field.
129-
* `obj->GetAlignedPointerFromInternalField(i)` to get a `void*` pointer from an
130-
internal field.
131-
* `obj->SetAlignedPointerInInternalField(i, p)` to store a `void*` pointer in an
132-
internal field.
129+
* `obj->GetAlignedPointerFromInternalField(i, EmbedderDataTag::kDefault)` to get
130+
a `void*` pointer from an internal field.
131+
* `obj->SetAlignedPointerInInternalField(i, p, EmbedderDataTag::kDefault)` to store
132+
a `void*` pointer in an internal field.
133133

134134
[`Context`][]s provide the same feature under the name “embedder data”.
135135

src/base_object-inl.h

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -74,30 +74,34 @@ bool BaseObject::IsBaseObject(IsolateData* isolate_data,
7474
return false;
7575
}
7676

77-
uint16_t* ptr = static_cast<uint16_t*>(
78-
obj->GetAlignedPointerFromInternalField(BaseObject::kEmbedderType));
77+
uint16_t* ptr =
78+
static_cast<uint16_t*>(obj->GetAlignedPointerFromInternalField(
79+
BaseObject::kEmbedderType, EmbedderDataTag::kEmbedderType));
7980
return ptr == isolate_data->embedder_id_for_non_cppgc();
8081
}
8182

8283
void BaseObject::TagBaseObject(IsolateData* isolate_data,
8384
v8::Local<v8::Object> object) {
8485
DCHECK_GE(object->InternalFieldCount(), BaseObject::kInternalFieldCount);
8586
object->SetAlignedPointerInInternalField(
86-
BaseObject::kEmbedderType, isolate_data->embedder_id_for_non_cppgc());
87+
BaseObject::kEmbedderType,
88+
isolate_data->embedder_id_for_non_cppgc(),
89+
EmbedderDataTag::kEmbedderType);
8790
}
8891

8992
void BaseObject::SetInternalFields(IsolateData* isolate_data,
9093
v8::Local<v8::Object> object,
9194
void* slot) {
9295
TagBaseObject(isolate_data, object);
93-
object->SetAlignedPointerInInternalField(BaseObject::kSlot, slot);
96+
object->SetAlignedPointerInInternalField(
97+
BaseObject::kSlot, slot, EmbedderDataTag::kDefault);
9498
}
9599

96100
BaseObject* BaseObject::FromJSObject(v8::Local<v8::Value> value) {
97101
v8::Local<v8::Object> obj = value.As<v8::Object>();
98102
DCHECK_GE(obj->InternalFieldCount(), BaseObject::kInternalFieldCount);
99-
return static_cast<BaseObject*>(
100-
obj->GetAlignedPointerFromInternalField(BaseObject::kSlot));
103+
return static_cast<BaseObject*>(obj->GetAlignedPointerFromInternalField(
104+
BaseObject::kSlot, EmbedderDataTag::kDefault));
101105
}
102106

103107
template <typename T>

src/base_object.cc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@ BaseObject::~BaseObject() {
4545

4646
{
4747
HandleScope handle_scope(realm()->isolate());
48-
object()->SetAlignedPointerInInternalField(BaseObject::kSlot, nullptr);
48+
object()->SetAlignedPointerInInternalField(
49+
BaseObject::kSlot, nullptr, EmbedderDataTag::kDefault);
4950
}
5051
}
5152

src/base_object.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include <type_traits> // std::remove_reference
2828
#include "base_object_types.h"
2929
#include "memory_tracker.h"
30+
#include "node_v8_embedder.h"
3031
#include "util.h"
3132
#include "v8.h"
3233

src/cppgc_helpers-inl.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,10 @@ void CppgcMixin::Wrap(T* ptr, Realm* realm, v8::Local<v8::Object> obj) {
1919
v8::Object::Wrap<v8::CppHeapPointerTag::kDefaultTag>(isolate, obj, wrappable);
2020
// Keep the layout consistent with BaseObjects.
2121
obj->SetAlignedPointerInInternalField(
22-
kEmbedderType, realm->isolate_data()->embedder_id_for_cppgc());
23-
obj->SetAlignedPointerInInternalField(kSlot, ptr);
22+
kEmbedderType,
23+
realm->isolate_data()->embedder_id_for_cppgc(),
24+
EmbedderDataTag::kEmbedderType);
25+
obj->SetAlignedPointerInInternalField(kSlot, ptr, EmbedderDataTag::kDefault);
2426
realm->TrackCppgcWrapper(ptr);
2527
}
2628

@@ -41,7 +43,8 @@ T* CppgcMixin::Unwrap(v8::Local<v8::Object> obj) {
4143
if (obj->InternalFieldCount() != T::kInternalFieldCount) {
4244
return nullptr;
4345
}
44-
T* ptr = static_cast<T*>(obj->GetAlignedPointerFromInternalField(T::kSlot));
46+
T* ptr = static_cast<T*>(obj->GetAlignedPointerFromInternalField(
47+
T::kSlot, EmbedderDataTag::kDefault));
4548
return ptr;
4649
}
4750

src/env-inl.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -196,9 +196,8 @@ inline Environment* Environment::GetCurrent(v8::Local<v8::Context> context) {
196196
if (!ContextEmbedderTag::IsNodeContext(context)) [[unlikely]] {
197197
return nullptr;
198198
}
199-
return static_cast<Environment*>(
200-
context->GetAlignedPointerFromEmbedderData(
201-
ContextEmbedderIndex::kEnvironment));
199+
return static_cast<Environment*>(context->GetAlignedPointerFromEmbedderData(
200+
ContextEmbedderIndex::kEnvironment, EmbedderDataTag::kPerContextData));
202201
}
203202

204203
inline Environment* Environment::GetCurrent(

src/env.cc

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -674,12 +674,16 @@ void Environment::AssignToContext(Local<v8::Context> context,
674674
Realm* realm,
675675
const ContextInfo& info) {
676676
context->SetAlignedPointerInEmbedderData(ContextEmbedderIndex::kEnvironment,
677-
this);
678-
context->SetAlignedPointerInEmbedderData(ContextEmbedderIndex::kRealm, realm);
677+
this,
678+
EmbedderDataTag::kPerContextData);
679+
context->SetAlignedPointerInEmbedderData(
680+
ContextEmbedderIndex::kRealm, realm, EmbedderDataTag::kPerContextData);
679681

680682
// ContextifyContexts will update this to a pointer to the native object.
681683
context->SetAlignedPointerInEmbedderData(
682-
ContextEmbedderIndex::kContextifyContext, nullptr);
684+
ContextEmbedderIndex::kContextifyContext,
685+
nullptr,
686+
EmbedderDataTag::kPerContextData);
683687

684688
// This must not be done before other context fields are initialized.
685689
ContextEmbedderTag::TagNodeContext(context);
@@ -695,11 +699,15 @@ void Environment::AssignToContext(Local<v8::Context> context,
695699
void Environment::UnassignFromContext(Local<v8::Context> context) {
696700
if (!context.IsEmpty()) {
697701
context->SetAlignedPointerInEmbedderData(ContextEmbedderIndex::kEnvironment,
698-
nullptr);
702+
nullptr,
703+
EmbedderDataTag::kPerContextData);
699704
context->SetAlignedPointerInEmbedderData(ContextEmbedderIndex::kRealm,
700-
nullptr);
705+
nullptr,
706+
EmbedderDataTag::kPerContextData);
701707
context->SetAlignedPointerInEmbedderData(
702-
ContextEmbedderIndex::kContextifyContext, nullptr);
708+
ContextEmbedderIndex::kContextifyContext,
709+
nullptr,
710+
EmbedderDataTag::kPerContextData);
703711
}
704712
UntrackContext(context);
705713
}

src/histogram.cc

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,8 @@ HistogramBase::HistogramBase(
136136
MakeWeak();
137137
wrap->SetAlignedPointerInInternalField(
138138
HistogramImpl::InternalFields::kImplField,
139-
static_cast<HistogramImpl*>(this));
139+
static_cast<HistogramImpl*>(this),
140+
EmbedderDataTag::kDefault);
140141
}
141142

142143
HistogramBase::HistogramBase(
@@ -148,7 +149,8 @@ HistogramBase::HistogramBase(
148149
MakeWeak();
149150
wrap->SetAlignedPointerInInternalField(
150151
HistogramImpl::InternalFields::kImplField,
151-
static_cast<HistogramImpl*>(this));
152+
static_cast<HistogramImpl*>(this),
153+
EmbedderDataTag::kDefault);
152154
}
153155

154156
void HistogramBase::MemoryInfo(MemoryTracker* tracker) const {
@@ -362,7 +364,8 @@ IntervalHistogram::IntervalHistogram(
362364
MakeWeak();
363365
wrap->SetAlignedPointerInInternalField(
364366
HistogramImpl::InternalFields::kImplField,
365-
static_cast<HistogramImpl*>(this));
367+
static_cast<HistogramImpl*>(this),
368+
EmbedderDataTag::kDefault);
366369
uv_timer_init(env->event_loop(), &timer_);
367370
}
368371

@@ -600,8 +603,8 @@ double HistogramImpl::FastGetPercentile(Local<Value> receiver,
600603
HistogramImpl* HistogramImpl::FromJSObject(Local<Value> value) {
601604
auto obj = value.As<Object>();
602605
DCHECK_GE(obj->InternalFieldCount(), HistogramImpl::kInternalFieldCount);
603-
return static_cast<HistogramImpl*>(
604-
obj->GetAlignedPointerFromInternalField(HistogramImpl::kImplField));
606+
return static_cast<HistogramImpl*>(obj->GetAlignedPointerFromInternalField(
607+
HistogramImpl::kImplField, EmbedderDataTag::kDefault));
605608
}
606609

607610
std::unique_ptr<worker::TransferData>

src/js_udp_wrap.cc

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,9 @@ JSUDPWrap::JSUDPWrap(Environment* env, Local<Object> obj)
5555
: AsyncWrap(env, obj, PROVIDER_JSUDPWRAP) {
5656
MakeWeak();
5757

58-
obj->SetAlignedPointerInInternalField(
59-
kUDPWrapBaseField, static_cast<UDPWrapBase*>(this));
58+
obj->SetAlignedPointerInInternalField(kUDPWrapBaseField,
59+
static_cast<UDPWrapBase*>(this),
60+
EmbedderDataTag::kDefault);
6061
}
6162

6263
int JSUDPWrap::RecvStart() {

src/node_context_data.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
#if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
55

6+
#include "node_v8_embedder.h"
67
#include "util.h"
78
#include "v8.h"
89

@@ -135,7 +136,8 @@ class ContextEmbedderTag {
135136
// context.
136137
context->SetAlignedPointerInEmbedderData(
137138
ContextEmbedderIndex::kContextTag,
138-
ContextEmbedderTag::kNodeContextTagPtr);
139+
ContextEmbedderTag::kNodeContextTagPtr,
140+
EmbedderDataTag::kPerContextData);
139141
}
140142

141143
static inline bool IsNodeContext(v8::Local<v8::Context> context) {
@@ -147,7 +149,8 @@ class ContextEmbedderTag {
147149
return false;
148150
}
149151
if (context->GetAlignedPointerFromEmbedderData(
150-
ContextEmbedderIndex::kContextTag) !=
152+
ContextEmbedderIndex::kContextTag,
153+
EmbedderDataTag::kPerContextData) !=
151154
ContextEmbedderTag::kNodeContextTagPtr) [[unlikely]] {
152155
return false;
153156
}

0 commit comments

Comments
 (0)