More performance improvements

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@246 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
Dave Beazley 2000-02-16 17:55:33 +00:00
commit 093f7b7e39
2 changed files with 60 additions and 62 deletions

View file

@ -30,6 +30,8 @@ static char cvsroot[] = "$Header$";
static String *setattr;
static String *getattr;
static String *csetattr;
static String *cgetattr;
static String *pyclass;
static String *imethod;
static String *construct;
@ -65,6 +67,8 @@ void PYTHON::cpp_open_class(char *classname, char *rname, char *ctype, int strip
setattr = new String();
getattr = new String();
csetattr = new String();
cgetattr = new String();
pyclass = new String();
imethod = new String();
construct = new String();
@ -76,8 +80,7 @@ void PYTHON::cpp_open_class(char *classname, char *rname, char *ctype, int strip
// *pyclass << "class " << rname << ":\n";
*setattr << tab4 << "def __setattr__(self,name,value):\n";
*getattr << tab4 << "def __getattr__(self,name):\n";
have_constructor = 0;
have_destructor = 0;
have_getattr = 0;
@ -97,10 +100,22 @@ void PYTHON::cpp_open_class(char *classname, char *rname, char *ctype, int strip
// Build up the hash table
hash.add(real_classname,copy_string(class_name));
sprintf(temp,"%s %s", class_type, real_classname);
hash.add(temp,copy_string(class_name));
if (shadow) {
*setattr << tab4 << "def __setattr__(self,name,value):\n"
<< tab8 << "if (name == \"this\") or (name == \"thisown\"): self.__dict__[name] = value; return\n"
<< tab8 << "method = " << class_name << ".__setmethods__.get(name,None)\n"
<< tab8 << "if method: return method(self,value)\n";
*getattr << tab4 << "def __getattr__(self,name):\n";
*csetattr << tab4 << "__setmethods__ = {\n";
*cgetattr << tab4 << "__getmethods__ = {\n";
}
}
// --------------------------------------------------------------------------
@ -144,7 +159,7 @@ void PYTHON::cpp_member_func(char *name, char *iname, DataType *t, ParmList *l)
have_repr = 1;
if (!((hash.lookup(t->name)) && (t->is_pointer <=1))) {
if (!((hash.lookup(t->name)) && (t->is_pointer <=1)) && !noopt) {
*imethod << class_name << "." << realname << " = new.instancemethod(" << module << "." << name_member(realname,class_name) << ", None, " << class_name << ")\n";
/* *pyclass << tab4 << realname << " = " << module << ".__shadow__." << name_member(realname,class_name) << "\n"; */
} else {
@ -309,18 +324,27 @@ void PYTHON::cpp_close_class() {
}
// *getattr << tab8 << "return self.__dict__[name]\n";
*getattr << tab8 << "method = " << class_name << ".__getmethods__.get(name,None)\n"
<< tab8 << "if method: return method(self)\n";
*getattr << tab8 << "raise AttributeError,name\n";
*setattr << tab8 << "self.__dict__[name] = value\n";
*cgetattr << tab4 << "}\n";
*csetattr << tab4 << "}\n";
ptrclass << *cinit
<< *construct << "\n";
classes << ptrclass
<< *pyclass;
if (have_setattr)
if (have_setattr) {
classes << *csetattr;
classes << *setattr;
if (have_getattr)
}
if (have_getattr) {
classes << *cgetattr;
classes << *getattr;
}
if (!have_repr) {
// Supply a repr method for this class
@ -422,23 +446,18 @@ void PYTHON::cpp_variable(char *name, char *iname, DataType *t) {
if ((hash.lookup(t->name)) && (t->is_pointer <= 1)) inhash = 1;
// Now write some code to set the variable
*setattr << tab8 << "if name == \"" << realname << "\" :\n";
*csetattr << tab8 << "\"" << realname << "\" : " << module << "." << name_set(name_member(realname,class_name)) << ",\n";
if (Status & STAT_READONLY) {
*setattr << tab8 << tab4 << "raise RuntimeError, \'Member is read-only\'\n";
// *setattr << tab8 << tab4 << "raise RuntimeError, \'Member is read-only\'\n";
} else {
if (inhash)
*setattr << tab8 << tab4 << "value.thisown = 0\n";
*setattr << tab8 << tab4 << module << "." << name_set(name_member(realname,class_name)) << "(self,value)\n";
*setattr << tab8 << tab4 << "return\n";
}
// Write some code to get the variable
*getattr << tab8 << "if name == \"" << realname << "\" : \n";
if (inhash) {
*getattr << tab8 << tab4 << "return " << (char *) hash.lookup(t->name) << "Ptr(" << module << "."
<< name_get(name_member(realname,class_name)) << "(self))\n";
*cgetattr << tab8 << "\"" << realname << "\" : lambda x : " << (char *) hash.lookup(t->name) << "Ptr(" << module << "." << name_get(name_member(realname,class_name)) << "(x)),\n";
} else {
*getattr << tab8 << tab4 << "return " << module << "." << name_get(name_member(realname,class_name)) << "(self)\n";
*cgetattr << tab8 << "\"" << realname << "\" : " << module << "." << name_get(name_member(realname,class_name)) << ",\n";
}
}
}

View file

@ -27,6 +27,15 @@ static char cvsroot[] = "$Header$";
#include "swig11.h"
#include "python.h"
struct Method { // Methods list. Needed to build methods
char *name; // Array at very end.
char *function;
int kw;
Method *next;
};
Method *head = 0;
static String const_code;
static String shadow_methods;
@ -35,6 +44,7 @@ Python Options (available with -python)\n\
-globals name - Set name used to access C global variable ('cvar' by default).\n\
-module name - Set module name\n\
-keyword - Use keyword arguments\n\
-noopt - No optimized shadows (pre 1.5.2)\n\
-shadow - Generate shadow classes. \n\n";
static String pragma_include;
@ -76,6 +86,9 @@ void PYTHON::parse_args(int argc, char *argv[]) {
} else if (strcmp(argv[i],"-shadow") == 0) {
shadow = 1;
Swig_mark_arg(i);
} else if (strcmp(argv[i],"-noopt") == 0) {
noopt = 1;
Swig_mark_arg(i);
} else if (strcmp(argv[i],"-keyword") == 0) {
use_kw = 1;
Swig_mark_arg(i);
@ -187,12 +200,12 @@ void PYTHON::import(char *filename) {
}
// ----------------------------------------------------------------------
// PYTHON::add_method(char *name, char *function)
// PYTHON::add_method(char *name, char *function, int kw)
//
// Add some symbols to the methods table
// ----------------------------------------------------------------------
void PYTHON::add_method(char *name, char *function) {
void PYTHON::add_method(char *name, char *function, int kw) {
Method *n;
@ -201,7 +214,7 @@ void PYTHON::add_method(char *name, char *function) {
strcpy(n->name,name);
n->function = new char[strlen(function)+1];
strcpy(n->function, function);
n->kw = kw;
n->next = head;
head = n;
}
@ -219,7 +232,7 @@ void PYTHON::print_methods() {
fprintf(f_wrappers,"static PyMethodDef %sMethods[] = {\n", module);
n = head;
while (n) {
if (!use_kw) {
if (!n->kw) {
fprintf(f_wrappers,"\t { \"%s\", %s, METH_VARARGS },\n", n->name, n->function);
} else {
fprintf(f_wrappers,"\t { \"%s\", (PyCFunction) %s, METH_VARARGS | METH_KEYWORDS },\n", n->name, n->function);
@ -296,7 +309,8 @@ void PYTHON::initialize(void)
}
fprintf(f_shadow,"# This file was created automatically by SWIG.\n");
fprintf(f_shadow,"import %s\n", module);
fprintf(f_shadow,"import new\n");
if (!noopt)
fprintf(f_shadow,"import new\n");
}
// Dump out external module declarations
@ -310,21 +324,7 @@ void PYTHON::initialize(void)
fprintf(f_wrappers,"#ifdef __cplusplus\n");
fprintf(f_wrappers,"extern \"C\" {\n");
fprintf(f_wrappers,"#endif\n");
const_code << "typedef struct { \n"
<< tab4 << "int type;\n"
<< tab4 << "char *name;\n"
<< tab4 << "long lvalue;\n"
<< tab4 << "double dvalue;\n"
<< tab4 << "void *pvalue;\n"
<< tab4 << "_swig_type_info **ptype;\n"
<< "} _swig_const_info;\n";
const_code << "#define SWIG_PY_INT 1\n"
<< "#define SWIG_PY_FLOAT 2\n"
<< "#define SWIG_PY_STRING 3\n"
<< "#define SWIG_PY_POINTER 4\n";
const_code << "static _swig_const_info _swig_const_table[] = {\n";
}
@ -385,7 +385,6 @@ void PYTHON::initialize_cmodule(void)
void PYTHON::close(void)
{
print_methods();
close_cmodule();
if (shadow) {
@ -426,27 +425,7 @@ void PYTHON::close_cmodule(void)
}
#endif
String cinit;
cinit << tab4 << "{\n"
<< tab8 << "int i;\n"
<< tab8 << "for (i = 0; _swig_const_table[i].type; i++) {\n"
<< tab8 << tab4 << "switch(_swig_const_table[i].type) {\n"
<< tab8 << tab4 << "case SWIG_PY_INT:\n"
<< tab8 << tab8 << "PyDict_SetItemString(d,_swig_const_table[i].name, PyInt_FromLong(_swig_const_table[i].lvalue));\n"
<< tab8 << tab8 << "break;\n"
<< tab8 << tab4 << "case SWIG_PY_FLOAT:\n"
<< tab8 << tab8 << "PyDict_SetItemString(d,_swig_const_table[i].name, PyFloat_FromDouble(_swig_const_table[i].dvalue));\n"
<< tab8 << tab8 << "break;\n"
<< tab8 << tab4 << "case SWIG_PY_STRING:\n"
<< tab8 << tab8 << "PyDict_SetItemString(d,_swig_const_table[i].name, PyString_FromString((char *) _swig_const_table[i].pvalue));\n"
<< tab8 << tab8 << "break;\n"
<< tab8 << tab4 << "case SWIG_PY_POINTER:\n"
<< tab8 << tab8 << "PyDict_SetItemString(d,_swig_const_table[i].name, SWIG_NewPointerObj(_swig_const_table[i].pvalue, *(_swig_const_table[i].ptype)));\n"
<< tab8 << tab8 << "break;\n"
<< tab8 << tab4 << "default:\n"
<< tab8 << tab8 << "break;\n"
<< tab8 << tab4 << "}\n"
<< tab8 << "}\n"
<< tab4 << "}\n";
cinit << tab4 << "SWIG_InstallConstants(d,_swig_const_table);\n";
#ifdef SHADOW_METHODS
// Not done yet. If doing shadows, create a bunch of instancemethod objects for use
@ -567,7 +546,7 @@ void PYTHON::create_command(char *cname, char *iname) {
// Now register the function with the interpreter.
add_method(iname, wname);
add_method(iname, wname, use_kw);
}
@ -979,7 +958,7 @@ void PYTHON::create_function(char *name, char *iname, DataType *d, ParmList *l)
// Now register the function with the interpreter.
add_method(iname, wname);
add_method(iname, wname, use_kw);
#ifdef SHADOW_METHODS
if (shadow && (shadow & PYSHADOW_MEMBER)) {
@ -1431,7 +1410,7 @@ char *PYTHON::usage_const(char *iname, DataType *, char *value) {
// -----------------------------------------------------------------------
void PYTHON::add_native(char *name, char *funcname, DataType *, ParmList *) {
add_method(name, funcname);
add_method(name, funcname,0);
if (shadow) {
func << name << " = " << module << "." << name << "\n\n";
}