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

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: Partially fix `throw` completions (resumption works, but no resumption doesn't) 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/compiler.cc » ('j') | src/contexts.h » ('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..afe1a727c440a6d18cbe7bfb7a5335e5f2937a3d 100644
--- a/src/builtins.cc
+++ b/src/builtins.cc
@@ -2326,35 +2326,56 @@ 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) {
caitp (gmail) 2016/04/16 18:20:20 None of these changes are really needed, admittedl
+ JSGeneratorObject::ResumeMode resume_mode, char const* const method_name,
+ ResumeType type) {
typedef compiler::CodeStubAssembler::Label Label;
typedef compiler::Node Node;
- Node* receiver = assembler->Parameter(0);
- Node* value = assembler->Parameter(1);
- Node* context = assembler->Parameter(4);
+ Node* receiver = nullptr;
+ Node* value = nullptr;
+ Node* context = nullptr;
Node* zero = assembler->SmiConstant(Smi::FromInt(0));
+ switch (type) {
+ case ResumeType::Generator:
+ receiver = assembler->Parameter(0);
+ value = assembler->Parameter(1);
+ context = assembler->Parameter(4);
+ break;
+ case ResumeType::Async:
+ receiver = assembler->Parameter(1);
+ value = assembler->Parameter(2);
+ context = assembler->Parameter(5);
+ break;
+ }
+
// 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 +2384,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 +2394,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 +2416,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 +2430,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/compiler.cc » ('j') | src/contexts.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698