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

Unified Diff: src/builtins.cc

Issue 1895603002: [esnext] prototype runtime implementation for async functions (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@AsyncFunction
Patch Set: majorly improve stack traces, get rid of self-spawning behaviour, create inner generator function Created 4 years, 8 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.h ('k') | src/code-stubs.h » ('j') | src/parsing/parser.cc » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/builtins.cc
diff --git a/src/builtins.cc b/src/builtins.cc
index d054916db0a700e330ea3aac6abf859d0ec4226a..1c1b79d6b757a56197b4f5c73d1b7987721173e2 100644
--- a/src/builtins.cc
+++ b/src/builtins.cc
@@ -2326,9 +2326,12 @@ void Builtins::Generate_MathTrunc(compiler::CodeStubAssembler* assembler) {
namespace {
+enum class ResumeType { Generator, Async };
+
void Generate_GeneratorPrototypeResume(
compiler::CodeStubAssembler* assembler,
- JSGeneratorObject::ResumeMode resume_mode, char const* const method_name) {
+ JSGeneratorObject::ResumeMode resume_mode, char const* const method_name,
+ ResumeType type) {
typedef compiler::CodeStubAssembler::Label Label;
typedef compiler::Node Node;
@@ -2339,22 +2342,27 @@ void Generate_GeneratorPrototypeResume(
// Check if the {receiver} is actually a JSGeneratorObject.
Label if_receiverisincompatible(assembler, Label::kDeferred);
- assembler->GotoIf(assembler->WordIsSmi(receiver), &if_receiverisincompatible);
- Node* receiver_instance_type = assembler->LoadInstanceType(receiver);
- assembler->GotoUnless(assembler->Word32Equal(
- receiver_instance_type,
- assembler->Int32Constant(JS_GENERATOR_OBJECT_TYPE)),
- &if_receiverisincompatible);
+ if (type == ResumeType::Generator || FLAG_debug_code) {
+ assembler->GotoIf(assembler->WordIsSmi(receiver),
+ &if_receiverisincompatible);
+ Node* receiver_instance_type = assembler->LoadInstanceType(receiver);
+ assembler->GotoUnless(assembler->Word32Equal(receiver_instance_type,
+ assembler->Int32Constant(
+ JS_GENERATOR_OBJECT_TYPE)),
+ &if_receiverisincompatible);
+ }
// Check if the {receiver} is running or already closed.
- Node* receiver_continuation = assembler->LoadObjectField(
- receiver, JSGeneratorObject::kContinuationOffset);
Label if_receiverisclosed(assembler, Label::kDeferred),
if_receiverisrunning(assembler, Label::kDeferred);
- assembler->GotoIf(assembler->SmiEqual(receiver_continuation, zero),
- &if_receiverisclosed);
- assembler->GotoIf(assembler->SmiLessThan(receiver_continuation, zero),
- &if_receiverisrunning);
+ if (type == ResumeType::Generator || FLAG_debug_code) {
+ Node* receiver_continuation = assembler->LoadObjectField(
+ receiver, JSGeneratorObject::kContinuationOffset);
+ assembler->GotoIf(assembler->SmiEqual(receiver_continuation, zero),
+ &if_receiverisclosed);
+ assembler->GotoIf(assembler->SmiLessThan(receiver_continuation, zero),
+ &if_receiverisrunning);
+ }
// Resume the {receiver} using our trampoline.
Node* result = assembler->CallStub(
@@ -2363,7 +2371,7 @@ void Generate_GeneratorPrototypeResume(
assembler->Return(result);
assembler->Bind(&if_receiverisincompatible);
- {
+ if (type == ResumeType::Generator || FLAG_debug_code) {
// The {receiver} is not a valid JSGeneratorObject.
Node* result = assembler->CallRuntime(
Runtime::kThrowIncompatibleMethodReceiver, context,
@@ -2373,8 +2381,8 @@ void Generate_GeneratorPrototypeResume(
assembler->Return(result); // Never reached.
}
- assembler->Bind(&if_receiverisclosed);
- {
+ if (type == ResumeType::Generator || FLAG_debug_code) {
+ assembler->Bind(&if_receiverisclosed);
// The {receiver} is closed already.
Node* result = nullptr;
switch (resume_mode) {
@@ -2395,8 +2403,8 @@ void Generate_GeneratorPrototypeResume(
assembler->Return(result);
}
- assembler->Bind(&if_receiverisrunning);
- {
+ if (type == ResumeType::Generator || FLAG_debug_code) {
+ assembler->Bind(&if_receiverisrunning);
Node* result =
assembler->CallRuntime(Runtime::kThrowGeneratorRunning, context);
assembler->Return(result); // Never reached.
@@ -2409,21 +2417,36 @@ void Generate_GeneratorPrototypeResume(
void Builtins::Generate_GeneratorPrototypeNext(
compiler::CodeStubAssembler* assembler) {
Generate_GeneratorPrototypeResume(assembler, JSGeneratorObject::kNext,
- "[Generator].prototype.next");
+ "[Generator].prototype.next",
+ ResumeType::Generator);
}
// ES6 section 25.3.1.3 Generator.prototype.return ( value )
void Builtins::Generate_GeneratorPrototypeReturn(
compiler::CodeStubAssembler* assembler) {
Generate_GeneratorPrototypeResume(assembler, JSGeneratorObject::kReturn,
- "[Generator].prototype.return");
+ "[Generator].prototype.return",
+ ResumeType::Generator);
}
// ES6 section 25.3.1.4 Generator.prototype.throw ( exception )
void Builtins::Generate_GeneratorPrototypeThrow(
compiler::CodeStubAssembler* assembler) {
Generate_GeneratorPrototypeResume(assembler, JSGeneratorObject::kThrow,
- "[Generator].prototype.throw");
+ "[Generator].prototype.throw",
+ ResumeType::Generator);
+}
+
+void Builtins::Generate_AsyncFunctionNext(
+ compiler::CodeStubAssembler* assembler) {
+ Generate_GeneratorPrototypeResume(assembler, JSGeneratorObject::kNext,
+ "[AsyncFunction].next", ResumeType::Async);
+}
+
+void Builtins::Generate_AsyncFunctionThrow(
+ compiler::CodeStubAssembler* assembler) {
+ Generate_GeneratorPrototypeResume(assembler, JSGeneratorObject::kThrow,
+ "[AsyncFunction].throw", ResumeType::Async);
}
// -----------------------------------------------------------------------------
« no previous file with comments | « src/builtins.h ('k') | src/code-stubs.h » ('j') | src/parsing/parser.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698