JavascriptBigInt.h 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft. All rights reserved.
  3. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  4. //-------------------------------------------------------------------------------------------------------
  5. #pragma once
  6. namespace Js
  7. {
  8. class JavascriptBigInt sealed : public RecyclableObject
  9. {
  10. private:
  11. Field(digit_t*) m_digits; // digits
  12. Field(digit_t) m_length; // length
  13. Field(digit_t) m_maxLength; // max length without resize
  14. Field(bool) m_isNegative;
  15. static const digit_t InitDigitLength = 2; // Max Digit length
  16. DEFINE_VTABLE_CTOR(JavascriptBigInt, RecyclableObject);
  17. public:
  18. JavascriptBigInt(StaticType * type)
  19. : RecyclableObject(type), m_length(0), m_digits(nullptr), m_isNegative(false), m_maxLength(InitDigitLength)
  20. {
  21. Assert(type->GetTypeId() == TypeIds_BigInt);
  22. }
  23. JavascriptBigInt(const char16 * content, charcount_t cchUseLength, bool isNegative, StaticType * type)
  24. : JavascriptBigInt(type)
  25. {
  26. Assert(type->GetTypeId() == TypeIds_BigInt);
  27. InitFromCharDigits(content, cchUseLength, isNegative);
  28. }
  29. static bool LessThan(Var aLeft, Var aRight);
  30. static bool Equals(Var aLeft, Var aRight);
  31. static Var Increment(Var aRight);
  32. static Var Add(Var aLeft, Var aRight);
  33. static Var Sub(Var aLeft, Var aRight);
  34. static Var Mul(Var aLeft, Var aRight);
  35. static Var Decrement(Var aRight);
  36. static Var Not(Var aRight);
  37. static Var Negate(Var aRight);
  38. inline BOOL isNegative() { return m_isNegative; }
  39. static JavascriptBigInt * CreateZero(ScriptContext * scriptContext);
  40. static JavascriptBigInt * CreateZeroWithLength(digit_t length, ScriptContext * scriptContext);
  41. static JavascriptBigInt * CreateOne(ScriptContext * scriptContext);
  42. static JavascriptBigInt * Create(const char16 * content, charcount_t cchUseLength, bool isNegative, ScriptContext * scriptContext);
  43. virtual RecyclableObject * CloneToScriptContext(ScriptContext* requestContext) override;
  44. class EntryInfo
  45. {
  46. public:
  47. static FunctionInfo NewInstance;
  48. static FunctionInfo ValueOf;
  49. static FunctionInfo ToString;
  50. };
  51. static Var NewInstance(RecyclableObject* function, CallInfo callInfo, ...);
  52. virtual BOOL Equals(Var other, BOOL* value, ScriptContext * requestContext) override;
  53. static digit_t AddDigit(digit_t a, digit_t b, digit_t * carry);
  54. static digit_t SubDigit(digit_t a, digit_t b, digit_t * borrow);
  55. static digit_t MulDigit(digit_t a, digit_t b, digit_t * high);
  56. private:
  57. template <typename EncodedChar>
  58. void InitFromCharDigits(const EncodedChar *prgch, uint32 cch, bool isNegative); // init from char of digits
  59. void MulThenAdd(digit_t luMul, digit_t luAdd);
  60. static bool IsZero(JavascriptBigInt * pbi);
  61. static void AbsoluteIncrement(JavascriptBigInt * pbi);
  62. static void AbsoluteDecrement(JavascriptBigInt * pbi);
  63. static void Increment(JavascriptBigInt * pbi);
  64. static void Decrement(JavascriptBigInt * pbi);
  65. static void Negate(JavascriptBigInt * pbi);
  66. static JavascriptBigInt * Add(JavascriptBigInt * pbi1, JavascriptBigInt * pbi2);
  67. static void AddAbsolute(JavascriptBigInt * pbi1, JavascriptBigInt * pbi2);
  68. static JavascriptBigInt * Sub(JavascriptBigInt * pbi1, JavascriptBigInt * pbi2);
  69. static void SubAbsolute(JavascriptBigInt * pbi1, JavascriptBigInt * pbi2);
  70. static JavascriptBigInt * Mul(JavascriptBigInt * pbi1, JavascriptBigInt * pbi2);
  71. static JavascriptBigInt * MulAbsolute(JavascriptBigInt * pbi1, JavascriptBigInt * pbi2);
  72. int Compare(JavascriptBigInt * pbi);
  73. int CompareAbsolute(JavascriptBigInt * pbi);
  74. static BOOL Equals(JavascriptBigInt* left, Var right, BOOL* value, ScriptContext * requestContext);
  75. void Resize(digit_t length);
  76. static JavascriptBigInt * New(JavascriptBigInt * pbi, ScriptContext * scriptContext);
  77. };
  78. template <> inline bool VarIsImpl<JavascriptBigInt>(RecyclableObject* obj)
  79. {
  80. return JavascriptOperators::GetTypeId(obj) == TypeIds_BigInt;
  81. }
  82. }