summaryrefslogtreecommitdiffstats
path: root/byterun/obj.c
diff options
context:
space:
mode:
Diffstat (limited to 'byterun/obj.c')
-rw-r--r--byterun/obj.c25
1 files changed, 22 insertions, 3 deletions
diff --git a/byterun/obj.c b/byterun/obj.c
index 73572dceb..f6001fbc3 100644
--- a/byterun/obj.c
+++ b/byterun/obj.c
@@ -49,7 +49,13 @@ CAMLprim value obj_is_block(value arg)
CAMLprim value obj_tag(value arg)
{
- return Val_int(Tag_val(arg));
+ if (Is_long (arg)){
+ return 1000;
+ }else if (Is_young (arg) || Is_in_heap (arg)){
+ return Val_int(Tag_val(arg));
+ }else{
+ return 1001;
+ }
}
CAMLprim value obj_set_tag (value arg, value new_tag)
@@ -140,11 +146,13 @@ CAMLprim value obj_truncate (value v, value newsize)
}
-/* [lazy_is_forward] and [lazy_follow_forward] are used in stdlib/lazy.ml.
+/* The following functions are used in stdlib/lazy.ml.
They are not written in O'Caml because they must be atomic with respect
to the GC.
*/
+/* [lazy_is_forward] is obsolete. Stays here to make bootstrapping
+ easier for patched versions of 3.07. To be removed before 3.08. */
CAMLprim value lazy_is_forward (value v)
{
return Val_bool (Is_block (v) && Tag_val (v) == Forward_tag);
@@ -152,9 +160,20 @@ CAMLprim value lazy_is_forward (value v)
CAMLprim value lazy_follow_forward (value v)
{
- if (Is_block (v) && Tag_val (v) == Forward_tag){
+ if (Is_block (v) && (Is_young (v) || Is_in_heap (v))
+ && Tag_val (v) == Forward_tag){
return Forward_val (v);
}else{
return v;
}
}
+
+CAMLprim value lazy_make_forward (value v)
+{
+ CAMLparam1 (v);
+ CAMLlocal1 (res);
+
+ res = alloc_small (1, Forward_tag);
+ Modify (&Field (res, 0), v);
+ CAMLreturn (res);
+}