
This proposal has been merged into the main ECMA-402 spec. See: https://github.com/tc39/ecma402/commit/4257160 Note this includes some editorial and normative changes made when the proposal was merged into the main spec, but are not in the proposal spec itself. In particular, the following AOs were changed: PartitionNumberRangePattern (normative) SetNumberFormatDigitOptions (editorial)
59 lines
1.9 KiB
C++
59 lines
1.9 KiB
C++
/*
|
|
* Copyright (c) 2021-2023, Tim Flynn <trflynn89@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#include <LibJS/Runtime/GlobalObject.h>
|
|
#include <LibJS/Runtime/Intl/NumberFormat.h>
|
|
#include <LibJS/Runtime/Intl/NumberFormatFunction.h>
|
|
|
|
namespace JS::Intl {
|
|
|
|
// 15.5.2 Number Format Functions, https://tc39.es/ecma402/#sec-number-format-functions
|
|
NonnullGCPtr<NumberFormatFunction> NumberFormatFunction::create(Realm& realm, NumberFormat& number_format)
|
|
{
|
|
return realm.heap().allocate<NumberFormatFunction>(realm, number_format, *realm.intrinsics().function_prototype()).release_allocated_value_but_fixme_should_propagate_errors();
|
|
}
|
|
|
|
NumberFormatFunction::NumberFormatFunction(NumberFormat& number_format, Object& prototype)
|
|
: NativeFunction(prototype)
|
|
, m_number_format(number_format)
|
|
{
|
|
}
|
|
|
|
ThrowCompletionOr<void> NumberFormatFunction::initialize(Realm& realm)
|
|
{
|
|
auto& vm = this->vm();
|
|
|
|
MUST_OR_THROW_OOM(Base::initialize(realm));
|
|
define_direct_property(vm.names.length, Value(1), Attribute::Configurable);
|
|
define_direct_property(vm.names.name, PrimitiveString::create(vm, String {}), Attribute::Configurable);
|
|
|
|
return {};
|
|
}
|
|
|
|
ThrowCompletionOr<Value> NumberFormatFunction::call()
|
|
{
|
|
auto& vm = this->vm();
|
|
|
|
// 1. Let nf be F.[[NumberFormat]].
|
|
// 2. Assert: Type(nf) is Object and nf has an [[InitializedNumberFormat]] internal slot.
|
|
// 3. If value is not provided, let value be undefined.
|
|
auto value = vm.argument(0);
|
|
|
|
// 4. Let x be ? ToIntlMathematicalValue(value).
|
|
auto mathematical_value = TRY(to_intl_mathematical_value(vm, value));
|
|
|
|
// 5. Return ? FormatNumeric(nf, x).
|
|
auto formatted = TRY(format_numeric(vm, m_number_format, move(mathematical_value)));
|
|
return PrimitiveString::create(vm, move(formatted));
|
|
}
|
|
|
|
void NumberFormatFunction::visit_edges(Cell::Visitor& visitor)
|
|
{
|
|
Base::visit_edges(visitor);
|
|
visitor.visit(m_number_format);
|
|
}
|
|
|
|
}
|