1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
|
SWIG TO-DO
-----------------------------------------------------------------------------
**** = High Priority
*** = Implement if possible.
** = Will implement if time.
* = Implement if bored (or deemed necessary).
defer = Implement in next version
CORE:
**** Add support for nested classes. The type system should be
defer ready to go. The primary obstacle lies in the target language
modules (which were never programmed with nested classes in
mind). There are also issues with nested C structures. For
example:
struct Foo {
struct {
int x,y;
} z;
};
This is one of the last remaining "hard" problems in the SWIG
core, but it is important that we solve it.
*** "Nested" typemaps. The basic idea is similar to allowing one to
use $descriptor(T) for any T, rather than just $descriptor
for the type currently being typemapped.
In short (ha!), given a previously defined typemap:
%typemap(in) Foo {
// whatever it takes to initialize $1 from $input
}
it would be possible to inline its code inside another typemap.
While the syntax is still to be defined, the use would be
along the lines of:
template <class T> class vector {
%typemap(in) vector<T> {
...
for (int i=0; i<N; i++) {
PyObject* x = ... // i-th element
$typemap(in, T, x, $1[i]);
}
...
}
...
}
i.e., when $typemap(in,Foo,x,y) is encountered, it will
be replaced by the code for %typemap(in) Foo; in the latter,
x will be replaced for $input and y will be replaced for $1.
As in the case above, x and y themselves might need to be
expanded before or after being substituted in the typemap code.
Also, $typemap(what,Foo,x,y,z,...) will be used in case of
multi-arguments typemaps. The same will hold for "out" typemaps
and all the others.
Comment by mkoeppe:
I think we need to be careful to keep the syntax readable.
I would like to get a syntax that is close to that of
typemap definitions. So consider this typemap:
%typemap(in) int { ... }
I would like to refer to this typemap like this:
$typemap(in, input=x) int = foo;
Here $input would be replaced by the given keyword argument
x, and $1 would be replaced by foo.
This syntax would extend easily to multi-typemaps:
%typemap(in) ( int FIRST, double SECOND ) { ... }
-> $typemap(in, input=x)
( int FIRST = foo, double SECOND = bar );
The advantage of this syntax would be that the formal
arguments (int FIRST, double SECOND) are close to the
actual arguments (foo, bar).
Comment by beazley
$typemap(in, input=x) int = foo;
is a little bit hard to parse in terms of variable substitution.
I'm considering something like this:
$typemap(in,1=int foo, input=x)
Note: This is partially implemented in the new Unified Typemap
Library(python,tcl,ruby and perl) via %fragments and the
SWIG_From/SWIG_AsVal methdos.
*** Implement $fail special variable substitution in wrappers. Used
to properly transfer control out of a wrapper function while
reclaiming resources.
Note: Implemented in languages that uses the UTL via the
'SWIG_fail' macro.
*** Rewrite declaration annotation to better unify %rename and related
directives. Add a selector mechanism that allows specific parse tree
nodes to be identified. For example:
%feature("foo", nodetype="class") Foo { ... some code ... };
Consider use of wildcards. Namespace/nested scope support in
%feature is currently weak. It works, but is fragile. Consider
an implementation that is better integrated with symbol table
management. Continue to consolidate SWIG directives to %feature.
Note: Initial implementation in the %rename directive.
*** Add more intelligent information related to object ownership.
SWIG should be able to automatically strip ownership from
objects when they are assigned to pointer variables and structure
members as well as stored in a container (i.e., an array of pointers).
[ Partially finished for Ruby/Perl/Tcl/Python. ]
** Restoration of the documentation system.
[ Partially done for Python. ]
** Restoration of Objective-C support.
** Unification of symbol tables and type system scopes. In a sense
they capture the same information so it is not necessary to have
both. The existence of two symbol management systems is mostly
historical.
Build
-----
Library
-------
**** Add more support for the C++ standard library. std::complex and other
core datatypes. Refine support for STL vector. Add more STL objects.
[ Partially finished for Python. ]
**** Continue to expand the set of recognized typemaps.
Windows
-------
All language modules
--------------------
Python
------
*** Ability to wrap certain classes as Python built-in types.
Perl
----
**** Rewrite runtime pointer type checking to better integrate
shadow classes. Creation of shadow classes should be done
in C instead of Perl. This will fix a number of problems
related to typemaps and reduce the amount of Perl wrapper code.
**** Create tests for existing support for operator overloading
Tcl
---
Ruby
----
**** The "Resource Management in Proxies" section of the "SWIG and C++"
chapter discusses how proxies' ownership of their associated C++
object can change, and the use of the special disown() and
acquire() methods to change this ownership status. Need to
address this for Ruby as well.
*** Add support for keyword arguments (by collecting them in a hash?).
Java
----
C#
--
PHP
---
**** Look at moving to using the UTL.
** When returning wrapped objects via alternate constructors if that
pointer value already exists "out there" as a resource we should
use the same resource, we can't have multiple ref-counted resources
mapping to the same object in case it gets twice destroyed. And check
if ref count destroying is even working, see smart_pointer_rename
* Work out how classes without even inherited constructors should
interact with the php "new <class>" notation.
See: abstract_inherit_wrap.cpptest
** Look at pass by point and passby ref,
Make sometype** to be auto allocated
Make sometype& and sometype* to be autoallocated IF THEY ARE NOT
ALREADY swigtype wrapped.
* Review to see what else is missing!
Guile
-----
** Maybe rename slot setters from CLASS-SLOT-set to CLASS-SLOT-set!
to match Scheme convention for naming of mutators.
** Support keyword args.
** Director Support!
** Cleaner handling of multiple values.
Use a typemap keyword argument "numoutputs" of "out" and
"argout" to indicate how many values are returned.
** Make SWIG's types first-class by using a separate smob type for
SWIG type descriptors; enable reflection on types. (Maybe
GOOPS metaclasses?)
** Provide a clean way to construct type predicates.
** In GOOPS mode, maybe make overloaded functions methods.
** Increase the safety of destructor functions. John Lenz suggests:
I think the best way of doing this would be to use %feature to mark
which classes allow for "normal" <swig> smobs to be deleted explicitly.
We separate pointers into two classes, those that can be deleted from
scheme and those that can't. The pointers that can be deleted use the
<collectable-swig> smob and those that can not be deleted use the
<swig> smob. A user can specify which type of each object they want
with %newobject and the CONSUMED typemap.
By default, the exported destructor will only accept <collectable-swig>
smobs, because by definition, collectable-swig smobs are those that can
be deleted from scheme. This allows for the user to implement
protection. In the interface file, the user has complete control over
which objects can and can not be deleted, and can guarantee that
objects that should not be deleted can not be deleted, and that objects
that should eventually be deleted will be garbage collected.
This protection can then be overridden with a %feature directive,
something like
%feature("guile_allow_destroy_all","1") Foo::~Foo;
I don't know what word we want to use, guile_allow_destroy_all is kinda
bad. This feature would then allow for a <swig Foo *> smob to be
deleted by passing it to the destructor. This would allow users to
maintain the protection on other classes, only manually overriding the
protection on the classes that need it.
Mzscheme
--------
** Port list-vector.i and pointer-in-out.i from Guile.
** Add shadow class support for the Swindle system.
Pike
----
* Decide how to handle global variables (probably using something
like the Python module's cvar). Affects Examples/pike/simple.
* Decide how to handle static class member functions and member
variables.
* Should investigate the possibility of generating .cmod files
in addition to straight C/C++ code for extensions.
Common Lisp
-----------
* Random thoughts by mkoeppe on supporting Common Lisp implementations:
There are many different Foreign Function Interfaces (FFI) for
the various CL implementations. Probably SWIG should interface
to UFFI, a least-common-denominator FFI that supports many
implementations.
Via the s-expression SWIG module we can export SWIG's parse
tree and import it into CL. It remains to check if all
relevant information is dumped (for instance, the type
information). Experimental code is available to generate
low-level UFFI declarations from this parse tree.
However, for wrapping C++, we also need to create C wrappers
because most FFIs cannot directly import C++. A CL SWIG module
could be exporting both these wrappers and UFFI declarations.
I have experimental code (not checked in yet) that does this.
This is fine for generating low-level wrappers. But how do we
support user typemaps (like converting lists and vectors to C
arrays on input)? We have to generate Lisp code that does the
conversion and then calls the low-level wrapper. If we
generate Lisp code, it should be beautiful and readable.
Therefore, we need at least a Lisp pretty printer. A Lisp
pretty printer works best when the Lisp program is represented
not as text but as Lisp data. Moreover, typemap writers will
feel very much constrained by SWIG's capabilities for
generating wrapper code, when compared to writing Lisp macros.
Thus we would need half a re-implementation of Lisp in SWIG to
make users happy.
The solution could be the following:
** Build a SWIG library (again) and load it into a Common Lisp
implementation.
The FFI declarations could be written manually, or this could
be bootstrapped via the s-expression module or the primitive
UFFI wrappers. This should be easy because SWIG's API is quite
simple.
The embedded SWIG would be driven by a CL program. High-level
typemaps would be written as Lisp programs that generate Lisp
code.
ALLEGROCL
-----
These first three will remove most of the warnings from most of the
remaining checkpartial tests that are failing.
**** Throws typemap support
**** const typemaps
**** long long typemaps
Ocaml
-----
** I've been working with my camlp4 module and type information
from the compiler. When I'm done, the user will have access
to type inference when writing code, when the inference is
unambiguous. This allows the user to write x = _foo 1.0
instead of x = get_float (_foo (C_float 1.0)). It's not as
easy as it sounds, because O'caml doesn't keep type information
at run time, and doesn't really have a mechanism for doing what
I need. However, it's possible to write a preprocessor that
inserts correct type info at compile time.
That having been said, the program must compile for type info
to be available, so I need to attend to a lot of details; The
program must compile both with and without type augmentation.
Xml
---
Documentation
-------------
**** Extending SWIG (and internals).
*** Perl, Python, Tcl modules.
*** add section for Perl module support for operator overloading
|