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

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: Try new strategy (Option C) 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/factory.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 8013f1078f459d7cb83d4786ad6913a48c926668..e3eabe451c8405768607d6df24a0ec115891c328 100644
--- a/src/builtins.cc
+++ b/src/builtins.cc
@@ -2331,9 +2331,11 @@ void Builtins::Generate_MathTrunc(CodeStubAssembler* assembler) {
namespace {
+enum class ResumeType { Generator, Async };
+
void Generate_GeneratorPrototypeResume(
CodeStubAssembler* assembler, JSGeneratorObject::ResumeMode resume_mode,
- char const* const method_name) {
+ char const* const method_name, ResumeType type) {
typedef CodeStubAssembler::Label Label;
typedef compiler::Node Node;
@@ -2345,24 +2347,29 @@ 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, closed),
- &if_receiverisclosed);
- DCHECK_LT(JSGeneratorObject::kGeneratorExecuting,
- JSGeneratorObject::kGeneratorClosed);
- assembler->GotoIf(assembler->SmiLessThan(receiver_continuation, closed),
- &if_receiverisrunning);
+ if (type == ResumeType::Generator || FLAG_debug_code) {
+ assembler->GotoIf(assembler->SmiEqual(receiver_continuation, closed),
+ &if_receiverisclosed);
+ DCHECK_LT(JSGeneratorObject::kGeneratorExecuting,
+ JSGeneratorObject::kGeneratorClosed);
+ assembler->GotoIf(assembler->SmiLessThan(receiver_continuation, closed),
+ &if_receiverisrunning);
+ }
// Resume the {receiver} using our trampoline.
Node* result = assembler->CallStub(
@@ -2371,7 +2378,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,
@@ -2381,8 +2388,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) {
@@ -2403,8 +2410,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.
@@ -2416,19 +2423,32 @@ void Generate_GeneratorPrototypeResume(
// ES6 section 25.3.1.2 Generator.prototype.next ( value )
void Builtins::Generate_GeneratorPrototypeNext(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(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(CodeStubAssembler* assembler) {
Generate_GeneratorPrototypeResume(assembler, JSGeneratorObject::kThrow,
- "[Generator].prototype.throw");
+ "[Generator].prototype.throw",
+ ResumeType::Generator);
+}
+
+void Builtins::Generate_AsyncFunctionNext(CodeStubAssembler* assembler) {
+ Generate_GeneratorPrototypeResume(assembler, JSGeneratorObject::kNext,
+ "[AsyncFunction].next", ResumeType::Async);
+}
+
+void Builtins::Generate_AsyncFunctionThrow(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/factory.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698