git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
C++: fix issue with __superclass name mangling
0dc704bAndy Arvanitis
src/Language/PureScript/CodeGen/Cpp.hs+2−2
@@ -28,7 +28,6 @@ module Language.PureScript.CodeGen.Cpp
28 ) where
28 ) where
29
29
30import Prelude.Compat
30import Prelude.Compat
31−
32import Data.Char (isLetter)
31import Data.Char (isLetter)
33import Data.Function (on)
32import Data.Function (on)
34import Data.List
33import Data.List
@@ -138,7 +137,8 @@ moduleToCpp otherOpts env (Module _ mn imps _ foreigns decls) = do
138 -------------------------------------------------------------------------------------------------
137 -------------------------------------------------------------------------------------------------
139 declToCpp _ (_, ident) e@(Abs (_, _, _, Just IsTypeClassConstructor) _ _) =
138 declToCpp _ (_, ident) e@(Abs (_, _, _, Just IsTypeClassConstructor) _ _) =
140 let className = identToCpp ident
139 let className = identToCpp ident
140+ (supers, members) =
141− (supers, members) = span (C.__superclass_ `Text.isPrefixOf`) (identToCpp <$> (fst $ unAbs e []))
141+ span (safeName C.__superclass_ `Text.isPrefixOf`) (identToCpp <$> (fst $ unAbs e []))
142 in return $ CppStruct className [CppEnum Nothing Nothing (sort supers <> members)]
142 in return $ CppStruct className [CppEnum Nothing Nothing (sort supers <> members)]
143 declToCpp vqs (_, ident) (Abs (_, com, ty, _) arg body) = do
143 declToCpp vqs (_, ident) (Abs (_, com, ty, _) arg body) = do
144 fn <-
144 fn <-
src/Language/PureScript/CodeGen/Cpp/Common.hs+16−4
@@ -18,11 +18,12 @@
18
18
19module Language.PureScript.CodeGen.Cpp.Common where
19module Language.PureScript.CodeGen.Cpp.Common where
20
20
21−import Prelude.Compat hiding (all, concatMap, last, init, null)
21+import Prelude.Compat hiding (all, any, concatMap, last, init, map, null)
22
22
23import Data.Char
23import Data.Char
24−import Data.Text hiding (map)
24+import Data.Text hiding (foldl1)
25import Data.Monoid ((<>))
25import Data.Monoid ((<>))
26+import qualified Language.PureScript.Constants as C
26import Language.PureScript.Crash
27import Language.PureScript.Crash
27import Language.PureScript.Names
28import Language.PureScript.Names
28
29
@@ -45,6 +46,10 @@ safeName name
45safeName name
46safeName name
46 | Just ('$', s) <- uncons name
47 | Just ('$', s) <- uncons name
47 , all isDigit s = name
48 , all isDigit s = name
49+safeName name
50+ | C.__superclass_ `isPrefixOf` name
51+ , any (=='.') name
52+ = "$" <> (escaped $ dotsTo '_' name)
48safeName name
53safeName name
49 | "_" `isPrefixOf` name = "$" <> escaped name
54 | "_" `isPrefixOf` name = "$" <> escaped name
50safeName name = escaped name
55safeName name = escaped name
@@ -52,6 +57,9 @@ safeName name = escaped name
52escaped :: Text -> Text
57escaped :: Text -> Text
53escaped = escapeDoubleUnderscores . concatMap identCharToText
58escaped = escapeDoubleUnderscores . concatMap identCharToText
54
59
60+dotsTo :: Char -> Text -> Text
61+dotsTo chr' = map (\c -> if c == '.' then chr' else c)
62+
55-- |
63-- |
56-- C++ actually reserves all identifiers containing double
64-- C++ actually reserves all identifiers containing double
57-- underscores.
65-- underscores.
@@ -235,8 +243,12 @@ normalizedName = unescapeDoubleUnderscores . normalizedName'
235
243
236moduleNameToCpp :: ModuleName -> Text
244moduleNameToCpp :: ModuleName -> Text
237moduleNameToCpp (ModuleName pns) =
245moduleNameToCpp (ModuleName pns) =
238− let name = intercalate "_" (runProperName `map` pns)
239− in if properNameIsCppReserved name then name <> "$" else name
246+ if properNameIsCppReserved name then name <> "$" else name
247+ where
248+ pnames = runProperName <$> pns
249+ name
250+ | foldl1 (||) (any (=='_') <$> pnames) = error "Module names can now contain underscores"
251+ | otherwise = intercalate "_" pnames
240
252
241-- |
253-- |
242-- Checks whether a proper name is reserved in C++11.
254-- Checks whether a proper name is reserved in C++11.
src/Language/PureScript/CodeGen/Cpp/File.hs+2−3
@@ -24,11 +24,10 @@ import Data.Monoid ((<>))
24import Data.Text (Text)
24import Data.Text (Text)
25
25
26import Language.PureScript.CodeGen.Cpp.AST
26import Language.PureScript.CodeGen.Cpp.AST
27+import Language.PureScript.CodeGen.Cpp.Common
27import Language.PureScript.CodeGen.Cpp.Types
28import Language.PureScript.CodeGen.Cpp.Types
28import Language.PureScript.Names
29import Language.PureScript.Names
29
30
30−import qualified Language.PureScript.Pretty.Cpp as P
31−
32---------------------------------------------------------------------------------------------------
31---------------------------------------------------------------------------------------------------
33toHeader :: [Cpp] -> [Cpp]
32toHeader :: [Cpp] -> [Cpp]
34---------------------------------------------------------------------------------------------------
33---------------------------------------------------------------------------------------------------
@@ -171,7 +170,7 @@ fileEnd :: ModuleName -> Text -> [Cpp]
171fileEnd mn suffix = [CppRaw ("#endif // " <> fileModName mn suffix)]
170fileEnd mn suffix = [CppRaw ("#endif // " <> fileModName mn suffix)]
172
171
173fileModName :: ModuleName -> Text -> Text
172fileModName :: ModuleName -> Text -> Text
174−fileModName mn suffix = P.dotsTo '_' (runModuleName mn <> "_" <> suffix)
173+fileModName mn suffix = dotsTo '_' (runModuleName mn <> "_" <> suffix)
175
174
176isMain :: ModuleName -> Bool
175isMain :: ModuleName -> Bool
177isMain (ModuleName [ProperName "Main"]) = True
176isMain (ModuleName [ProperName "Main"]) = True
src/Language/PureScript/Pretty/Cpp.hs−3
@@ -515,9 +515,6 @@ prettyPrintCpp' = A.runKleisli $ runPattern matchValue
515 , [ binary Or " || " ]
515 , [ binary Or " || " ]
516 ]
516 ]
517
517
518−dotsTo :: Char -> Text -> Text
519−dotsTo chr' = T.map (\c -> if c == '.' then chr' else c)
520−
521argstr :: (Text, Maybe CppType) -> Text
518argstr :: (Text, Maybe CppType) -> Text
522argstr (name, Nothing) = argStr name (Auto [])
519argstr (name, Nothing) = argStr name (Auto [])
523argstr (name, Just typ)
520argstr (name, Just typ)