Chromium Code Reviews| Index: fpdfsdk/src/javascript/global.cpp |
| diff --git a/fpdfsdk/src/javascript/global.cpp b/fpdfsdk/src/javascript/global.cpp |
| index 04f9ef9da37938666db05320615de5e1b4bbad3b..66d9815c2f5a1d3f81f8ae8cdfa65ea77a0d97a0 100644 |
| --- a/fpdfsdk/src/javascript/global.cpp |
| +++ b/fpdfsdk/src/javascript/global.cpp |
| @@ -16,14 +16,70 @@ |
| /* ---------------------------- global ---------------------------- */ |
| -extern const unsigned int JSCONST_nStringHash = JS_CalcHash(VALUE_NAME_STRING,wcslen(VALUE_NAME_STRING)); |
| -extern const unsigned int JSCONST_nNumberHash = JS_CalcHash(VALUE_NAME_NUMBER,wcslen(VALUE_NAME_NUMBER)); |
| -extern const unsigned int JSCONST_nBoolHash = JS_CalcHash(VALUE_NAME_BOOLEAN,wcslen(VALUE_NAME_BOOLEAN)); |
| -extern const unsigned int JSCONST_nDateHash = JS_CalcHash(VALUE_NAME_DATE,wcslen(VALUE_NAME_DATE)); |
| -extern const unsigned int JSCONST_nObjectHash = JS_CalcHash(VALUE_NAME_OBJECT,wcslen(VALUE_NAME_OBJECT)); |
| -extern const unsigned int JSCONST_nFXobjHash = JS_CalcHash(VALUE_NAME_FXOBJ,wcslen(VALUE_NAME_FXOBJ)); |
| -extern const unsigned int JSCONST_nNullHash = JS_CalcHash(VALUE_NAME_NULL,wcslen(VALUE_NAME_NULL)); |
| -extern const unsigned int JSCONST_nUndefHash = JS_CalcHash(VALUE_NAME_UNDEFINED,wcslen(VALUE_NAME_UNDEFINED)); |
| +// Helper class for compile-time calculation of hash values in order to |
| +// avoid having global object initializers. |
| +template <unsigned acc, wchar_t... Ns> |
|
Tom Sepez
2015/01/05 21:26:20
Should this be unsigned long long acc?
[nit: ACC i
brucedawson
2015/01/05 21:52:56
ACC looks a bit ugly, but changed for consistency.
|
| +struct CHash {}; |
|
Tom Sepez
2015/01/05 21:26:20
nit: do we need {} here?
brucedawson
2015/01/05 21:52:55
I guess not. Removed.
|
| + |
| +template <wchar_t N> |
|
Tom Sepez
2015/01/05 21:26:20
I think in this case, the argument is <unsinged lo
brucedawson
2015/01/05 21:52:55
The goal is to always pass in unsigned -- making d
|
| +struct CHash<N> { static const unsigned value = N; |
| +}; |
| + |
| +template <unsigned acc, wchar_t N> |
| +struct CHash<acc, N> { |
| + static const unsigned value = (acc * 1313LLU + N) & 0xFFFFFFFF; |
| +}; |
| + |
| +template <unsigned acc, wchar_t N, wchar_t... Ns> |
| +struct CHash<acc, N, Ns...> { |
| + static const unsigned value = CHash<CHash<acc, N>::value, Ns...>::value; |
| +}; |
| + |
| +extern const unsigned int JSCONST_nStringHash = |
| + CHash<0,'s','t','r','i','n','g'>::value; |
|
Tom Sepez
2015/01/05 21:26:20
Maybe use a helper class so that we don't have to
brucedawson
2015/01/05 21:52:55
No need for a helper class -- I just deleted the z
|
| +extern const unsigned int JSCONST_nNumberHash = |
| + CHash<0,'n','u','m','b','e','r'>::value; |
| +extern const unsigned int JSCONST_nBoolHash = |
| + CHash<0,'b','o','o','l','e','a','n'>::value; |
| +extern const unsigned int JSCONST_nDateHash = |
| + CHash<0,'d','a','t','e'>::value; |
| +extern const unsigned int JSCONST_nObjectHash = |
| + CHash<0,'o','b','j','e','c','t'>::value; |
| +extern const unsigned int JSCONST_nFXobjHash = |
| + CHash<0,'f','x','o','b','j'>::value; |
| +extern const unsigned int JSCONST_nNullHash = |
| + CHash<0,'n','u','l','l'>::value; |
| +extern const unsigned int JSCONST_nUndefHash = |
| + CHash<0,'u','n','d','e','f','i','n','e','d'>::value; |
| + |
| +#ifdef _DEBUG |
| +class HashVerify |
| +{ |
| +public: |
| + HashVerify(); |
| +} g_hashVerify; |
| + |
| +HashVerify::HashVerify() |
| +{ |
| + ASSERT(JSCONST_nStringHash == |
| + JS_CalcHash(VALUE_NAME_STRING,wcslen(VALUE_NAME_STRING))); |
| + ASSERT(JSCONST_nNumberHash == |
| + JS_CalcHash(VALUE_NAME_NUMBER,wcslen(VALUE_NAME_NUMBER))); |
| + ASSERT(JSCONST_nBoolHash == |
| + JS_CalcHash(VALUE_NAME_BOOLEAN,wcslen(VALUE_NAME_BOOLEAN))); |
| + ASSERT(JSCONST_nDateHash == |
| + JS_CalcHash(VALUE_NAME_DATE,wcslen(VALUE_NAME_DATE))); |
| + ASSERT(JSCONST_nObjectHash == |
| + JS_CalcHash(VALUE_NAME_OBJECT,wcslen(VALUE_NAME_OBJECT))); |
| + ASSERT(JSCONST_nFXobjHash == |
| + JS_CalcHash(VALUE_NAME_FXOBJ,wcslen(VALUE_NAME_FXOBJ))); |
| + ASSERT(JSCONST_nNullHash == |
| + JS_CalcHash(VALUE_NAME_NULL,wcslen(VALUE_NAME_NULL))); |
| + ASSERT(JSCONST_nUndefHash == |
| + JS_CalcHash(VALUE_NAME_UNDEFINED,wcslen(VALUE_NAME_UNDEFINED))); |
| +} |
| +#endif |
| + |
| BEGIN_JS_STATIC_CONST(CJS_Global) |
| END_JS_STATIC_CONST() |