Changing hash function; updating readMix API
authorandy@galois.com <unknown>
Fri, 7 Sep 2007 22:41:03 +0000 (22:41 +0000)
committerandy@galois.com <unknown>
Fri, 7 Sep 2007 22:41:03 +0000 (22:41 +0000)
Trace/Hpc/Mix.hs
Trace/Hpc/Util.hs

index a5c1b5f..554807e 100644 (file)
@@ -30,6 +30,7 @@ import Data.Char
 -- in the list
 
 import Trace.Hpc.Util (HpcPos, insideHpcPos, Hash, HpcHash(..))
+import Trace.Hpc.Tix 
 
 -- | 'Mix' is the information about a modules static properties, like 
 -- location of Tix's in a file.
@@ -83,21 +84,23 @@ mixCreate dirName modName mix =
    writeFile (mixName dirName modName) (show mix)
 
 -- | Read a mix file.
-readMix :: [String] -- ^ Dir Names
-       -> String   -- ^ module Name
+readMix :: [String]   -- ^ Dir Names
+       -> TixModule  -- ^ module wanted
        -> IO Mix
-readMix dirNames modName = do
+readMix dirNames mod = do
+   let modName = tixModuleName mod
    res <- sequence [ (do contents <- readFile (mixName dirName modName)
                         case reads contents of
-                          [(r@Mix {},cs)] | all isSpace cs -> return $ Just r
+                          [(r@(Mix _ _ h _ _),cs)] 
+                               | all isSpace cs 
+                              && h == tixModuleHash mod -> return $ Just r
                           _ -> return $ Nothing) `catch` (\ _ -> return $ Nothing)                     
                   | dirName <- dirNames
                   ] 
    case catMaybes res of
      [r] -> return r
-     xs@(_:_) -> error $ "found " ++ show(length xs) ++ " for " ++ modName ++ " in " ++ show dirNames
-     _        -> error $ "can not find " ++ modName ++ " in " ++ show dirNames
-       
+     xs@(_:_) -> error $ "found " ++ show(length xs) ++ " instances of " ++ modName ++ " in " ++ show dirNames
+     _        -> error $ "can not find " ++ modName ++ " in " ++ show dirNames 
 
 mixName :: FilePath -> String -> String
 mixName dirName name = dirName ++ "/" ++ name ++ ".mix"
index e1885ca..47a9ca0 100644 (file)
@@ -15,6 +15,7 @@ module Trace.Hpc.Util
 
 import Data.List(foldl')
 import Data.Char (ord)
+import Data.Bits (xor)
 import Data.Word 
 
 -- | 'HpcPos' is an Hpc local rendition of a Span. 
@@ -92,12 +93,13 @@ instance HpcHash Bool where
   toHash False = 0
 
 instance HpcHash a => HpcHash [a] where
-  toHash xs = foldl' (\ h c -> toHash c + h * 37) 0 xs
+  toHash xs = foldl' (\ h c -> toHash c `hxor` (h * 33)) 5381 xs
 
 instance (HpcHash a,HpcHash b) => HpcHash (a,b) where
-  toHash (a,b) = toHash a * 37 + toHash b
+  toHash (a,b) = toHash a * 33 `hxor` toHash b
 
 instance HpcHash HpcPos where
   toHash (P a b c d) = Hash $ fromIntegral $ a * 0x1000000 + b * 0x10000 + c * 0x100 + d
 
-
+hxor :: Hash -> Hash -> Hash
+hxor (Hash x) (Hash y) = Hash $ x `xor` y