From 2a15f985730757fb2a492fe6d96156bf69378b58 Mon Sep 17 00:00:00 2001 From: Lynn Gabbay Date: Sat, 6 Jan 2018 01:51:24 +0800 Subject: [PATCH] fixed issue 162 regarding duplicate keys in objects --- c_src/objects.cc | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/c_src/objects.cc b/c_src/objects.cc index 4ddb049..b389813 100644 --- a/c_src/objects.cc +++ b/c_src/objects.cc @@ -25,6 +25,8 @@ make_object(ErlNifEnv* env, ERL_NIF_TERM pairs, ERL_NIF_TERM* out, ERL_NIF_TERM key; ERL_NIF_TERM val; + std::set seen; + #if MAP_TYPE_PRESENT if(ret_map) { ret = enif_make_new_map(env); @@ -32,16 +34,23 @@ make_object(ErlNifEnv* env, ERL_NIF_TERM pairs, ERL_NIF_TERM* out, if(!enif_get_list_cell(env, pairs, &key, &pairs)) { assert(0 == 1 && "Unbalanced object pairs."); } - if(!enif_make_map_put(env, ret, key, val, &ret)) { + ErlNifBinary bin; + if(!enif_inspect_binary(env, key, &bin)) { return 0; } + std::string skey((char*) bin.data, bin.size); + if(seen.count(skey) == 0) { + seen.insert(skey); + if(!enif_make_map_put(env, ret, key, val, &ret)) { + return 0; + } + } } *out = ret; return 1; } #endif - std::set seen; ret = enif_make_list(env, 0); while(enif_get_list_cell(env, pairs, &val, &pairs)) { if(!enif_get_list_cell(env, pairs, &key, &pairs)) {