blob: 278333ed3eca18d0d3984467082dd717b5fb902f [file] [log] [blame]
//-------------------------------------------------------------------------------------------------------
// 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 <rterrors_limits.h>
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 <rterrors.h>
#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 <rterrors.h>
#undef RT_PUBLICERROR_MSG
#undef RT_ERROR_MSG
#define LSC_ERROR_MSG(errnum, name, str) \
{ errnum, _u(str) },
#include <perrors.h>
#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<const _ResourceStr*>(a)->id;
UINT id2 = reinterpret_cast<const _ResourceStr*>(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<const _ResourceStr*>(p)->str : nullptr;
}
#endif