Commit 5f441319 authored by Camillo Bruni's avatar Camillo Bruni Committed by Commit Bot

[promises] Change context promise hooks to Callable

The previously added perf-context Promise-hooks take a v8::Function as
arguments. However, the builtin code was only accepting JSFunctions
which causes cast errors.

Drive-by-fix: Directly pass nativeContext in more places.

Bug: chromium:1201465
Change-Id: Ic8bed11253a1f18a84e71eb9ea809b1ec1c3f428
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2850162Reviewed-by: 's avatarJakob Gruber <jgruber@chromium.org>
Commit-Queue: Camillo Bruni <cbruni@chromium.org>
Cr-Commit-Position: refs/heads/master@{#74223}
parent 8b45da8c
...@@ -104,9 +104,7 @@ transitioning macro RunContextPromiseHookInit(implicit context: Context)( ...@@ -104,9 +104,7 @@ transitioning macro RunContextPromiseHookInit(implicit context: Context)(
promise: JSPromise, parent: Object) { promise: JSPromise, parent: Object) {
const maybeHook = *NativeContextSlot( const maybeHook = *NativeContextSlot(
ContextSlot::PROMISE_HOOK_INIT_FUNCTION_INDEX); ContextSlot::PROMISE_HOOK_INIT_FUNCTION_INDEX);
if (IsUndefined(maybeHook)) return; const hook = Cast<Callable>(maybeHook) otherwise return;
const hook = Cast<JSFunction>(maybeHook) otherwise unreachable;
const parentObject = Is<JSPromise>(parent) ? Cast<JSPromise>(parent) const parentObject = Is<JSPromise>(parent) ? Cast<JSPromise>(parent)
otherwise unreachable: Undefined; otherwise unreachable: Undefined;
...@@ -165,13 +163,11 @@ transitioning macro RunContextPromiseHookAfter(implicit context: Context)( ...@@ -165,13 +163,11 @@ transitioning macro RunContextPromiseHookAfter(implicit context: Context)(
} }
transitioning macro RunContextPromiseHook(implicit context: Context)( transitioning macro RunContextPromiseHook(implicit context: Context)(
slot: Slot<NativeContext, Undefined|JSFunction>, slot: Slot<NativeContext, Undefined|Callable>,
promiseOrCapability: JSPromise|PromiseCapability|Undefined, flags: uint32) { promiseOrCapability: JSPromise|PromiseCapability|Undefined, flags: uint32) {
if (!IsContextPromiseHookEnabled(flags)) return; if (!IsContextPromiseHookEnabled(flags)) return;
const maybeHook = *NativeContextSlot(slot); const maybeHook = *NativeContextSlot(slot);
if (IsUndefined(maybeHook)) return; const hook = Cast<Callable>(maybeHook) otherwise return;
const hook = Cast<JSFunction>(maybeHook) otherwise unreachable;
let promise: JSPromise; let promise: JSPromise;
typeswitch (promiseOrCapability) { typeswitch (promiseOrCapability) {
......
...@@ -30,7 +30,8 @@ transitioning builtin ...@@ -30,7 +30,8 @@ transitioning builtin
PromiseResolve(implicit context: Context)( PromiseResolve(implicit context: Context)(
constructor: JSReceiver, value: JSAny): JSAny { constructor: JSReceiver, value: JSAny): JSAny {
const nativeContext = LoadNativeContext(context); const nativeContext = LoadNativeContext(context);
const promiseFun = *NativeContextSlot(ContextSlot::PROMISE_FUNCTION_INDEX); const promiseFun = *NativeContextSlot(
nativeContext, ContextSlot::PROMISE_FUNCTION_INDEX);
try { try {
// Check if {value} is a JSPromise. // Check if {value} is a JSPromise.
const value = Cast<JSPromise>(value) otherwise NeedToAllocate; const value = Cast<JSPromise>(value) otherwise NeedToAllocate;
...@@ -40,7 +41,8 @@ PromiseResolve(implicit context: Context)( ...@@ -40,7 +41,8 @@ PromiseResolve(implicit context: Context)(
// intact, as that guards the lookup path for "constructor" on // intact, as that guards the lookup path for "constructor" on
// JSPromise instances which have the (initial) Promise.prototype. // JSPromise instances which have the (initial) Promise.prototype.
const promisePrototype = const promisePrototype =
*NativeContextSlot(ContextSlot::PROMISE_PROTOTYPE_INDEX); *NativeContextSlot(
nativeContext, ContextSlot::PROMISE_PROTOTYPE_INDEX);
// Check that Torque load elimination works. // Check that Torque load elimination works.
static_assert(nativeContext == LoadNativeContext(context)); static_assert(nativeContext == LoadNativeContext(context));
if (value.map.prototype != promisePrototype) { if (value.map.prototype != promisePrototype) {
...@@ -139,7 +141,8 @@ ResolvePromise(implicit context: Context)( ...@@ -139,7 +141,8 @@ ResolvePromise(implicit context: Context)(
assert(IsJSReceiverMap(resolutionMap)); assert(IsJSReceiverMap(resolutionMap));
assert(!IsPromiseThenProtectorCellInvalid()); assert(!IsPromiseThenProtectorCellInvalid());
if (resolutionMap == if (resolutionMap ==
*NativeContextSlot(ContextSlot::ITERATOR_RESULT_MAP_INDEX)) { *NativeContextSlot(
nativeContext, ContextSlot::ITERATOR_RESULT_MAP_INDEX)) {
return FulfillPromise(promise, resolution); return FulfillPromise(promise, resolution);
} else { } else {
goto Slow; goto Slow;
...@@ -147,10 +150,11 @@ ResolvePromise(implicit context: Context)( ...@@ -147,10 +150,11 @@ ResolvePromise(implicit context: Context)(
} }
const promisePrototype = const promisePrototype =
*NativeContextSlot(ContextSlot::PROMISE_PROTOTYPE_INDEX); *NativeContextSlot(
nativeContext, ContextSlot::PROMISE_PROTOTYPE_INDEX);
if (resolutionMap.prototype == promisePrototype) { if (resolutionMap.prototype == promisePrototype) {
// The {resolution} is a native Promise in this case. // The {resolution} is a native Promise in this case.
then = *NativeContextSlot(ContextSlot::PROMISE_THEN_INDEX); then = *NativeContextSlot(nativeContext, ContextSlot::PROMISE_THEN_INDEX);
// Check that Torque load elimination works. // Check that Torque load elimination works.
static_assert(nativeContext == LoadNativeContext(context)); static_assert(nativeContext == LoadNativeContext(context));
goto Enqueue; goto Enqueue;
......
...@@ -124,11 +124,10 @@ extern enum ContextSlot extends intptr constexpr 'Context::Field' { ...@@ -124,11 +124,10 @@ extern enum ContextSlot extends intptr constexpr 'Context::Field' {
PROMISE_PROTOTYPE_INDEX: Slot<NativeContext, JSObject>, PROMISE_PROTOTYPE_INDEX: Slot<NativeContext, JSObject>,
STRICT_FUNCTION_WITHOUT_PROTOTYPE_MAP_INDEX: Slot<NativeContext, Map>, STRICT_FUNCTION_WITHOUT_PROTOTYPE_MAP_INDEX: Slot<NativeContext, Map>,
PROMISE_HOOK_INIT_FUNCTION_INDEX: Slot<NativeContext, Undefined|JSFunction>, PROMISE_HOOK_INIT_FUNCTION_INDEX: Slot<NativeContext, Undefined|Callable>,
PROMISE_HOOK_BEFORE_FUNCTION_INDEX: Slot<NativeContext, Undefined|JSFunction>, PROMISE_HOOK_BEFORE_FUNCTION_INDEX: Slot<NativeContext, Undefined|Callable>,
PROMISE_HOOK_AFTER_FUNCTION_INDEX: Slot<NativeContext, Undefined|JSFunction>, PROMISE_HOOK_AFTER_FUNCTION_INDEX: Slot<NativeContext, Undefined|Callable>,
PROMISE_HOOK_RESOLVE_FUNCTION_INDEX: PROMISE_HOOK_RESOLVE_FUNCTION_INDEX: Slot<NativeContext, Undefined|Callable>,
Slot<NativeContext, Undefined|JSFunction>,
CONTINUATION_PRESERVED_EMBEDDER_DATA_INDEX: Slot<NativeContext, HeapObject>, CONTINUATION_PRESERVED_EMBEDDER_DATA_INDEX: Slot<NativeContext, HeapObject>,
......
...@@ -252,3 +252,13 @@ exceptions(); ...@@ -252,3 +252,13 @@ exceptions();
} }
__f_16(async () => { await Promise.resolve()}); __f_16(async () => { await Promise.resolve()});
})(); })();
(function boundFunction() {
function hook() {};
const bound = hook.bind(this);
d8.promise.setHooks(bound, bound, bound, bound);
Promise.resolve();
Promise.reject();
%PerformMicrotaskCheckpoint();
d8.promise.setHooks();
})();
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment