
#9281: Rewrite `integer-gmp` to use only non-allocating GMP functions --------------------------------------+------------------------------------ Reporter: hvr | Owner: hvr Type: task | Status: new Priority: normal | Milestone: 7.10.1 Component: libraries (other) | Version: Resolution: | Keywords: integer-gmp Operating System: Unknown/Multiple | Architecture: Unknown/Multiple Type of failure: None/Unknown | Difficulty: Unknown Test Case: | Blocked By: Blocking: | Related Tickets: --------------------------------------+------------------------------------ Comment (by hvr): As a brain-dump, here's the new representation I'm working on (which happens to make it trivial to provide a natural number type `Nat`): {{{#!hs type GmpLimb = Word -- actually, 'CULong' type GmpSize = Int -- actually, 'CLong' -- | Type representing /pure/ BigNats -- -- @ByteArray#@ is interpreted as an unboxed array of 'GmpLimb's -- -- Invariants: -- -- - ByteArray#'s size is the exact multiple of non-zero limbs (but never empty) -- - @0@ is represented as a 1-limb (available as 'bnZero') data BigNat = BN# ByteArray# -- | Invariant: 'NatJ#' is used iff value doesn't fit in 'NatS#' data Nat = NatS# {-# UNPACK #-} !GmpLimb | NatJ# {-# UNPACK #-} !BigNat -- | Invariant: 'Jn#'/'Jp#' are used iff value doesn't fit in 'S#' -- -- NB: less than 4 constructors allows pointer-tagging to work data Integer = S# {-# UNPACK #-} !Int | Jn# {-# UNPACK #-} !BigNat -- negative | Jp# {-# UNPACK #-} !BigNat -- positive }}} -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/9281#comment:1 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler