From 11b070118be43766fe78a24f60588dbca5905642 Mon Sep 17 00:00:00 2001 From: Robin Deits Date: Thu, 1 Jun 2017 13:56:22 -0400 Subject: [PATCH 1/4] convert HomogenousMesh constructor to an @generated function to work around segfault fixes #92 --- src/meshes.jl | 25 ++++++++++++++----------- test/meshes.jl | 6 ++++++ 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/meshes.jl b/src/meshes.jl index d0177dc..a71844b 100644 --- a/src/meshes.jl +++ b/src/meshes.jl @@ -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) + soure_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(soure_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 diff --git a/test/meshes.jl b/test/meshes.jl index 30f497d..0098243 100644 --- a/test/meshes.jl +++ b/test/meshes.jl @@ -156,6 +156,12 @@ end @test all(isapprox.(ns, expect)) end +@testset "construction" begin + # test for https://github.com/JuliaGeometry/GeometryTypes.jl/issues/92 + m = HomogenousMesh(vs, fs) + @test HomogenousMesh(m) == m +end + end From 445b271769f75f2833e96a1b31852fab8db9ceb3 Mon Sep 17 00:00:00 2001 From: Robin Deits Date: Thu, 1 Jun 2017 13:59:04 -0400 Subject: [PATCH 2/4] fix test --- test/meshes.jl | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/meshes.jl b/test/meshes.jl index 0098243..9c9aff7 100644 --- a/test/meshes.jl +++ b/test/meshes.jl @@ -157,6 +157,11 @@ end 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 From dd572d401665e44ebf9b6c8fbc109b908865c763 Mon Sep 17 00:00:00 2001 From: Robin Deits Date: Thu, 1 Jun 2017 15:26:48 -0400 Subject: [PATCH 3/4] fix bug and correct typo --- src/meshes.jl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/meshes.jl b/src/meshes.jl index a71844b..a59c043 100644 --- a/src/meshes.jl +++ b/src/meshes.jl @@ -86,10 +86,10 @@ isvoid{T}(::Type{Vector{T}}) = isvoid(T) for i in 1:nfields(HM1) field = fnames[i] target_type = fieldtype(HM1, i) - soure_type = fieldtype(HM2, i) - if isleaftype(fieldtype(HM1, i)) # target is not defined + 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(soure_type) # target not there yet, maybe we can decompose though (e.g. normals) + 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) push!(expr.args, :($(target_type()))) From 10f7ba4dd8ab92af5a3917e19a9efda1d08c38f5 Mon Sep 17 00:00:00 2001 From: Robin Deits Date: Fri, 2 Jun 2017 17:15:18 -0400 Subject: [PATCH 4/4] rearrange test to fix merge conflicts --- test/meshes.jl | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/test/meshes.jl b/test/meshes.jl index 9c9aff7..e3995ce 100644 --- a/test/meshes.jl +++ b/test/meshes.jl @@ -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 @@ -156,17 +165,6 @@ end @test all(isapprox.(ns, expect)) 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 - end