mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 03:22:43 +00:00 
			
		
		
		
	 e8519156bc
			
		
	
	
		e8519156bc
		
	
	
	
	
		
			
			The three major changes are:
- Parsing parameters, the function body, and then the full assembled
  function source all separately. This is required by the spec, as
  function parameters and body must be valid each on their own, which
  cannot be guaranteed if we only ever parse the full function.
- Returning an ECMAScriptFunctionObject instead of a FunctionExpression
  that needs to be evaluated separately. This vastly simplifies the
  {Async,AsyncGenerator,Generator,}Function constructor implementations.
  Drop '_node' from the function name accordingly.
- The prototype is now determined via GetPrototypeFromConstructor and
  passed to OrdinaryFunctionCreate.
		
	
			
		
			
				
	
	
		
			53 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			53 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  * Copyright (c) 2021, Idan Horowitz <idan.horowitz@serenityos.org>
 | |
|  *
 | |
|  * SPDX-License-Identifier: BSD-2-Clause
 | |
|  */
 | |
| 
 | |
| #include <LibJS/Runtime/AsyncFunctionConstructor.h>
 | |
| #include <LibJS/Runtime/ECMAScriptFunctionObject.h>
 | |
| #include <LibJS/Runtime/FunctionConstructor.h>
 | |
| #include <LibJS/Runtime/FunctionObject.h>
 | |
| #include <LibJS/Runtime/GlobalObject.h>
 | |
| 
 | |
| namespace JS {
 | |
| 
 | |
| AsyncFunctionConstructor::AsyncFunctionConstructor(GlobalObject& global_object)
 | |
|     : NativeFunction(vm().names.AsyncFunction.as_string(), *global_object.function_prototype())
 | |
| {
 | |
| }
 | |
| 
 | |
| void AsyncFunctionConstructor::initialize(GlobalObject& global_object)
 | |
| {
 | |
|     auto& vm = this->vm();
 | |
|     NativeFunction::initialize(global_object);
 | |
| 
 | |
|     // 27.7.2.2 AsyncFunction.prototype, https://tc39.es/ecma262/#sec-async-function-constructor-prototype
 | |
|     define_direct_property(vm.names.prototype, global_object.async_function_prototype(), 0);
 | |
| 
 | |
|     define_direct_property(vm.names.length, Value(1), Attribute::Configurable);
 | |
| }
 | |
| 
 | |
| // 27.7.1.1 AsyncFunction ( p1, p2, … , pn, body ), https://tc39.es/ecma262/#sec-async-function-constructor-arguments
 | |
| ThrowCompletionOr<Value> AsyncFunctionConstructor::call()
 | |
| {
 | |
|     return TRY(construct(*this));
 | |
| }
 | |
| 
 | |
| // 27.7.1.1 AsyncFunction ( p1, p2, … , pn, body ), https://tc39.es/ecma262/#sec-async-function-constructor-arguments
 | |
| ThrowCompletionOr<Object*> AsyncFunctionConstructor::construct(FunctionObject& new_target)
 | |
| {
 | |
|     auto& vm = this->vm();
 | |
|     auto& global_object = this->global_object();
 | |
| 
 | |
|     // 1. Let C be the active function object.
 | |
|     auto* constructor = vm.active_function_object();
 | |
| 
 | |
|     // 2. Let args be the argumentsList that was passed to this function by [[Call]] or [[Construct]].
 | |
|     auto& args = vm.running_execution_context().arguments;
 | |
| 
 | |
|     // 3. Return CreateDynamicFunction(C, NewTarget, async, args).
 | |
|     return TRY(FunctionConstructor::create_dynamic_function(global_object, *constructor, &new_target, FunctionKind::Async, args));
 | |
| }
 | |
| 
 | |
| }
 |