git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
C++: fix some issue with new map rendering
d6a5fc9Andy Arvanitis
pcc/include/purescript.cc+12−15
@@ -86,38 +86,35 @@ auto any::unthunkVariant(const any& a) -> const any& {
86 return *variant;
86 return *variant;
87}
87}
88
88
89+static const any invalid_key(nullptr);
90+
89auto any::operator[](const symbol_t key) const -> const any& {
91auto any::operator[](const symbol_t key) const -> const any& {
90− const any& variant = unthunkVariant(*this);
91− assert(variant.type == Type::Map);
92 // TODO: assumes at least one element -- safe assumption?
92 // TODO: assumes at least one element -- safe assumption?
93− const auto m = cast<map<1>>(variant);
93+ const auto& m = cast<map<1>>(*this);
94− decltype(m)::size_type i = 0;
94+ any::map<1>::size_type i = 0;
95 do {
95 do {
96 if (m[i].first == key) {
96 if (m[i].first == key) {
97 return m[i].second;
97 return m[i].second;
98 }
98 }
99 } while (m[++i].first != nullptr);
99 } while (m[++i].first != nullptr);
100− throw runtime_error("map key not found");
100+ assert(false && "map key not found");
101+ return invalid_key;
101}
102}
102
103
103auto any::operator[](const size_t rhs) const -> const any& {
104auto any::operator[](const size_t rhs) const -> const any& {
104− const any& variant = unthunkVariant(*this);
105+ const auto& xs = cast<array>(*this);
105− assert(variant.type == Type::Array);
106− return (*variant.a)[rhs];
106+ return xs[rhs];
107}
107}
108
108
109auto any::operator[](const any& rhs) const -> const any& {
109auto any::operator[](const any& rhs) const -> const any& {
110− const any& variant = unthunkVariant(*this);
110+ const auto& xs = cast<array>(*this);
111− assert(variant.type == Type::Array);
112− return (*variant.a)[cast<int>(rhs)];
111+ return xs[cast<int>(rhs)];
113}
112}
114
113
115auto any::contains(const symbol_t key) const -> bool {
114auto any::contains(const symbol_t key) const -> bool {
116− const any& variant = unthunkVariant(*this);
117− assert(variant.type == Type::Map);
118 // TODO: assumes at least one element -- safe assumption?
115 // TODO: assumes at least one element -- safe assumption?
119− const auto m = cast<map<1>>(variant);
116+ const auto& m = cast<map<1>>(*this);
120− decltype(m)::size_type i = 0;
117+ any::map<1>::size_type i = 0;
121 do {
118 do {
122 if (m[i].first == key) {
119 if (m[i].first == key) {
123 return true;
120 return true;
pcc/include/purescript.hh+1−1
@@ -228,7 +228,7 @@ class any {
228 any(const T& val, typename std::enable_if<std::is_same<T,void*>::value>::type* = 0) noexcept
228 any(const T& val, typename std::enable_if<std::is_same<T,void*>::value>::type* = 0) noexcept
229 : type(Type::RawPointer), u(val) {}
229 : type(Type::RawPointer), u(val) {}
230
230
231− any(std::nullptr_t) noexcept : type(Type::RawPointer), u(nullptr) {}
231+ any(nullptr_t) noexcept : type(Type::RawPointer), u(nullptr) {}
232
232
233
233
234#if !defined(USE_GC)
234#if !defined(USE_GC)
src/Language/PureScript/CodeGen/Cpp.hs+22−9
@@ -71,16 +71,17 @@ moduleToCpp env (Module _ mn imps _ foreigns decls) = do
71 (snd <$> imps)
71 (snd <$> imps)
72 let cppImports' = "PureScript" : cppImports
72 let cppImports' = "PureScript" : cppImports
73 cppDecls <- concat <$> mapM (bindToCpp [CppTopLevel]) decls
73 cppDecls <- concat <$> mapM (bindToCpp [CppTopLevel]) decls
74+ let cpps = filterInlineFuncs <$> cppDecls
74− let namesmap = M.toList .
75+ namesmap = M.toList .
75 M.mapKeysMonotonic (qualifiedToCpp id) . M.map (\(t, _, _) -> arity t) $
76 M.mapKeysMonotonic (qualifiedToCpp id) . M.map (\(t, _, _) -> arity t) $
76 E.names env
77 E.names env
77 datamap = M.toList .
78 datamap = M.toList .
78 M.mapKeysMonotonic (qualifiedToCpp (Ident . runProperName)) .
79 M.mapKeysMonotonic (qualifiedToCpp (Ident . runProperName)) .
79 M.map (\(_, _, _, fields) -> length fields) $
80 M.map (\(_, _, _, fields) -> length fields) $
80 E.dataConstructors env
81 E.dataConstructors env
81− cppDecls' <- traverse (optimize $ namesmap ++ datamap) cppDecls
82+ cpps' <- traverse (optimize $ namesmap ++ datamap) cpps
82 foreignWrappers <- curriedForeigns
83 foreignWrappers <- curriedForeigns
83− let optimized = cppDecls' ++ foreignWrappers
84+ let optimized = cpps' ++ foreignWrappers
84 let moduleHeader =
85 let moduleHeader =
85 fileBegin mn "HH" ++
86 fileBegin mn "HH" ++
86 P.linebreak ++
87 P.linebreak ++
@@ -187,12 +188,7 @@ moduleToCpp env (Module _ mn imps _ foreigns decls) = do
187 args' = (\i -> (identToCpp i, aty)) <$> fst abs'
188 args' = (\i -> (identToCpp i, aty)) <$> fst abs'
188 abs' = unAbs body []
189 abs' = unAbs body []
189 isAccessor :: Expr Ann -> Bool
190 isAccessor :: Expr Ann -> Bool
190− isAccessor (Accessor _ _ e)
191+ isAccessor Accessor{} = True
191− | (_, f, _, _) <- everythingOnValues (&&) (const False) notAbs (const False) (const False) = f e
192− where
193− notAbs :: Expr Ann -> Bool
194− notAbs Abs{} = False
195− notAbs _ = True
196 isAccessor _ = False
192 isAccessor _ = False
197 isIndexer :: Cpp -> Bool
193 isIndexer :: Cpp -> Bool
198 isIndexer (CppIndexer (CppSymbol _) (CppVar _)) = True
194 isIndexer (CppIndexer (CppSymbol _) (CppVar _)) = True
@@ -944,3 +940,20 @@ symbolDefs syms = CppNamespace "PureScript" [CppNamespace "symbol" (asFunc <$> s
944 where
940 where
945 asFunc :: String -> Cpp
941 asFunc :: String -> Cpp
946 asFunc s = CppStruct s []
942 asFunc s = CppStruct s []
943+
944+---------------------------------------------------------------------------------------------------
945+filterInlineFuncs :: Cpp -> Cpp
946+---------------------------------------------------------------------------------------------------
947+filterInlineFuncs = everywhereOnCpp convert
948+ where
949+ convert :: Cpp -> Cpp
950+ convert (CppBlock []) = CppBlock []
951+ convert (CppFunction n ps r qs cpp)
952+ | CppInline `elem` qs,
953+ everythingOnCpp (||) shouldRemove cpp = CppFunction n ps r (delete CppInline qs) cpp
954+ where
955+ shouldRemove :: Cpp -> Bool
956+ shouldRemove CppSymbol{} = True
957+ shouldRemove CppLambda{} = True
958+ shouldRemove _ = False
959+ convert cpp = cpp