summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lynagh <igloo@earth.li>2011-04-03 15:23:38 +0100
committerIan Lynagh <igloo@earth.li>2011-04-03 15:23:38 +0100
commit9330f8d055e9e1113cecbf4e57b9f6a750fe0291 (patch)
tree00845bcc38bc18407059694c5f5a6a83de2d27e7
parentfb659757de8ebe10bb8a2c2ff5e198e365dc7b08 (diff)
downloadhaskell-9330f8d055e9e1113cecbf4e57b9f6a750fe0291.tar.gz
Fix parsing constructors containing dots; fixes trac #4891
-rw-r--r--compiler/ghci/Linker.lhs13
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.