From: Nikolay Sivov nsivov@codeweavers.com
--- dlls/scrrun/dictionary.c | 3 +++ dlls/scrrun/tests/dictionary.c | 8 ++++++++ 2 files changed, 11 insertions(+)
diff --git a/dlls/scrrun/dictionary.c b/dlls/scrrun/dictionary.c index 364d8b52ff6..650874dcf03 100644 --- a/dlls/scrrun/dictionary.c +++ b/dlls/scrrun/dictionary.c @@ -909,6 +909,9 @@ static HRESULT WINAPI dictionary_get_HashVal(IDictionary *iface, VARIANT *key, V case VT_R8|VT_BYREF: case VT_R8: return get_flt_hash(V_VT(key) & VT_BYREF ? *V_R8REF(key) : V_R8(key), &V_I4(hash)); + case VT_EMPTY: + V_I4(hash) = 0; + return S_OK; case VT_INT: case VT_UINT: case VT_I1: diff --git a/dlls/scrrun/tests/dictionary.c b/dlls/scrrun/tests/dictionary.c index a6369b77831..e7d39bc0336 100644 --- a/dlls/scrrun/tests/dictionary.c +++ b/dlls/scrrun/tests/dictionary.c @@ -745,6 +745,14 @@ if (0) { /* crashes on native */ ok(V_VT(&hash) == VT_I4, "got %d\n", V_VT(&hash)); ok(V_I4(&hash) == expected, "got hash %#lx, expected %#lx\n", V_I4(&hash), expected);
+ V_VT(&key) = VT_EMPTY; + V_I4(&key) = 1234; + V_I4(&hash) = 5678; + hr = IDictionary_get_HashVal(dict, &key, &hash); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(V_VT(&hash) == VT_I4, "Unexpected hash type %d.\n", V_VT(&hash)); + ok(V_I4(&hash) == 0, "Unexpected hash value %ld.\n", V_I4(&hash)); + IDictionary_Release(dict); }
From: Nikolay Sivov nsivov@codeweavers.com
--- dlls/scrrun/dictionary.c | 1 + dlls/scrrun/tests/dictionary.c | 8 ++++++++ 2 files changed, 9 insertions(+)
diff --git a/dlls/scrrun/dictionary.c b/dlls/scrrun/dictionary.c index 650874dcf03..f4f1fa701f6 100644 --- a/dlls/scrrun/dictionary.c +++ b/dlls/scrrun/dictionary.c @@ -910,6 +910,7 @@ static HRESULT WINAPI dictionary_get_HashVal(IDictionary *iface, VARIANT *key, V case VT_R8: return get_flt_hash(V_VT(key) & VT_BYREF ? *V_R8REF(key) : V_R8(key), &V_I4(hash)); case VT_EMPTY: + case VT_NULL: V_I4(hash) = 0; return S_OK; case VT_INT: diff --git a/dlls/scrrun/tests/dictionary.c b/dlls/scrrun/tests/dictionary.c index e7d39bc0336..4c103ff25bf 100644 --- a/dlls/scrrun/tests/dictionary.c +++ b/dlls/scrrun/tests/dictionary.c @@ -753,6 +753,14 @@ if (0) { /* crashes on native */ ok(V_VT(&hash) == VT_I4, "Unexpected hash type %d.\n", V_VT(&hash)); ok(V_I4(&hash) == 0, "Unexpected hash value %ld.\n", V_I4(&hash));
+ V_VT(&key) = VT_NULL; + V_I4(&key) = 1234; + V_I4(&hash) = 5678; + hr = IDictionary_get_HashVal(dict, &key, &hash); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(V_VT(&hash) == VT_I4, "Unexpected hash type %d.\n", V_VT(&hash)); + ok(V_I4(&hash) == 0, "Unexpected hash value %ld.\n", V_I4(&hash)); + IDictionary_Release(dict); }
From: Nikolay Sivov nsivov@codeweavers.com
--- dlls/scrrun/dictionary.c | 4 ++++ dlls/scrrun/tests/dictionary.c | 39 ++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+)
diff --git a/dlls/scrrun/dictionary.c b/dlls/scrrun/dictionary.c index f4f1fa701f6..f2f39c82f6f 100644 --- a/dlls/scrrun/dictionary.c +++ b/dlls/scrrun/dictionary.c @@ -188,6 +188,10 @@ static BOOL is_matching_key(const struct dictionary *dict, const struct keyitem_ { return hash == pair->hash && numeric_key_eq(key, &pair->key); } + else if (V_VT(&pair->key) == VT_EMPTY || V_VT(&pair->key) == VT_NULL) + { + return V_VT(&pair->key) == V_VT(key); + } else { WARN("Unexpected key type %#x.\n", V_VT(key)); diff --git a/dlls/scrrun/tests/dictionary.c b/dlls/scrrun/tests/dictionary.c index 4c103ff25bf..ccc4d181793 100644 --- a/dlls/scrrun/tests/dictionary.c +++ b/dlls/scrrun/tests/dictionary.c @@ -1009,6 +1009,45 @@ static void test_Add(void)
VariantClear(&item);
+ /* Empty and null keys. */ + hr = IDictionary_RemoveAll(dict); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + V_VT(&key1) = VT_EMPTY; + V_I4(&key1) = 1; + + V_VT(&item) = VT_BSTR; + V_BSTR(&item) = SysAllocString(L"empty"); + + hr = IDictionary_Add(dict, &key1, &item); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + V_VT(&key2) = VT_EMPTY; + V_I4(&key2) = 2; + + hr = IDictionary_Add(dict, &key2, &item); + ok(hr == CTL_E_KEY_ALREADY_EXISTS, "Unexpected hr %#lx.\n", hr); + + V_VT(&key2) = VT_NULL; + V_I4(&key2) = 2; + + hr = IDictionary_Add(dict, &key2, &item); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IDictionary_RemoveAll(dict); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IDictionary_Add(dict, &key2, &item); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IDictionary_Add(dict, &key2, &item); + ok(hr == CTL_E_KEY_ALREADY_EXISTS, "Unexpected hr %#lx.\n", hr); + + hr = IDictionary_Add(dict, &key1, &item); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + VariantClear(&item); + IDictionary_Release(dict); }
This is does not fix a regression, so can wait until 9.0 is out.