2021-06-12 17:54:40 -03:00
/*
* Copyright ( c ) 2021 , Idan Horowitz < idan . horowitz @ serenityos . org >
*
* SPDX - License - Identifier : BSD - 2 - Clause
*/
2021-06-19 21:09:39 -03:00
# include <LibJS/Runtime/AbstractOperations.h>
2021-06-12 17: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 {
MapConstructor : : MapConstructor ( GlobalObject & global_object )
2021-06-27 21:45:49 -03:00
: NativeFunction ( vm ( ) . names . Map . as_string ( ) , * global_object . function_prototype ( ) )
2021-06-12 17:54:40 -03:00
{
}
void MapConstructor : : initialize ( GlobalObject & global_object )
{
auto & vm = this - > vm ( ) ;
NativeFunction : : initialize ( global_object ) ;
2021-06-13 08:20:21 -03:00
// 24.1.2.1 Map.prototype, https://tc39.es/ecma262/#sec-map.prototype
2021-07-05 20:15:08 -03:00
define_direct_property ( vm . names . prototype , global_object . map_prototype ( ) , 0 ) ;
2021-06-13 08:20:21 -03:00
2021-10-28 19:00:36 -03:00
define_native_accessor ( * vm . well_known_symbol_species ( ) , symbol_species_getter , { } , Attribute : : Configurable ) ;
2021-07-07 20:49:53 -03:00
define_direct_property ( vm . names . length , Value ( 0 ) , Attribute : : Configurable ) ;
2021-06-12 17:54:40 -03:00
}
MapConstructor : : ~ MapConstructor ( )
{
}
2021-06-13 08:20:21 -03:00
// 24.1.1.1 Map ( [ iterable ] ), https://tc39.es/ecma262/#sec-map-iterable
2021-10-20 17:16:30 -03:00
ThrowCompletionOr < Value > MapConstructor : : call ( )
2021-06-12 17:54:40 -03:00
{
auto & vm = this - > vm ( ) ;
2021-10-20 17:16:30 -03:00
return vm . throw_completion < TypeError > ( global_object ( ) , ErrorType : : ConstructorWithoutNew , vm . names . Map ) ;
2021-06-12 17:54:40 -03:00
}
// 24.1.1.1 Map ( [ iterable ] ), https://tc39.es/ecma262/#sec-map-iterable
2021-10-20 17:16:30 -03:00
ThrowCompletionOr < Object * > MapConstructor : : construct ( FunctionObject & new_target )
2021-06-12 17:54:40 -03:00
{
auto & vm = this - > vm ( ) ;
2021-06-19 21:09:39 -03:00
auto & global_object = this - > global_object ( ) ;
2021-10-20 17:16:30 -03:00
auto * map = TRY ( ordinary_create_from_constructor < Map > ( global_object , new_target , & GlobalObject : : map_prototype ) ) ;
2021-06-12 17:54:40 -03:00
if ( vm . argument ( 0 ) . is_nullish ( ) )
return map ;
2021-10-20 17:16:30 -03:00
auto adder = TRY ( map - > get ( vm . names . set ) ) ;
if ( ! adder . is_function ( ) )
return vm . throw_completion < TypeError > ( global_object , ErrorType : : NotAFunction , " 'set' property of Map " ) ;
2021-10-20 13:10:23 -03:00
2021-12-28 13:57:09 -03:00
( void ) TRY ( get_iterator_values ( global_object , vm . argument ( 0 ) , [ & ] ( Value iterator_value ) - > Optional < Completion > {
2021-10-20 13:10:23 -03:00
if ( ! iterator_value . is_object ( ) )
return vm . throw_completion < TypeError > ( global_object , ErrorType : : NotAnObject , String : : formatted ( " Iterator value {} " , iterator_value . to_string_without_side_effects ( ) ) ) ;
auto key = TRY ( iterator_value . as_object ( ) . get ( 0 ) ) ;
auto value = TRY ( iterator_value . as_object ( ) . get ( 1 ) ) ;
2022-01-23 06:12:26 -03:00
TRY ( JS : : call ( global_object , adder . as_function ( ) , map , key , value ) ) ;
2021-10-20 13:10:23 -03:00
2021-06-12 17:54:40 -03:00
return { } ;
2021-10-20 13:10:23 -03:00
} ) ) ;
2021-06-12 17:54:40 -03:00
return map ;
}
// 24.1.2.2 get Map [ @@species ], https://tc39.es/ecma262/#sec-get-map-@@species
2021-10-28 19:00:36 -03:00
JS_DEFINE_NATIVE_FUNCTION ( MapConstructor : : symbol_species_getter )
2021-06-12 17:54:40 -03:00
{
return vm . this_value ( global_object ) ;
}
}