@@ -302,20 +302,23 @@ void wk_update_vector_meta_from_sfc(SEXP x, wk_vector_meta_t* vector_meta) {
302302 }
303303
304304 // if z or m coords are present, ranges are provided
305- SEXP z_range = Rf_getAttrib (x , Rf_install ("z_range" ));
305+ SEXP z_range ;
306+ PROTECT (z_range = Rf_getAttrib (x , Rf_install ("z_range" )));
306307 if (z_range != R_NilValue ) {
307308 vector_meta -> flags |= WK_FLAG_HAS_Z ;
308309 }
309310
310- SEXP m_range = Rf_getAttrib (x , Rf_install ("m_range" ));
311+ SEXP m_range ;
312+ PROTECT (m_range = Rf_getAttrib (x , Rf_install ("m_range" )));
311313 if (m_range != R_NilValue ) {
312314 vector_meta -> flags |= WK_FLAG_HAS_M ;
313315 }
314316
315317 // sfc objects come with a cached bbox
316318 // This appears to always be xmin, ymin, xmax, ymax
317319 // when attached to an sfc object
318- SEXP bbox = Rf_getAttrib (x , Rf_install ("bbox" ));
320+ SEXP bbox ;
321+ PROTECT (bbox = Rf_getAttrib (x , Rf_install ("bbox" )));
319322 if ((Rf_xlength (x ) > 0 ) && (bbox != R_NilValue )) {
320323 vector_meta -> bounds_min [0 ] = REAL (bbox )[0 ];
321324 vector_meta -> bounds_min [1 ] = REAL (bbox )[1 ];
@@ -338,15 +341,20 @@ void wk_update_vector_meta_from_sfc(SEXP x, wk_vector_meta_t* vector_meta) {
338341 vector_meta -> bounds_min [2 ] = REAL (m_range )[1 ];
339342 vector_meta -> bounds_max [2 ] = REAL (m_range )[2 ];
340343 }
344+ UNPROTECT (3 );
341345}
342346
343347double wk_sfc_precision (SEXP x ) {
344- SEXP prec = Rf_getAttrib (x , Rf_install ("precision" ));
348+ SEXP prec ;
349+ PROTECT (prec = Rf_getAttrib (x , Rf_install ("precision" )));
345350 if ((TYPEOF (prec ) == INTSXP ) && (Rf_length (prec ) == 1 )) {
351+ UNPROTECT (1 );
346352 return INTEGER (prec )[0 ];
347353 } else if ((TYPEOF (prec ) == REALSXP ) && (Rf_length (prec ) == 1 )) {
354+ UNPROTECT (1 );
348355 return REAL (prec )[0 ];
349356 } else {
357+ UNPROTECT (1 );
350358 return WK_PRECISION_NONE ;
351359 }
352360}
0 commit comments