Module: wine Branch: master Commit: 4931e6f92bc7e0c229a057ebf2e000f8f5aa1edd URL: http://source.winehq.org/git/wine.git/?a=commit;h=4931e6f92bc7e0c229a057ebf2...
Author: Piotr Caban piotr@codeweavers.com Date: Wed Sep 14 15:34:02 2016 +0200
ucrtbase: Add __std_type_info_hash implementation.
Signed-off-by: Piotr Caban piotr@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
.../api-ms-win-crt-private-l1-1-0.spec | 2 +- dlls/msvcrt/cpp.c | 19 ++++++++++++++ dlls/ucrtbase/tests/cpp.c | 30 ++++++++++++++++++++++ dlls/ucrtbase/ucrtbase.spec | 2 +- dlls/vcruntime140/vcruntime140.spec | 2 +- 5 files changed, 52 insertions(+), 3 deletions(-)
diff --git a/dlls/api-ms-win-crt-private-l1-1-0/api-ms-win-crt-private-l1-1-0.spec b/dlls/api-ms-win-crt-private-l1-1-0/api-ms-win-crt-private-l1-1-0.spec index a007823..e52b904 100644 --- a/dlls/api-ms-win-crt-private-l1-1-0/api-ms-win-crt-private-l1-1-0.spec +++ b/dlls/api-ms-win-crt-private-l1-1-0/api-ms-win-crt-private-l1-1-0.spec @@ -46,7 +46,7 @@ @ cdecl __std_exception_destroy(ptr) ucrtbase.__std_exception_destroy @ cdecl __std_type_info_compare(ptr ptr) ucrtbase.__std_type_info_compare @ cdecl __std_type_info_destroy_list(ptr) ucrtbase.__std_type_info_destroy_list -@ stub __std_type_info_hash +@ cdecl __std_type_info_hash(ptr) ucrtbase.__std_type_info_hash @ cdecl __std_type_info_name(ptr ptr) ucrtbase.__std_type_info_name @ cdecl __unDName(ptr str long ptr ptr long) ucrtbase.__unDName @ cdecl __unDNameEx(ptr str long ptr ptr ptr long) ucrtbase.__unDNameEx diff --git a/dlls/msvcrt/cpp.c b/dlls/msvcrt/cpp.c index 3621f12..0ffe61e 100644 --- a/dlls/msvcrt/cpp.c +++ b/dlls/msvcrt/cpp.c @@ -1588,4 +1588,23 @@ void CDECL MSVCRT_type_info_destroy_list(SLIST_HEADER *header) MSVCRT_free(cur); } } + +/****************************************************************** + * __std_type_info_hash (UCRTBASE.@) + * + * TODO: 64-bit version of the function uses different constants + */ +MSVCRT_size_t CDECL MSVCRT_type_info_hash(const type_info140 *ti) +{ + MSVCRT_size_t hash = 0x811c9dc5; + const char *p; + + TRACE("(%p)->%s\n", ti, ti->mangled); + + for(p = ti->mangled+1; *p; p++) { + hash ^= *p; + hash *= 0x1000193; + } + return hash; +} #endif diff --git a/dlls/ucrtbase/tests/cpp.c b/dlls/ucrtbase/tests/cpp.c index 168cd21..1a01fea 100644 --- a/dlls/ucrtbase/tests/cpp.c +++ b/dlls/ucrtbase/tests/cpp.c @@ -51,6 +51,7 @@ static void (CDECL *p___std_exception_destroy)(__std_exception_data*); static int (CDECL *p___std_type_info_compare)(const type_info140*, const type_info140*); static const char* (CDECL *p___std_type_info_name)(type_info140*, SLIST_HEADER*); static void (CDECL *p___std_type_info_destroy_list)(SLIST_HEADER*); +static size_t (CDECL *p___std_type_info_hash)(type_info140*);
static BOOL init(void) @@ -70,6 +71,7 @@ static BOOL init(void) p___std_type_info_compare = (void*)GetProcAddress(module, "__std_type_info_compare"); p___std_type_info_name = (void*)GetProcAddress(module, "__std_type_info_name"); p___std_type_info_destroy_list = (void*)GetProcAddress(module, "__std_type_info_destroy_list"); + p___std_type_info_hash = (void*)GetProcAddress(module, "__std_type_info_hash"); return TRUE; }
@@ -125,6 +127,7 @@ static void test___std_type_info(void) SLIST_HEADER header; type_info_list *elem; const char *ret; + size_t hash1, hash2; int eq;
@@ -154,6 +157,33 @@ static void test___std_type_info(void)
eq = p___std_type_info_compare(&ti1, &ti3); ok(eq == 0, "__std_type_info_compare(&ti1, &ti3) = %d\n", eq); + + ti1.mangled[0] = 0; + ti1.mangled[1] = 0; + ti1.mangled[2] = 0; + hash1 = p___std_type_info_hash(&ti1); +#ifdef _WIN64 + todo_wine ok(hash1 == 0xcbf29ce44fd0bfc1, "hash = %p\n", (void*)hash1); +#else + ok(hash1 == 0x811c9dc5, "hash = %p\n", (void*)hash1); +#endif + + ti1.mangled[0] = 1; + hash2 = p___std_type_info_hash(&ti1); + ok(hash1 == hash2, "hash1 != hash2 (first char not ignorred)\n"); + + ti1.mangled[1] = 1; + hash1 = p___std_type_info_hash(&ti1); + if(sizeof(void*) == sizeof(int)) + ok(hash1 == 0x40c5b8c, "hash = %p\n", (void*)hash1); + ok(hash1 != hash2, "hash1 == hash2 for different strings\n"); + + ti1.mangled[1] = 2; + hash2 = p___std_type_info_hash(&ti1); + ok(hash1 != hash2, "hash1 == hash2 for different strings\n"); + + hash1 = p___std_type_info_hash(&ti2); + ok(hash1 != hash2, "hash1 == hash2 for different strings\n"); }
START_TEST(cpp) diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index 07eb7e1..f0598ce 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -144,7 +144,7 @@ @ cdecl __std_exception_destroy(ptr) MSVCRT___std_exception_destroy @ cdecl __std_type_info_compare(ptr ptr) MSVCRT_type_info_compare @ cdecl __std_type_info_destroy_list(ptr) MSVCRT_type_info_destroy_list -@ stub __std_type_info_hash +@ cdecl __std_type_info_hash(ptr) MSVCRT_type_info_hash @ cdecl __std_type_info_name(ptr ptr) MSVCRT_type_info_name_list @ cdecl __stdio_common_vfprintf(int64 ptr str ptr ptr) MSVCRT__stdio_common_vfprintf @ stub __stdio_common_vfprintf_p diff --git a/dlls/vcruntime140/vcruntime140.spec b/dlls/vcruntime140/vcruntime140.spec index 8d6c060..ca9368c 100644 --- a/dlls/vcruntime140/vcruntime140.spec +++ b/dlls/vcruntime140/vcruntime140.spec @@ -41,7 +41,7 @@ @ stub __std_terminate @ cdecl __std_type_info_compare(ptr ptr) ucrtbase.__std_type_info_compare @ cdecl __std_type_info_destroy_list(ptr) ucrtbase.__std_type_info_destroy_list -@ stub __std_type_info_hash +@ cdecl __std_type_info_hash(ptr) ucrtbase.__std_type_info_hash @ cdecl __std_type_info_name(ptr ptr) ucrtbase.__std_type_info_name @ cdecl __telemetry_main_invoke_trigger(ptr) @ cdecl __telemetry_main_return_trigger(ptr)