undo compile? (or: remove bytecode from closure)

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

undo compile? (or: remove bytecode from closure)

Benjamin Tyner
Hi

Given a closure which has been compiled, what's the recommended way to
recover the original? For example,

     > f <- function(x) x+1
     > fc <- cmpfun(f)
     > rm(f)
     > fc
     function(x) x+1
     <bytecode: 0x41d9228>

what's the best way to recover f from fc ?

Regards

Ben

______________________________________________
[hidden email] mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
Reply | Threaded
Open this post in threaded view
|

Re: undo compile? (or: remove bytecode from closure)

Rui Barradas
Hello,

Maybe the following is not the recommended way but it works
(and I believe makes sense).


f <- function(){}
formals(f) <- formals(fc)
body(f) <- body(fc)

f
#function (x)
#{
#  x <- x + 1
#  pi * x
#}

f(1)
#[1] 6.283185


Hope this helps,

Rui Barradas

Às 03:25 de 16-07-2018, Benjamin Tyner escreveu:

> Hi
>
> Given a closure which has been compiled, what's the recommended way to
> recover the original? For example,
>
>      > f <- function(x) x+1
>      > fc <- cmpfun(f)
>      > rm(f)
>      > fc
>      function(x) x+1
>      <bytecode: 0x41d9228>
>
> what's the best way to recover f from fc ?
>
> Regards
>
> Ben
>
> ______________________________________________
> [hidden email] mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide
> http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.

______________________________________________
[hidden email] mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
Reply | Threaded
Open this post in threaded view
|

Re: undo compile? (or: remove bytecode from closure)

Duncan Murdoch-2
On 16/07/2018 5:31 AM, Rui Barradas wrote:
> Hello,
>
> Maybe the following is not the recommended way but it works
> (and I believe makes sense).
>
>
> f <- function(){}
> formals(f) <- formals(fc)
> body(f) <- body(fc)

That's not quite right:  it might lose the environment of fc, if it
isn't the environment where this took place.  But a simpler solution is just

f <- fc
body(f) <- body(f)

because any assignment to the body of a function causes the bytecode to
be dropped.

Both of our approaches will also cause the source references to be
dropped.  If you want to save those, you need more steps:

f <- fc
body(f) <- body(f)
attr(f, "srcref") <- getSrcref(fc)

Duncan Murdoch

>
> f
> #function (x)
> #{
> #  x <- x + 1
> #  pi * x
> #}
>
> f(1)
> #[1] 6.283185
>
>
> Hope this helps,
>
> Rui Barradas
>
> Às 03:25 de 16-07-2018, Benjamin Tyner escreveu:
>> Hi
>>
>> Given a closure which has been compiled, what's the recommended way to
>> recover the original? For example,
>>
>>       > f <- function(x) x+1
>>       > fc <- cmpfun(f)
>>       > rm(f)
>>       > fc
>>       function(x) x+1
>>       <bytecode: 0x41d9228>
>>
>> what's the best way to recover f from fc ?
>>
>> Regards
>>
>> Ben
>>
>> ______________________________________________
>> [hidden email] mailing list -- To UNSUBSCRIBE and more, see
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide
>> http://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.
>
> ______________________________________________
> [hidden email] mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>

______________________________________________
[hidden email] mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
Reply | Threaded
Open this post in threaded view
|

Re: undo compile? (or: remove bytecode from closure)

Benjamin Tyner
Thanks Rui and Duncan, this is most helpful.


On 07/16/2018 06:58 AM, Duncan Murdoch wrote:

> On 16/07/2018 5:31 AM, Rui Barradas wrote:
>> Hello,
>>
>> Maybe the following is not the recommended way but it works
>> (and I believe makes sense).
>>
>>
>> f <- function(){}
>> formals(f) <- formals(fc)
>> body(f) <- body(fc)
>
> That's not quite right:  it might lose the environment of fc, if it
> isn't the environment where this took place.  But a simpler solution
> is just
>
> f <- fc
> body(f) <- body(f)
>
> because any assignment to the body of a function causes the bytecode
> to be dropped.
>
> Both of our approaches will also cause the source references to be
> dropped.  If you want to save those, you need more steps:
>
> f <- fc
> body(f) <- body(f)
> attr(f, "srcref") <- getSrcref(fc)
>
> Duncan Murdoch
>
>>
>> f
>> #function (x)
>> #{
>> #  x <- x + 1
>> #  pi * x
>> #}
>>
>> f(1)
>> #[1] 6.283185
>>
>>
>> Hope this helps,
>>
>> Rui Barradas
>>
>> Às 03:25 de 16-07-2018, Benjamin Tyner escreveu:
>>> Hi
>>>
>>> Given a closure which has been compiled, what's the recommended way to
>>> recover the original? For example,
>>>
>>>       > f <- function(x) x+1
>>>       > fc <- cmpfun(f)
>>>       > rm(f)
>>>       > fc
>>>       function(x) x+1
>>>       <bytecode: 0x41d9228>
>>>
>>> what's the best way to recover f from fc ?
>>>
>>> Regards
>>>
>>> Ben
>>>
>>> ______________________________________________
>>> [hidden email] mailing list -- To UNSUBSCRIBE and more, see
>>> https://stat.ethz.ch/mailman/listinfo/r-help
>>> PLEASE do read the posting guide
>>> http://www.R-project.org/posting-guide.html
>>> and provide commented, minimal, self-contained, reproducible code.
>>
>> ______________________________________________
>> [hidden email] mailing list -- To UNSUBSCRIBE and more, see
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide
>> http://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.
>>
>

______________________________________________
[hidden email] mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.