@@ -118,8 +118,9 @@ Local<Name> Uint32ToName(Local<Context> context, uint32_t index) {
118
118
119
119
} // anonymous namespace
120
120
121
- BaseObjectPtr<ContextifyContext> ContextifyContext::New (
122
- Environment* env, Local<Object> sandbox_obj, ContextOptions* options) {
121
+ ContextifyContext* ContextifyContext::New (Environment* env,
122
+ Local<Object> sandbox_obj,
123
+ ContextOptions* options) {
123
124
Local<ObjectTemplate> object_template;
124
125
HandleScope scope (env->isolate ());
125
126
CHECK_IMPLIES (sandbox_obj.IsEmpty (), options->vanilla );
@@ -140,41 +141,32 @@ BaseObjectPtr<ContextifyContext> ContextifyContext::New(
140
141
if (!(CreateV8Context (env->isolate (), object_template, snapshot_data, queue)
141
142
.ToLocal (&v8_context))) {
142
143
// Allocation failure, maximum call stack size reached, termination, etc.
143
- return BaseObjectPtr<ContextifyContext>() ;
144
+ return nullptr ;
144
145
}
145
146
return New (v8_context, env, sandbox_obj, options);
146
147
}
147
148
148
- void ContextifyContext::MemoryInfo (MemoryTracker* tracker) const {}
149
+ void ContextifyContext::Trace (cppgc::Visitor* visitor) const {
150
+ CppgcMixin::Trace (visitor);
151
+ visitor->Trace (context_);
152
+ }
149
153
150
154
ContextifyContext::ContextifyContext (Environment* env,
151
155
Local<Object> wrapper,
152
156
Local<Context> v8_context,
153
157
ContextOptions* options)
154
- : BaseObject(env, wrapper),
155
- microtask_queue_ (options->own_microtask_queue
158
+ : microtask_queue_(options->own_microtask_queue
156
159
? options->own_microtask_queue.release()
157
160
: nullptr ) {
161
+ CppgcMixin::Wrap (this , env, wrapper);
162
+
158
163
context_.Reset (env->isolate (), v8_context);
159
164
// This should only be done after the initial initializations of the context
160
165
// global object is finished.
161
166
DCHECK_NULL (v8_context->GetAlignedPointerFromEmbedderData (
162
167
ContextEmbedderIndex::kContextifyContext ));
163
168
v8_context->SetAlignedPointerInEmbedderData (
164
169
ContextEmbedderIndex::kContextifyContext , this );
165
- // It's okay to make this reference weak - V8 would create an internal
166
- // reference to this context via the constructor of the wrapper.
167
- // As long as the wrapper is alive, it's constructor is alive, and so
168
- // is the context.
169
- context_.SetWeak ();
170
- }
171
-
172
- ContextifyContext::~ContextifyContext () {
173
- Isolate* isolate = env ()->isolate ();
174
- HandleScope scope (isolate);
175
-
176
- env ()->UnassignFromContext (PersistentToLocal::Weak (isolate, context_));
177
- context_.Reset ();
178
170
}
179
171
180
172
void ContextifyContext::InitializeGlobalTemplates (IsolateData* isolate_data) {
@@ -251,19 +243,18 @@ MaybeLocal<Context> ContextifyContext::CreateV8Context(
251
243
return scope.Escape (ctx);
252
244
}
253
245
254
- BaseObjectPtr<ContextifyContext> ContextifyContext::New (
255
- Local<Context> v8_context,
256
- Environment* env,
257
- Local<Object> sandbox_obj,
258
- ContextOptions* options) {
246
+ ContextifyContext* ContextifyContext::New (Local<Context> v8_context,
247
+ Environment* env,
248
+ Local<Object> sandbox_obj,
249
+ ContextOptions* options) {
259
250
HandleScope scope (env->isolate ());
260
251
CHECK_IMPLIES (sandbox_obj.IsEmpty (), options->vanilla );
261
252
// This only initializes part of the context. The primordials are
262
253
// only initialized when needed because even deserializing them slows
263
254
// things down significantly and they are only needed in rare occasions
264
255
// in the vm contexts.
265
256
if (InitializeContextRuntime (v8_context).IsNothing ()) {
266
- return BaseObjectPtr<ContextifyContext>() ;
257
+ return nullptr ;
267
258
}
268
259
269
260
Local<Context> main_context = env->context ();
@@ -300,7 +291,7 @@ BaseObjectPtr<ContextifyContext> ContextifyContext::New(
300
291
info.origin = *origin_val;
301
292
}
302
293
303
- BaseObjectPtr< ContextifyContext> result;
294
+ ContextifyContext* result;
304
295
Local<Object> wrapper;
305
296
{
306
297
Context::Scope context_scope (v8_context);
@@ -315,7 +306,7 @@ BaseObjectPtr<ContextifyContext> ContextifyContext::New(
315
306
ctor_name,
316
307
static_cast <v8::PropertyAttribute>(v8::DontEnum))
317
308
.IsNothing ()) {
318
- return BaseObjectPtr<ContextifyContext>() ;
309
+ return nullptr ;
319
310
}
320
311
}
321
312
@@ -328,21 +319,23 @@ BaseObjectPtr<ContextifyContext> ContextifyContext::New(
328
319
env->host_defined_option_symbol (),
329
320
options->host_defined_options_id )
330
321
.IsNothing ()) {
331
- return BaseObjectPtr<ContextifyContext>() ;
322
+ return nullptr ;
332
323
}
333
324
334
325
env->AssignToContext (v8_context, nullptr , info);
335
326
336
327
if (!env->contextify_wrapper_template ()
337
328
->NewInstance (v8_context)
338
329
.ToLocal (&wrapper)) {
339
- return BaseObjectPtr<ContextifyContext>() ;
330
+ return nullptr ;
340
331
}
341
332
342
- result =
343
- MakeBaseObject<ContextifyContext>(env, wrapper, v8_context, options);
344
- // The only strong reference to the wrapper will come from the sandbox.
345
- result->MakeWeak ();
333
+ result = cppgc::MakeGarbageCollected<ContextifyContext>(
334
+ env->isolate ()->GetCppHeap ()->GetAllocationHandle (),
335
+ env,
336
+ wrapper,
337
+ v8_context,
338
+ options);
346
339
}
347
340
348
341
Local<Object> wrapper_holder =
@@ -352,7 +345,7 @@ BaseObjectPtr<ContextifyContext> ContextifyContext::New(
352
345
->SetPrivate (
353
346
v8_context, env->contextify_context_private_symbol (), wrapper)
354
347
.IsNothing ()) {
355
- return BaseObjectPtr<ContextifyContext>() ;
348
+ return nullptr ;
356
349
}
357
350
358
351
// Assign host_defined_options_id to the sandbox object or the global object
@@ -364,7 +357,7 @@ BaseObjectPtr<ContextifyContext> ContextifyContext::New(
364
357
env->host_defined_option_symbol (),
365
358
options->host_defined_options_id )
366
359
.IsNothing ()) {
367
- return BaseObjectPtr<ContextifyContext>() ;
360
+ return nullptr ;
368
361
}
369
362
return result;
370
363
}
@@ -438,7 +431,7 @@ void ContextifyContext::MakeContext(const FunctionCallbackInfo<Value>& args) {
438
431
options.host_defined_options_id = args[6 ].As <Symbol>();
439
432
440
433
TryCatchScope try_catch (env);
441
- BaseObjectPtr< ContextifyContext> context_ptr =
434
+ ContextifyContext* context_ptr =
442
435
ContextifyContext::New (env, sandbox, &options);
443
436
444
437
if (try_catch.HasCaught ()) {
@@ -469,6 +462,10 @@ ContextifyContext* ContextifyContext::ContextFromContextifiedSandbox(
469
462
470
463
template <typename T>
471
464
ContextifyContext* ContextifyContext::Get (const PropertyCallbackInfo<T>& args) {
465
+ // TODO(joyeecheung): it should be fine to simply use
466
+ // args.GetIsolate()->GetCurrentContext() and take the pointer at
467
+ // ContextEmbedderIndex::kContextifyContext, as V8 is supposed to
468
+ // push the creation context before invoking these callbacks.
472
469
return Get (args.This ());
473
470
}
474
471
0 commit comments