packages feed

ddc-code-0.4.2.1: salt/runtime64/primitive/Ref.dcs

-- | References to boxed values.
module Runtime.Prim.Ref
export value
 allocRef       : [r1 r2 : Region]. Ptr# r1 Obj -> Ptr# r2 Obj
 readRef        : [r1 r2 : Region]. Ptr# r1 Obj -> Ptr# r2 Obj
 writeRef_      : [r1 r2 : Region]. Ptr# r1 Obj -> Ptr# r2 Obj -> Void#

import value
 allocBoxed     : [r1    : Region]. Tag# -> Nat# -> Ptr# r1 Obj
 getBoxed       : [r1 r2 : Region]. Ptr# r1 Obj  -> Nat# -> Ptr# r2 Obj
 setBoxed       : [r1 r2 : Region]. Ptr# r1 Obj  -> Nat# -> Ptr# r2 Obj -> Void#

with letrec


-- | Allocate a new reference to some boxed value.
allocRef [r1 r2: Region] (val: Ptr# r1 Obj): Ptr# r2 Obj
 = do   ref     = allocBoxed [r2] (truncate# 0#) 1#
        setBoxed ref 0# val
        ref

-- | Read the value from a reference.
readRef  [r1 r2: Region] (ref: Ptr# r1 Obj): Ptr# r2 Obj
 =      getBoxed ref 0#


-- | Write a value into reference.
writeRef_ [r1 r2: Region] (ref: Ptr# r1 Obj) (val: Ptr# r2 Obj): Void#
 =      setBoxed ref 0# val