2021-06-12 23:54:40 +03:00
/*
* Copyright ( c ) 2021 , Idan Horowitz < idan . horowitz @ serenityos . org >
*
* SPDX - License - Identifier : BSD - 2 - Clause
*/
2021-06-20 01:09:39 +01:00
# include <LibJS/Runtime/AbstractOperations.h>
2021-06-12 23:54:40 +03:00
# include <LibJS/Runtime/Error.h>
# include <LibJS/Runtime/GlobalObject.h>
# include <LibJS/Runtime/IteratorOperations.h>
# include <LibJS/Runtime/Map.h>
# include <LibJS/Runtime/MapConstructor.h>
namespace JS {
2022-08-16 00:20:49 +01:00
MapConstructor : : MapConstructor ( Realm & realm )
2023-04-13 00:47:15 +02:00
: NativeFunction ( realm . vm ( ) . names . Map . as_string ( ) , realm . intrinsics ( ) . function_prototype ( ) )
2021-06-12 23:54:40 +03:00
{
}
2023-01-28 12:33:35 -05:00
ThrowCompletionOr < void > MapConstructor : : initialize ( Realm & realm )
2021-06-12 23:54:40 +03:00
{
auto & vm = this - > vm ( ) ;
2023-01-28 12:33:35 -05:00
MUST_OR_THROW_OOM ( NativeFunction : : initialize ( realm ) ) ;
2021-06-13 12:20:21 +01:00
// 24.1.2.1 Map.prototype, https://tc39.es/ecma262/#sec-map.prototype
2022-08-27 00:54:55 +01:00
define_direct_property ( vm . names . prototype , realm . intrinsics ( ) . map_prototype ( ) , 0 ) ;
2021-06-13 12:20:21 +01:00
2023-04-13 01:14:45 +02:00
define_native_accessor ( realm , vm . well_known_symbol_species ( ) , symbol_species_getter , { } , Attribute : : Configurable ) ;
2021-07-08 02:49:53 +03:00
define_direct_property ( vm . names . length , Value ( 0 ) , Attribute : : Configurable ) ;
2023-01-28 12:33:35 -05:00
return { } ;
2021-06-12 23:54:40 +03:00
}
2021-06-13 12:20:21 +01:00
// 24.1.1.1 Map ( [ iterable ] ), https://tc39.es/ecma262/#sec-map-iterable
2021-10-20 21:16:30 +01:00
ThrowCompletionOr < Value > MapConstructor : : call ( )
2021-06-12 23:54:40 +03:00
{
auto & vm = this - > vm ( ) ;
2022-08-16 20:33:17 +01:00
return vm . throw_completion < TypeError > ( ErrorType : : ConstructorWithoutNew , vm . names . Map ) ;
2021-06-12 23:54:40 +03:00
}
// 24.1.1.1 Map ( [ iterable ] ), https://tc39.es/ecma262/#sec-map-iterable
2022-12-14 19:18:10 +00:00
ThrowCompletionOr < NonnullGCPtr < Object > > MapConstructor : : construct ( FunctionObject & new_target )
2021-06-12 23:54:40 +03:00
{
auto & vm = this - > vm ( ) ;
2021-06-20 01:09:39 +01:00
2022-12-14 18:34:32 +00:00
auto map = TRY ( ordinary_create_from_constructor < Map > ( vm , new_target , & Intrinsics : : map_prototype ) ) ;
2021-06-12 23:54:40 +03:00
if ( vm . argument ( 0 ) . is_nullish ( ) )
2022-12-14 19:18:10 +00:00
return map ;
2021-06-12 23:54:40 +03:00
2021-10-20 21:16:30 +01:00
auto adder = TRY ( map - > get ( vm . names . set ) ) ;
if ( ! adder . is_function ( ) )
2022-08-16 20:33:17 +01:00
return vm . throw_completion < TypeError > ( ErrorType : : NotAFunction , " 'set' property of Map " ) ;
2021-10-20 12:10:23 -04:00
2022-08-21 15:56:27 +01:00
( void ) TRY ( get_iterator_values ( vm , vm . argument ( 0 ) , [ & ] ( Value iterator_value ) - > Optional < Completion > {
2021-10-20 12:10:23 -04:00
if ( ! iterator_value . is_object ( ) )
2023-02-12 21:26:14 -05:00
return vm . throw_completion < TypeError > ( ErrorType : : NotAnObject , DeprecatedString : : formatted ( " Iterator value {} " , TRY_OR_THROW_OOM ( vm , iterator_value . to_string_without_side_effects ( ) ) ) ) ;
2021-10-20 12:10:23 -04:00
auto key = TRY ( iterator_value . as_object ( ) . get ( 0 ) ) ;
auto value = TRY ( iterator_value . as_object ( ) . get ( 1 ) ) ;
2022-08-21 19:24:32 +01:00
TRY ( JS : : call ( vm , adder . as_function ( ) , map , key , value ) ) ;
2021-10-20 12:10:23 -04:00
2021-06-12 23:54:40 +03:00
return { } ;
2021-10-20 12:10:23 -04:00
} ) ) ;
2022-12-14 19:18:10 +00:00
return map ;
2021-06-12 23:54:40 +03:00
}
// 24.1.2.2 get Map [ @@species ], https://tc39.es/ecma262/#sec-get-map-@@species
2021-10-29 01:00:36 +03:00
JS_DEFINE_NATIVE_FUNCTION ( MapConstructor : : symbol_species_getter )
2021-06-12 23:54:40 +03:00
{
2022-08-20 09:48:43 +01:00
return vm . this_value ( ) ;
2021-06-12 23:54:40 +03:00
}
}