git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
C++: fix some issue with new map rendering
commitd6a5fc91d2da5936db7f6b00513d5870b1e977b5 authorAndy Arvanitis <andyarvanitis@gmail.com> dateFri 28 Oct 2016, 17:35 (10 years ago) parentfc1751c
3 files changed+35−25
pcc/include/purescript.cc+12−15 pcc/include/purescript.hh+1−1 src/Language/PureScript/CodeGen/Cpp.hs+22−9
pcc/include/purescript.cc+12−15
@@ -86,38 +86,35 @@ auto any::unthunkVariant(const any& a) -> const any& {
8686 return *variant;
8787}
8888
89+static const any invalid_key(nullptr);
90+
8991auto any::operator[](const symbol_t key) const -> const any& {
90− const any& variant = unthunkVariant(*this);
91− assert(variant.type == Type::Map);
9292 // TODO: assumes at least one element -- safe assumption?
93− const auto m = cast<map<1>>(variant);
94− decltype(m)::size_type i = 0;
93+ const auto& m = cast<map<1>>(*this);
94+ any::map<1>::size_type i = 0;
9595 do {
9696 if (m[i].first == key) {
9797 return m[i].second;
9898 }
9999 } while (m[++i].first != nullptr);
100− throw runtime_error("map key not found");
100+ assert(false && "map key not found");
101+ return invalid_key;
101102}
102103
103104auto any::operator[](const size_t rhs) const -> const any& {
104− const any& variant = unthunkVariant(*this);
105− assert(variant.type == Type::Array);
106− return (*variant.a)[rhs];
105+ const auto& xs = cast<array>(*this);
106+ return xs[rhs];
107107}
108108
109109auto any::operator[](const any& rhs) const -> const any& {
110− const any& variant = unthunkVariant(*this);
111− assert(variant.type == Type::Array);
112− return (*variant.a)[cast<int>(rhs)];
110+ const auto& xs = cast<array>(*this);
111+ return xs[cast<int>(rhs)];
113112}
114113
115114auto any::contains(const symbol_t key) const -> bool {
116− const any& variant = unthunkVariant(*this);
117− assert(variant.type == Type::Map);
118115 // TODO: assumes at least one element -- safe assumption?
119− const auto m = cast<map<1>>(variant);
120− decltype(m)::size_type i = 0;
116+ const auto& m = cast<map<1>>(*this);
117+ any::map<1>::size_type i = 0;
121118 do {
122119 if (m[i].first == key) {
123120 return true;
pcc/include/purescript.hh+1−1
@@ -228,7 +228,7 @@ class any {
228228 any(const T& val, typename std::enable_if<std::is_same<T,void*>::value>::type* = 0) noexcept
229229 : type(Type::RawPointer), u(val) {}
230230
231− any(std::nullptr_t) noexcept : type(Type::RawPointer), u(nullptr) {}
231+ any(nullptr_t) noexcept : type(Type::RawPointer), u(nullptr) {}
232232
233233
234234#if !defined(USE_GC)
src/Language/PureScript/CodeGen/Cpp.hs+22−9
@@ -71,16 +71,17 @@ moduleToCpp env (Module _ mn imps _ foreigns decls) = do
7171 (snd <$> imps)
7272 let cppImports' = "PureScript" : cppImports
7373 cppDecls <- concat <$> mapM (bindToCpp [CppTopLevel]) decls
74− let namesmap = M.toList .
74+ let cpps = filterInlineFuncs <$> cppDecls
75+ namesmap = M.toList .
7576 M.mapKeysMonotonic (qualifiedToCpp id) . M.map (\(t, _, _) -> arity t) $
7677 E.names env
7778 datamap = M.toList .
7879 M.mapKeysMonotonic (qualifiedToCpp (Ident . runProperName)) .
7980 M.map (\(_, _, _, fields) -> length fields) $
8081 E.dataConstructors env
81− cppDecls' <- traverse (optimize $ namesmap ++ datamap) cppDecls
82+ cpps' <- traverse (optimize $ namesmap ++ datamap) cpps
8283 foreignWrappers <- curriedForeigns
83− let optimized = cppDecls' ++ foreignWrappers
84+ let optimized = cpps' ++ foreignWrappers
8485 let moduleHeader =
8586 fileBegin mn "HH" ++
8687 P.linebreak ++
@@ -187,12 +188,7 @@ moduleToCpp env (Module _ mn imps _ foreigns decls) = do
187188 args' = (\i -> (identToCpp i, aty)) <$> fst abs'
188189 abs' = unAbs body []
189190 isAccessor :: Expr Ann -> Bool
190− isAccessor (Accessor _ _ e)
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
191+ isAccessor Accessor{} = True
196192 isAccessor _ = False
197193 isIndexer :: Cpp -> Bool
198194 isIndexer (CppIndexer (CppSymbol _) (CppVar _)) = True
@@ -944,3 +940,20 @@ symbolDefs syms = CppNamespace "PureScript" [CppNamespace "symbol" (asFunc <$> s
944940 where
945941 asFunc :: String -> Cpp
946942 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