Performance enhancements

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@182 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
Dave Beazley 2000-02-02 07:03:21 +00:00
commit 3473852cab

View file

@ -220,10 +220,12 @@ SWIG_TypeRegister(_swig_type_info *ti) {
SWIGSTATICRUNTIME(_swig_type_info *) SWIGSTATICRUNTIME(_swig_type_info *)
SWIG_TypeCheck(char *c, _swig_type_info *ty) { SWIG_TypeCheck(char *c, _swig_type_info *ty) {
_swig_type_info *s, *temp2; _swig_type_info *s, *temp2;
char *sn;
if (!ty) return 0; /* Void pointer */ if (!ty) return 0; /* Void pointer */
s = ty->next; /* First element is always just the name */ s = ty->next; /* First element is always just the name */
while (s) { while (s) {
if (strcmp(s->name,c) == 0) { sn = s->name;
if ((c == sn) || ((*c == *sn) && (strcmp(sn,c) == 0))) {
if (s == ty->next) return s; if (s == ty->next) return s;
/* Move s to the top of the linked list */ /* Move s to the top of the linked list */
s->prev->next = s->next; s->prev->next = s->next;
@ -248,15 +250,29 @@ SWIG_ConvertPtr(PyObject *obj, void **ptr, _swig_type_info *ty) {
register int d; register int d;
_swig_type_info *tc; _swig_type_info *tc;
char *c; char *c;
static PyObject *SWIG_this = 0;
if (!obj || (obj == Py_None)) { if (!obj || (obj == Py_None)) {
*ptr = 0; *ptr = 0;
return 0; return 0;
} }
if (!PyString_Check(obj)) { if (!(PyCObject_Check(obj))) {
obj = PyObject_GetAttrString(obj,"this"); if (!SWIG_this)
if ((!obj) || !(PyString_Check(obj))) return -1; SWIG_this = PyString_InternFromString("this");
} obj = PyObject_GetAttr(obj,SWIG_this);
if ((!obj) || !(PyCObject_Check(obj))) goto type_error;
}
*ptr = PyCObject_AsVoidPtr(obj);
c = (char *) PyCObject_GetDesc(obj);
goto cobject;
#ifdef SWIG_STRING_TYPES
if (!(PyString_Check(obj))) {
if (!SWIG_this)
SWIG_this = PyString_InternFromString("this");
obj = PyObject_GetAttr(obj,SWIG_this);
if ((!obj) || !(PyString_Check(obj))) goto type_error;
}
c = PyString_AsString(obj); c = PyString_AsString(obj);
p = 0; p = 0;
/* Pointer values must start with leading underscore */ /* Pointer values must start with leading underscore */
@ -276,20 +292,30 @@ SWIG_ConvertPtr(PyObject *obj, void **ptr, _swig_type_info *ty) {
c++; c++;
} }
*ptr = (void *) p; *ptr = (void *) p;
#endif
cobject:
if (ty) { if (ty) {
tc = SWIG_TypeCheck(c,ty); tc = SWIG_TypeCheck(c,ty);
if (!tc) { if (!tc) goto type_error;
char *temp = (char *) malloc(64+strlen(ty->name));
sprintf(temp,"Type error. Expected %s", ty->name);
PyErr_SetString(PyExc_TypeError, temp);
free((char *) temp);
return -1;
}
if (tc->converter) { if (tc->converter) {
*ptr = (*tc->converter)((void *) p); *ptr = (*tc->converter)((void *) p);
} }
} }
return 0; return 0;
type_error:
{
if (ty) {
char *temp = (char *) malloc(64+strlen(ty->name));
sprintf(temp,"Type error. Expected %s", ty->name);
PyErr_SetString(PyExc_TypeError, temp);
free((char *) temp);
} else {
PyErr_SetString(PyExc_TypeError,"Expected a pointer");
}
return -1;
}
} }
/* Take a pointer and convert it to a string */ /* Take a pointer and convert it to a string */
@ -324,8 +350,9 @@ SWIG_NewPointerObj(void *ptr, _swig_type_info *type) {
Py_INCREF(Py_None); Py_INCREF(Py_None);
return Py_None; return Py_None;
} }
SWIG_MakePtr(result,ptr,type); /* SWIG_MakePtr(result,ptr,type);
robj = PyString_FromString(result); robj = PyString_FromString(result);*/
robj = PyCObject_FromVoidPtrAndDesc((void *) ptr, type->name, NULL);
return robj; return robj;
} }