aboutsummaryrefslogtreecommitdiffstats
path: root/erts
diff options
context:
space:
mode:
authorBjörn-Egil Dahlberg <egil@erlang.org>2015-04-14 18:07:05 +0200
committerBjörn-Egil Dahlberg <egil@erlang.org>2015-04-14 18:07:05 +0200
commit647c66952afa9036c060a7685071bb27e01c2151 (patch)
treee2ae74bb2f32564fc746511d61b07134fd634275 /erts
parent0fc485a1b487f0b22daf2178e28b2f3edfdc7919 (diff)
downloadotp-647c66952afa9036c060a7685071bb27e01c2151.tar.gz
otp-647c66952afa9036c060a7685071bb27e01c2151.tar.bz2
otp-647c66952afa9036c060a7685071bb27e01c2151.zip
erts: Use make_small for size terms on flat maps
Diffstat (limited to 'erts')
-rw-r--r--erts/emulator/beam/erl_bif_guard.c27
-rw-r--r--erts/emulator/beam/erl_map.c8
2 files changed, 14 insertions, 21 deletions
diff --git a/erts/emulator/beam/erl_bif_guard.c b/erts/emulator/beam/erl_bif_guard.c
index e7d84ebda1..a5a0c06ad6 100644
--- a/erts/emulator/beam/erl_bif_guard.c
+++ b/erts/emulator/beam/erl_bif_guard.c
@@ -459,25 +459,24 @@ Eterm erts_gc_byte_size_1(Process* p, Eterm* reg, Uint live)
Eterm erts_gc_map_size_1(Process* p, Eterm* reg, Uint live)
{
Eterm arg = reg[live];
- Eterm* hp;
- Uint size;
if (is_flatmap(arg)) {
flatmap_t *mp = (flatmap_t*)flatmap_val(arg);
- size = flatmap_get_size(mp);
+ return make_small(flatmap_get_size(mp));
} else if (is_hashmap(arg)) {
+ Eterm* hp;
+ Uint size;
size = hashmap_size(arg);
- } else {
- BIF_ERROR(p, BADARG);
- }
- if (IS_USMALL(0, size)) {
- return make_small(size);
+ if (IS_USMALL(0, size)) {
+ return make_small(size);
+ }
+ if (ERTS_NEED_GC(p, BIG_UINT_HEAP_SIZE)) {
+ erts_garbage_collect(p, BIG_UINT_HEAP_SIZE, reg, live);
+ }
+ hp = p->htop;
+ p->htop += BIG_UINT_HEAP_SIZE;
+ return uint_to_big(size, hp);
}
- if (ERTS_NEED_GC(p, BIG_UINT_HEAP_SIZE)) {
- erts_garbage_collect(p, BIG_UINT_HEAP_SIZE, reg, live);
- }
- hp = p->htop;
- p->htop += BIG_UINT_HEAP_SIZE;
- return uint_to_big(size, hp);
+ BIF_ERROR(p, BADARG);
}
Eterm erts_gc_abs_1(Process* p, Eterm* reg, Uint live)
diff --git a/erts/emulator/beam/erl_map.c b/erts/emulator/beam/erl_map.c
index 98023bbb47..bbb7d5e5c6 100644
--- a/erts/emulator/beam/erl_map.c
+++ b/erts/emulator/beam/erl_map.c
@@ -102,14 +102,8 @@ static int hxnodecmpkey(hxnode_t* a, hxnode_t* b);
BIF_RETTYPE map_size_1(BIF_ALIST_1) {
if (is_flatmap(BIF_ARG_1)) {
- Eterm *hp;
- Uint hsz = 0;
flatmap_t *mp = (flatmap_t*)flatmap_val(BIF_ARG_1);
- Uint n = flatmap_get_size(mp);
-
- erts_bld_uint(NULL, &hsz, n);
- hp = HAlloc(BIF_P, hsz);
- BIF_RET(erts_bld_uint(&hp, NULL, n));
+ BIF_RET(make_small(flatmap_get_size(mp)));
} else if (is_hashmap(BIF_ARG_1)) {
Eterm *head, *hp, res;
Uint size, hsz=0;