|
32 | 32 |
|
33 | 33 | namespace node {
|
34 | 34 |
|
| 35 | +namespace { |
| 36 | +// This just has to be different from the Chromium ones: |
| 37 | +// https://source.chromium.org/chromium/chromium/src/+/main:gin/public/gin_embedders.h;l=18-23;drc=5a758a97032f0b656c3c36a3497560762495501a |
| 38 | +// Otherwise, when Node is loaded in an isolate which uses cppgc, cppgc will |
| 39 | +// misinterpret the data stored in the embedder fields and try to garbage |
| 40 | +// collect them. |
| 41 | +static uint16_t kNodeEmbedderId = 0x90de; |
| 42 | +} |
| 43 | + |
35 | 44 | BaseObject::BaseObject(Environment* env, v8::Local<v8::Object> object)
|
36 | 45 | : persistent_handle_(env->isolate(), object), env_(env) {
|
37 | 46 | CHECK_EQ(false, object.IsEmpty());
|
38 |
| - CHECK_GT(object->InternalFieldCount(), 0); |
| 47 | + CHECK_GT(object->InternalFieldCount(), BaseObject::kSlot); |
| 48 | + object->SetAlignedPointerInInternalField(BaseObject::kEmbedderType, |
| 49 | + &kNodeEmbedderId); |
39 | 50 | object->SetAlignedPointerInInternalField(
|
40 | 51 | BaseObject::kSlot,
|
41 | 52 | static_cast<void*>(this));
|
@@ -151,7 +162,8 @@ bool BaseObject::IsWeakOrDetached() const {
|
151 | 162 | void BaseObject::LazilyInitializedJSTemplateConstructor(
|
152 | 163 | const v8::FunctionCallbackInfo<v8::Value>& args) {
|
153 | 164 | DCHECK(args.IsConstructCall());
|
154 |
| - DCHECK_GT(args.This()->InternalFieldCount(), 0); |
| 165 | + DCHECK_GT(args.This()->InternalFieldCount(), BaseObject::kSlot); |
| 166 | + args.This()->SetAlignedPointerInInternalField(BaseObject::kEmbedderType, &kNodeEmbedderId); |
155 | 167 | args.This()->SetAlignedPointerInInternalField(BaseObject::kSlot, nullptr);
|
156 | 168 | }
|
157 | 169 |
|
|
0 commit comments