--- /dev/null
+(* $Id$ *)
+
+(* marked pointers *)
+type 'a optaddr
+
+let optaddr : 'a option -> 'a optaddr =
+ function
+ None -> Obj.magic 0
+ | Some x -> Obj.magic x
+
+(* naked pointers *)
+type optstring
+
+external get_null : unit -> optstring = "ml_get_null"
+let raw_null = get_null ()
+
+let optstring : string option -> optstring =
+ function
+ None -> raw_null
+ | Some x -> Obj.magic x
+
+(* boxed pointers *)
+type boxed
+let boxed_null : boxed = Obj.magic (0, raw_null)
+
+type 'a optboxed
+
+let optboxed : 'a option -> 'a optboxed =
+ function
+ None -> Obj.magic boxed_null
+ | Some obj -> Obj.magic obj
+
+let may_box ~f obj : 'a optboxed =
+ match obj with
+ None -> Obj.magic boxed_null
+ | Some obj -> Obj.magic (f obj : 'a)
+
+(* Exceptions *)
+
+exception Null
+let _ = Callback.register_exception "null_pointer" Null