Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Page
Library
Module
Module type
Parameter
Class
Class type
Source
multicont.ml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
(* The modules [Deep] and [Shallow] provide a multi-shot semantics for OCaml's regular deep and shallow continuations, respectively. This semantics is achieved by performing a shallow copy of linear continuations on demand (i.e. prior to invocation). *) module Deep = struct open Effect.Deep type ('a, 'b) resumption = ('a, 'b) continuation (* Primitives *) external clone_continuation : ('a, 'b) continuation -> ('a, 'b) continuation = "multicont_clone_continuation" external drop_continuation : ('a, 'b) continuation -> unit = "multicont_drop_continuation" external promote : ('a, 'b) continuation -> ('a, 'b) resumption = "multicont_promote" let promote : ('a, 'b) continuation -> ('a, 'b) resumption = fun k -> let r = promote k in Gc.finalise drop_continuation r; r let resume : ('a, 'b) resumption -> 'a -> 'b = fun r v -> continue (clone_continuation r) v let abort : ('a, 'b) resumption -> exn -> 'b = fun r exn -> discontinue (clone_continuation r) exn let abort_with_backtrace : ('a, 'b) resumption -> exn -> Printexc.raw_backtrace -> 'b = fun r exn bt -> discontinue_with_backtrace (clone_continuation r) exn bt end module Shallow = struct open Effect.Shallow type ('a, 'b) resumption = ('a, 'b) continuation (* Primitives *) external clone_continuation : ('a, 'b) continuation -> ('a, 'b) continuation = "multicont_clone_continuation" external drop_continuation : ('a, 'b) continuation -> unit = "multicont_drop_continuation" external promote : ('a, 'b) continuation -> ('a, 'b) resumption = "multicont_promote" let promote : ('a, 'b) continuation -> ('a, 'b) resumption = fun k -> let r = promote k in Gc.finalise drop_continuation r; r let resume_with : ('c, 'a) resumption -> 'c -> ('a, 'b) handler -> 'b = fun r v h -> continue_with (clone_continuation r) v h let abort_with : ('c, 'a) resumption -> exn -> ('a, 'b) handler -> 'b = fun r exn h -> discontinue_with (clone_continuation r) exn h let abort_with_backtrace : ('c, 'a) resumption -> exn -> Printexc.raw_backtrace -> ('a, 'b) handler -> 'b = fun r exn bt h -> discontinue_with_backtrace (clone_continuation r) exn bt h end