git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
C++: use char32_t
commit22aec46eb089a1e0bba69f2e0fd35880f2f7c4ba authorAndy Arvanitis <andyarvanitis@gmail.com> dateTue 10 Jan 2017, 20:00 (10 years ago) parent59013ff
3 files changed+17−10
pcc/TestMain.hs+2−1 pcc/runtime/purescript.cc+12−6 pcc/runtime/purescript.hh+3−3
pcc/TestMain.hs+2−1
@@ -74,7 +74,7 @@ main = do
7474 when testCaseDirExists $ callProcess "cp" ["-R", testCaseDir, srcDir]
7575
7676 callProcess "make" ["clean"]
77− callProcess "make" ["debug", "-Werror", "-j2"]
77+ callProcess "make" ["debug", "CXXFLAGS=-Werror", "-j2"]
7878 --
7979 -- Run C++ files
8080 --
@@ -136,6 +136,7 @@ skipped =
136136 , "SolvingAppendSymbol.purs" -- TODO: depend on new package needing porting
137137 , "SolvingCompareSymbol.purs" --
138138 , "SolvingIsSymbol.purs" --
139+ , "StringEdgeCases.purs"
139140 , "StringEscapes.purs"
140141 ]
141142
pcc/runtime/purescript.cc+12−6
@@ -60,10 +60,16 @@ any::operator bool() const {
6060 RETURN_VALUE(Tag::Boolean, b,)
6161}
6262
63−any::operator char() const {
63+any::operator char32_t() const {
6464 RETURN_VALUE(Tag::Character, c,)
6565}
6666
67+any::operator char() const {
68+ const auto val = cast<decltype(c)>(*this);
69+ assert(val <= std::numeric_limits<char>::max());
70+ return static_cast<char>(val);
71+}
72+
6773any::operator size_t() const {
6874 const auto sz = cast<int>(*this);
6975 assert(sz >= 0);
@@ -197,7 +203,7 @@ auto operator+(const any& lhs_, const any& rhs_) -> any {
197203 switch (lhs.tag) {
198204 case any::Tag::Integer: assert(lhs.tag == any::Tag::Integer); return lhs.i + rhs.i;
199205 case any::Tag::Double: assert(lhs.tag == any::Tag::Double); return lhs.d + rhs.d;
200− case any::Tag::Character: assert(lhs.tag == any::Tag::Character); return any(char(lhs.c + rhs.c));
206+ case any::Tag::Character: assert(lhs.tag == any::Tag::Character); return decltype(any::c){lhs.c + rhs.c};
201207 case any::Tag::StringLiteral:
202208 assert(lhs.tag == any::Tag::StringLiteral || lhs.tag == any::Tag::String);
203209 assert(rhs.tag == any::Tag::StringLiteral || rhs.tag == any::Tag::String);
@@ -230,7 +236,7 @@ auto operator-(const any& lhs_, const any& rhs_) -> any {
230236 switch (lhs.tag) {
231237 case any::Tag::Integer: return lhs.i - rhs.i;
232238 case any::Tag::Double: return lhs.d - rhs.d;
233− case any::Tag::Character: return any(char(lhs.c - rhs.c));
239+ case any::Tag::Character: return decltype(any::c){lhs.c - rhs.c};
234240 default: assert(false && "Unsupported tag for '-' operator");
235241 }
236242 return nullptr;
@@ -243,7 +249,7 @@ auto operator*(const any& lhs_, const any& rhs_) -> any {
243249 switch (lhs.tag) {
244250 case any::Tag::Integer: return lhs.i * rhs.i;
245251 case any::Tag::Double: return lhs.d * rhs.d;
246− case any::Tag::Character: return any(char(lhs.c * rhs.c));
252+ case any::Tag::Character: return decltype(lhs.c){lhs.c - rhs.c};
247253 default: assert(false && "Unsupported tag for '*' operator");
248254 }
249255 return nullptr;
@@ -256,7 +262,7 @@ auto operator/(const any& lhs_, const any& rhs_) -> any {
256262 switch (lhs.tag) {
257263 case any::Tag::Integer: return lhs.i / rhs.i;
258264 case any::Tag::Double: return lhs.d / rhs.d;
259− case any::Tag::Character: return any(char(lhs.c / rhs.c));
265+ case any::Tag::Character: return decltype(any::c){lhs.c / rhs.c};
260266 default: assert(false && "Unsupported tag for '/' operator");
261267 }
262268 return nullptr;
@@ -268,7 +274,7 @@ auto operator%(const any& lhs_, const any& rhs_) -> any {
268274 assert(lhs.tag == rhs.tag);
269275 switch (lhs.tag) {
270276 case any::Tag::Integer: return lhs.i % rhs.i;
271− case any::Tag::Character: return any(char(lhs.c % rhs.c));
277+ case any::Tag::Character: return decltype(any::c){lhs.c % rhs.c};
272278 default: assert(false && "Unsupported tag for '%' operator");
273279 }
274280 return nullptr;
pcc/runtime/purescript.hh+3−3
@@ -158,7 +158,7 @@ class any {
158158 mutable thunk t;
159159 mutable int i;
160160 mutable double d;
161− mutable char c;
161+ mutable char32_t c;
162162 mutable bool b;
163163 mutable cstring r;
164164 mutable fn f;
@@ -178,10 +178,9 @@ class any {
178178 assert(val >= std::numeric_limits<decltype(i)>::min() &&
179179 val <= std::numeric_limits<decltype(i)>::max());
180180 }
181−
182181 any(const double val) noexcept : tag(Tag::Double), d(val) {}
182+ any(const char32_t val) noexcept : tag(Tag::Character), c(val) {}
183183 any(const char val) noexcept : tag(Tag::Character), c(val) {}
184− any(const char32_t val) noexcept : tag(Tag::Integer), i(val) {}
185184
186185 template <typename T, typename = typename std::enable_if<std::is_same<bool,T>::value>::type>
187186 any(const T val) noexcept : tag(Tag::Boolean), b(val) {}
@@ -335,6 +334,7 @@ class any {
335334 operator int() const;
336335 operator double() const;
337336 operator bool() const;
337+ operator char32_t() const;
338338 operator char() const;
339339 operator size_t() const;
340340 operator const char *() const;