git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
C++: use char32_t
22aec46Andy Arvanitis
pcc/TestMain.hs+2−1
@@ -74,7 +74,7 @@ main = do
74 when testCaseDirExists $ callProcess "cp" ["-R", testCaseDir, srcDir]
74 when testCaseDirExists $ callProcess "cp" ["-R", testCaseDir, srcDir]
75
75
76 callProcess "make" ["clean"]
76 callProcess "make" ["clean"]
77− callProcess "make" ["debug", "-Werror", "-j2"]
77+ callProcess "make" ["debug", "CXXFLAGS=-Werror", "-j2"]
78 --
78 --
79 -- Run C++ files
79 -- Run C++ files
80 --
80 --
@@ -136,6 +136,7 @@ skipped =
136 , "SolvingAppendSymbol.purs" -- TODO: depend on new package needing porting
136 , "SolvingAppendSymbol.purs" -- TODO: depend on new package needing porting
137 , "SolvingCompareSymbol.purs" --
137 , "SolvingCompareSymbol.purs" --
138 , "SolvingIsSymbol.purs" --
138 , "SolvingIsSymbol.purs" --
139+ , "StringEdgeCases.purs"
139 , "StringEscapes.purs"
140 , "StringEscapes.purs"
140 ]
141 ]
141
142
pcc/runtime/purescript.cc+12−6
@@ -60,10 +60,16 @@ any::operator bool() const {
60 RETURN_VALUE(Tag::Boolean, b,)
60 RETURN_VALUE(Tag::Boolean, b,)
61}
61}
62
62
63−any::operator char() const {
63+any::operator char32_t() const {
64 RETURN_VALUE(Tag::Character, c,)
64 RETURN_VALUE(Tag::Character, c,)
65}
65}
66
66
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+
67any::operator size_t() const {
73any::operator size_t() const {
68 const auto sz = cast<int>(*this);
74 const auto sz = cast<int>(*this);
69 assert(sz >= 0);
75 assert(sz >= 0);
@@ -197,7 +203,7 @@ auto operator+(const any& lhs_, const any& rhs_) -> any {
197 switch (lhs.tag) {
203 switch (lhs.tag) {
198 case any::Tag::Integer: assert(lhs.tag == any::Tag::Integer); return lhs.i + rhs.i;
204 case any::Tag::Integer: assert(lhs.tag == any::Tag::Integer); return lhs.i + rhs.i;
199 case any::Tag::Double: assert(lhs.tag == any::Tag::Double); return lhs.d + rhs.d;
205 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};
201 case any::Tag::StringLiteral:
207 case any::Tag::StringLiteral:
202 assert(lhs.tag == any::Tag::StringLiteral || lhs.tag == any::Tag::String);
208 assert(lhs.tag == any::Tag::StringLiteral || lhs.tag == any::Tag::String);
203 assert(rhs.tag == any::Tag::StringLiteral || rhs.tag == any::Tag::String);
209 assert(rhs.tag == any::Tag::StringLiteral || rhs.tag == any::Tag::String);
@@ -230,7 +236,7 @@ auto operator-(const any& lhs_, const any& rhs_) -> any {
230 switch (lhs.tag) {
236 switch (lhs.tag) {
231 case any::Tag::Integer: return lhs.i - rhs.i;
237 case any::Tag::Integer: return lhs.i - rhs.i;
232 case any::Tag::Double: return lhs.d - rhs.d;
238 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};
234 default: assert(false && "Unsupported tag for '-' operator");
240 default: assert(false && "Unsupported tag for '-' operator");
235 }
241 }
236 return nullptr;
242 return nullptr;
@@ -243,7 +249,7 @@ auto operator*(const any& lhs_, const any& rhs_) -> any {
243 switch (lhs.tag) {
249 switch (lhs.tag) {
244 case any::Tag::Integer: return lhs.i * rhs.i;
250 case any::Tag::Integer: return lhs.i * rhs.i;
245 case any::Tag::Double: return lhs.d * rhs.d;
251 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};
247 default: assert(false && "Unsupported tag for '*' operator");
253 default: assert(false && "Unsupported tag for '*' operator");
248 }
254 }
249 return nullptr;
255 return nullptr;
@@ -256,7 +262,7 @@ auto operator/(const any& lhs_, const any& rhs_) -> any {
256 switch (lhs.tag) {
262 switch (lhs.tag) {
257 case any::Tag::Integer: return lhs.i / rhs.i;
263 case any::Tag::Integer: return lhs.i / rhs.i;
258 case any::Tag::Double: return lhs.d / rhs.d;
264 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};
260 default: assert(false && "Unsupported tag for '/' operator");
266 default: assert(false && "Unsupported tag for '/' operator");
261 }
267 }
262 return nullptr;
268 return nullptr;
@@ -268,7 +274,7 @@ auto operator%(const any& lhs_, const any& rhs_) -> any {
268 assert(lhs.tag == rhs.tag);
274 assert(lhs.tag == rhs.tag);
269 switch (lhs.tag) {
275 switch (lhs.tag) {
270 case any::Tag::Integer: return lhs.i % rhs.i;
276 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};
272 default: assert(false && "Unsupported tag for '%' operator");
278 default: assert(false && "Unsupported tag for '%' operator");
273 }
279 }
274 return nullptr;
280 return nullptr;
pcc/runtime/purescript.hh+3−3
@@ -158,7 +158,7 @@ class any {
158 mutable thunk t;
158 mutable thunk t;
159 mutable int i;
159 mutable int i;
160 mutable double d;
160 mutable double d;
161− mutable char c;
161+ mutable char32_t c;
162 mutable bool b;
162 mutable bool b;
163 mutable cstring r;
163 mutable cstring r;
164 mutable fn f;
164 mutable fn f;
@@ -178,10 +178,9 @@ class any {
178 assert(val >= std::numeric_limits<decltype(i)>::min() &&
178 assert(val >= std::numeric_limits<decltype(i)>::min() &&
179 val <= std::numeric_limits<decltype(i)>::max());
179 val <= std::numeric_limits<decltype(i)>::max());
180 }
180 }
181−
182 any(const double val) noexcept : tag(Tag::Double), d(val) {}
181 any(const double val) noexcept : tag(Tag::Double), d(val) {}
182+ any(const char32_t val) noexcept : tag(Tag::Character), c(val) {}
183 any(const char val) noexcept : tag(Tag::Character), c(val) {}
183 any(const char val) noexcept : tag(Tag::Character), c(val) {}
184− any(const char32_t val) noexcept : tag(Tag::Integer), i(val) {}
185
184
186 template <typename T, typename = typename std::enable_if<std::is_same<bool,T>::value>::type>
185 template <typename T, typename = typename std::enable_if<std::is_same<bool,T>::value>::type>
187 any(const T val) noexcept : tag(Tag::Boolean), b(val) {}
186 any(const T val) noexcept : tag(Tag::Boolean), b(val) {}
@@ -335,6 +334,7 @@ class any {
335 operator int() const;
334 operator int() const;
336 operator double() const;
335 operator double() const;
337 operator bool() const;
336 operator bool() const;
337+ operator char32_t() const;
338 operator char() const;
338 operator char() const;
339 operator size_t() const;
339 operator size_t() const;
340 operator const char *() const;
340 operator const char *() const;