TestHooks.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  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 "Runtime.h"
  6. #include "TestHooks.h"
  7. #ifdef ENABLE_TEST_HOOKS
  8. HRESULT __stdcall SetConfigFlags(__in int argc, __in_ecount(argc) LPWSTR argv[], ICustomConfigFlags* customConfigFlags)
  9. {
  10. CmdLineArgsParser parser(customConfigFlags);
  11. if (parser.Parse(argc, argv) != 0)
  12. {
  13. return E_FAIL;
  14. }
  15. return S_OK;
  16. }
  17. HRESULT __stdcall PrintConfigFlagsUsageString()
  18. {
  19. Js::ConfigFlagsTable::PrintUsageString();
  20. return S_OK;
  21. }
  22. HRESULT __stdcall SetAssertToConsoleFlag(bool flag)
  23. {
  24. #ifdef DBG
  25. AssertsToConsole = flag;
  26. #endif
  27. return S_OK;
  28. }
  29. HRESULT __stdcall SetEnableCheckMemoryLeakOutput(bool flag)
  30. {
  31. #if defined(CHECK_MEMORY_LEAK)
  32. MemoryLeakCheck::SetEnableOutput(flag);
  33. #endif
  34. return S_OK;
  35. }
  36. #if ENABLE_NATIVE_CODEGEN
  37. #ifdef _WIN32
  38. void __stdcall ConnectJITServer(HANDLE processHandle, void* serverSecurityDescriptor, UUID connectionId)
  39. {
  40. JITManager::GetJITManager()->EnableOOPJIT();
  41. ThreadContext::SetJITConnectionInfo(processHandle, serverSecurityDescriptor, connectionId);
  42. }
  43. #endif
  44. #endif
  45. void __stdcall NotifyUnhandledException(PEXCEPTION_POINTERS exceptionInfo)
  46. {
  47. #ifdef GENERATE_DUMP
  48. // We already reported assert at the assert point, don't do it here again
  49. if (exceptionInfo->ExceptionRecord->ExceptionCode != STATUS_ASSERTION_FAILURE)
  50. {
  51. if (Js::Configuration::Global.flags.IsEnabled(Js::DumpOnCrashFlag))
  52. {
  53. Js::Throw::GenerateDump(exceptionInfo, Js::Configuration::Global.flags.DumpOnCrash);
  54. }
  55. }
  56. #endif
  57. }
  58. #define FLAG(type, name, description, defaultValue, ...) FLAG_##type##(name)
  59. #define FLAG_String(name) \
  60. bool IsEnabled##name##Flag() \
  61. { \
  62. return Js::Configuration::Global.flags.IsEnabled(Js::##name##Flag); \
  63. } \
  64. HRESULT __stdcall Get##name##Flag(BSTR *flag) \
  65. { \
  66. *flag = SysAllocString(Js::Configuration::Global.flags.##name##); \
  67. return (*flag == NULL ? E_OUTOFMEMORY : S_OK); \
  68. } \
  69. HRESULT __stdcall Set##name##Flag(BSTR flag) \
  70. { \
  71. Js::Configuration::Global.flags.##name = flag; \
  72. return S_OK; \
  73. }
  74. #define FLAG_Boolean(name) \
  75. bool IsEnabled##name##Flag() \
  76. { \
  77. return Js::Configuration::Global.flags.IsEnabled(Js::##name##Flag); \
  78. } \
  79. HRESULT __stdcall Get##name##Flag(bool *flag) \
  80. { \
  81. *flag = Js::Configuration::Global.flags.##name##; \
  82. return S_OK; \
  83. } \
  84. HRESULT __stdcall Set##name##Flag(bool flag) \
  85. { \
  86. Js::Configuration::Global.flags.##name = flag; \
  87. return S_OK; \
  88. }
  89. #define FLAG_Number(name) \
  90. bool IsEnabled##name##Flag() \
  91. { \
  92. return Js::Configuration::Global.flags.IsEnabled(Js::##name##Flag); \
  93. } \
  94. HRESULT __stdcall Get##name##Flag(int *flag) \
  95. { \
  96. *flag = Js::Configuration::Global.flags.##name##; \
  97. return S_OK; \
  98. } \
  99. HRESULT __stdcall Set##name##Flag(int flag) \
  100. { \
  101. Js::Configuration::Global.flags.##name = flag; \
  102. return S_OK; \
  103. }
  104. // skipping other types
  105. #define FLAG_Phases(name)
  106. #define FLAG_NumberSet(name)
  107. #define FLAG_NumberPairSet(name)
  108. #define FLAG_NumberRange(name)
  109. #include "ConfigFlagsList.h"
  110. #undef FLAG
  111. #undef FLAG_String
  112. #undef FLAG_Boolean
  113. #undef FLAG_Number
  114. #undef FLAG_Phases
  115. #undef FLAG_NumberSet
  116. #undef FLAG_NumberPairSet
  117. #undef FLAG_NumberRange
  118. HRESULT OnChakraCoreLoaded()
  119. {
  120. typedef HRESULT(__stdcall *OnChakraCoreLoadedPtr)(TestHooks &testHooks);
  121. OnChakraCoreLoadedPtr pfChakraCoreLoaded = (OnChakraCoreLoadedPtr)GetProcAddress(GetModuleHandle(NULL), "OnChakraCoreLoadedEntry");
  122. if (pfChakraCoreLoaded == nullptr)
  123. {
  124. return S_OK;
  125. }
  126. TestHooks testHooks =
  127. {
  128. SetConfigFlags,
  129. PrintConfigFlagsUsageString,
  130. SetAssertToConsoleFlag,
  131. SetEnableCheckMemoryLeakOutput,
  132. #define FLAG(type, name, description, defaultValue, ...) FLAG_##type##(name)
  133. #define FLAGINCLUDE(name) \
  134. IsEnabled##name##Flag, \
  135. Get##name##Flag, \
  136. Set##name##Flag,
  137. #define FLAG_String(name) FLAGINCLUDE(name)
  138. #define FLAG_Boolean(name) FLAGINCLUDE(name)
  139. #define FLAG_Number(name) FLAGINCLUDE(name)
  140. #define FLAG_Phases(name)
  141. #define FLAG_NumberSet(name)
  142. #define FLAG_NumberPairSet(name)
  143. #define FLAG_NumberRange(name)
  144. #include "ConfigFlagsList.h"
  145. #undef FLAG
  146. #undef FLAG_String
  147. #undef FLAG_Boolean
  148. #undef FLAG_Number
  149. #undef FLAG_Phases
  150. #undef FLAG_NumberSet
  151. #undef FLAG_NumberPairSet
  152. #undef FLAG_NumberRange
  153. #if ENABLE_NATIVE_CODEGEN && _WIN32
  154. ConnectJITServer,
  155. #endif
  156. NotifyUnhandledException
  157. };
  158. return pfChakraCoreLoaded(testHooks);
  159. }
  160. #endif // ENABLE_TEST_HOOKS