From ac5e7133230e12c5019cba2a8ca21788e6b1852b Mon Sep 17 00:00:00 2001 From: Alessandro Ranellucci Date: Fri, 27 Sep 2013 11:48:44 +0200 Subject: [PATCH] Fix segfault when calling chained_path() on an ExtrusionPathCollection using no_sort. Includes regression test --- lib/Slic3r/Fill/Concentric.pm | 2 +- xs/src/ExtrusionEntityCollection.cpp | 2 +- xs/t/12_extrusionpathcollection.t | 6 +++++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/Slic3r/Fill/Concentric.pm b/lib/Slic3r/Fill/Concentric.pm index ef61eb808..75dce8d23 100644 --- a/lib/Slic3r/Fill/Concentric.pm +++ b/lib/Slic3r/Fill/Concentric.pm @@ -44,7 +44,7 @@ sub fill_surface { my $last_pos = Slic3r::Point->new(0,0); foreach my $loop (@loops) { push @paths, $loop->split_at_index($last_pos->nearest_point_index(\@$loop)); - $last_pos = $paths[-1][-1]; + $last_pos = $paths[-1]->last_point; } # clip the paths to avoid the extruder to get exactly on the first point of the loop diff --git a/xs/src/ExtrusionEntityCollection.cpp b/xs/src/ExtrusionEntityCollection.cpp index 67f9adaf9..98f28d38a 100644 --- a/xs/src/ExtrusionEntityCollection.cpp +++ b/xs/src/ExtrusionEntityCollection.cpp @@ -45,7 +45,7 @@ ExtrusionEntityCollection::chained_path(bool no_reverse) const ExtrusionEntityCollection* ExtrusionEntityCollection::chained_path_from(Point* start_near, bool no_reverse) const { - if (this->no_sort) return new ExtrusionEntityCollection(*this); + if (this->no_sort) return this->clone(); ExtrusionEntityCollection* retval = new ExtrusionEntityCollection; ExtrusionEntitiesPtr my_paths; diff --git a/xs/t/12_extrusionpathcollection.t b/xs/t/12_extrusionpathcollection.t index 5d1704f0a..e28c04b6d 100644 --- a/xs/t/12_extrusionpathcollection.t +++ b/xs/t/12_extrusionpathcollection.t @@ -4,7 +4,7 @@ use strict; use warnings; use Slic3r::XS; -use Test::More tests => 13; +use Test::More tests => 14; my $points = [ [100, 100], @@ -73,6 +73,10 @@ is scalar(@{$collection->[1]}), 1, 'appended collection was duplicated'; [ map $_->x, map @{$_->polyline}, @{$collection->chained_path_from(Slic3r::Point->new(30,0), 0)} ], [reverse 4, 10, 15, 10, 15, 20], 'chained_path_from'; + + $collection->no_sort(1); + my @foo = @{$collection->chained_path(0)}; + pass 'chained_path with no_sort'; } __END__