aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/beam/beam_bif_load.c
diff options
context:
space:
mode:
authorErlang/OTP <[email protected]>2015-06-25 14:28:43 +0200
committerErlang/OTP <[email protected]>2015-06-25 14:28:43 +0200
commiteb012e5d805c3d921186ceab32dd62374cb49981 (patch)
tree2cbd5f5cecdcd39a02180fd98e26b84a93371b31 /erts/emulator/beam/beam_bif_load.c
parentc1df511623b9a2a98d4d3862ae612c1ca9837da7 (diff)
parent528954b7ec9642f9ec987707352d558f9fd41446 (diff)
downloadotp-eb012e5d805c3d921186ceab32dd62374cb49981.tar.gz
otp-eb012e5d805c3d921186ceab32dd62374cb49981.tar.bz2
otp-eb012e5d805c3d921186ceab32dd62374cb49981.zip
Merge branch 'egil/fix-purge-literals/OTP-12821' into maint-17
* egil/fix-purge-literals/OTP-12821: erts: Fix garbage collect literals in code purge
Diffstat (limited to 'erts/emulator/beam/beam_bif_load.c')
-rw-r--r--erts/emulator/beam/beam_bif_load.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/erts/emulator/beam/beam_bif_load.c b/erts/emulator/beam/beam_bif_load.c
index df1983a83d..ef42bb20d3 100644
--- a/erts/emulator/beam/beam_bif_load.c
+++ b/erts/emulator/beam/beam_bif_load.c
@@ -33,6 +33,7 @@
#include "beam_catches.h"
#include "erl_binary.h"
#include "erl_nif.h"
+#include "erl_bits.h"
#include "erl_thr_progress.h"
static void set_default_trace_pattern(Eterm module);
@@ -940,7 +941,15 @@ any_heap_refs(Eterm* start, Eterm* end, char* mod_start, Uint mod_size)
break;
case TAG_PRIMARY_HEADER:
if (!header_is_transparent(val)) {
- Eterm* new_p = p + thing_arityval(val);
+ Eterm* new_p;
+ if (header_is_bin_matchstate(val)) {
+ ErlBinMatchState *ms = (ErlBinMatchState*) p;
+ ErlBinMatchBuffer *mb = &(ms->mb);
+ if (in_area(EXPAND_POINTER(mb->orig), mod_start, mod_size)) {
+ return 1;
+ }
+ }
+ new_p = p + thing_arityval(val);
ASSERT(start <= new_p && new_p < end);
p = new_p;
}