annotate R/rdc/R/bind.R @ 66:7a61dd082341 default tip

pydc: - fix double free triggered by capsule destructor, when freeing pydc and callback objects, manually
author Tassilo Philipp
date Fri, 24 May 2024 18:16:29 +0200
parents 0cfcc391201f
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
0cfcc391201f initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
1 #
0cfcc391201f initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
2 # bind library by import string
0cfcc391201f initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
3 #
0cfcc391201f initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
4
0cfcc391201f initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
5 eatws <- function(x) gsub("[ \n\t]*","",x)
0cfcc391201f initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
6
0cfcc391201f initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
7 bind1 <- function(symbol, signature, libh, callvm, envir=parent.frame() )
0cfcc391201f initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
8 {
0cfcc391201f initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
9 funcptr <- rdcFind(libh, symbol)
0cfcc391201f initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
10 f <- function(...) NULL
0cfcc391201f initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
11 body(f) <- substitute( dcCall( callvm, funcptr, signature, ... ), list(funcptr=funcptr, signature=signature) )
0cfcc391201f initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
12 assign( symbol, f, envir=envir )
0cfcc391201f initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
13 }
0cfcc391201f initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
14
0cfcc391201f initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
15 rdcBind <- function(libname, sigs, callvm, envir=parent.frame() )
0cfcc391201f initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
16 {
0cfcc391201f initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
17 libh <- rdcLoad(libname)
0cfcc391201f initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
18 sigs <- eatws(sigs)
0cfcc391201f initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
19 sigs <- strsplit(sigs, ";")[[1]]
0cfcc391201f initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
20 sigs <- strsplit(sigs, "\\(")
0cfcc391201f initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
21 for (i in seq(along=sigs)) bind1(sigs[[i]][[1]], sigs[[i]][[2]], libh, callvm, envir )
0cfcc391201f initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
22 }