blob: 897246bd4a69366ba9fc8c752c33168a19cd0f28 [file]
//-------------------------------------------------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
//-------------------------------------------------------------------------------------------------------
#pragma once
class UCrtC99MathApis : protected DelayLoadLibrary
{
private:
typedef double (__cdecl FNMathFn)(double);
typedef FNMathFn* PFNMathFn;
PFNMathFn m_pfnlog2;
PFNMathFn m_pfnlog1p;
PFNMathFn m_pfnexpm1;
PFNMathFn m_pfnacosh;
PFNMathFn m_pfnasinh;
PFNMathFn m_pfnatanh;
PFNMathFn m_pfntrunc;
PFNMathFn m_pfncbrt;
public:
static const LPCWSTR LibraryName;
UCrtC99MathApis() : m_pfnlog2(nullptr), m_pfnlog1p(nullptr), m_pfnexpm1(nullptr), m_pfnacosh(nullptr), m_pfnasinh(nullptr), m_pfnatanh(nullptr), m_pfntrunc(nullptr), m_pfncbrt(nullptr) { }
virtual ~UCrtC99MathApis() { }
virtual LPCWSTR GetLibraryName() const override { return LibraryName; }
bool IsAvailable() { Ensure(); return DelayLoadLibrary::IsAvailable(); }
void Ensure();
HMODULE GetHandle() const { return m_hModule; }
double log2 (_In_ double x) { Assert(IsAvailable()); return m_pfnlog2 (x); }
double log1p(_In_ double x) { Assert(IsAvailable()); return m_pfnlog1p(x); }
double expm1(_In_ double x) { Assert(IsAvailable()); return m_pfnexpm1(x); }
double acosh(_In_ double x) { Assert(IsAvailable()); return m_pfnacosh(x); }
double asinh(_In_ double x) { Assert(IsAvailable()); return m_pfnasinh(x); }
double atanh(_In_ double x) { Assert(IsAvailable()); return m_pfnatanh(x); }
double trunc(_In_ double x) { Assert(IsAvailable()); return m_pfntrunc(x); }
double cbrt (_In_ double x) { Assert(IsAvailable()); return m_pfncbrt (x); }
};
namespace Js {
class Math /* TODO: Determine actual object */
{
public:
class EntryInfo
{
public:
static FunctionInfo Abs;
static FunctionInfo Acos;
static FunctionInfo Asin;
static FunctionInfo Atan;
static FunctionInfo Atan2;
static FunctionInfo Ceil;
static FunctionInfo Cos;
static FunctionInfo Exp;
static FunctionInfo Floor;
static FunctionInfo Log;
static FunctionInfo Max;
static FunctionInfo Min;
static FunctionInfo Pow;
static FunctionInfo Random;
static FunctionInfo Round;
static FunctionInfo Sin;
static FunctionInfo Sqrt;
static FunctionInfo Tan;
// ES6 additions
static FunctionInfo Log10;
static FunctionInfo Log2;
static FunctionInfo Log1p;
static FunctionInfo Expm1;
static FunctionInfo Cosh;
static FunctionInfo Sinh;
static FunctionInfo Tanh;
static FunctionInfo Acosh;
static FunctionInfo Asinh;
static FunctionInfo Atanh;
static FunctionInfo Hypot;
static FunctionInfo Trunc;
static FunctionInfo Sign;
static FunctionInfo Cbrt;
static FunctionInfo Imul;
static FunctionInfo Clz32;
static FunctionInfo Fround;
};
static Var Abs(RecyclableObject* function, CallInfo callInfo, ...);
static double Abs(double x);
static Var Acos(RecyclableObject* function, CallInfo callInfo, ...);
static double Acos(double x);
static Var Asin(RecyclableObject* function, CallInfo callInfo, ...);
static double Asin(double x);
static Var Atan(RecyclableObject* function, CallInfo callInfo, ...);
static double Atan(double x);
static Var Atan2( RecyclableObject* function, CallInfo callInfo, ... );
static double Atan2( double x, double y );
static Var Ceil(RecyclableObject* function, CallInfo callInfo, ...);
static Var Cos(RecyclableObject* function, CallInfo callInfo, ...);
static double Cos(double x);
static Var Exp(RecyclableObject* function, CallInfo callInfo, ...);
static double Exp(double x);
static Var Floor(RecyclableObject* function, CallInfo callInfo, ...);
static Var Log(RecyclableObject* function, CallInfo callInfo, ...);
static double Log(double x);
static Var Max(RecyclableObject* function, CallInfo callInfo, ...);
static Var Min(RecyclableObject* function, CallInfo callInfo, ...);
static Var Pow( RecyclableObject* function, CallInfo callInfo, ... );
static double Pow( double x, double y);
static Var Random(RecyclableObject* function, CallInfo callInfo, ...);
static Var Round(RecyclableObject* function, CallInfo callInfo, ...);
static Var Sin(RecyclableObject* function, CallInfo callInfo, ...);
static double Sin(double x);
static Var Sqrt(RecyclableObject* function, CallInfo callInfo, ...);
static Var Tan( RecyclableObject* function, CallInfo callInfo, ... );
static double Tan( double x );
// ES6 Additions
static Var Log10(RecyclableObject* function, CallInfo callInfo, ...);
static double Log10(double x);
static Var Log2(RecyclableObject* function, CallInfo callInfo, ...);
static double Log2(double x, ScriptContext* scriptContext);
static Var Log1p( RecyclableObject* function, CallInfo callInfo, ... );
static Var Expm1(RecyclableObject* function, CallInfo callInfo, ...);
static Var Cosh(RecyclableObject* function, CallInfo callInfo, ...);
static Var Sinh(RecyclableObject* function, CallInfo callInfo, ...);
static Var Tanh(RecyclableObject* function, CallInfo callInfo, ...);
static Var Acosh(RecyclableObject* function, CallInfo callInfo, ...);
static Var Asinh(RecyclableObject* function, CallInfo callInfo, ...);
static Var Atanh(RecyclableObject* function, CallInfo callInfo, ...);
static Var Hypot(RecyclableObject* function, CallInfo callInfo, ...);
static double HypotHelper(Arguments args, ScriptContext* scriptContext);
static Var Trunc(RecyclableObject* function, CallInfo callInfo, ...);
static Var Sign(RecyclableObject* function, CallInfo callInfo, ...);
static Var Cbrt(RecyclableObject* function, CallInfo callInfo, ...);
static Var Imul(RecyclableObject* function, CallInfo callInfo, ...);
static Var Clz32(RecyclableObject* function, CallInfo callInfo, ...);
static Var Fround(RecyclableObject* function, CallInfo callInfo, ...);
static double NonZeroMin(double x1, double x2, double x3);
static const double PI;
static const double E;
static const double LN10;
static const double LN2;
static const double LOG2E;
static const double LOG10E;
static const double SQRT1_2;
static const double SQRT2;
static const double EPSILON;
static const double MAX_SAFE_INTEGER;
static const double MIN_SAFE_INTEGER;
private:
static Var FloorDouble(double d, ScriptContext *scriptContext);
};
} // namespace Js