Skip to content
This repository was archived by the owner on Nov 22, 2023. It is now read-only.

convert HomogenousMesh constructor to an @generated function to work around segfault #93

Merged
merged 4 commits into from
Jun 7, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 14 additions & 11 deletions src/meshes.jl
Original file line number Diff line number Diff line change
Expand Up @@ -79,24 +79,27 @@ end
isvoid{T}(::Type{T}) = false
isvoid(::Type{Void}) = true
isvoid{T}(::Type{Vector{T}}) = isvoid(T)
function (::Type{HM1}){HM1 <: HomogenousMesh}(primitive::HomogenousMesh)

@generated function (::Type{HM1})(primitive::HM2) where {HM1 <: HomogenousMesh, HM2 <: HomogenousMesh}
fnames = fieldnames(HM1)
args = ntuple(nfields(HM1)) do i
field, target_type = fnames[i], fieldtype(HM1, i)
soure_type = fieldtype(typeof(primitive), i)
isleaftype(fieldtype(HM1, i)) || return getfield(primitive, field) # target is not defined
if !isvoid(target_type) && isvoid(soure_type) # target not there yet, maybe we can decompose though (e.g. normals)
return decompose(HM1.parameters[i], primitive)
expr = Expr(:call, HM1)
for i in 1:nfields(HM1)
field = fnames[i]
target_type = fieldtype(HM1, i)
source_type = fieldtype(HM2, i)
if !isleaftype(fieldtype(HM1, i)) # target is not defined
push!(expr.args, :(getfield(primitive, $(QuoteNode(field)))))
elseif !isvoid(target_type) && isvoid(source_type) # target not there yet, maybe we can decompose though (e.g. normals)
push!(expr.args, :(decompose($(HM1.parameters[i]), primitive)))
elseif isvoid(target_type)
return target_type()
push!(expr.args, :($(target_type())))
else
return convert(target_type, getfield(primitive, field))
push!(expr.args, :(convert($target_type, getfield(primitive, $(QuoteNode(field))))))
end
end
HM1(args...)
expr
end


#Should be:
#function call{M <: HMesh, VT <: Point, FT <: Face}(::Type{M}, vertices::Vector{VT}, faces::Vector{FT})
# Haven't gotten around to implement the types correctly with abstract types in FixedSizeArrays
Expand Down
11 changes: 10 additions & 1 deletion test/meshes.jl
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,16 @@ end
#@fact readall(io) --> s #Win32 and Win64 have different ordering it seems.
end


@testset "construction" begin
VT = vertextype(GLNormalMesh)
FT = facetype(GLNormalMesh)
vs = [VT(0., 0, 0), VT(1., 0, 0), VT(0., 1, 0)]
fs = [FT(1, 2, 3)]

# test for https://github.com/JuliaGeometry/GeometryTypes.jl/issues/92
m = HomogenousMesh(vs, fs)
@test HomogenousMesh(m) == m
end

@testset "Primitives" begin
# issue #16
Expand Down