diff options
Diffstat (limited to 'deps/v8/src/builtins/builtins-generator-gen.cc')
-rw-r--r-- | deps/v8/src/builtins/builtins-generator-gen.cc | 63 |
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, |