|
7 | 7 | #include <string>
|
8 | 8 | #include <vector>
|
9 | 9 | #include <unordered_map>
|
| 10 | +#include <iostream> |
10 | 11 |
|
11 | 12 | namespace csp
|
12 | 13 | {
|
@@ -668,16 +669,69 @@ class StructMeta : public std::enable_shared_from_this<StructMeta>
|
668 | 669 | };
|
669 | 670 |
|
670 | 671 | template<typename T>
|
671 |
| -std::shared_ptr<typename StructField::upcast<T>::type> StructMeta::getMetaField( const char * fieldname, const char * expectedtype ) |
672 |
| -{ |
673 |
| - auto field_ = field( fieldname ); |
674 |
| - if( !field_ ) |
675 |
| - CSP_THROW( TypeError, "Struct type " << name() << " missing required field " << fieldname << " for " << expectedtype ); |
| 672 | +std::shared_ptr<typename StructField::upcast<T>::type> StructMeta::getMetaField(const char* fieldname, const char* expectedtype) { |
| 673 | + std::cout << "\n=== getMetaField Debug ===\n"; |
| 674 | + std::cout << "1. Looking for field: " << fieldname << "\n"; |
| 675 | + |
| 676 | + auto field_ = field(fieldname); |
| 677 | + if(!field_) { |
| 678 | + std::cout << "2. Field not found!\n"; |
| 679 | + CSP_THROW(TypeError, "Struct type " << name() << " missing required field " << fieldname); |
| 680 | + } |
| 681 | + |
| 682 | + std::cout << "2. Field found\n"; |
| 683 | + std::cout << "3. Field name from object: " << field_->fieldname() << "\n"; |
| 684 | + std::cout << "4. Field type from CspType: " << field_->type()->type() << "\n"; |
| 685 | + std::cout << "5. Expected type: " << CspType::Type::fromCType<T>::type << "\n"; |
| 686 | + |
| 687 | + // Memory layout & pointer checks |
| 688 | + const StructField* field_ptr = field_.get(); |
| 689 | + std::cout << "6. Field ptr value: " << field_ptr << "\n"; |
| 690 | + std::cout << "7. Field use count: " << field_.use_count() << "\n"; |
| 691 | + |
| 692 | + // Detailed field information |
| 693 | + if(field_ptr) { |
| 694 | + std::cout << "8. Field metadata:\n"; |
| 695 | + std::cout << " - Field offset: " << field_ptr->offset() << "\n"; |
| 696 | + std::cout << " - Field size: " << field_ptr->size() << "\n"; |
| 697 | + std::cout << " - Field alignment: " << field_ptr->alignment() << "\n"; |
| 698 | + std::cout << " - Field mask offset: " << field_ptr->maskOffset() << "\n"; |
| 699 | + std::cout << " - Field mask bit: " << static_cast<int>(field_ptr->maskBit()) << "\n"; |
| 700 | + |
| 701 | + // Type verification |
| 702 | + std::cout << "9. Type checks:\n"; |
| 703 | + std::cout << " - Original type: " << typeid(field_).name() << "\n"; |
| 704 | + std::cout << " - Target type: " << typeid(typename StructField::upcast<T>::type).name() << "\n"; |
| 705 | + std::cout << " - Is native: " << field_ptr->isNative() << "\n"; |
| 706 | + |
| 707 | + // Test various casts |
| 708 | + std::cout << "10. Detailed cast tests:\n"; |
| 709 | + std::cout << " Base classes:\n"; |
| 710 | + std::cout << " - As StructField*: " << (dynamic_cast<const StructField*>(field_ptr) != nullptr) << "\n"; |
| 711 | + std::cout << " - As NonNativeStructField*: " << (dynamic_cast<const NonNativeStructField*>(field_ptr) != nullptr) << "\n"; |
| 712 | + std::cout << " Non-native implementations:\n"; |
| 713 | + std::cout << " - As StringStructField*: " << (dynamic_cast<const StringStructField*>(field_ptr) != nullptr) << "\n"; |
| 714 | + std::cout << " - As DialectGenericStructField*: " << (dynamic_cast<const DialectGenericStructField*>(field_ptr) != nullptr) << "\n"; |
| 715 | + std::cout << " - As ArrayStructField<std::string>*: " << (dynamic_cast<const ArrayStructField<std::vector<std::string>>*>(field_ptr) != nullptr) << "\n"; |
| 716 | + std::cout << " Native field test:\n"; |
| 717 | + std::cout << " - As NativeStructField<int64_t>*: " << (dynamic_cast<const NativeStructField<int64_t>*>(field_ptr) != nullptr) << "\n"; |
| 718 | +} |
| 719 | + |
| 720 | + using TargetType = typename StructField::upcast<T>::type; |
| 721 | + auto typedfield = std::dynamic_pointer_cast<TargetType>(field_); |
| 722 | + std::cout << "11. Final dynamic_cast result: " << (typedfield ? "success" : "failure") << "\n"; |
676 | 723 |
|
677 |
| - std::shared_ptr<typename StructField::upcast<T>::type> typedfield = std::dynamic_pointer_cast<typename StructField::upcast<T>::type>( field_ ); |
678 |
| - if( !typedfield ) |
679 |
| - CSP_THROW( TypeError, expectedtype << " - provided struct type " << name() << " expected type " << CspType::Type::fromCType<T>::type << " for field " << fieldname |
680 |
| - << " but got type " << field_ -> type() -> type() << " for " << expectedtype ); |
| 724 | + if(!typedfield) { |
| 725 | + std::cout << "12. FAILED CAST DETAILS:\n"; |
| 726 | + std::cout << " - Source type: " << typeid(StructField).name() << "\n"; |
| 727 | + std::cout << " - Target type: " << typeid(TargetType).name() << "\n"; |
| 728 | + |
| 729 | + CSP_THROW(TypeError, expectedtype << " - provided struct type " << name() |
| 730 | + << " expected type " << CspType::Type::fromCType<T>::type |
| 731 | + << " for field " << fieldname |
| 732 | + << " but got type " << field_->type()->type() |
| 733 | + << " for " << expectedtype); |
| 734 | + } |
681 | 735 |
|
682 | 736 | return typedfield;
|
683 | 737 | }
|
@@ -773,22 +827,31 @@ class Struct
|
773 | 827 | friend class StructMeta;
|
774 | 828 |
|
775 | 829 | //Note these members are not included on size(), they're stored before "this" ptr ( see operator new / delete )
|
776 |
| - struct HiddenData |
777 |
| - { |
778 |
| - size_t refcount; |
779 |
| - std::shared_ptr<const StructMeta> meta; |
780 |
| - void * dialectPtr; |
| 830 | + struct alignas(8) HiddenData { |
| 831 | + alignas(8) size_t refcount; // 8 bytes at 0x0 |
| 832 | + alignas(8) std::shared_ptr<const StructMeta> meta; // 16 bytes at 0x8 |
| 833 | + alignas(8) void* dialectPtr; // 8 bytes at 0x18 |
| 834 | + // Total: 32 bytes |
781 | 835 | };
|
782 | 836 |
|
783 | 837 | const HiddenData * hidden() const
|
784 | 838 | {
|
785 | 839 | return const_cast<Struct *>( this ) -> hidden();
|
786 | 840 | }
|
787 | 841 |
|
788 |
| - HiddenData * hidden() |
789 |
| - { |
790 |
| - return reinterpret_cast<HiddenData *>( reinterpret_cast<uint8_t *>( this ) - sizeof( HiddenData ) ); |
791 |
| - } |
| 842 | + static constexpr size_t HIDDEN_OFFSET = 32; // sizeof(HiddenData) aligned to 8 bytes |
| 843 | + |
| 844 | + HiddenData* hidden() { |
| 845 | + std::byte* base = reinterpret_cast<std::byte*>(this); |
| 846 | + // Force alignment to match shared_ptr requirements |
| 847 | + static_assert(alignof(HiddenData) >= alignof(std::shared_ptr<void>), |
| 848 | + "HiddenData must be aligned for shared_ptr"); |
| 849 | + return reinterpret_cast<HiddenData*>(base - HIDDEN_OFFSET); |
| 850 | + } |
| 851 | + // HiddenData * hidden() |
| 852 | + // { |
| 853 | + // return reinterpret_cast<HiddenData *>( reinterpret_cast<uint8_t *>( this ) - sizeof( HiddenData ) ); |
| 854 | + // } |
792 | 855 |
|
793 | 856 | //actual data is allocated past this point
|
794 | 857 | };
|
|
0 commit comments