From 120d84e2eb38a98ff2c187c27ac53b49cc9e863a Mon Sep 17 00:00:00 2001 From: Sverker Eriksson Date: Thu, 24 Jan 2013 19:22:59 +0100 Subject: erts: Refactor erts_atom_get to use ErtsAtomEncoding instead of 'is_latin1' boolean argument. --- erts/emulator/beam/atom.c | 4 ++-- erts/emulator/beam/atom.h | 2 +- erts/emulator/beam/bif.c | 2 +- erts/emulator/beam/erl_nif.c | 6 +++--- erts/emulator/beam/erl_unicode.c | 4 ++-- erts/emulator/beam/external.c | 40 ++++++++++++++++------------------------ 6 files changed, 25 insertions(+), 33 deletions(-) diff --git a/erts/emulator/beam/atom.c b/erts/emulator/beam/atom.c index 82dd320ea9..f2ab3e0559 100644 --- a/erts/emulator/beam/atom.c +++ b/erts/emulator/beam/atom.c @@ -367,7 +367,7 @@ int atom_table_sz(void) } int -erts_atom_get(const char *name, int len, Eterm* ap, int is_latin1) +erts_atom_get(const char *name, int len, Eterm* ap, ErtsAtomEncoding enc) { byte utf8_copy[MAX_ATOM_SZ_FROM_LATIN1]; Atom a; @@ -376,7 +376,7 @@ erts_atom_get(const char *name, int len, Eterm* ap, int is_latin1) a.len = (Sint16) len; a.name = (byte *)name; - if (is_latin1) { + if (enc == ERTS_ATOM_ENC_LATIN1) { latin1_to_utf8(utf8_copy, (const byte**)&a.name, &len); a.len = (Sint16) len; } diff --git a/erts/emulator/beam/atom.h b/erts/emulator/beam/atom.h index f721999a4c..7efa2191ac 100644 --- a/erts/emulator/beam/atom.h +++ b/erts/emulator/beam/atom.h @@ -139,7 +139,7 @@ int atom_static_put(byte*, int); void init_atom_table(void); void atom_info(int, void *); void dump_atoms(int, void *); -int erts_atom_get(const char* name, int len, Eterm* ap, int is_latin1); +int erts_atom_get(const char* name, int len, Eterm* ap, ErtsAtomEncoding enc); void erts_atom_get_text_space_sizes(Uint *reserved, Uint *used); #endif diff --git a/erts/emulator/beam/bif.c b/erts/emulator/beam/bif.c index bde70911a2..97ab3fe809 100644 --- a/erts/emulator/beam/bif.c +++ b/erts/emulator/beam/bif.c @@ -2671,7 +2671,7 @@ BIF_RETTYPE list_to_existing_atom_1(BIF_ALIST_1) } else { Eterm a; - if (erts_atom_get(buf, i, &a, 1)) { + if (erts_atom_get(buf, i, &a, ERTS_ATOM_ENC_LATIN1)) { erts_free(ERTS_ALC_T_TMP, (void *) buf); BIF_RET(a); } else { diff --git a/erts/emulator/beam/erl_nif.c b/erts/emulator/beam/erl_nif.c index fb295c9a8a..30fca40c81 100644 --- a/erts/emulator/beam/erl_nif.c +++ b/erts/emulator/beam/erl_nif.c @@ -984,7 +984,7 @@ int enif_make_existing_atom_len(ErlNifEnv* env, const char* name, size_t len, ERL_NIF_TERM* atom, ErlNifCharEncoding encoding) { ASSERT(encoding == ERL_NIF_LATIN1); - return erts_atom_get(name, len, atom, 1); + return erts_atom_get(name, len, atom, ERTS_ATOM_ENC_LATIN1); } ERL_NIF_TERM enif_make_tuple(ErlNifEnv* env, unsigned cnt, ...) @@ -1653,7 +1653,7 @@ BIF_RETTYPE load_nif_2(BIF_ALIST_2) for (i=0; i < entry->num_of_funcs && ret==am_ok; i++) { BeamInstr** code_pp; ErlNifFunc* f = &entry->funcs[i]; - if (!erts_atom_get(f->name, sys_strlen(f->name), &f_atom, 1) + if (!erts_atom_get(f->name, sys_strlen(f->name), &f_atom, ERTS_ATOM_ENC_LATIN1) || (code_pp = get_func_pp(mod->curr.code, f_atom, f->arity))==NULL) { ret = load_nif_error(BIF_P,bad_lib,"Function not found %T:%s/%u", mod_atom, f->name, f->arity); @@ -1756,7 +1756,7 @@ BIF_RETTYPE load_nif_2(BIF_ALIST_2) for (i=0; i < entry->num_of_funcs; i++) { BeamInstr* code_ptr; - erts_atom_get(entry->funcs[i].name, sys_strlen(entry->funcs[i].name), &f_atom, 1); + erts_atom_get(entry->funcs[i].name, sys_strlen(entry->funcs[i].name), &f_atom, ERTS_ATOM_ENC_LATIN1); code_ptr = *get_func_pp(mod->curr.code, f_atom, entry->funcs[i].arity); if (code_ptr[1] == 0) { diff --git a/erts/emulator/beam/erl_unicode.c b/erts/emulator/beam/erl_unicode.c index 883405d066..0d4d0f40b6 100644 --- a/erts/emulator/beam/erl_unicode.c +++ b/erts/emulator/beam/erl_unicode.c @@ -1905,7 +1905,7 @@ binary_to_atom(Process* proc, Eterm bin, Eterm enc, int must_exist) if (is_non_value(a)) goto badarg; BIF_RET(a); - } else if (erts_atom_get((char *)bytes, bin_size, &a, 1)) { + } else if (erts_atom_get((char *)bytes, bin_size, &a, ERTS_ATOM_ENC_LATIN1)) { erts_free_aligned_binary_bytes(temp_alloc); BIF_RET(a); } else { @@ -1940,7 +1940,7 @@ binary_to_atom(Process* proc, Eterm bin, Eterm enc, int must_exist) ERTS_ATOM_ENC_UTF8, 0); } - else if (!erts_atom_get((char*)bytes, bin_size, &res, 0)) { + else if (!erts_atom_get((char*)bytes, bin_size, &res, ERTS_ATOM_ENC_UTF8)) { goto badarg; } erts_free_aligned_binary_bytes(temp_alloc); diff --git a/erts/emulator/beam/external.c b/erts/emulator/beam/external.c index 8c4d9108d4..70d4535770 100644 --- a/erts/emulator/beam/external.c +++ b/erts/emulator/beam/external.c @@ -1524,7 +1524,8 @@ static byte* dec_atom(ErtsDistExternal *edep, byte* ep, Eterm* objp) { Uint len; - int n, is_latin1; + int n; + ErtsAtomEncoding char_enc; switch (*ep++) { case ATOM_CACHE_REF: @@ -1540,34 +1541,29 @@ dec_atom(ErtsDistExternal *edep, byte* ep, Eterm* objp) case ATOM_EXT: len = get_int16(ep), ep += 2; - is_latin1 = 1; + char_enc = ERTS_ATOM_ENC_LATIN1; goto dec_atom_common; case SMALL_ATOM_EXT: len = get_int8(ep); ep++; - is_latin1 = 1; + char_enc = ERTS_ATOM_ENC_LATIN1; goto dec_atom_common; case ATOM_UTF8_EXT: len = get_int16(ep), ep += 2; - is_latin1 = 0; + char_enc = ERTS_ATOM_ENC_UTF8; goto dec_atom_common; case SMALL_ATOM_UTF8_EXT: len = get_int8(ep), ep++; - is_latin1 = 0; + char_enc = ERTS_ATOM_ENC_UTF8; dec_atom_common: if (edep && (edep->flags & ERTS_DIST_EXT_BTT_SAFE)) { - if (!erts_atom_get((char*)ep, len, objp, is_latin1)) { + if (!erts_atom_get((char*)ep, len, objp, char_enc)) { goto error; } } else { - Eterm atom = erts_atom_put(ep, - len, - (is_latin1 - ? ERTS_ATOM_ENC_LATIN1 - : ERTS_ATOM_ENC_UTF8), - 0); + Eterm atom = erts_atom_put(ep, len, char_enc, 0); if (is_non_value(atom)) goto error; *objp = atom; @@ -2175,7 +2171,8 @@ static byte* dec_term(ErtsDistExternal *edep, Eterm** hpp, byte* ep, ErlOffHeap* off_heap, Eterm* objp) { Eterm* hp_saved = *hpp; - int n, is_latin1; + int n; + ErtsAtomEncoding char_enc; register Eterm* hp = *hpp; /* Please don't take the address of hp */ Eterm* next = objp; @@ -2261,34 +2258,29 @@ dec_term(ErtsDistExternal *edep, Eterm** hpp, byte* ep, ErlOffHeap* off_heap, Et case ATOM_EXT: n = get_int16(ep); ep += 2; - is_latin1 = 1; + char_enc = ERTS_ATOM_ENC_LATIN1; goto dec_term_atom_common; case SMALL_ATOM_EXT: n = get_int8(ep); ep++; - is_latin1 = 1; + char_enc = ERTS_ATOM_ENC_LATIN1; goto dec_term_atom_common; case ATOM_UTF8_EXT: n = get_int16(ep); ep += 2; - is_latin1 = 0; + char_enc = ERTS_ATOM_ENC_UTF8; goto dec_term_atom_common; case SMALL_ATOM_UTF8_EXT: n = get_int8(ep); ep++; - is_latin1 = 0; + char_enc = ERTS_ATOM_ENC_UTF8; dec_term_atom_common: if (edep && (edep->flags & ERTS_DIST_EXT_BTT_SAFE)) { - if (!erts_atom_get((char*)ep, n, objp, is_latin1)) { + if (!erts_atom_get((char*)ep, n, objp, char_enc)) { goto error; } } else { - Eterm atom = erts_atom_put(ep, - n, - (is_latin1 - ? ERTS_ATOM_ENC_LATIN1 - : ERTS_ATOM_ENC_UTF8), - 0); + Eterm atom = erts_atom_put(ep, n, char_enc, 0); if (is_non_value(atom)) goto error; *objp = atom; -- cgit v1.2.3