git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
C++: fix issues with cast changes
b36e9feAndy Arvanitis
pcc/runtime/purescript.hh+44−4
@@ -422,10 +422,50 @@ class any {
422
422
423}; // class any
423}; // class any
424
424
425+namespace Private {
426+ template <typename T, typename U=void>
427+ struct TagHelper {};
428+
429+ template <>
430+ struct TagHelper<string> {
431+ static constexpr any::Tag tag = any::Tag::String;
432+ };
433+
434+ template <>
435+ struct TagHelper<const char *> {
436+ static constexpr any::Tag tag = any::Tag::String;
437+ };
438+
439+ template <size_t N>
440+ struct TagHelper<any::dict<N>> {
441+ static constexpr any::Tag tag = any::Tag::Dictionary;
442+ };
443+
444+ template <size_t N>
445+ struct TagHelper<any::data<N>> {
446+ static constexpr any::Tag tag = any::Tag::Data;
447+ };
448+
449+ template <>
450+ struct TagHelper<any::array> {
451+ static constexpr any::Tag tag = any::Tag::Array;
452+ };
453+
454+ template <>
455+ struct TagHelper<any::record> {
456+ static constexpr any::Tag tag = any::Tag::Record;
457+ };
458+
459+ template <typename T>
460+ struct TagHelper<T> {
461+ static constexpr any::Tag tag = any::Tag::Pointer;
462+ };
463+}
464+
425template <typename T,
465template <typename T,
426 typename = typename std::enable_if<std::is_class<T>::value>::type>
466 typename = typename std::enable_if<std::is_class<T>::value>::type>
427inline auto cast_managed(const any& a) -> T& {
467inline auto cast_managed(const any& a) -> T& {
428− return *static_cast<T*>(a.extractPointer(IF_DEBUG(any::Tag::Pointer)));
468+ return *static_cast<T*>(a.extractPointer(IF_DEBUG(Private::TagHelper<T>::tag)));
429}
469}
430
470
431// TODO: Deprecated - use static_cast
471// TODO: Deprecated - use static_cast
@@ -451,7 +491,7 @@ namespace dict {
451
491
452 template <size_t N>
492 template <size_t N>
453 inline auto get(const any& a) -> const any& {
493 inline auto get(const any& a) -> const any& {
454− return (*static_cast<const any::dict<N+1>*>(a.extractPointer(IF_DEBUG(any::Tag::Dictionary))))[N].second;
494+ return cast_managed<any::dict<N+1>>(a)[N].second;
455 }
495 }
456
496
457 template <size_t N>
497 template <size_t N>
@@ -469,7 +509,7 @@ namespace dict {
469 }
509 }
470
510
471 inline auto get(const Private::Symbol key, const any& a) -> const any& {
511 inline auto get(const Private::Symbol key, const any& a) -> const any& {
472− return get(key, *static_cast<const any::dict<unknown_size>*>(a.extractPointer(IF_DEBUG(any::Tag::Dictionary))));
512+ return get(key, cast_managed<any::dict<unknown_size>>(a));
473 }
513 }
474
514
475 #define P(N) any::dict_pair&& arg ## N
515 #define P(N) any::dict_pair&& arg ## N
@@ -517,7 +557,7 @@ namespace data {
517
557
518 template <size_t N>
558 template <size_t N>
519 inline auto get(const any& a) -> const any& {
559 inline auto get(const any& a) -> const any& {
520− return (*static_cast<const any::data<N+1>*>(a.extractPointer(IF_DEBUG(any::Tag::Data))))[N];
560+ return cast_managed<any::data<N+1>>(a)[N];
521 }
561 }
522
562
523 template <typename T>
563 template <typename T>