ASPN ActiveState Programmer Network
ActiveState
/ Home / Perl / PHP / Python / Tcl / XSLT /
/ Safari / My ASPN /
Cookbooks | Documentation | Mailing Lists | Modules | News Feeds | Products | User Groups


Recent Messages
List Archives
About the List
List Leaders
Subscription Options

View Subscriptions
Help

View by Topic
ActiveState
.NET Framework
Open Source
Perl
PHP
Python
Tcl
Web Services
XML & XSLT

View by Category
Database
General
SOAP
System Administration
Tools
User Interfaces
Web Programming
XML Programming


MyASPN >> Mail Archive >> cpp-sig
cpp-sig
[C++-sig] Python converters for raw pointers: request for help
by Michele De Stefano other posts by this author
Oct 23 2009 1:43AM messages near this date
Re: [C++-sig] How to call reshape((M,N),order='F') ? | Re: [C++-sig] Python converters for raw pointers: request for help
Hello to everyone.

I'm trying to write "from Python" converters for PETSc objects of the
petsc4py package.
Even if no-one of you uses petsc4py, I think you can help me, if I
explain some basics.
Please, be patient.

I want to make converters for the PETSc Mat type.

Mat is defined as below:

typedef struct _p_Mat*           Mat;

where _p_Mat is a structure whose details are not interesting for my problem.

Now, I managed to make a functioning "to Python converter".

My problem is the "from Python converter".

I made a test function

void print_Mat(Mat m) {
    ... // The implementation is not interesting
};

And I tried to make a "from Python converter" with the code below
(please, look at it ... it's not too long and it's very simple):


struct PETSc_Mat_from_Python {
	
	PETSc_Mat_from_Python() {

		static bool		do_registration(true);
		
		if (do_registration) {
			
			boost::python::converter::registry::push_back(
					&convertible,&construct,boost::python::type_id<Mat> ());
			
			do_registration = false;
		}
	}
	
	static void* convertible(PyObject* obj_ptr) {
		
                // In the line below, PyPetscMat_Get takes a PyObject*
as input and returns a Mat
                // (if it succedes) or a PETSC_NULL (if it fails).
This is a function of the petsc4py C API.
                // The ownership of the returned Mat is not
transferred (I think)

		if (PyPetscMat_Get(obj_ptr) == PETSC_NULL) return NULL;
		
		return obj_ptr;
	}
	
	static void construct(PyObject* obj_ptr,
			boost::python::converter::rvalue_from_python_stage1_data* data) {

		void* storage = (
				(boost::python::converter::
				rvalue_from_python_storage<Mat> *)data)->storage.bytes;
		
		data-> convertible = storage;
		
                // NOTE: The instruction below does not transfer
ownership, but this is not my problem, for now
		new (storage) Mat(PyPetscMat_Get(obj_ptr));
	}
};


Then, obviously ...

BOOST_PYTHON_MODULE(petsc_ext) {

        ... some not important lines ...

        PETSc_Mat_from_Python(); // Registers the converter
	
	def("print_Mat",print_Mat);
}


The code compiles without errors.
The problem is that when calling "print_Mat" from the Python shell,
the interpreter gives the error:

print_Mat(m)  # where m was previously and correctly built from Python
and it is a Python object containing a Mat

Traceback (most recent call last):
  File "<stdin> ", line 1, in ?
Boost.Python.ArgumentError: Python argument types in
    petsc_ext.print_Mat(petsc4py.PETSc.Mat)
did not match C++ signature:
    print_Mat(_p_Mat*)


I tried also to modify "void print_Mat(Mat m)" into "void
print_Mat(const Mat m)" or "void print_Mat(const Mat& m)", but the
result is the same.

I tried also to debug the code, but the debugger does not enter into
the "convertible" method, so I guess there is something wrong that I
can't see.

So may be I am missing something for the process of writing a "from
Python converter" for pointer arguments.

Can anyone help me, please ?


-- 
Michele De Stefano
http://www.linkedin.com/in/micdestefano
_______________________________________________
Cplusplus-sig mailing list
Cplusplus-sig@[...].org
http://mail.python.org/mailman/listinfo/cplusplus-sig
Thread:
Michele De Stefano
Ravi
Michele De Stefano
Randolph Fritz
Randolph Fritz
Randolph Fritz
Michele De Stefano
Randolph Fritz
Michele De Stefano
Michele De Stefano

Privacy Policy | Email Opt-out | Feedback | Syndication
© ActiveState Software Inc. All rights reserved