15PyMethodDef MethodTable::method(
const char* method_name, PyCFunction f,
int flags,
const char* doc )
18 m.ml_name =
const_cast<char*
>( method_name );
21 m.ml_doc =
const_cast<char*
>( doc );
25MethodTable::MethodTable()
27 t.push_back( method( 0, 0, 0, 0 ) );
31MethodTable::~MethodTable()
36void MethodTable::add(
const char* method_name, PyCFunction f,
const char* doc,
int flag )
40 t.insert( t.end()-1, method( method_name, f, flag, doc ) );
44 throw RuntimeError(
"Too late to add a module method!" );
48PyMethodDef* MethodTable::table()
52 int t1size = t.size();
53 mt =
new PyMethodDef[t1size];
55 for( std::vector<PyMethodDef>::iterator i = t.begin(); i != t.end(); i++ )
68ExtensionModuleBase::ExtensionModuleBase(
const char *name )
70 , full_module_name( __Py_PackageContext() != NULL ? std::string( __Py_PackageContext() ) : module_name )
74ExtensionModuleBase::~ExtensionModuleBase()
77const std::string &ExtensionModuleBase::name()
const
82const std::string &ExtensionModuleBase::fullName()
const
84 return full_module_name;
87class ExtensionModuleBasePtr :
public PythonExtension<ExtensionModuleBasePtr>
90 ExtensionModuleBasePtr( ExtensionModuleBase *_module )
93 virtual ~ExtensionModuleBasePtr()
96 ExtensionModuleBase *
module;
100void ExtensionModuleBase::initialize(
const char *module_doc )
102 PyObject *module_ptr =
new ExtensionModuleBasePtr(
this );
106 const_cast<char *
>( module_name.c_str() ),
107 method_table.table(),
108 const_cast<char *
>( module_doc ),
114Py::Module ExtensionModuleBase::module(
void)
const
116 return Module( full_module_name );
119Py::Dict ExtensionModuleBase::moduleDictionary(
void)
const
121 return module().getDict();
134 static void standard_dealloc(PyObject* p);
139 static int print_handler (PyObject*, FILE *,
int);
140 static PyObject* getattr_handler (PyObject*,
char*);
141 static int setattr_handler (PyObject*,
char*, PyObject*);
142 static PyObject* getattro_handler (PyObject*, PyObject*);
143 static int setattro_handler (PyObject*, PyObject*, PyObject*);
144 static int compare_handler (PyObject*, PyObject*);
145 static PyObject* repr_handler (PyObject*);
146 static PyObject* str_handler (PyObject*);
147 static long hash_handler (PyObject*);
148 static PyObject* call_handler (PyObject*, PyObject*, PyObject*);
150#if PY_VERSION_HEX < 0x02050000
151 typedef int Py_ssize_t;
154 static Py_ssize_t sequence_length_handler(PyObject*);
155 static PyObject* sequence_concat_handler(PyObject*,PyObject*);
156 static PyObject* sequence_repeat_handler(PyObject*, Py_ssize_t);
157 static PyObject* sequence_item_handler(PyObject*, Py_ssize_t);
158 static PyObject* sequence_slice_handler(PyObject*, Py_ssize_t, Py_ssize_t);
159 static int sequence_ass_item_handler(PyObject*, Py_ssize_t, PyObject*);
160 static int sequence_ass_slice_handler(PyObject*, Py_ssize_t, Py_ssize_t, PyObject*);
162 static Py_ssize_t mapping_length_handler(PyObject*);
163 static PyObject* mapping_subscript_handler(PyObject*, PyObject*);
164 static int mapping_ass_subscript_handler(PyObject*, PyObject*, PyObject*);
167 static int number_nonzero_handler (PyObject*);
168 static PyObject* number_negative_handler (PyObject*);
169 static PyObject* number_positive_handler (PyObject*);
170 static PyObject* number_absolute_handler (PyObject*);
171 static PyObject* number_invert_handler (PyObject*);
172 static PyObject* number_int_handler (PyObject*);
173 static PyObject* number_float_handler (PyObject*);
174 static PyObject* number_long_handler (PyObject*);
175 static PyObject* number_oct_handler (PyObject*);
176 static PyObject* number_hex_handler (PyObject*);
177 static PyObject* number_add_handler (PyObject*, PyObject*);
178 static PyObject* number_subtract_handler (PyObject*, PyObject*);
179 static PyObject* number_multiply_handler (PyObject*, PyObject*);
180 static PyObject* number_divide_handler (PyObject*, PyObject*);
181 static PyObject* number_remainder_handler (PyObject*, PyObject*);
182 static PyObject* number_divmod_handler (PyObject*, PyObject*);
183 static PyObject* number_lshift_handler (PyObject*, PyObject*);
184 static PyObject* number_rshift_handler (PyObject*, PyObject*);
185 static PyObject* number_and_handler (PyObject*, PyObject*);
186 static PyObject* number_xor_handler (PyObject*, PyObject*);
187 static PyObject* number_or_handler (PyObject*, PyObject*);
188 static PyObject* number_power_handler(PyObject*, PyObject*, PyObject*);
191 static Py_ssize_t buffer_getreadbuffer_handler (PyObject*, Py_ssize_t,
void**);
192 static Py_ssize_t buffer_getwritebuffer_handler (PyObject*, Py_ssize_t,
void**);
193 static Py_ssize_t buffer_getsegcount_handler (PyObject*, Py_ssize_t*);
197extern "C" void standard_dealloc( PyObject* p )
202void PythonType::supportSequenceType()
204 if( !sequence_table )
206 sequence_table =
new PySequenceMethods;
207 table->tp_as_sequence = sequence_table;
208 sequence_table->sq_length = sequence_length_handler;
209 sequence_table->sq_concat = sequence_concat_handler;
210 sequence_table->sq_repeat = sequence_repeat_handler;
211 sequence_table->sq_item = sequence_item_handler;
212 sequence_table->sq_slice = sequence_slice_handler;
214 sequence_table->sq_ass_item = sequence_ass_item_handler;
215 sequence_table->sq_ass_slice = sequence_ass_slice_handler;
219void PythonType::supportMappingType()
223 mapping_table =
new PyMappingMethods;
224 table->tp_as_mapping = mapping_table;
225 mapping_table->mp_length = mapping_length_handler;
226 mapping_table->mp_subscript = mapping_subscript_handler;
227 mapping_table->mp_ass_subscript = mapping_ass_subscript_handler;
231void PythonType::supportNumberType()
235 number_table =
new PyNumberMethods;
236 table->tp_as_number = number_table;
237 number_table->nb_add = number_add_handler;
238 number_table->nb_subtract = number_subtract_handler;
239 number_table->nb_multiply = number_multiply_handler;
240 number_table->nb_divide = number_divide_handler;
241 number_table->nb_remainder = number_remainder_handler;
242 number_table->nb_divmod = number_divmod_handler;
243 number_table->nb_power = number_power_handler;
244 number_table->nb_negative = number_negative_handler;
245 number_table->nb_positive = number_positive_handler;
246 number_table->nb_absolute = number_absolute_handler;
247 number_table->nb_nonzero = number_nonzero_handler;
248 number_table->nb_invert = number_invert_handler;
249 number_table->nb_lshift = number_lshift_handler;
250 number_table->nb_rshift = number_rshift_handler;
251 number_table->nb_and = number_and_handler;
252 number_table->nb_xor = number_xor_handler;
253 number_table->nb_or = number_or_handler;
254 number_table->nb_coerce = 0;
255 number_table->nb_int = number_int_handler;
256 number_table->nb_long = number_long_handler;
257 number_table->nb_float = number_float_handler;
258 number_table->nb_oct = number_oct_handler;
259 number_table->nb_hex = number_hex_handler;
263void PythonType::supportBufferType()
267 buffer_table =
new PyBufferProcs;
268 table->tp_as_buffer = buffer_table;
269 buffer_table->bf_getreadbuffer = buffer_getreadbuffer_handler;
270 buffer_table->bf_getwritebuffer = buffer_getwritebuffer_handler;
271 buffer_table->bf_getsegcount = buffer_getsegcount_handler;
278PythonType::PythonType(
size_t basic_size,
int itemsize,
const char *default_name )
279 : table( new PyTypeObject )
280 , sequence_table( NULL )
281 , mapping_table( NULL )
282 , number_table( NULL )
283 , buffer_table( NULL )
285 *
reinterpret_cast<PyObject*
>( table ) = py_object_initializer;
286 table->ob_type = _Type_Type();
288 table->tp_name =
const_cast<char *
>( default_name );
289 table->tp_basicsize = basic_size;
290 table->tp_itemsize = itemsize;
291 table->tp_dealloc = ( destructor ) standard_dealloc;
293 table->tp_getattr = 0;
294 table->tp_setattr = 0;
295 table->tp_compare = 0;
297 table->tp_as_number = 0;
298 table->tp_as_sequence = 0;
299 table->tp_as_mapping = 0;
303 table->tp_getattro = 0;
304 table->tp_setattro = 0;
305 table->tp_as_buffer = 0;
306 table->tp_flags = 0L;
308#if PY_MAJOR_VERSION > 2 || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION >= 0)
310 table->tp_traverse = 0L;
311 table->tp_clear = 0L;
316#if PY_MAJOR_VERSION > 2 || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION >= 1)
318 table->tp_richcompare = 0L;
319 table->tp_weaklistoffset = 0L;
328 table->tp_maxalloc = 0;
333PythonType::~PythonType( )
336 delete sequence_table;
337 delete mapping_table;
342PyTypeObject* PythonType::type_object( )
const
345void PythonType::name(
const char* nam )
347 table->tp_name =
const_cast<char *
>( nam );
350const char *PythonType::getName()
const
352 return table->tp_name;
355void PythonType::doc(
const char* d )
357 table->tp_doc =
const_cast<char *
>( d );
360const char *PythonType::getDoc()
const
362 return table->tp_doc;
365void PythonType::dealloc(
void( *f )( PyObject* ))
367 table->tp_dealloc = f;
370void PythonType::supportPrint()
372 table->tp_print = print_handler;
375void PythonType::supportGetattr()
377 table->tp_getattr = getattr_handler;
380void PythonType::supportSetattr()
382 table->tp_setattr = setattr_handler;
385void PythonType::supportGetattro()
387 table->tp_getattro = getattro_handler;
390void PythonType::supportSetattro()
392 table->tp_setattro = setattro_handler;
395void PythonType::supportCompare()
397 table->tp_compare = compare_handler;
400void PythonType::supportRepr()
402 table->tp_repr = repr_handler;
405void PythonType::supportStr()
407 table->tp_str = str_handler;
410void PythonType::supportHash()
412 table->tp_hash = hash_handler;
415void PythonType::supportCall()
417 table->tp_call = call_handler;
425extern "C" int print_handler( PyObject *self, FILE *fp,
int flags )
429 PythonExtensionBase *p =
static_cast<PythonExtensionBase *
>( self );
430 return p->print( fp, flags );
432 catch( Py::Exception & )
438extern "C" PyObject* getattr_handler( PyObject *self,
char *name )
442 PythonExtensionBase *p =
static_cast<PythonExtensionBase *
>( self );
443 return new_reference_to( p->getattr( name ) );
445 catch( Py::Exception & )
451extern "C" int setattr_handler( PyObject *self,
char *name, PyObject *value )
455 PythonExtensionBase *p =
static_cast<PythonExtensionBase *
>( self );
456 return p->setattr( name, Py::Object( value ) );
458 catch( Py::Exception & )
464extern "C" PyObject* getattro_handler( PyObject *self, PyObject *name )
468 PythonExtensionBase *p =
static_cast<PythonExtensionBase *
>( self );
469 return new_reference_to( p->getattro( Py::Object( name ) ) );
471 catch( Py::Exception & )
477extern "C" int setattro_handler( PyObject *self, PyObject *name, PyObject *value )
481 PythonExtensionBase *p =
static_cast<PythonExtensionBase *
>( self );
482 return p->setattro( Py::Object( name ), Py::Object( value ) );
484 catch( Py::Exception & )
490extern "C" int compare_handler( PyObject *self, PyObject *other )
494 PythonExtensionBase *p =
static_cast<PythonExtensionBase *
>( self );
495 return p->compare( Py::Object( other ) );
497 catch( Py::Exception & )
503extern "C" PyObject* repr_handler( PyObject *self )
507 PythonExtensionBase *p =
static_cast<PythonExtensionBase *
>( self );
508 return new_reference_to( p->repr() );
510 catch( Py::Exception & )
516extern "C" PyObject* str_handler( PyObject *self )
520 PythonExtensionBase *p =
static_cast<PythonExtensionBase *
>( self );
521 return new_reference_to( p->str() );
523 catch( Py::Exception & )
529extern "C" long hash_handler( PyObject *self )
533 PythonExtensionBase *p =
static_cast<PythonExtensionBase *
>( self );
536 catch( Py::Exception & )
542extern "C" PyObject* call_handler( PyObject *self, PyObject *args, PyObject *kw )
546 PythonExtensionBase *p =
static_cast<PythonExtensionBase *
>( self );
547 return new_reference_to( p->call( Py::Object( args ), Py::Object( kw ) ) );
549 return new_reference_to( p->call( Py::Object( args ), Py::Object( kw ) ) );
551 return new_reference_to( p->call( Py::Object( args ), Py::Object() ) );
553 catch( Py::Exception & )
561extern "C" Py_ssize_t sequence_length_handler( PyObject *self )
565 PythonExtensionBase *p =
static_cast<PythonExtensionBase *
>( self );
566 return p->sequence_length();
568 catch( Py::Exception & )
574extern "C" PyObject* sequence_concat_handler( PyObject *self, PyObject *other )
578 PythonExtensionBase *p =
static_cast<PythonExtensionBase *
>( self );
579 return new_reference_to( p->sequence_concat( Py::Object( other ) ) );
581 catch( Py::Exception & )
587extern "C" PyObject* sequence_repeat_handler( PyObject *self, Py_ssize_t count )
591 PythonExtensionBase *p =
static_cast<PythonExtensionBase *
>( self );
592 return new_reference_to( p->sequence_repeat( count ) );
594 catch( Py::Exception & )
600extern "C" PyObject* sequence_item_handler( PyObject *self, Py_ssize_t index )
604 PythonExtensionBase *p =
static_cast<PythonExtensionBase *
>( self );
605 return new_reference_to( p->sequence_item( index ) );
607 catch( Py::Exception & )
613extern "C" PyObject* sequence_slice_handler( PyObject *self, Py_ssize_t first, Py_ssize_t last )
617 PythonExtensionBase *p =
static_cast<PythonExtensionBase *
>( self );
618 return new_reference_to( p->sequence_slice( first, last ) );
620 catch( Py::Exception & )
626extern "C" int sequence_ass_item_handler( PyObject *self, Py_ssize_t index, PyObject *value )
630 PythonExtensionBase *p =
static_cast<PythonExtensionBase *
>( self );
631 return p->sequence_ass_item( index, Py::Object( value ) );
633 catch( Py::Exception & )
639extern "C" int sequence_ass_slice_handler( PyObject *self, Py_ssize_t first, Py_ssize_t last, PyObject *value )
643 PythonExtensionBase *p =
static_cast<PythonExtensionBase *
>( self );
644 return p->sequence_ass_slice( first, last, Py::Object( value ) );
646 catch( Py::Exception & )
653extern "C" Py_ssize_t mapping_length_handler( PyObject *self )
657 PythonExtensionBase *p =
static_cast<PythonExtensionBase *
>( self );
658 return p->mapping_length();
660 catch( Py::Exception & )
666extern "C" PyObject* mapping_subscript_handler( PyObject *self, PyObject *key )
670 PythonExtensionBase *p =
static_cast<PythonExtensionBase *
>( self );
671 return new_reference_to( p->mapping_subscript( Py::Object( key ) ) );
673 catch( Py::Exception & )
679extern "C" int mapping_ass_subscript_handler( PyObject *self, PyObject *key, PyObject *value )
683 PythonExtensionBase *p =
static_cast<PythonExtensionBase *
>( self );
684 return p->mapping_ass_subscript( Py::Object( key ), Py::Object( value ) );
686 catch( Py::Exception & )
693extern "C" int number_nonzero_handler( PyObject *self )
697 PythonExtensionBase *p =
static_cast<PythonExtensionBase *
>( self );
698 return p->number_nonzero();
700 catch( Py::Exception & )
706extern "C" PyObject* number_negative_handler( PyObject *self )
710 PythonExtensionBase *p =
static_cast<PythonExtensionBase *
>( self );
711 return new_reference_to( p->number_negative() );
713 catch( Py::Exception & )
719extern "C" PyObject* number_positive_handler( PyObject *self )
723 PythonExtensionBase *p =
static_cast<PythonExtensionBase *
>( self );
724 return new_reference_to( p->number_positive() );
726 catch( Py::Exception & )
732extern "C" PyObject* number_absolute_handler( PyObject *self )
736 PythonExtensionBase *p =
static_cast<PythonExtensionBase *
>( self );
737 return new_reference_to( p->number_absolute() );
739 catch( Py::Exception & )
745extern "C" PyObject* number_invert_handler( PyObject *self )
749 PythonExtensionBase *p =
static_cast<PythonExtensionBase *
>( self );
750 return new_reference_to( p->number_invert() );
752 catch( Py::Exception & )
758extern "C" PyObject* number_int_handler( PyObject *self )
762 PythonExtensionBase *p =
static_cast<PythonExtensionBase *
>( self );
763 return new_reference_to( p->number_int() );
765 catch( Py::Exception & )
771extern "C" PyObject* number_float_handler( PyObject *self )
775 PythonExtensionBase *p =
static_cast<PythonExtensionBase *
>( self );
776 return new_reference_to( p->number_float() );
778 catch( Py::Exception & )
784extern "C" PyObject* number_long_handler( PyObject *self )
788 PythonExtensionBase *p =
static_cast<PythonExtensionBase *
>( self );
789 return new_reference_to( p->number_long() );
791 catch( Py::Exception & )
797extern "C" PyObject* number_oct_handler( PyObject *self )
801 PythonExtensionBase *p =
static_cast<PythonExtensionBase *
>( self );
802 return new_reference_to( p->number_oct() );
804 catch( Py::Exception & )
810extern "C" PyObject* number_hex_handler( PyObject *self )
814 PythonExtensionBase *p =
static_cast<PythonExtensionBase *
>( self );
815 return new_reference_to( p->number_hex() );
817 catch( Py::Exception & )
823extern "C" PyObject* number_add_handler( PyObject *self, PyObject *other )
827 PythonExtensionBase *p =
static_cast<PythonExtensionBase *
>( self );
828 return new_reference_to( p->number_add( Py::Object( other ) ) );
830 catch( Py::Exception & )
836extern "C" PyObject* number_subtract_handler( PyObject *self, PyObject *other )
840 PythonExtensionBase *p =
static_cast<PythonExtensionBase *
>( self );
841 return new_reference_to( p->number_subtract( Py::Object( other ) ) );
843 catch( Py::Exception & )
849extern "C" PyObject* number_multiply_handler( PyObject *self, PyObject *other )
853 PythonExtensionBase *p =
static_cast<PythonExtensionBase *
>( self );
854 return new_reference_to( p->number_multiply( Py::Object( other ) ) );
856 catch( Py::Exception & )
862extern "C" PyObject* number_divide_handler( PyObject *self, PyObject *other )
866 PythonExtensionBase *p =
static_cast<PythonExtensionBase *
>( self );
867 return new_reference_to( p->number_divide( Py::Object( other ) ) );
869 catch( Py::Exception & )
875extern "C" PyObject* number_remainder_handler( PyObject *self, PyObject *other )
879 PythonExtensionBase *p =
static_cast<PythonExtensionBase *
>( self );
880 return new_reference_to( p->number_remainder( Py::Object( other ) ) );
882 catch( Py::Exception & )
888extern "C" PyObject* number_divmod_handler( PyObject *self, PyObject *other )
892 PythonExtensionBase *p =
static_cast<PythonExtensionBase *
>( self );
893 return new_reference_to( p->number_divmod( Py::Object( other ) ) );
895 catch( Py::Exception & )
901extern "C" PyObject* number_lshift_handler( PyObject *self, PyObject *other )
905 PythonExtensionBase *p =
static_cast<PythonExtensionBase *
>( self );
906 return new_reference_to( p->number_lshift( Py::Object( other ) ) );
908 catch( Py::Exception & )
914extern "C" PyObject* number_rshift_handler( PyObject *self, PyObject *other )
918 PythonExtensionBase *p =
static_cast<PythonExtensionBase *
>( self );
919 return new_reference_to( p->number_rshift( Py::Object( other ) ) );
921 catch( Py::Exception & )
927extern "C" PyObject* number_and_handler( PyObject *self, PyObject *other )
931 PythonExtensionBase *p =
static_cast<PythonExtensionBase *
>( self );
932 return new_reference_to( p->number_and( Py::Object( other ) ) );
934 catch( Py::Exception & )
940extern "C" PyObject* number_xor_handler( PyObject *self, PyObject *other )
944 PythonExtensionBase *p =
static_cast<PythonExtensionBase *
>( self );
945 return new_reference_to( p->number_xor( Py::Object( other ) ) );
947 catch( Py::Exception & )
953extern "C" PyObject* number_or_handler( PyObject *self, PyObject *other )
957 PythonExtensionBase *p =
static_cast<PythonExtensionBase *
>( self );
958 return new_reference_to( p->number_or( Py::Object( other ) ) );
960 catch( Py::Exception & )
966extern "C" PyObject* number_power_handler( PyObject *self, PyObject *x1, PyObject *x2 )
970 PythonExtensionBase *p =
static_cast<PythonExtensionBase *
>( self );
971 return new_reference_to( p->number_power( Py::Object( x1 ), Py::Object( x2 ) ) );
973 catch( Py::Exception & )
980extern "C" Py_ssize_t buffer_getreadbuffer_handler( PyObject *self, Py_ssize_t index,
void **pp )
984 PythonExtensionBase *p =
static_cast<PythonExtensionBase *
>( self );
985 return p->buffer_getreadbuffer( index, pp );
987 catch( Py::Exception & )
993extern "C" Py_ssize_t buffer_getwritebuffer_handler( PyObject *self, Py_ssize_t index,
void **pp )
997 PythonExtensionBase *p =
static_cast<PythonExtensionBase *
>( self );
998 return p->buffer_getwritebuffer( index, pp );
1000 catch( Py::Exception & )
1006extern "C" Py_ssize_t buffer_getsegcount_handler( PyObject *self, Py_ssize_t *count )
1010 PythonExtensionBase *p =
static_cast<PythonExtensionBase *
>( self );
1011 int i_count = *count;
1012 Py_ssize_t r = p->buffer_getsegcount( &i_count );
1016 catch( Py::Exception & )
1028#define missing_method( method ) \
1029throw RuntimeError( "Extension object does not support method " #method );
1031PythonExtensionBase::PythonExtensionBase()
1035PythonExtensionBase::~PythonExtensionBase()
1037 assert( ob_refcnt == 0 );
1040int PythonExtensionBase::print( FILE *,
int )
1041 { missing_method( print );
return -1; }
1043int PythonExtensionBase::setattr(
const char*,
const Py::Object & )
1044 { missing_method( setattr );
return -1; }
1046Py::Object PythonExtensionBase::getattro(
const Py::Object & )
1047 { missing_method( getattro );
return Py::Nothing(); }
1049int PythonExtensionBase::setattro(
const Py::Object &,
const Py::Object & )
1050 { missing_method( setattro );
return -1; }
1052int PythonExtensionBase::compare(
const Py::Object & )
1053 { missing_method( compare );
return -1; }
1055Py::Object PythonExtensionBase::repr()
1056 { missing_method( repr );
return Py::Nothing(); }
1058Py::Object PythonExtensionBase::str()
1059 { missing_method( str );
return Py::Nothing(); }
1061long PythonExtensionBase::hash()
1062 { missing_method( hash );
return -1; }
1064Py::Object PythonExtensionBase::call(
const Py::Object &,
const Py::Object & )
1065 { missing_method( call );
return Py::Nothing(); }
1069int PythonExtensionBase::sequence_length()
1070 { missing_method( sequence_length );
return -1; }
1072Py::Object PythonExtensionBase::sequence_concat(
const Py::Object & )
1073 { missing_method( sequence_concat );
return Py::Nothing(); }
1075Py::Object PythonExtensionBase::sequence_repeat(
int )
1076 { missing_method( sequence_repeat );
return Py::Nothing(); }
1078Py::Object PythonExtensionBase::sequence_item(
int )
1079 { missing_method( sequence_item );
return Py::Nothing(); }
1081Py::Object PythonExtensionBase::sequence_slice(
int,
int )
1082 { missing_method( sequence_slice );
return Py::Nothing(); }
1084int PythonExtensionBase::sequence_ass_item(
int,
const Py::Object & )
1085 { missing_method( sequence_ass_item );
return -1; }
1087int PythonExtensionBase::sequence_ass_slice(
int,
int,
const Py::Object & )
1088 { missing_method( sequence_ass_slice );
return -1; }
1092int PythonExtensionBase::mapping_length()
1093 { missing_method( mapping_length );
return -1; }
1095Py::Object PythonExtensionBase::mapping_subscript(
const Py::Object & )
1096 { missing_method( mapping_subscript );
return Py::Nothing(); }
1098int PythonExtensionBase::mapping_ass_subscript(
const Py::Object &,
const Py::Object & )
1099 { missing_method( mapping_ass_subscript );
return -1; }
1103int PythonExtensionBase::number_nonzero()
1104 { missing_method( number_nonzero );
return -1; }
1106Py::Object PythonExtensionBase::number_negative()
1107 { missing_method( number_negative );
return Py::Nothing(); }
1109Py::Object PythonExtensionBase::number_positive()
1110 { missing_method( number_positive );
return Py::Nothing(); }
1112Py::Object PythonExtensionBase::number_absolute()
1113 { missing_method( number_absolute );
return Py::Nothing(); }
1115Py::Object PythonExtensionBase::number_invert()
1116 { missing_method( number_invert );
return Py::Nothing(); }
1118Py::Object PythonExtensionBase::number_int()
1119 { missing_method( number_int );
return Py::Nothing(); }
1121Py::Object PythonExtensionBase::number_float()
1122 { missing_method( number_float );
return Py::Nothing(); }
1124Py::Object PythonExtensionBase::number_long()
1125 { missing_method( number_long );
return Py::Nothing(); }
1127Py::Object PythonExtensionBase::number_oct()
1128 { missing_method( number_oct );
return Py::Nothing(); }
1130Py::Object PythonExtensionBase::number_hex()
1131 { missing_method( number_hex );
return Py::Nothing(); }
1133Py::Object PythonExtensionBase::number_add(
const Py::Object & )
1134 { missing_method( number_add );
return Py::Nothing(); }
1136Py::Object PythonExtensionBase::number_subtract(
const Py::Object & )
1137 { missing_method( number_subtract );
return Py::Nothing(); }
1139Py::Object PythonExtensionBase::number_multiply(
const Py::Object & )
1140 { missing_method( number_multiply );
return Py::Nothing(); }
1142Py::Object PythonExtensionBase::number_divide(
const Py::Object & )
1143 { missing_method( number_divide );
return Py::Nothing(); }
1145Py::Object PythonExtensionBase::number_remainder(
const Py::Object & )
1146 { missing_method( number_remainder );
return Py::Nothing(); }
1148Py::Object PythonExtensionBase::number_divmod(
const Py::Object & )
1149 { missing_method( number_divmod );
return Py::Nothing(); }
1151Py::Object PythonExtensionBase::number_lshift(
const Py::Object & )
1152 { missing_method( number_lshift );
return Py::Nothing(); }
1154Py::Object PythonExtensionBase::number_rshift(
const Py::Object & )
1155 { missing_method( number_rshift );
return Py::Nothing(); }
1157Py::Object PythonExtensionBase::number_and(
const Py::Object & )
1158 { missing_method( number_and );
return Py::Nothing(); }
1160Py::Object PythonExtensionBase::number_xor(
const Py::Object & )
1161 { missing_method( number_xor );
return Py::Nothing(); }
1163Py::Object PythonExtensionBase::number_or(
const Py::Object & )
1164 { missing_method( number_or );
return Py::Nothing(); }
1166Py::Object PythonExtensionBase::number_power(
const Py::Object &,
const Py::Object & )
1167 { missing_method( number_power );
return Py::Nothing(); }
1171int PythonExtensionBase::buffer_getreadbuffer(
int,
void** )
1172 { missing_method( buffer_getreadbuffer );
return -1; }
1174int PythonExtensionBase::buffer_getwritebuffer(
int,
void** )
1175 { missing_method( buffer_getwritebuffer );
return -1; }
1177int PythonExtensionBase::buffer_getsegcount(
int* )
1178 { missing_method( buffer_getsegcount );
return -1; }
1188extern "C" PyObject *method_keyword_call_handler( PyObject *_self_and_name_tuple, PyObject *_args, PyObject *_keywords )
1192 Tuple self_and_name_tuple( _self_and_name_tuple );
1194 PyObject *self_in_cobject = self_and_name_tuple[0].ptr();
1195 void *self_as_void = PyCObject_AsVoidPtr( self_in_cobject );
1196 if( self_as_void == NULL )
1199 ExtensionModuleBase *self =
static_cast<ExtensionModuleBase *
>( self_as_void );
1201 String py_name( self_and_name_tuple[1] );
1202 std::string
name( py_name.as_std_string() );
1204 Tuple args( _args );
1205 if( _keywords == NULL )
1209 Object result( self->invoke_method_keyword( name, args, keywords ) );
1210 return new_reference_to( result.ptr() );
1214 Dict keywords( _keywords );
1216 Object result( self->invoke_method_keyword( name, args, keywords ) );
1217 return new_reference_to( result.ptr() );
1220 catch( Exception & )
1226extern "C" PyObject *method_varargs_call_handler( PyObject *_self_and_name_tuple, PyObject *_args )
1230 Tuple self_and_name_tuple( _self_and_name_tuple );
1232 PyObject *self_in_cobject = self_and_name_tuple[0].ptr();
1233 void *self_as_void = PyCObject_AsVoidPtr( self_in_cobject );
1234 if( self_as_void == NULL )
1237 ExtensionModuleBase *self =
static_cast<ExtensionModuleBase *
>( self_as_void );
1239 String py_name( self_and_name_tuple[1] );
1240 std::string
name( py_name.as_std_string() );
1242 Tuple args( _args );
1244 Object result( self->invoke_method_varargs( name, args ) );
1246 return new_reference_to( result.ptr() );
1248 catch( Exception & )
1254extern "C" void do_not_dealloc(
void * )
1263ExtensionExceptionType::ExtensionExceptionType()
1268void ExtensionExceptionType::init( ExtensionModuleBase &module,
const std::string& name )
1270 std::string module_name( module.fullName() );
1272 module_name +=
name;
1274 set( PyErr_NewException(
const_cast<char *
>( module_name.c_str() ), NULL, NULL ),
true );
1277ExtensionExceptionType::~ExtensionExceptionType()
1281Exception::Exception( ExtensionExceptionType &exception,
const std::string& reason )
1283 PyErr_SetString (exception.ptr(), reason.c_str());
const char * name(StdAction id)