Fixed bug in typemaps which caused derived_byvalue and rname test cases to fail.
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@9648 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
parent
8b334887e4
commit
e38a14b2df
3 changed files with 72 additions and 13 deletions
|
|
@ -1,6 +1,10 @@
|
||||||
Version 1.3.32 (in progress)
|
Version 1.3.32 (in progress)
|
||||||
============================
|
============================
|
||||||
|
|
||||||
|
02/22/2007: mgossage
|
||||||
|
[Lua] Fixed bug in typemaps which caused derived_byvalue and rname test cases to fail.
|
||||||
|
Updated derived_byvalue.i to explain how to find and fix the problem
|
||||||
|
|
||||||
01/25/2007: wsfulton
|
01/25/2007: wsfulton
|
||||||
Fix #1538522 and #1338527, forward templated class declarations without a
|
Fix #1538522 and #1338527, forward templated class declarations without a
|
||||||
name for the templated class parameters, such as:
|
name for the templated class parameters, such as:
|
||||||
|
|
|
||||||
|
|
@ -31,11 +31,61 @@ struct Bar {
|
||||||
|
|
||||||
if the derived class is deleted, it works again
|
if the derived class is deleted, it works again
|
||||||
|
|
||||||
if the previos Foo::method
|
if the previous Foo::method is deleted, it works again
|
||||||
|
|
||||||
*/
|
*/
|
||||||
struct DerFoo : Foo {
|
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.
|
||||||
|
|
||||||
|
*/
|
||||||
#
|
#
|
||||||
%}
|
%}
|
||||||
|
|
|
||||||
|
|
@ -110,17 +110,13 @@
|
||||||
}
|
}
|
||||||
%}
|
%}
|
||||||
|
|
||||||
/*%typemap(in,checkfn="SWIG_isptrtype") SWIGTYPE*,SWIGTYPE[]
|
// out is simple
|
||||||
%{$1=($1_ltype)SWIG_MustGetPtr(L,$input,$descriptor,0,$argnum,"$symname");%}
|
|
||||||
|
|
||||||
%typemap(in,checkfn="lua_isuserdata") SWIGTYPE&
|
|
||||||
%{$1=($1_ltype)SWIG_MustGetPtr(L,$input,$descriptor,0,$argnum,"$symname");%}
|
|
||||||
*/
|
|
||||||
|
|
||||||
%typemap(out) SWIGTYPE*,SWIGTYPE&
|
%typemap(out) SWIGTYPE*,SWIGTYPE&
|
||||||
%{SWIG_NewPointerObj(L,$1,$descriptor,$owner); SWIG_arg++; %}
|
%{SWIG_NewPointerObj(L,$1,$descriptor,$owner); SWIG_arg++; %}
|
||||||
|
|
||||||
// dynamic casts
|
// dynamic casts
|
||||||
|
// this uses the SWIG_TypeDynamicCast() which relies on RTTI to find out what the pointer really is
|
||||||
|
// the we return it as the correct type
|
||||||
%typemap(out) SWIGTYPE *DYNAMIC,
|
%typemap(out) SWIGTYPE *DYNAMIC,
|
||||||
SWIGTYPE &DYNAMIC
|
SWIGTYPE &DYNAMIC
|
||||||
{
|
{
|
||||||
|
|
@ -130,12 +126,12 @@
|
||||||
|
|
||||||
|
|
||||||
// passing objects by value
|
// passing objects by value
|
||||||
// SWIG expects the object pointer (the $<ype argp)
|
// SWIG_ConvertPtr wants an object pointer (the $<ype argp)
|
||||||
// then dereferences it to get the object
|
// then dereferences it to get the object
|
||||||
%typemap(in,checkfn="lua_isuserdata") SWIGTYPE ($<ype argp)
|
%typemap(in,checkfn="lua_isuserdata") SWIGTYPE ($<ype argp)
|
||||||
%{
|
%{
|
||||||
if (!SWIG_IsOK(SWIG_ConvertPtr(L,$input,(void**)&argp,$&descriptor,0))){
|
if (!SWIG_IsOK(SWIG_ConvertPtr(L,$input,(void**)&argp,$&descriptor,0))){
|
||||||
SWIG_fail_ptr("$symname",$argnum,$descriptor);
|
SWIG_fail_ptr("$symname",$argnum,$&descriptor);
|
||||||
}
|
}
|
||||||
$1 = *argp;
|
$1 = *argp;
|
||||||
%}
|
%}
|
||||||
|
|
@ -143,7 +139,7 @@
|
||||||
// Primitive types--return by value
|
// Primitive types--return by value
|
||||||
// must make a new object, copy the data & return the new object
|
// must make a new object, copy the data & return the new object
|
||||||
// Note: the brackets are {...} and not %{..%}, because we want them to be included in the wrapper
|
// Note: the brackets are {...} and not %{..%}, because we want them to be included in the wrapper
|
||||||
// this is because out tpyemaps do not support local variables, like in typemaps do
|
// this is because typemap(out) does not support local variables, like in typemap(in) does
|
||||||
// and we need the $&1_ltype resultptr; to be declared
|
// and we need the $&1_ltype resultptr; to be declared
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
%typemap(out) SWIGTYPE
|
%typemap(out) SWIGTYPE
|
||||||
|
|
@ -251,7 +247,7 @@ parmeters match which function
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
%typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE, SWIGTYPE & {
|
%typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE & {
|
||||||
void *ptr;
|
void *ptr;
|
||||||
if (lua_isuserdata(L,$input)==0 || SWIG_ConvertPtr(L,$input, (void **) &ptr, $1_descriptor, 0)) {
|
if (lua_isuserdata(L,$input)==0 || SWIG_ConvertPtr(L,$input, (void **) &ptr, $1_descriptor, 0)) {
|
||||||
$1 = 0;
|
$1 = 0;
|
||||||
|
|
@ -260,6 +256,15 @@ parmeters match which function
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
%typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE {
|
||||||
|
void *ptr;
|
||||||
|
if (lua_isuserdata(L,$input)==0 || SWIG_ConvertPtr(L,$input, (void **) &ptr, $&1_descriptor, 0)) {
|
||||||
|
$1 = 0;
|
||||||
|
} else {
|
||||||
|
$1 = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
%typecheck(SWIG_TYPECHECK_VOIDPTR) void * {
|
%typecheck(SWIG_TYPECHECK_VOIDPTR) void * {
|
||||||
void *ptr;
|
void *ptr;
|
||||||
if (SWIG_isptrtype(L,$input)==0 || SWIG_ConvertPtr(L,$input, (void **) &ptr, 0, 0)) {
|
if (SWIG_isptrtype(L,$input)==0 || SWIG_ConvertPtr(L,$input, (void **) &ptr, 0, 0)) {
|
||||||
|
|
@ -314,7 +319,7 @@ SWIG_NUMBER_BY_CONST_REF(long long);
|
||||||
SWIG_NUMBER_BY_CONST_REF(signed long long);
|
SWIG_NUMBER_BY_CONST_REF(signed long long);
|
||||||
SWIG_NUMBER_BY_CONST_REF(unsigned long long);
|
SWIG_NUMBER_BY_CONST_REF(unsigned long long);
|
||||||
|
|
||||||
%apply const unsigned long & { const size_t & };
|
%apply const unsigned long & { const size_t & }; // size_t is the same as unsigned long
|
||||||
|
|
||||||
|
|
||||||
// Also needed for object ptrs by const ref
|
// Also needed for object ptrs by const ref
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue