X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=compiler%2Fghci%2FByteCodeLink.lhs;h=b1f7e39aed2e1fc5e805c997b14a7955fa48163e;hp=54dff1d49853f833e4ef395e9efac7d2ec6bc3dc;hb=5289f5d85610f71625a439747a09384876655eb5;hpb=aa9a4f1053d3c554629a2ec25955e7530c95b892 diff --git a/compiler/ghci/ByteCodeLink.lhs b/compiler/ghci/ByteCodeLink.lhs index 54dff1d..b1f7e39 100644 --- a/compiler/ghci/ByteCodeLink.lhs +++ b/compiler/ghci/ByteCodeLink.lhs @@ -4,6 +4,7 @@ ByteCodeLink: Bytecode assembler and linker \begin{code} +{-# LANGUAGE BangPatterns #-} {-# OPTIONS -optc-DNON_POSIX_SOURCE #-} {-# OPTIONS -w #-} @@ -50,6 +51,8 @@ import GHC.Arr ( Array(..) ) import GHC.IOBase ( IO(..) ) import GHC.Ptr ( Ptr(..), castPtr ) import GHC.Base ( writeArray#, RealWorld, Int(..), Word# ) + +import Data.Word \end{code} @@ -117,24 +120,31 @@ linkBCO' ie ce (UnlinkedBCO nm arity insns_barr bitmap literalsSS ptrsSS) let n_literals = sizeSS literalsSS n_ptrs = sizeSS ptrsSS - ptrs_arr <- mkPtrsArray ie ce n_ptrs ptrs + ptrs_arr <- if n_ptrs > 65535 + then panic "linkBCO: >= 64k ptrs" + else mkPtrsArray ie ce (fromIntegral n_ptrs) ptrs let - ptrs_parr = case ptrs_arr of Array _lo _hi _n parr -> parr + !ptrs_parr = case ptrs_arr of Array _lo _hi _n parr -> parr - literals_arr = listArray (0, n_literals-1) linked_literals - :: UArray Int Word - literals_barr = case literals_arr of UArray _lo _hi _n barr -> barr + litRange + | n_literals > 65535 = panic "linkBCO: >= 64k literals" + | n_literals > 0 = (0, fromIntegral n_literals - 1) + | otherwise = (1, 0) + literals_arr :: UArray Word16 Word + literals_arr = listArray litRange linked_literals + !literals_barr = case literals_arr of UArray _lo _hi _n barr -> barr - (I# arity#) = arity + !(I# arity#) = arity newBCO insns_barr literals_barr ptrs_parr arity# bitmap -- we recursively link any sub-BCOs while making the ptrs array -mkPtrsArray :: ItblEnv -> ClosureEnv -> Int -> [BCOPtr] -> IO (Array Int HValue) +mkPtrsArray :: ItblEnv -> ClosureEnv -> Word16 -> [BCOPtr] -> IO (Array Word16 HValue) mkPtrsArray ie ce n_ptrs ptrs = do - marr <- newArray_ (0, n_ptrs-1) + let ptrRange = if n_ptrs > 0 then (0, n_ptrs-1) else (1, 0) + marr <- newArray_ ptrRange let fill (BCOPtrName n) i = do ptr <- lookupName ce n @@ -165,7 +175,7 @@ instance MArray IOArray e IO where unsafeWrite (IOArray marr) i e = stToIO (unsafeWrite marr i e) -- XXX HACK: we should really have a new writeArray# primop that takes a BCO#. -writeArrayBCO :: IOArray Int a -> Int -> BCO# -> IO () +writeArrayBCO :: IOArray Word16 a -> Int -> BCO# -> IO () writeArrayBCO (IOArray (STArray _ _ _ marr#)) (I# i#) bco# = IO $ \s# -> case (unsafeCoerce# writeArray#) marr# i# bco# s# of { s# -> (# s#, () #) } @@ -265,7 +275,7 @@ nameToCLabel n suffix else qual_name where pkgid = modulePackageId mod - mod = nameModule n + mod = ASSERT( isExternalName n ) nameModule n package_part = unpackFS (zEncodeFS (packageIdFS (modulePackageId mod))) module_part = unpackFS (zEncodeFS (moduleNameFS (moduleName mod))) occ_part = unpackFS (zEncodeFS (occNameFS (nameOccName n)))