git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
C++: use a type alias to ensure integer type is same size as pointer type
8fd3d45Andy Arvanitis
pcc/include/purescript.cc+2−2
@@ -45,7 +45,7 @@ auto any::operator()() const -> any {
45 return (*variant.e)();
45 return (*variant.e)();
46}
46}
47
47
48−any::operator long() const {
48+any::operator integer() const {
49 RETURN_VALUE(Type::Integer, i,)
49 RETURN_VALUE(Type::Integer, i,)
50}
50}
51
51
@@ -121,7 +121,7 @@ auto any::operator[](const size_t rhs) const -> const any& {
121auto any::operator[](const any& rhs) const -> const any& {
121auto any::operator[](const any& rhs) const -> const any& {
122 const any& variant = unthunkVariant(*this);
122 const any& variant = unthunkVariant(*this);
123 assert(variant.type == Type::Array);
123 assert(variant.type == Type::Array);
124− return (*variant.a)[cast<long>(rhs)];
124+ return (*variant.a)[cast<integer>(rhs)];
125}
125}
126
126
127auto any::contains(const char key[]) const -> bool {
127auto any::contains(const char key[]) const -> bool {
pcc/include/purescript.hh+20−16
@@ -36,6 +36,7 @@
36
36
37namespace PureScript {
37namespace PureScript {
38
38
39+using integer = std::intptr_t;
39using cstring = const char *;
40using cstring = const char *;
40using nullptr_t = std::nullptr_t;
41using nullptr_t = std::nullptr_t;
41
42
@@ -45,6 +46,9 @@ public:
45 runtime_error(const char message[]) : std::runtime_error(std::string(message)) {}
46 runtime_error(const char message[]) : std::runtime_error(std::string(message)) {}
46};
47};
47
48
49+const integer INTEGER_MIN = INTPTR_MIN;
50+const integer INTEGER_MAX = INTPTR_MAX;
51+
48const bool undefined = false;
52const bool undefined = false;
49const size_t constructor = 0;
53const size_t constructor = 0;
50
54
@@ -133,7 +137,7 @@ class any {
133 private:
137 private:
134 union {
138 union {
135 mutable thunk t;
139 mutable thunk t;
136− mutable long i;
140+ mutable integer i;
137 mutable double d;
141 mutable double d;
138 mutable char c;
142 mutable char c;
139 mutable bool b;
143 mutable bool b;
@@ -151,7 +155,7 @@ class any {
151
155
152 public:
156 public:
153
157
154− any(const long val) noexcept : type(Type::Integer), i(val) {}
158+ any(const integer val) noexcept : type(Type::Integer), i(val) {}
155 any(const int val) noexcept : type(Type::Integer), i(val) {}
159 any(const int val) noexcept : type(Type::Integer), i(val) {}
156 any(const unsigned int val) noexcept : type(Type::Integer), i(val) {}
160 any(const unsigned int val) noexcept : type(Type::Integer), i(val) {}
157 any(const double val) noexcept : type(Type::Double), d(val) {}
161 any(const double val) noexcept : type(Type::Double), d(val) {}
@@ -273,7 +277,7 @@ class any {
273 auto operator()(const as_thunk) const -> const any&;
277 auto operator()(const as_thunk) const -> const any&;
274 auto operator()() const -> any;
278 auto operator()() const -> any;
275
279
276− operator long() const;
280+ operator integer() const;
277 operator double() const;
281 operator double() const;
278 operator bool() const;
282 operator bool() const;
279 operator char() const;
283 operator char() const;
@@ -302,15 +306,15 @@ class any {
302
306
303 #define DEFINE_INT_OPERATOR(op, rty) \
307 #define DEFINE_INT_OPERATOR(op, rty) \
304 inline friend auto operator op (const any& lhs, int rhs) -> rty { \
308 inline friend auto operator op (const any& lhs, int rhs) -> rty { \
305− return (long)lhs op (long)rhs; \
309+ return (integer)lhs op (integer)rhs; \
306 } \
310 } \
307 inline friend auto operator op (int lhs, const any& rhs) -> rty { \
311 inline friend auto operator op (int lhs, const any& rhs) -> rty { \
308− return (long)lhs op (long)rhs; \
312+ return (integer)lhs op (integer)rhs; \
309 }
313 }
310
314
311 #define DECLARE_COMPARISON_OPERATOR(op) \
315 #define DECLARE_COMPARISON_OPERATOR(op) \
312 friend auto operator op (const any&, const any&) -> bool; \
316 friend auto operator op (const any&, const any&) -> bool; \
313− DEFINE_OPERATOR(op, long, bool) \
317+ DEFINE_OPERATOR(op, integer, bool) \
314 DEFINE_OPERATOR(op, double, bool) \
318 DEFINE_OPERATOR(op, double, bool) \
315 DEFINE_OPERATOR(op, char, bool) \
319 DEFINE_OPERATOR(op, char, bool) \
316 DEFINE_INT_OPERATOR(op, bool) \
320 DEFINE_INT_OPERATOR(op, bool) \
@@ -326,39 +330,39 @@ class any {
326
330
327 friend auto operator+(const any&, const any&) -> any;
331 friend auto operator+(const any&, const any&) -> any;
328
332
329− DEFINE_OPERATOR(+, long, long)
333+ DEFINE_OPERATOR(+, integer, integer)
330 DEFINE_OPERATOR(+, double, double)
334 DEFINE_OPERATOR(+, double, double)
331 DEFINE_OPERATOR(+, char, char)
335 DEFINE_OPERATOR(+, char, char)
332− DEFINE_INT_OPERATOR(+, long)
336+ DEFINE_INT_OPERATOR(+, integer)
333 friend auto operator+(const any& lhs, const char * const rhs) -> std::string;
337 friend auto operator+(const any& lhs, const char * const rhs) -> std::string;
334 friend auto operator+(const char * const lhs, const any& rhs) -> std::string;
338 friend auto operator+(const char * const lhs, const any& rhs) -> std::string;
335
339
336 friend auto operator-(const any&, const any&) -> any;
340 friend auto operator-(const any&, const any&) -> any;
337
341
338− DEFINE_OPERATOR(-, long, long)
342+ DEFINE_OPERATOR(-, integer, integer)
339 DEFINE_OPERATOR(-, double, double)
343 DEFINE_OPERATOR(-, double, double)
340 DEFINE_OPERATOR(-, char, char)
344 DEFINE_OPERATOR(-, char, char)
341− DEFINE_INT_OPERATOR(-, long)
345+ DEFINE_INT_OPERATOR(-, integer)
342
346
343 friend auto operator*(const any&, const any&) -> any;
347 friend auto operator*(const any&, const any&) -> any;
344
348
345− DEFINE_OPERATOR(*, long, long)
349+ DEFINE_OPERATOR(*, integer, integer)
346 DEFINE_OPERATOR(*, double, double)
350 DEFINE_OPERATOR(*, double, double)
347 DEFINE_OPERATOR(*, char, char)
351 DEFINE_OPERATOR(*, char, char)
348− DEFINE_INT_OPERATOR(*, long)
352+ DEFINE_INT_OPERATOR(*, integer)
349
353
350 friend auto operator/(const any&, const any&) -> any;
354 friend auto operator/(const any&, const any&) -> any;
351
355
352− DEFINE_OPERATOR(/, long, long)
356+ DEFINE_OPERATOR(/, integer, integer)
353 DEFINE_OPERATOR(/, double, double)
357 DEFINE_OPERATOR(/, double, double)
354 DEFINE_OPERATOR(/, char, char)
358 DEFINE_OPERATOR(/, char, char)
355− DEFINE_INT_OPERATOR(/, long)
359+ DEFINE_INT_OPERATOR(/, integer)
356
360
357 friend auto operator%(const any&, const any&) -> any;
361 friend auto operator%(const any&, const any&) -> any;
358
362
359− DEFINE_OPERATOR(%, long, long)
363+ DEFINE_OPERATOR(%, integer, integer)
360 DEFINE_OPERATOR(%, char, char)
364 DEFINE_OPERATOR(%, char, char)
361− DEFINE_INT_OPERATOR(%, long)
365+ DEFINE_INT_OPERATOR(%, integer)
362
366
363 friend auto operator-(const any&) -> any; // unary negate
367 friend auto operator-(const any&) -> any; // unary negate
364};
368};
src/Language/PureScript/CodeGen/Cpp/Common.hs+1
@@ -126,6 +126,7 @@ nameIsCppReserved name =
126 , "import"
126 , "import"
127 , "inline"
127 , "inline"
128 , "int"
128 , "int"
129+ , "integer"
129 , "list"
130 , "list"
130 , "long"
131 , "long"
131 , "mutable"
132 , "mutable"