mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 15:32:46 +00:00 
			
		
		
		
	 f816a24b86
			
		
	
	
		f816a24b86
		
	
	
	
	
		
			
			This proposal has been merged into the main ECMA-402 spec. See:
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);
 | |
| }
 | |
| 
 | |
| }
 |