2021-06-12 05:28:30 +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 05:28:30 +03:00
# include <LibJS/Runtime/Error.h>
# include <LibJS/Runtime/GlobalObject.h>
# include <LibJS/Runtime/IteratorOperations.h>
# include <LibJS/Runtime/WeakMap.h>
# include <LibJS/Runtime/WeakMapConstructor.h>
namespace JS {
2022-08-16 00:20:49 +01:00
WeakMapConstructor : : WeakMapConstructor ( Realm & realm )
2022-09-14 19:10:27 -04:00
: NativeFunction ( realm . vm ( ) . names . WeakMap . as_string ( ) , * realm . intrinsics ( ) . function_prototype ( ) )
2021-06-12 05:28:30 +03:00
{
}
2022-08-16 00:20:49 +01:00
void WeakMapConstructor : : initialize ( Realm & realm )
2021-06-12 05:28:30 +03:00
{
auto & vm = this - > vm ( ) ;
2022-08-16 00:20:49 +01:00
NativeFunction : : initialize ( realm ) ;
2021-06-19 00:38:41 +01:00
// 24.3.2.1 WeakMap.prototype, https://tc39.es/ecma262/#sec-weakmap.prototype
2022-08-27 00:54:55 +01:00
define_direct_property ( vm . names . prototype , realm . intrinsics ( ) . weak_map_prototype ( ) , 0 ) ;
2021-06-19 00:38:41 +01:00
2021-07-06 02:15:08 +03:00
define_direct_property ( vm . names . length , Value ( 0 ) , Attribute : : Configurable ) ;
2021-06-12 05:28:30 +03:00
}
2021-06-19 00:38:41 +01:00
// 24.3.1.1 WeakMap ( [ iterable ] ), https://tc39.es/ecma262/#sec-weakmap-iterable
2021-10-20 21:16:30 +01:00
ThrowCompletionOr < Value > WeakMapConstructor : : call ( )
2021-06-12 05:28:30 +03:00
{
auto & vm = this - > vm ( ) ;
2022-08-16 20:33:17 +01:00
return vm . throw_completion < TypeError > ( ErrorType : : ConstructorWithoutNew , vm . names . WeakMap ) ;
2021-06-12 05:28:30 +03:00
}
2021-06-12 23:24:20 +03:00
// 24.3.1.1 WeakMap ( [ iterable ] ), https://tc39.es/ecma262/#sec-weakmap-iterable
2021-10-20 21:16:30 +01:00
ThrowCompletionOr < Object * > WeakMapConstructor : : construct ( FunctionObject & new_target )
2021-06-12 05:28:30 +03:00
{
auto & vm = this - > vm ( ) ;
2021-06-20 01:09:39 +01:00
2022-12-14 18:34:32 +00:00
auto weak_map = TRY ( ordinary_create_from_constructor < WeakMap > ( vm , new_target , & Intrinsics : : weak_map_prototype ) ) ;
2021-06-20 01:09:39 +01:00
2021-06-12 05:28:30 +03:00
if ( vm . argument ( 0 ) . is_nullish ( ) )
2022-12-14 18:34:32 +00:00
return weak_map . ptr ( ) ;
2021-06-12 05:28:30 +03:00
2021-10-20 21:16:30 +01:00
auto adder = TRY ( weak_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 WeakMap " ) ;
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 ( ) )
2022-12-04 18:02:33 +00:00
return vm . throw_completion < TypeError > ( ErrorType : : NotAnObject , DeprecatedString : : formatted ( " Iterator value {} " , 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 ( ) , weak_map , key , value ) ) ;
2021-10-20 12:10:23 -04:00
2021-06-12 05:28:30 +03:00
return { } ;
2021-10-20 12:10:23 -04:00
} ) ) ;
2022-12-14 18:34:32 +00:00
return weak_map . ptr ( ) ;
2021-06-12 05:28:30 +03:00
}
}