CharStringCache.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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. #include "RuntimeBasePch.h"
  6. #include "Library/ProfileString.h"
  7. #include "Library/SingleCharString.h"
  8. using namespace Js;
  9. CharStringCache::CharStringCache() : charStringCache(nullptr)
  10. {
  11. ClearArray(charStringCacheA);
  12. }
  13. JavascriptString* CharStringCache::GetStringForCharA(char c)
  14. {
  15. AssertMsg(JavascriptString::IsASCII7BitChar(c), "GetStringForCharA must be called with ASCII 7bit chars only");
  16. PropertyString * str = charStringCacheA[(int)c];
  17. if (str == nullptr)
  18. {
  19. PropertyRecord const * propertyRecord;
  20. char16 wc = c;
  21. JavascriptLibrary * javascriptLibrary = JavascriptLibrary::FromCharStringCache(this);
  22. javascriptLibrary->GetScriptContext()->GetOrAddPropertyRecord(&wc, 1, &propertyRecord);
  23. str = javascriptLibrary->CreatePropertyString(propertyRecord);
  24. charStringCacheA[(int)c] = str;
  25. }
  26. return str;
  27. }
  28. JavascriptString* CharStringCache::GetStringForChar(char16 c)
  29. {
  30. JIT_HELPER_NOT_REENTRANT_NOLOCK_HEADER(GetStringForChar);
  31. #ifdef PROFILE_STRINGS
  32. StringProfiler::RecordSingleCharStringRequest(JavascriptLibrary::FromCharStringCache(this)->GetScriptContext());
  33. #endif
  34. if (JavascriptString::IsASCII7BitChar(c))
  35. {
  36. return GetStringForCharA(JavascriptString::ToASCII7BitChar(c));
  37. }
  38. return GetStringForCharW(c);
  39. JIT_HELPER_END(GetStringForChar);
  40. }
  41. JIT_HELPER_TEMPLATE(GetStringForChar, GetStringForCharCodePoint)
  42. JavascriptString* CharStringCache::GetStringForCharW(char16 c)
  43. {
  44. Assert(!JavascriptString::IsASCII7BitChar(c));
  45. JavascriptString* str;
  46. ScriptContext * scriptContext = JavascriptLibrary::FromCharStringCache(this)->GetScriptContext();
  47. if (!scriptContext->IsClosed())
  48. {
  49. if (charStringCache == nullptr)
  50. {
  51. Recycler * recycler = scriptContext->GetRecycler();
  52. charStringCache = RecyclerNew(recycler, CharStringCacheMap, recycler, 17);
  53. }
  54. if (!charStringCache->TryGetValue(c, &str))
  55. {
  56. str = SingleCharString::New(c, scriptContext);
  57. charStringCache->Add(c, str);
  58. }
  59. }
  60. else
  61. {
  62. str = SingleCharString::New(c, scriptContext);
  63. }
  64. return str;
  65. }
  66. JavascriptString* CharStringCache::GetStringForCharSP(codepoint_t c)
  67. {
  68. Assert(c >= 0x10000);
  69. CompileAssert(sizeof(char16) * 2 == sizeof(codepoint_t));
  70. char16 buffer[2];
  71. Js::NumberUtilities::CodePointAsSurrogatePair(c, buffer, buffer + 1);
  72. JavascriptString* str = JavascriptString::NewCopyBuffer(buffer, 2, JavascriptLibrary::FromCharStringCache(this)->GetScriptContext());
  73. // TODO: perhaps do some sort of cache for supplementary characters
  74. return str;
  75. }