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
|
%module derived_byvalue
#ifdef SWIGOCAML
%warnfilter(SWIGWARN_PARSE_KEYWORD) method;
#endif
%inline %{
struct Foo {
int x;
// this works
int rmethod(const Foo& f) { return f.x; }
// this doesn't when DerFoo (below) is introduced
int method(Foo f) { return f.x; }
};
struct Bar {
Foo a;
struct Foo b;
};
/*
When the next derived class is declared, the
following bad method is generated
static void *_DerFooTo_Foo(void *x) { // **** bad ****
return (void *)((Foo) ((DerFoo) x));
}
static void *_p_DerFooTo_p_Foo(void *x) { // *** good ***
return (void *)((Foo *) ((DerFoo *) x));
}
if the derived class is deleted, it works again
if the previous Foo::method is deleted, it works again
*/
struct DerFoo : Foo {
};
/*
The problem is caused by accidentally remembering a object value type
instead of an object pointer type.
During the course of SWIGing a file, several calls to SwigType_remember()
or SwigType_remember_clientdata() will be made.
When the SwigType_emit_type_table() function is called it emits all the
type conversion functions.
If a object type exists in the SwigType table, you get this error.
You can view the SwigType table, with a #define DEBUG at the top of
Source/Swig/typesys.c
When run you get an output like this:
---r_mangled---
Hash {
'_p_Bar' : Hash {
'p.Bar' : _p_Bar,
}
,
'_p_DerFoo' : Hash {
'p.DerFoo' : _p_DerFoo,
}
,
'_p_Foo' : Hash {
'r.Foo' : _p_Foo,
'p.Foo' : _p_Foo,
}
,
'_Foo' : Hash {
'Foo' : _Foo,
}
,
}
....
The last field ('_Foo') is an object type and caused the error.
It can be fixed either by checking all the calls to SwigType_remember()
and by checking the typemaps.
The typemap code also calls SwigType_remember(), if your typemaps
defined an object type, it will be added into the SwigType table.
its normally a
SWIG_ConvertPtr(....$descriptor...)
when it should have been a $&descriptor or $*descriptor
Commenting out all your object typemaps (and typecheck fns) may help
isolate it.
*/
#
%}
|