Skip to content

GenGC changes

3 messages · Kurt Hornik, Nicholas Lewin-Koh

#
As most R developers maybe are already aware of, R version 1.2.0
introduced a new `generational' garbage collector which means that
strings and vectors (and language objects) are handled differently from
the numerical atomic types.
Earlier code was written in a style like.
           VECTOR(dimnames)[0] = getAttrib(x, R_NamesSymbol);
    
    but that is no longer allowed.  The functions `VECTOR_ELT' and
    `SET_VECTOR_ELT' must now be used to access and set elements of a
    generic vector.  There are analogous functions `STRING_ELT' and
    `SET_STRING_ELT' for character vectors.
    
       To convert existing code, use the following replacements.
    
         original                 replacement
         `foo = VECTOR(bar)[i]'   `foo = VECTOR_ELT(bar, i)'
         `VECTOR(foo)[j] = bar'   `SET_VECTOR_ELT(foo, j, bar)'
         `foo = STRING(bar)[i]'   `foo = STRING_ELT(bar, i)'
         `STRING(foo)[j] = bar'   `SET_STRING_ELT(foo, j, bar)'

The changes were committed to the r-devel true this Monday, and imply
that add-on packages using the original coding style will no longer work
with current versions of r-devel.  One possible solution for having
packages with sources which work for compilation under both 1.1 and 1.2
is to use conditionals of the form

    #if R_VERSION >= R_Version(1, 2, 0)
	new-style-code
    #else
	old-style-code
    #endif

I would like to ask add-on package maintainers of packages which are
affected by the change to produce updated versions of their packages
which work under both 1.1 and 1.2.  It seems that the following ones
require action:

	Java
	Matrix
	RMySQL
	RODBC
	foreign
	hdf5
	netCDF
	stataread

(Note that [currently], there is binary incompatibility between 1.1 and
1.2.)

-k

-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-devel mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-devel-request@stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
#
Hi,
I just completed a package for reading and writing dbf files, that I will
post soon so i will definately be affected since I used mostly the c
api. Would the option below mean that there would be macros defined in say
R.internals to have old style behave as new style, or would it be prefered
that maintainers write seperate routines for new and old versions. I am
imagining quite a bit of code bloat.

Nicholas
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-devel mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-devel-request@stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
1 day later
#
As indicated, the above is only one possible solution.  Another, and
maybe the preferred one in order to avoid unnecessarily duplicating
code, is the use of a *PRIVATE* header file containing the following
code:

#if R_VERSION < R_Version(1, 2, 0)
# define STRING_ELT(x,i)	(STRING(x)[i])
# define VECTOR_ELT(x,i)        (VECTOR(x)[i])
# define SET_STRING_ELT(x,i,v)	(STRING(x)[i] = (v))
# define SET_VECTOR_ELT(x,i,v)	(VECTOR(x)[i] = (v))
#endif

(Note that in order to achieve maximal source compatibility in the 1.x
series, it is preferable to have add-on packages modified, as we cannot
easily control the `old' (pre-1.1.1) R versions included in various
distributions.)

-k
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-devel mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-devel-request@stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._