chakrartinterface.cpp 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  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 "StdAfx.h"
  6. LPCWSTR chakraDllName = L"chakracore.dll";
  7. bool ChakraRTInterface::m_testHooksSetup = false;
  8. bool ChakraRTInterface::m_testHooksInitialized = false;
  9. bool ChakraRTInterface::m_usageStringPrinted = false;
  10. ChakraRTInterface::ArgInfo ChakraRTInterface::m_argInfo = { 0 };
  11. TestHooks ChakraRTInterface::m_testHooks = { 0 };
  12. JsAPIHooks ChakraRTInterface::m_jsApiHooks = { 0 };
  13. /*static*/
  14. HINSTANCE ChakraRTInterface::LoadChakraDll(ArgInfo& argInfo)
  15. {
  16. m_argInfo = argInfo;
  17. wchar_t filename[_MAX_PATH];
  18. wchar_t drive[_MAX_DRIVE];
  19. wchar_t dir[_MAX_DIR];
  20. wchar_t modulename[_MAX_PATH];
  21. GetModuleFileName(NULL, modulename, _MAX_PATH);
  22. _wsplitpath_s(modulename, drive, _MAX_DRIVE, dir, _MAX_DIR, nullptr, 0, nullptr, 0);
  23. _wmakepath_s(filename, drive, dir, chakraDllName, nullptr);
  24. LPCWSTR dllName = filename;
  25. HINSTANCE library = LoadLibraryEx(dllName, nullptr, 0);
  26. if (library == nullptr)
  27. {
  28. int ret = GetLastError();
  29. fwprintf(stderr, L"FATAL ERROR: Unable to load %ls GetLastError=0x%x\n", chakraDllName, ret);
  30. return nullptr;
  31. }
  32. if (m_usageStringPrinted)
  33. {
  34. UnloadChakraDll(library);
  35. return nullptr;
  36. }
  37. if (!m_testHooksInitialized)
  38. {
  39. fwprintf(stderr, L"The binary %ls is not test enabled, please use %ls from debug/test flavor\n", chakraDllName, chakraDllName);
  40. UnloadChakraDll(library);
  41. return nullptr;
  42. }
  43. m_jsApiHooks.pfJsrtCreateRuntime = (JsAPIHooks::JsrtCreateRuntimePtr)GetProcAddress(library, "JsCreateRuntime");
  44. m_jsApiHooks.pfJsrtCreateContext = (JsAPIHooks::JsrtCreateContextPtr)GetProcAddress(library, "JsCreateContext");
  45. m_jsApiHooks.pfJsrtSetCurrentContext = (JsAPIHooks::JsrtSetCurrentContextPtr)GetProcAddress(library, "JsSetCurrentContext");
  46. m_jsApiHooks.pfJsrtGetCurrentContext = (JsAPIHooks::JsrtGetCurrentContextPtr)GetProcAddress(library, "JsGetCurrentContext");
  47. m_jsApiHooks.pfJsrtDisposeRuntime = (JsAPIHooks::JsrtDisposeRuntimePtr)GetProcAddress(library, "JsDisposeRuntime");
  48. m_jsApiHooks.pfJsrtCreateObject = (JsAPIHooks::JsrtCreateObjectPtr)GetProcAddress(library, "JsCreateObject");
  49. m_jsApiHooks.pfJsrtCreateExternalObject = (JsAPIHooks::JsrtCreateExternalObjectPtr)GetProcAddress(library, "JsCreateExternalObject");
  50. m_jsApiHooks.pfJsrtCreateFunction = (JsAPIHooks::JsrtCreateFunctionPtr)GetProcAddress(library, "JsCreateFunction");
  51. m_jsApiHooks.pfJsrtCreateNameFunction = (JsAPIHooks::JsCreateNamedFunctionPtr)GetProcAddress(library, "JsCreateNamedFunction");
  52. m_jsApiHooks.pfJsrtPointerToString = (JsAPIHooks::JsrtPointerToStringPtr)GetProcAddress(library, "JsPointerToString");
  53. m_jsApiHooks.pfJsrtSetProperty = (JsAPIHooks::JsrtSetPropertyPtr)GetProcAddress(library, "JsSetProperty");
  54. m_jsApiHooks.pfJsrtGetGlobalObject = (JsAPIHooks::JsrtGetGlobalObjectPtr)GetProcAddress(library, "JsGetGlobalObject");
  55. m_jsApiHooks.pfJsrtGetUndefinedValue = (JsAPIHooks::JsrtGetUndefinedValuePtr)GetProcAddress(library, "JsGetUndefinedValue");
  56. m_jsApiHooks.pfJsrtGetTrueValue = (JsAPIHooks::JsrtGetUndefinedValuePtr)GetProcAddress(library, "JsGetTrueValue");
  57. m_jsApiHooks.pfJsrtGetFalseValue = (JsAPIHooks::JsrtGetUndefinedValuePtr)GetProcAddress(library, "JsGetFalseValue");
  58. m_jsApiHooks.pfJsrtConvertValueToString = (JsAPIHooks::JsrtConvertValueToStringPtr)GetProcAddress(library, "JsConvertValueToString");
  59. m_jsApiHooks.pfJsrtConvertValueToNumber = (JsAPIHooks::JsrtConvertValueToNumberPtr)GetProcAddress(library, "JsConvertValueToNumber");
  60. m_jsApiHooks.pfJsrtConvertValueToBoolean = (JsAPIHooks::JsrtConvertValueToBooleanPtr)GetProcAddress(library, "JsConvertValueToBoolean");
  61. m_jsApiHooks.pfJsrtStringToPointer = (JsAPIHooks::JsrtStringToPointerPtr)GetProcAddress(library, "JsStringToPointer");
  62. m_jsApiHooks.pfJsrtBooleanToBool = (JsAPIHooks::JsrtBooleanToBoolPtr)GetProcAddress(library, "JsBooleanToBool");
  63. m_jsApiHooks.pfJsrtGetPropertyIdFromName = (JsAPIHooks::JsrtGetPropertyIdFromNamePtr)GetProcAddress(library, "JsGetPropertyIdFromName");
  64. m_jsApiHooks.pfJsrtGetProperty = (JsAPIHooks::JsrtGetPropertyPtr)GetProcAddress(library, "JsGetProperty");
  65. m_jsApiHooks.pfJsrtHasProperty = (JsAPIHooks::JsrtHasPropertyPtr)GetProcAddress(library, "JsHasProperty");
  66. m_jsApiHooks.pfJsrtRunScript = (JsAPIHooks::JsrtRunScriptPtr)GetProcAddress(library, "JsRunScript");
  67. m_jsApiHooks.pfJsrtCallFunction = (JsAPIHooks::JsrtCallFunctionPtr)GetProcAddress(library, "JsCallFunction");
  68. m_jsApiHooks.pfJsrtNumbertoDouble = (JsAPIHooks::JsrtNumberToDoublePtr)GetProcAddress(library, "JsNumberToDouble");
  69. m_jsApiHooks.pfJsrtNumbertoInt = (JsAPIHooks::JsrtNumberToIntPtr)GetProcAddress(library, "JsNumberToInt");
  70. m_jsApiHooks.pfJsrtDoubleToNumber = (JsAPIHooks::JsrtDoubleToNumberPtr)GetProcAddress(library, "JsDoubleToNumber");
  71. m_jsApiHooks.pfJsrtGetExternalData = (JsAPIHooks::JsrtGetExternalDataPtr)GetProcAddress(library, "JsGetExternalData");
  72. m_jsApiHooks.pfJsrtCreateArray = (JsAPIHooks::JsrtCreateArrayPtr)GetProcAddress(library, "JsCreateArray");
  73. m_jsApiHooks.pfJsrtSetException = (JsAPIHooks::JsrtSetExceptionPtr)GetProcAddress(library, "JsSetException");
  74. m_jsApiHooks.pfJsrtGetAndClearException = (JsAPIHooks::JsrtGetAndClearExceptiopnPtr)GetProcAddress(library, "JsGetAndClearException");
  75. m_jsApiHooks.pfJsrtCreateError = (JsAPIHooks::JsrtCreateErrorPtr)GetProcAddress(library, "JsCreateError");
  76. m_jsApiHooks.pfJsrtGetRuntime = (JsAPIHooks::JsrtGetRuntimePtr)GetProcAddress(library, "JsGetRuntime");
  77. m_jsApiHooks.pfJsrtRelease = (JsAPIHooks::JsrtReleasePtr)GetProcAddress(library, "JsRelease");
  78. m_jsApiHooks.pfJsrtAddRef = (JsAPIHooks::JsrtAddRefPtr)GetProcAddress(library, "JsAddRef");
  79. m_jsApiHooks.pfJsrtGetValueType = (JsAPIHooks::JsrtGetValueType)GetProcAddress(library, "JsGetValueType");
  80. m_jsApiHooks.pfJsrtSetIndexedProperty = (JsAPIHooks::JsrtSetIndexedPropertyPtr)GetProcAddress(library, "JsSetIndexedProperty");
  81. m_jsApiHooks.pfJsrtSerializeScript = (JsAPIHooks::JsrtSerializeScriptPtr)GetProcAddress(library, "JsSerializeScript");
  82. m_jsApiHooks.pfJsrtRunSerializedScript = (JsAPIHooks::JsrtRunSerializedScriptPtr)GetProcAddress(library, "JsRunSerializedScript");
  83. m_jsApiHooks.pfJsrtSetPromiseContinuationCallback = (JsAPIHooks::JsrtSetPromiseContinuationCallbackPtr)GetProcAddress(library, "JsSetPromiseContinuationCallback");
  84. m_jsApiHooks.pfJsrtGetContextOfObject = (JsAPIHooks::JsrtGetContextOfObject)GetProcAddress(library, "JsGetContextOfObject");
  85. return library;
  86. }
  87. /*static*/
  88. void ChakraRTInterface::UnloadChakraDll(HINSTANCE library)
  89. {
  90. Assert(library != nullptr);
  91. FARPROC pDllCanUnloadNow = GetProcAddress(library, "DllCanUnloadNow");
  92. if (pDllCanUnloadNow != nullptr)
  93. {
  94. pDllCanUnloadNow();
  95. }
  96. FreeLibrary(library);
  97. }
  98. /*static*/
  99. HRESULT ChakraRTInterface::ParseConfigFlags()
  100. {
  101. HRESULT hr = S_OK;
  102. if (m_testHooks.pfSetAssertToConsoleFlag)
  103. {
  104. SetAssertToConsoleFlag(true);
  105. }
  106. if (m_testHooks.pfSetConfigFlags)
  107. {
  108. hr = SetConfigFlags(m_argInfo.argc, m_argInfo.argv, &HostConfigFlags::flags);
  109. if (hr != S_OK && !m_usageStringPrinted)
  110. {
  111. m_argInfo.hostPrintUsage();
  112. m_usageStringPrinted = true;
  113. }
  114. }
  115. if (hr == S_OK)
  116. {
  117. Assert(m_argInfo.filename != nullptr);
  118. *(m_argInfo.filename) = nullptr;
  119. Assert(m_testHooks.pfGetFilenameFlag != nullptr);
  120. hr = GetFileNameFlag(m_argInfo.filename);
  121. if (hr != S_OK)
  122. {
  123. wprintf(L"Error: no script file specified.");
  124. m_argInfo.hostPrintUsage();
  125. m_usageStringPrinted = true;
  126. }
  127. }
  128. return S_OK;
  129. }
  130. /*static*/
  131. HRESULT ChakraRTInterface::OnChakraCoreLoaded(TestHooks& testHooks)
  132. {
  133. if (!m_testHooksInitialized)
  134. {
  135. m_testHooks = testHooks;
  136. m_testHooksSetup = true;
  137. m_testHooksInitialized = true;
  138. return ParseConfigFlags();
  139. }
  140. return S_OK;
  141. }