Browse Source

Fix destructors

Alessandro Ranellucci 11 years ago
parent
commit
f4db7625bc
3 changed files with 9 additions and 7 deletions
  1. 4 5
      xs/src/ExPolygon.hpp
  2. 4 2
      xs/xsp/ExPolygon.xsp
  3. 1 0
      xs/xsp/Point.xsp

+ 4 - 5
xs/src/ExPolygon.hpp

@@ -21,21 +21,20 @@ class ExPolygon
     SV* arrayref();
 };
 
-Polygon*
-perl2polygon(SV* poly_sv)
+void
+perl2polygon(SV* poly_sv, Polygon& poly)
 {
     AV* poly_av = (AV*)SvRV(poly_sv);
     const unsigned int num_points = av_len(poly_av)+1;
-    Polygon* retval = new Polygon(num_points);
+    poly.resize(num_points);
     
     for (unsigned int i = 0; i < num_points; i++) {
         SV** point_sv = av_fetch(poly_av, i, 0);
         AV*  point_av = (AV*)SvRV(*point_sv);
-        Point& p = (*retval)[i];
+        Point& p = poly[i];
         p.x = (unsigned long)SvIV(*av_fetch(point_av, 0, 0));
         p.y = (unsigned long)SvIV(*av_fetch(point_av, 1, 0));
     }
-    return retval;
 }
 
 SV*

+ 4 - 2
xs/xsp/ExPolygon.xsp

@@ -6,6 +6,7 @@
 %}
 
 %name{Slic3r::ExPolygon::XS} class ExPolygon {
+    ~ExPolygon();
 %{
 
 ExPolygon*
@@ -13,9 +14,10 @@ ExPolygon::new(...)
     CODE:
         RETVAL = new ExPolygon ();
         // ST(0) is class name, ST(1) is contour and others are holes
-        RETVAL->contour = *perl2polygon(ST(1));
+        perl2polygon(ST(1), RETVAL->contour);
+        RETVAL->holes.resize(items-2);
         for (unsigned int i = 2; i < items; i++) {
-            RETVAL->holes.push_back(*perl2polygon(ST(i)));
+            perl2polygon(ST(i), RETVAL->holes[i-2]);
         }
     OUTPUT:
         RETVAL

+ 1 - 0
xs/xsp/Point.xsp

@@ -7,6 +7,7 @@
 
 %name{Slic3r::Point::XS} class Point {
     Point(unsigned long _x = 0, unsigned long _y = 0);
+    ~Point();
 %{
 
 SV*