JITRecyclableObject.h 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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. class JITRecyclableObject
  7. {
  8. private:
  9. intptr_t remoteVTable;
  10. Js::TypeId * typeId;
  11. public:
  12. static bool Is(Js::Var var)
  13. {
  14. return !Js::TaggedNumber::Is(var);
  15. }
  16. Js::TypeId GetTypeId() const
  17. {
  18. return *typeId;
  19. }
  20. };
  21. class JITJavascriptString : JITRecyclableObject
  22. {
  23. private:
  24. const char16* m_pszValue;
  25. charcount_t m_charLength;
  26. public:
  27. const char16* GetString() const
  28. {
  29. return m_pszValue;
  30. }
  31. charcount_t GetLength() const
  32. {
  33. return m_charLength;
  34. }
  35. static bool Equals(JITJavascriptString* aLeft, JITJavascriptString* aRight)
  36. {
  37. return Js::JavascriptStringHelpers<JITJavascriptString>::Equals(aLeft, aRight);
  38. }
  39. static bool Is(Js::Var var)
  40. {
  41. if (!JITRecyclableObject::Is(var))
  42. {
  43. return false;
  44. }
  45. JITRecyclableObject * jitObj = reinterpret_cast<JITRecyclableObject*>(var);
  46. return jitObj->GetTypeId() == Js::TypeIds_String;
  47. }
  48. static JITJavascriptString * FromVar(Js::Var var)
  49. {
  50. Assert(offsetof(JITJavascriptString, m_pszValue) == Js::JavascriptString::GetOffsetOfpszValue());
  51. Assert(offsetof(JITJavascriptString, m_charLength) == Js::JavascriptString::GetOffsetOfcharLength());
  52. AssertOrFailFast(Is(var));
  53. return reinterpret_cast<JITJavascriptString*>(var);
  54. }
  55. static JITJavascriptString * UnsafeFromVar(Js::Var var)
  56. {
  57. Assert(offsetof(JITJavascriptString, m_pszValue) == Js::JavascriptString::GetOffsetOfpszValue());
  58. Assert(offsetof(JITJavascriptString, m_charLength) == Js::JavascriptString::GetOffsetOfcharLength());
  59. Assert(Is(var));
  60. return reinterpret_cast<JITJavascriptString*>(var);
  61. }
  62. };
  63. class JITJavascriptNumber : JITRecyclableObject
  64. {
  65. private:
  66. double value;
  67. };
  68. template <>
  69. struct DefaultComparer<JITJavascriptString*>
  70. {
  71. inline static bool Equals(JITJavascriptString * x, JITJavascriptString * y)
  72. {
  73. return Js::JavascriptStringHelpers<JITJavascriptString>::Equals(x, y);
  74. }
  75. inline static uint GetHashCode(JITJavascriptString * pStr)
  76. {
  77. return JsUtil::CharacterBuffer<char16>::StaticGetHashCode(pStr->GetString(), pStr->GetLength());
  78. }
  79. };