GeezerVison is showing github.com — src: tag v8 aligned pointer slots with embedder data type tags · nodejs/node@b8e264d
File treeExpand file treeCollapse file tree Open diff view settings Expand file treeCollapse file tree Open diff view settings Collapse file Copy file name to clipboardExpand all lines: src/README.md +4-4Lines changed: 4 additions & 4 deletions - Display the source diff
- Display the rich diff
| Original file line number | Diff line number | Diff line change |
|---|
@@ -126,10 +126,10 @@ Typical ways of working with internal fields are: | 126 | 126 | * `obj->GetInternalField(i)` to get a JavaScript value from an internal field. | 127 | 127 | * `obj->SetInternalField(i, v)` to store a JavaScript value in an | 128 | 128 | 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. | 133 | 133 |
| 134 | 134 | [`Context`][]s provide the same feature under the name “embedder data”. | 135 | 135 |
| |
Collapse file Copy file name to clipboardExpand all lines: src/base_object-inl.h +10-6Lines changed: 10 additions & 6 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -74,30 +74,34 @@ bool BaseObject::IsBaseObject(IsolateData* isolate_data, | 74 | 74 | return false; | 75 | 75 | } | 76 | 76 |
| 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)); | 79 | 80 | return ptr == isolate_data->embedder_id_for_non_cppgc(); | 80 | 81 | } | 81 | 82 |
| 82 | 83 | void BaseObject::TagBaseObject(IsolateData* isolate_data, | 83 | 84 | v8::Local<v8::Object> object) { | 84 | 85 | DCHECK_GE(object->InternalFieldCount(), BaseObject::kInternalFieldCount); | 85 | 86 | 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); | 87 | 90 | } | 88 | 91 |
| 89 | 92 | void BaseObject::SetInternalFields(IsolateData* isolate_data, | 90 | 93 | v8::Local<v8::Object> object, | 91 | 94 | void* slot) { | 92 | 95 | TagBaseObject(isolate_data, object); | 93 | | - object->SetAlignedPointerInInternalField(BaseObject::kSlot, slot); | | 96 | + object->SetAlignedPointerInInternalField( | | 97 | + BaseObject::kSlot, slot, EmbedderDataTag::kDefault); | 94 | 98 | } | 95 | 99 |
| 96 | 100 | BaseObject* BaseObject::FromJSObject(v8::Local<v8::Value> value) { | 97 | 101 | v8::Local<v8::Object> obj = value.As<v8::Object>(); | 98 | 102 | 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)); | 101 | 105 | } | 102 | 106 |
| 103 | 107 | template <typename T> | |
Collapse file Copy file name to clipboardExpand all lines: src/base_object.cc +2-1Lines changed: 2 additions & 1 deletion | Original file line number | Diff line number | Diff line change |
|---|
@@ -45,7 +45,8 @@ BaseObject::~BaseObject() { | 45 | 45 |
| 46 | 46 | { | 47 | 47 | HandleScope handle_scope(realm()->isolate()); | 48 | | - object()->SetAlignedPointerInInternalField(BaseObject::kSlot, nullptr); | | 48 | + object()->SetAlignedPointerInInternalField( | | 49 | + BaseObject::kSlot, nullptr, EmbedderDataTag::kDefault); | 49 | 50 | } | 50 | 51 | } | 51 | 52 |
| |
Collapse file Copy file name to clipboardExpand all lines: src/base_object.h +1Lines changed: 1 addition & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
| 27 | 27 | #include <type_traits> // std::remove_reference | 28 | 28 | #include "base_object_types.h" | 29 | 29 | #include "memory_tracker.h" | | 30 | +#include "node_v8_embedder.h" | 30 | 31 | #include "util.h" | 31 | 32 | #include "v8.h" | 32 | 33 |
| |
Collapse file Copy file name to clipboardExpand all lines: src/cppgc_helpers-inl.h +6-3Lines changed: 6 additions & 3 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -19,8 +19,10 @@ void CppgcMixin::Wrap(T* ptr, Realm* realm, v8::Local<v8::Object> obj) { | 19 | 19 | v8::Object::Wrap<v8::CppHeapPointerTag::kDefaultTag>(isolate, obj, wrappable); | 20 | 20 | // Keep the layout consistent with BaseObjects. | 21 | 21 | 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); | 24 | 26 | realm->TrackCppgcWrapper(ptr); | 25 | 27 | } | 26 | 28 |
| @@ -41,7 +43,8 @@ T* CppgcMixin::Unwrap(v8::Local<v8::Object> obj) { | 41 | 43 | if (obj->InternalFieldCount() != T::kInternalFieldCount) { | 42 | 44 | return nullptr; | 43 | 45 | } | 44 | | - T* ptr = static_cast<T*>(obj->GetAlignedPointerFromInternalField(T::kSlot)); | | 46 | + T* ptr = static_cast<T*>(obj->GetAlignedPointerFromInternalField( | | 47 | + T::kSlot, EmbedderDataTag::kDefault)); | 45 | 48 | return ptr; | 46 | 49 | } | 47 | 50 |
| |
Collapse file Copy file name to clipboardExpand all lines: src/env-inl.h +2-3Lines changed: 2 additions & 3 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -196,9 +196,8 @@ inline Environment* Environment::GetCurrent(v8::Local<v8::Context> context) { | 196 | 196 | if (!ContextEmbedderTag::IsNodeContext(context)) [[unlikely]] { | 197 | 197 | return nullptr; | 198 | 198 | } | 199 | | - return static_cast<Environment*>( | 200 | | - context->GetAlignedPointerFromEmbedderData( | 201 | | - ContextEmbedderIndex::kEnvironment)); | | 199 | + return static_cast<Environment*>(context->GetAlignedPointerFromEmbedderData( | | 200 | + ContextEmbedderIndex::kEnvironment, EmbedderDataTag::kPerContextData)); | 202 | 201 | } | 203 | 202 |
| 204 | 203 | inline Environment* Environment::GetCurrent( | |
Collapse file Copy file name to clipboardExpand all lines: src/env.cc +14-6Lines changed: 14 additions & 6 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -674,12 +674,16 @@ void Environment::AssignToContext(Local<v8::Context> context, | 674 | 674 | Realm* realm, | 675 | 675 | const ContextInfo& info) { | 676 | 676 | 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); | 679 | 681 |
| 680 | 682 | // ContextifyContexts will update this to a pointer to the native object. | 681 | 683 | context->SetAlignedPointerInEmbedderData( | 682 | | - ContextEmbedderIndex::kContextifyContext, nullptr); | | 684 | + ContextEmbedderIndex::kContextifyContext, | | 685 | + nullptr, | | 686 | + EmbedderDataTag::kPerContextData); | 683 | 687 |
| 684 | 688 | // This must not be done before other context fields are initialized. | 685 | 689 | ContextEmbedderTag::TagNodeContext(context); | @@ -695,11 +699,15 @@ void Environment::AssignToContext(Local<v8::Context> context, | 695 | 699 | void Environment::UnassignFromContext(Local<v8::Context> context) { | 696 | 700 | if (!context.IsEmpty()) { | 697 | 701 | context->SetAlignedPointerInEmbedderData(ContextEmbedderIndex::kEnvironment, | 698 | | - nullptr); | | 702 | + nullptr, | | 703 | + EmbedderDataTag::kPerContextData); | 699 | 704 | context->SetAlignedPointerInEmbedderData(ContextEmbedderIndex::kRealm, | 700 | | - nullptr); | | 705 | + nullptr, | | 706 | + EmbedderDataTag::kPerContextData); | 701 | 707 | context->SetAlignedPointerInEmbedderData( | 702 | | - ContextEmbedderIndex::kContextifyContext, nullptr); | | 708 | + ContextEmbedderIndex::kContextifyContext, | | 709 | + nullptr, | | 710 | + EmbedderDataTag::kPerContextData); | 703 | 711 | } | 704 | 712 | UntrackContext(context); | 705 | 713 | } | |
Collapse file Copy file name to clipboardExpand all lines: src/histogram.cc +8-5Lines changed: 8 additions & 5 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -136,7 +136,8 @@ HistogramBase::HistogramBase( | 136 | 136 | MakeWeak(); | 137 | 137 | wrap->SetAlignedPointerInInternalField( | 138 | 138 | HistogramImpl::InternalFields::kImplField, | 139 | | - static_cast<HistogramImpl*>(this)); | | 139 | + static_cast<HistogramImpl*>(this), | | 140 | + EmbedderDataTag::kDefault); | 140 | 141 | } | 141 | 142 |
| 142 | 143 | HistogramBase::HistogramBase( | @@ -148,7 +149,8 @@ HistogramBase::HistogramBase( | 148 | 149 | MakeWeak(); | 149 | 150 | wrap->SetAlignedPointerInInternalField( | 150 | 151 | HistogramImpl::InternalFields::kImplField, | 151 | | - static_cast<HistogramImpl*>(this)); | | 152 | + static_cast<HistogramImpl*>(this), | | 153 | + EmbedderDataTag::kDefault); | 152 | 154 | } | 153 | 155 |
| 154 | 156 | void HistogramBase::MemoryInfo(MemoryTracker* tracker) const { | @@ -362,7 +364,8 @@ IntervalHistogram::IntervalHistogram( | 362 | 364 | MakeWeak(); | 363 | 365 | wrap->SetAlignedPointerInInternalField( | 364 | 366 | HistogramImpl::InternalFields::kImplField, | 365 | | - static_cast<HistogramImpl*>(this)); | | 367 | + static_cast<HistogramImpl*>(this), | | 368 | + EmbedderDataTag::kDefault); | 366 | 369 | uv_timer_init(env->event_loop(), &timer_); | 367 | 370 | } | 368 | 371 |
| @@ -600,8 +603,8 @@ double HistogramImpl::FastGetPercentile(Local<Value> receiver, | 600 | 603 | HistogramImpl* HistogramImpl::FromJSObject(Local<Value> value) { | 601 | 604 | auto obj = value.As<Object>(); | 602 | 605 | 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)); | 605 | 608 | } | 606 | 609 |
| 607 | 610 | std::unique_ptr<worker::TransferData> | |
Collapse file Copy file name to clipboardExpand all lines: src/js_udp_wrap.cc +3-2Lines changed: 3 additions & 2 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -55,8 +55,9 @@ JSUDPWrap::JSUDPWrap(Environment* env, Local<Object> obj) | 55 | 55 | : AsyncWrap(env, obj, PROVIDER_JSUDPWRAP) { | 56 | 56 | MakeWeak(); | 57 | 57 |
| 58 | | - obj->SetAlignedPointerInInternalField( | 59 | | - kUDPWrapBaseField, static_cast<UDPWrapBase*>(this)); | | 58 | + obj->SetAlignedPointerInInternalField(kUDPWrapBaseField, | | 59 | + static_cast<UDPWrapBase*>(this), | | 60 | + EmbedderDataTag::kDefault); | 60 | 61 | } | 61 | 62 |
| 62 | 63 | int JSUDPWrap::RecvStart() { | |
Collapse file Copy file name to clipboardExpand all lines: src/node_context_data.h +5-2Lines changed: 5 additions & 2 deletions | Original file line number | Diff line number | Diff line change |
|---|
| 3 | 3 |
| 4 | 4 | #if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS | 5 | 5 |
| | 6 | +#include "node_v8_embedder.h" | 6 | 7 | #include "util.h" | 7 | 8 | #include "v8.h" | 8 | 9 |
| @@ -135,7 +136,8 @@ class ContextEmbedderTag { | 135 | 136 | // context. | 136 | 137 | context->SetAlignedPointerInEmbedderData( | 137 | 138 | ContextEmbedderIndex::kContextTag, | 138 | | - ContextEmbedderTag::kNodeContextTagPtr); | | 139 | + ContextEmbedderTag::kNodeContextTagPtr, | | 140 | + EmbedderDataTag::kPerContextData); | 139 | 141 | } | 140 | 142 |
| 141 | 143 | static inline bool IsNodeContext(v8::Local<v8::Context> context) { | @@ -147,7 +149,8 @@ class ContextEmbedderTag { | 147 | 149 | return false; | 148 | 150 | } | 149 | 151 | if (context->GetAlignedPointerFromEmbedderData( | 150 | | - ContextEmbedderIndex::kContextTag) != | | 152 | + ContextEmbedderIndex::kContextTag, | | 153 | + EmbedderDataTag::kPerContextData) != | 151 | 154 | ContextEmbedderTag::kNodeContextTagPtr) [[unlikely]] { | 152 | 155 | return false; | 153 | 156 | } | |
|