annotate R/rdyncall/R/dyncall.R @ 62:4a9f6c7c09c1 default tip

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