0
|
1 # Package: rdyncall
|
|
2 # File: R/dyncall.R
|
|
3 # Description: dyncall bindings for R
|
|
4
|
|
5 # ----------------------------------------------------------------------------
|
|
6 # call vm alloc/free (internal)
|
|
7
|
|
8 new.callvm <- function(
|
|
9 callmode = c(
|
|
10 "cdecl",
|
|
11 "stdcall",
|
|
12 "thiscall","thiscall.gcc","thiscall.msvc",
|
|
13 "fastcall","fastcall.gcc","fastcall.msvc")
|
|
14 , size = 4096 )
|
|
15 {
|
|
16 callmode <- match.arg(callmode)
|
|
17 x <- .Call("new_callvm", callmode, as.integer(size), PACKAGE="rdyncall")
|
|
18 reg.finalizer(x, free.callvm)
|
|
19 return(x)
|
|
20 }
|
|
21
|
|
22 free.callvm <- function(x)
|
|
23 {
|
|
24 .Call("free_callvm", x, PACKAGE="rdyncall")
|
|
25 }
|
|
26
|
|
27 # ----------------------------------------------------------------------------
|
|
28 # CallVM's for calling conventions - will be initialized .onLoad
|
|
29
|
|
30 callvm.default <- callvm.cdecl <- NULL
|
|
31 callvm.stdcall <- NULL
|
|
32 callvm.thiscall <- NULL
|
|
33 callvm.thiscall.gcc <- NULL
|
|
34 callvm.thiscall.msvc <- NULL
|
|
35 callvm.fastcall <- NULL
|
|
36 callvm.fastcall.gcc <- NULL
|
|
37 callvm.fastcall.msvc <- NULL
|
|
38
|
|
39 # ----------------------------------------------------------------------------
|
|
40 # public interface
|
|
41
|
|
42 .dyncall <- function( address, signature, ... , callmode = "default" )
|
|
43 {
|
|
44 callvm <- switch(callmode,
|
|
45 default=callvm.default,
|
|
46 cdecl=callvm.cdecl,
|
|
47 stdcall=callvm.stdcall,
|
|
48 thiscall=,thiscall.gcc=callvm.thiscall.gcc, thiscall.msvc=callvm.thiscall.msvc,
|
|
49 fastcall=,fastcall.gcc=callvm.fastcall.gcc, fastcall.msvc=callvm.fastcall.msvc)
|
|
50 .External("dyncall", callvm, address, signature, ..., PACKAGE="rdyncall")
|
|
51 }
|
|
52
|
|
53 .dyncall.cdecl <- function( address, signature, ... ) .External("dyncall", callvm.cdecl, address, signature, ..., PACKAGE="rdyncall")
|
|
54 .dyncall.default <- function( address, signature, ... ) .External("dyncall", callvm.default, address, signature, ..., PACKAGE="rdyncall")
|
|
55 .dyncall.stdcall <- function( address, signature, ... ) .External("dyncall", callvm.stdcall, address, signature, ..., PACKAGE="rdyncall")
|
|
56 .dyncall.thiscall.gcc <- function( address, signature, ... ) .External("dyncall", callvm.thiscall.gcc, address, signature, ..., PACKAGE="rdyncall")
|
|
57 .dyncall.thiscall.msvc <- function( address, signature, ... ) .External("dyncall", callvm.thiscall.msvc, address, signature, ..., PACKAGE="rdyncall")
|
|
58 .dyncall.fastcall.gcc <- function( address, signature, ... ) .External("dyncall", callvm.fastcall.gcc, address, signature, ..., PACKAGE="rdyncall")
|
|
59 .dyncall.fastcall.msvc <- function( address, signature, ... ) .External("dyncall", callvm.fastcall.msvc, address, signature, ..., PACKAGE="rdyncall")
|
|
60
|
|
61 .dyncall.thiscall <- .dyncall.thiscall.gcc
|
|
62 .dyncall.fastcall <- .dyncall.fastcall.gcc
|
|
63
|
|
64 # ----------------------------------------------------------------------------
|
|
65 # initialize callvm's on load
|
|
66
|
|
67 .onLoad <- function(libname,pkgname)
|
|
68 {
|
|
69 callvm.cdecl <<- new.callvm("cdecl")
|
|
70 callvm.default <<- callvm.cdecl
|
|
71 callvm.stdcall <<- new.callvm("stdcall")
|
|
72 callvm.thiscall <<- new.callvm("thiscall")
|
|
73 callvm.thiscall.gcc <<- new.callvm("thiscall.gcc")
|
|
74 callvm.thiscall.msvc <<- new.callvm("thiscall.msvc")
|
|
75 callvm.fastcall <<- new.callvm("fastcall")
|
|
76 callvm.fastcall.gcc <<- new.callvm("fastcall.gcc")
|
|
77 callvm.fastcall.msvc <<- new.callvm("fastcall.msvc")
|
|
78 }
|