From: SourceForge.net <no...@so...> - 2010-01-25 17:06:06
|
Patches item #2939547, was opened at 2010-01-25 10:06 Message generated for change (Tracker Item Submitted) made by davidfletcher99 You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=301645&aid=2939547&group_id=1645 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: None Group: None Status: Open Resolution: None Priority: 5 Private: No Submitted By: David Fletcher (davidfletcher99) Assigned to: Nobody/Anonymous (nobody) Summary: intrusive_ptr support for perl5/php Initial Comment: -*- text -*- With these changes, (boost) intrusive_ptr support is now provided for swig/perl and swig/php. 1. No changes to swig's internal C++ code is needed for perl. 2. Small changes to swig's internal C++ is needed for php. I've included the modified Source/Modules/php.cxx file in its complete form. Note: I submitted a patch earlier that adds multi-valued (arrayed) returns for php and I included svn diffs for php.cxx with that patch. I've made further improvments so this file supercedes the version I sent earlier. After some thought, I think that sending full files is likely to be better. But, if you'd prefer diffs, please let me know. 3. The existing Lib/intrusive_ptr.i file has been changed. The new version is quite a bit smaller as a good portion of the code has been put into language-specfic boost_intrusive_ptr.i files. 4. The Lib/{php,perl5,python}/boost_intrusive_ptr.i have been added. The perl5 and php files have been shown to work with an external project (google's libkml). I've added a swig-local test cases for all of the affected languages. See below for more. 5. The Lib/java/boost_intrusive_ptr.i typemap file has been changed. swig already provided this file but from what I could tell, this didn't offer intrusive_ptr support. Instead, it seemed to provide boost shared_ptr support. I've changed this file so that it follows the same basic pattern used in the other boost_intrusive_ptr.i files. Eg, so that it actually provides boost support. 7. The Examples/test-suite/li_boost_intrusive_ptr.i file has been changed. This language-specific file seemed to be written with java in mind, and with shared_ptr support in mind, too. I've removed the code that was specific to java and/or shared_ptr. I added comments, etc. 8. The Examples/test-suite/java/li_boost_intrusive_ptr_runme.java file has been changed. I've removed the code that depended upon shared_ptr. I also added comments, etc. 9. I've added these new files: Examples/test-suite/php/li_boost_intrusive_ptr_runme.php Examples/test-suite/perl5/li_boost_intrusive_ptr_runme.pl Examples/test-suite/python/li_boost_intrusive_ptr_runme.py These all follow the same basic form (and all are modeled on the existing java test program). 10. Testing and status. a. php intrusive_ptr support for php works well with the google-libkml project, a project external to swig that makes use of intrusive_ptr and swig. The swig-local test case that I've added also works without any problems. b. perl5 intrusive_ptr support for perl5 works well with google-libkml. The swig-local test case I've added has two errors and both seem to arise from the way that libraries are loaded. The rest of the tests seem to work without any problems. Specifically, these two lines at the top of the test file: BEGIN { use_ok('li_boost_intrusive_ptr') } require_ok('li_boost_intrusive_ptr'); result in these failures: not ok 1 - use li_boost_intrusive_ptr; # Failed test 'use li_boost_intrusive_ptr;' # at ./li_boost_intrusive_ptr_runme.pl line 6. # Tried to use 'li_boost_intrusive_ptr'. # Error: Can't bless non-reference value at li_boost_intrusive_ptr.pm line 21. # Compilation failed in require at (eval 3) line 2. # BEGIN failed--compilation aborted at ./li_boost_intrusive_ptr_runme.pl line 6. not ok 2 - require li_boost_intrusive_ptr; # Failed test 'require li_boost_intrusive_ptr;' # at ./li_boost_intrusive_ptr_runme.pl line 7. # Tried to require 'li_boost_intrusive_ptr'. # Error: Attempt to reload li_boost_intrusive_ptr.pm aborted. # Compilation failed in require at (eval 5) line 2. If you change use_ok/require_ok lines so that libraries are loaded in a more normal fashion, these problems disappear. I'm not sure why these errors occur and I haven't yet taken the time to find out. c. java swig is able to generate code without problems and this code compiles cleanly by the C++ compiler on my machine. Moreover, the test runs to completion with all tests working as expected. However, after all of the tests have been run, during what I'm presuming to be the program shut-down phase, there is a core dump. I believe the problem is because of multiply-deleted objects, but I'm not entirely sure. I do know that I've had to disable the explicit memory management used the perl5/php/python typemaps. While this follows the same basic approach used in other java typemaps, this does seem counter-intuitive to me. I admit that I know little about java's memory management. Perhaps someone with more experience can have a look. d. python The code generated by swig doesn't compile. All of the failures occur in the "swigregister" functions: SWIGINTERN PyObject *Klass_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_boost__intrusive_ptrT_Space__Klass_t, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } I'll continue to look into this however ... others who know more about the python generator may be able to produce a fix more quickly. 11. Documentation I've added copius inline comments, but haven't produced swig-specfic external/HTML documentation about intrusive_ptr support yet. 12. Other typemap files I submitted a patch to swig that adds/improves multi-valued (arrayed) return for swig/php. Most of the changes were in php-specfic typemap files, and I submitted the patch in the form of svn diffs. For completeness, I've included the modified Lib/php files in their complete form with this patch. Strictly speaking, they're not necessary for intrusive_ptr support, but I figure it would be useful to include them here: Lib/php/php.swg Lib/php/utils.i Lib/php/phpkw.swg Lib/php/typemaps.i Lib/php/factory.i Lib/php/globalvar.i Lib/php/phppointers.i Lib/php/std_string.i Lib/php/director.swg Lib/php/phprun.swg Lib/php/const.i David Fletcher Tuscany Design Automation, Inc. fr...@tu... 4800 Innovation Drive Ft. Collins, CO 80525 USA ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=301645&aid=2939547&group_id=1645 |