diff --git a/change/react-native-windows-8d23ba00-efa5-4506-b2cd-aff4b69cfa3f.json b/change/react-native-windows-8d23ba00-efa5-4506-b2cd-aff4b69cfa3f.json new file mode 100644 index 00000000000..f93fe3ceb8d --- /dev/null +++ b/change/react-native-windows-8d23ba00-efa5-4506-b2cd-aff4b69cfa3f.json @@ -0,0 +1,7 @@ +{ + "type": "prerelease", + "comment": "Fix stackoverflow in StructInfo", + "packageName": "react-native-windows", + "email": "vmorozov@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/vnext/Microsoft.ReactNative.Cxx/StructInfo.h b/vnext/Microsoft.ReactNative.Cxx/StructInfo.h index c92d2d40cfe..9594f13c72c 100644 --- a/vnext/Microsoft.ReactNative.Cxx/StructInfo.h +++ b/vnext/Microsoft.ReactNative.Cxx/StructInfo.h @@ -81,7 +81,7 @@ struct FieldInfo { FieldInfo(TValue TClass::*fieldPtr) noexcept : m_fieldReader{FieldReader}, m_fieldWriter{FieldWriter}, - m_fieldPtrStore{*reinterpret_cast(&fieldPtr)} { + m_fieldPtrStore{StoreFieldPtr(fieldPtr)} { static_assert(sizeof(m_fieldPtrStore) >= sizeof(fieldPtr)); } @@ -94,6 +94,13 @@ struct FieldInfo { } private: + template + static uintptr_t StoreFieldPtr(TValue TClass::*fieldPtr) noexcept { + uintptr_t result{}; + std::memcpy(&result, &fieldPtr, sizeof(fieldPtr)); + return result; + } + FieldReaderType m_fieldReader; FieldWriterType m_fieldWriter; const uintptr_t m_fieldPtrStore;