summaryrefslogtreecommitdiff
path: root/byterun/weak.c
diff options
context:
space:
mode:
Diffstat (limited to 'byterun/weak.c')
-rw-r--r--byterun/weak.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/byterun/weak.c b/byterun/weak.c
index efd23c465d..0cea2a6dc3 100644
--- a/byterun/weak.c
+++ b/byterun/weak.c
@@ -19,6 +19,7 @@
#include "alloc.h"
#include "fail.h"
+#include "major_gc.h"
#include "memory.h"
#include "mlvalues.h"
@@ -113,7 +114,11 @@ CAMLprim value caml_weak_get_copy (value ar, value n)
if (Tag_val (v) < No_scan_tag){
mlsize_t i;
for (i = 0; i < Wosize_val (v); i++){
- Modify (&Field (elt, i), Field (v, i));
+ value f = Field (v, i);
+ if (caml_gc_phase == Phase_mark && Is_block (f) && Is_in_heap (f)){
+ caml_darken (f, NULL);
+ }
+ Modify (&Field (elt, i), f);
}
}else{
memmove (Bp_val (elt), Bp_val (v), Bosize_val (v));