mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 21:22:46 +00:00 
			
		
		
		
	LibJS/JIT: Add builtin for Math.round()
This commit is contained in:
		
							parent
							
								
									c2ff238467
								
							
						
					
					
						commit
						8447544e17
					
				
					 4 changed files with 24 additions and 3 deletions
				
			
		|  | @ -18,6 +18,7 @@ namespace JS::Bytecode { | ||||||
|     O(MathPow, math_pow, Math, pow, 2)       \ |     O(MathPow, math_pow, Math, pow, 2)       \ | ||||||
|     O(MathCeil, math_ceil, Math, ceil, 1)    \ |     O(MathCeil, math_ceil, Math, ceil, 1)    \ | ||||||
|     O(MathFloor, math_floor, Math, floor, 1) \ |     O(MathFloor, math_floor, Math, floor, 1) \ | ||||||
|  |     O(MathRound, math_round, Math, round, 1) \ | ||||||
|     O(MathSqrt, math_sqrt, Math, sqrt, 1) |     O(MathSqrt, math_sqrt, Math, sqrt, 1) | ||||||
| 
 | 
 | ||||||
| enum class Builtin { | enum class Builtin { | ||||||
|  |  | ||||||
|  | @ -2689,6 +2689,19 @@ void Compiler::compile_builtin_math_ceil(Assembler::Label&, Assembler::Label& en | ||||||
|     m_assembler.jump(end); |     m_assembler.jump(end); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static Value cxx_math_round(VM& vm, Value, Value value) | ||||||
|  | { | ||||||
|  |     return TRY_OR_SET_EXCEPTION(MathObject::round_impl(vm, value)); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void Compiler::compile_builtin_math_round(Assembler::Label&, Assembler::Label& end) | ||||||
|  | { | ||||||
|  |     native_call((void*)cxx_math_round); | ||||||
|  |     store_accumulator(RET); | ||||||
|  |     check_exception(); | ||||||
|  |     m_assembler.jump(end); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void Compiler::compile_builtin_math_abs(Assembler::Label& slow_case, Assembler::Label& end) | void Compiler::compile_builtin_math_abs(Assembler::Label& slow_case, Assembler::Label& end) | ||||||
| { | { | ||||||
|     branch_if_int32(ARG2, [&] { |     branch_if_int32(ARG2, [&] { | ||||||
|  |  | ||||||
|  | @ -34,7 +34,7 @@ void MathObject::initialize(Realm& realm) | ||||||
|     define_native_function(realm, vm.names.sqrt, sqrt, 1, attr, Bytecode::Builtin::MathSqrt); |     define_native_function(realm, vm.names.sqrt, sqrt, 1, attr, Bytecode::Builtin::MathSqrt); | ||||||
|     define_native_function(realm, vm.names.floor, floor, 1, attr, Bytecode::Builtin::MathFloor); |     define_native_function(realm, vm.names.floor, floor, 1, attr, Bytecode::Builtin::MathFloor); | ||||||
|     define_native_function(realm, vm.names.ceil, ceil, 1, attr, Bytecode::Builtin::MathCeil); |     define_native_function(realm, vm.names.ceil, ceil, 1, attr, Bytecode::Builtin::MathCeil); | ||||||
|     define_native_function(realm, vm.names.round, round, 1, attr); |     define_native_function(realm, vm.names.round, round, 1, attr, Bytecode::Builtin::MathRound); | ||||||
|     define_native_function(realm, vm.names.max, max, 2, attr); |     define_native_function(realm, vm.names.max, max, 2, attr); | ||||||
|     define_native_function(realm, vm.names.min, min, 2, attr); |     define_native_function(realm, vm.names.min, min, 2, attr); | ||||||
|     define_native_function(realm, vm.names.trunc, trunc, 1, attr); |     define_native_function(realm, vm.names.trunc, trunc, 1, attr); | ||||||
|  | @ -770,10 +770,10 @@ JS_DEFINE_NATIVE_FUNCTION(MathObject::random) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // 21.3.2.28 Math.round ( x ), https://tc39.es/ecma262/#sec-math.round
 | // 21.3.2.28 Math.round ( x ), https://tc39.es/ecma262/#sec-math.round
 | ||||||
| JS_DEFINE_NATIVE_FUNCTION(MathObject::round) | ThrowCompletionOr<Value> MathObject::round_impl(VM& vm, Value x) | ||||||
| { | { | ||||||
|     // 1. Let n be ? ToNumber(x).
 |     // 1. Let n be ? ToNumber(x).
 | ||||||
|     auto number = TRY(vm.argument(0).to_number(vm)); |     auto number = TRY(x.to_number(vm)); | ||||||
| 
 | 
 | ||||||
|     // 2. If n is not finite or n is an integral Number, return n.
 |     // 2. If n is not finite or n is an integral Number, return n.
 | ||||||
|     if (!number.is_finite_number() || number.as_double() == ::trunc(number.as_double())) |     if (!number.is_finite_number() || number.as_double() == ::trunc(number.as_double())) | ||||||
|  | @ -788,6 +788,12 @@ JS_DEFINE_NATIVE_FUNCTION(MathObject::round) | ||||||
|     return Value(integer); |     return Value(integer); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // 21.3.2.28 Math.round ( x ), https://tc39.es/ecma262/#sec-math.round
 | ||||||
|  | JS_DEFINE_NATIVE_FUNCTION(MathObject::round) | ||||||
|  | { | ||||||
|  |     return round_impl(vm, vm.argument(0)); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // 21.3.2.29 Math.sign ( x ), https://tc39.es/ecma262/#sec-math.sign
 | // 21.3.2.29 Math.sign ( x ), https://tc39.es/ecma262/#sec-math.sign
 | ||||||
| JS_DEFINE_NATIVE_FUNCTION(MathObject::sign) | JS_DEFINE_NATIVE_FUNCTION(MathObject::sign) | ||||||
| { | { | ||||||
|  |  | ||||||
|  | @ -23,6 +23,7 @@ public: | ||||||
|     static ThrowCompletionOr<Value> pow_impl(VM&, Value base, Value exponent); |     static ThrowCompletionOr<Value> pow_impl(VM&, Value base, Value exponent); | ||||||
|     static ThrowCompletionOr<Value> floor_impl(VM&, Value); |     static ThrowCompletionOr<Value> floor_impl(VM&, Value); | ||||||
|     static ThrowCompletionOr<Value> ceil_impl(VM&, Value); |     static ThrowCompletionOr<Value> ceil_impl(VM&, Value); | ||||||
|  |     static ThrowCompletionOr<Value> round_impl(VM&, Value); | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     explicit MathObject(Realm&); |     explicit MathObject(Realm&); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Andreas Kling
						Andreas Kling