X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Fghci%2FByteCodeItbls.lhs;h=730e4dee4d2f93da20b1599da4f896f75d2570cc;hb=87c1c2ff25f844f30c37d77cb9f4feeae9c55d7b;hp=887f637319560b597fa036d7f61ad4c66ed56a8b;hpb=89692d034948e58dd461639897690e2d3ab8cd44;p=ghc-hetmet.git diff --git a/compiler/ghci/ByteCodeItbls.lhs b/compiler/ghci/ByteCodeItbls.lhs index 887f637..730e4de 100644 --- a/compiler/ghci/ByteCodeItbls.lhs +++ b/compiler/ghci/ByteCodeItbls.lhs @@ -22,6 +22,7 @@ import Constants ( mIN_PAYLOAD_SIZE, wORD_SIZE ) import CgHeapery ( mkVirtHeapOffsets ) import FastString ( FastString(..) ) import Util ( lengthIs, listLengthCmp ) +import Outputable import Foreign import Foreign.C @@ -32,7 +33,8 @@ import GHC.Exts ( Int(I#), addr2Int# ) import GHC.Ptr ( Ptr(..) ) import GHC.Prim -import Outputable +import Debug.Trace +import Text.Printf \end{code} %************************************************************************ @@ -48,9 +50,12 @@ itblCode :: ItblPtr -> Ptr () itblCode (ItblPtr ptr) = (castPtr ptr) #ifdef GHCI_TABLES_NEXT_TO_CODE - `plusPtr` (3 * wORD_SIZE) + `plusPtr` conInfoTableSizeB #endif +-- XXX bogus +conInfoTableSizeB = 3 * wORD_SIZE + type ItblEnv = NameEnv (Name, ItblPtr) -- We need the Name in the range so we know which -- elements to filter out when unloading a module @@ -112,7 +117,7 @@ make_constr_itbls cons , code = code #endif } - qNameCString <- newCString $ dataConIdentity dcon + qNameCString <- newArray0 0 $ dataConIdentity dcon let conInfoTbl = StgConInfoTable { conDesc = qNameCString, infoTable = itbl @@ -268,7 +273,7 @@ type HalfWord = Word16 #endif data StgConInfoTable = StgConInfoTable { - conDesc :: CString, + conDesc :: Ptr Word8, infoTable :: StgInfoTable } @@ -279,17 +284,32 @@ instance Storable StgConInfoTable where alignment conInfoTable = SIZEOF_VOID_P peek ptr = runState (castPtr ptr) $ do +#ifdef GHCI_TABLES_NEXT_TO_CODE desc <- load +#endif itbl <- load +#ifndef GHCI_TABLES_NEXT_TO_CODE + desc <- load +#endif return StgConInfoTable - { conDesc = desc + { +#ifdef GHCI_TABLES_NEXT_TO_CODE + conDesc = castPtr $ ptr `plusPtr` conInfoTableSizeB `plusPtr` desc +#else + conDesc = desc +#endif , infoTable = itbl } poke ptr itbl = runState (castPtr ptr) $ do - store (conDesc itbl) +#ifdef GHCI_TABLES_NEXT_TO_CODE + store (conDesc itbl `minusPtr` (ptr `plusPtr` conInfoTableSizeB)) +#endif store (infoTable itbl) +#ifndef GHCI_TABLES_NEXT_TO_CODE + store (conDesc itbl) +#endif data StgInfoTable = StgInfoTable { #ifndef GHCI_TABLES_NEXT_TO_CODE