Destructive str(...)?
Just to be 100% clear, the finalizer is called *at most* once if (as in tcltk) R_RegisterCFinalizer is called. If you want it to be called exactly once, you need to use R_RegisterCFinalizerEx. The issue is that there may not be a final gc(). BTW, str(x) is destructive here too, so we do need to improve str(). I have code written, but access to svn.r-project.org is down (yet again).
x <- as.tclObj(pi) str(x)
Class 'tclObj' length 1 <pointer: 0x860c3f8>
str(x)
length 1 <pointer: 0x860c3f8>
On 31 Oct 2004, Peter Dalgaard wrote:
Simon Urbanek <simon.urbanek@math.uni-augsburg.de> writes:
Now, hold on a second - I thought the main point of EXTPTR is that the finalizer is called only once, that is when the last instance of the reference is disposed of by the gc (no matter how many copies existed meanwhile). Am I wrong and/or did I miss something? I did some tests which support my view, but one never knows ...
How do you ensure that the finalizer is called once? By *not* copying the reference object! You can have as many references to it as you like (i.e. assign it to multiple variables), and the object itself is not removed until the last reference is gone, but if you modify the object (most likely by setting attributes, but you might also change the C pointer payload in a C routine), all "copies" are changed:
x <- as.tclObj(pi) x
<Tcl> 3.14159265359
y <- x y
<Tcl> 3.14159265359
mode(x)
[1] "externalptr"
attr(x, "Simon") <- "Urbanek" attributes(y)
$class [1] "tclObj" $Simon [1] "Urbanek"
Brian D. Ripley, ripley@stats.ox.ac.uk Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/ University of Oxford, Tel: +44 1865 272861 (self) 1 South Parks Road, +44 1865 272866 (PA) Oxford OX1 3TG, UK Fax: +44 1865 272595