diff --git a/xs/src/ExPolygon.hpp b/xs/src/ExPolygon.hpp index 0ee9c28a6..7e77a3814 100644 --- a/xs/src/ExPolygon.hpp +++ b/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* diff --git a/xs/xsp/ExPolygon.xsp b/xs/xsp/ExPolygon.xsp index a69fd26b6..e0442efcc 100644 --- a/xs/xsp/ExPolygon.xsp +++ b/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 diff --git a/xs/xsp/Point.xsp b/xs/xsp/Point.xsp index 372d1edd0..ef18931fe 100644 --- a/xs/xsp/Point.xsp +++ b/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*