From simon.urbanek at r-project.org  Wed Dec 28 16:09:05 2011
From: simon.urbanek at r-project.org (Simon Urbanek)
Date: Wed, 28 Dec 2011 10:09:05 -0500
Subject: [Rd] external pointers
In-Reply-To: <CAMp6Ef4iHDdrLfsoQ0ayJ10b_3JSKA86iz0O-Cc2KFe=v8i82g@mail.gmail.com>
References: <CAMp6Ef4iHDdrLfsoQ0ayJ10b_3JSKA86iz0O-Cc2KFe=v8i82g@mail.gmail.com>
Message-ID: <97385934-7B35-4B7A-9944-3A169E0558D9@r-project.org>

Patrick,

On Dec 28, 2011, at 12:07 AM, Patrick Leyshock wrote:

> I have an external pointer object that I'd like to pass from my R code to
> some C code.  Per Section 5.13 of "Writing R Extensions", I've noted that
> "external pointers should only be used as part of an object with normal
> semantics, for example an attribute or an element of a list."  So I've
> written up a workable C function as such:
> 
> SEXP my_c_function(SEXP param)    {
>     SEXP temp = getAttrib(param, install("ptr_attribute"));
>     void * ptr = R_ExternalPtrAddr(temp);
>     ...   // do useful things with ptr
> }
> 
> I can pass my_c_function() an object with "normal" semantics (such as an
> integer vector), where the external pointer object is a parameter named
> "ptr_attribute".  The function extracts the pointer object from param; i.e.
> this function does what I want it to do.
> 
> My question is:  is there a way to do this using the .C() interface, rather
> than .Call()?

No. Why would you want to do that? .C is slower and mostly for backwards-compatibility. You can't pass anything complex with .C and the docs recommend .Call for this. The whole point of .C was to bypass R API but in your case you need it to get the pointer.


>   Using call_R seems a possibility - has anyone had luck
> going this route?
> 

call_R has nothing to do with this, it is sort of the equivalent of using the restricted set of objects to evaluate R function (so you still can't pass your pointer). As the docs say there is no point in using it in modern code.

Cheers,
Simon


> Any suggestions appreciated.
> 
> Thanks, Patrick
> 
> 	[[alternative HTML version deleted]]
> 
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
> 
> 



[Rd] external pointers
Simon Urbanek