mirror of https://github.com/swig/swig
96 lines
2.1 KiB
OpenEdge ABL
96 lines
2.1 KiB
OpenEdge ABL
%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.
|
|
it's 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.
|
|
|
|
*/
|
|
#
|
|
%}
|