| //------------------------------------------------------------------------------------------------------- |
| // 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 |