mirror of
https://github.com/RGBCube/serenity
synced 2025-07-22 11:07:40 +00:00
LibJS/JIT: Add builtin for Math.pow()
This commit is contained in:
parent
94b634f029
commit
5e976d611e
4 changed files with 25 additions and 4 deletions
|
@ -15,6 +15,7 @@ namespace JS::Bytecode {
|
|||
#define JS_ENUMERATE_BUILTINS(O) \
|
||||
O(MathAbs, math_abs, Math, abs, 1) \
|
||||
O(MathLog, math_log, Math, log, 1) \
|
||||
O(MathPow, math_pow, Math, pow, 2) \
|
||||
O(MathSqrt, math_sqrt, Math, sqrt, 1)
|
||||
|
||||
enum class Builtin {
|
||||
|
|
|
@ -2650,6 +2650,19 @@ void Compiler::compile_builtin_math_sqrt(Assembler::Label&, Assembler::Label& en
|
|||
m_assembler.jump(end);
|
||||
}
|
||||
|
||||
static Value cxx_math_pow(VM& vm, Value, Value base, Value exponent)
|
||||
{
|
||||
return TRY_OR_SET_EXCEPTION(MathObject::pow_impl(vm, base, exponent));
|
||||
}
|
||||
|
||||
void Compiler::compile_builtin_math_pow(Assembler::Label&, Assembler::Label& end)
|
||||
{
|
||||
native_call((void*)cxx_math_pow);
|
||||
store_accumulator(RET);
|
||||
check_exception();
|
||||
m_assembler.jump(end);
|
||||
}
|
||||
|
||||
void Compiler::compile_builtin_math_abs(Assembler::Label& slow_case, Assembler::Label& end)
|
||||
{
|
||||
branch_if_int32(ARG2, [&] {
|
||||
|
|
|
@ -41,7 +41,7 @@ void MathObject::initialize(Realm& realm)
|
|||
define_native_function(realm, vm.names.sin, sin, 1, attr);
|
||||
define_native_function(realm, vm.names.cos, cos, 1, attr);
|
||||
define_native_function(realm, vm.names.tan, tan, 1, attr);
|
||||
define_native_function(realm, vm.names.pow, pow, 2, attr);
|
||||
define_native_function(realm, vm.names.pow, pow, 2, attr, Bytecode::Builtin::MathPow);
|
||||
define_native_function(realm, vm.names.exp, exp, 1, attr);
|
||||
define_native_function(realm, vm.names.expm1, expm1, 1, attr);
|
||||
define_native_function(realm, vm.names.sign, sign, 1, attr);
|
||||
|
@ -729,18 +729,24 @@ JS_DEFINE_NATIVE_FUNCTION(MathObject::min)
|
|||
}
|
||||
|
||||
// 21.3.2.26 Math.pow ( base, exponent ), https://tc39.es/ecma262/#sec-math.pow
|
||||
JS_DEFINE_NATIVE_FUNCTION(MathObject::pow)
|
||||
ThrowCompletionOr<Value> MathObject::pow_impl(VM& vm, Value base, Value exponent)
|
||||
{
|
||||
// Set base to ? ToNumber(base).
|
||||
auto base = TRY(vm.argument(0).to_number(vm));
|
||||
base = TRY(base.to_number(vm));
|
||||
|
||||
// 2. Set exponent to ? ToNumber(exponent).
|
||||
auto exponent = TRY(vm.argument(1).to_number(vm));
|
||||
exponent = TRY(exponent.to_number(vm));
|
||||
|
||||
// 3. Return Number::exponentiate(base, exponent).
|
||||
return JS::exp(vm, base, exponent);
|
||||
}
|
||||
|
||||
// 21.3.2.26 Math.pow ( base, exponent ), https://tc39.es/ecma262/#sec-math.pow
|
||||
JS_DEFINE_NATIVE_FUNCTION(MathObject::pow)
|
||||
{
|
||||
return pow_impl(vm, vm.argument(0), vm.argument(1));
|
||||
}
|
||||
|
||||
// 21.3.2.27 Math.random ( ), https://tc39.es/ecma262/#sec-math.random
|
||||
JS_DEFINE_NATIVE_FUNCTION(MathObject::random)
|
||||
{
|
||||
|
|
|
@ -20,6 +20,7 @@ public:
|
|||
|
||||
static ThrowCompletionOr<Value> log_impl(VM&, Value);
|
||||
static ThrowCompletionOr<Value> sqrt_impl(VM&, Value);
|
||||
static ThrowCompletionOr<Value> pow_impl(VM&, Value base, Value exponent);
|
||||
|
||||
private:
|
||||
explicit MathObject(Realm&);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue