diff options
author | Björn-Egil Dahlberg <[email protected]> | 2012-12-17 15:39:38 +0100 |
---|---|---|
committer | Björn-Egil Dahlberg <[email protected]> | 2012-12-17 15:39:38 +0100 |
commit | 8f4e7139ba015e765c5c523c578aaad4a8580f51 (patch) | |
tree | 70c7b05e2a48a99b9c88ef4eca224bae6005ac09 /erts/emulator/beam/bif.c | |
parent | 29f9a9ca800e136588861b666fd9ae03214b2c9c (diff) | |
parent | fb5751c105609baa95e668a25a9122e2c0c000bd (diff) | |
download | otp-8f4e7139ba015e765c5c523c578aaad4a8580f51.tar.gz otp-8f4e7139ba015e765c5c523c578aaad4a8580f51.tar.bz2 otp-8f4e7139ba015e765c5c523c578aaad4a8580f51.zip |
Merge branch 'egil/r16/insert_delete_element/OTP-10643'
* egil/r16/insert_delete_element/OTP-10643:
Update preloaded erlang.beam
erts: Document insert_element and delete_element
tests: Update tuple_SUITE for insert and delete
Add insert_element/3 and delete_element/2
Diffstat (limited to 'erts/emulator/beam/bif.c')
-rw-r--r-- | erts/emulator/beam/bif.c | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/erts/emulator/beam/bif.c b/erts/emulator/beam/bif.c index c4ff4fe982..97c8114437 100644 --- a/erts/emulator/beam/bif.c +++ b/erts/emulator/beam/bif.c @@ -2526,6 +2526,78 @@ BIF_RETTYPE append_element_2(BIF_ALIST_2) BIF_RET(res); } +BIF_RETTYPE insert_element_3(BIF_ALIST_3) +{ + Eterm* ptr; + Eterm* hp; + Uint arity; + Eterm res; + Sint ix; + + if (is_not_tuple(BIF_ARG_2) || is_not_small(BIF_ARG_1)) { + BIF_ERROR(BIF_P, BADARG); + } + + ptr = tuple_val(BIF_ARG_2); + arity = arityval(*ptr); + ix = signed_val(BIF_ARG_1); + + if ((ix < 1) || (ix > (arity + 1))) { + BIF_ERROR(BIF_P, BADARG); + } + + hp = HAlloc(BIF_P, arity + 1 + 1); + res = make_tuple(hp); + *hp = make_arityval(arity + 1); + + ix--; + arity -= ix; + + while (ix--) { *++hp = *++ptr; } + + *++hp = BIF_ARG_3; + + while(arity--) { *++hp = *++ptr; } + + BIF_RET(res); +} + +BIF_RETTYPE delete_element_2(BIF_ALIST_3) +{ + Eterm* ptr; + Eterm* hp; + Uint arity; + Eterm res; + Sint ix; + + if (is_not_tuple(BIF_ARG_2) || is_not_small(BIF_ARG_1)) { + BIF_ERROR(BIF_P, BADARG); + } + + ptr = tuple_val(BIF_ARG_2); + arity = arityval(*ptr); + ix = signed_val(BIF_ARG_1); + + if ((ix < 1) || (ix > arity) || (arity == 0)) { + BIF_ERROR(BIF_P, BADARG); + } + + hp = HAlloc(BIF_P, arity + 1 - 1); + res = make_tuple(hp); + *hp = make_arityval(arity - 1); + + ix--; + arity -= ix; + + while (ix--) { *++hp = *++ptr; } + + ++ptr; + + while(arity--) { *++hp = *++ptr; } + + BIF_RET(res); +} + /**********************************************************************/ /* convert an atom to a list of ascii integer */ |