summaryrefslogtreecommitdiff
path: root/deps/v8/src/builtins/builtins-generator-gen.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/builtins/builtins-generator-gen.cc')
-rw-r--r--deps/v8/src/builtins/builtins-generator-gen.cc63
1 files changed, 49 insertions, 14 deletions
diff --git a/deps/v8/src/builtins/builtins-generator-gen.cc b/deps/v8/src/builtins/builtins-generator-gen.cc
index d884c417fc..0a4b3b205b 100644
--- a/deps/v8/src/builtins/builtins-generator-gen.cc
+++ b/deps/v8/src/builtins/builtins-generator-gen.cc
@@ -19,19 +19,25 @@ class GeneratorBuiltinsAssembler : public CodeStubAssembler {
: CodeStubAssembler(state) {}
protected:
+ // Currently, AsyncModules in V8 are built on top of JSAsyncFunctionObjects
+ // with an initial yield. Thus, we need some way to 'resume' the
+ // underlying JSAsyncFunctionObject owned by an AsyncModule. To support this
+ // the body of resume is factored out below, and shared by JSGeneratorObject
+ // prototype methods as well as AsyncModuleEvaluate. The only difference
+ // between AsyncModuleEvaluate and JSGeneratorObject::PrototypeNext is
+ // the expected reciever.
+ void InnerResume(CodeStubArguments* args, Node* receiver, Node* value,
+ Node* context, JSGeneratorObject::ResumeMode resume_mode,
+ char const* const method_name);
void GeneratorPrototypeResume(CodeStubArguments* args, Node* receiver,
Node* value, Node* context,
JSGeneratorObject::ResumeMode resume_mode,
char const* const method_name);
};
-void GeneratorBuiltinsAssembler::GeneratorPrototypeResume(
+void GeneratorBuiltinsAssembler::InnerResume(
CodeStubArguments* args, Node* receiver, Node* value, Node* context,
JSGeneratorObject::ResumeMode resume_mode, char const* const method_name) {
- // Check if the {receiver} is actually a JSGeneratorObject.
- ThrowIfNotInstanceType(context, receiver, JS_GENERATOR_OBJECT_TYPE,
- method_name);
-
// Check if the {receiver} is running or already closed.
TNode<Smi> receiver_continuation =
CAST(LoadObjectField(receiver, JSGeneratorObject::kContinuationOffset));
@@ -111,17 +117,46 @@ void GeneratorBuiltinsAssembler::GeneratorPrototypeResume(
}
}
+void GeneratorBuiltinsAssembler::GeneratorPrototypeResume(
+ CodeStubArguments* args, Node* receiver, Node* value, Node* context,
+ JSGeneratorObject::ResumeMode resume_mode, char const* const method_name) {
+ // Check if the {receiver} is actually a JSGeneratorObject.
+ ThrowIfNotInstanceType(context, receiver, JS_GENERATOR_OBJECT_TYPE,
+ method_name);
+ InnerResume(args, receiver, value, context, resume_mode, method_name);
+}
+
+TF_BUILTIN(AsyncModuleEvaluate, GeneratorBuiltinsAssembler) {
+ const int kValueArg = 0;
+
+ TNode<Int32T> argc =
+ UncheckedCast<Int32T>(Parameter(Descriptor::kJSActualArgumentsCount));
+ CodeStubArguments args(this, argc);
+
+ TNode<Object> receiver = args.GetReceiver();
+ TNode<Object> value = args.GetOptionalArgumentValue(kValueArg);
+ TNode<Context> context = Cast(Parameter(Descriptor::kContext));
+
+ // AsyncModules act like JSAsyncFunctions. Thus we check here
+ // that the {receiver} is a JSAsyncFunction.
+ char const* const method_name = "[AsyncModule].evaluate";
+ ThrowIfNotInstanceType(context, receiver, JS_ASYNC_FUNCTION_OBJECT_TYPE,
+ method_name);
+ InnerResume(&args, receiver, value, context, JSGeneratorObject::kNext,
+ method_name);
+}
+
// ES6 #sec-generator.prototype.next
TF_BUILTIN(GeneratorPrototypeNext, GeneratorBuiltinsAssembler) {
const int kValueArg = 0;
- TNode<IntPtrT> argc =
- ChangeInt32ToIntPtr(Parameter(Descriptor::kJSActualArgumentsCount));
+ TNode<Int32T> argc =
+ UncheckedCast<Int32T>(Parameter(Descriptor::kJSActualArgumentsCount));
CodeStubArguments args(this, argc);
TNode<Object> receiver = args.GetReceiver();
TNode<Object> value = args.GetOptionalArgumentValue(kValueArg);
- Node* context = Parameter(Descriptor::kContext);
+ TNode<Context> context = CAST(Parameter(Descriptor::kContext));
GeneratorPrototypeResume(&args, receiver, value, context,
JSGeneratorObject::kNext,
@@ -132,13 +167,13 @@ TF_BUILTIN(GeneratorPrototypeNext, GeneratorBuiltinsAssembler) {
TF_BUILTIN(GeneratorPrototypeReturn, GeneratorBuiltinsAssembler) {
const int kValueArg = 0;
- TNode<IntPtrT> argc =
- ChangeInt32ToIntPtr(Parameter(Descriptor::kJSActualArgumentsCount));
+ TNode<Int32T> argc =
+ UncheckedCast<Int32T>(Parameter(Descriptor::kJSActualArgumentsCount));
CodeStubArguments args(this, argc);
TNode<Object> receiver = args.GetReceiver();
TNode<Object> value = args.GetOptionalArgumentValue(kValueArg);
- Node* context = Parameter(Descriptor::kContext);
+ TNode<Context> context = CAST(Parameter(Descriptor::kContext));
GeneratorPrototypeResume(&args, receiver, value, context,
JSGeneratorObject::kReturn,
@@ -149,13 +184,13 @@ TF_BUILTIN(GeneratorPrototypeReturn, GeneratorBuiltinsAssembler) {
TF_BUILTIN(GeneratorPrototypeThrow, GeneratorBuiltinsAssembler) {
const int kExceptionArg = 0;
- TNode<IntPtrT> argc =
- ChangeInt32ToIntPtr(Parameter(Descriptor::kJSActualArgumentsCount));
+ TNode<Int32T> argc =
+ UncheckedCast<Int32T>(Parameter(Descriptor::kJSActualArgumentsCount));
CodeStubArguments args(this, argc);
TNode<Object> receiver = args.GetReceiver();
TNode<Object> exception = args.GetOptionalArgumentValue(kExceptionArg);
- Node* context = Parameter(Descriptor::kContext);
+ TNode<Context> context = CAST(Parameter(Descriptor::kContext));
GeneratorPrototypeResume(&args, receiver, exception, context,
JSGeneratorObject::kThrow,