From 5818fcdd84340de8b790cd015936028e43f011a7 Mon Sep 17 00:00:00 2001 From: Charles Kawczynski Date: Thu, 10 Oct 2024 16:45:15 -0400 Subject: [PATCH] Try to fix Undefined Behavior in DataLayouts --- src/DataLayouts/DataLayouts.jl | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/DataLayouts/DataLayouts.jl b/src/DataLayouts/DataLayouts.jl index bc698fe235..29cb780340 100644 --- a/src/DataLayouts/DataLayouts.jl +++ b/src/DataLayouts/DataLayouts.jl @@ -238,24 +238,23 @@ end @generated function _getproperty( data::AbstractData{S}, ::Val{Name}, + name::Symbol, ) where {S, Name} - errorstring = "Invalid field name $(Name) for type $(S)" i = findfirst(isequal(Name), fieldnames(S)) - if i === nothing - return :(error($errorstring)) - end static_idx = Val{i}() - return :(Base.@_inline_meta; DataLayouts._property_view(data, $static_idx)) + return :( + Base.@_inline_meta; DataLayouts._property_view(data, $static_idx, name) + ) end @inline function Base.getproperty(data::AbstractData{S}, name::Symbol) where {S} - _getproperty(data, Val{name}()) + _getproperty(data, Val{name}(), name) end @inline function Base.dotgetproperty( data::AbstractData{S}, name::Symbol, ) where {S} - _getproperty(data, Val{name}()) + _getproperty(data, Val{name}(), name) end Base.@propagate_inbounds function Base.getproperty( @@ -275,11 +274,18 @@ Base.@propagate_inbounds function Base.getproperty( union_all(data){SS, Base.tail(type_params(data))...}(dataview) end +@noinline _property_view( + data::AbstractData{S}, + ::Val{Nothing}, + name, +) where {S} = error("Invalid field name $name for type $(S)") + # In the past, we've sometimes needed a generated function # for inference and constant propagation: Base.@propagate_inbounds @generated function _property_view( data::AD, ::Val{Idx}, + name, ) where {S, Idx, AD <: AbstractData{S}} SS = fieldtype(S, Idx) T = eltype(parent_array_type(AD))