diff options
author | Ian Lynagh <igloo@earth.li> | 2011-04-03 15:23:38 +0100 |
---|---|---|
committer | Ian Lynagh <igloo@earth.li> | 2011-04-03 15:23:38 +0100 |
commit | 9330f8d055e9e1113cecbf4e57b9f6a750fe0291 (patch) | |
tree | 00845bcc38bc18407059694c5f5a6a83de2d27e7 | |
parent | fb659757de8ebe10bb8a2c2ff5e198e365dc7b08 (diff) | |
download | haskell-9330f8d055e9e1113cecbf4e57b9f6a750fe0291.tar.gz |
Fix parsing constructors containing dots; fixes trac #4891
-rw-r--r-- | compiler/ghci/Linker.lhs | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/compiler/ghci/Linker.lhs b/compiler/ghci/Linker.lhs index bd0bb35308..eaf452199e 100644 --- a/compiler/ghci/Linker.lhs +++ b/compiler/ghci/Linker.lhs @@ -245,11 +245,18 @@ dataConInfoPtrToName x = do where (modWords, occWord) = ASSERT (length rest1 > 0) (parseModOcc [] (tail rest1)) parseModOcc :: [[Word8]] -> [Word8] -> ([[Word8]], [Word8]) - parseModOcc acc str + -- We only look for dots if str could start with a module name, + -- i.e. if it starts with an upper case character. + -- Otherwise we might think that "X.:->" is the module name in + -- "X.:->.+", whereas actually "X" is the module name and + -- ":->.+" is a constructor name. + parseModOcc acc str@(c : _) + | isUpper $ chr $ fromIntegral c = case break (== dot) str of (top, []) -> (acc, top) - (top, _:bot) -> parseModOcc (top : acc) bot - + (top, _ : bot) -> parseModOcc (top : acc) bot + parseModOcc acc str = (acc, str) + -- | Get the 'HValue' associated with the given name. -- -- May cause loading the module that contains the name. |