fix to avoid copies when the wrapper class exists

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@8293 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
Marcelo Matus 2006-01-08 07:08:21 +00:00
commit ab9d75f3c9
2 changed files with 46 additions and 31 deletions

View file

@ -4,8 +4,9 @@ import std_containers
cube = (((1, 2), (3, 4)), ((5, 6), (7, 8))) cube = (((1, 2), (3, 4)), ((5, 6), (7, 8)))
icube = std_containers.cident(cube)
if cube != std_containers.cident(cube): for i in range(0,len(cube)):
if cube[i] != icube[i]:
raise RuntimeError, "bad cident" raise RuntimeError, "bad cident"
@ -14,14 +15,19 @@ if p != std_containers.pident(p):
raise RuntimeError, "bad pident" raise RuntimeError, "bad pident"
v = (1,2,3,4,5,6) v = (1,2,3,4,5,6)
iv = std_containers.vident(v)
if v != std_containers.vident(v): for i in range(0,len(v)):
raise RuntimeError, "bad pident" if v[i] != iv[i]:
raise RuntimeError, "bad vident"
if v != std_containers.videntu(v):
iv = std_containers.videntu(v)
for i in range(0,len(v)):
if v[i] != iv[i]:
raise RuntimeError, "bad videntu" raise RuntimeError, "bad videntu"
vu = std_containers.vector_ui(v) vu = std_containers.vector_ui(v)
if vu[2] != std_containers.videntu(vu)[2]: if vu[2] != std_containers.videntu(vu)[2]:
raise RuntimeError, "bad videntu" raise RuntimeError, "bad videntu"
@ -33,11 +39,18 @@ if v[0:3][1] != vu[0:3][1]:
m = ((1,2,3),(2,3),(3,4)) m = ((1,2,3),(2,3),(3,4))
if m != std_containers.midenti(m): im = std_containers.midenti(m)
for i in range(0,len(m)):
for j in range(0,len(m[i])):
if m[i][j] != im[i][j]:
raise RuntimeError, "bad getslice" raise RuntimeError, "bad getslice"
mb = ((1,0,1),(1,1),(1,1)) m = ((1,0,1),(1,1),(1,1))
if mb != std_containers.midentb(mb): im = std_containers.midentb(m)
for i in range(0,len(m)):
for j in range(0,len(m[i])):
if m[i][j] != im[i][j]:
raise RuntimeError, "bad getslice" raise RuntimeError, "bad getslice"
@ -52,7 +65,9 @@ map['hello'] = 1
map['hi'] = 2 map['hi'] = 2
map['3'] = 2 map['3'] = 2
if map != std_containers.mapident(map): imap = std_containers.mapident(map)
for k in map:
if map[k] != imap[k]:
raise RuntimeError, "bad map" raise RuntimeError, "bad map"

View file

@ -717,10 +717,6 @@ namespace swig {
return SWIG_OLDOBJ; return SWIG_OLDOBJ;
} }
} }
if (seq) {
PyErr_Format(PyExc_TypeError, "a %s is expected",
swig::type_name<sequence>());
}
return SWIG_ERROR; return SWIG_ERROR;
} }
}; };
@ -733,6 +729,10 @@ namespace swig {
typedef typename sequence::const_iterator const_iterator; typedef typename sequence::const_iterator const_iterator;
static PyObject *from(const sequence& seq) { static PyObject *from(const sequence& seq) {
swig_type_info *desc = swig::type_info<sequence>();
if (desc && desc->clientdata) {
return SWIG_NewPointerObj(new sequence(seq), desc, SWIG_POINTER_OWN);
} else {
size_type size = seq.size(); size_type size = seq.size();
if (size <= (size_type)INT_MAX) { if (size <= (size_type)INT_MAX) {
PyObject *obj = PyTuple_New((int)size); PyObject *obj = PyTuple_New((int)size);
@ -743,11 +743,11 @@ namespace swig {
} }
return obj; return obj;
} else { } else {
PyErr_SetString(PyExc_OverflowError, PyErr_SetString(PyExc_OverflowError,"sequence size not valid in python");
"sequence size not valid in python");
return NULL; return NULL;
} }
} }
}
}; };
} }
} }