From 9c122bda5eeb2fa96edae58de7e6092f6d54a721 Mon Sep 17 00:00:00 2001
From: Alessandro Ranellucci <aar@cpan.org>
Date: Tue, 19 Mar 2013 16:02:03 +0100
Subject: [PATCH] Fix memory leak in avoid_crossing_perimeters. #1044

---
 lib/Slic3r/GCode/MotionPlanner.pm |  8 +++++++-
 lib/Slic3r/Print.pm               | 16 ++++++++--------
 2 files changed, 15 insertions(+), 9 deletions(-)

diff --git a/lib/Slic3r/GCode/MotionPlanner.pm b/lib/Slic3r/GCode/MotionPlanner.pm
index 3708a65e3..114f6a2be 100644
--- a/lib/Slic3r/GCode/MotionPlanner.pm
+++ b/lib/Slic3r/GCode/MotionPlanner.pm
@@ -168,11 +168,17 @@ sub BUILD {
             lines           => \@lines,
             points          => [ values %{$self->_pointmap} ],
             no_arrows       => 1,
-            polygons        => [ map @$_, @{$self->islands} ],
+            expolygons      => $self->islands,
             #red_polygons    => [ map $_->holes, map @$_, @{$self->_inner} ],
             #white_polygons    => [ map @$_, @{$self->_outer} ],
         );
         printf "%d islands\n", scalar @{$self->islands};
+        
+        eval "use Devel::Size";
+        print  "MEMORY USAGE:\n";
+        printf "  %-19s = %.1fMb\n", $_, Devel::Size::total_size($self->$_)/1024/1024
+            for qw(_inner _outer _contours_ex _pointmap _edges _crossing_edges islands last_crossings);
+        printf "  %-19s = %.1fMb\n", 'self', Devel::Size::total_size($self)/1024/1024;
     }
 }
 
diff --git a/lib/Slic3r/Print.pm b/lib/Slic3r/Print.pm
index dded13f5e..7fa1db9f4 100644
--- a/lib/Slic3r/Print.pm
+++ b/lib/Slic3r/Print.pm
@@ -881,24 +881,24 @@ sub write_gcode {
                 if ($Slic3r::Config->avoid_crossing_perimeters) {
                     push @islands, map +{ perimeters => [], fills => [] }, @{$layer->slices};
                     PERIMETER: foreach my $perimeter (@{$layerm->perimeters}) {
-                        $perimeter = $perimeter->unpack;
+                        my $p = $perimeter->unpack;
                         for my $i (0 .. $#{$layer->slices}-1) {
-                            if ($layer->slices->[$i]->contour->encloses_point($perimeter->first_point)) {
-                                push @{ $islands[$i]{perimeters} }, $perimeter;
+                            if ($layer->slices->[$i]->contour->encloses_point($p->first_point)) {
+                                push @{ $islands[$i]{perimeters} }, $p;
                                 next PERIMETER;
                             }
                         }
-                        push @{ $islands[-1]{perimeters} }, $perimeter; # optimization
+                        push @{ $islands[-1]{perimeters} }, $p; # optimization
                     }
                     FILL: foreach my $fill (@{$layerm->fills}) {
+                        my $f = $fill->unpack;
                         for my $i (0 .. $#{$layer->slices}-1) {
-                            $fill = $fill->unpack;
-                            if ($layer->slices->[$i]->contour->encloses_point($fill->first_point)) {
-                                push @{ $islands[$i]{fills} }, $fill;
+                            if ($layer->slices->[$i]->contour->encloses_point($f->first_point)) {
+                                push @{ $islands[$i]{fills} }, $f;
                                 next FILL;
                             }
                         }
-                        push @{ $islands[-1]{fills} }, $fill; # optimization
+                        push @{ $islands[-1]{fills} }, $f; # optimization
                     }
                 } else {
                     push @islands, {