Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(201)

Unified Diff: fpdfsdk/src/javascript/global.cpp

Issue 792043005: Remove run-time calculation of hash constants in pdfium. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: fpdfsdk/src/javascript/global.cpp
diff --git a/fpdfsdk/src/javascript/global.cpp b/fpdfsdk/src/javascript/global.cpp
index 04f9ef9da37938666db05320615de5e1b4bbad3b..85eb3619b84ff65534f9168e500cb39a0b11346d 100644
--- a/fpdfsdk/src/javascript/global.cpp
+++ b/fpdfsdk/src/javascript/global.cpp
@@ -16,14 +16,71 @@
/* ---------------------------- 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<const wchar_t A = 0, const wchar_t B = 0, const wchar_t C = 0,
Tom Sepez 2015/01/02 17:59:08 Do we allow variadic templates from c++11x? Does
brucedawson 2015/01/02 19:56:17 We do allow variadic templates, they are used in b
+ const wchar_t D = 0, const wchar_t E = 0, const wchar_t F = 0,
+ const wchar_t G = 0, const wchar_t H = 0, const wchar_t I = 0>
+struct cHash
Tom Sepez 2015/01/02 17:59:08 Nit: struct/class name should start with uppercase
brucedawson 2015/01/02 19:56:17 Yep.
+{
+ template<const wchar_t X, unsigned hash = 0>
+ struct HashCalc
+ {
+ enum : unsigned { value = (X == 0)
Tom Sepez 2015/01/02 17:59:08 can we do this with static const int value instead
brucedawson 2015/01/02 19:56:17 Yes, static const int is cleaner.
+ ? hash
+ : (hash * 1313llu + X) & 0xFFFFFFFF };
+ };
+
+ enum { value = HashCalc<I,HashCalc<H,HashCalc<G,HashCalc<F,HashCalc<E,
+ HashCalc<D,HashCalc<C,HashCalc<B,HashCalc<A>::value>::value>::value
+ >::value>::value>::value>::value>::value>::value };
+};
+
+extern const unsigned int JSCONST_nStringHash =
+ cHash<'s','t','r','i','n','g'>::value;
+extern const unsigned int JSCONST_nNumberHash =
+ cHash<'n','u','m','b','e','r'>::value;
+extern const unsigned int JSCONST_nBoolHash =
+ cHash<'b','o','o','l','e','a','n'>::value;
+extern const unsigned int JSCONST_nDateHash =
+ cHash<'d','a','t','e'>::value;
+extern const unsigned int JSCONST_nObjectHash =
+ cHash<'o','b','j','e','c','t'>::value;
+extern const unsigned int JSCONST_nFXobjHash =
+ cHash<'f','x','o','b','j'>::value;
+extern const unsigned int JSCONST_nNullHash =
+ cHash<'n','u','l','l'>::value;
+extern const unsigned int JSCONST_nUndefHash =
+ cHash<'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()
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698