aboutsummaryrefslogtreecommitdiff
path: root/deps/v8/src/builtins/builtins-async-function-gen.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/builtins/builtins-async-function-gen.cc')
-rw-r--r--deps/v8/src/builtins/builtins-async-function-gen.cc41
1 files changed, 24 insertions, 17 deletions
diff --git a/deps/v8/src/builtins/builtins-async-function-gen.cc b/deps/v8/src/builtins/builtins-async-function-gen.cc
index 03df1aaaad..a95365e425 100644
--- a/deps/v8/src/builtins/builtins-async-function-gen.cc
+++ b/deps/v8/src/builtins/builtins-async-function-gen.cc
@@ -36,6 +36,21 @@ void AsyncFunctionBuiltinsAssembler::AsyncFunctionAwaitResumeClosure(
TNode<JSAsyncFunctionObject> async_function_object =
CAST(LoadContextElement(context, Context::EXTENSION_INDEX));
+ // Push the promise for the {async_function_object} back onto the catch
+ // prediction stack to handle exceptions thrown after resuming from the
+ // await properly.
+ Label if_instrumentation(this, Label::kDeferred),
+ if_instrumentation_done(this);
+ Branch(IsDebugActive(), &if_instrumentation, &if_instrumentation_done);
+ BIND(&if_instrumentation);
+ {
+ TNode<JSPromise> promise = LoadObjectField<JSPromise>(
+ async_function_object, JSAsyncFunctionObject::kPromiseOffset);
+ CallRuntime(Runtime::kDebugAsyncFunctionResumed, context, promise);
+ Goto(&if_instrumentation_done);
+ }
+ BIND(&if_instrumentation_done);
+
// Inline version of GeneratorPrototypeNext / GeneratorPrototypeReturn with
// unnecessary runtime checks removed.
@@ -80,27 +95,19 @@ TF_BUILTIN(AsyncFunctionEnter, AsyncFunctionBuiltinsAssembler) {
Signed(IntPtrAdd(WordSar(frame_size, IntPtrConstant(kTaggedSizeLog2)),
formal_parameter_count));
- // Allocate space for the promise, the async function object
- // and the register file.
- TNode<IntPtrT> size = IntPtrAdd(
- IntPtrConstant(JSPromise::kSizeWithEmbedderFields +
- JSAsyncFunctionObject::kSize + FixedArray::kHeaderSize),
- Signed(WordShl(parameters_and_register_length,
- IntPtrConstant(kTaggedSizeLog2))));
- TNode<HeapObject> base = AllocateInNewSpace(size);
-
- // Initialize the register file.
- TNode<FixedArray> parameters_and_registers = UncheckedCast<FixedArray>(
- InnerAllocate(base, JSAsyncFunctionObject::kSize +
- JSPromise::kSizeWithEmbedderFields));
- StoreMapNoWriteBarrier(parameters_and_registers, RootIndex::kFixedArrayMap);
- StoreObjectFieldNoWriteBarrier(parameters_and_registers,
- FixedArray::kLengthOffset,
- SmiFromIntPtr(parameters_and_register_length));
+ // Allocate and initialize the register file.
+ TNode<FixedArrayBase> parameters_and_registers =
+ AllocateFixedArray(HOLEY_ELEMENTS, parameters_and_register_length,
+ INTPTR_PARAMETERS, kAllowLargeObjectAllocation);
FillFixedArrayWithValue(HOLEY_ELEMENTS, parameters_and_registers,
IntPtrConstant(0), parameters_and_register_length,
RootIndex::kUndefinedValue);
+ // Allocate space for the promise, the async function object.
+ TNode<IntPtrT> size = IntPtrConstant(JSPromise::kSizeWithEmbedderFields +
+ JSAsyncFunctionObject::kSize);
+ TNode<HeapObject> base = AllocateInNewSpace(size);
+
// Initialize the promise.
TNode<Context> native_context = LoadNativeContext(context);
TNode<JSFunction> promise_function =