diff options
author | Sverker Eriksson <[email protected]> | 2013-01-24 19:24:14 +0100 |
---|---|---|
committer | Sverker Eriksson <[email protected]> | 2013-01-25 15:37:42 +0100 |
commit | 6c61689ae326587dfc9bcebd0fc6d6fa40dfd1fb (patch) | |
tree | d54a3544827292c0a15a777eb392e665a4ca74ca /erts/emulator/beam/external.c | |
parent | 120d84e2eb38a98ff2c187c27ac53b49cc9e863a (diff) | |
download | otp-6c61689ae326587dfc9bcebd0fc6d6fa40dfd1fb.tar.gz otp-6c61689ae326587dfc9bcebd0fc6d6fa40dfd1fb.tar.bz2 otp-6c61689ae326587dfc9bcebd0fc6d6fa40dfd1fb.zip |
erts: Optimize atom encoding to use memcpy for pure ascii
Diffstat (limited to 'erts/emulator/beam/external.c')
-rw-r--r-- | erts/emulator/beam/external.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/erts/emulator/beam/external.c b/erts/emulator/beam/external.c index 70d4535770..f63e922269 100644 --- a/erts/emulator/beam/external.c +++ b/erts/emulator/beam/external.c @@ -1455,8 +1455,8 @@ enc_atom(ErtsAtomCacheMap *acmp, Eterm atom, byte *ep, Uint32 dflags) iix = get_iix_acache_map(acmp, atom, dflags); if (iix < 0) { Atom *a = atom_tab(atom_val(atom)); + len = a->len; if (utf8_atoms || a->latin1_chars < 0) { - len = a->len; if (len > 255) { *ep++ = ATOM_UTF8_EXT; put_int16(len, ep); @@ -1472,15 +1472,25 @@ enc_atom(ErtsAtomCacheMap *acmp, Eterm atom, byte *ep, Uint32 dflags) else { if (a->latin1_chars <= 255 && (dflags & DFLAG_SMALL_ATOM_TAGS)) { *ep++ = SMALL_ATOM_EXT; - len = erts_utf8_to_latin1(ep+1, a->name, a->len); - ASSERT(len == a->latin1_chars); + if (len == a->latin1_chars) { + sys_memcpy(ep+1, a->name, len); + } + else { + len = erts_utf8_to_latin1(ep+1, a->name, len); + ASSERT(len == a->latin1_chars); + } put_int8(len, ep); ep++; } else { *ep++ = ATOM_EXT; - len = erts_utf8_to_latin1(ep+2, a->name, a->len); - ASSERT(len == a->latin1_chars); + if (len == a->latin1_chars) { + sys_memcpy(ep+2, a->name, len); + } + else { + len = erts_utf8_to_latin1(ep+2, a->name, len); + ASSERT(len == a->latin1_chars); + } put_int16(len, ep); ep += 2; } |