//------------------------------------------------------------------------------------------------------- // Copyright (C) Microsoft. All rights reserved. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. //------------------------------------------------------------------------------------------------------- #include "ParserPch.h" // PUBLIC ERROR codes // verify HR is as-expected for the Legacy (private) error JSERR_CantExecute C_ASSERT(JSCRIPT_E_CANTEXECUTE != JSERR_CantExecute); // verify the HR value (as MAKE_HRESULT(SEVERITY_ERROR, FACILITY_CONTROL, 0x1393)) C_ASSERT(JSERR_CantExecute == 0x800A1393); // verify HR matches between public SDK and private (.h) files C_ASSERT(JSCRIPT_E_CANTEXECUTE == JSPUBLICERR_CantExecute); // verify the HR value (as MAKE_HRESULT(SEVERITY_ERROR, FACILITY_JSCRIPT, 0x0001)) C_ASSERT(JSPUBLICERR_CantExecute == _HRESULT_TYPEDEF_(0x89020001L)); // /PUBLIC ERROR codes // boundary check - all errNum should be capped to 10,000 (RTERROR_STRINGFORMAT_OFFSET) - except for VBSERR_CantDisplayDate==32812 #define VERIFY_BOUNDARY_ERRNUM(name,errnum) C_ASSERT(name == VBSERR_CantDisplayDate || errnum < RTERROR_STRINGFORMAT_OFFSET); #define RT_ERROR_MSG(name, errnum, str1, str2, jst, errorNumSource) VERIFY_BOUNDARY_ERRNUM(name, errnum) #define RT_PUBLICERROR_MSG(name, errnum, str1, str2, jst, errorNumSource) VERIFY_BOUNDARY_ERRNUM(name, errnum) #include "rterrors.h" #undef RT_PUBLICERROR_MSG #undef RT_ERROR_MSG //------------------------------------------------------------------------------ // xplat: simulate resource strings #ifndef _WIN32 #include struct _ResourceStr { UINT id; const char16* str; }; static _ResourceStr s_resourceStrs[] = { // // Copy from jserr.gen // #define RT_ERROR_MSG(name, errnum, str1, str2, jst, errorNumSource) \ { errnum, _u(str2) }, #define RT_PUBLICERROR_MSG(name, errnum, str1, str2, jst, errorNumSource) \ { errnum + RTERROR_PUBLIC_RESOURCEOFFSET, _u(str2) }, #include #undef RT_PUBLICERROR_MSG #undef RT_ERROR_MSG #define RT_ERROR_MSG(name, errnum, str1, str2, jst, errorNumSource) \ { errnum + RTERROR_STRINGFORMAT_OFFSET, _u(str1) }, #define RT_PUBLICERROR_MSG(name, errnum, str1, str2, jst, errorNumSource) \ { errnum + RTERROR_STRINGFORMAT_OFFSET + RTERROR_PUBLIC_RESOURCEOFFSET, \ _u(str1) }, #include #undef RT_PUBLICERROR_MSG #undef RT_ERROR_MSG #define LSC_ERROR_MSG(errnum, name, str) \ { errnum, _u(str) }, #include #undef LSC_ERROR_MSG { IDS_COMPILATION_ERROR_SOURCE, _u("JavaScript compilation error") }, { IDS_RUNTIME_ERROR_SOURCE, _u("JavaScript runtime error") }, { IDS_UNKNOWN_RUNTIME_ERROR, _u("Unknown runtime error") }, { IDS_INFINITY, _u("Infinity") }, { IDS_MINUSINFINITY, _u("-Infinity") } }; static int compare_ResourceStr(const void* a, const void* b) { UINT id1 = reinterpret_cast(a)->id; UINT id2 = reinterpret_cast(b)->id; return id1 - id2; } static bool s_resourceStrsSorted = false; const char16* LoadResourceStr(UINT id) { if (!s_resourceStrsSorted) { qsort(s_resourceStrs, _countof(s_resourceStrs), sizeof(s_resourceStrs[0]), compare_ResourceStr); s_resourceStrsSorted = true; } _ResourceStr key = { id, nullptr }; const void* p = bsearch(&key, s_resourceStrs, _countof(s_resourceStrs), sizeof(s_resourceStrs[0]), compare_ResourceStr); return p ? reinterpret_cast(p)->str : nullptr; } #endif