Skip to content

Commit d136cd9

Browse files
Stephen BelangerV8 LUCI CQ
authored andcommitted
Build flag ContinuationPreservedEmbedderData API
This places the ContinuationPreservedEmbedderData API behind the V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA build flag. Change-Id: Ib098a3f500a1cbc35d69795b41f4d2636776d7b3 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/4903009 Commit-Queue: Camillo Bruni <[email protected]> Reviewed-by: Camillo Bruni <[email protected]> Reviewed-by: Nico Hartmann <[email protected]> Cr-Commit-Position: refs/heads/main@{#90790}
1 parent 63959e0 commit d136cd9

9 files changed

Lines changed: 109 additions & 33 deletions

File tree

BUILD.gn

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,9 @@ declare_args() {
366366
# Allow for JS promise hooks (instead of just C++).
367367
v8_enable_javascript_promise_hooks = false
368368

369+
# Allow for JS promise hooks (instead of just C++).
370+
v8_enable_continuation_preserved_embedder_data = true
371+
369372
# Enable allocation folding globally (sets -dV8_ALLOCATION_FOLDING).
370373
# When it's disabled, the --turbo-allocation-folding runtime flag will be ignored.
371374
v8_enable_allocation_folding = true
@@ -1175,6 +1178,9 @@ config("features") {
11751178
if (v8_enable_javascript_promise_hooks) {
11761179
defines += [ "V8_ENABLE_JAVASCRIPT_PROMISE_HOOKS" ]
11771180
}
1181+
if (v8_enable_continuation_preserved_embedder_data) {
1182+
defines += [ "V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA" ]
1183+
}
11781184
if (v8_enable_allocation_folding) {
11791185
defines += [ "V8_ALLOCATION_FOLDING" ]
11801186
}

src/api/api.cc

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7185,20 +7185,27 @@ void Context::SetAbortScriptExecution(
71857185
Local<Value> Context::GetContinuationPreservedEmbedderData() const {
71867186
auto context = Utils::OpenDirectHandle(this);
71877187
i::Isolate* i_isolate = context->GetIsolate();
7188+
7189+
#ifdef V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA
71887190
return ToApiHandle<Object>(
71897191
i::direct_handle(
71907192
context->native_context()->continuation_preserved_embedder_data(),
71917193
i_isolate),
71927194
i_isolate);
7195+
#else // V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA
7196+
return v8::Undefined(reinterpret_cast<v8::Isolate*>(i_isolate));
7197+
#endif // V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA
71937198
}
71947199

71957200
void Context::SetContinuationPreservedEmbedderData(Local<Value> data) {
7201+
#ifdef V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA
71967202
auto context = Utils::OpenDirectHandle(this);
71977203
i::Isolate* i_isolate = context->GetIsolate();
71987204
if (data.IsEmpty())
71997205
data = v8::Undefined(reinterpret_cast<v8::Isolate*>(i_isolate));
72007206
context->native_context()->set_continuation_preserved_embedder_data(
72017207
i::HeapObject::cast(*Utils::OpenDirectHandle(*data)));
7208+
#endif // V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA
72027209
}
72037210

72047211
void v8::Context::SetPromiseHooks(Local<Function> init_hook,

src/builtins/builtins-microtask-queue-gen.cc

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,7 @@ void MicrotaskQueueBuiltinsAssembler::RunSingleMicrotask(
235235
const TNode<HeapObject> promise_or_capability = CAST(LoadObjectField(
236236
microtask, PromiseReactionJobTask::kPromiseOrCapabilityOffset));
237237

238+
#ifdef V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA
238239
TNode<Object> preserved_embedder_data = LoadObjectField(
239240
microtask,
240241
PromiseReactionJobTask::kContinuationPreservedEmbedderDataOffset);
@@ -245,6 +246,7 @@ void MicrotaskQueueBuiltinsAssembler::RunSingleMicrotask(
245246
preserved_embedder_data);
246247
Goto(&preserved_data_done);
247248
BIND(&preserved_data_done);
249+
#endif // V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA
248250

249251
// Run the promise before/debug hook if enabled.
250252
RunAllPromiseHooks(PromiseHookType::kBefore, microtask_context,
@@ -260,13 +262,15 @@ void MicrotaskQueueBuiltinsAssembler::RunSingleMicrotask(
260262
RunAllPromiseHooks(PromiseHookType::kAfter, microtask_context,
261263
promise_or_capability);
262264

265+
#ifdef V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA
263266
Label preserved_data_reset_done(this);
264267
GotoIf(IsUndefined(preserved_embedder_data), &preserved_data_reset_done);
265268
StoreContextElement(native_context,
266269
Context::CONTINUATION_PRESERVED_EMBEDDER_DATA_INDEX,
267270
UndefinedConstant());
268271
Goto(&preserved_data_reset_done);
269272
BIND(&preserved_data_reset_done);
273+
#endif // V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA
270274

271275
RewindEnteredContext(saved_entered_context_count);
272276
SetCurrentContext(current_context);
@@ -288,6 +292,7 @@ void MicrotaskQueueBuiltinsAssembler::RunSingleMicrotask(
288292
const TNode<HeapObject> promise_or_capability = CAST(LoadObjectField(
289293
microtask, PromiseReactionJobTask::kPromiseOrCapabilityOffset));
290294

295+
#ifdef V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA
291296
TNode<Object> preserved_embedder_data = LoadObjectField(
292297
microtask,
293298
PromiseReactionJobTask::kContinuationPreservedEmbedderDataOffset);
@@ -298,6 +303,7 @@ void MicrotaskQueueBuiltinsAssembler::RunSingleMicrotask(
298303
preserved_embedder_data);
299304
Goto(&preserved_data_done);
300305
BIND(&preserved_data_done);
306+
#endif // V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA
301307

302308
// Run the promise before/debug hook if enabled.
303309
RunAllPromiseHooks(PromiseHookType::kBefore, microtask_context,
@@ -313,13 +319,15 @@ void MicrotaskQueueBuiltinsAssembler::RunSingleMicrotask(
313319
RunAllPromiseHooks(PromiseHookType::kAfter, microtask_context,
314320
promise_or_capability);
315321

322+
#ifdef V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA
316323
Label preserved_data_reset_done(this);
317324
GotoIf(IsUndefined(preserved_embedder_data), &preserved_data_reset_done);
318325
StoreContextElement(native_context,
319326
Context::CONTINUATION_PRESERVED_EMBEDDER_DATA_INDEX,
320327
UndefinedConstant());
321328
Goto(&preserved_data_reset_done);
322329
BIND(&preserved_data_reset_done);
330+
#endif // V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA
323331

324332
RewindEnteredContext(saved_entered_context_count);
325333
SetCurrentContext(current_context);

src/builtins/promise-abstract-operations.tq

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -448,6 +448,7 @@ transitioning macro PerformPromiseThenImpl(
448448
const handlerContext = ExtractHandlerContext(onFulfilled, onRejected);
449449
const promiseReactions =
450450
UnsafeCast<(Zero | PromiseReaction)>(promise.reactions_or_result);
451+
451452
const reaction = NewPromiseReaction(
452453
handlerContext, promiseReactions, resultPromiseOrCapability,
453454
onFulfilled, onRejected);

src/builtins/promise-misc.tq

Lines changed: 73 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -76,35 +76,61 @@ macro NewPromiseFulfillReactionJobTask(
7676
handler: Callable|Undefined,
7777
promiseOrCapability: JSPromise|PromiseCapability|
7878
Undefined): PromiseFulfillReactionJobTask {
79-
const nativeContext = LoadNativeContext(handlerContext);
80-
return new PromiseFulfillReactionJobTask{
81-
map: PromiseFulfillReactionJobTaskMapConstant(),
82-
argument,
83-
context: handlerContext,
84-
handler,
85-
promise_or_capability: promiseOrCapability,
86-
continuation_preserved_embedder_data:
87-
*ContextSlot(
88-
nativeContext, ContextSlot::CONTINUATION_PRESERVED_EMBEDDER_DATA_INDEX)
89-
};
79+
@if(V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA) {
80+
const nativeContext = LoadNativeContext(handlerContext);
81+
return new PromiseFulfillReactionJobTask{
82+
map: PromiseFulfillReactionJobTaskMapConstant(),
83+
argument,
84+
context: handlerContext,
85+
handler,
86+
promise_or_capability: promiseOrCapability,
87+
continuation_preserved_embedder_data:
88+
*ContextSlot(
89+
nativeContext,
90+
ContextSlot::CONTINUATION_PRESERVED_EMBEDDER_DATA_INDEX)
91+
};
92+
}
93+
94+
@ifnot(V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA) {
95+
return new PromiseFulfillReactionJobTask{
96+
map: PromiseFulfillReactionJobTaskMapConstant(),
97+
argument,
98+
context: handlerContext,
99+
handler,
100+
promise_or_capability: promiseOrCapability
101+
};
102+
}
90103
}
91104

92105
macro NewPromiseRejectReactionJobTask(
93106
implicit context: Context)(handlerContext: Context, argument: Object,
94107
handler: Callable|Undefined,
95108
promiseOrCapability: JSPromise|PromiseCapability|
96109
Undefined): PromiseRejectReactionJobTask {
97-
const nativeContext = LoadNativeContext(handlerContext);
98-
return new PromiseRejectReactionJobTask{
99-
map: PromiseRejectReactionJobTaskMapConstant(),
100-
argument,
101-
context: handlerContext,
102-
handler,
103-
promise_or_capability: promiseOrCapability,
104-
continuation_preserved_embedder_data:
105-
*ContextSlot(
106-
nativeContext, ContextSlot::CONTINUATION_PRESERVED_EMBEDDER_DATA_INDEX)
107-
};
110+
@if(V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA) {
111+
const nativeContext = LoadNativeContext(handlerContext);
112+
return new PromiseRejectReactionJobTask{
113+
map: PromiseRejectReactionJobTaskMapConstant(),
114+
argument,
115+
context: handlerContext,
116+
handler,
117+
promise_or_capability: promiseOrCapability,
118+
continuation_preserved_embedder_data:
119+
*ContextSlot(
120+
nativeContext,
121+
ContextSlot::CONTINUATION_PRESERVED_EMBEDDER_DATA_INDEX)
122+
};
123+
}
124+
125+
@ifnot(V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA) {
126+
return new PromiseRejectReactionJobTask{
127+
map: PromiseRejectReactionJobTaskMapConstant(),
128+
argument,
129+
context: handlerContext,
130+
handler,
131+
promise_or_capability: promiseOrCapability
132+
};
133+
}
108134
}
109135

110136
@export
@@ -280,17 +306,31 @@ macro NewPromiseReaction(
280306
promiseOrCapability: JSPromise|PromiseCapability|Undefined,
281307
fulfillHandler: Callable|Undefined,
282308
rejectHandler: Callable|Undefined): PromiseReaction {
283-
const nativeContext = LoadNativeContext(handlerContext);
284-
return new PromiseReaction{
285-
map: PromiseReactionMapConstant(),
286-
next: next,
287-
reject_handler: rejectHandler,
288-
fulfill_handler: fulfillHandler,
289-
promise_or_capability: promiseOrCapability,
290-
continuation_preserved_embedder_data:
291-
*ContextSlot(
292-
nativeContext, ContextSlot::CONTINUATION_PRESERVED_EMBEDDER_DATA_INDEX)
293-
};
309+
@if(V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA) {
310+
const nativeContext = LoadNativeContext(handlerContext);
311+
return new PromiseReaction{
312+
map: PromiseReactionMapConstant(),
313+
next: next,
314+
reject_handler: rejectHandler,
315+
fulfill_handler: fulfillHandler,
316+
promise_or_capability: promiseOrCapability,
317+
continuation_preserved_embedder_data:
318+
*ContextSlot(
319+
nativeContext,
320+
ContextSlot::CONTINUATION_PRESERVED_EMBEDDER_DATA_INDEX)
321+
};
322+
}
323+
324+
@ifnot(V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA) {
325+
dcheck(IsContext(handlerContext));
326+
return new PromiseReaction{
327+
map: PromiseReactionMapConstant(),
328+
next: next,
329+
reject_handler: rejectHandler,
330+
fulfill_handler: fulfillHandler,
331+
promise_or_capability: promiseOrCapability
332+
};
333+
}
294334
}
295335

296336
extern macro PromiseResolveThenableJobTaskMapConstant(): Map;

src/objects/contexts.tq

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@ extern enum ContextSlot extends intptr constexpr 'Context::Field' {
173173
PROMISE_HOOK_AFTER_FUNCTION_INDEX: Slot<NativeContext, Undefined|Callable>,
174174
PROMISE_HOOK_RESOLVE_FUNCTION_INDEX: Slot<NativeContext, Undefined|Callable>,
175175

176+
// @if(V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA)
176177
CONTINUATION_PRESERVED_EMBEDDER_DATA_INDEX: Slot<NativeContext, HeapObject>,
177178

178179
BOUND_FUNCTION_WITH_CONSTRUCTOR_MAP_INDEX: Slot<NativeContext, Map>,

src/objects/objects.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5005,11 +5005,13 @@ Handle<Object> JSPromise::TriggerPromiseReactions(Isolate* isolate,
50055005
static_cast<int>(PromiseReaction::kPromiseOrCapabilityOffset) ==
50065006
static_cast<int>(
50075007
PromiseFulfillReactionJobTask::kPromiseOrCapabilityOffset));
5008+
#ifdef V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA
50085009
static_assert(
50095010
static_cast<int>(
50105011
PromiseReaction::kContinuationPreservedEmbedderDataOffset) ==
50115012
static_cast<int>(PromiseFulfillReactionJobTask::
50125013
kContinuationPreservedEmbedderDataOffset));
5014+
#endif // V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA
50135015
} else {
50145016
DisallowGarbageCollection no_gc;
50155017
task->set_map(
@@ -5024,11 +5026,13 @@ Handle<Object> JSPromise::TriggerPromiseReactions(Isolate* isolate,
50245026
static_cast<int>(PromiseReaction::kPromiseOrCapabilityOffset) ==
50255027
static_cast<int>(
50265028
PromiseRejectReactionJobTask::kPromiseOrCapabilityOffset));
5029+
#ifdef V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA
50275030
static_assert(
50285031
static_cast<int>(
50295032
PromiseReaction::kContinuationPreservedEmbedderDataOffset) ==
50305033
static_cast<int>(PromiseRejectReactionJobTask::
50315034
kContinuationPreservedEmbedderDataOffset));
5035+
#endif // V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA
50325036
}
50335037

50345038
MicrotaskQueue* microtask_queue = handler_context->microtask_queue();

src/objects/promise.tq

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ const kPromiseReactionFulfillHandlerOffset: constexpr int31
2525
generates 'PromiseReaction::kFulfillHandlerOffset';
2626
const kPromiseReactionPromiseOrCapabilityOffset: constexpr int31
2727
generates 'PromiseReaction::kPromiseOrCapabilityOffset';
28+
// @if(V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA)
2829
const kPromiseReactionContinuationPreservedEmbedderDataOffset: constexpr int31
2930
generates 'PromiseReaction::kContinuationPreservedEmbedderDataOffset';
3031

@@ -35,6 +36,7 @@ extern class PromiseReaction extends Struct {
3536
// Either a JSPromise (in case of native promises), a PromiseCapability
3637
// (general case), or undefined (in case of await).
3738
promise_or_capability: JSPromise|PromiseCapability|Undefined;
39+
@if(V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA)
3840
continuation_preserved_embedder_data: Object|Undefined;
3941
}
4042

@@ -45,6 +47,7 @@ const kPromiseReactionJobTaskHandlerOffset: constexpr int31
4547
generates 'PromiseReactionJobTask::kHandlerOffset';
4648
const kPromiseReactionJobTaskPromiseOrCapabilityOffset: constexpr int31
4749
generates 'PromiseReactionJobTask::kPromiseOrCapabilityOffset';
50+
// @if(V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA)
4851
const kPromiseReactionJobTaskContinuationPreservedEmbedderDataOffset:
4952
constexpr int31
5053
generates 'PromiseReactionJobTask::kContinuationPreservedEmbedderDataOffset'
@@ -58,6 +61,7 @@ extern class PromiseReactionJobTask extends Microtask {
5861
// Either a JSPromise (in case of native promises), a PromiseCapability
5962
// (general case), or undefined (in case of await).
6063
promise_or_capability: JSPromise|PromiseCapability|Undefined;
64+
@if(V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA)
6165
continuation_preserved_embedder_data: Object|Undefined;
6266
}
6367

src/torque/torque-parser.cc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,11 @@ class BuildFlags : public base::ContextualClass<BuildFlags> {
5656
build_flags_["V8_ENABLE_JAVASCRIPT_PROMISE_HOOKS"] = true;
5757
#else
5858
build_flags_["V8_ENABLE_JAVASCRIPT_PROMISE_HOOKS"] = false;
59+
#endif
60+
#ifdef V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA
61+
build_flags_["V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA"] = true;
62+
#else
63+
build_flags_["V8_ENABLE_CONTINUATION_PRESERVED_EMBEDDER_DATA"] = false;
5964
#endif
6065
build_flags_["TRUE_FOR_TESTING"] = true;
6166
build_flags_["FALSE_FOR_TESTING"] = false;

0 commit comments

Comments
 (0)