Skip to content

Commit

Permalink
only PROTECT when duplicate
Browse files Browse the repository at this point in the history
  • Loading branch information
edzer committed Dec 10, 2016
1 parent 6d69a01 commit 8f8a660
Show file tree
Hide file tree
Showing 6 changed files with 138 additions and 28 deletions.
2 changes: 1 addition & 1 deletion inst/include/sp.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
#endif
/* remember to touch local_stubs.c */

#define SP_VERSION "1.2-3"
#define SP_VERSION "1.2-4"

#include <R.h>
/* RSB 091203 */
Expand Down
60 changes: 49 additions & 11 deletions inst/include/sp_xports.c
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,13 @@ SEXP SP_PREFIX(Polygon_c)(const SEXP coords, const SEXP n, const SEXP ihole) {
INTEGER_POINTER(dim1)[0] = nn;
INTEGER_POINTER(dim1)[1] = 2;
setAttrib(ccopy, R_DimSymbol, dim1);
} else
PROTECT(ccopy = NAMED(coords) ? duplicate(coords) : coords); pc++;
} else {
if (NAMED(coords)) {
PROTECT(ccopy = duplicate(coords));
pc++;
} else
ccopy = coords;
}

/* from here one, ccopy is closed, and can be modified */

Expand Down Expand Up @@ -180,8 +185,18 @@ SEXP SP_PREFIX(Polygons_c)(const SEXP pls, const SEXP ID) {
int *po, *holes;
SEXP valid;

PROTECT(pls1 = NAMED(pls) ? duplicate(pls) : pls); pc++;
PROTECT(ID1 = NAMED(ID) ? duplicate(ID) : ID); pc++;
if (NAMED(pls)) {
PROTECT(pls1 = duplicate(pls));
pc++;
} else
pls1 = pls;
// PROTECT(pls1 = NAMED(pls) ? duplicate(pls) : pls); pc++;
if (NAMED(ID)) {
PROTECT(ID1 = duplicate(ID));
pc++;
} else
ID1 = ID;
// PROTECT(ID1 = NAMED(ID) ? duplicate(ID) : ID); pc++;

nps = length(pls1);
fuzz = R_pow(DOUBLE_EPS, (2.0/3.0));
Expand Down Expand Up @@ -307,14 +322,17 @@ SEXP SP_PREFIX(SpatialPolygons_c)(const SEXP pls, const SEXP pO,
int pc=0;

PROTECT(ans = NEW_OBJECT(MAKE_CLASS("SpatialPolygons"))); pc++;
SET_SLOT(ans, install("polygons"), NAMED(pls) ? duplicate(pls) : pls);
SET_SLOT(ans, install("proj4string"), NAMED(p4s) ? duplicate(p4s) : p4s);
// SET_SLOT(ans, install("polygons"), NAMED(pls) ? duplicate(pls) : pls);
SET_SLOT(ans, install("polygons"), pls);
// SET_SLOT(ans, install("proj4string"), NAMED(p4s) ? duplicate(p4s) : p4s);
SET_SLOT(ans, install("proj4string"), p4s);

if (pO == R_NilValue) {
SET_SLOT(ans, install("plotOrder"),
SP_PREFIX(SpatialPolygons_plotOrder_c)(pls));
} else
SET_SLOT(ans, install("plotOrder"), NAMED(pO) ? duplicate(pO) : pO);
// SET_SLOT(ans, install("plotOrder"), NAMED(pO) ? duplicate(pO) : pO);
SET_SLOT(ans, install("plotOrder"), pO);

PROTECT(bbox = SP_PREFIX(bboxCalcR_c(pls))); pc++;
SET_SLOT(ans, install("bbox"), bbox);
Expand All @@ -331,7 +349,12 @@ SEXP SP_PREFIX(SpatialPolygons_plotOrder_c)(const SEXP pls) {
int *po;
double *areas;

PROTECT(pls1 = NAMED(pls) ? duplicate(pls) : pls); pc++;
// PROTECT(pls1 = NAMED(pls) ? duplicate(pls) : pls); pc++;
if (NAMED(pls)) {
PROTECT(pls1 = duplicate(pls));
pc++;
} else
pls1 = pls;

ng = length(pls1);
areas = (double *) R_alloc((size_t) ng, sizeof(double));
Expand Down Expand Up @@ -392,7 +415,12 @@ SEXP SP_PREFIX(SpatialPolygons_getIDs_c)(const SEXP obj) {
int i, n;
SEXP pls, IDs, obj1;

PROTECT(obj1 = NAMED(obj) ? duplicate(obj) : obj); pc++;
// PROTECT(obj1 = NAMED(obj) ? duplicate(obj) : obj); pc++;
if (NAMED(obj)) {
PROTECT(obj1 = duplicate(obj));
pc++;
} else
obj1 = obj;

PROTECT(pls = GET_SLOT(obj, install("polygons"))); pc++;
n = length(pls);
Expand All @@ -413,7 +441,12 @@ SEXP SP_PREFIX(bboxCalcR_c)(const SEXP pls) {
int i, j, k, n, npls, npl, pc=0;
double x, y;

PROTECT(pls1 = NAMED(pls) ? duplicate(pls) : pls); pc++;
// PROTECT(pls1 = NAMED(pls) ? duplicate(pls) : pls); pc++;
if (NAMED(pls)) {
PROTECT(pls1 = duplicate(pls));
pc++;
} else
pls1 = pls;

npls = length(pls1);
if (npls == 0) { /* EJP: this makes a zero-length object at least pass further sanity checks */
Expand Down Expand Up @@ -525,7 +558,12 @@ SEXP SP_PREFIX(comment2comm)(const SEXP obj) {
char s[15], *buf;
int *c, *nss, *co, *coo;

PROTECT(obj1 = NAMED(obj) ? duplicate(obj) : obj); pc++;
// PROTECT(obj1 = NAMED(obj) ? duplicate(obj) : obj); pc++;
if (NAMED(obj)) {
PROTECT(obj1 = duplicate(obj));
pc++;
} else
obj1 = obj;

PROTECT(comment = getAttrib(obj1, install("comment"))); pc++;
if (comment == R_NilValue) {
Expand Down
24 changes: 20 additions & 4 deletions src/pip.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,26 @@ SEXP R_point_in_polygon_sp(const SEXP px, const SEXP py, const SEXP polx,
POLYGON pol;
SEXP ret, px1, py1, polx1, poly1;

PROTECT(px1 = NAMED(px) ? duplicate(px) : px); pc++;
PROTECT(py1 = NAMED(py) ? duplicate(py) : px); pc++;
PROTECT(polx1 = NAMED(polx) ? duplicate(polx) : polx); pc++;
PROTECT(poly1 = NAMED(poly) ? duplicate(poly) : poly); pc++;
if (NAMED(px)) {
PROTECT(px1 = duplicate(px));
pc++;
} else
px1 = px;
if (NAMED(py)) {
PROTECT(py1 = duplicate(py));
pc++;
} else
py1 = py;
if (NAMED(polx)) {
PROTECT(polx1 = duplicate(polx));
pc++;
} else
polx1 = polx;
if (NAMED(poly)) {
PROTECT(poly1 = duplicate(poly));
pc++;
} else
poly1 = poly;

pol.lines = LENGTH(polx); /* check later that first == last */
pol.p = (PLOT_POINT *) R_alloc((size_t) pol.lines, sizeof(PLOT_POINT));
Expand Down
18 changes: 18 additions & 0 deletions src/pip2.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,27 @@ SEXP pointsInBox(const SEXP lb, const SEXP px, const SEXP py) {
double *x, ppx, ppy;
SEXP res, px1, py1, lb1;

/*
PROTECT(px1 = NAMED(px) ? duplicate(px) : px); pc++;
PROTECT(py1 = NAMED(py) ? duplicate(py) : py); pc++;
PROTECT(lb1 = NAMED(lb) ? duplicate(lb) : lb); pc++;
*/
if (NAMED(px)) {
PROTECT(px1 = duplicate(px));
pc++;
} else
px1 = px;
if (NAMED(py)) {
PROTECT(py1 = duplicate(py));
pc++;
} else
py1 = py;
if (NAMED(lb)) {
PROTECT(lb1 = duplicate(lb));
pc++;
} else
lb1 = lb;

PROTECT(res = NEW_LIST(n)); pc++;
x = (double *) R_alloc((size_t) (m*4), sizeof(double));
k = (int *) R_alloc((size_t) m, sizeof(int));
Expand Down
2 changes: 1 addition & 1 deletion src/sp.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
#endif
/* remember to touch local_stubs.c */

#define SP_VERSION "1.2-3"
#define SP_VERSION "1.2-4"

#include <R.h>
/* RSB 091203 */
Expand Down
60 changes: 49 additions & 11 deletions src/sp_xports.c
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,13 @@ SEXP SP_PREFIX(Polygon_c)(const SEXP coords, const SEXP n, const SEXP ihole) {
INTEGER_POINTER(dim1)[0] = nn;
INTEGER_POINTER(dim1)[1] = 2;
setAttrib(ccopy, R_DimSymbol, dim1);
} else
PROTECT(ccopy = NAMED(coords) ? duplicate(coords) : coords); pc++;
} else {
if (NAMED(coords)) {
PROTECT(ccopy = duplicate(coords));
pc++;
} else
ccopy = coords;
}

/* from here one, ccopy is closed, and can be modified */

Expand Down Expand Up @@ -180,8 +185,18 @@ SEXP SP_PREFIX(Polygons_c)(const SEXP pls, const SEXP ID) {
int *po, *holes;
SEXP valid;

PROTECT(pls1 = NAMED(pls) ? duplicate(pls) : pls); pc++;
PROTECT(ID1 = NAMED(ID) ? duplicate(ID) : ID); pc++;
if (NAMED(pls)) {
PROTECT(pls1 = duplicate(pls));
pc++;
} else
pls1 = pls;
// PROTECT(pls1 = NAMED(pls) ? duplicate(pls) : pls); pc++;
if (NAMED(ID)) {
PROTECT(ID1 = duplicate(ID));
pc++;
} else
ID1 = ID;
// PROTECT(ID1 = NAMED(ID) ? duplicate(ID) : ID); pc++;

nps = length(pls1);
fuzz = R_pow(DOUBLE_EPS, (2.0/3.0));
Expand Down Expand Up @@ -307,14 +322,17 @@ SEXP SP_PREFIX(SpatialPolygons_c)(const SEXP pls, const SEXP pO,
int pc=0;

PROTECT(ans = NEW_OBJECT(MAKE_CLASS("SpatialPolygons"))); pc++;
SET_SLOT(ans, install("polygons"), NAMED(pls) ? duplicate(pls) : pls);
SET_SLOT(ans, install("proj4string"), NAMED(p4s) ? duplicate(p4s) : p4s);
// SET_SLOT(ans, install("polygons"), NAMED(pls) ? duplicate(pls) : pls);
SET_SLOT(ans, install("polygons"), pls);
// SET_SLOT(ans, install("proj4string"), NAMED(p4s) ? duplicate(p4s) : p4s);
SET_SLOT(ans, install("proj4string"), p4s);

if (pO == R_NilValue) {
SET_SLOT(ans, install("plotOrder"),
SP_PREFIX(SpatialPolygons_plotOrder_c)(pls));
} else
SET_SLOT(ans, install("plotOrder"), NAMED(pO) ? duplicate(pO) : pO);
// SET_SLOT(ans, install("plotOrder"), NAMED(pO) ? duplicate(pO) : pO);
SET_SLOT(ans, install("plotOrder"), pO);

PROTECT(bbox = SP_PREFIX(bboxCalcR_c(pls))); pc++;
SET_SLOT(ans, install("bbox"), bbox);
Expand All @@ -331,7 +349,12 @@ SEXP SP_PREFIX(SpatialPolygons_plotOrder_c)(const SEXP pls) {
int *po;
double *areas;

PROTECT(pls1 = NAMED(pls) ? duplicate(pls) : pls); pc++;
// PROTECT(pls1 = NAMED(pls) ? duplicate(pls) : pls); pc++;
if (NAMED(pls)) {
PROTECT(pls1 = duplicate(pls));
pc++;
} else
pls1 = pls;

ng = length(pls1);
areas = (double *) R_alloc((size_t) ng, sizeof(double));
Expand Down Expand Up @@ -392,7 +415,12 @@ SEXP SP_PREFIX(SpatialPolygons_getIDs_c)(const SEXP obj) {
int i, n;
SEXP pls, IDs, obj1;

PROTECT(obj1 = NAMED(obj) ? duplicate(obj) : obj); pc++;
// PROTECT(obj1 = NAMED(obj) ? duplicate(obj) : obj); pc++;
if (NAMED(obj)) {
PROTECT(obj1 = duplicate(obj));
pc++;
} else
obj1 = obj;

PROTECT(pls = GET_SLOT(obj, install("polygons"))); pc++;
n = length(pls);
Expand All @@ -413,7 +441,12 @@ SEXP SP_PREFIX(bboxCalcR_c)(const SEXP pls) {
int i, j, k, n, npls, npl, pc=0;
double x, y;

PROTECT(pls1 = NAMED(pls) ? duplicate(pls) : pls); pc++;
// PROTECT(pls1 = NAMED(pls) ? duplicate(pls) : pls); pc++;
if (NAMED(pls)) {
PROTECT(pls1 = duplicate(pls));
pc++;
} else
pls1 = pls;

npls = length(pls1);
if (npls == 0) { /* EJP: this makes a zero-length object at least pass further sanity checks */
Expand Down Expand Up @@ -525,7 +558,12 @@ SEXP SP_PREFIX(comment2comm)(const SEXP obj) {
char s[15], *buf;
int *c, *nss, *co, *coo;

PROTECT(obj1 = NAMED(obj) ? duplicate(obj) : obj); pc++;
// PROTECT(obj1 = NAMED(obj) ? duplicate(obj) : obj); pc++;
if (NAMED(obj)) {
PROTECT(obj1 = duplicate(obj));
pc++;
} else
obj1 = obj;

PROTECT(comment = getAttrib(obj1, install("comment"))); pc++;
if (comment == R_NilValue) {
Expand Down

0 comments on commit 8f8a660

Please sign in to comment.