summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--stdlib/weak.ml2
-rw-r--r--stdlib/weak.mli24
2 files changed, 21 insertions, 5 deletions
diff --git a/stdlib/weak.ml b/stdlib/weak.ml
index 7177f2eb9f..b57cc64cc3 100644
--- a/stdlib/weak.ml
+++ b/stdlib/weak.ml
@@ -24,6 +24,8 @@ external set : 'a t -> int -> 'a option -> unit = "weak_set";;
external get: 'a t -> int -> 'a option = "weak_get";;
+external get_copy: 'a t -> int -> 'a option = "weak_get_copy";;
+
external check: 'a t -> int -> bool = "weak_check";;
let fill ar ofs len x =
diff --git a/stdlib/weak.mli b/stdlib/weak.mli
index 26192608a3..b326dba383 100644
--- a/stdlib/weak.mli
+++ b/stdlib/weak.mli
@@ -16,15 +16,16 @@
type 'a t;;
(* The type of arrays of weak pointers (weak arrays). A weak
- pointer is an object that the garbage collector may erase at
+ pointer is a value that the garbage collector may erase at
any time.
- A weak pointer is said to be full if it points to an object,
- empty if the object was erased by the GC.
+ A weak pointer is said to be full if it points to a value,
+ empty if the value was erased by the GC.
*)
val create : int -> 'a t;;
(* [Weak.create n] returns a new weak array of length [n].
- All the pointers are initially empty.
+ All the pointers are initially empty. Raise [Invalid_argument]
+ if [n] is negative or greater than [Sys.max_array_length-1].
*)
val length : 'a t -> int;;
(* [Weak.length ar] returns the length (number of elements) of
@@ -39,10 +40,23 @@ val set : 'a t -> int -> 'a option -> unit;;
*)
val get : 'a t -> int -> 'a option;;
(* [Weak.get ar n] returns None if the [n]th cell of [ar] is
- empty, [Some x] (where [x] is the object) if it is full.
+ empty, [Some x] (where [x] is the value) if it is full.
Raise [Invalid_argument "Weak.get"] if [n] is not in the range
0 to [Weak.length a - 1].
*)
+
+val get_copy : 'a t -> int -> 'a option;;
+ (* [Weak.get_copy ar n] returns None if the [n]th cell of [ar] is
+ empty, [Some x] (where [x] is a (shallow) copy of the value) if
+ it is full.
+ In addition to pitfalls with mutable values, the interesting
+ difference with [get] is that [get_copy] does not prevent
+ the incremental GC from erasing the value in its current cycle
+ ([get] may delay the erasure to the next GC cycle).
+ Raise [Invalid_argument "Weak.get"] if [n] is not in the range
+ 0 to [Weak.length a - 1].
+ *)
+
val check: 'a t -> int -> bool;;
(* [Weak.check ar n] returns [true] if the [n]th cell of [ar] is
full, [false] if it is empty. Note that even if [Weak.check ar n]