aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/hipe/hipe_native_bif.c
diff options
context:
space:
mode:
authorMagnus Lång <[email protected]>2015-10-23 15:31:28 +0200
committerMagnus Lång <[email protected]>2015-11-27 18:18:37 +0100
commitfd21382290333e6cc25728c1b6dd7c211ddfc297 (patch)
treee4a2056c903b510c396923574ab5a885fff3e4bd /erts/emulator/hipe/hipe_native_bif.c
parent6af385b22805cc2e8cee5c0a5f3506361afbe961 (diff)
downloadotp-fd21382290333e6cc25728c1b6dd7c211ddfc297.tar.gz
otp-fd21382290333e6cc25728c1b6dd7c211ddfc297.tar.bz2
otp-fd21382290333e6cc25728c1b6dd7c211ddfc297.zip
hipe: test unit size match in bs_append
This feature was previously missing and expressions such as <<<<1:1>>/binary>> would succeed construction when compiled with HiPE. A primop is_divisible is introduced to handle the case when the unit size is not a power of two.
Diffstat (limited to 'erts/emulator/hipe/hipe_native_bif.c')
-rw-r--r--erts/emulator/hipe/hipe_native_bif.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/erts/emulator/hipe/hipe_native_bif.c b/erts/emulator/hipe/hipe_native_bif.c
index 688378b2fe..119b0b0895 100644
--- a/erts/emulator/hipe/hipe_native_bif.c
+++ b/erts/emulator/hipe/hipe_native_bif.c
@@ -504,6 +504,18 @@ int hipe_bs_validate_unicode_retract(ErlBinMatchBuffer* mb, Eterm arg)
return 1;
}
+BIF_RETTYPE hipe_is_divisible(BIF_ALIST_2)
+{
+ /* Arguments are Eterm-sized unsigned integers */
+ Uint dividend = BIF_ARG_1;
+ Uint divisor = BIF_ARG_2;
+ if (dividend % divisor) {
+ BIF_ERROR(BIF_P, BADARG);
+ } else {
+ return NIL;
+ }
+}
+
/* This is like the loop_rec_fr BEAM instruction
*/
Eterm hipe_check_get_msg(Process *c_p)