diff options
Diffstat (limited to 'byterun/obj.c')
-rw-r--r-- | byterun/obj.c | 25 |
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); +} |