mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 07:12:43 +00:00 
			
		
		
		
	 681787de76
			
		
	
	
		681787de76
		
	
	
	
	
		
			
			This commit adds support for the most bare bones version of async functions, support for async generator functions, async arrow functions and await expressions are TODO.
		
			
				
	
	
		
			60 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			60 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  * Copyright (c) 2021, Idan Horowitz <idan.horowitz@serenityos.org>
 | |
|  *
 | |
|  * SPDX-License-Identifier: BSD-2-Clause
 | |
|  */
 | |
| 
 | |
| #include <LibJS/Interpreter.h>
 | |
| #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 function = TRY(FunctionConstructor::create_dynamic_function_node(global_object(), new_target, FunctionKind::Async));
 | |
| 
 | |
|     OwnPtr<Interpreter> local_interpreter;
 | |
|     Interpreter* interpreter = vm.interpreter_if_exists();
 | |
| 
 | |
|     if (!interpreter) {
 | |
|         local_interpreter = Interpreter::create_with_existing_realm(*realm());
 | |
|         interpreter = local_interpreter.ptr();
 | |
|     }
 | |
| 
 | |
|     VM::InterpreterExecutionScope scope(*interpreter);
 | |
|     auto result = function->execute(*interpreter, global_object());
 | |
|     if (auto* exception = vm.exception())
 | |
|         return throw_completion(exception->value());
 | |
|     VERIFY(result.is_object() && is<ECMAScriptFunctionObject>(result.as_object()));
 | |
|     return &result.as_object();
 | |
| }
 | |
| 
 | |
| }
 |