diff options
author | Björn-Egil Dahlberg <[email protected]> | 2013-02-20 16:33:30 +0100 |
---|---|---|
committer | Björn-Egil Dahlberg <[email protected]> | 2013-02-20 16:33:30 +0100 |
commit | ec25c466c944538af915f44dc5e7d6e84f943617 (patch) | |
tree | bfd38ecd76d92087a20bd0a4fbacdb67a3d00dd6 | |
parent | 47f3fc9c5d19b9606a5b4918624bfb6e94df6c85 (diff) | |
parent | 804bf6eca9a1d20b36bbafddcb7caa1339551f5e (diff) | |
download | otp-ec25c466c944538af915f44dc5e7d6e84f943617.tar.gz otp-ec25c466c944538af915f44dc5e7d6e84f943617.tar.bz2 otp-ec25c466c944538af915f44dc5e7d6e84f943617.zip |
Merge branch 'egil/fix-atom-hash/OTP-10860'
* egil/fix-atom-hash/OTP-10860:
tests: Testing hash values of unicode atoms
erts: Fix atom hash for latin1 characters
tests: Add latin1 chars atom test
-rw-r--r-- | erts/emulator/beam/atom.c | 10 | ||||
-rw-r--r-- | erts/emulator/test/hash_SUITE.erl | 10 |
2 files changed, 19 insertions, 1 deletions
diff --git a/erts/emulator/beam/atom.c b/erts/emulator/beam/atom.c index b69f979397..84d2d5e3ed 100644 --- a/erts/emulator/beam/atom.c +++ b/erts/emulator/beam/atom.c @@ -132,9 +132,17 @@ atom_hash(Atom* obj) byte* p = obj->name; int len = obj->len; HashValue h = 0, g; + byte v; while(len--) { - h = (h << 4) + *p++; + v = *p++; + /* latin1 clutch for r16 */ + if ((v & 0xFE) == 0xC2 && (*p & 0xC0) == 0x80) { + v = (v << 6) | (*p & 0x3F); + p++; len--; + } + /* normal hashpjw follows for v */ + h = (h << 4) + v; if ((g = h & 0xf0000000)) { h ^= (g >> 24); h ^= g; diff --git a/erts/emulator/test/hash_SUITE.erl b/erts/emulator/test/hash_SUITE.erl index 898eae8c15..e34050cd07 100644 --- a/erts/emulator/test/hash_SUITE.erl +++ b/erts/emulator/test/hash_SUITE.erl @@ -1,3 +1,4 @@ +%% -*- coding: utf-8 -*- %% %% %CopyrightBegin% %% @@ -363,6 +364,15 @@ phash2_test() -> %% (cannot use block_hash due to compatibility issues...) {abc,26499}, {abd,26500}, + {'åäö', 62518}, + %% 81 runes as an atom, 'ᚠᚡᚢᚣᚤᚥᚦᚧᚨᚩᚪᚫᚬᚭᚮᚯᚰᚱᚲᚳᚴᚵᚶᚷᚸᚹᚺᚻᚼᚽᚾᚿᛀᛁᛂᛃᛄᛅᛆᛇᛈᛉᛊᛋᛌᛍᛎᛏᛐᛑᛒᛓᛔᛕᛖᛗᛘᛙᛚᛛᛜᛝᛞᛟᛠᛡᛢᛣᛤᛥᛦᛧᛨᛩᛪ᛫᛬᛭ᛮᛯᛰ' + {erlang:binary_to_term(<<131, 118, 0, 243, (unicode:characters_to_binary(lists:seq(5792, 5872)))/binary >>), 241561024}, + %% åäö dynamic + {erlang:binary_to_term(<<131, 118, 0, 6, 195, 165, 195, 164, 195, 182>>),62518}, + %% the atom '゙゚゛゜ゝゞゟ゠ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズ' + {erlang:binary_to_term(<<131, 118, 0, 102, (unicode:characters_to_binary(lists:seq(12441, 12542)))/binary>>), 246053818}, + %% the atom, '😃' + {erlang:binary_to_term(<<131, 118, 0, 4, 240, 159, 152, 131>>), 1026307}, %% small {0,3175731469}, |