Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(156)

Unified Diff: src/builtins/builtins-async-function.cc

Issue 2752143004: [refactor] Separate generated builtins and C++ builtins into separate files (Closed)
Patch Set: tentative gcmole fix Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/builtins/builtins-async.cc ('k') | src/builtins/builtins-async-function-gen.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/builtins/builtins-async-function.cc
diff --git a/src/builtins/builtins-async-function.cc b/src/builtins/builtins-async-function.cc
deleted file mode 100644
index 309d4815336fbc585817fe6875788c6ea0481483..0000000000000000000000000000000000000000
--- a/src/builtins/builtins-async-function.cc
+++ /dev/null
@@ -1,208 +0,0 @@
-// Copyright 2017 the V8 project authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "src/builtins/builtins-async.h"
-#include "src/builtins/builtins-utils.h"
-#include "src/builtins/builtins.h"
-#include "src/code-stub-assembler.h"
-#include "src/objects-inl.h"
-
-namespace v8 {
-namespace internal {
-
-typedef compiler::Node Node;
-typedef CodeStubAssembler::ParameterMode ParameterMode;
-typedef compiler::CodeAssemblerState CodeAssemblerState;
-
-class AsyncFunctionBuiltinsAssembler : public AsyncBuiltinsAssembler {
- public:
- explicit AsyncFunctionBuiltinsAssembler(CodeAssemblerState* state)
- : AsyncBuiltinsAssembler(state) {}
-
- protected:
- void AsyncFunctionAwait(Node* const context, Node* const generator,
- Node* const awaited, Node* const outer_promise,
- const bool is_predicted_as_caught);
-
- void AsyncFunctionAwaitResumeClosure(
- Node* const context, Node* const sent_value,
- JSGeneratorObject::ResumeMode resume_mode);
-};
-
-namespace {
-
-// Describe fields of Context associated with AsyncFunctionAwait resume
-// closures.
-// TODO(jgruber): Refactor to reuse code for upcoming async-generators.
-class AwaitContext {
- public:
- enum Fields { kGeneratorSlot = Context::MIN_CONTEXT_SLOTS, kLength };
-};
-
-} // anonymous namespace
-
-void AsyncFunctionBuiltinsAssembler::AsyncFunctionAwaitResumeClosure(
- Node* context, Node* sent_value,
- JSGeneratorObject::ResumeMode resume_mode) {
- DCHECK(resume_mode == JSGeneratorObject::kNext ||
- resume_mode == JSGeneratorObject::kThrow);
-
- Node* const generator =
- LoadContextElement(context, AwaitContext::kGeneratorSlot);
- CSA_SLOW_ASSERT(this, HasInstanceType(generator, JS_GENERATOR_OBJECT_TYPE));
-
- // Inline version of GeneratorPrototypeNext / GeneratorPrototypeReturn with
- // unnecessary runtime checks removed.
- // TODO(jgruber): Refactor to reuse code from builtins-generator.cc.
-
- // Ensure that the generator is neither closed nor running.
- CSA_SLOW_ASSERT(
- this,
- SmiGreaterThan(
- LoadObjectField(generator, JSGeneratorObject::kContinuationOffset),
- SmiConstant(JSGeneratorObject::kGeneratorClosed)));
-
- // Resume the {receiver} using our trampoline.
- Callable callable = CodeFactory::ResumeGenerator(isolate());
- CallStub(callable, context, sent_value, generator, SmiConstant(resume_mode));
-
- // The resulting Promise is a throwaway, so it doesn't matter what it
- // resolves to. What is important is that we don't end up keeping the
- // whole chain of intermediate Promises alive by returning the return value
- // of ResumeGenerator, as that would create a memory leak.
-}
-
-TF_BUILTIN(AsyncFunctionAwaitRejectClosure, AsyncFunctionBuiltinsAssembler) {
- CSA_ASSERT_JS_ARGC_EQ(this, 1);
- Node* const sentError = Parameter(1);
- Node* const context = Parameter(4);
-
- AsyncFunctionAwaitResumeClosure(context, sentError,
- JSGeneratorObject::kThrow);
- Return(UndefinedConstant());
-}
-
-TF_BUILTIN(AsyncFunctionAwaitResolveClosure, AsyncFunctionBuiltinsAssembler) {
- CSA_ASSERT_JS_ARGC_EQ(this, 1);
- Node* const sentValue = Parameter(1);
- Node* const context = Parameter(4);
-
- AsyncFunctionAwaitResumeClosure(context, sentValue, JSGeneratorObject::kNext);
- Return(UndefinedConstant());
-}
-
-// ES#abstract-ops-async-function-await
-// AsyncFunctionAwait ( value )
-// Shared logic for the core of await. The parser desugars
-// await awaited
-// into
-// yield AsyncFunctionAwait{Caught,Uncaught}(.generator, awaited, .promise)
-// The 'awaited' parameter is the value; the generator stands in
-// for the asyncContext, and .promise is the larger promise under
-// construction by the enclosing async function.
-void AsyncFunctionBuiltinsAssembler::AsyncFunctionAwait(
- Node* const context, Node* const generator, Node* const awaited,
- Node* const outer_promise, const bool is_predicted_as_caught) {
- CSA_SLOW_ASSERT(this, HasInstanceType(generator, JS_GENERATOR_OBJECT_TYPE));
- CSA_SLOW_ASSERT(this, HasInstanceType(outer_promise, JS_PROMISE_TYPE));
-
- NodeGenerator1 create_closure_context = [&](Node* native_context) -> Node* {
- Node* const context =
- CreatePromiseContext(native_context, AwaitContext::kLength);
- StoreContextElementNoWriteBarrier(context, AwaitContext::kGeneratorSlot,
- generator);
- return context;
- };
-
- // TODO(jgruber): AsyncBuiltinsAssembler::Await currently does not reuse
- // the awaited promise if it is already a promise. Reuse is non-spec compliant
- // but part of our old behavior gives us a couple of percent
- // performance boost.
- // TODO(jgruber): Use a faster specialized version of
- // InternalPerformPromiseThen.
-
- Node* const result = Await(
- context, generator, awaited, outer_promise, create_closure_context,
- Context::ASYNC_FUNCTION_AWAIT_RESOLVE_SHARED_FUN,
- Context::ASYNC_FUNCTION_AWAIT_REJECT_SHARED_FUN, is_predicted_as_caught);
-
- Return(result);
-}
-
-// Called by the parser from the desugaring of 'await' when catch
-// prediction indicates that there is a locally surrounding catch block.
-TF_BUILTIN(AsyncFunctionAwaitCaught, AsyncFunctionBuiltinsAssembler) {
- CSA_ASSERT_JS_ARGC_EQ(this, 3);
- Node* const generator = Parameter(1);
- Node* const awaited = Parameter(2);
- Node* const outer_promise = Parameter(3);
- Node* const context = Parameter(6);
-
- static const bool kIsPredictedAsCaught = true;
-
- AsyncFunctionAwait(context, generator, awaited, outer_promise,
- kIsPredictedAsCaught);
-}
-
-// Called by the parser from the desugaring of 'await' when catch
-// prediction indicates no locally surrounding catch block.
-TF_BUILTIN(AsyncFunctionAwaitUncaught, AsyncFunctionBuiltinsAssembler) {
- CSA_ASSERT_JS_ARGC_EQ(this, 3);
- Node* const generator = Parameter(1);
- Node* const awaited = Parameter(2);
- Node* const outer_promise = Parameter(3);
- Node* const context = Parameter(6);
-
- static const bool kIsPredictedAsCaught = false;
-
- AsyncFunctionAwait(context, generator, awaited, outer_promise,
- kIsPredictedAsCaught);
-}
-
-TF_BUILTIN(AsyncFunctionPromiseCreate, AsyncFunctionBuiltinsAssembler) {
- CSA_ASSERT_JS_ARGC_EQ(this, 0);
- Node* const context = Parameter(3);
-
- Node* const promise = AllocateAndInitJSPromise(context);
-
- Label if_is_debug_active(this, Label::kDeferred);
- GotoIf(IsDebugActive(), &if_is_debug_active);
-
- // Early exit if debug is not active.
- Return(promise);
-
- Bind(&if_is_debug_active);
- {
- // Push the Promise under construction in an async function on
- // the catch prediction stack to handle exceptions thrown before
- // the first await.
- // Assign ID and create a recurring task to save stack for future
- // resumptions from await.
- CallRuntime(Runtime::kDebugAsyncFunctionPromiseCreated, context, promise);
- Return(promise);
- }
-}
-
-TF_BUILTIN(AsyncFunctionPromiseRelease, AsyncFunctionBuiltinsAssembler) {
- CSA_ASSERT_JS_ARGC_EQ(this, 1);
- Node* const promise = Parameter(1);
- Node* const context = Parameter(4);
-
- Label if_is_debug_active(this, Label::kDeferred);
- GotoIf(IsDebugActive(), &if_is_debug_active);
-
- // Early exit if debug is not active.
- Return(UndefinedConstant());
-
- Bind(&if_is_debug_active);
- {
- // Pop the Promise under construction in an async function on
- // from catch prediction stack.
- CallRuntime(Runtime::kDebugPopPromise, context);
- Return(promise);
- }
-}
-
-} // namespace internal
-} // namespace v8
« no previous file with comments | « src/builtins/builtins-async.cc ('k') | src/builtins/builtins-async-function-gen.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698