From: <wsf...@us...> - 2008-11-03 13:38:14
|
Revision: 10900 http://swig.svn.sourceforge.net/swig/?rev=10900&view=rev Author: wsfulton Date: 2008-11-03 13:37:28 +0000 (Mon, 03 Nov 2008) Log Message: ----------- Import ccache-2.4 source Added Paths: ----------- trunk/CCache/ trunk/CCache/.cvsignore trunk/CCache/COPYING trunk/CCache/Makefile.in trunk/CCache/README trunk/CCache/args.c trunk/CCache/ccache.1 trunk/CCache/ccache.c trunk/CCache/ccache.h trunk/CCache/ccache.yo trunk/CCache/cleanup.c trunk/CCache/config.h.in trunk/CCache/configure trunk/CCache/configure.in trunk/CCache/execute.c trunk/CCache/hash.c trunk/CCache/install-sh trunk/CCache/mdfour.c trunk/CCache/mdfour.h trunk/CCache/packaging/ trunk/CCache/packaging/README trunk/CCache/packaging/ccache.spec trunk/CCache/snprintf.c trunk/CCache/stats.c trunk/CCache/test.sh trunk/CCache/unify.c trunk/CCache/util.c trunk/CCache/web/ trunk/CCache/web/ccache-man.html trunk/CCache/web/index.html Added: trunk/CCache/.cvsignore =================================================================== --- trunk/CCache/.cvsignore (rev 0) +++ trunk/CCache/.cvsignore 2008-11-03 13:37:28 UTC (rev 10900) @@ -0,0 +1,8 @@ +Makefile +ccache +*gz +config.h +config.log +config.status +tca.log +tca.map Added: trunk/CCache/COPYING =================================================================== --- trunk/CCache/COPYING (rev 0) +++ trunk/CCache/COPYING 2008-11-03 13:37:28 UTC (rev 10900) @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 675 Mass Ave, Cambridge, MA 02139, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + Appendix: How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) 19yy <name of author> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + <signature of Ty Coon>, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. Added: trunk/CCache/Makefile.in =================================================================== --- trunk/CCache/Makefile.in (rev 0) +++ trunk/CCache/Makefile.in 2008-11-03 13:37:28 UTC (rev 10900) @@ -0,0 +1,53 @@ +srcdir=@srcdir@ +VPATH=@srcdir@ + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +bindir=@bindir@ +mandir=@mandir@ +INSTALLCMD=@INSTALL@ + +CC=@CC@ +CFLAGS=@CFLAGS@ -I. +EXEEXT=@EXEEXT@ + +OBJS= ccache.o mdfour.o hash.o execute.o util.o args.o stats.o \ + cleanup.o snprintf.o unify.o +HEADERS = ccache.h mdfour.h + +all: ccache$(EXEEXT) + +docs: ccache.1 web/ccache-man.html + +ccache$(EXEEXT): $(OBJS) $(HEADERS) + $(CC) $(CFLAGS) -o $@ $(OBJS) + +ccache.1: ccache.yo + -yodl2man -o ccache.1 ccache.yo + +web/ccache-man.html: ccache.yo + mkdir -p man + yodl2html -o web/ccache-man.html ccache.yo + +install: ccache$(EXEEXT) ccache.1 + ${INSTALLCMD} -d $(DESTDIR)${bindir} + ${INSTALLCMD} -m 755 ccache$(EXEEXT) $(DESTDIR)${bindir} + ${INSTALLCMD} -d $(DESTDIR)${mandir}/man1 + ${INSTALLCMD} -m 644 ${srcdir}/ccache.1 $(DESTDIR)${mandir}/man1/ + +clean: + /bin/rm -f $(OBJS) *~ ccache$(EXEEXT) + +test: test.sh + CC='$(CC)' ./test.sh + +check: test + +distclean: clean + /bin/rm -f Makefile config.h config.sub config.log build-stamp config.status + +# FIXME: To fix this, test.sh needs to be able to take ccache from the +# installed prefix, not from the source dir. +installcheck: + @echo "WARNING! This is not really \"installcheck\" yet." + $(MAKE) check Added: trunk/CCache/README =================================================================== --- trunk/CCache/README (rev 0) +++ trunk/CCache/README 2008-11-03 13:37:28 UTC (rev 10900) @@ -0,0 +1,31 @@ +This is a re-implementation of "compilercache" in C + +The original compilercache scripts were by Erik Thiele +(er...@er...) and I would like to thank him for an excellent +piece of work. See http://www.erikyyy.de/compilercache/ for the +original shell scripts. + +I wrote ccache because I wanted to get a bit more speed out of a +compiler cache and I wanted to remove some of the limitations of the +shell-script version. + +Please see the manual page and documentation at +http://ccache.samba.org/ + +INSTALLATION +------------ + +Please run: + + ./configure + make + make install + +then read the ccache manual page + +----------- + +Andrew Tridgell +http://samba.org/~tridge/ +b...@cc... + Added: trunk/CCache/args.c =================================================================== --- trunk/CCache/args.c (rev 0) +++ trunk/CCache/args.c 2008-11-03 13:37:28 UTC (rev 10900) @@ -0,0 +1,91 @@ +/* + convenient routines for argument list handling + + Copyright (C) Andrew Tridgell 2002 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "ccache.h" + +ARGS *args_init(int init_argc, char **init_args) +{ + ARGS *args; + int i; + args = (ARGS *)x_malloc(sizeof(ARGS)); + args->argc = 0; + args->argv = (char **)x_malloc(sizeof(char *)); + args->argv[0] = NULL; + for (i=0;i<init_argc;i++) { + args_add(args, init_args[i]); + } + return args; +} + + +void args_add(ARGS *args, const char *s) +{ + args->argv = (char**)x_realloc(args->argv, (args->argc + 2) * sizeof(char *)); + args->argv[args->argc] = x_strdup(s); + args->argc++; + args->argv[args->argc] = NULL; +} + +/* pop the last element off the args list */ +void args_pop(ARGS *args, int n) +{ + while (n--) { + args->argc--; + free(args->argv[args->argc]); + args->argv[args->argc] = NULL; + } +} + +/* remove the first element of the argument list */ +void args_remove_first(ARGS *args) +{ + free(args->argv[0]); + memmove(&args->argv[0], + &args->argv[1], + args->argc * sizeof(args->argv[0])); + args->argc--; +} + +/* add an argument into the front of the argument list */ +void args_add_prefix(ARGS *args, const char *s) +{ + args->argv = (char**)x_realloc(args->argv, (args->argc + 2) * sizeof(char *)); + memmove(&args->argv[1], &args->argv[0], + (args->argc+1) * sizeof(args->argv[0])); + args->argv[0] = x_strdup(s); + args->argc++; +} + +/* strip any arguments beginning with the specified prefix */ +void args_strip(ARGS *args, const char *prefix) +{ + int i; + for (i=0; i<args->argc; ) { + if (strncmp(args->argv[i], prefix, strlen(prefix)) == 0) { + free(args->argv[i]); + memmove(&args->argv[i], + &args->argv[i+1], + args->argc * sizeof(args->argv[i])); + args->argc--; + } else { + i++; + } + } +} Added: trunk/CCache/ccache.1 =================================================================== --- trunk/CCache/ccache.1 (rev 0) +++ trunk/CCache/ccache.1 2008-11-03 13:37:28 UTC (rev 10900) @@ -0,0 +1,396 @@ +.TH "ccache" "1" "April 2002" "" "" +.SH "NAME" +ccache \- a fast compiler cache +.SH "SYNOPSIS" +.PP +ccache [OPTION] +.PP +ccache <compiler> [COMPILER OPTIONS] +.PP +<compiler> [COMPILER OPTIONS] +.PP +.SH "DESCRIPTION" +.PP +ccache is a compiler cache\&. It speeds up re-compilation of C/C++ code +by caching previous compiles and detecting when the same compile is +being done again\&. +.PP +.SH "OPTIONS SUMMARY" +.PP +Here is a summary of the options to ccache\&. +.PP + +.nf + + +-s show statistics summary +-z zero statistics +-c run a cache cleanup +-C clear the cache completely +-F <maxfiles> set maximum files in cache +-M <maxsize> set maximum size of cache (use G, M or K) +-h this help page +-V print version number + +.fi + + +.PP +.SH "OPTIONS" +.PP +These options only apply when you invoke ccache as "ccache"\&. When +invoked as a compiler none of these options apply\&. In that case your +normal compiler options apply and you should refer to your compilers +documentation\&. +.PP +.IP "\fB-h\fP" +Print a options summary page +.IP +.IP "\fB-s\fP" +Print the current statistics summary for the cache\&. The +statistics are stored spread across the subdirectories of the +cache\&. Using "ccache -s" adds up the statistics across all +subdirectories and prints the totals\&. +.IP +.IP "\fB-z\fP" +Zero the cache statistics\&. +.IP +.IP "\fB-V\fP" +Print the ccache version number +.IP +.IP "\fB-c\fP" +Clean the cache and re-calculate the cache file count and +size totals\&. Normally the -c option should not be necessary as ccache +keeps the cache below the specified limits at runtime and keeps +statistics up to date on each compile\&. This option is mostly useful +if you manually modify the cache contents or believe that the cache +size statistics may be inaccurate\&. +.IP +.IP "\fB-C\fP" +Clear the entire cache, removing all cached files\&. +.IP +.IP "\fB-F maxfiles\fP" +This sets the maximum number of files allowed in +the cache\&. The value is stored inside the cache directory and applies +to all future compiles\&. Due to the way the value is stored the actual +value used is always rounded down to the nearest multiple of 16\&. +.IP +.IP "\fB-M maxsize\fP" +This sets the maximum cache size\&. You can specify +a value in gigabytes, megabytes or kilobytes by appending a G, M or K +to the value\&. The default is gigabytes\&. The actual value stored is +rounded down to the nearest multiple of 16 kilobytes\&. +.IP +.PP +.SH "INSTALLATION" +.PP +There are two ways to use ccache\&. You can either prefix your compile +commands with "ccache" or you can create a symbolic link between +ccache and the names of your compilers\&. The first method is most +convenient if you just want to try out ccache or wish to use it for +some specific projects\&. The second method is most useful for when you +wish to use ccache for all your compiles\&. +.PP +To install for usage by the first method just copy ccache to somewhere +in your path\&. +.PP +To install for the second method do something like this: + +.nf + + + cp ccache /usr/local/bin/ + ln -s /usr/local/bin/ccache /usr/local/bin/gcc + ln -s /usr/local/bin/ccache /usr/local/bin/g++ + ln -s /usr/local/bin/ccache /usr/local/bin/cc + +.fi + + +This will work as long as /usr/local/bin comes before the path to gcc +(which is usually in /usr/bin)\&. After installing you may wish to run +"which gcc" to make sure that the correct link is being used\&. +.PP +Note! Do not use a hard link, use a symbolic link\&. A hardlink will +cause "interesting" problems\&. +.PP +.SH "EXTRA OPTIONS" +.PP +When run as a compiler front end ccache usually just takes the same +command line options as the compiler you are using\&. The only exception +to this is the option \&'--ccache-skip\&'\&. That option can be used to tell +ccache that the next option is definitely not a input filename, and +should be passed along to the compiler as-is\&. +.PP +The reason this can be important is that ccache does need to parse the +command line and determine what is an input filename and what is a +compiler option, as it needs the input filename to determine the name +of the resulting object file (among other things)\&. The heuristic +ccache uses in this parse is that any string on the command line that +exists as a file is treated as an input file name (usually a C +file)\&. By using --ccache-skip you can force an option to not be +treated as an input file name and instead be passed along to the +compiler as a command line option\&. +.PP +.SH "ENVIRONMENT VARIABLES" +.PP +ccache uses a number of environment variables to control operation\&. In +most cases you won\&'t need any of these as the defaults will be fine\&. +.PP +.IP +.IP "\fBCCACHE_DIR\fP" +the CCACHE_DIR environment variable specifies +where ccache will keep its cached compiler output\&. The default is +"$HOME/\&.ccache"\&. +.IP +.IP "\fBCCACHE_TEMPDIR\fP" +the CCACHE_TEMPDIR environment variable specifies +where ccache will put temporary files\&. The default is the same as +CCACHE_DIR\&. Note that the CCACHE_TEMPDIR path must be on the same +filesystem as the CCACHE_DIR path, so that renames of files between +the two directories can work\&. +.IP +.IP "\fBCCACHE_LOGFILE\fP" +If you set the CCACHE_LOGFILE environment +variable then ccache will write some log information on cache hits +and misses in that file\&. This is useful for tracking down problems\&. +.IP +.IP "\fBCCACHE_PATH\fP" +You can optionally set CCACHE_PATH to a colon +separated path where ccache will look for the real compilers\&. If you +don\&'t do this then ccache will look for the first executable matching +the compiler name in the normal PATH that isn\&'t a symbolic link to +ccache itself\&. +.IP +.IP "\fBCCACHE_CC\fP" +You can optionally set CCACHE_CC to force the name +of the compiler to use\&. If you don\&'t do this then ccache works it out +from the command line\&. +.IP +.IP "\fBCCACHE_PREFIX\fP" +This option adds a prefix to the command line +that ccache runs when invoking the compiler\&. Also see the section +below on using ccache with distcc\&. +.IP +.IP "\fBCCACHE_DISABLE\fP" +If you set the environment variable +CCACHE_DISABLE then ccache will just call the real compiler, +bypassing the cache completely\&. +.IP +.IP "\fBCCACHE_READONLY\fP" +the CCACHE_READONLY environment variable +tells ccache to attempt to use existing cached object files, but not +to try to add anything new to the cache\&. If you are using this because +your CCACHE_DIR is read-only, then you may find that you also need to +set CCACHE_TEMPDIR as otherwise ccache will fail to create the +temporary files\&. +.IP +.IP "\fBCCACHE_CPP2\fP" +If you set the environment variable CCACHE_CPP2 +then ccache will not use the optimisation of avoiding the 2nd call to +the pre-processor by compiling the pre-processed output that was used +for finding the hash in the case of a cache miss\&. This is primarily a +debugging option, although it is possible that some unusual compilers +will have problems with the intermediate filename extensions used in +this optimisation, in which case this option could allow ccache to be +used\&. +.IP +.IP "\fBCCACHE_NOSTATS\fP" +If you set the environment variable +CCACHE_NOSTATS then ccache will not update the statistics files on +each compile\&. +.IP +.IP "\fBCCACHE_NLEVELS\fP" +The environment variable CCACHE_NLEVELS allows +you to choose the number of levels of hash in the cache directory\&. The +default is 2\&. The minimum is 1 and the maximum is 8\&. +.IP +.IP "\fBCCACHE_HARDLINK\fP" +If you set the environment variable +CCACHE_HARDLINK then ccache will attempt to use hard links from the +cache directory when creating the compiler output rather than using a +file copy\&. Using hard links is faster, but can confuse programs like +\&'make\&' that rely on modification times\&. +.IP +.IP "\fBCCACHE_RECACHE\fP" +This forces ccache to not use any cached +results, even if it finds them\&. New results are still cached, but +existing cache entries are ignored\&. +.IP +.IP "\fBCCACHE_UMASK\fP" +This sets the umask for ccache and all child +processes (such as the compiler)\&. This is mostly useful when you wish +to share your cache with other users\&. Note that this also affects the +file permissions set on the object files created from your +compilations\&. +.IP +.IP "\fBCCACHE_HASHDIR\fP" +This tells ccache to hash the current working +directory when calculating the hash that is used to distinguish two +compiles\&. This prevents a problem with the storage of the current +working directory in the debug info of a object file, which can lead +ccache to give a cached object file that has the working directory in +the debug info set incorrectly\&. This option is off by default as the +incorrect setting of this debug info rarely causes problems\&. If you +strike problems with gdb not using the correct directory then enable +this option\&. +.IP +.IP "\fBCCACHE_UNIFY\fP" +If you set the environment variable CCACHE_UNIFY +then ccache will use the C/C++ unifier when hashing the pre-processor +output if -g is not used in the compile\&. The unifier is slower than a +normal hash, so setting this environment variable loses a little bit +of speed, but it means that ccache can take advantage of not +recompiling when the changes to the source code consist of +reformatting only\&. Note that using CCACHE_UNIFY changes the hash, so +cached compiles with CCACHE_UNIFY set cannot be used when +CCACHE_UNIFY is not set and vice versa\&. The reason the unifier is off +by default is that it can give incorrect line number information in +compiler warning messages\&. +.IP +.IP "\fBCCACHE_EXTENSION\fP" +Normally ccache tries to automatically +determine the extension to use for intermediate C pre-processor files +based on the type of file being compiled\&. Unfortunately this sometimes +doesn\&'t work, for example when using the aCC compiler on HP-UX\&. On +systems like this you can use the CCACHE_EXTENSION option to override +the default\&. On HP-UX set this environment variable to "i" if you use +the aCC compiler\&. +.IP +.PP +.SH "CACHE SIZE MANAGEMENT" +.PP +By default ccache has a one gigabyte limit on the cache size and no +maximum number of files\&. You can set a different limit using the +"ccache -M" and "ccache -F" options, which set the size and number of +files limits\&. +.PP +When these limits are reached ccache will reduce the cache to 20% +below the numbers you specified in order to avoid doing the cache +clean operation too often\&. +.PP +.SH "HOW IT WORKS" +.PP +The basic idea is to detect when you are compiling exactly the same +code a 2nd time and use the previously compiled output\&. You detect +that it is the same code by forming a hash of: +.PP +.IP o +the pre-processor output from running the compiler with -E +.IP o +the command line options +.IP o +the real compilers size and modification time +.IP o +any stderr output generated by the compiler +.PP +These are hashed using md4 (a strong hash) and a cache file is formed +based on that hash result\&. When the same compilation is done a second +time ccache is able to supply the correct compiler output (including +all warnings etc) from the cache\&. +.PP +ccache has been carefully written to always produce exactly the same +compiler output that you would get without the cache\&. If you ever +discover a case where ccache changes the output of your compiler then +please let me know\&. +.PP +.SH "USING CCACHE WITH DISTCC" +.PP +distcc is a very useful program for distributing compilation across a +range of compiler servers\&. It is often useful to combine distcc with +ccache, so that compiles that are done are sped up by distcc, but that +ccache avoids the compile completely where possible\&. +.PP +To use distcc with ccache I recommend using the CCACHE_PREFIX +option\&. You just need to set the environment variable CCACHE_PREFIX to +\&'distcc\&' and ccache will prefix the command line used with the +compiler with the command \&'distcc\&'\&. +.PP +.SH "SHARING A CACHE" +.PP +A group of developers can increase the cache hit rate by sharing a +cache directory\&. The hard links however cause unwanted side effects, +as all links to a cached file share the file\&'s modification timestamp\&. +This results in false dependencies to be triggered by timestamp-based +build systems whenever another user links to an existing +file\&. Typically, users will see that their libraries and binaries are +relinked without reason\&. To share a cache without side effects, the +following conditions need to be met: +.PP +.IP o +Use the same \fBCCACHE_DIR\fP environment variable setting +.IP o +Set the \fBCCACHE_NOLINK\fP environment variable +.IP o +Make sure everyone sets the CCACHE_UMASK environment variable +to 002, this ensures that cached files are accessible to everyone in +the group\&. +.IP o +Make sure that all users have write permission in the entire +cache directory (and that you trust all users of the shared cache)\&. +.IP o +Make sure that the setgid bit is set on all directories in the +cache\&. This tells the filesystem to inherit group ownership for new +directories\&. The command "chmod g+s `find $CCACHE_DIR -type d`" might +be useful for this\&. +.PP +.SH "HISTORY" +.PP +ccache was inspired by the compilercache shell script script written +by Erik Thiele and I would like to thank him for an excellent piece of +work\&. See +http://www\&.erikyyy\&.de/compilercache/ +for the Erik\&'s scripts\&. +.PP +I wrote ccache because I wanted to get a bit more speed out of a +compiler cache and I wanted to remove some of the limitations of the +shell-script version\&. +.PP +.SH "DIFFERENCES FROM COMPILERCACHE" +.PP +The biggest differences between Erik\&'s compilercache script and ccache +are: +.IP o +ccache is written in C, which makes it a bit faster (calling out to +external programs is mostly what slowed down the scripts)\&. +.IP o +ccache can automatically find the real compiler +.IP o +ccache keeps statistics on hits/misses +.IP o +ccache can do automatic cache management +.IP o +ccache can cache compiler output that includes warnings\&. In many +cases this gives ccache a much higher cache hit rate\&. +.IP o +ccache can handle a much wider ranger of compiler options +.IP o +ccache avoids a double call to cpp on a cache miss +.PP +.SH "BUGS" +.PP +When the cache is stored on an NFS filesystem, the filesystem must be +exported with the \fBno_subtree_check\fP option to make renames between +directories reliable\&. +.PP +.SH "CREDITS" +.PP +Thanks to the following people for their contributions to ccache +.IP o +Erik Thiele for the original compilercache script +.IP o +Luciano Rocha for the idea of compiling the pre-processor output +to avoid a 2nd cpp pass +.IP o +Paul Russell for many suggestions and the debian packaging +.PP +.SH "AUTHOR" +.PP +ccache was written by Andrew Tridgell +http://samba\&.org/~tridge/ +.PP +If you wish to report a problem or make a suggestion then please email +bugs@ccache\&.samba\&.org +.PP +ccache is released under the GNU General Public License version 2 or +later\&. Please see the file COPYING for license details\&. Added: trunk/CCache/ccache.c =================================================================== --- trunk/CCache/ccache.c (rev 0) +++ trunk/CCache/ccache.c 2008-11-03 13:37:28 UTC (rev 10900) @@ -0,0 +1,1034 @@ +/* + a re-implementation of the compilercache scripts in C + + The idea is based on the shell-script compilercache by Erik Thiele <er...@er...> + + Copyright (C) Andrew Tridgell 2002 + Copyright (C) Martin Pool 2003 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "ccache.h" + +/* the base cache directory */ +char *cache_dir = NULL; + +/* the directory for temporary files */ +static char *temp_dir = NULL; + +/* the debug logfile name, if set */ +char *cache_logfile = NULL; + +/* the argument list after processing */ +static ARGS *stripped_args; + +/* the original argument list */ +static ARGS *orig_args; + +/* the output filename being compiled to */ +static char *output_file; + +/* the source file */ +static char *input_file; + +/* the name of the file containing the cached object code */ +static char *hashname; + +/* the extension of the file after pre-processing */ +static const char *i_extension; + +/* the name of the temporary pre-processor file */ +static char *i_tmpfile; + +/* are we compiling a .i or .ii file directly? */ +static int direct_i_file; + +/* the name of the cpp stderr file */ +static char *cpp_stderr; + +/* the name of the statistics file */ +char *stats_file = NULL; + +/* can we safely use the unification hashing backend? */ +static int enable_unify; + +/* a list of supported file extensions, and the equivalent + extension for code that has been through the pre-processor +*/ +static struct { + char *extension; + char *i_extension; +} extensions[] = { + {"c", "i"}, + {"C", "ii"}, + {"m", "mi"}, + {"cc", "ii"}, + {"CC", "ii"}, + {"cpp", "ii"}, + {"CPP", "ii"}, + {"cxx", "ii"}, + {"CXX", "ii"}, + {"c++", "ii"}, + {"C++", "ii"}, + {"i", "i"}, + {"ii", "ii"}, + {NULL, NULL}}; + +/* + something went badly wrong - just execute the real compiler +*/ +static void failed(void) +{ + char *e; + + /* delete intermediate pre-processor file if needed */ + if (i_tmpfile) { + if (!direct_i_file) { + unlink(i_tmpfile); + } + free(i_tmpfile); + i_tmpfile = NULL; + } + + /* delete the cpp stderr file if necessary */ + if (cpp_stderr) { + unlink(cpp_stderr); + free(cpp_stderr); + cpp_stderr = NULL; + } + + /* strip any local args */ + args_strip(orig_args, "--ccache-"); + + if ((e=getenv("CCACHE_PREFIX"))) { + char *p = find_executable(e, MYNAME); + if (!p) { + perror(e); + exit(1); + } + args_add_prefix(orig_args, p); + } + + execv(orig_args->argv[0], orig_args->argv); + cc_log("execv returned (%s)!\n", strerror(errno)); + perror(orig_args->argv[0]); + exit(1); +} + + +/* return a string to be used to distinguish temporary files + this also tries to cope with NFS by adding the local hostname +*/ +static const char *tmp_string(void) +{ + static char *ret; + + if (!ret) { + char hostname[200]; + strcpy(hostname, "unknown"); +#if HAVE_GETHOSTNAME + gethostname(hostname, sizeof(hostname)-1); +#endif + hostname[sizeof(hostname)-1] = 0; + asprintf(&ret, "%s.%u", hostname, (unsigned)getpid()); + } + + return ret; +} + + +/* run the real compiler and put the result in cache */ +static void to_cache(ARGS *args) +{ + char *path_stderr; + char *tmp_stdout, *tmp_stderr, *tmp_hashname; + struct stat st1, st2; + int status; + + x_asprintf(&tmp_stdout, "%s/tmp.stdout.%s", temp_dir, tmp_string()); + x_asprintf(&tmp_stderr, "%s/tmp.stderr.%s", temp_dir, tmp_string()); + x_asprintf(&tmp_hashname, "%s/tmp.hash.%s.o", temp_dir, tmp_string()); + + args_add(args, "-o"); + args_add(args, tmp_hashname); + + /* Turn off DEPENDENCIES_OUTPUT when running cc1, because + * otherwise it will emit a line like + * + * tmp.stdout.vexed.732.o: /home/mbp/.ccache/tmp.stdout.vexed.732.i + * + * unsetenv() is on BSD and Linux but not portable. */ + putenv("DEPENDENCIES_OUTPUT"); + + if (getenv("CCACHE_CPP2")) { + args_add(args, input_file); + } else { + args_add(args, i_tmpfile); + } + status = execute(args->argv, tmp_stdout, tmp_stderr); + args_pop(args, 3); + + if (stat(tmp_stdout, &st1) != 0 || st1.st_size != 0) { + cc_log("compiler produced stdout for %s\n", output_file); + stats_update(STATS_STDOUT); + unlink(tmp_stdout); + unlink(tmp_stderr); + unlink(tmp_hashname); + failed(); + } + unlink(tmp_stdout); + + if (status != 0) { + int fd; + cc_log("compile of %s gave status = %d\n", output_file, status); + stats_update(STATS_STATUS); + + fd = open(tmp_stderr, O_RDONLY | O_BINARY); + if (fd != -1) { + if (strcmp(output_file, "/dev/null") == 0 || + rename(tmp_hashname, output_file) == 0 || errno == ENOENT) { + if (cpp_stderr) { + /* we might have some stderr from cpp */ + int fd2 = open(cpp_stderr, O_RDONLY | O_BINARY); + if (fd2 != -1) { + copy_fd(fd2, 2); + close(fd2); + unlink(cpp_stderr); + cpp_stderr = NULL; + } + } + + /* we can use a quick method of + getting the failed output */ + copy_fd(fd, 2); + close(fd); + unlink(tmp_stderr); + if (i_tmpfile && !direct_i_file) { + unlink(i_tmpfile); + } + exit(status); + } + } + + unlink(tmp_stderr); + unlink(tmp_hashname); + failed(); + } + + x_asprintf(&path_stderr, "%s.stderr", hashname); + + if (stat(tmp_stderr, &st1) != 0 || + stat(tmp_hashname, &st2) != 0 || + rename(tmp_hashname, hashname) != 0 || + rename(tmp_stderr, path_stderr) != 0) { + cc_log("failed to rename tmp files - %s\n", strerror(errno)); + stats_update(STATS_ERROR); + failed(); + } + + cc_log("Placed %s into cache\n", output_file); + stats_tocache(file_size(&st1) + file_size(&st2)); + + free(tmp_hashname); + free(tmp_stderr); + free(tmp_stdout); + free(path_stderr); +} + +/* find the hash for a command. The hash includes all argument lists, + plus the output from running the compiler with -E */ +static void find_hash(ARGS *args) +{ + int i; + char *path_stdout, *path_stderr; + char *hash_dir; + char *s; + struct stat st; + int status; + int nlevels = 2; + char *input_base; + char *tmp; + + if ((s = getenv("CCACHE_NLEVELS"))) { + nlevels = atoi(s); + if (nlevels < 1) nlevels = 1; + if (nlevels > 8) nlevels = 8; + } + + hash_start(); + + /* when we are doing the unifying tricks we need to include + the input file name in the hash to get the warnings right */ + if (enable_unify) { + hash_string(input_file); + } + + /* we have to hash the extension, as a .i file isn't treated the same + by the compiler as a .ii file */ + hash_string(i_extension); + + /* first the arguments */ + for (i=1;i<args->argc;i++) { + /* some arguments don't contribute to the hash. The + theory is that these arguments will change the + output of -E if they are going to have any effect + at all, or they only affect linking */ + if (i < args->argc-1) { + if (strcmp(args->argv[i], "-I") == 0 || + strcmp(args->argv[i], "-include") == 0 || + strcmp(args->argv[i], "-L") == 0 || + strcmp(args->argv[i], "-D") == 0 || + strcmp(args->argv[i], "-idirafter") == 0 || + strcmp(args->argv[i], "-isystem") == 0) { + i++; + continue; + } + } + if (strncmp(args->argv[i], "-I", 2) == 0 || + strncmp(args->argv[i], "-L", 2) == 0 || + strncmp(args->argv[i], "-D", 2) == 0 || + strncmp(args->argv[i], "-idirafter", 10) == 0 || + strncmp(args->argv[i], "-isystem", 8) == 0) { + continue; + } + + if (strncmp(args->argv[i], "--specs=", 8) == 0 && + stat(args->argv[i]+8, &st) == 0) { + /* if given a explicit specs file, then hash that file, but + don't include the path to it in the hash */ + hash_file(args->argv[i]+8); + continue; + } + + /* all other arguments are included in the hash */ + hash_string(args->argv[i]); + } + + /* the compiler driver size and date. This is a simple minded way + to try and detect compiler upgrades. It is not 100% reliable */ + if (stat(args->argv[0], &st) != 0) { + cc_log("Couldn't stat the compiler!? (argv[0]='%s')\n", args->argv[0]); + stats_update(STATS_COMPILER); + failed(); + } + + /* also include the hash of the compiler name - as some compilers + use hard links and behave differently depending on the real name */ + if (st.st_nlink > 1) { + hash_string(str_basename(args->argv[0])); + } + + hash_int(st.st_size); + hash_int(st.st_mtime); + + /* possibly hash the current working directory */ + if (getenv("CCACHE_HASHDIR")) { + char *cwd = gnu_getcwd(); + if (cwd) { + hash_string(cwd); + free(cwd); + } + } + + /* ~/hello.c -> tmp.hello.123.i + limit the basename to 10 + characters in order to cope with filesystem with small + maximum filename length limits */ + input_base = str_basename(input_file); + tmp = strchr(input_base, '.'); + if (tmp != NULL) { + *tmp = 0; + } + if (strlen(input_base) > 10) { + input_base[10] = 0; + } + + /* now the run */ + x_asprintf(&path_stdout, "%s/%s.tmp.%s.%s", temp_dir, + input_base, tmp_string(), + i_extension); + x_asprintf(&path_stderr, "%s/tmp.cpp_stderr.%s", temp_dir, tmp_string()); + + if (!direct_i_file) { + /* run cpp on the input file to obtain the .i */ + args_add(args, "-E"); + args_add(args, input_file); + status = execute(args->argv, path_stdout, path_stderr); + args_pop(args, 2); + } else { + /* we are compiling a .i or .ii file - that means we + can skip the cpp stage and directly form the + correct i_tmpfile */ + path_stdout = input_file; + if (create_empty_file(path_stderr) != 0) { + stats_update(STATS_ERROR); + cc_log("failed to create empty stderr file\n"); + failed(); + } + status = 0; + } + + if (status != 0) { + if (!direct_i_file) { + unlink(path_stdout); + } + unlink(path_stderr); + cc_log("the preprocessor gave %d\n", status); + stats_update(STATS_PREPROCESSOR); + failed(); + } + + /* if the compilation is with -g then we have to include the whole of the + preprocessor output, which means we are sensitive to line number + information. Otherwise we can discard line number info, which makes + us less sensitive to reformatting changes + + Note! I have now disabled the unification code by default + as it gives the wrong line numbers for warnings. Pity. + */ + if (!enable_unify) { + hash_file(path_stdout); + } else { + if (unify_hash(path_stdout) != 0) { + stats_update(STATS_ERROR); + failed(); + } + } + hash_file(path_stderr); + + i_tmpfile = path_stdout; + + if (!getenv("CCACHE_CPP2")) { + /* if we are using the CPP trick then we need to remember this stderr + data and output it just before the main stderr from the compiler + pass */ + cpp_stderr = path_stderr; + } else { + unlink(path_stderr); + free(path_stderr); + } + + /* we use a N level subdir for the cache path to reduce the impact + on filesystems which are slow for large directories + */ + s = hash_result(); + x_asprintf(&hash_dir, "%s/%c", cache_dir, s[0]); + x_asprintf(&stats_file, "%s/stats", hash_dir); + for (i=1; i<nlevels; i++) { + char *p; + if (create_dir(hash_dir) != 0) { + cc_log("failed to create %s\n", hash_dir); + failed(); + } + x_asprintf(&p, "%s/%c", hash_dir, s[i]); + free(hash_dir); + hash_dir = p; + } + if (create_dir(hash_dir) != 0) { + cc_log("failed to create %s\n", hash_dir); + failed(); + } + x_asprintf(&hashname, "%s/%s", hash_dir, s+nlevels); + free(hash_dir); +} + + +/* + try to return the compile result from cache. If we can return from + cache then this function exits with the correct status code, + otherwise it returns */ +static void from_cache(int first) +{ + int fd_stderr, fd_cpp_stderr; + char *stderr_file; + int ret; + struct stat st; + + x_asprintf(&stderr_file, "%s.stderr", hashname); + fd_stderr = open(stderr_file, O_RDONLY | O_BINARY); + if (fd_stderr == -1) { + /* it isn't in cache ... */ + free(stderr_file); + return; + } + + /* make sure the output is there too */ + if (stat(hashname, &st) != 0) { + close(fd_stderr); + unlink(stderr_file); + free(stderr_file); + return; + } + + /* the user might be disabling cache hits */ + if (first && getenv("CCACHE_RECACHE")) { + close(fd_stderr); + unlink(stderr_file); + free(stderr_file); + return; + } + + utime(stderr_file, NULL); + + if (strcmp(output_file, "/dev/null") == 0) { + ret = 0; + } else { + unlink(output_file); + if (getenv("CCACHE_HARDLINK")) { + ret = link(hashname, output_file); + } else { + ret = copy_file(hashname, output_file); + } + } + + /* the hash file might have been deleted by some external process */ + if (ret == -1 && errno == ENOENT) { + cc_log("hashfile missing for %s\n", output_file); + stats_update(STATS_MISSING); + close(fd_stderr); + unlink(stderr_file); + return; + } + free(stderr_file); + + if (ret == -1) { + ret = copy_file(hashname, output_file); + if (ret == -1) { + cc_log("failed to copy %s -> %s (%s)\n", + hashname, output_file, strerror(errno)); + stats_update(STATS_ERROR); + failed(); + } + } + if (ret == 0) { + /* update the mtime on the file so that make doesn't get confused */ + utime(output_file, NULL); + } + + /* get rid of the intermediate preprocessor file */ + if (i_tmpfile) { + if (!direct_i_file) { + unlink(i_tmpfile); + } + free(i_tmpfile); + i_tmpfile = NULL; + } + + /* send the cpp stderr, if applicable */ + fd_cpp_stderr = open(cpp_stderr, O_RDONLY | O_BINARY); + if (fd_cpp_stderr != -1) { + copy_fd(fd_cpp_stderr, 2); + close(fd_cpp_stderr); + unlink(cpp_stderr); + free(cpp_stderr); + cpp_stderr = NULL; + } + + /* send the stderr */ + copy_fd(fd_stderr, 2); + close(fd_stderr); + + /* and exit with the right status code */ + if (first) { + cc_log("got cached result for %s\n", output_file); + stats_update(STATS_CACHED); + } + + exit(0); +} + +/* find the real compiler. We just search the PATH to find a executable of the + same name that isn't a link to ourselves */ +static void find_compiler(int argc, char **argv) +{ + char *base; + char *path; + + orig_args = args_init(argc, argv); + + base = str_basename(argv[0]); + + /* we might be being invoked like "ccache gcc -c foo.c" */ + if (strcmp(base, MYNAME) == 0) { + args_remove_first(orig_args); + free(base); + if (strchr(argv[1],'/')) { + /* a full path was given */ + return; + } + base = str_basename(argv[1]); + } + + /* support user override of the compiler */ + if ((path=getenv("CCACHE_CC"))) { + base = strdup(path); + } + + orig_args->argv[0] = find_executable(base, MYNAME); + + /* can't find the compiler! */ + if (!orig_args->argv[0]) { + stats_update(STATS_COMPILER); + perror(base); + exit(1); + } +} + + +/* check a filename for C/C++ extension. Return the pre-processor + extension */ +static const char *check_extension(const char *fname, int *direct_i) +{ + int i; + const char *p; + + if (direct_i) { + *direct_i = 0; + } + + p = strrchr(fname, '.'); + if (!p) return NULL; + p++; + for (i=0; extensions[i].extension; i++) { + if (strcmp(p, extensions[i].extension) == 0) { + if (direct_i && strcmp(p, extensions[i].i_extension) == 0) { + *direct_i = 1; + } + p = getenv("CCACHE_EXTENSION"); + if (p) return p; + return extensions[i].i_extension; + } + } + return NULL; +} + + +/* + process the compiler options to form the correct set of options + for obtaining the preprocessor output +*/ +static void process_args(int argc, char **argv) +{ + int i; + int found_c_opt = 0; + int found_S_opt = 0; + struct stat st; + char *e; + + stripped_args = args_init(0, NULL); + + args_add(stripped_args, argv[0]); + + for (i=1; i<argc; i++) { + /* some options will never work ... */ + if (strcmp(argv[i], "-E") == 0) { + failed(); + } + + /* these are too hard */ + if (strcmp(argv[i], "-fbranch-probabilities")==0 || + strcmp(argv[i], "-M") == 0 || + strcmp(argv[i], "-MM") == 0 || + strcmp(argv[i], "-x") == 0) { + cc_log("argument %s is unsupported\n", argv[i]); + stats_update(STATS_UNSUPPORTED); + failed(); + continue; + } + + /* we must have -c */ + if (strcmp(argv[i], "-c") == 0) { + args_add(stripped_args, argv[i]); + found_c_opt = 1; + continue; + } + + /* -S changes the default extension */ + if (strcmp(argv[i], "-S") == 0) { + args_add(stripped_args, argv[i]); + found_S_opt = 1; + continue; + } + + /* we need to work out where the output was meant to go */ + if (strcmp(argv[i], "-o") == 0) { + if (i == argc-1) { + cc_log("missing argument to %s\n", argv[i]); + stats_update(STATS_ARGS); + failed(); + } + output_file = argv[i+1]; + i++; + continue; + } + + /* alternate form of -o, with no space */ + if (strncmp(argv[i], "-o", 2) == 0) { + output_file = &argv[i][2]; + continue; + } + + /* debugging is handled specially, so that we know if we + can strip line number info + */ + if (strncmp(argv[i], "-g", 2) == 0) { + args_add(stripped_args, argv[i]); + if (strcmp(argv[i], "-g0") != 0) { + enable_unify = 0; + } + continue; + } + + /* The user knows best: just swallow the next arg */ + if (strcmp(argv[i], "--ccache-skip") == 0) { + i++; + if (i == argc) { + failed(); + } + args_add(stripped_args, argv[i]); + continue; + } + + /* options that take an argument */ + { + const char *opts[] = {"-I", "-include", "-imacros", "-iprefix", + "-iwithprefix", "-iwithprefixbefore", + "-L", "-D", "-U", "-x", "-MF", + "-MT", "-MQ", "-isystem", "-aux-info", + "--param", "-A", "-Xlinker", "-u", + "-idirafter", + NULL}; + int j; + for (j=0;opts[j];j++) { + if (strcmp(argv[i], opts[j]) == 0) { + if (i == argc-1) { + cc_log("missing argument to %s\n", + argv[i]); + stats_update(STATS_ARGS); + failed(); + } + + args_add(stripped_args, argv[i]); + args_add(stripped_args, argv[i+1]); + i++; + break; + } + } + if (opts[j]) continue; + } + + /* other options */ + if (argv[i][0] == '-') { + args_add(stripped_args, argv[i]); + continue; + } + + /* if an argument isn't a plain file then assume its + an option, not an input file. This allows us to + cope better with unusual compiler options */ + if (stat(argv[i], &st) != 0 || !S_ISREG(st.st_mode)) { + args_add(stripped_args, argv[i]); + continue; + } + + if (input_file) { + if (check_extension(argv[i], NULL)) { + cc_log("multiple input files (%s and %s)\n", + input_file, argv[i]); + stats_update(STATS_MULTIPLE); + } else if (!found_c_opt) { + cc_log("called for link with %s\n", argv[i]); + if (strstr(argv[i], "conftest.")) { + stats_update(STATS_CONFTEST); + } else { + stats_update(STATS_LINK); + } + } else { + cc_log("non C/C++ file %s\n", argv[i]); + stats_update(STATS_NOTC); + } + failed(); + } + + input_file = argv[i]; + } + + if (!input_file) { + cc_log("No input file found\n"); + stats_update(STATS_NOINPUT); + failed(); + } + + i_extension = check_extension(input_file, &direct_i_file); + if (i_extension == NULL) { + ... [truncated message content] |
From: <wsf...@us...> - 2008-11-07 17:04:08
|
Revision: 10920 http://swig.svn.sourceforge.net/swig/?rev=10920&view=rev Author: wsfulton Date: 2008-11-07 17:03:57 +0000 (Fri, 07 Nov 2008) Log Message: ----------- integrate ccache build Modified Paths: -------------- trunk/CCache/Makefile.in trunk/CCache/ccache.h trunk/CCache/configure.in trunk/Makefile.in trunk/autogen.sh trunk/configure.in Added Paths: ----------- trunk/CCache/ccache_swig_config.h.in Modified: trunk/CCache/Makefile.in =================================================================== --- trunk/CCache/Makefile.in 2008-11-05 16:59:27 UTC (rev 10919) +++ trunk/CCache/Makefile.in 2008-11-07 17:03:57 UTC (rev 10920) @@ -7,6 +7,7 @@ bindir=@bindir@ mandir=@mandir@ INSTALLCMD=@INSTALL@ +PACKAGE_NAME=@PACKAGE_NAME@ CC=@CC@ CFLAGS=@CFLAGS@ -I. @@ -17,11 +18,11 @@ cleanup.o snprintf.o unify.o HEADERS = ccache.h mdfour.h -all: ccache$(EXEEXT) +all: $(PACKAGE_NAME)$(EXEEXT) docs: ccache.1 web/ccache-man.html -ccache$(EXEEXT): $(OBJS) $(HEADERS) +$(PACKAGE_NAME)$(EXEEXT): $(OBJS) $(HEADERS) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(OBJS) $(LIBS) ccache.1: ccache.yo @@ -31,14 +32,14 @@ mkdir -p man yodl2html -o web/ccache-man.html ccache.yo -install: ccache$(EXEEXT) ccache.1 +install: $(PACKAGE_NAME)$(EXEEXT) ccache.1 ${INSTALLCMD} -d $(DESTDIR)${bindir} - ${INSTALLCMD} -m 755 ccache$(EXEEXT) $(DESTDIR)${bindir} + ${INSTALLCMD} -m 755 $(PACKAGE_NAME)$(EXEEXT) $(DESTDIR)${bindir} ${INSTALLCMD} -d $(DESTDIR)${mandir}/man1 ${INSTALLCMD} -m 644 ${srcdir}/ccache.1 $(DESTDIR)${mandir}/man1/ clean: - /bin/rm -f $(OBJS) *~ ccache$(EXEEXT) + /bin/rm -f $(OBJS) *~ $(PACKAGE_NAME)$(EXEEXT) test: test.sh CC='$(CC)' ./test.sh @@ -46,7 +47,7 @@ check: test distclean: clean - /bin/rm -f Makefile config.h config.sub config.log build-stamp config.status + /bin/rm -f Makefile config.h config.sub config.log build-stamp config.status configure config.h # FIXME: To fix this, test.sh needs to be able to take ccache from the # installed prefix, not from the source dir. Modified: trunk/CCache/ccache.h =================================================================== --- trunk/CCache/ccache.h 2008-11-05 16:59:27 UTC (rev 10919) +++ trunk/CCache/ccache.h 2008-11-07 17:03:57 UTC (rev 10920) @@ -1,5 +1,7 @@ -#define CCACHE_VERSION "2.4" +#include "ccache_swig_config.h" +#define CCACHE_VERSION SWIG_VERSION + #include "config.h" #include <stdio.h> @@ -34,7 +36,7 @@ #define STATUS_FATAL 4 #define STATUS_NOCACHE 5 -#define MYNAME "ccache-swig" +#define MYNAME PACKAGE_NAME #define LIMIT_MULTIPLE 0.8 Added: trunk/CCache/ccache_swig_config.h.in =================================================================== --- trunk/CCache/ccache_swig_config.h.in (rev 0) +++ trunk/CCache/ccache_swig_config.h.in 2008-11-07 17:03:57 UTC (rev 10920) @@ -0,0 +1 @@ +#define SWIG_VERSION "@PACKAGE_VERSION@" Modified: trunk/CCache/configure.in =================================================================== --- trunk/CCache/configure.in 2008-11-05 16:59:27 UTC (rev 10919) +++ trunk/CCache/configure.in 2008-11-07 17:03:57 UTC (rev 10920) @@ -1,7 +1,8 @@ dnl Process this file with autoconf to produce a configure script. -AC_INIT() +AC_INIT([ccache-swig], [0.0]) # Get version from SWIG in ccache_swig_config.h.in AC_PREREQ(2.52) +AC_CONFIG_SRCDIR([ccache.h]) AC_MSG_NOTICE([Configuring ccache]) Modified: trunk/Makefile.in =================================================================== --- trunk/Makefile.in 2008-11-05 16:59:27 UTC (rev 10919) +++ trunk/Makefile.in 2008-11-07 17:03:57 UTC (rev 10920) @@ -14,16 +14,21 @@ SHELL = /bin/sh SWIG_LIB = @swig_lib@ BIN_DIR = @bindir@ +ENABLE_CCACHE = @ENABLE_CCACHE@ TARGET_NOEXE= swig TARGET = $(TARGET_NOEXE)@EXEEXT@ SOURCE = Source +CCACHE = CCache DOCS = Doc/Manual -swig: libfiles source +swig: libfiles source ccache source: @cd $(SOURCE) && $(MAKE) +ccache: + test -z "$(ENABLE_CCACHE)" || (cd $(CCACHE) && $(MAKE)) + libfiles: $(srcdir)/Lib/swigwarn.swg # Files required just for the tarball @@ -349,6 +354,9 @@ @echo cleaning Docs @test -d $(DOCS) || exit 0; cd $(DOCS) && $(MAKE) -s clean +clean-ccache: + test -z "$(ENABLE_CCACHE)" || (cd $(CCACHE) && $(MAKE) -s clean) + maintainer-clean: clean-libfiles @cd $(SOURCE) && $(MAKE) maintainer-clean @@ -358,7 +366,7 @@ DISTCLEAN-DEAD = config.status config.log config.cache swig.spec Makefile mkmf.log libtool -distclean: distclean-objects clean-examples clean-gifplot distclean-test-suite clean-docs distclean-dead +distclean: distclean-objects clean-examples clean-gifplot distclean-test-suite clean-docs distclean-dead distclean-ccache distclean-objects: distclean-source @@ -371,6 +379,9 @@ @echo distcleaning Examples/test-suite @$(MAKE) -k -s noskip-test-suite ACTION=distclean +distclean-ccache: + test -z "$(ENABLE_CCACHE)" || (cd $(CCACHE) && $(MAKE) -s distclean) + noskip-test-suite: \ noskip-tcl-test-suite \ noskip-perl5-test-suite \ Modified: trunk/autogen.sh =================================================================== --- trunk/autogen.sh 2008-11-05 16:59:27 UTC (rev 10919) +++ trunk/autogen.sh 2008-11-07 17:03:57 UTC (rev 10920) @@ -13,3 +13,4 @@ ${AUTOHEADER-autoheader} ${AUTOMAKE-automake} --add-missing --copy --force-missing ${AUTOCONF-autoconf} +cd CCache && ${AUTORECONF-autoreconf} Modified: trunk/configure.in =================================================================== --- trunk/configure.in 2008-11-05 16:59:27 UTC (rev 10919) +++ trunk/configure.in 2008-11-07 17:03:57 UTC (rev 10920) @@ -2131,7 +2131,6 @@ esac AC_DEFINE_UNQUOTED(SWIG_LIB_WIN_UNIX, ["$SWIG_LIB_WIN_UNIX"], [Directory for SWIG system-independent libraries (Unix install on native Windows)]) - AC_CONFIG_FILES([ \ Makefile \ swig.spec \ @@ -2164,7 +2163,19 @@ Lib/ocaml/swigp4.ml ]) AC_CONFIG_FILES([preinst-swig], [chmod +x preinst-swig]) -AC_OUTPUT +AC_CONFIG_FILES([CCache/ccache_swig_config.h]) +# ccache +AC_ARG_ENABLE([ccache], AS_HELP_STRING([--disable-ccache], [disable building and installation of ccache-swig executable (default enabled)]), [enable_ccache=$enableval], [enable_ccache=yes]) +AC_MSG_CHECKING([whether to enable ccache-swig]) +AC_MSG_RESULT([$enable_ccache]) +if test "$enable_ccache" = yes; then + AC_CONFIG_SUBDIRS(CCache) + ENABLE_CCACHE=1 +fi + +AC_SUBST(ENABLE_CCACHE) + +AC_OUTPUT dnl configure.in ends here This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2008-11-11 22:56:40
|
Revision: 10928 http://swig.svn.sourceforge.net/swig/?rev=10928&view=rev Author: wsfulton Date: 2008-11-11 22:56:36 +0000 (Tue, 11 Nov 2008) Log Message: ----------- Add patch #2152691 from MATSUURA Takanori which fixes compiles using the Intel compiler Modified Paths: -------------- trunk/CHANGES.current trunk/Lib/java/javahead.swg Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2008-11-11 22:28:18 UTC (rev 10927) +++ trunk/CHANGES.current 2008-11-11 22:56:36 UTC (rev 10928) @@ -4,6 +4,10 @@ ============================ 2008-11-01: wsfulton + [Java] Add patch #2152691 from MATSUURA Takanori which fixes compiles using the + Intel compiler + +2008-11-01: wsfulton Add patch #2128249 from Anatoly Techtonik which corrects the C/C++ proxy class being reported for Python docstrings when %rename is used. Modified: trunk/Lib/java/javahead.swg =================================================================== --- trunk/Lib/java/javahead.swg 2008-11-11 22:28:18 UTC (rev 10927) +++ trunk/Lib/java/javahead.swg 2008-11-11 22:56:36 UTC (rev 10928) @@ -34,7 +34,7 @@ %insert(runtime) %{ /* Fix for jlong on some versions of gcc on Windows */ -#if defined(__GNUC__) && !defined(__INTELC__) +#if defined(__GNUC__) && !defined(__INTEL_COMPILER) typedef long long __int64; #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2008-11-16 21:40:35
|
Revision: 10930 http://swig.svn.sourceforge.net/swig/?rev=10930&view=rev Author: wsfulton Date: 2008-11-16 21:40:28 +0000 (Sun, 16 Nov 2008) Log Message: ----------- Fix -nopreprocess option to correctly generate output filenames and display filenames in warnings and errors Modified Paths: -------------- trunk/CHANGES.current trunk/Source/CParse/cparse.h trunk/Source/CParse/cscanner.c trunk/Source/CParse/parser.y trunk/Source/Modules/main.cxx Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2008-11-16 21:13:04 UTC (rev 10929) +++ trunk/CHANGES.current 2008-11-16 21:40:28 UTC (rev 10930) @@ -1,9 +1,14 @@ -2008-09-26 Mikel Bancroft <mi...@fr...> - Version 1.3.37 (in progress) ============================ -2008-11-01: wsfulton +2008-11-16: wsfulton + Fix -nopreprocess option to: + - correctly report file names in warning and error messages. + - use the original input filename that created the preprocessed output when + determining the C++ wrapper file name (in the absence of -o). Previously + the name of the input file containing the preprocessed output was used. + +2008-11-11: wsfulton [Java] Add patch #2152691 from MATSUURA Takanori which fixes compiles using the Intel compiler Modified: trunk/Source/CParse/cparse.h =================================================================== --- trunk/Source/CParse/cparse.h 2008-11-16 21:13:04 UTC (rev 10929) +++ trunk/Source/CParse/cparse.h 2008-11-16 21:40:28 UTC (rev 10930) @@ -34,7 +34,9 @@ extern void scanner_ignore_typedef(void); extern void scanner_last_id(int); extern void scanner_clear_rename(void); - extern void scanner_set_location(String_or_char *, int line); + extern void scanner_set_location(String_or_char *file, int line); + extern void scanner_set_main_input_file(String *file); + extern String *scanner_get_main_input_file(); extern void Swig_cparse_follow_locators(int); extern void start_inline(char *, int); extern String *scanner_ccode; Modified: trunk/Source/CParse/cscanner.c =================================================================== --- trunk/Source/CParse/cscanner.c 2008-11-16 21:13:04 UTC (rev 10929) +++ trunk/Source/CParse/cscanner.c 2008-11-16 21:40:28 UTC (rev 10930) @@ -22,8 +22,11 @@ static Scanner *scan = 0; /* Global string containing C code. Used by the parser to grab code blocks */ -DOHString *scanner_ccode = 0; +String *scanner_ccode = 0; +/* The main file being parsed */ +static String *main_input_file = 0; + /* Error reporting/location information */ int cparse_line = 1; String *cparse_file = 0; @@ -467,6 +470,14 @@ next_token = tok; } +void scanner_set_main_input_file(String *file) { + main_input_file = file; +} + +String *scanner_get_main_input_file() { + return main_input_file; +} + /* ---------------------------------------------------------------------------- * int yylex() * Modified: trunk/Source/CParse/parser.y =================================================================== --- trunk/Source/CParse/parser.y 2008-11-16 21:13:04 UTC (rev 10929) +++ trunk/Source/CParse/parser.y 2008-11-16 21:40:28 UTC (rev 10930) @@ -1894,6 +1894,8 @@ $1.filename = Copy(cparse_file); $1.line = cparse_line; scanner_set_location(NewString($3),1); + if ($2 && GetFlag($2, "maininput")) + scanner_set_main_input_file(NewString($3)); } interface RBRACKET { String *mname = 0; $$ = $6; Modified: trunk/Source/Modules/main.cxx =================================================================== --- trunk/Source/Modules/main.cxx 2008-11-16 21:13:04 UTC (rev 10929) +++ trunk/Source/Modules/main.cxx 2008-11-16 21:40:28 UTC (rev 10930) @@ -965,11 +965,6 @@ } } } else { - // Check the suffix for a .c file. If so, we're going to - // declare everything we see as "extern" - - ForceExtern = check_suffix(input_file); - // Run the preprocessor if (Verbose) printf("Preprocessing...\n"); @@ -997,7 +992,7 @@ if (lang_config) { Printf(fs, "\n%%include <%s>\n", lang_config); } - Printf(fs, "%%include \"%s\"\n", Swig_last_file()); + Printf(fs, "%%include(maininput=1) \"%s\"\n", Swig_last_file()); for (i = 0; i < Len(libfiles); i++) { Printf(fs, "\n%%include \"%s\"\n", Getitem(libfiles, i)); } @@ -1006,7 +1001,7 @@ Delete(fs); } else { df = Swig_open(input_file); - cpps = NewFileFromFile(df); + cpps = Swig_read_file(df); } if (Swig_error_count()) { SWIG_exit(EXIT_FAILURE); @@ -1016,47 +1011,53 @@ SWIG_exit(EXIT_SUCCESS); } if (depend) { - String *outfile; - if (!outfile_name) { - if (CPlusPlus || lang->cplus_runtime_mode()) { - outfile = NewStringf("%s_wrap.%s", Swig_file_basename(input_file), cpp_extension); + if (!no_cpp) { + String *outfile; + if (!outfile_name) { + if (CPlusPlus || lang->cplus_runtime_mode()) { + outfile = NewStringf("%s_wrap.%s", Swig_file_basename(input_file), cpp_extension); + } else { + outfile = NewStringf("%s_wrap.c", Swig_file_basename(input_file)); + } } else { - outfile = NewStringf("%s_wrap.c", Swig_file_basename(input_file)); + outfile = NewString(outfile_name); } - } else { - outfile = NewString(outfile_name); - } - if (dependencies_file && Len(dependencies_file) != 0) { - f_dependencies_file = NewFile(dependencies_file, "w", SWIG_output_files()); - if (!f_dependencies_file) { - FileErrorDisplay(dependencies_file); - SWIG_exit(EXIT_FAILURE); + if (dependencies_file && Len(dependencies_file) != 0) { + f_dependencies_file = NewFile(dependencies_file, "w", SWIG_output_files()); + if (!f_dependencies_file) { + FileErrorDisplay(dependencies_file); + SWIG_exit(EXIT_FAILURE); + } + } else if (!depend_only) { + String *filename = NewStringf("%s_wrap.%s", Swig_file_basename(input_file), depends_extension); + f_dependencies_file = NewFile(filename, "w", SWIG_output_files()); + if (!f_dependencies_file) { + FileErrorDisplay(filename); + SWIG_exit(EXIT_FAILURE); + } + } else + f_dependencies_file = stdout; + if (dependencies_target) { + Printf(f_dependencies_file, "%s: ", dependencies_target); + } else { + Printf(f_dependencies_file, "%s: ", outfile); } - } else if (!depend_only) { - String *filename = NewStringf("%s_wrap.%s", Swig_file_basename(input_file), depends_extension); - f_dependencies_file = NewFile(filename, "w", SWIG_output_files()); - if (!f_dependencies_file) { - FileErrorDisplay(filename); - SWIG_exit(EXIT_FAILURE); + List *files = Preprocessor_depend(); + for (int i = 0; i < Len(files); i++) { + if ((depend != 2) || ((depend == 2) && (Strncmp(Getitem(files, i), SwigLib, Len(SwigLib)) != 0))) { + Printf(f_dependencies_file, "\\\n %s ", Getitem(files, i)); + } } - } else - f_dependencies_file = stdout; - if (dependencies_target) { - Printf(f_dependencies_file, "%s: ", dependencies_target); + Printf(f_dependencies_file, "\n"); + if (f_dependencies_file != stdout) + Close(f_dependencies_file); + if (depend_only) + SWIG_exit(EXIT_SUCCESS); } else { - Printf(f_dependencies_file, "%s: ", outfile); + Printf(stderr, "Cannot generate dependencies with -nopreprocess\n"); + // Actually we could but it would be inefficient when just generating dependencies, as it would be done after Swig_cparse + SWIG_exit(EXIT_FAILURE); } - List *files = Preprocessor_depend(); - for (int i = 0; i < Len(files); i++) { - if ((depend != 2) || ((depend == 2) && (Strncmp(Getitem(files, i), SwigLib, Len(SwigLib)) != 0))) { - Printf(f_dependencies_file, "\\\n %s ", Getitem(files, i)); - } - } - Printf(f_dependencies_file, "\n"); - if (f_dependencies_file != stdout) - Close(f_dependencies_file); - if (depend_only) - SWIG_exit(EXIT_SUCCESS); } Seek(cpps, 0, SEEK_SET); } @@ -1138,18 +1139,20 @@ SWIG_exit(EXIT_FAILURE); } else { /* Set some filename information on the object */ - Setattr(top, "infile", input_file); + String *infile = scanner_get_main_input_file(); + Setattr(top, "infile", infile); // Note: if nopreprocess then infile is the original input file, otherwise input_file + Setattr(top, "inputfile", input_file); if (!outfile_name) { if (CPlusPlus || lang->cplus_runtime_mode()) { - Setattr(top, "outfile", NewStringf("%s_wrap.%s", Swig_file_basename(input_file), cpp_extension)); + Setattr(top, "outfile", NewStringf("%s_wrap.%s", Swig_file_basename(infile), cpp_extension)); } else { - Setattr(top, "outfile", NewStringf("%s_wrap.c", Swig_file_basename(input_file))); + Setattr(top, "outfile", NewStringf("%s_wrap.c", Swig_file_basename(infile))); } } else { Setattr(top, "outfile", outfile_name); } if (!outfile_name_h) { - Setattr(top, "outfile_h", NewStringf("%s_wrap.%s", Swig_file_basename(input_file), hpp_extension)); + Setattr(top, "outfile_h", NewStringf("%s_wrap.%s", Swig_file_basename(infile), hpp_extension)); } else { Setattr(top, "outfile_h", outfile_name_h); } @@ -1157,7 +1160,12 @@ if (Swig_contract_mode_get()) { Swig_contracts(top); } + + // Check the suffix for a c/c++ file. If so, we're going to declare everything we see as "extern" + ForceExtern = check_suffix(input_file); + lang->top(top); + if (browse) { Swig_browser(top, 0); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2008-11-17 22:48:02
|
Revision: 10932 http://swig.svn.sourceforge.net/swig/?rev=10932&view=rev Author: wsfulton Date: 2008-11-17 22:47:55 +0000 (Mon, 17 Nov 2008) Log Message: ----------- rename java run tests from main to runme for consistency across the languages Modified Paths: -------------- trunk/Doc/Manual/Java.html trunk/Examples/GIFPlot/Java/full/README trunk/Examples/GIFPlot/Java/shadow/README trunk/Examples/GIFPlot/Java/simple/README trunk/Examples/Makefile.in trunk/Examples/java/class/index.html trunk/Examples/java/constants/index.html trunk/Examples/java/enum/index.html trunk/Examples/java/funcptr/index.html trunk/Examples/java/index.html trunk/Examples/java/native/index.html trunk/Examples/java/pointer/index.html trunk/Examples/java/reference/index.html trunk/Examples/java/simple/index.html trunk/Examples/java/template/index.html trunk/Examples/java/typemap/index.html trunk/Examples/java/variables/index.html Added Paths: ----------- trunk/Examples/GIFPlot/Java/full/runme.java trunk/Examples/GIFPlot/Java/shadow/runme.java trunk/Examples/GIFPlot/Java/simple/runme.java trunk/Examples/java/callback/runme.java trunk/Examples/java/class/runme.java trunk/Examples/java/constants/runme.java trunk/Examples/java/enum/runme.java trunk/Examples/java/extend/runme.java trunk/Examples/java/funcptr/runme.java trunk/Examples/java/multimap/runme.java trunk/Examples/java/native/runme.java trunk/Examples/java/pointer/runme.java trunk/Examples/java/reference/runme.java trunk/Examples/java/simple/runme.java trunk/Examples/java/template/runme.java trunk/Examples/java/typemap/runme.java trunk/Examples/java/variables/runme.java Removed Paths: ------------- trunk/Examples/GIFPlot/Java/full/main.java trunk/Examples/GIFPlot/Java/shadow/main.java trunk/Examples/GIFPlot/Java/simple/main.java trunk/Examples/java/callback/main.java trunk/Examples/java/class/main.java trunk/Examples/java/constants/main.java trunk/Examples/java/enum/main.java trunk/Examples/java/extend/main.java trunk/Examples/java/funcptr/main.java trunk/Examples/java/multimap/main.java trunk/Examples/java/native/main.java trunk/Examples/java/pointer/main.java trunk/Examples/java/reference/main.java trunk/Examples/java/simple/main.java trunk/Examples/java/template/main.java trunk/Examples/java/typemap/main.java trunk/Examples/java/variables/main.java Modified: trunk/Doc/Manual/Java.html =================================================================== --- trunk/Doc/Manual/Java.html 2008-11-17 22:43:15 UTC (rev 10931) +++ trunk/Doc/Manual/Java.html 2008-11-17 22:47:55 UTC (rev 10932) @@ -353,9 +353,9 @@ To load your shared native library module in Java, simply use Java's <tt>System.loadLibrary</tt> method in a Java class:</p> <div class="code"><pre> -// main.java +// runme.java -public class main { +public class runme { static { \xA0 System.loadLibrary("example"); } @@ -372,7 +372,7 @@ <div class="code"><pre> $ javac *.java -$ java main +$ java runme 24 $ </pre></div> @@ -394,12 +394,12 @@ </p> <div class="code"><pre> -$ java main +$ java runme Exception in thread "main" java.lang.UnsatisfiedLinkError: no example in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1312) at java.lang.Runtime.loadLibrary0(Runtime.java:749) at java.lang.System.loadLibrary(System.java:820) - at main.<clinit>(main.java:5) + at runme.<clinit>(runme.java:5) </pre></div> <p> @@ -426,7 +426,7 @@ </p> <div class="code"><pre> -$ java main +$ java runme Exception in thread "main" java.lang.UnsatisfiedLinkError: libexample.so: undefined symbol: fact at java.lang.ClassLoader$NativeLibrary.load(Native Method) @@ -434,7 +434,7 @@ at java.lang.ClassLoader.loadLibrary(ClassLoader.java, Compiled Code) at java.lang.Runtime.loadLibrary0(Runtime.java, Compiled Code) at java.lang.System.loadLibrary(System.java, Compiled Code) - at main.<clinit>(main.java:5) + at runme.<clinit>(runme.java:5) $ </pre></div> @@ -3760,7 +3760,7 @@ Exception in thread "main" java.lang.OutOfMemoryError: Not enough memory at exampleJNI.malloc(Native Method) at example.malloc(example.java:16) - at main.main(main.java:112) + at runme.main(runme.java:112) </pre> </div> @@ -6168,9 +6168,9 @@ </p> <div class="code"><pre> -// File main.java +// File runme.java -public class main { +public class runme { static { try { @@ -6196,7 +6196,7 @@ </p> <div class="code"><pre> -$ java main +$ java runme argv[0] = Cat argv[1] = Dog argv[2] = Cow @@ -6387,9 +6387,9 @@ </p> <div class="code"><pre> -// File: main.java +// File: runme.java -public class main { +public class runme { static { try { @@ -6414,7 +6414,7 @@ </p> <div class="code"><pre> -$ java main +$ java runme 1 12.0 340.0 </pre></div> @@ -6474,7 +6474,7 @@ <div class="code"><pre> Ambulance started java.lang.ClassCastException - at main.main(main.java:16) + at runme.main(runme.java:16) </pre></div> <p> Modified: trunk/Examples/GIFPlot/Java/full/README =================================================================== --- trunk/Examples/GIFPlot/Java/full/README 2008-11-17 22:43:15 UTC (rev 10931) +++ trunk/Examples/GIFPlot/Java/full/README 2008-11-17 22:47:55 UTC (rev 10932) @@ -1,8 +1,8 @@ This example runs the entire gifplot.h header file through SWIG without -any changes. The program 'main.java' does something a little more -interesting. After doing a make, run it using 'java main'. You'll have to go +any changes. The program 'runme.java' does something a little more +interesting. After doing a make, run it using 'java runme'. You'll have to go look at the header file to get a complete listing of the functions. -Note the differences in the main.java files between this example and the +Note the differences in the runme.java files between this example and the 'full' example. This example does not use shadow classes. Deleted: trunk/Examples/GIFPlot/Java/full/main.java =================================================================== --- trunk/Examples/GIFPlot/Java/full/main.java 2008-11-17 22:43:15 UTC (rev 10931) +++ trunk/Examples/GIFPlot/Java/full/main.java 2008-11-17 22:47:55 UTC (rev 10932) @@ -1,75 +0,0 @@ -// Plot a 3D function -import java.lang.Math; - -public class main { - - static { - try { - System.loadLibrary("gifplot"); - } catch (UnsatisfiedLinkError e) { - System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e); - System.exit(1); - } - } - - public static void main(String argv[]) { - - // Here are some plotting parameters - double xmin = -5.0; - double xmax = 5.0; - double ymin = -5.0; - double ymax = 5.0; - double zmin = -5.0; - double zmax = 5.0; - - // Grid resolution - int nxpoints = 60; - int nypoints = 60; - - SWIGTYPE_p_ColorMap cmap = gifplot.new_ColorMap("cmap"); - SWIGTYPE_p_FrameBuffer frame = gifplot.new_FrameBuffer(500,500); - gifplot.FrameBuffer_clear(frame,(short)gifplot.BLACK); - - SWIGTYPE_p_Plot3D p3 = gifplot.new_Plot3D(frame,xmin,ymin,zmin,xmax,ymax,zmax); - gifplot.Plot3D_lookat(p3,2*(zmax-zmin)); - gifplot.Plot3D_autoperspective(p3,40); - gifplot.Plot3D_rotu(p3,60); - gifplot.Plot3D_rotr(p3,30); - gifplot.Plot3D_rotd(p3,10); - - System.out.println( "Making a nice 3D plot..." ); - gifplot.Plot3D_clear(p3,(short)gifplot.BLACK); - gifplot.Plot3D_start(p3); - double dx = 1.0*(xmax-xmin)/nxpoints; - double dy = 1.0*(ymax-ymin)/nypoints; - double cscale = 240.0/(zmax-zmin); - double x = xmin; - for (int i = 0; i < nxpoints; i++) { - double y = ymin; - for (int j = 0; j < nypoints; j++) { - double z1 = func(x,y); - double z2 = func(x+dx,y); - double z3 = func(x+dx,y+dy); - double z4 = func(x,y+dy); - double c1 = cscale*(z1-zmin); - double c2 = cscale*(z2-zmin); - double c3 = cscale*(z3-zmin); - double c4 = cscale*(z4-zmin); - double c = (c1+c2+c3+c4)/4; - if (c < 0) c = 0; - if (c > 239) c = 239; - gifplot.Plot3D_solidquad(p3,x,y,z1,x+dx,y,z2,x+dx,y+dy,z3,x,y+dy,z4,(short)(c+16)); - y = y + dy; - } - x = x + dx; - } - - gifplot.FrameBuffer_writeGIF(frame,cmap,"image.gif"); - System.out.println( "Wrote image.gif" ); - } - - // Here is the function to plot - public static double func(double x, double y) { - return 5*java.lang.Math.cos(2*java.lang.Math.sqrt(x*x+y*y))*java.lang.Math.exp(-0.3*java.lang.Math.sqrt(x*x+y*y)); - } -} Copied: trunk/Examples/GIFPlot/Java/full/runme.java (from rev 10924, trunk/Examples/GIFPlot/Java/full/main.java) =================================================================== --- trunk/Examples/GIFPlot/Java/full/runme.java (rev 0) +++ trunk/Examples/GIFPlot/Java/full/runme.java 2008-11-17 22:47:55 UTC (rev 10932) @@ -0,0 +1,75 @@ +// Plot a 3D function +import java.lang.Math; + +public class runme { + + static { + try { + System.loadLibrary("gifplot"); + } catch (UnsatisfiedLinkError e) { + System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e); + System.exit(1); + } + } + + public static void main(String argv[]) { + + // Here are some plotting parameters + double xmin = -5.0; + double xmax = 5.0; + double ymin = -5.0; + double ymax = 5.0; + double zmin = -5.0; + double zmax = 5.0; + + // Grid resolution + int nxpoints = 60; + int nypoints = 60; + + SWIGTYPE_p_ColorMap cmap = gifplot.new_ColorMap("cmap"); + SWIGTYPE_p_FrameBuffer frame = gifplot.new_FrameBuffer(500,500); + gifplot.FrameBuffer_clear(frame,(short)gifplot.BLACK); + + SWIGTYPE_p_Plot3D p3 = gifplot.new_Plot3D(frame,xmin,ymin,zmin,xmax,ymax,zmax); + gifplot.Plot3D_lookat(p3,2*(zmax-zmin)); + gifplot.Plot3D_autoperspective(p3,40); + gifplot.Plot3D_rotu(p3,60); + gifplot.Plot3D_rotr(p3,30); + gifplot.Plot3D_rotd(p3,10); + + System.out.println( "Making a nice 3D plot..." ); + gifplot.Plot3D_clear(p3,(short)gifplot.BLACK); + gifplot.Plot3D_start(p3); + double dx = 1.0*(xmax-xmin)/nxpoints; + double dy = 1.0*(ymax-ymin)/nypoints; + double cscale = 240.0/(zmax-zmin); + double x = xmin; + for (int i = 0; i < nxpoints; i++) { + double y = ymin; + for (int j = 0; j < nypoints; j++) { + double z1 = func(x,y); + double z2 = func(x+dx,y); + double z3 = func(x+dx,y+dy); + double z4 = func(x,y+dy); + double c1 = cscale*(z1-zmin); + double c2 = cscale*(z2-zmin); + double c3 = cscale*(z3-zmin); + double c4 = cscale*(z4-zmin); + double c = (c1+c2+c3+c4)/4; + if (c < 0) c = 0; + if (c > 239) c = 239; + gifplot.Plot3D_solidquad(p3,x,y,z1,x+dx,y,z2,x+dx,y+dy,z3,x,y+dy,z4,(short)(c+16)); + y = y + dy; + } + x = x + dx; + } + + gifplot.FrameBuffer_writeGIF(frame,cmap,"image.gif"); + System.out.println( "Wrote image.gif" ); + } + + // Here is the function to plot + public static double func(double x, double y) { + return 5*java.lang.Math.cos(2*java.lang.Math.sqrt(x*x+y*y))*java.lang.Math.exp(-0.3*java.lang.Math.sqrt(x*x+y*y)); + } +} Modified: trunk/Examples/GIFPlot/Java/shadow/README =================================================================== --- trunk/Examples/GIFPlot/Java/shadow/README 2008-11-17 22:43:15 UTC (rev 10931) +++ trunk/Examples/GIFPlot/Java/shadow/README 2008-11-17 22:47:55 UTC (rev 10932) @@ -1,5 +1,5 @@ This example uses the file in ../../Interface/gifplot.i to build -an interface with shadow classes. After doing a make, run the program main, ie: 'java main'. +an interface with shadow classes. After doing a make, run the program runme, ie: 'java runme'. -Note the differences in the main.java files between this example and the +Note the differences in the runme.java files between this example and the 'full' example. This example uses the shadow classes. Deleted: trunk/Examples/GIFPlot/Java/shadow/main.java =================================================================== --- trunk/Examples/GIFPlot/Java/shadow/main.java 2008-11-17 22:43:15 UTC (rev 10931) +++ trunk/Examples/GIFPlot/Java/shadow/main.java 2008-11-17 22:47:55 UTC (rev 10932) @@ -1,76 +0,0 @@ -// Plot a 3D function - -import java.lang.Math; - -public class main { - - static { - try { - System.loadLibrary("gifplot"); - } catch (UnsatisfiedLinkError e) { - System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e); - System.exit(1); - } - } - - public static void main(String argv[]) { - - // Here are some plotting parameters - double xmin = -5.0; - double xmax = 5.0; - double ymin = -5.0; - double ymax = 5.0; - double zmin = -5.0; - double zmax = 5.0; - - // Grid resolution - int nxpoints = 60; - int nypoints = 60; - - ColorMap cmap = new ColorMap("cmap"); - FrameBuffer frame = new FrameBuffer(500,500); - frame.clear((short)gifplot.BLACK); - - Plot3D p3 = new Plot3D(frame,xmin,ymin,zmin,xmax,ymax,zmax); - p3.lookat(2*(zmax-zmin)); - p3.autoperspective(40); - p3.rotu(60); - p3.rotr(30); - p3.rotd(10); - - System.out.println( "Making a nice 3D plot..." ); - p3.clear((short)gifplot.BLACK); - p3.start(); - double dx = 1.0*(xmax-xmin)/nxpoints; - double dy = 1.0*(ymax-ymin)/nypoints; - double cscale = 240.0/(zmax-zmin); - double x = xmin; - for (int i = 0; i < nxpoints; i++) { - double y = ymin; - for (int j = 0; j < nypoints; j++) { - double z1 = func(x,y); - double z2 = func(x+dx,y); - double z3 = func(x+dx,y+dy); - double z4 = func(x,y+dy); - double c1 = cscale*(z1-zmin); - double c2 = cscale*(z2-zmin); - double c3 = cscale*(z3-zmin); - double c4 = cscale*(z4-zmin); - double c = (c1+c2+c3+c4)/4; - if (c < 0) c = 0; - if (c > 239) c = 239; - p3.solidquad(x,y,z1,x+dx,y,z2,x+dx,y+dy,z3,x,y+dy,z4,(short)(c+16)); - y = y + dy; - } - x = x + dx; - } - - frame.writeGIF(cmap,"image.gif"); - System.out.println( "Wrote image.gif" ); - } - - // Here is the function to plot - public static double func(double x, double y) { - return 5*java.lang.Math.cos(2*java.lang.Math.sqrt(x*x+y*y))*java.lang.Math.exp(-0.3*java.lang.Math.sqrt(x*x+y*y)); - } -} Copied: trunk/Examples/GIFPlot/Java/shadow/runme.java (from rev 10924, trunk/Examples/GIFPlot/Java/shadow/main.java) =================================================================== --- trunk/Examples/GIFPlot/Java/shadow/runme.java (rev 0) +++ trunk/Examples/GIFPlot/Java/shadow/runme.java 2008-11-17 22:47:55 UTC (rev 10932) @@ -0,0 +1,76 @@ +// Plot a 3D function + +import java.lang.Math; + +public class runme { + + static { + try { + System.loadLibrary("gifplot"); + } catch (UnsatisfiedLinkError e) { + System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e); + System.exit(1); + } + } + + public static void main(String argv[]) { + + // Here are some plotting parameters + double xmin = -5.0; + double xmax = 5.0; + double ymin = -5.0; + double ymax = 5.0; + double zmin = -5.0; + double zmax = 5.0; + + // Grid resolution + int nxpoints = 60; + int nypoints = 60; + + ColorMap cmap = new ColorMap("cmap"); + FrameBuffer frame = new FrameBuffer(500,500); + frame.clear((short)gifplot.BLACK); + + Plot3D p3 = new Plot3D(frame,xmin,ymin,zmin,xmax,ymax,zmax); + p3.lookat(2*(zmax-zmin)); + p3.autoperspective(40); + p3.rotu(60); + p3.rotr(30); + p3.rotd(10); + + System.out.println( "Making a nice 3D plot..." ); + p3.clear((short)gifplot.BLACK); + p3.start(); + double dx = 1.0*(xmax-xmin)/nxpoints; + double dy = 1.0*(ymax-ymin)/nypoints; + double cscale = 240.0/(zmax-zmin); + double x = xmin; + for (int i = 0; i < nxpoints; i++) { + double y = ymin; + for (int j = 0; j < nypoints; j++) { + double z1 = func(x,y); + double z2 = func(x+dx,y); + double z3 = func(x+dx,y+dy); + double z4 = func(x,y+dy); + double c1 = cscale*(z1-zmin); + double c2 = cscale*(z2-zmin); + double c3 = cscale*(z3-zmin); + double c4 = cscale*(z4-zmin); + double c = (c1+c2+c3+c4)/4; + if (c < 0) c = 0; + if (c > 239) c = 239; + p3.solidquad(x,y,z1,x+dx,y,z2,x+dx,y+dy,z3,x,y+dy,z4,(short)(c+16)); + y = y + dy; + } + x = x + dx; + } + + frame.writeGIF(cmap,"image.gif"); + System.out.println( "Wrote image.gif" ); + } + + // Here is the function to plot + public static double func(double x, double y) { + return 5*java.lang.Math.cos(2*java.lang.Math.sqrt(x*x+y*y))*java.lang.Math.exp(-0.3*java.lang.Math.sqrt(x*x+y*y)); + } +} Modified: trunk/Examples/GIFPlot/Java/simple/README =================================================================== --- trunk/Examples/GIFPlot/Java/simple/README 2008-11-17 22:43:15 UTC (rev 10931) +++ trunk/Examples/GIFPlot/Java/simple/README 2008-11-17 22:47:55 UTC (rev 10932) @@ -1,5 +1,5 @@ This is a very minimalistic example in which just a few functions and constants from library are wrapped and used to draw some simple -shapes. After doing a make, run the java program, ie 'java main'. +shapes. After doing a make, run the java program, ie 'java runme'. Deleted: trunk/Examples/GIFPlot/Java/simple/main.java =================================================================== --- trunk/Examples/GIFPlot/Java/simple/main.java 2008-11-17 22:43:15 UTC (rev 10931) +++ trunk/Examples/GIFPlot/Java/simple/main.java 2008-11-17 22:47:55 UTC (rev 10932) @@ -1,41 +0,0 @@ - -public class main { - - static { - try { - System.loadLibrary("simple"); - } catch (UnsatisfiedLinkError e) { - System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e); - System.exit(1); - } - } - - public static void main(String argv[]) { - - // Draw some simple shapes - System.out.println( "Drawing some basic shapes" ); - - SWIGTYPE_p_ColorMap cmap = simple.new_ColorMap(null); - SWIGTYPE_p_FrameBuffer f = simple.new_FrameBuffer(400,400); - - // Clear the picture - simple.FrameBuffer_clear(f,(short)simple.BLACK); - - // Make a red box - simple.FrameBuffer_box(f,40,40,200,200,(short)simple.RED); - - // Make a blue circle - simple.FrameBuffer_circle(f,200,200,40,(short)simple.BLUE); - - // Make green line - simple.FrameBuffer_line(f,10,390,390,200, (short)simple.GREEN); - - // Write an image out to disk - - simple.FrameBuffer_writeGIF(f,cmap,"image.gif"); - System.out.println( "Wrote image.gif" ); - - simple.delete_FrameBuffer(f); - simple.delete_ColorMap(cmap); - } -} Copied: trunk/Examples/GIFPlot/Java/simple/runme.java (from rev 10924, trunk/Examples/GIFPlot/Java/simple/main.java) =================================================================== --- trunk/Examples/GIFPlot/Java/simple/runme.java (rev 0) +++ trunk/Examples/GIFPlot/Java/simple/runme.java 2008-11-17 22:47:55 UTC (rev 10932) @@ -0,0 +1,41 @@ + +public class runme { + + static { + try { + System.loadLibrary("simple"); + } catch (UnsatisfiedLinkError e) { + System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e); + System.exit(1); + } + } + + public static void main(String argv[]) { + + // Draw some simple shapes + System.out.println( "Drawing some basic shapes" ); + + SWIGTYPE_p_ColorMap cmap = simple.new_ColorMap(null); + SWIGTYPE_p_FrameBuffer f = simple.new_FrameBuffer(400,400); + + // Clear the picture + simple.FrameBuffer_clear(f,(short)simple.BLACK); + + // Make a red box + simple.FrameBuffer_box(f,40,40,200,200,(short)simple.RED); + + // Make a blue circle + simple.FrameBuffer_circle(f,200,200,40,(short)simple.BLUE); + + // Make green line + simple.FrameBuffer_line(f,10,390,390,200, (short)simple.GREEN); + + // Write an image out to disk + + simple.FrameBuffer_writeGIF(f,cmap,"image.gif"); + System.out.println( "Wrote image.gif" ); + + simple.delete_FrameBuffer(f); + simple.delete_ColorMap(cmap); + } +} Modified: trunk/Examples/Makefile.in =================================================================== --- trunk/Examples/Makefile.in 2008-11-17 22:43:15 UTC (rev 10931) +++ trunk/Examples/Makefile.in 2008-11-17 22:47:55 UTC (rev 10932) @@ -489,7 +489,7 @@ # ----------------------------------------------------------------- java_clean: - rm -f *_wrap* *~ .~* *.class `find . -name \*.java | grep -v main.java` + rm -f *_wrap* *~ .~* *.class `find . -name \*.java | grep -v runme.java` rm -f core @EXTRA_CLEAN@ rm -f *.@OBJEXT@ *@JAVASO@ Deleted: trunk/Examples/java/callback/main.java =================================================================== --- trunk/Examples/java/callback/main.java 2008-11-17 22:43:15 UTC (rev 10931) +++ trunk/Examples/java/callback/main.java 2008-11-17 22:47:55 UTC (rev 10932) @@ -1,56 +0,0 @@ -public class main -{ - static { - try { - System.loadLibrary("example"); - } catch (UnsatisfiedLinkError e) { - System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e); - System.exit(1); - } - } - - public static void main(String[] args) - { - System.out.println("Adding and calling a normal C++ callback"); - System.out.println("----------------------------------------"); - - Caller caller = new Caller(); - Callback callback = new Callback(); - - caller.setCallback(callback); - caller.call(); - caller.delCallback(); - - callback = new JavaCallback(); - - System.out.println(); - System.out.println("Adding and calling a Java callback"); - System.out.println("------------------------------------"); - - caller.setCallback(callback); - caller.call(); - caller.delCallback(); - - // Test that a double delete does not occur as the object has already been deleted from the C++ layer. - // Note that the garbage collector can also call the delete() method via the finalizer (callback.finalize()) - // at any point after here. - callback.delete(); - - System.out.println(); - System.out.println("java exit"); - } -} - -class JavaCallback extends Callback -{ - public JavaCallback() - { - super(); - } - - public void run() - { - System.out.println("JavaCallback.run()"); - } -} - Copied: trunk/Examples/java/callback/runme.java (from rev 10924, trunk/Examples/java/callback/main.java) =================================================================== --- trunk/Examples/java/callback/runme.java (rev 0) +++ trunk/Examples/java/callback/runme.java 2008-11-17 22:47:55 UTC (rev 10932) @@ -0,0 +1,56 @@ +public class runme +{ + static { + try { + System.loadLibrary("example"); + } catch (UnsatisfiedLinkError e) { + System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e); + System.exit(1); + } + } + + public static void main(String[] args) + { + System.out.println("Adding and calling a normal C++ callback"); + System.out.println("----------------------------------------"); + + Caller caller = new Caller(); + Callback callback = new Callback(); + + caller.setCallback(callback); + caller.call(); + caller.delCallback(); + + callback = new JavaCallback(); + + System.out.println(); + System.out.println("Adding and calling a Java callback"); + System.out.println("------------------------------------"); + + caller.setCallback(callback); + caller.call(); + caller.delCallback(); + + // Test that a double delete does not occur as the object has already been deleted from the C++ layer. + // Note that the garbage collector can also call the delete() method via the finalizer (callback.finalize()) + // at any point after here. + callback.delete(); + + System.out.println(); + System.out.println("java exit"); + } +} + +class JavaCallback extends Callback +{ + public JavaCallback() + { + super(); + } + + public void run() + { + System.out.println("JavaCallback.run()"); + } +} + Modified: trunk/Examples/java/class/index.html =================================================================== --- trunk/Examples/java/class/index.html 2008-11-17 22:43:15 UTC (rev 10931) +++ trunk/Examples/java/class/index.html 2008-11-17 22:47:55 UTC (rev 10932) @@ -88,7 +88,7 @@ <h2>A sample Java program</h2> -Click <a href="main.java">here</a> to see a Java program that calls the C++ functions from Java. +Click <a href="runme.java">here</a> to see a Java program that calls the C++ functions from Java. <h2>Key points</h2> Deleted: trunk/Examples/java/class/main.java =================================================================== --- trunk/Examples/java/class/main.java 2008-11-17 22:43:15 UTC (rev 10931) +++ trunk/Examples/java/class/main.java 2008-11-17 22:47:55 UTC (rev 10932) @@ -1,70 +0,0 @@ -// This example illustrates how C++ classes can be used from Java using SWIG. -// The Java class gets mapped onto the C++ class and behaves as if it is a Java class. - -public class main { - static { - try { - System.loadLibrary("example"); - } catch (UnsatisfiedLinkError e) { - System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e); - System.exit(1); - } - } - - public static void main(String argv[]) - { - // ----- Object creation ----- - - System.out.println( "Creating some objects:" ); - Circle c = new Circle(10); - System.out.println( " Created circle " + c ); - Square s = new Square(10); - System.out.println( " Created square " + s ); - - // ----- Access a static member ----- - - System.out.println( "\nA total of " + Shape.getNshapes() + " shapes were created" ); - - // ----- Member data access ----- - - // Notice how we can do this using functions specific to - // the 'Circle' class. - c.setX(20); - c.setY(30); - - // Now use the same functions in the base class - Shape shape = s; - shape.setX(-10); - shape.setY(5); - - System.out.println( "\nHere is their current position:" ); - System.out.println( " Circle = (" + c.getX() + " " + c.getY() + ")" ); - System.out.println( " Square = (" + s.getX() + " " + s.getY() + ")" ); - - // ----- Call some methods ----- - - System.out.println( "\nHere are some properties of the shapes:" ); - Shape[] shapes = {c,s}; - for (int i=0; i<shapes.length; i++) - { - System.out.println( " " + shapes[i].toString() ); - System.out.println( " area = " + shapes[i].area() ); - System.out.println( " perimeter = " + shapes[i].perimeter() ); - } - - // Notice how the area() and perimeter() functions really - // invoke the appropriate virtual method on each object. - - // ----- Delete everything ----- - - System.out.println( "\nGuess I'll clean up now" ); - - // Note: this invokes the virtual destructor - // You could leave this to the garbage collector - c.delete(); - s.delete(); - - System.out.println( Shape.getNshapes() + " shapes remain" ); - System.out.println( "Goodbye" ); - } -} Copied: trunk/Examples/java/class/runme.java (from rev 10924, trunk/Examples/java/class/main.java) =================================================================== --- trunk/Examples/java/class/runme.java (rev 0) +++ trunk/Examples/java/class/runme.java 2008-11-17 22:47:55 UTC (rev 10932) @@ -0,0 +1,70 @@ +// This example illustrates how C++ classes can be used from Java using SWIG. +// The Java class gets mapped onto the C++ class and behaves as if it is a Java class. + +public class runme { + static { + try { + System.loadLibrary("example"); + } catch (UnsatisfiedLinkError e) { + System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e); + System.exit(1); + } + } + + public static void main(String argv[]) + { + // ----- Object creation ----- + + System.out.println( "Creating some objects:" ); + Circle c = new Circle(10); + System.out.println( " Created circle " + c ); + Square s = new Square(10); + System.out.println( " Created square " + s ); + + // ----- Access a static member ----- + + System.out.println( "\nA total of " + Shape.getNshapes() + " shapes were created" ); + + // ----- Member data access ----- + + // Notice how we can do this using functions specific to + // the 'Circle' class. + c.setX(20); + c.setY(30); + + // Now use the same functions in the base class + Shape shape = s; + shape.setX(-10); + shape.setY(5); + + System.out.println( "\nHere is their current position:" ); + System.out.println( " Circle = (" + c.getX() + " " + c.getY() + ")" ); + System.out.println( " Square = (" + s.getX() + " " + s.getY() + ")" ); + + // ----- Call some methods ----- + + System.out.println( "\nHere are some properties of the shapes:" ); + Shape[] shapes = {c,s}; + for (int i=0; i<shapes.length; i++) + { + System.out.println( " " + shapes[i].toString() ); + System.out.println( " area = " + shapes[i].area() ); + System.out.println( " perimeter = " + shapes[i].perimeter() ); + } + + // Notice how the area() and perimeter() functions really + // invoke the appropriate virtual method on each object. + + // ----- Delete everything ----- + + System.out.println( "\nGuess I'll clean up now" ); + + // Note: this invokes the virtual destructor + // You could leave this to the garbage collector + c.delete(); + s.delete(); + + System.out.println( Shape.getNshapes() + " shapes remain" ); + System.out.println( "Goodbye" ); + } +} Modified: trunk/Examples/java/constants/index.html =================================================================== --- trunk/Examples/java/constants/index.html 2008-11-17 22:43:15 UTC (rev 10931) +++ trunk/Examples/java/constants/index.html 2008-11-17 22:47:55 UTC (rev 10932) @@ -20,7 +20,7 @@ Click <a href="../../../Doc/Manual/Java.html#constants">here</a> for the section on constants in the SWIG and Java documentation. <p> -Click <a href="main.java">here</a> to see a Java program that prints out the values +Click <a href="runme.java">here</a> to see a Java program that prints out the values of the constants contained in the above file.</p> <h2>Key points</h2> <ul> Deleted: trunk/Examples/java/constants/main.java =================================================================== --- trunk/Examples/java/constants/main.java 2008-11-17 22:43:15 UTC (rev 10931) +++ trunk/Examples/java/constants/main.java 2008-11-17 22:47:55 UTC (rev 10932) @@ -1,44 +0,0 @@ -import java.lang.reflect.*; - -public class main { - static { - try { - System.loadLibrary("example"); - } catch (UnsatisfiedLinkError e) { - System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e); - System.exit(1); - } - } - - public static void main(String argv[]) - { - System.out.println("ICONST = " + example.ICONST + " (should be 42)"); - System.out.println("FCONST = " + example.FCONST + " (should be 2.1828)"); - System.out.println("CCONST = " + example.CCONST + " (should be 'x')"); - System.out.println("CCONST2 = " + example.CCONST2 + " (this should be on a new line)"); - System.out.println("SCONST = " + example.SCONST + " (should be 'Hello World')"); - System.out.println("SCONST2 = " + example.SCONST2 + " (should be '\"Hello World\"')"); - System.out.println("EXPR = " + example.EXPR + " (should be 48.5484)"); - System.out.println("iconst = " + example.iconst + " (should be 37)"); - System.out.println("fconst = " + example.fconst + " (should be 3.14)"); - -// Use reflection to check if these variables are defined: - try - { - System.out.println("EXTERN = " + example.class.getField("EXTERN") + " (Arg! This shouldn't print anything)"); - } - catch (NoSuchFieldException e) - { - System.out.println("EXTERN isn't defined (good)"); - } - - try - { - System.out.println("FOO = " + example.class.getField("FOO") + " (Arg! This shouldn't print anything)"); - } - catch (NoSuchFieldException e) - { - System.out.println("FOO isn't defined (good)"); - } - } -} Copied: trunk/Examples/java/constants/runme.java (from rev 10924, trunk/Examples/java/constants/main.java) =================================================================== --- trunk/Examples/java/constants/runme.java (rev 0) +++ trunk/Examples/java/constants/runme.java 2008-11-17 22:47:55 UTC (rev 10932) @@ -0,0 +1,44 @@ +import java.lang.reflect.*; + +public class runme { + static { + try { + System.loadLibrary("example"); + } catch (UnsatisfiedLinkError e) { + System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e); + System.exit(1); + } + } + + public static void main(String argv[]) + { + System.out.println("ICONST = " + example.ICONST + " (should be 42)"); + System.out.println("FCONST = " + example.FCONST + " (should be 2.1828)"); + System.out.println("CCONST = " + example.CCONST + " (should be 'x')"); + System.out.println("CCONST2 = " + example.CCONST2 + " (this should be on a new line)"); + System.out.println("SCONST = " + example.SCONST + " (should be 'Hello World')"); + System.out.println("SCONST2 = " + example.SCONST2 + " (should be '\"Hello World\"')"); + System.out.println("EXPR = " + example.EXPR + " (should be 48.5484)"); + System.out.println("iconst = " + example.iconst + " (should be 37)"); + System.out.println("fconst = " + example.fconst + " (should be 3.14)"); + +// Use reflection to check if these variables are defined: + try + { + System.out.println("EXTERN = " + example.class.getField("EXTERN") + " (Arg! This shouldn't print anything)"); + } + catch (NoSuchFieldException e) + { + System.out.println("EXTERN isn't defined (good)"); + } + + try + { + System.out.println("FOO = " + example.class.getField("FOO") + " (Arg! This shouldn't print anything)"); + } + catch (NoSuchFieldException e) + { + System.out.println("FOO isn't defined (good)"); + } + } +} Modified: trunk/Examples/java/enum/index.html =================================================================== --- trunk/Examples/java/enum/index.html 2008-11-17 22:43:15 UTC (rev 10931) +++ trunk/Examples/java/enum/index.html 2008-11-17 22:47:55 UTC (rev 10932) @@ -21,7 +21,7 @@ <ul> <li><a href="example.h">example.h</a>. Header file containing some enums. <li><a href="example.i">example.i</a>. Interface file. -<li><a href="main.java">main.java</a>. Sample Java program. +<li><a href="runme.java">runme.java</a>. Sample Java program. </ul> <hr> Deleted: trunk/Examples/java/enum/main.java =================================================================== --- trunk/Examples/java/enum/main.java 2008-11-17 22:43:15 UTC (rev 10931) +++ trunk/Examples/java/enum/main.java 2008-11-17 22:47:55 UTC (rev 10932) @@ -1,38 +0,0 @@ - -public class main { - static { - try { - System.loadLibrary("example"); - } catch (UnsatisfiedLinkError e) { - System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e); - System.exit(1); - } - } - - public static void main(String argv[]) - { - // Print out the value of some enums - System.out.println("*** color ***"); - System.out.println(" " + color.RED + " = " + color.RED.swigValue()); - System.out.println(" " + color.BLUE + " = " + color.BLUE.swigValue()); - System.out.println(" " + color.GREEN + " = " + color.GREEN.swigValue()); - - System.out.println("\n*** Foo::speed ***"); - System.out.println(" Foo::" + Foo.speed.IMPULSE + " = " + Foo.speed.IMPULSE.swigValue()); - System.out.println(" Foo::" + Foo.speed.WARP + " = " + Foo.speed.WARP.swigValue()); - System.out.println(" Foo::" + Foo.speed.LUDICROUS + " = " + Foo.speed.LUDICROUS.swigValue()); - - System.out.println("\nTesting use of enums with functions\n"); - - example.enum_test(color.RED, Foo.speed.IMPULSE); - example.enum_test(color.BLUE, Foo.speed.WARP); - example.enum_test(color.GREEN, Foo.speed.LUDICROUS); - - System.out.println( "\nTesting use of enum with class method" ); - Foo f = new Foo(); - - f.enum_test(Foo.speed.IMPULSE); - f.enum_test(Foo.speed.WARP); - f.enum_test(Foo.speed.LUDICROUS); - } -} Copied: trunk/Examples/java/enum/runme.java (from rev 10924, trunk/Examples/java/enum/main.java) =================================================================== --- trunk/Examples/java/enum/runme.java (rev 0) +++ trunk/Examples/java/enum/runme.java 2008-11-17 22:47:55 UTC (rev 10932) @@ -0,0 +1,38 @@ + +public class runme { + static { + try { + System.loadLibrary("example"); + } catch (UnsatisfiedLinkError e) { + System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e); + System.exit(1); + } + } + + public static void main(String argv[]) + { + // Print out the value of some enums + System.out.println("*** color ***"); + System.out.println(" " + color.RED + " = " + color.RED.swigValue()); + System.out.println(" " + color.BLUE + " = " + color.BLUE.swigValue()); + System.out.println(" " + color.GREEN + " = " + color.GREEN.swigValue()); + + System.out.println("\n*** Foo::speed ***"); + System.out.println(" Foo::" + Foo.speed.IMPULSE + " = " + Foo.speed.IMPULSE.swigValue()); + System.out.println(" Foo::" + Foo.speed.WARP + " = " + Foo.speed.WARP.swigValue()); + System.out.println(" Foo::" + Foo.speed.LUDICROUS + " = " + Foo.speed.LUDICROUS.swigValue()); + + System.out.println("\nTesting use of enums with functions\n"); + + example.enum_test(color.RED, Foo.speed.IMPULSE); + example.enum_test(color.BLUE, Foo.speed.WARP); + example.enum_test(color.GREEN, Foo.speed.LUDICROUS); + + System.out.println( "\nTesting use of enum with class method" ); + Foo f = new Foo(); + + f.enum_test(Foo.speed.IMPULSE); + f.enum_test(Foo.speed.WARP); + f.enum_test(Foo.speed.LUDICROUS); + } +} Deleted: trunk/Examples/java/extend/main.java =================================================================== --- trunk/Examples/java/extend/main.java 2008-11-17 22:43:15 UTC (rev 10931) +++ trunk/Examples/java/extend/main.java 2008-11-17 22:47:55 UTC (rev 10932) @@ -1,88 +0,0 @@ -// This file illustrates the cross language polymorphism using directors. - - -// CEO class, which overrides Employee::getPosition(). - -class CEO extends Manager { - public CEO(String name) { - super(name); - } - public String getPosition() { - return "CEO"; - } - // Public method to stop the SWIG proxy base class from thinking it owns the underlying C++ memory. - public void disownMemory() { - swigCMemOwn = false; - } -} - - -public class main { - static { - try { - System.loadLibrary("example"); - } catch (UnsatisfiedLinkError e) { - System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e); - System.exit(1); - } - } - - public static void main(String argv[]) - { - - // Create an instance of CEO, a class derived from the Java proxy of the - // underlying C++ class. The calls to getName() and getPosition() are standard, - // the call to getTitle() uses the director wrappers to call CEO.getPosition(). - - CEO e = new CEO("Alice"); - System.out.println( e.getName() + " is a " + e.getPosition() ); - System.out.println( "Just call her \"" + e.getTitle() + "\"" ); - System.out.println( "----------------------" ); - - - // Create a new EmployeeList instance. This class does not have a C++ - // director wrapper, but can be used freely with other classes that do. - - EmployeeList list = new EmployeeList(); - - // EmployeeList owns its items, so we must surrender ownership of objects we add. - e.disownMemory(); - list.addEmployee(e); - System.out.println( "----------------------" ); - - // Now we access the first four items in list (three are C++ objects that - // EmployeeList's constructor adds, the last is our CEO). The virtual - // methods of all these instances are treated the same. For items 0, 1, and - // 2, all methods resolve in C++. For item 3, our CEO, getTitle calls - // getPosition which resolves in Java. The call to getPosition is - // slightly different, however, because of the overidden getPosition() call, since - // now the object reference has been "laundered" by passing through - // EmployeeList as an Employee*. Previously, Java resolved the call - // immediately in CEO, but now Java thinks the object is an instance of - // class Employee. So the call passes through the - // Employee proxy class and on to the C wrappers and C++ director, - // eventually ending up back at the Java CEO implementation of getPosition(). - // The call to getTitle() for item 3 runs the C++ Employee::getTitle() - // method, which in turn calls getPosition(). This virtual method call - // passes down through the C++ director class to the Java implementation - // in CEO. All this routing takes place transparently. - - System.out.println( "(position, title) for items 0-3:" ); - - System.out.println( " " + list.get_item(0).getPosition() + ", \"" + list.get_item(0).getTitle() + "\"" ); - System.out.println( " " + list.get_item(1).getPosition() + ", \"" + list.get_item(1).getTitle() + "\"" ); - System.out.println( " " + list.get_item(2).getPosition() + ", \"" + list.get_item(2).getTitle() + "\"" ); - System.out.println( " " + list.get_item(3).getPosition() + ", \"" + list.get_item(3).getTitle() + "\"" ); - System.out.println( "----------------------" ); - - // Time to delete the EmployeeList, which will delete all the Employee* - // items it contains. The last item is our CEO, which gets destroyed as well. - list.delete(); - System.out.println( "----------------------" ); - - // All done. - - System.out.println( "java exit" ); - - } -} Copied: trunk/Examples/java/extend/runme.java (from rev 10924, trunk/Examples/java/extend/main.java) =================================================================== --- trunk/Examples/java/extend/runme.java (rev 0) +++ trunk/Examples/java/extend/runme.java 2008-11-17 22:47:55 UTC (rev 10932) @@ -0,0 +1,88 @@ +// This file illustrates the cross language polymorphism using directors. + + +// CEO class, which overrides Employee::getPosition(). + +class CEO extends Manager { + public CEO(String name) { + super(name); + } + public String getPosition() { + return "CEO"; + } + // Public method to stop the SWIG proxy base class from thinking it owns the underlying C++ memory. + public void disownMemory() { + swigCMemOwn = false; + } +} + + +public class runme { + static { + try { + System.loadLibrary("example"); + } catch (UnsatisfiedLinkError e) { + System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e); + System.exit(1); + } + } + + public static void main(String argv[]) + { + + // Create an instance of CEO, a class derived from the Java proxy of the + // underlying C++ class. The calls to getName() and getPosition() are standard, + // the call to getTitle() uses the director wrappers to call CEO.getPosition(). + + CEO e = new CEO("Alice"); + System.out.println( e.getName() + " is a " + e.getPosition() ); + System.out.println( "Just call her \"" + e.getTitle() + "\"" ); + System.out.println( "----------------------" ); + + + // Create a new EmployeeList instance. This class does not have a C++ + // director wrapper, but can be used freely with other classes that do. + + EmployeeList list = new EmployeeList(); + + // EmployeeList owns its items, so we must surrender ownership of objects we add. + e.disownMemory(); + list.addEmployee(e); + System.out.println( "----------------------" ); + + // Now we access the first four items in list (three are C++ objects that + // EmployeeList's constructor adds, the last is our CEO). The virtual + // methods of all these instances are treated the same. For items 0, 1, and + // 2, all methods resolve in C++. For item 3, our CEO, getTitle calls + // getPosition which resolves in Java. The call to getPosition is + // slightly different, however, because of the overidden getPosition() call, since + // now the object reference has been "laundered" by passing through + // EmployeeList as an Employee*. Previously, Java resolved the call + // immediately in CEO, but now Java thinks the object is an instance of + // class Employee. So the call passes through the + // Employee proxy class and on to the C wrappers and C++ director, + // eventually ending up back at the Java CEO implementation of getPosition(). + // The call to getTitle() for item 3 runs the C++ Employee::getTitle() + // method, which in turn calls getPosition(). This virtual method call + // passes down through the C++ director class to the Java implementation + // in CEO. All this routing takes place transparently. + + System.out.println( "(position, title) for items 0-3:" ); + + System.out.println( " " + list.get_item(0).getPosition() + ", \"" + list.get_item(0).getTitle() + "\"" ); + System.out.println( " " + list.get_item(1).getPosition() + ", \"" + list.get_item(1).getTitle() + "\"" ); + System.out.println( " " + list.get_item(2).getPosition() + ", \"" + list.get_item(2).getTitle() + "\"" ); + System.out.println( " " + list.get_item(3).getPosition() + ", \"" + list.get_item(3).getTitle() + "\"" ); + System.out.println( "----------------------" ); + + // Time to delete the EmployeeList, which will delete all the Employee* + // items it contains. The last item is our CEO, which gets destroyed as well. + list.delete(); + System.out.println( "----------------------" ); + + // All done. + + System.out.println( "java exit" ); + + } +} Modified: trunk/Examples/java/funcptr/index.html =================================================================== --- trunk/Examples/java/funcptr/index.html 2008-11-17 22:43:15 UTC (rev 10931) +++ trunk/Examples/java/funcptr/index.html 2008-11-17 22:47:55 UTC (rev 10932) @@ -66,7 +66,7 @@ <li><a href="example.c">example.c</a> <li><a href="example.h">example.h</a> <li><a href="example.i">example.i</a> (SWIG interface) -<li><a href="main.java">main.java</a> (Sample program) +<li><a href="runme.java">runme.java</a> (Sample program) </ul> <h2>Notes</h2> Deleted: trunk/Examples/java/funcptr/main.java =================================================================== --- trunk/Examples/java/funcptr/main.java 2008-11-17 22:43:15 UTC (rev 10931) +++ trunk/Examples/java/funcptr/main.java 2008-11-17 22:47:55 UTC (rev 10932) @@ -1,33 +0,0 @@ - -public class main { - - static { - try { - System.loadLibrary("example"); - } catch (UnsatisfiedLinkError e) { - System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e); - System.exit(1); - } - } - - public static void main(String argv[]) { - - - int a = 37; - int b = 42; - - // Now call our C function with a bunch of callbacks - - System.out.println( "Trying some C callback functions" ); - System.out.println( " a = " + a ); - System.out.println( " b = " + b ); - System.out.println( " ADD(a,b) = " + example.do_op(a,b,example.ADD) ); - System.out.println( " SUB(a,b) = " + example.do_op(a,b,example.SUB) ); - System.out.println( " MUL(a,b) = " + example.do_op(a,b,example.MUL) ); - - System.out.println( "Here is what the C callback function classes are called in Java" ); - System.out.println( " ADD = " + example.ADD.getClass().getName() ); - System.out.println( " SUB = " + example.SUB.getClass().getName() ); - System.out.println( " MUL = " + example.MUL.getClass().getName() ); - } -} Copied: trunk/Examples/java/funcptr/runme.java (from rev 10924, trunk/Examples/java/funcptr/main.java) =================================================================== --- trunk/Examples/java/funcptr/runme.java (rev 0) +++ trunk/Examples/java/funcptr/runme.java 2008-11-17 22:47:55 UTC (rev 10932) @@ -0,0 +1,33 @@ + +public class runme { + + static { + try { + System.loadLibrary("example"); + } catch (UnsatisfiedLinkError e) { + System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e); + System.exit(1); + } + } + + public static void main(String argv[]) { + + + int a = 37; + int b = 42; + + // Now call our C function with a bunch of callbacks + + System.out.println( "Trying some C callback functions" ); + System.out.println( " a = " + a ); + System.out.println( " b = " + b ); + System.out.println( " ADD(a,b) = " + example.do_op(a,b,example.ADD) ); + System.out.println( " SUB(a,b) = " + example.do_op(a,b,example.SUB) ); + System.out.println( " MUL(a,b) = " + example.do_op(a,b,example.MUL) ); + + System.out.println( "Here is what the C callback function classes are called in Java" ); + System.out.println( " ADD = " + example.ADD.getClass().getName() ); + System.out.println( " SUB = " + example.SUB.getClass().getName() ); + System.out.println( " MUL = " + example.MUL.getClass().getName() ); + } +} Modified: trunk/Examples/java/index.html =================================================================== --- trunk/Examples/java/index.html 2008-11-17 22:43:15 UTC (rev 10931) +++ trunk/Examples/java/index.html 2008-11-17 22:47:55 UTC (rev 10932) @@ -30,7 +30,7 @@ <h2>Running the examples</h2> Please see the <a href="../../Doc/Manual/Windows.html">Windows</a> page in the main manual for information on using the examples on Windows. <p> -On Unix most of the examples work by making the Makefile before executing the program main.java. The Makefile will output the swig generated JNI c code as well as the Java wrapper classes. Additionally the JNI c/c++ code is compiled into the shared object (dynamic link library) which is needed for dynamic linking to the native code. The Makefiles also compile the Java files using javac. +On Unix most of the examples work by making the Makefile before executing the program runme.java. The Makefile will output the swig generated JNI c code as well as the Java wrapper classes. Additionally the JNI c/c++ code is compiled into the shared object (dynamic link library) which is needed for dynamic linking to the native code. The Makefiles also compile the Java files using javac. <p> Ensure that the dynamic link library file is in the appropriate path before executing the Java program. For example in Unix, libexample.so must be in the LD_LIBRARY_PATH. <p> @@ -39,7 +39,7 @@ <pre> $ make $ export LD_LIBRARY_PATH=. #ksh -$ java main +$ java runme </pre> </blockquote> <p> Deleted: trunk/Examples/java/multimap/main.java =================================================================== --- trunk/Examples/java/multimap/main.java 2008-11-17 22:43:15 UTC (rev 10931) +++ trunk/Examples/java/multimap/main.java 2008-11-17 22:47:55 UTC (rev 10932) @@ -1,40 +0,0 @@ - -public class main { - - static { - try { - System.loadLibrary("example"); - } catch (UnsatisfiedLinkError e) { - System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e); - System.exit(1); - } - } - - public static void main(String argv[]) { - - // Call our gcd() function - int x = 42; - int y = 105; - int g = example.gcd(x,y); - System.out.println("The gcd of " + x + " and " + y + " is " + g); - - // Call the gcdmain() function - String[] args = {"gcdmain","42","105"}; - example.gcdmain(args); - - // Call the count function - System.out.println(example.count("Hello World", 'l')); - - // Call the capitalize function - String[] capitalizeMe = {"hello world"}; - example.capitalize(capitalizeMe); - System.out.println(capitalizeMe[0]); - } -} - - - - - - - Copied: trunk/Examples/java/multimap/runme.java (from rev 10924, trunk/Examples/java/multimap/main.java) =================================================================== --- trunk/Examples/java/multimap/runme.java (rev 0) +++ trunk/Examples/java/multimap/runme.java 2008-11-17 22:47:55 UTC (rev 10932) @@ -0,0 +1,40 @@ + +public class runme { + + static { + try { + System.loadLibrary("example"); + } catch (UnsatisfiedLinkError e) { + System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e); + System.exit(1); + } + } + + public static void main(String argv[]) { + + // Call our gcd() function + int x = 42; + int y = 105; + int g = example.gcd(x,y); + System.out.println("The gcd of " + x + " and " + y + " is " + g); + + // Call the gcdmain() function + String[] args = {"gcdmain","42","105"}; + example.gcdmain(args); + + // Call the count function + System.out.println(example.count("Hello World", 'l')); + + // Call the capitalize function + String[] capitalizeMe = {"hello world"}; + example.capitalize(capitalizeMe); + System.out.println(capitalizeMe[0]); + } +} + + + + + + + Modified: trunk/Examples/java/native/index.html =================================================================== --- trunk/Examples/java/native/index.html 2008-11-17 22:43:15 UTC (rev 10931) +++ trunk/Examples/java/native/index.html 2008-11-17 22:47:55 UTC (rev 10932) @@ -18,7 +18,7 @@ <ul> <li><a href="example.i">example.i</a>. Interface file comparing code wrapped by SWIG and wrapped manually. -<li><a href="main.java">main.java</a>. Sample Java program showing calls to both manually wrapped and SWIG wrapped c functions. +<li><a href="runme.java">runme.java</a>. Sample Java program showing calls to both manually wrapped and SWIG wrapped c functions. </ul> <h2>Notes</h2> Deleted: trunk/Examples/java/native/main.java =================================================================== --- trunk/Examples/java/native/main.java 2008-11-17 22:43:15 UTC (rev 10931) +++ trunk/Examples/java/native/main.java 2008-11-17 22:47:55 UTC (rev 10932) @@ -1,19 +0,0 @@ - -public class main { - - static { - try { - System.loadLibrary("example"); - } catch (UnsatisfiedLinkError e) { - System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e); - System.exit(1); - } - } - - public static void main(String argv[]) { - SWIGTYPE_p_Point p = example.point_create(1, 2); - System.out.println("auto wrapped : " + example.point_toString1(p)); - System.out.println("manual wrapped: " + example.point_toString2(p)); - example.free(new SWIGTYPE_p_void(SWIGTYPE_p_Point.getCPtr(p), false)); //clean up c allocated memory - } -} Copied: trunk/Examples/java/native/runme.java (from rev 10924, trunk/Examples/java/native/main.java) =================================================================== --- trunk/Examples/java/native/runme.java (rev 0) +++ trunk/Examples/java/native/runme.java 2008-11-17 22:47:55 UTC (rev 10932) @@ -0,0 +1,19 @@ + +public class runme { + + static { + try { + System.loadLibrary("example"); + } catch (UnsatisfiedLinkError e) { + System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e); + System.exit(1); + } + } + + public static void main(String argv[]) { + SWIGTYPE_p_Point p = example.point_create(1, 2); + System.out.println("auto wrapped : " + example.point_toString1(p)); + System.out.println("manual wrapped: " + example.point_toString2(p)); + example.free(new SWIGTYPE_p_void(SWIGTYPE_p_Point.getCPtr(p), false)); //clean up c allocated memory + } +} Modified: trunk/Examples/java/pointer/index.html =================================================================== --- trunk/Examples/java/pointer/index.html 2008-11-17 22:43:15 UTC (rev 10931) +++ trunk/Examples/java/pointer/index.html 2008-11-17 22:47:55 UTC (rev 10932) @@ -144,7 +144,7 @@ <ul> <li> <a href="example.c">example.c</a> (C Source) <li> <a href="example.i">example.i</a> (Swig interface) -<li> <a href="main.java">main.java</a> (Java program) +<li> <a href="runme.java">runme.java</a> (Java program) </ul> <h2>Notes</h2> Deleted: trunk/Examples/java/pointer/main.java =================================================================== --- trunk/Examples/java/pointer/main.java 2008-11-17 22:43:15 UTC (rev 10931) +++ trunk/Examples/java/pointer/main.java 2008-11-17 22:47:55 UTC (rev 10932) @@ -1,55 +0,0 @@ - -public class main { - - static { - try { - System.loadLibrary("example"); - } catch (UnsatisfiedLinkError e) { - System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e); - System.exit(1); - } - } - - public static void main(String argv[]) { - - // First create some objects using the pointer library. - System.out.println("Testing the pointer library"); - SWIGTYPE_p_int a = example.new_intp(); - SWIGTYPE_p_int b = example.new_intp(); - SWIGTYPE_p_int c = example.new_intp(); - example.intp_assign(a,37); - example.intp_assign(b,42); - - // Note that getCPtr() has package access by default - System.out.println(" a =" + Long.toHexString(SWIGTYPE_p_int.getCPtr(a))); - System.out.println(" b =" + Long.toHexString(SWIGTYPE_p_int.getCPtr(b))); - System.out.println(" c =" + Long.toHexString(SWIGTYPE_p_int.get... [truncated message content] |
From: <wsf...@us...> - 2008-11-22 12:29:45
|
Revision: 10936 http://swig.svn.sourceforge.net/swig/?rev=10936&view=rev Author: wsfulton Date: 2008-11-22 12:29:41 +0000 (Sat, 22 Nov 2008) Log Message: ----------- deprecate use of include path to find the input file for behaviour that is compatible with other compilers and interopability for ccache Modified Paths: -------------- trunk/CHANGES.current trunk/Source/CParse/parser.y trunk/Source/Include/swigwarn.h trunk/Source/Modules/main.cxx trunk/Source/Modules/perl5.cxx trunk/Source/Swig/include.c trunk/Source/Swig/swigfile.h Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2008-11-22 12:17:48 UTC (rev 10935) +++ trunk/CHANGES.current 2008-11-22 12:29:41 UTC (rev 10936) @@ -1,6 +1,11 @@ Version 1.3.37 (in progress) ============================ +2008-11-21: wsfulton + The use of the include path to find the input file is now deprecated. + This makes the behaviour of SWIG the same as C/C++ compilers in preparation + for use with ccache. + 2008-11-16: wsfulton Fix -nopreprocess option to: - correctly report file names in warning and error messages. Modified: trunk/Source/CParse/parser.y =================================================================== --- trunk/Source/CParse/parser.y 2008-11-22 12:17:48 UTC (rev 10935) +++ trunk/Source/CParse/parser.y 2008-11-22 12:29:41 UTC (rev 10936) @@ -1886,16 +1886,19 @@ ; /* ------------------------------------------------------------ - %includefile "filename" [ declarations ] - %importfile "filename" [ declarations ] + %includefile "filename" [option1="xyz", ...] [ declarations ] + %importfile "filename" [option1="xyz", ...] [ declarations ] ------------------------------------------------------------ */ include_directive: includetype options string LBRACKET { $1.filename = Copy(cparse_file); $1.line = cparse_line; scanner_set_location(NewString($3),1); - if ($2 && GetFlag($2, "maininput")) - scanner_set_main_input_file(NewString($3)); + if ($2) { + String *maininput = Getattr($2, "maininput"); + if (maininput) + scanner_set_main_input_file(NewString(maininput)); + } } interface RBRACKET { String *mname = 0; $$ = $6; Modified: trunk/Source/Include/swigwarn.h =================================================================== --- trunk/Source/Include/swigwarn.h 2008-11-22 12:17:48 UTC (rev 10935) +++ trunk/Source/Include/swigwarn.h 2008-11-22 12:29:41 UTC (rev 10936) @@ -49,6 +49,7 @@ #define WARN_DEPRECATED_NOEXTERN 122 #define WARN_DEPRECATED_NODEFAULT 123 #define WARN_DEPRECATED_TYPEMAP_LANG 124 +#define WARN_DEPRECATED_INPUT_FILE 125 /* -- Preprocessor -- */ Modified: trunk/Source/Modules/main.cxx =================================================================== --- trunk/Source/Modules/main.cxx 2008-11-22 12:17:48 UTC (rev 10935) +++ trunk/Source/Modules/main.cxx 2008-11-22 12:29:41 UTC (rev 10936) @@ -947,7 +947,7 @@ if (!s) { fprintf(stderr, "Unable to locate '%s' in the SWIG library.\n", input_file); } else { - FILE *f = Swig_open(outfile); + FILE *f = Swig_include_open(outfile); if (f) { fclose(f); fprintf(stderr, "File '%s' already exists. Checkout aborted.\n", outfile); @@ -974,17 +974,22 @@ String *fs = NewString(""); FILE *df = Swig_open(input_file); if (!df) { - char *cfile = Char(input_file); - if (cfile && cfile[0] == '-') { - Printf(stderr, "Unable to find option or file '%s', ", input_file); - Printf(stderr, "use 'swig -help' for more information.\n"); + df = Swig_include_open(input_file); + if (!df) { + char *cfile = Char(input_file); + if (cfile && cfile[0] == '-') { + Printf(stderr, "Unable to find option or file '%s', ", input_file); + Printf(stderr, "use 'swig -help' for more information.\n"); + } else { + Printf(stderr, "Unable to find file '%s'.\n", input_file); + } + SWIG_exit(EXIT_FAILURE); } else { - Printf(stderr, "Unable to find file '%s'.\n", input_file); + Swig_warning(WARN_DEPRECATED_INPUT_FILE, "SWIG", 1, "Use of the include path to find the input file is deprecated and will not work with ccache. Please include the path when specifying the input file.\n"); // so that behaviour is like c/c++ compilers } - SWIG_exit(EXIT_FAILURE); } - fclose(df); if (!no_cpp) { + fclose(df); Printf(fs, "%%include <swig.swg>\n"); if (allkw) { Printf(fs, "%%include <allkw.swg>\n"); @@ -992,7 +997,7 @@ if (lang_config) { Printf(fs, "\n%%include <%s>\n", lang_config); } - Printf(fs, "%%include(maininput=1) \"%s\"\n", Swig_last_file()); + Printf(fs, "%%include(maininput=\"%s\") \"%s\"\n", input_file, Swig_last_file()); for (i = 0; i < Len(libfiles); i++) { Printf(fs, "\n%%include \"%s\"\n", Getitem(libfiles, i)); } @@ -1000,8 +1005,8 @@ cpps = Preprocessor_parse(fs); Delete(fs); } else { - df = Swig_open(input_file); cpps = Swig_read_file(df); + fclose(df); } if (Swig_error_count()) { SWIG_exit(EXIT_FAILURE); Modified: trunk/Source/Modules/perl5.cxx =================================================================== --- trunk/Source/Modules/perl5.cxx 2008-11-22 12:17:48 UTC (rev 10935) +++ trunk/Source/Modules/perl5.cxx 2008-11-22 12:29:41 UTC (rev 10936) @@ -1624,7 +1624,7 @@ } else if (Strcmp(code, "include") == 0) { /* Include a file into the .pm file */ if (value) { - FILE *f = Swig_open(value); + FILE *f = Swig_include_open(value); if (!f) { Printf(stderr, "%s : Line %d. Unable to locate file %s\n", input_file, line_number, value); } else { Modified: trunk/Source/Swig/include.c =================================================================== --- trunk/Source/Swig/include.c 2008-11-22 12:17:48 UTC (rev 10935) +++ trunk/Source/Swig/include.c 2008-11-22 12:29:41 UTC (rev 10936) @@ -151,10 +151,11 @@ /* ----------------------------------------------------------------------------- * Swig_open() * - * Looks for a file and open it. Returns an open FILE * on success. + * open a file, optionally looking for it in the include path. Returns an open + * FILE * on success. * ----------------------------------------------------------------------------- */ -static FILE *Swig_open_any(const String_or_char *name, int sysfile) { +static FILE *Swig_open_file(const String_or_char *name, int sysfile, int use_include_path) { FILE *f; String *filename; List *spath = 0; @@ -169,7 +170,7 @@ filename = NewString(cname); assert(filename); f = fopen(Char(filename), "r"); - if (!f) { + if (!f && use_include_path) { spath = Swig_search_path_any(sysfile); ilen = Len(spath); for (i = 0; i < ilen; i++) { @@ -193,8 +194,14 @@ return f; } +/* Open a file - searching the include paths to find it */ +FILE *Swig_include_open(const String_or_char *name) { + return Swig_open_file(name, 0, 1); +} + +/* Open a file - does not use include paths to find it */ FILE *Swig_open(const String_or_char *name) { - return Swig_open_any(name, 0); + return Swig_open_file(name, 0, 0); } @@ -235,7 +242,7 @@ String *str; String *file; - f = Swig_open_any(name, sysfile); + f = Swig_open_file(name, sysfile, 1); if (!f) return 0; str = Swig_read_file(f); @@ -265,7 +272,7 @@ int Swig_insert_file(const String_or_char *filename, File *outfile) { char buffer[4096]; int nbytes; - FILE *f = Swig_open(filename); + FILE *f = Swig_include_open(filename); if (!f) return -1; Modified: trunk/Source/Swig/swigfile.h =================================================================== --- trunk/Source/Swig/swigfile.h 2008-11-22 12:17:48 UTC (rev 10935) +++ trunk/Source/Swig/swigfile.h 2008-11-22 12:29:41 UTC (rev 10936) @@ -14,6 +14,7 @@ extern void Swig_pop_directory(void); extern String *Swig_last_file(void); extern List *Swig_search_path(void); +extern FILE *Swig_include_open(const String_or_char *name); extern FILE *Swig_open(const String_or_char *name); extern String *Swig_read_file(FILE *f); extern String *Swig_include(const String_or_char *name); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2008-11-22 12:32:54
|
Revision: 10937 http://swig.svn.sourceforge.net/swig/?rev=10937&view=rev Author: wsfulton Date: 2008-11-22 12:32:51 +0000 (Sat, 22 Nov 2008) Log Message: ----------- add ccache install and rename php4 to php Modified Paths: -------------- trunk/Makefile.in trunk/configure.in Modified: trunk/Makefile.in =================================================================== --- trunk/Makefile.in 2008-11-22 12:29:41 UTC (rev 10936) +++ trunk/Makefile.in 2008-11-22 12:32:51 UTC (rev 10937) @@ -49,7 +49,7 @@ skip-guile = test -n "@SKIP_GUILE@" skip-mzscheme = test -n "@SKIP_MZSCHEME@" skip-ruby = test -n "@SKIP_RUBY@" -skip-php4 = test -n "@SKIP_PHP4@" +skip-php = test -n "@SKIP_PHP4@" skip-ocaml = test -n "@SKIP_OCAML@" skip-octave = test -n "@SKIP_OCTAVE@" skip-pike = test -n "@SKIP_PIKE@" @@ -89,7 +89,7 @@ @$(skip-ruby) || ./$(TARGET) -ruby -help @$(skip-ocaml) || ./$(TARGET) -ocaml -help @$(skip-octave) || ./$(TARGET) -octave -help - @$(skip-php4) || ./$(TARGET) -php4 -help + @$(skip-php) || ./$(TARGET) -php -help @$(skip-pike) || ./$(TARGET) -pike -help @$(skip-chicken) || ./$(TARGET) -chicken -help @$(skip-csharp) || ./$(TARGET) -csharp -help @@ -97,6 +97,9 @@ @$(skip-lua) || ./$(TARGET) -lua -help @$(skip-r) || ./$(TARGET) -r -help +check-ccache: + test -z "$(ENABLE_CCACHE)" || (cd $(CCACHE) && $(MAKE) check) + # Checks examples for compilation (does not run them) check-examples: \ check-tcl-examples \ @@ -108,7 +111,7 @@ check-ruby-examples \ check-ocaml-examples \ check-octave-examples \ - check-php4-examples \ + check-php-examples \ check-pike-examples \ check-chicken-examples \ check-csharp-examples \ @@ -129,7 +132,7 @@ ruby_examples :=$(shell sed '/^\#/d' $(srcdir)/Examples/ruby/check.list) ocaml_examples :=$(shell sed '/^\#/d' $(srcdir)/Examples/ocaml/check.list) octave_examples :=$(shell sed '/^\#/d' $(srcdir)/Examples/octave/check.list) -php4_examples :=$(shell sed '/^\#/d' $(srcdir)/Examples/php4/check.list) +php4_examples :=$(shell sed '/^\#/d' $(srcdir)/Examples/php/check.list) pike_examples :=$(shell sed '/^\#/d' $(srcdir)/Examples/pike/check.list) chicken_examples :=$(shell sed '/^\#/d' $(srcdir)/Examples/chicken/check.list) csharp_examples :=$(shell sed '/^\#/d' $(srcdir)/Examples/csharp/check.list) @@ -181,7 +184,7 @@ check-ruby-gifplot \ check-ocaml-gifplot \ check-octave-gifplot \ - check-php4-gifplot \ + check-php-gifplot \ check-pike-gifplot \ check-chicken-gifplot \ # check-lua-gifplot \ @@ -223,7 +226,7 @@ check-ruby-test-suite \ check-ocaml-test-suite \ check-octave-test-suite \ - check-php4-test-suite \ + check-php-test-suite \ check-pike-test-suite \ check-csharp-test-suite \ check-modula3-test-suite \ @@ -260,7 +263,7 @@ partialcheck-%-test-suite: @$(MAKE) -k -s check-$*-test-suite ACTION=partialcheck -check: check-aliveness check-examples check-gifplot check-test-suite +check: check-aliveness check-ccache check-examples check-gifplot check-test-suite # Run known-to-be-broken as well as not broken testcases in the test-suite all-test-suite: \ @@ -274,7 +277,7 @@ all-ruby-test-suite \ all-ocaml-test-suite \ all-octave-test-suite \ - all-php4-test-suite \ + all-php-test-suite \ all-pike-test-suite \ all-csharp-test-suite \ all-modula3-test-suite \ @@ -301,7 +304,7 @@ broken-ruby-test-suite \ broken-ocaml-test-suite \ broken-octave-test-suite \ - broken-php4-test-suite \ + broken-php-test-suite \ broken-pike-test-suite \ broken-csharp-test-suite \ broken-modula3-test-suite \ @@ -393,7 +396,7 @@ noskip-ruby-test-suite \ noskip-ocaml-test-suite \ noskip-octave-test-suite \ - noskip-php4-test-suite \ + noskip-php-test-suite \ noskip-pike-test-suite \ noskip-csharp-test-suite \ noskip-lua-test-suite \ @@ -441,7 +444,7 @@ # Use standard autoconf approach to transform executable name using --program-prefix and --program-suffix transform = @program_transform_name@ -install: install-main install-lib +install: install-main install-lib install-ccache @echo "Installation complete" install-main: @@ -450,7 +453,7 @@ @echo "Installing $(DESTDIR)$(BIN_DIR)/`echo $(TARGET_NOEXE) | sed '$(transform)'`@EXEEXT@" @$(INSTALL_PROGRAM) $(TARGET) $(DESTDIR)$(BIN_DIR)/`echo $(TARGET_NOEXE) | sed '$(transform)'`@EXEEXT@ -lib-languages = gcj typemaps tcl perl5 python guile java mzscheme ruby php4 ocaml octave \ +lib-languages = gcj typemaps tcl perl5 python guile java mzscheme ruby php ocaml octave \ pike chicken csharp modula3 allegrocl clisp lua cffi uffi r lib-modules = std @@ -485,7 +488,10 @@ fi) ; \ done +install-ccache: + test -z "$(ENABLE_CCACHE)" || (cd $(CCACHE) && $(MAKE) install) + ##################################################################### # TARGETS: uninstall & friends ##################################################################### Modified: trunk/configure.in =================================================================== --- trunk/configure.in 2008-11-22 12:29:41 UTC (rev 10936) +++ trunk/configure.in 2008-11-22 12:32:51 UTC (rev 10937) @@ -1331,10 +1331,10 @@ PHP4BIN= -AC_ARG_WITH(php4, AS_HELP_STRING([--without-php4], [Disable PHP]) -AS_HELP_STRING([--with-php4=path], [Set location of PHP executable]),[ PHP4BIN="$withval"], [PHP4BIN=yes]) +AC_ARG_WITH(php, AS_HELP_STRING([--without-php], [Disable PHP]) +AS_HELP_STRING([--with-php=path], [Set location of PHP executable]),[ PHP4BIN="$withval"], [PHP4BIN=yes]) -# First, check for "--without-php4" or "--with-php4=no". +# First, check for "--without-php" or "--with-php=no". if test x"${PHP4BIN}" = xno -o x"${with_alllang}" = xno ; then AC_MSG_NOTICE([Disabling PHP]) PHP4= @@ -2149,7 +2149,7 @@ Examples/test-suite/ocaml/Makefile \ Examples/test-suite/octave/Makefile \ Examples/test-suite/perl5/Makefile \ - Examples/test-suite/php4/Makefile \ + Examples/test-suite/php/Makefile \ Examples/test-suite/pike/Makefile \ Examples/test-suite/python/Makefile \ Examples/test-suite/ruby/Makefile \ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2008-11-23 21:59:02
|
Revision: 10942 http://swig.svn.sourceforge.net/swig/?rev=10942&view=rev Author: wsfulton Date: 2008-11-23 21:59:00 +0000 (Sun, 23 Nov 2008) Log Message: ----------- Apply patch #2319790 from Johan Hake to fix shared_ptr usage in std::tr1 namespace. Modified Paths: -------------- trunk/CHANGES.current trunk/Lib/shared_ptr.i Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2008-11-23 21:47:39 UTC (rev 10941) +++ trunk/CHANGES.current 2008-11-23 21:59:00 UTC (rev 10942) @@ -1,6 +1,9 @@ Version 1.3.37 (in progress) ============================ +2008-11-23: wsfulton + Apply patch #2319790 from Johan Hake to fix shared_ptr usage in std::tr1 namespace. + 2008-11-21: wsfulton The use of the include path to find the input file is now deprecated. This makes the behaviour of SWIG the same as C/C++ compilers in preparation Modified: trunk/Lib/shared_ptr.i =================================================================== --- trunk/Lib/shared_ptr.i 2008-11-23 21:47:39 UTC (rev 10941) +++ trunk/Lib/shared_ptr.i 2008-11-23 21:59:00 UTC (rev 10942) @@ -1,4 +1,8 @@ // shared_ptr namespaces could be boost or std or std::tr1 +// For example for std::tr1, use: +// #define SWIG_SHARED_PTR_NAMESPACE std +// #define SWIG_SHARED_PTR_SUBNAMESPACE tr1 + #if !defined(SWIG_SHARED_PTR_NAMESPACE) # define SWIG_SHARED_PTR_NAMESPACE boost #endif @@ -44,12 +48,12 @@ %define SWIG_SHARED_PTR_DERIVED(PROXYCLASS, BASECLASSTYPE, TYPE...) SWIG_SHARED_PTR_TYPEMAPS(PROXYCLASS, , TYPE) SWIG_SHARED_PTR_TYPEMAPS(PROXYCLASS, const, TYPE) -%types(SWIG_SHARED_PTR_NAMESPACE::shared_ptr< TYPE > = SWIG_SHARED_PTR_NAMESPACE::shared_ptr< BASECLASSTYPE >) %{ +%types(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > = SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< BASECLASSTYPE >) %{ *newmemory = SWIG_CAST_NEW_MEMORY; - return (void *) new SWIG_SHARED_PTR_NAMESPACE::shared_ptr< BASECLASSTYPE >(*(SWIG_SHARED_PTR_NAMESPACE::shared_ptr< TYPE > *)$from); + return (void *) new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< BASECLASSTYPE >(*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *)$from); %} %extend TYPE { - static SWIG_SHARED_PTR_NAMESPACE::shared_ptr< BASECLASSTYPE > SWIGSharedPtrUpcast(SWIG_SHARED_PTR_NAMESPACE::shared_ptr< TYPE > swigSharedPtrUpcast) { + static SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< BASECLASSTYPE > SWIGSharedPtrUpcast(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > swigSharedPtrUpcast) { return swigSharedPtrUpcast; } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2008-11-23 22:29:09
|
Revision: 10944 http://swig.svn.sourceforge.net/swig/?rev=10944&view=rev Author: wsfulton Date: 2008-11-23 22:29:07 +0000 (Sun, 23 Nov 2008) Log Message: ----------- Apply patch #2263850 to fix ruby/file.i ... rubyio.h filename change in ruby 1.9. Modified Paths: -------------- trunk/CHANGES.current trunk/Lib/ruby/file.i Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2008-11-23 22:07:15 UTC (rev 10943) +++ trunk/CHANGES.current 2008-11-23 22:29:07 UTC (rev 10944) @@ -2,6 +2,10 @@ ============================ 2008-11-23: wsfulton + [ruby] Apply patch #2263850 to fix ruby/file.i ... rubyio.h filename change in + ruby 1.9. + +2008-11-23: wsfulton Apply patch #2319790 from Johan Hake to fix shared_ptr usage in std::tr1 namespace. 2008-11-21: wsfulton Modified: trunk/Lib/ruby/file.i =================================================================== --- trunk/Lib/ruby/file.i 2008-11-23 22:07:15 UTC (rev 10943) +++ trunk/Lib/ruby/file.i 2008-11-23 22:29:07 UTC (rev 10944) @@ -3,7 +3,14 @@ #ifdef __cplusplus extern "C" { #endif + +// Ruby 1.9 changed the file name of this header +#ifdef HAVE_RUBY_IO_H +#include "ruby/io.h" +#else #include "rubyio.h" +#endif + #ifdef __cplusplus } #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2008-11-25 23:36:31
|
Revision: 10947 http://swig.svn.sourceforge.net/swig/?rev=10947&view=rev Author: wsfulton Date: 2008-11-25 23:36:23 +0000 (Tue, 25 Nov 2008) Log Message: ----------- Add -outcurrentdir option Modified Paths: -------------- trunk/CHANGES.current trunk/Doc/Manual/SWIG.html trunk/Source/Modules/main.cxx Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2008-11-23 23:29:33 UTC (rev 10946) +++ trunk/CHANGES.current 2008-11-25 23:36:23 UTC (rev 10947) @@ -1,6 +1,12 @@ Version 1.3.37 (in progress) ============================ +2008-11-24: wsfulton + Add -outcurrentdir option. This sets the default output directory to the current + directory instead of the path specified by the input file. This option enables + behaviour similar to c/c++ compilers. Note that this controls the output directory, + but only in the absence of the -o and/or -outdir options. + 2008-11-23: wsfulton [ruby] Apply patch #2263850 to fix ruby/file.i ... rubyio.h filename change in ruby 1.9. Modified: trunk/Doc/Manual/SWIG.html =================================================================== --- trunk/Doc/Manual/SWIG.html 2008-11-23 23:29:33 UTC (rev 10946) +++ trunk/Doc/Manual/SWIG.html 2008-11-25 23:36:23 UTC (rev 10947) @@ -139,6 +139,7 @@ -l<em>file</em> Include a SWIG library file. -module <em>name</em> Set the name of the SWIG module -o <em>outfile</em> Name of output file +-outcurrentdir Set default output dir to current dir instead of input file's path -outdir <em>dir</em> Set language specific files output directory -swiglib Show location of SWIG library -version Show SWIG version number Modified: trunk/Source/Modules/main.cxx =================================================================== --- trunk/Source/Modules/main.cxx 2008-11-23 23:29:33 UTC (rev 10946) +++ trunk/Source/Modules/main.cxx 2008-11-25 23:36:23 UTC (rev 10947) @@ -117,7 +117,8 @@ -fastdispatch -fvirtual \n\ -o <outfile> - Set name of the output file to <outfile>\n\ -oh <headfile> - Set name of the output header file to <headfile>\n\ - -outdir <dir> - Set language specific files output directory <dir>\n\ + -outcurrentdir - Set default output dir to current dir instead of input file's path\n\ + -outdir <dir> - Set language specific files output directory to <dir>\n\ -small - Compile in virtual elimination & compact mode\n\ -swiglib - Report location of SWIG library and exit\n\ -templatereduce - Reduce all the typedefs in templates\n\ @@ -153,6 +154,7 @@ static char *depends_extension = (char *) "d"; static String *outdir = 0; static String *xmlout = 0; +static int outcurrentdir = 0; static int help = 0; static int checkout = 0; static int cpp_only = 0; @@ -694,6 +696,9 @@ } else { Swig_arg_error(); } + } else if (strcmp(argv[i], "-outcurrentdir") == 0) { + Swig_mark_arg(i); + outcurrentdir = 1; } else if (strcmp(argv[i], "-Wall") == 0) { Swig_mark_arg(i); Swig_warnall(); @@ -1018,11 +1023,13 @@ if (depend) { if (!no_cpp) { String *outfile; + + char *basename = Swig_file_basename(outcurrentdir ? Swig_file_filename(input_file): Char(input_file)); if (!outfile_name) { if (CPlusPlus || lang->cplus_runtime_mode()) { - outfile = NewStringf("%s_wrap.%s", Swig_file_basename(input_file), cpp_extension); + outfile = NewStringf("%s_wrap.%s", basename, cpp_extension); } else { - outfile = NewStringf("%s_wrap.c", Swig_file_basename(input_file)); + outfile = NewStringf("%s_wrap.c", basename); } } else { outfile = NewString(outfile_name); @@ -1034,7 +1041,7 @@ SWIG_exit(EXIT_FAILURE); } } else if (!depend_only) { - String *filename = NewStringf("%s_wrap.%s", Swig_file_basename(input_file), depends_extension); + String *filename = NewStringf("%s_wrap.%s", basename, depends_extension); f_dependencies_file = NewFile(filename, "w", SWIG_output_files()); if (!f_dependencies_file) { FileErrorDisplay(filename); @@ -1151,21 +1158,23 @@ } Setattr(top, "infile", infile); // Note: if nopreprocess then infile is the original input file, otherwise input_file Setattr(top, "inputfile", input_file); + + char *basename = Swig_file_basename(outcurrentdir ? Swig_file_filename(infile): Char(infile)); if (!outfile_name) { if (CPlusPlus || lang->cplus_runtime_mode()) { - Setattr(top, "outfile", NewStringf("%s_wrap.%s", Swig_file_basename(infile), cpp_extension)); + Setattr(top, "outfile", NewStringf("%s_wrap.%s", basename, cpp_extension)); } else { - Setattr(top, "outfile", NewStringf("%s_wrap.c", Swig_file_basename(infile))); + Setattr(top, "outfile", NewStringf("%s_wrap.c", basename)); } } else { Setattr(top, "outfile", outfile_name); } if (!outfile_name_h) { - Setattr(top, "outfile_h", NewStringf("%s_wrap.%s", Swig_file_basename(infile), hpp_extension)); + Setattr(top, "outfile_h", NewStringf("%s_wrap.%s", basename, hpp_extension)); } else { Setattr(top, "outfile_h", outfile_name_h); } - set_outdir(Swig_file_dirname(Getattr(top, "outfile"))); + set_outdir(Swig_file_dirname(basename)); if (Swig_contract_mode_get()) { Swig_contracts(top); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2008-11-26 21:54:56
|
Revision: 10951 http://swig.svn.sourceforge.net/swig/?rev=10951&view=rev Author: wsfulton Date: 2008-11-26 21:54:49 +0000 (Wed, 26 Nov 2008) Log Message: ----------- remove svn:executable property where applied incorrectly Property Changed: ---------------- trunk/Doc/Manual/Allegrocl.html trunk/Doc/Manual/swig16.png trunk/Examples/guile/matrix/matrix.scm trunk/Examples/pike/class/Makefile trunk/Examples/pike/class/example.cxx trunk/Examples/pike/class/example.i trunk/Examples/pike/constants/Makefile trunk/Examples/pike/constants/example.i trunk/Examples/pike/overload/example.cxx trunk/Examples/pike/overload/example.h trunk/Examples/ruby/hashargs/Makefile trunk/Examples/ruby/hashargs/example.i trunk/Examples/test-suite/director_classic.i trunk/Examples/test-suite/director_ignore.i trunk/Examples/test-suite/java/allprotected_runme.java trunk/Examples/test-suite/java/director_classic_runme.java trunk/Examples/test-suite/java/director_ignore_runme.java trunk/Examples/test-suite/java/overload_complicated_runme.java trunk/Lib/allegrocl/inout_typemaps.i trunk/Lib/allegrocl/longlongs.i trunk/Lib/allegrocl/std_list.i trunk/Lib/allegrocl/std_string.i trunk/Lib/csharp/std_vector.i trunk/Lib/csharp/std_wstring.i trunk/Lib/csharp/wchar.i trunk/Source/Modules/ocaml.cxx Property changes on: trunk/Doc/Manual/Allegrocl.html ___________________________________________________________________ Deleted: svn:executable - * Property changes on: trunk/Doc/Manual/swig16.png ___________________________________________________________________ Deleted: svn:executable - * Property changes on: trunk/Examples/guile/matrix/matrix.scm ___________________________________________________________________ Deleted: svn:executable - * Property changes on: trunk/Examples/pike/class/Makefile ___________________________________________________________________ Deleted: svn:executable - * Property changes on: trunk/Examples/pike/class/example.cxx ___________________________________________________________________ Deleted: svn:executable - * Property changes on: trunk/Examples/pike/class/example.i ___________________________________________________________________ Deleted: svn:executable - * Property changes on: trunk/Examples/pike/constants/Makefile ___________________________________________________________________ Deleted: svn:executable - * Property changes on: trunk/Examples/pike/constants/example.i ___________________________________________________________________ Deleted: svn:executable - * Property changes on: trunk/Examples/pike/overload/example.cxx ___________________________________________________________________ Deleted: svn:executable - * Property changes on: trunk/Examples/pike/overload/example.h ___________________________________________________________________ Deleted: svn:executable - * Property changes on: trunk/Examples/ruby/hashargs/Makefile ___________________________________________________________________ Deleted: svn:executable - * Property changes on: trunk/Examples/ruby/hashargs/example.i ___________________________________________________________________ Deleted: svn:executable - * Property changes on: trunk/Examples/test-suite/director_classic.i ___________________________________________________________________ Deleted: svn:executable - * Property changes on: trunk/Examples/test-suite/director_ignore.i ___________________________________________________________________ Deleted: svn:executable - * Property changes on: trunk/Examples/test-suite/java/allprotected_runme.java ___________________________________________________________________ Deleted: svn:executable - * Property changes on: trunk/Examples/test-suite/java/director_classic_runme.java ___________________________________________________________________ Deleted: svn:executable - * Property changes on: trunk/Examples/test-suite/java/director_ignore_runme.java ___________________________________________________________________ Deleted: svn:executable - * Property changes on: trunk/Examples/test-suite/java/overload_complicated_runme.java ___________________________________________________________________ Deleted: svn:executable - * Property changes on: trunk/Lib/allegrocl/inout_typemaps.i ___________________________________________________________________ Deleted: svn:executable - * Property changes on: trunk/Lib/allegrocl/longlongs.i ___________________________________________________________________ Deleted: svn:executable - * Property changes on: trunk/Lib/allegrocl/std_list.i ___________________________________________________________________ Deleted: svn:executable - * Property changes on: trunk/Lib/allegrocl/std_string.i ___________________________________________________________________ Deleted: svn:executable - * Property changes on: trunk/Lib/csharp/std_vector.i ___________________________________________________________________ Deleted: svn:executable - * Property changes on: trunk/Lib/csharp/std_wstring.i ___________________________________________________________________ Deleted: svn:executable - * Property changes on: trunk/Lib/csharp/wchar.i ___________________________________________________________________ Deleted: svn:executable - * Property changes on: trunk/Source/Modules/ocaml.cxx ___________________________________________________________________ Deleted: svn:executable - * This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2008-11-28 23:35:51
|
Revision: 10958 http://swig.svn.sourceforge.net/swig/?rev=10958&view=rev Author: wsfulton Date: 2008-11-28 23:35:46 +0000 (Fri, 28 Nov 2008) Log Message: ----------- UTL - Fix some incorrect acceptance of types in the STL, eg a double * element passed into a vector<int *> constructor would be accepted, but the ensuing behaviour was undefined. Now the type conversion correctly raises an exception Modified Paths: -------------- trunk/CHANGES.current trunk/Examples/test-suite/common.mk trunk/Examples/test-suite/keyword_rename.i trunk/Examples/test-suite/li_std_vector_extra.i trunk/Examples/test-suite/python/li_std_vector_extra_runme.py trunk/Lib/octave/octstdcommon.swg trunk/Lib/python/pystdcommon.swg trunk/Lib/r/rstdcommon.swg Added Paths: ----------- trunk/Examples/test-suite/li_std_vector_ptr.i trunk/Examples/test-suite/python/li_std_vector_ptr_runme.py Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2008-11-28 23:33:37 UTC (rev 10957) +++ trunk/CHANGES.current 2008-11-28 23:35:46 UTC (rev 10958) @@ -1,6 +1,11 @@ Version 1.3.37 (in progress) ============================ +2008-11-28: wsfulton + [UTL] Fix some incorrect acceptance of types in the STL, eg a double * element passed + into a vector<int *> constructor would be accepted, but the ensuing behaviour was + undefined. Now the type conversion correctly raises an exception. + 2008-11-24: wsfulton Add -outcurrentdir option. This sets the default output directory to the current directory instead of the path specified by the input file. This option enables Modified: trunk/Examples/test-suite/common.mk =================================================================== --- trunk/Examples/test-suite/common.mk 2008-11-28 23:33:37 UTC (rev 10957) +++ trunk/Examples/test-suite/common.mk 2008-11-28 23:35:46 UTC (rev 10958) @@ -77,6 +77,7 @@ cpp_broken \ exception_partial_info \ extend_variable \ + li_std_vector_ptr \ namespace_union \ nested_comment \ overload_complicated \ Modified: trunk/Examples/test-suite/keyword_rename.i =================================================================== --- trunk/Examples/test-suite/keyword_rename.i 2008-11-28 23:33:37 UTC (rev 10957) +++ trunk/Examples/test-suite/keyword_rename.i 2008-11-28 23:35:46 UTC (rev 10958) @@ -4,7 +4,7 @@ %module keyword_rename -#pragma SWIG nowarn=SWIGWARN_PARSE_KEYWORD +//#pragma SWIG nowarn=SWIGWARN_PARSE_KEYWORD %inline %{ Modified: trunk/Examples/test-suite/li_std_vector_extra.i =================================================================== --- trunk/Examples/test-suite/li_std_vector_extra.i 2008-11-28 23:33:37 UTC (rev 10957) +++ trunk/Examples/test-suite/li_std_vector_extra.i 2008-11-28 23:35:46 UTC (rev 10958) @@ -123,11 +123,17 @@ %pointer_class(int,PtrInt) %array_functions(int,ArrInt) +%inline %{ + int *makeIntPtr(int v) { return new int(v); } + double *makeDoublePtr(double v) { return new double(v); } + int extractInt(int *p) { return *p; } +%} %template(pyvector) std::vector<swig::PyObject_ptr>; namespace std { - %template(ConstIntVector) vector<const int *>; + %template(ConstShortVector) vector<const short *>; +// %template(ConstIntVector) vector<const int *>; // interferes with vector<int *>... see new testcase li_std_vector_ptr } %inline %{ Added: trunk/Examples/test-suite/li_std_vector_ptr.i =================================================================== --- trunk/Examples/test-suite/li_std_vector_ptr.i (rev 0) +++ trunk/Examples/test-suite/li_std_vector_ptr.i 2008-11-28 23:35:46 UTC (rev 10958) @@ -0,0 +1,29 @@ +%module li_std_vector_ptr + +%include "std_vector.i" + +%template(IntPtrVector) std::vector<int *>; + +%inline %{ +#include <iostream> +using namespace std; +int* makeIntPtr(int v) { + return new int(v); +} +double* makeDoublePtr(double v) { + return new double(v); +} + +#if 1 +int** makeIntPtrPtr(int* v) { + return new int*(v); +} +#endif + +void displayVector(std::vector<int *> vpi) { + cout << "displayVector..." << endl; + for (int i=0; i<vpi.size(); ++i) + cout << *vpi[i] << endl; +} +%} + Modified: trunk/Examples/test-suite/python/li_std_vector_extra_runme.py =================================================================== --- trunk/Examples/test-suite/python/li_std_vector_extra_runme.py 2008-11-28 23:33:37 UTC (rev 10957) +++ trunk/Examples/test-suite/python/li_std_vector_extra_runme.py 2008-11-28 23:35:46 UTC (rev 10958) @@ -133,3 +133,24 @@ if overloaded3(100) != "int": raise RuntimeError + +# vector pointer checks +ip = makeIntPtr(11) +dp = makeDoublePtr(33.3) +error = 0 +try: + vi = IntPtrVector((ip, dp)) # check vector<int *> does not accept double * element + error = 1 +except: + pass + +if error: + raise RuntimeError + +vi = IntPtrVector((ip, makeIntPtr(22))) +if extractInt(vi[0]) != 11: + raise RuntimeError + +if extractInt(vi[1]) != 22: + raise RuntimeError + Added: trunk/Examples/test-suite/python/li_std_vector_ptr_runme.py =================================================================== --- trunk/Examples/test-suite/python/li_std_vector_ptr_runme.py (rev 0) +++ trunk/Examples/test-suite/python/li_std_vector_ptr_runme.py 2008-11-28 23:35:46 UTC (rev 10958) @@ -0,0 +1,8 @@ +from li_std_vector_ptr import * + +ip1 = makeIntPtr(11) +ip2 = makeIntPtr(22) + +vi = IntPtrVector((ip1, ip2)) +displayVector(vi) + Modified: trunk/Lib/octave/octstdcommon.swg =================================================================== --- trunk/Lib/octave/octstdcommon.swg 2008-11-28 23:33:37 UTC (rev 10957) +++ trunk/Lib/octave/octstdcommon.swg 2008-11-28 23:35:46 UTC (rev 10958) @@ -42,7 +42,7 @@ struct traits_asptr { static int asptr(const octave_value& obj, Type **val) { Type *p; - int res = (SWIG_ConvertPtr(obj, (void**)&p, type_info<Type>(), 0) == SWIG_OK) ? SWIG_OLDOBJ : 0; + int res = SWIG_ConvertPtr(obj, (void**)&p, type_info<Type>(), 0); if (SWIG_IsOK(res)) { if (val) *val = p; } Modified: trunk/Lib/python/pystdcommon.swg =================================================================== --- trunk/Lib/python/pystdcommon.swg 2008-11-28 23:33:37 UTC (rev 10957) +++ trunk/Lib/python/pystdcommon.swg 2008-11-28 23:35:46 UTC (rev 10958) @@ -46,7 +46,7 @@ struct traits_asptr { static int asptr(PyObject *obj, Type **val) { Type *p; - int res = (SWIG_ConvertPtr(obj, (void**)&p, type_info<Type>(), 0) == SWIG_OK) ? SWIG_OLDOBJ : 0; + int res = SWIG_ConvertPtr(obj, (void**)&p, type_info<Type>(), 0); if (SWIG_IsOK(res)) { if (val) *val = p; } Modified: trunk/Lib/r/rstdcommon.swg =================================================================== --- trunk/Lib/r/rstdcommon.swg 2008-11-28 23:33:37 UTC (rev 10957) +++ trunk/Lib/r/rstdcommon.swg 2008-11-28 23:35:46 UTC (rev 10958) @@ -40,7 +40,7 @@ struct traits_asptr { static int asptr(SWIG_Object obj, Type **val) { Type *p; - int res = (SWIG_ConvertPtr(obj, (void**)&p, type_info<Type>(), 0) == SWIG_OK) ? SWIG_OLDOBJ : 0; + int res = SWIG_ConvertPtr(obj, (void**)&p, type_info<Type>(), 0); if (SWIG_IsOK(res)) { if (val) *val = p; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2008-12-02 20:21:21
|
Revision: 10960 http://swig.svn.sourceforge.net/swig/?rev=10960&view=rev Author: wsfulton Date: 2008-12-02 20:21:16 +0000 (Tue, 02 Dec 2008) Log Message: ----------- Apply patch #2143727 for Python from Serge Monkewitz to fix importing base classes when the package option is specified in %module and that module is %import'ed Modified Paths: -------------- trunk/CHANGES.current trunk/Examples/test-suite/packageoption.h trunk/Examples/test-suite/packageoption.list trunk/Examples/test-suite/packageoption_a.i trunk/Examples/test-suite/packageoption_b.i trunk/Examples/test-suite/perl5/packageoption_runme.pl trunk/Source/Modules/python.cxx Added Paths: ----------- trunk/Examples/test-suite/packageoption_c.i Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2008-11-28 23:37:13 UTC (rev 10959) +++ trunk/CHANGES.current 2008-12-02 20:21:16 UTC (rev 10960) @@ -1,10 +1,14 @@ Version 1.3.37 (in progress) ============================ +2008-12-02: wsfulton + [Python] Apply patch #2143727 from Serge Monkewitz to fix importing base classes + when the package option is specified in %module and that module is %import'ed. + 2008-11-28: wsfulton - [UTL] Fix some incorrect acceptance of types in the STL, eg a double * element passed - into a vector<int *> constructor would be accepted, but the ensuing behaviour was - undefined. Now the type conversion correctly raises an exception. + [UTL] Fix #2080497. Some incorrect acceptance of types in the STL, eg a double * element + passed into a vector<int *> constructor would be accepted, but the ensuing behaviour + was undefined. Now the type conversion correctly raises an exception. 2008-11-24: wsfulton Add -outcurrentdir option. This sets the default output directory to the current Modified: trunk/Examples/test-suite/packageoption.h =================================================================== --- trunk/Examples/test-suite/packageoption.h 2008-11-28 23:37:13 UTC (rev 10959) +++ trunk/Examples/test-suite/packageoption.h 2008-12-02 20:21:16 UTC (rev 10960) @@ -1,5 +1,6 @@ -class A -{ - public: - int testInt() { return 2;} +struct Base { + virtual int vmethod() { return 1; } + int basemethod() { return 1; } + virtual ~Base() {} }; + Modified: trunk/Examples/test-suite/packageoption.list =================================================================== --- trunk/Examples/test-suite/packageoption.list 2008-11-28 23:37:13 UTC (rev 10959) +++ trunk/Examples/test-suite/packageoption.list 2008-12-02 20:21:16 UTC (rev 10960) @@ -1,2 +1,3 @@ packageoption_a packageoption_b +packageoption_c Modified: trunk/Examples/test-suite/packageoption_a.i =================================================================== --- trunk/Examples/test-suite/packageoption_a.i 2008-11-28 23:37:13 UTC (rev 10959) +++ trunk/Examples/test-suite/packageoption_a.i 2008-12-02 20:21:16 UTC (rev 10960) @@ -1,4 +1,4 @@ -%module(package="C") "packageoption_a"; +%module(package="CommonPackage") "packageoption_a"; %inline %{ class A @@ -6,5 +6,11 @@ public: int testInt() { return 2;} }; +%} +%{ +#include "packageoption.h" %} + +%include "packageoption.h" + Modified: trunk/Examples/test-suite/packageoption_b.i =================================================================== --- trunk/Examples/test-suite/packageoption_b.i 2008-11-28 23:37:13 UTC (rev 10959) +++ trunk/Examples/test-suite/packageoption_b.i 2008-12-02 20:21:16 UTC (rev 10960) @@ -1,4 +1,4 @@ -%module(package="C") "packageoption_b"; +%module(package="CommonPackage") "packageoption_b"; %inline %{ class B Added: trunk/Examples/test-suite/packageoption_c.i =================================================================== --- trunk/Examples/test-suite/packageoption_c.i (rev 0) +++ trunk/Examples/test-suite/packageoption_c.i 2008-12-02 20:21:16 UTC (rev 10960) @@ -0,0 +1,13 @@ +%module(package="PackageC") "packageoption_c"; + +%import "packageoption_a.i" + +%inline %{ +#include "packageoption.h" + +struct Derived : Base { + virtual int vmethod() { return 2; } + virtual ~Derived() {} +}; + +%} Modified: trunk/Examples/test-suite/perl5/packageoption_runme.pl =================================================================== --- trunk/Examples/test-suite/perl5/packageoption_runme.pl 2008-11-28 23:37:13 UTC (rev 10959) +++ trunk/Examples/test-suite/perl5/packageoption_runme.pl 2008-12-02 20:21:16 UTC (rev 10960) @@ -14,11 +14,11 @@ ok($test, $name); } -my $a = C::A->new(); +my $a = CommonPackage::A->new(); -isa_ok($a, 'C::A'); +isa_ok($a, 'CommonPackage::A'); -my $b = C::B->new(); +my $b = CommonPackage::B->new(); -isa_ok($b, 'C::B'); +isa_ok($b, 'CommonPackage::B'); Modified: trunk/Source/Modules/python.cxx =================================================================== --- trunk/Source/Modules/python.cxx 2008-11-28 23:37:13 UTC (rev 10959) +++ trunk/Source/Modules/python.cxx 2008-12-02 20:21:16 UTC (rev 10960) @@ -925,7 +925,11 @@ if (!options || (!Getattr(options, "noshadow") && !Getattr(options, "noproxy"))) { Printf(import, "_%s\n", modname); if (!Strstr(f_shadow_imports, import)) { - Printf(f_shadow, "import %s\n", modname); + if (pkg && (!package || Strcmp(pkg, package) != 0)) { + Printf(f_shadow, "import %s.%s\n", pkg, modname); + } else { + Printf(f_shadow, "import %s\n", modname); + } Printv(f_shadow_imports, import, NULL); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bh...@us...> - 2008-12-03 18:43:56
|
Revision: 10961 http://swig.svn.sourceforge.net/swig/?rev=10961&view=rev Author: bhy Date: 2008-12-03 18:43:44 +0000 (Wed, 03 Dec 2008) Log Message: ----------- Commited SF#2158938: change all SWIG symbols start with Py to a new name. Modified Paths: -------------- trunk/CHANGES.current trunk/Examples/python/std_map/example.i trunk/Examples/test-suite/li_std_map.i trunk/Examples/test-suite/li_std_set.i trunk/Examples/test-suite/li_std_vector_extra.i trunk/Lib/octave/octcontainer.swg trunk/Lib/octave/std_carray.i trunk/Lib/octave/std_map.i trunk/Lib/python/pyclasses.swg trunk/Lib/python/pycontainer.swg trunk/Lib/python/pyiterators.swg trunk/Lib/python/pyopers.swg trunk/Lib/python/pyrun.swg trunk/Lib/python/pytypemaps.swg trunk/Lib/python/std_carray.i trunk/Lib/python/std_map.i trunk/Lib/python/std_multimap.i trunk/Lib/python/std_multiset.i trunk/Lib/python/std_pair.i trunk/Lib/python/std_set.i trunk/Source/Modules/python.cxx Added Paths: ----------- trunk/Lib/python/pyname_compat.i trunk/Tools/pyname_patch.py Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2008-12-02 20:21:16 UTC (rev 10960) +++ trunk/CHANGES.current 2008-12-03 18:43:44 UTC (rev 10961) @@ -1,6 +1,38 @@ Version 1.3.37 (in progress) ============================ +2008-12-04: bhy + [Python] Applied patch SF#2158938: all the SWIG symbol names started with Py + are changed, since they are inappropriate and discouraged in Python + documentation (from http://www.python.org/doc/2.5.2/api/includes.html): + + "All user visible names defined by Python.h (except those defined by + the included standard headers) have one of the prefixes "Py" or "_Py". + Names beginning with "_Py" are for internal use by the Python implementation + and should not be used by extension writers. Structure member names do + not have a reserved prefix. + + Important: user code should never define names that begin with "Py" or "_Py". + This confuses the reader, and jeopardizes the portability of the user + code to future Python versions, which may define additional names beginning + with one of these prefixes." + + Here is a brief list of what changed: + + PySwig* -> SwigPy* + PyObject_ptr -> SwigPtr_PyObject + PyObject_var -> SwigVar_PyObject + PySequence_Base, PySequence_Cont, PySequence_Ref -> + SwigPySequence_Base, SwigPySequence_Cont, SwigPySequence_Ref + PyMap* -> SwigPyMap* + + We provided a pyname_compat.i for backward compatibility. Users whose code having + these symbols and do not want to change it could simply include this file + at front of your code. A better solution is to run the converting tool on + your code, which has been put in SWIG's SVN trunk (Tools/pyname_patch.py) and + you can download it here: + https://swig.svn.sourceforge.net/svnroot/swig/trunk/Tools/pyname_patch.py + 2008-12-02: wsfulton [Python] Apply patch #2143727 from Serge Monkewitz to fix importing base classes when the package option is specified in %module and that module is %import'ed. Modified: trunk/Examples/python/std_map/example.i =================================================================== --- trunk/Examples/python/std_map/example.i 2008-12-02 20:21:16 UTC (rev 10960) +++ trunk/Examples/python/std_map/example.i 2008-12-03 18:43:44 UTC (rev 10961) @@ -23,5 +23,5 @@ %template(halfi) half_map<std::string,int>; -%template() std::pair<swig::PyObject_ptr, swig::PyObject_ptr>; -%template(pymap) std::map<swig::PyObject_ptr, swig::PyObject_ptr>; +%template() std::pair<swig::SwigPtr_PyObject, swig::SwigPtr_PyObject>; +%template(pymap) std::map<swig::SwigPtr_PyObject, swig::SwigPtr_PyObject>; Modified: trunk/Examples/test-suite/li_std_map.i =================================================================== --- trunk/Examples/test-suite/li_std_map.i 2008-12-02 20:21:16 UTC (rev 10960) +++ trunk/Examples/test-suite/li_std_map.i 2008-12-03 18:43:44 UTC (rev 10961) @@ -10,7 +10,7 @@ * * For example: * swig::LANGUAGE_OBJ is GC_VALUE in Ruby - * swig::LANGUAGE_OBJ is PyObject_ptr in python + * swig::LANGUAGE_OBJ is SwigPtr_PyObject in python * * */ @@ -53,8 +53,8 @@ #endif #ifdef SWIGPYTHON - %template() pair<swig::PyObject_ptr, swig::PyObject_ptr>; - %template(pymap) map<swig::PyObject_ptr, swig::PyObject_ptr>; + %template() pair<swig::SwigPtr_PyObject, swig::SwigPtr_PyObject>; + %template(pymap) map<swig::SwigPtr_PyObject, swig::SwigPtr_PyObject>; #endif } Modified: trunk/Examples/test-suite/li_std_set.i =================================================================== --- trunk/Examples/test-suite/li_std_set.i 2008-12-02 20:21:16 UTC (rev 10960) +++ trunk/Examples/test-suite/li_std_set.i 2008-12-03 18:43:44 UTC (rev 10961) @@ -10,7 +10,7 @@ * * For example: * swig::LANGUAGE_OBJ is GC_VALUE in Ruby - * swig::LANGUAGE_OBJ is PyObject_ptr in python + * swig::LANGUAGE_OBJ is SwigPtr_PyObject in python * * */ @@ -36,5 +36,5 @@ #endif #if defined(SWIGPYTHON) -%template(pyset) std::set<swig::PyObject_ptr>; +%template(pyset) std::set<swig::SwigPtr_PyObject>; #endif Modified: trunk/Examples/test-suite/li_std_vector_extra.i =================================================================== --- trunk/Examples/test-suite/li_std_vector_extra.i 2008-12-02 20:21:16 UTC (rev 10960) +++ trunk/Examples/test-suite/li_std_vector_extra.i 2008-12-03 18:43:44 UTC (rev 10961) @@ -129,7 +129,7 @@ int extractInt(int *p) { return *p; } %} -%template(pyvector) std::vector<swig::PyObject_ptr>; +%template(pyvector) std::vector<swig::SwigPtr_PyObject>; namespace std { %template(ConstShortVector) vector<const short *>; Modified: trunk/Lib/octave/octcontainer.swg =================================================================== --- trunk/Lib/octave/octcontainer.swg 2008-12-02 20:21:16 UTC (rev 10960) +++ trunk/Lib/octave/octcontainer.swg 2008-12-03 18:43:44 UTC (rev 10961) @@ -204,7 +204,7 @@ operator T () const { - // swig::PyObject_var item = OctSequence_GetItem(_seq, _index); + // swig::SwigVar_PyObject item = OctSequence_GetItem(_seq, _index); octave_value item; // * todo try { return swig::as<T>(item, true); @@ -410,7 +410,7 @@ { int s = size(); for (int i = 0; i < s; ++i) { - // swig::PyObject_var item = OctSequence_GetItem(_seq, i); + // swig::SwigVar_PyObject item = OctSequence_GetItem(_seq, i); octave_value item; // * todo if (!swig::check<value_type>(item)) { if (set_err) { @@ -453,7 +453,7 @@ $result = Cell(tmpc); } - %fragment("PyPairBoolOutputIterator","header",fragment=SWIG_From_frag(bool),fragment="OctSequence_Cont") {} + %fragment("SwigPyPairBoolOutputIterator","header",fragment=SWIG_From_frag(bool),fragment="OctSequence_Cont") {} %typemap(out,fragment="OctPairBoolOutputIterator") std::pair<iterator, bool>, std::pair<const_iterator, bool> { Modified: trunk/Lib/octave/std_carray.i =================================================================== --- trunk/Lib/octave/std_carray.i 2008-12-02 20:21:16 UTC (rev 10960) +++ trunk/Lib/octave/std_carray.i 2008-12-03 18:43:44 UTC (rev 10961) @@ -17,7 +17,7 @@ %extend std::carray { %fragment(SWIG_Traits_frag(std::carray<_Type, _Size >), "header", - fragment="PySwigIterator_T", + fragment="SwigPyIterator_T", fragment=SWIG_Traits_frag(_Type), fragment="StdCarrayTraits") { namespace swig { @@ -36,7 +36,7 @@ %typemap(out,noblock=1) iterator, const_iterator { $result = SWIG_NewPointerObj(swig::make_output_iterator((const $type &)$1), - swig::PySwigIterator::descriptor(),SWIG_POINTER_OWN); + swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); } inline size_t __len__() const { return self->size(); } @@ -46,7 +46,7 @@ inline void __setitem__(size_t i, const _Type& v) { (*self)[i] = v; } - swig::PySwigIterator* __iter__(PyObject **PYTHON_SELF) { + swig::SwigPyIterator* __iter__(PyObject **PYTHON_SELF) { return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } } Modified: trunk/Lib/octave/std_map.i =================================================================== --- trunk/Lib/octave/std_map.i 2008-12-02 20:21:16 UTC (rev 10960) +++ trunk/Lib/octave/std_map.i 2008-12-03 18:43:44 UTC (rev 10961) @@ -22,7 +22,7 @@ /* int res = SWIG_ERROR; if (PyDict_Check(obj)) { - PyObject_var items = PyObject_CallMethod(obj,(char *)"items",NULL); + SwigVar_PyObject items = PyObject_CallMethod(obj,(char *)"items",NULL); res = traits_asptr_stdseq<std::map<K,T>, std::pair<K, T> >::asptr(items, val); } else { map_type *p; @@ -58,8 +58,8 @@ } PyObject *obj = PyDict_New(); for (const_iterator i= map.begin(); i!= map.end(); ++i) { - swig::PyObject_var key = swig::from(i->first); - swig::PyObject_var val = swig::from(i->second); + swig::SwigVar_PyObject key = swig::from(i->first); + swig::SwigVar_PyObject val = swig::from(i->second); PyDict_SetItem(obj, key, val); } return obj; @@ -92,10 +92,10 @@ }; template<class OutIterator, class FromOper, class ValueType = typename OutIterator::value_type> - struct OctMapIterator_T : PySwigIteratorClosed_T<OutIterator, ValueType, FromOper> + struct OctMapIterator_T : SwigPyIteratorClosed_T<OutIterator, ValueType, FromOper> { OctMapIterator_T(OutIterator curr, OutIterator first, OutIterator last, octave_value seq) - : PySwigIteratorClosed_T<OutIterator,ValueType,FromOper>(curr, first, last, seq) + : SwigPyIteratorClosed_T<OutIterator,ValueType,FromOper>(curr, first, last, seq) { } }; @@ -112,7 +112,7 @@ }; template<typename OutIter> - inline PySwigIterator* + inline SwigPyIterator* make_output_key_iterator(const OutIter& current, const OutIter& begin, const OutIter& end, octave_value seq = octave_value()) { return new OctMapKeyIterator_T<OutIter>(current, begin, end, seq); @@ -130,7 +130,7 @@ template<typename OutIter> - inline PySwigIterator* + inline SwigPyIterator* make_output_value_iterator(const OutIter& current, const OutIter& begin, const OutIter& end, octave_value seq = 0) { return new OctMapValueIterator_T<OutIter>(current, begin, end, seq); Modified: trunk/Lib/python/pyclasses.swg =================================================================== --- trunk/Lib/python/pyclasses.swg 2008-12-02 20:21:16 UTC (rev 10960) +++ trunk/Lib/python/pyclasses.swg 2008-12-03 18:43:44 UTC (rev 10961) @@ -1,55 +1,55 @@ #ifdef __cplusplus /* - PyObject_ptr is used as a replacement of PyObject *, where + SwigPtr_PyObject is used as a replacement of PyObject *, where the INCREF/DECREF are applied as needed. - You can use PyObject_ptr in a container, such as + You can use SwigPtr_PyObject in a container, such as - std::vector<PyObject_ptr>; + std::vector<SwigPtr_PyObject>; or as a member variable: struct A { - PyObject_ptr obj; + SwigPtr_PyObject obj; A(PyObject *o) : _obj(o) { } }; or as a input/output value - PyObject_ptr func(PyObject_ptr obj) { - PyObject_ptr out = PyString_FromFormat("hello %s", PyObject_AsString(obj)); + SwigPtr_PyObject func(SwigPtr_PyObject obj) { + SwigPtr_PyObject out = PyString_FromFormat("hello %s", PyObject_AsString(obj)); Py_DECREF(out); return out; } just remember to pair the object creation with the proper DECREF, - the same as with plain PyObject *ptr, since PyObject_ptr always add + the same as with plain PyObject *ptr, since SwigPtr_PyObject always add one reference at construction. - PyObject_ptr is 'visible' at the wrapped side, so you can do: + SwigPtr_PyObject is 'visible' at the wrapped side, so you can do: - %template(pyvector) std::vector<swig::PyObject_ptr>; + %template(pyvector) std::vector<swig::SwigPtr_PyObject>; and all the proper typemaps will be used. */ namespace swig { - %ignore PyObject_ptr; - struct PyObject_ptr {}; - %apply PyObject * {PyObject_ptr}; - %apply PyObject * const& {PyObject_ptr const&}; + %ignore SwigPtr_PyObject; + struct SwigPtr_PyObject {}; + %apply PyObject * {SwigPtr_PyObject}; + %apply PyObject * const& {SwigPtr_PyObject const&}; /* For output */ - %typemap(out,noblock=1) PyObject_ptr { + %typemap(out,noblock=1) SwigPtr_PyObject { $result = (PyObject *)$1; Py_INCREF($result); } - %typemap(out,noblock=1) PyObject_ptr const & { + %typemap(out,noblock=1) SwigPtr_PyObject const & { $result = (PyObject *)*$1; Py_INCREF($result); } @@ -58,28 +58,28 @@ %{ namespace swig { - class PyObject_ptr { + class SwigPtr_PyObject { protected: PyObject *_obj; public: - PyObject_ptr() :_obj(0) + SwigPtr_PyObject() :_obj(0) { } - PyObject_ptr(const PyObject_ptr& item) : _obj(item._obj) + SwigPtr_PyObject(const SwigPtr_PyObject& item) : _obj(item._obj) { Py_XINCREF(_obj); } - PyObject_ptr(PyObject *obj, bool initial_ref = true) :_obj(obj) + SwigPtr_PyObject(PyObject *obj, bool initial_ref = true) :_obj(obj) { if (initial_ref) { Py_XINCREF(_obj); } } - PyObject_ptr & operator=(const PyObject_ptr& item) + SwigPtr_PyObject & operator=(const SwigPtr_PyObject& item) { Py_XINCREF(item._obj); Py_XDECREF(_obj); @@ -87,7 +87,7 @@ return *this; } - ~PyObject_ptr() + ~SwigPtr_PyObject() { Py_XDECREF(_obj); } @@ -106,33 +106,33 @@ %} /* - PyObject_var is used to manage 'in the scope' PyObject * variables, + SwigVar_PyObject is used to manage 'in the scope' PyObject * variables, as in int func () { - PyObject_var obj = PyString_FromString("hello"); + SwigVar_PyObject obj = PyString_FromString("hello"); } ie, 'obj' is created and destructed in the same scope from a python object that carries at least one reference value. - PyObject_var just take care of applying the proper Py_DECREF. + SwigVar_PyObject just take care of applying the proper Py_DECREF. Hence, this class is purely internal and not visible at the wrapped side. */ namespace swig { - %ignore PyObject_var; - struct PyObject_var {}; - %apply PyObject * {PyObject_var}; - %apply PyObject * const& {PyObject_var const&}; + %ignore SwigVar_PyObject; + struct SwigVar_PyObject {}; + %apply PyObject * {SwigVar_PyObject}; + %apply PyObject * const& {SwigVar_PyObject const&}; } %{ namespace swig { - struct PyObject_var : PyObject_ptr { - PyObject_var(PyObject* obj = 0) : PyObject_ptr(obj, false) { } + struct SwigVar_PyObject : SwigPtr_PyObject { + SwigVar_PyObject(PyObject* obj = 0) : SwigPtr_PyObject(obj, false) { } - PyObject_var & operator = (PyObject* obj) + SwigVar_PyObject & operator = (PyObject* obj) { Py_XDECREF(_obj); _obj = obj; Modified: trunk/Lib/python/pycontainer.swg =================================================================== --- trunk/Lib/python/pycontainer.swg 2008-12-02 20:21:16 UTC (rev 10960) +++ trunk/Lib/python/pycontainer.swg 2008-12-03 18:43:44 UTC (rev 10961) @@ -36,15 +36,15 @@ %include <std_except.i> -%fragment(SWIG_Traits_frag(swig::PyObject_ptr),"header",fragment="StdTraits") { +%fragment(SWIG_Traits_frag(swig::SwigPtr_PyObject),"header",fragment="StdTraits") { namespace swig { - template <> struct traits<PyObject_ptr > { + template <> struct traits<SwigPtr_PyObject > { typedef value_category category; - static const char* type_name() { return "PyObject_ptr"; } + static const char* type_name() { return "SwigPtr_PyObject"; } }; - template <> struct traits_from<PyObject_ptr> { - typedef PyObject_ptr value_type; + template <> struct traits_from<SwigPtr_PyObject> { + typedef SwigPtr_PyObject value_type; static PyObject *from(const value_type& val) { PyObject *obj = static_cast<PyObject *>(val); Py_XINCREF(obj); @@ -53,14 +53,14 @@ }; template <> - struct traits_check<PyObject_ptr, value_category> { - static bool check(PyObject_ptr) { + struct traits_check<SwigPtr_PyObject, value_category> { + static bool check(SwigPtr_PyObject) { return true; } }; - template <> struct traits_asval<PyObject_ptr > { - typedef PyObject_ptr value_type; + template <> struct traits_asval<SwigPtr_PyObject > { + typedef SwigPtr_PyObject value_type; static int asval(PyObject *obj, value_type *val) { if (val) *val = obj; return SWIG_OK; @@ -69,15 +69,15 @@ } } -%fragment(SWIG_Traits_frag(swig::PyObject_var),"header",fragment="StdTraits") { +%fragment(SWIG_Traits_frag(swig::SwigVar_PyObject),"header",fragment="StdTraits") { namespace swig { - template <> struct traits<PyObject_var > { + template <> struct traits<SwigVar_PyObject > { typedef value_category category; - static const char* type_name() { return "PyObject_var"; } + static const char* type_name() { return "SwigVar_PyObject"; } }; - template <> struct traits_from<PyObject_var> { - typedef PyObject_var value_type; + template <> struct traits_from<SwigVar_PyObject> { + typedef SwigVar_PyObject value_type; static PyObject *from(const value_type& val) { PyObject *obj = static_cast<PyObject *>(val); Py_XINCREF(obj); @@ -86,14 +86,14 @@ }; template <> - struct traits_check<PyObject_var, value_category> { - static bool check(PyObject_var) { + struct traits_check<SwigVar_PyObject, value_category> { + static bool check(SwigVar_PyObject) { return true; } }; - template <> struct traits_asval<PyObject_var > { - typedef PyObject_var value_type; + template <> struct traits_asval<SwigVar_PyObject > { + typedef SwigVar_PyObject value_type; static int asval(PyObject *obj, value_type *val) { if (val) *val = obj; return SWIG_OK; @@ -102,7 +102,7 @@ } } -%fragment("PySequence_Base","header") +%fragment("SwigPySequence_Base","header") { %#include <functional> @@ -133,20 +133,20 @@ }; template <> - struct less <swig::PyObject_ptr>: public binary_function<swig::PyObject_ptr, swig::PyObject_ptr, bool> + struct less <swig::SwigPtr_PyObject>: public binary_function<swig::SwigPtr_PyObject, swig::SwigPtr_PyObject, bool> { bool - operator()(const swig::PyObject_ptr& v, const swig::PyObject_ptr& w) const + operator()(const swig::SwigPtr_PyObject& v, const swig::SwigPtr_PyObject& w) const { return std::less<PyObject *>()(v, w); } }; template <> - struct less <swig::PyObject_var>: public binary_function<swig::PyObject_var, swig::PyObject_var, bool> + struct less <swig::SwigVar_PyObject>: public binary_function<swig::SwigVar_PyObject, swig::SwigVar_PyObject, bool> { bool - operator()(const swig::PyObject_var& v, const swig::PyObject_var& w) const + operator()(const swig::SwigVar_PyObject& v, const swig::SwigVar_PyObject& w) const { return std::less<PyObject *>()(v, w); } @@ -288,24 +288,24 @@ } } -%fragment("PySequence_Cont","header", +%fragment("SwigPySequence_Cont","header", fragment="StdTraits", - fragment="PySequence_Base", - fragment="PySwigIterator_T") + fragment="SwigPySequence_Base", + fragment="SwigPyIterator_T") { namespace swig { template <class T> - struct PySequence_Ref + struct SwigPySequence_Ref { - PySequence_Ref(PyObject* seq, int index) + SwigPySequence_Ref(PyObject* seq, int index) : _seq(seq), _index(index) { } operator T () const { - swig::PyObject_var item = PySequence_GetItem(_seq, _index); + swig::SwigVar_PyObject item = PySequence_GetItem(_seq, _index); try { return swig::as<T>(item, true); } catch (std::exception& e) { @@ -320,7 +320,7 @@ } } - PySequence_Ref& operator=(const T& v) + SwigPySequence_Ref& operator=(const T& v) { PySequence_SetItem(_seq, _index, swig::from<T>(v)); return *this; @@ -332,18 +332,18 @@ }; template <class T> - struct PySequence_ArrowProxy + struct SwigPySequence_ArrowProxy { - PySequence_ArrowProxy(const T& x): m_value(x) {} + SwigPySequence_ArrowProxy(const T& x): m_value(x) {} const T* operator->() const { return &m_value; } operator const T*() const { return &m_value; } T m_value; }; template <class T, class Reference > - struct PySequence_InputIterator + struct SwigPySequence_InputIterator { - typedef PySequence_InputIterator<T, Reference > self; + typedef SwigPySequence_InputIterator<T, Reference > self; typedef std::random_access_iterator_tag iterator_category; typedef Reference reference; @@ -351,11 +351,11 @@ typedef T* pointer; typedef int difference_type; - PySequence_InputIterator() + SwigPySequence_InputIterator() { } - PySequence_InputIterator(PyObject* seq, int index) + SwigPySequence_InputIterator(PyObject* seq, int index) : _seq(seq), _index(index) { } @@ -365,9 +365,9 @@ return reference(_seq, _index); } - PySequence_ArrowProxy<T> + SwigPySequence_ArrowProxy<T> operator->() const { - return PySequence_ArrowProxy<T>(operator*()); + return SwigPySequence_ArrowProxy<T>(operator*()); } bool operator==(const self& ri) const @@ -436,19 +436,19 @@ }; template <class T> - struct PySequence_Cont + struct SwigPySequence_Cont { - typedef PySequence_Ref<T> reference; - typedef const PySequence_Ref<T> const_reference; + typedef SwigPySequence_Ref<T> reference; + typedef const SwigPySequence_Ref<T> const_reference; typedef T value_type; typedef T* pointer; typedef int difference_type; typedef int size_type; typedef const pointer const_pointer; - typedef PySequence_InputIterator<T, reference> iterator; - typedef PySequence_InputIterator<T, const_reference> const_iterator; + typedef SwigPySequence_InputIterator<T, reference> iterator; + typedef SwigPySequence_InputIterator<T, const_reference> const_iterator; - PySequence_Cont(PyObject* seq) : _seq(0) + SwigPySequence_Cont(PyObject* seq) : _seq(0) { if (!PySequence_Check(seq)) { throw std::invalid_argument("a sequence is expected"); @@ -457,7 +457,7 @@ Py_INCREF(_seq); } - ~PySequence_Cont() + ~SwigPySequence_Cont() { Py_XDECREF(_seq); } @@ -506,7 +506,7 @@ { int s = size(); for (int i = 0; i < s; ++i) { - swig::PyObject_var item = PySequence_GetItem(_seq, i); + swig::SwigVar_PyObject item = PySequence_GetItem(_seq, i); if (!swig::check<value_type>(item)) { if (set_err) { char msg[1024]; @@ -533,40 +533,40 @@ class const_iterator; class const_reverse_iterator; - %typemap(out,noblock=1,fragment="PySequence_Cont") + %typemap(out,noblock=1,fragment="SwigPySequence_Cont") iterator, reverse_iterator, const_iterator, const_reverse_iterator { $result = SWIG_NewPointerObj(swig::make_output_iterator(%static_cast($1,const $type &)), - swig::PySwigIterator::descriptor(),SWIG_POINTER_OWN); + swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); } - %typemap(out,noblock=1,fragment="PySequence_Cont") + %typemap(out,noblock=1,fragment="SwigPySequence_Cont") std::pair<iterator, iterator>, std::pair<const_iterator, const_iterator> { $result = PyTuple_New(2); PyTuple_SetItem($result,0,SWIG_NewPointerObj(swig::make_output_iterator(%static_cast($1,const $type &).first), - swig::PySwigIterator::descriptor(),SWIG_POINTER_OWN)); + swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN)); PyTuple_SetItem($result,1,SWIG_NewPointerObj(swig::make_output_iterator(%static_cast($1,const $type &).second), - swig::PySwigIterator::descriptor(),SWIG_POINTER_OWN)); + swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN)); } - %fragment("PyPairBoolOutputIterator","header",fragment=SWIG_From_frag(bool),fragment="PySequence_Cont") {} + %fragment("SwigPyPairBoolOutputIterator","header",fragment=SWIG_From_frag(bool),fragment="SwigPySequence_Cont") {} - %typemap(out,noblock=1,fragment="PyPairBoolOutputIterator") + %typemap(out,noblock=1,fragment="SwigPyPairBoolOutputIterator") std::pair<iterator, bool>, std::pair<const_iterator, bool> { $result = PyTuple_New(2); PyTuple_SetItem($result,0,SWIG_NewPointerObj(swig::make_output_iterator(%static_cast($1,const $type &).first), - swig::PySwigIterator::descriptor(),SWIG_POINTER_OWN)); + swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN)); PyTuple_SetItem($result,1,SWIG_From(bool)(%static_cast($1,const $type &).second)); } - %typemap(in,noblock=1,fragment="PySequence_Cont") - iterator(swig::PySwigIterator *iter = 0, int res), - reverse_iterator(swig::PySwigIterator *iter = 0, int res), - const_iterator(swig::PySwigIterator *iter = 0, int res), - const_reverse_iterator(swig::PySwigIterator *iter = 0, int res) { - res = SWIG_ConvertPtr($input, %as_voidptrptr(&iter), swig::PySwigIterator::descriptor(), 0); + %typemap(in,noblock=1,fragment="SwigPySequence_Cont") + iterator(swig::SwigPyIterator *iter = 0, int res), + reverse_iterator(swig::SwigPyIterator *iter = 0, int res), + const_iterator(swig::SwigPyIterator *iter = 0, int res), + const_reverse_iterator(swig::SwigPyIterator *iter = 0, int res) { + res = SWIG_ConvertPtr($input, %as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0); if (!SWIG_IsOK(res) || !iter) { %argument_fail(SWIG_TypeError, "$type", $symname, $argnum); } else { - swig::PySwigIterator_T<$type > *iter_t = dynamic_cast<swig::PySwigIterator_T<$type > *>(iter); + swig::SwigPyIterator_T<$type > *iter_t = dynamic_cast<swig::SwigPyIterator_T<$type > *>(iter); if (iter_t) { $1 = iter_t->get_current(); } else { @@ -575,18 +575,18 @@ } } - %typecheck(%checkcode(ITERATOR),noblock=1,fragment="PySequence_Cont") + %typecheck(%checkcode(ITERATOR),noblock=1,fragment="SwigPySequence_Cont") iterator, reverse_iterator, const_iterator, const_reverse_iterator { - swig::PySwigIterator *iter = 0; - int res = SWIG_ConvertPtr($input, %as_voidptrptr(&iter), swig::PySwigIterator::descriptor(), 0); - $1 = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::PySwigIterator_T<$type > *>(iter) != 0)); + swig::SwigPyIterator *iter = 0; + int res = SWIG_ConvertPtr($input, %as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0); + $1 = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<$type > *>(iter) != 0)); } - %fragment("PySequence_Cont"); + %fragment("SwigPySequence_Cont"); %newobject iterator(PyObject **PYTHON_SELF); %extend { - swig::PySwigIterator* iterator(PyObject **PYTHON_SELF) { + swig::SwigPyIterator* iterator(PyObject **PYTHON_SELF) { return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } @@ -623,7 +623,7 @@ %swig_sequence_iterator(%arg(Sequence)) %swig_container_methods(%arg(Sequence)) - %fragment("PySequence_Base"); + %fragment("SwigPySequence_Base"); %extend { value_type pop() throw (std::out_of_range) { @@ -740,16 +740,16 @@ %fragment("StdSequenceTraits","header", fragment="StdTraits", - fragment="PySequence_Cont") + fragment="SwigPySequence_Cont") { namespace swig { - template <class PySeq, class Seq> + template <class SwigPySeq, class Seq> inline void - assign(const PySeq& pyseq, Seq* seq) { - // seq->assign(pyseq.begin(), pyseq.end()); // not used as not always implemented - typedef typename PySeq::value_type value_type; - typename PySeq::const_iterator it = pyseq.begin(); - for (;it != pyseq.end(); ++it) { + assign(const SwigPySeq& swigpyseq, Seq* seq) { + // seq->assign(swigpyseq.begin(), swigpyseq.end()); // not used as not always implemented + typedef typename SwigPySeq::value_type value_type; + typename SwigPySeq::const_iterator it = swigpyseq.begin(); + for (;it != swigpyseq.end(); ++it) { seq->insert(seq->end(),(value_type)(*it)); } } @@ -769,14 +769,14 @@ } } else if (PySequence_Check(obj)) { try { - PySequence_Cont<value_type> pyseq(obj); + SwigPySequence_Cont<value_type> swigpyseq(obj); if (seq) { sequence *pseq = new sequence(); - assign(pyseq, pseq); + assign(swigpyseq, pseq); *seq = pseq; return SWIG_NEWOBJ; } else { - return pyseq.check() ? SWIG_OK : SWIG_ERROR; + return swigpyseq.check() ? SWIG_OK : SWIG_ERROR; } } catch (std::exception& e) { if (seq) { Modified: trunk/Lib/python/pyiterators.swg =================================================================== --- trunk/Lib/python/pyiterators.swg 2008-12-02 20:21:16 UTC (rev 10960) +++ trunk/Lib/python/pyiterators.swg 2008-12-03 18:43:44 UTC (rev 10961) @@ -6,56 +6,56 @@ * * Implement a python 'output' iterator for Python 2.2 or higher. * - * Users can derive form the PySwigIterator to implement their + * Users can derive form the SwigPyIterator to implement their * own iterators. As an example (real one since we use it for STL/STD - * containers), the template PySwigIterator_T does the + * containers), the template SwigPyIterator_T does the * implementation for genereic C++ iterators. * ----------------------------------------------------------------------------- */ %include <std_common.i> -%fragment("PySwigIterator","header") { +%fragment("SwigPyIterator","header") { namespace swig { struct stop_iteration { }; - struct PySwigIterator { + struct SwigPyIterator { private: - PyObject_ptr _seq; + SwigPtr_PyObject _seq; protected: - PySwigIterator(PyObject *seq) : _seq(seq) + SwigPyIterator(PyObject *seq) : _seq(seq) { } public: - virtual ~PySwigIterator() {} + virtual ~SwigPyIterator() {} // Access iterator method, required by Python virtual PyObject *value() const = 0; // Forward iterator method, required by Python - virtual PySwigIterator *incr(size_t n = 1) = 0; + virtual SwigPyIterator *incr(size_t n = 1) = 0; // Backward iterator method, very common in C++, but not required in Python - virtual PySwigIterator *decr(size_t /*n*/ = 1) + virtual SwigPyIterator *decr(size_t /*n*/ = 1) { throw stop_iteration(); } // Random access iterator methods, but not required in Python - virtual ptrdiff_t distance(const PySwigIterator &/*x*/) const + virtual ptrdiff_t distance(const SwigPyIterator &/*x*/) const { throw std::invalid_argument("operation not supported"); } - virtual bool equal (const PySwigIterator &/*x*/) const + virtual bool equal (const SwigPyIterator &/*x*/) const { throw std::invalid_argument("operation not supported"); } // C++ common/needed methods - virtual PySwigIterator *copy() const = 0; + virtual SwigPyIterator *copy() const = 0; PyObject *next() { @@ -81,42 +81,42 @@ return obj; } - PySwigIterator *advance(ptrdiff_t n) + SwigPyIterator *advance(ptrdiff_t n) { return (n > 0) ? incr(n) : decr(-n); } - bool operator == (const PySwigIterator& x) const + bool operator == (const SwigPyIterator& x) const { return equal(x); } - bool operator != (const PySwigIterator& x) const + bool operator != (const SwigPyIterator& x) const { return ! operator==(x); } - PySwigIterator& operator += (ptrdiff_t n) + SwigPyIterator& operator += (ptrdiff_t n) { return *advance(n); } - PySwigIterator& operator -= (ptrdiff_t n) + SwigPyIterator& operator -= (ptrdiff_t n) { return *advance(-n); } - PySwigIterator* operator + (ptrdiff_t n) const + SwigPyIterator* operator + (ptrdiff_t n) const { return copy()->advance(n); } - PySwigIterator* operator - (ptrdiff_t n) const + SwigPyIterator* operator - (ptrdiff_t n) const { return copy()->advance(-n); } - ptrdiff_t operator - (const PySwigIterator& x) const + ptrdiff_t operator - (const SwigPyIterator& x) const { return x.distance(*this); } @@ -125,7 +125,7 @@ static int init = 0; static swig_type_info* desc = 0; if (!init) { - desc = SWIG_TypeQuery("swig::PySwigIterator *"); + desc = SWIG_TypeQuery("swig::SwigPyIterator *"); init = 1; } return desc; @@ -134,18 +134,18 @@ } } -%fragment("PySwigIterator_T","header",fragment="PySwigIterator",fragment="StdTraits",fragment="StdIteratorTraits") { +%fragment("SwigPyIterator_T","header",fragment="SwigPyIterator",fragment="StdTraits",fragment="StdIteratorTraits") { namespace swig { template<typename OutIterator> - class PySwigIterator_T : public PySwigIterator + class SwigPyIterator_T : public SwigPyIterator { public: typedef OutIterator out_iterator; typedef typename std::iterator_traits<out_iterator>::value_type value_type; - typedef PySwigIterator_T<out_iterator> self_type; + typedef SwigPyIterator_T<out_iterator> self_type; - PySwigIterator_T(out_iterator curr, PyObject *seq) - : PySwigIterator(seq), current(curr) + SwigPyIterator_T(out_iterator curr, PyObject *seq) + : SwigPyIterator(seq), current(curr) { } @@ -155,7 +155,7 @@ } - bool equal (const PySwigIterator &iter) const + bool equal (const SwigPyIterator &iter) const { const self_type *iters = dynamic_cast<const self_type *>(&iter); if (iters) { @@ -165,7 +165,7 @@ } } - ptrdiff_t distance(const PySwigIterator &iter) const + ptrdiff_t distance(const SwigPyIterator &iter) const { const self_type *iters = dynamic_cast<const self_type *>(&iter); if (iters) { @@ -193,17 +193,17 @@ template<typename OutIterator, typename ValueType = typename std::iterator_traits<OutIterator>::value_type, typename FromOper = from_oper<ValueType> > - class PySwigIteratorOpen_T : public PySwigIterator_T<OutIterator> + class SwigPyIteratorOpen_T : public SwigPyIterator_T<OutIterator> { public: FromOper from; typedef OutIterator out_iterator; typedef ValueType value_type; - typedef PySwigIterator_T<out_iterator> base; - typedef PySwigIteratorOpen_T<OutIterator, ValueType, FromOper> self_type; + typedef SwigPyIterator_T<out_iterator> base; + typedef SwigPyIteratorOpen_T<OutIterator, ValueType, FromOper> self_type; - PySwigIteratorOpen_T(out_iterator curr, PyObject *seq) - : PySwigIterator_T<OutIterator>(curr, seq) + SwigPyIteratorOpen_T(out_iterator curr, PyObject *seq) + : SwigPyIterator_T<OutIterator>(curr, seq) { } @@ -211,12 +211,12 @@ return from(static_cast<const value_type&>(*(base::current))); } - PySwigIterator *copy() const + SwigPyIterator *copy() const { return new self_type(*this); } - PySwigIterator *incr(size_t n = 1) + SwigPyIterator *incr(size_t n = 1) { while (n--) { ++base::current; @@ -224,7 +224,7 @@ return this; } - PySwigIterator *decr(size_t n = 1) + SwigPyIterator *decr(size_t n = 1) { while (n--) { --base::current; @@ -236,17 +236,17 @@ template<typename OutIterator, typename ValueType = typename std::iterator_traits<OutIterator>::value_type, typename FromOper = from_oper<ValueType> > - class PySwigIteratorClosed_T : public PySwigIterator_T<OutIterator> + class SwigPyIteratorClosed_T : public SwigPyIterator_T<OutIterator> { public: FromOper from; typedef OutIterator out_iterator; typedef ValueType value_type; - typedef PySwigIterator_T<out_iterator> base; - typedef PySwigIteratorClosed_T<OutIterator, ValueType, FromOper> self_type; + typedef SwigPyIterator_T<out_iterator> base; + typedef SwigPyIteratorClosed_T<OutIterator, ValueType, FromOper> self_type; - PySwigIteratorClosed_T(out_iterator curr, out_iterator first, out_iterator last, PyObject *seq) - : PySwigIterator_T<OutIterator>(curr, seq), begin(first), end(last) + SwigPyIteratorClosed_T(out_iterator curr, out_iterator first, out_iterator last, PyObject *seq) + : SwigPyIterator_T<OutIterator>(curr, seq), begin(first), end(last) { } @@ -258,12 +258,12 @@ } } - PySwigIterator *copy() const + SwigPyIterator *copy() const { return new self_type(*this); } - PySwigIterator *incr(size_t n = 1) + SwigPyIterator *incr(size_t n = 1) { while (n--) { if (base::current == end) { @@ -275,7 +275,7 @@ return this; } - PySwigIterator *decr(size_t n = 1) + SwigPyIterator *decr(size_t n = 1) { while (n--) { if (base::current == begin) { @@ -293,23 +293,23 @@ }; template<typename OutIter> - inline PySwigIterator* + inline SwigPyIterator* make_output_iterator(const OutIter& current, const OutIter& begin,const OutIter& end, PyObject *seq = 0) { - return new PySwigIteratorClosed_T<OutIter>(current, begin, end, seq); + return new SwigPyIteratorClosed_T<OutIter>(current, begin, end, seq); } template<typename OutIter> - inline PySwigIterator* + inline SwigPyIterator* make_output_iterator(const OutIter& current, PyObject *seq = 0) { - return new PySwigIteratorOpen_T<OutIter>(current, seq); + return new SwigPyIteratorOpen_T<OutIter>(current, seq); } } } -%fragment("PySwigIterator"); +%fragment("SwigPyIterator"); namespace swig { /* @@ -327,67 +327,67 @@ /* Mark methods that return new objects */ - %newobject PySwigIterator::copy; - %newobject PySwigIterator::operator + (ptrdiff_t n) const; - %newobject PySwigIterator::operator - (ptrdiff_t n) const; + %newobject SwigPyIterator::copy; + %newobject SwigPyIterator::operator + (ptrdiff_t n) const; + %newobject SwigPyIterator::operator - (ptrdiff_t n) const; - %nodirector PySwigIterator; - %extend PySwigIterator { + %nodirector SwigPyIterator; + %extend SwigPyIterator { %pythoncode {def __iter__(self): return self} } - %catches(swig::stop_iteration) PySwigIterator::value() const; - %catches(swig::stop_iteration) PySwigIterator::incr(size_t n = 1); - %catches(swig::stop_iteration) PySwigIterator::decr(size_t n = 1); - %catches(std::invalid_argument) PySwigIterator::distance(const PySwigIterator &x) const; - %catches(std::invalid_argument) PySwigIterator::equal (const PySwigIterator &x) const; - %catches(swig::stop_iteration) PySwigIterator::__next__(); - %catches(swig::stop_iteration) PySwigIterator::next(); - %catches(swig::stop_iteration) PySwigIterator::previous(); - %catches(swig::stop_iteration) PySwigIterator::advance(ptrdiff_t n); - %catches(swig::stop_iteration) PySwigIterator::operator += (ptrdiff_t n); - %catches(swig::stop_iteration) PySwigIterator::operator -= (ptrdiff_t n); - %catches(swig::stop_iteration) PySwigIterator::operator + (ptrdiff_t n) const; - %catches(swig::stop_iteration) PySwigIterator::operator - (ptrdiff_t n) const; + %catches(swig::stop_iteration) SwigPyIterator::value() const; + %catches(swig::stop_iteration) SwigPyIterator::incr(size_t n = 1); + %catches(swig::stop_iteration) SwigPyIterator::decr(size_t n = 1); + %catches(std::invalid_argument) SwigPyIterator::distance(const SwigPyIterator &x) const; + %catches(std::invalid_argument) SwigPyIterator::equal (const SwigPyIterator &x) const; + %catches(swig::stop_iteration) SwigPyIterator::__next__(); + %catches(swig::stop_iteration) SwigPyIterator::next(); + %catches(swig::stop_iteration) SwigPyIterator::previous(); + %catches(swig::stop_iteration) SwigPyIterator::advance(ptrdiff_t n); + %catches(swig::stop_iteration) SwigPyIterator::operator += (ptrdiff_t n); + %catches(swig::stop_iteration) SwigPyIterator::operator -= (ptrdiff_t n); + %catches(swig::stop_iteration) SwigPyIterator::operator + (ptrdiff_t n) const; + %catches(swig::stop_iteration) SwigPyIterator::operator - (ptrdiff_t n) const; - struct PySwigIterator + struct SwigPyIterator { protected: - PySwigIterator(PyObject *seq); + SwigPyIterator(PyObject *seq); public: - virtual ~PySwigIterator(); + virtual ~SwigPyIterator(); // Access iterator method, required by Python virtual PyObject *value() const = 0; // Forward iterator method, required by Python - virtual PySwigIterator *incr(size_t n = 1) = 0; + virtual SwigPyIterator *incr(size_t n = 1) = 0; // Backward iterator method, very common in C++, but not required in Python - virtual PySwigIterator *decr(size_t n = 1); + virtual SwigPyIterator *decr(size_t n = 1); // Random access iterator methods, but not required in Python - virtual ptrdiff_t distance(const PySwigIterator &x) const; + virtual ptrdiff_t distance(const SwigPyIterator &x) const; - virtual bool equal (const PySwigIterator &x) const; + virtual bool equal (const SwigPyIterator &x) const; // C++ common/needed methods - virtual PySwigIterator *copy() const = 0; + virtual SwigPyIterator *copy() const = 0; PyObject *next(); PyObject *__next__(); PyObject *previous(); - PySwigIterator *advance(ptrdiff_t n); + SwigPyIterator *advance(ptrdiff_t n); - bool operator == (const PySwigIterator& x) const; - bool operator != (const PySwigIterator& x) const; - PySwigIterator& operator += (ptrdiff_t n); - PySwigIterator& operator -= (ptrdiff_t n); - PySwigIterator* operator + (ptrdiff_t n) const; - PySwigIterator* operator - (ptrdiff_t n) const; - ptrdiff_t operator - (const PySwigIterator& x) const; + bool operator == (const SwigPyIterator& x) const; + bool operator != (const SwigPyIterator& x) const; + SwigPyIterator& operator += (ptrdiff_t n); + SwigPyIterator& operator -= (ptrdiff_t n); + SwigPyIterator* operator + (ptrdiff_t n) const; + SwigPyIterator* operator - (ptrdiff_t n) const; + ptrdiff_t operator - (const SwigPyIterator& x) const; }; } Added: trunk/Lib/python/pyname_compat.i =================================================================== --- trunk/Lib/python/pyname_compat.i (rev 0) +++ trunk/Lib/python/pyname_compat.i 2008-12-03 18:43:44 UTC (rev 10961) @@ -0,0 +1,88 @@ +/* +* From SWIG 1.3.37 we deprecated all SWIG symbols that start with Py, +* since they are inappropriate and discouraged in Python documentation +* (from http://www.python.org/doc/2.5.2/api/includes.html): +* +* "All user visible names defined by Python.h (except those defined by the included +* standard headers) have one of the prefixes "Py" or "_Py". Names beginning with +* "_Py" are for internal use by the Python implementation and should not be used +* by extension writers. Structure member names do not have a reserved prefix. +* +* Important: user code should never define names that begin with "Py" or "_Py". +* This confuses the reader, and jeopardizes the portability of the user code to +* future Python versions, which may define additional names beginning with one +* of these prefixes." +* +* This file defined macros to provide backward compatibility for these deprecated +* symbols. In the case you have these symbols in your interface file, you can simply +* include this file at begining of it. +* +* However, this file may be removed in future release of SWIG, so using this file to +* keep these inappropriate names in your SWIG interface file is also not recommanded. +* Instead, we provide a simple tool for converting your interface files to +* the new naming convention. You can download the tool here: +* https://swig.svn.sourceforge.net/svnroot/swig/trunk/Tools/pyname_patch.py +*/ + +%fragment("PySequence_Base", "header", fragment="SwigPySequence_Base") {} +%fragment("PySequence_Cont", "header", fragment="SwigPySequence_Cont") {} +%fragment("PySwigIterator_T", "header", fragment="SwigPyIterator_T") {} +%fragment("PyPairBoolOutputIterator", "header", fragment="SwigPyPairBoolOutputIterator") {} +%fragment("PySwigIterator", "header", fragment="SwigPyIterator") {} +%fragment("PySwigIterator_T", "header", fragment="SwigPyIterator_T") {} + +%inline %{ +#define PyMapIterator_T SwigPyMapIterator_T +#define PyMapKeyIterator_T SwigPyMapKeyIterator_T +#define PyMapValueIterator_T SwigPyMapValueITerator_T +#define PyObject_ptr SwigPtr_PyObject +#define PyObject_var SwigVar_PyObject +#define PyOper SwigPyOper +#define PySeq SwigPySeq +#define PySequence_ArrowProxy SwigPySequence_ArrowProxy +#define PySequence_Cont SwigPySequence_Cont +#define PySequence_InputIterator SwigPySequence_InputIterator +#define PySequence_Ref SwigPySequence_Ref +#define PySwigClientData SwigPyClientData +#define PySwigClientData_Del SwigPyClientData_Del +#define PySwigClientData_New SwigPyClientData_New +#define PySwigIterator SwigPyIterator +#define PySwigIteratorClosed_T SwigPyIteratorClosed_T +#define PySwigIteratorOpen_T SwigPyIteratorOpen_T +#define PySwigIterator_T SwigPyIterator_T +#define PySwigObject SwigPyObject +#define PySwigObject_Check SwigPyObject_Check +#define PySwigObject_GetDesc SwigPyObject_GetDesc +#define PySwigObject_New SwigPyObject_New +#define PySwigObject_acquire SwigPyObject_acquire +#define PySwigObject_append SwigPyObject_append +#define PySwigObject_as_number SwigPyObject_as_number +#define PySwigObject_compare SwigPyObject_compare +#define PySwigObject_dealloc SwigPyObject_dealloc +#define PySwigObject_disown SwigPyObject_disown +#define PySwigObject_format SwigPyObject_format +#define PySwigObject_getattr SwigPyObject_getattr +#define PySwigObject_hex SwigPyObject_hex +#define PySwigObject_long SwigPyObject_long +#define PySwigObject_next SwigPyObject_next +#define PySwigObject_oct SwigPyObject_oct +#define PySwigObject_own SwigPyObject_own +#define PySwigObject_print SwigPyObject_print +#define PySwigObject_repr SwigPyObject_repr +#define PySwigObject_richcompare SwigPyObject_richcompare +#define PySwigObject_str SwigPyObject_str +#define PySwigObject_type SwigPyObject_type +#define PySwigPacked SwigPyPacked +#define PySwigPacked_Check SwigPyPacked_Check +#define PySwigPacked_New SwigPyPacked_New +#define PySwigPacked_UnpackData SwigPyPacked_UnpackData +#define PySwigPacked_compare SwigPyPacked_compare +#define PySwigPacked_dealloc SwigPyPacked_dealloc +#define PySwigPacked_print SwigPyPacked_print +#define PySwigPacked_repr SwigPyPacked_repr +#define PySwigPacked_str SwigPyPacked_str +#define PySwigPacked_type SwigPyPacked_type +#define pyseq swigpyseq +#define pyswigobject_type swigpyobject_type +#define pyswigpacked_type swigpypacked_type +%} Modified: trunk/Lib/python/pyopers.swg =================================================================== --- trunk/Lib/python/pyopers.swg 2008-12-02 20:21:16 UTC (rev 10960) +++ trunk/Lib/python/pyopers.swg 2008-12-03 18:43:44 UTC (rev 10961) @@ -90,7 +90,7 @@ */ -#define %pyinplaceoper(PyOper, Oper) %delobject Oper; %newobject Oper; %rename(PyOper) Oper +#define %pyinplaceoper(SwigPyOper, Oper) %delobject Oper; %newobject Oper; %rename(SwigPyOper) Oper %pyinplaceoper(__iadd__ , *::operator +=); %pyinplaceoper(__isub__ , *::operator -=); Modified: trunk/Lib/python/pyrun.swg =================================================================== --- trunk/Lib/python/pyrun.swg 2008-12-02 20:21:16 UTC (rev 10960) +++ trunk/Lib/python/pyrun.swg 2008-12-03 18:43:44 UTC (rev 10961) @@ -42,7 +42,7 @@ #define SWIG_GetModule(clientdata) SWIG_Python_GetModule() #define SWIG_SetModule(clientdata, pointer) SWIG_Python_SetModule(pointer) -#define SWIG_NewClientData(obj) PySwigClientData_New(obj) +#define SWIG_NewClientData(obj) SwigPyClientData_New(obj) #define SWIG_SetErrorObj SWIG_Python_SetErrorObj #define SWIG_SetErrorMsg SWIG_Python_SetErrorMsg @@ -238,7 +238,7 @@ return none; } -/* PySwigClientData */ +/* SwigPyClientData */ typedef struct { PyObject *klass; @@ -247,30 +247,30 @@ PyObject *destroy; int delargs; int implicitconv; -} PySwigClientData; +} SwigPyClientData; SWIGRUNTIMEINLINE int SWIG_Python_CheckImplicit(swig_type_info *ty) { - PySwigClientData *data = (PySwigClientData *)ty->clientdata; + SwigPyClientData *data = (SwigPyClientData *)ty->clientdata; return data ? data->implicitconv : 0; } SWIGRUNTIMEINLINE PyObject * SWIG_Python_ExceptionType(swig_type_info *desc) { - PySwigClientData *data = desc ? (PySwigClientData *) desc->clientdata : 0; + SwigPyClientData *data = desc ? (SwigPyClientData *) desc->clientdata : 0; PyObject *klass = data ? data->klass : 0; return (klass ? klass : PyExc_RuntimeError); } -SWIGRUNTIME PySwigClientData * -PySwigClientData_New(PyObject* obj) +SWIGRUNTIME SwigPyClientData * +SwigPyClientData_New(PyObject* obj) { if (!obj) { return 0; } else { - PySwigClientData *data = (PySwigClientData *)malloc(sizeof(PySwigClientData)); + SwigPyClientData *data = (SwigPyClientData *)malloc(sizeof(SwigPyClientData)); /* the klass element */ data->klass = obj; Py_INCREF(data->klass); @@ -318,14 +318,14 @@ } SWIGRUNTIME void -PySwigClientData_Del(PySwigClientData* data) +SwigPyClientData_Del(SwigPyClientData* data) { Py_XDECREF(data->newraw); Py_XDECREF(data->newargs); Py_XDECREF(data->destroy); } -/* =============== PySwigObject =====================*/ +/* =============== SwigPyObject =====================*/ typedef struct { PyObject_HEAD @@ -333,21 +333,21 @@ swig_type_info *ty; int own; PyObject *next; -} PySwigObject; +} SwigPyObject; SWIGRUNTIME PyObject * -PySwigObject_long(PySwigObject *v) +SwigPyObject_long(SwigPyObject *v) { return PyLong_FromVoidPtr(v->ptr); } SWIGRUNTIME PyObject * -PySwigObject_format(const char* fmt, PySwigObject *v) +SwigPyObject_format(const char* fmt, SwigPyObject *v) { PyObject *res = NULL; PyObject *args = PyTuple_New(1); if (args) { - if (PyTuple_SetItem(args, 0, PySwigObject_long(v)) == 0) { + if (PyTuple_SetItem(args, 0, SwigPyObject_long(v)) == 0) { PyObject *ofmt = SWIG_Python_str_FromChar(fmt); if (ofmt) { #if PY_VERSION_HEX >= 0x03000000 @@ -364,33 +364,33 @@ } SWIGRUNTIME PyObject * -PySwigObject_oct(PySwigObject *v) +SwigPyObject_oct(SwigPyObject *v) { - return PySwigObject_format("%o",v); + return SwigPyObject_format("%o",v); } SWIGRUNTIME PyObject * -PySwigObject_hex(PySwigObject *v) +SwigPyObject_hex(SwigPyObject *v) { - return PySwigObject_format("%x",v); + return SwigPyObject_format("%x",v); } SWIGRUNTIME PyObject * #ifdef METH_NOARGS -PySwigObject_repr(PySwigObject *v) +SwigPyObject_repr(SwigPyObject *v) #else -PySwigObject_repr(PySwigObject *v, PyObject *args) +SwigPyObject_repr(SwigPyObject *v, PyObject *args) #endif { const char *name = SWIG_TypePrettyName(v->ty); - PyObject *hex = PySwigObject_hex(v); + PyObject *hex = SwigPyObject_hex(v); PyObject *repr = SWIG_Python_str_FromFormat("<Swig Object of type '%s' at %p>", name, hex); Py_DECREF(hex); if (v->next) { #ifdef METH_NOARGS - PyObject *nrep = PySwigObject_repr((PySwigObject *)v->next); + PyObject *nrep = SwigPyObject_repr((SwigPyObject *)v->next); #else - PyObject *nrep = PySwigObject_repr((PySwigObject *)v->next, args); + PyObject *nrep = SwigPyObject_repr((SwigPyObject *)v->next, args); #endif #if PY_VERSION_HEX >= 0x03000000 PyObject *joined = PyUnicode_Concat(repr, nrep); @@ -405,12 +405,12 @@ } SWIGRUNTIME int -PySwigObject_print(PySwigObject *v, FILE *fp, int SWIGUNUSEDPARM(flags)) +SwigPyObject_print(SwigPyObject *v, FILE *fp, int SWIGUNUSEDPARM(flags)) { #ifdef METH_NOARGS - PyObject *repr = PySwigObject_repr(v); + PyObject *repr = SwigPyObject_repr(v); #else - PyObject *repr = PySwigObject_repr(v, NULL); + PyObject *repr = SwigPyObject_repr(v, NULL); #endif if (repr) { fputs(SWIG_Python_str_AsChar(repr), fp); @@ -422,7 +422,7 @@ } SWIGRUNTIME PyObject * -PySwigObject_str(PySwigObject *v) +SwigPyObject_str(SwigPyObject *v) { char result[SWIG_BUFFER_SIZE]; return SWIG_PackVoidPtr(result, v->ptr, v->ty->name, sizeof(result)) ? @@ -430,7 +430,7 @@ } SWIGRUNTIME int -PySwigObject_compare(PySwigObject *v, PySwigObject *w) +SwigPyObject_compare(SwigPyObject *v, SwigPyObject *w) { void *i = v->ptr; void *j = w->ptr; @@ -439,14 +439,14 @@ /* Added for Python 3.x, whould it also useful for Python 2.x? */ SWIGRUNTIME PyObject* -PySwigObject_richcompare(PySwigObject *v, PySwigObject *w, int op) +SwigPyObject_richcompare(SwigPyObject *v, SwigPyObject *w, int op) { PyObject* res; if( op != Py_EQ && op != Py_NE ) { Py_INCREF(Py_NotImplemented); return Py_NotImplemented; } - if( (PySwigObject_compare(v, w)==0) == (op == Py_EQ) ) + if( (SwigPyObject_compare(v, w)==0) == (op == Py_EQ) ) res = Py_True; else res = Py_False; @@ -458,35 +458,35 @@ SWIGRUNTIME PyTypeObject* _PySwigObject_type(void); SWIGRUNTIME PyTypeObject* -PySwigObject_type(void) { +SwigPyObject_type(void) { static PyTypeObject *SWIG_STATIC_POINTER(type) = _PySwigObject_type(); return type; } SWIGRUNTIMEINLINE int -PySwigObject_Check(PyObject *op) { - return (Py_TYPE(op) == PySwigObject_type()) - || (strcmp(Py_TYPE(op)->tp_name,"PySwigObject") == 0); +SwigPyObject_Check(PyObject *op) { + return (Py_TYPE(op) == SwigPyObject_type()) + || (strcmp(Py_TYPE(op)->tp_name,"SwigPyObject") == 0); } SWIGRUNTIME PyObject * -PySwigObject_New(void *ptr, swig_type_info *ty, int own); +SwigPyObject_New(void *ptr, swig_type_info *ty, int own); SWIGRUNTIME void -PySwigObject_dealloc(PyObject *v) +SwigPyObject_dealloc(PyObject *v) { - PySwigObject *sobj = (PySwigObject *) v; + SwigPyObject *sobj = (SwigPyObject *) v; PyObject *next = sobj->next; if (sobj->own == SWIG_POINTER_OWN) { swig_type_info *ty = sobj->ty; - PySwigClientData *data = ty ? (PySwigClientData *) ty->clientdata : 0; + SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0; PyObject *destroy = data ? data->destroy : 0; if (destroy) { /* destroy is always a VARARGS method */ PyObject *res; if (data->delargs) { /* we need to create a temporal object to carry the destroy operation */ - PyObject *tmp = PySwigObject_New(sobj->ptr, ty, 0); + PyObject *tmp = SwigPyObject_New(sobj->ptr, ty, 0); res = SWIG_Python_CallFunctor(destroy, tmp); Py_DECREF(tmp); } else { @@ -508,15 +508,15 @@ } SWIGRUNTIME PyObject* -PySwigObject_append(PyObject* v, PyObject* next) +SwigPyObject_append(PyObject* v, PyObject* next) { - PySwigObject *sobj = (PySwigObject *) v; + SwigPyObject *sobj = (SwigPyObject *) v; #ifndef METH_O PyObject *tmp = 0; if (!PyArg_ParseTuple(next,(char *)"O:append", &tmp)) return NULL; next = tmp; #endif - if (!PySwigObject_Check(next)) { + if (!SwigPyObject_Check(next)) { return NULL; } sobj->next = next; @@ -526,12 +526,12 @@ SWIGRUNTIME PyObject* #ifdef METH_NOARGS -PySwigObject_next(PyObject* v) +SwigPyObject_next(PyObject* v) #else -PySwigObject_next(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) +SwigPyObject_next(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) #endif { - PySwigObject *sobj = (PySwigObject *) v; + SwigPyObject *sobj = (SwigPyObject *) v; if (sobj->next) { Py_INCREF(sobj->next); return sobj->next; @@ -542,30 +542,30 @@ SWIGINTERN PyObject* #ifdef METH_NOARGS -PySwigObject_disown(PyObject *v) +SwigPyObject_disown(PyObject *v) #else -PySwigObject_disown(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) +SwigPyObject_disown(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) #endif { - PySwigObject *sobj = (PySwigObject *)v; + SwigPyObject *sobj = (SwigPyObject *)v; sobj->own = 0; return SWIG_Py_Void(); } SWIGINTERN PyObject* #ifdef METH_NOARGS -PySwigObject_acquire(PyObject *v) +SwigPyObject_acquire(PyObject *v) #else -PySwigObject_acquire(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) +SwigPyObject_acquire(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) #endif { - PySwigObject *sobj = (PySwigObject *)v; + SwigPyObject *sobj = (SwigPyObject *)v; sobj->own = SWIG_POINTER_OWN; return SWIG_Py_Void(); } SWIGINTERN PyObject* -PySwigObject_own(PyObject *v, PyObject *args) +SwigPyObject_own(PyObject *v, PyObject *args) { PyObject *val = 0; #if (PY_VERSION_HEX < 0x02020000) @@ -578,20 +578,20 @@ } else { - PySwigObject *sobj = (PySwigObject *)v; + SwigPyObject *sobj = (SwigPyObject *)v; PyObject *obj = PyBool_FromLong(sobj->own); if (val) { #ifdef METH_NOARGS if (PyObject_IsTrue(val)) { - PySwigObject_acquire(v); + SwigPyObject_acquire(v); } else { - PySwigObject_disown(v); + SwigPyObject_disown(v); } #else if (PyObject_IsTrue(val)) { - PySwigObject_acquire(v,args); + SwigPyObject_acquire(v,args); } else { - PySwigObject_disown(v,args); + SwigPyObject_disown(v,args); } #endif } @@ -602,30 +602,30 @@ #ifdef METH_O static PyMethodDef swigobject_methods[] = { - {(char *)"disown", (PyCFunction)PySwigObject_disown, METH_NOARGS, (char *)"releases ownership of the pointer"}, - {(char *)"acquire", (PyCFunction)PySwigObject_acquire, METH_NOARGS, (char *)"aquires ownership of the pointer"}, - {(char *)"own", (PyCFunction)PySwigObject_own, METH_VARARGS, (char *)"returns/sets ownership of the pointer"}, - {(char *)"append", (PyCFunction)PySwigObject_append, METH_O, (char *)"appends another 'this' object"}, - {(char *)"next", (PyCFunction)PySwigObject_next, METH_NOARGS, (char *)"returns the next 'this' object"}, - {(char *)"__repr__",(PyCFunction)PySwigObject_repr, METH_NOARGS, (char *)"returns object representation"}, + {(char *)"disown", (PyCFunction)SwigPyObject_disown, METH_NOARGS, (char *)"releases ownership of the pointer"}, + {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_NOARGS, (char *)"aquires ownership of the pointer"}, + {(char *)"own", (PyCFunction)SwigPyObject_own, METH_VARARGS, (char *)"returns/sets ownership of the pointer"}, + {(char *)"append", (PyCFunction)SwigPyObject_append, METH_O, (char *)"appends another 'this' object"}, + {(char *)"next", (PyCFunction)SwigPyObject_next, METH_NOARGS, (char *)"returns the next 'this' object"}, + {(char *)"__repr__",(PyCFunction)SwigPyObject_repr, METH_NOARGS, (char *)"returns object representation"}, {0, 0, 0, 0} }; #else static PyMethodDef swigobject_methods[] = { - {(char *)"disown", (PyCFunction)PySwigObject_disown, METH_VARARGS, (char *)"releases ownership of the pointer"}, - {(char *)"acquire", (PyCFunction)PySwigObject_acquire, METH_VARARGS, (char *)"aquires ownership of the pointer"}, - {(char *)"own", (PyCFunction)PySwigObject_own, METH_VARARGS, (char *)"returns/sets ownership of the pointer"}, - {(char *)"append", (PyCFunction)PySwigObject_append, METH_VARARGS, (char *)"appends another 'this' object"}, - {(char *)"next", (PyCFunction)PySwigObject_next, METH_VARARGS, (char *)"returns the next 'this' object"}, - {(char *)"__repr__",(PyCFunction)PySwigObject_repr, METH_VARARGS, (char *)"returns object representation"}, + {(char *)"disown", ... [truncated message content] |
From: <wsf...@us...> - 2008-12-06 22:48:57
|
Revision: 10967 http://swig.svn.sourceforge.net/swig/?rev=10967&view=rev Author: wsfulton Date: 2008-12-06 21:40:54 +0000 (Sat, 06 Dec 2008) Log Message: ----------- modify build system to use php instead of php4 Modified Paths: -------------- trunk/Examples/Makefile.in trunk/Examples/php/class/Makefile trunk/Examples/php/constants/Makefile trunk/Examples/php/cpointer/Makefile trunk/Examples/php/disown/Makefile trunk/Examples/php/enum/Makefile trunk/Examples/php/funcptr/Makefile trunk/Examples/php/overloading/Makefile trunk/Examples/php/pointer/Makefile trunk/Examples/php/pragmas/Makefile trunk/Examples/php/proxy/Makefile trunk/Examples/php/reference/Makefile trunk/Examples/php/simple/Makefile trunk/Examples/php/sync/Makefile trunk/Examples/php/value/Makefile trunk/Examples/php/variables/Makefile trunk/Examples/test-suite/php/Makefile.in trunk/Makefile.in trunk/configure.in Added Paths: ----------- trunk/Examples/php/class/runme.php trunk/Examples/php/constants/runme.php trunk/Examples/php/cpointer/runme.php trunk/Examples/php/disown/runme.php trunk/Examples/php/enum/runme.php trunk/Examples/php/funcptr/runme.php trunk/Examples/php/overloading/runme.php trunk/Examples/php/pointer/runme.php trunk/Examples/php/pragmas/runme.php trunk/Examples/php/proxy/runme.php trunk/Examples/php/reference/runme.php trunk/Examples/php/simple/runme.php trunk/Examples/php/sync/runme.php trunk/Examples/php/value/runme.php trunk/Examples/php/variables/runme.php trunk/Examples/test-suite/php/abstract_inherit_ok_runme.php trunk/Examples/test-suite/php/abstract_inherit_runme.php trunk/Examples/test-suite/php/add_link_runme.php trunk/Examples/test-suite/php/argout_runme.php trunk/Examples/test-suite/php/arrayptr_runme.php trunk/Examples/test-suite/php/arrays_global_runme.php trunk/Examples/test-suite/php/arrays_global_twodim_runme.php trunk/Examples/test-suite/php/arrays_runme.php trunk/Examples/test-suite/php/arrays_scope_runme.php trunk/Examples/test-suite/php/casts_runme.php trunk/Examples/test-suite/php/class_ignore_runme.php trunk/Examples/test-suite/php/conversion_namespace_runme.php trunk/Examples/test-suite/php/conversion_ns_template_runme.php trunk/Examples/test-suite/php/conversion_runme.php trunk/Examples/test-suite/php/cpp_static_runme.php trunk/Examples/test-suite/php/enum_scope_template_runme.php trunk/Examples/test-suite/php/evil_diamond_ns_runme.php trunk/Examples/test-suite/php/evil_diamond_prop_runme.php trunk/Examples/test-suite/php/evil_diamond_runme.php trunk/Examples/test-suite/php/extend_template_ns_runme.php trunk/Examples/test-suite/php/extend_template_runme.php trunk/Examples/test-suite/php/grouping_runme.php trunk/Examples/test-suite/php/ignore_parameter_runme.php trunk/Examples/test-suite/php/li_carrays_runme.php trunk/Examples/test-suite/php/li_std_string_runme.php trunk/Examples/test-suite/php/rename_scope_runme.php trunk/Examples/test-suite/php/skel.php trunk/Examples/test-suite/php/smart_pointer_rename_runme.php trunk/Examples/test-suite/php/sym_runme.php trunk/Examples/test-suite/php/template_arg_typename_runme.php trunk/Examples/test-suite/php/template_construct_runme.php trunk/Examples/test-suite/php/tests.php trunk/Examples/test-suite/php/typedef_reference_runme.php trunk/Examples/test-suite/php/typemap_ns_using_runme.php trunk/Examples/test-suite/php/using1_runme.php trunk/Examples/test-suite/php/using2_runme.php trunk/Examples/test-suite/php/valuewrapper_base_runme.php Removed Paths: ------------- trunk/Examples/php/class/runme.php4 trunk/Examples/php/constants/runme.php4 trunk/Examples/php/cpointer/runme.php4 trunk/Examples/php/disown/runme.php4 trunk/Examples/php/enum/runme.php4 trunk/Examples/php/funcptr/runme.php4 trunk/Examples/php/overloading/runme.php4 trunk/Examples/php/pointer/runme.php4 trunk/Examples/php/pragmas/runme.php4 trunk/Examples/php/proxy/runme.php4 trunk/Examples/php/reference/runme.php4 trunk/Examples/php/simple/runme.php4 trunk/Examples/php/sync/runme.php4 trunk/Examples/php/value/runme.php4 trunk/Examples/php/variables/runme.php4 trunk/Examples/test-suite/php/abstract_inherit_ok_runme.php4 trunk/Examples/test-suite/php/abstract_inherit_runme.php4 trunk/Examples/test-suite/php/add_link_runme.php4 trunk/Examples/test-suite/php/argout_runme.php4 trunk/Examples/test-suite/php/arrayptr_runme.php4 trunk/Examples/test-suite/php/arrays_global_runme.php4 trunk/Examples/test-suite/php/arrays_global_twodim_runme.php4 trunk/Examples/test-suite/php/arrays_runme.php4 trunk/Examples/test-suite/php/arrays_scope_runme.php4 trunk/Examples/test-suite/php/casts_runme.php4 trunk/Examples/test-suite/php/class_ignore_runme.php4 trunk/Examples/test-suite/php/conversion_namespace_runme.php4 trunk/Examples/test-suite/php/conversion_ns_template_runme.php4 trunk/Examples/test-suite/php/conversion_runme.php4 trunk/Examples/test-suite/php/cpp_static_runme.php4 trunk/Examples/test-suite/php/enum_scope_template_runme.php4 trunk/Examples/test-suite/php/evil_diamond_ns_runme.php4 trunk/Examples/test-suite/php/evil_diamond_prop_runme.php4 trunk/Examples/test-suite/php/evil_diamond_runme.php4 trunk/Examples/test-suite/php/extend_template_ns_runme.php4 trunk/Examples/test-suite/php/extend_template_runme.php4 trunk/Examples/test-suite/php/grouping_runme.php4 trunk/Examples/test-suite/php/ignore_parameter_runme.php4 trunk/Examples/test-suite/php/li_carrays_runme.php4 trunk/Examples/test-suite/php/li_std_string_runme.php4 trunk/Examples/test-suite/php/rename_scope_runme.php4 trunk/Examples/test-suite/php/skel.php4 trunk/Examples/test-suite/php/smart_pointer_rename_runme.php4 trunk/Examples/test-suite/php/sym_runme.php4 trunk/Examples/test-suite/php/template_arg_typename_runme.php4 trunk/Examples/test-suite/php/template_construct_runme.php4 trunk/Examples/test-suite/php/tests.php4 trunk/Examples/test-suite/php/typedef_reference_runme.php4 trunk/Examples/test-suite/php/typemap_ns_using_runme.php4 trunk/Examples/test-suite/php/using1_runme.php4 trunk/Examples/test-suite/php/using2_runme.php4 trunk/Examples/test-suite/php/valuewrapper_base_runme.php4 Modified: trunk/Examples/Makefile.in =================================================================== --- trunk/Examples/Makefile.in 2008-12-06 17:18:38 UTC (rev 10966) +++ trunk/Examples/Makefile.in 2008-12-06 21:40:54 UTC (rev 10967) @@ -746,41 +746,41 @@ ################################################################## # ------------------------------------------------------------------- -# Build a PHP4 dynamically loadable module (C) +# Build a PHP dynamically loadable module (C) # ------------------------------------------------------------------- -PHP4_INCLUDE = @PHP4INC@ -PHP4_SO = @PHP4_SO@ +PHP_INCLUDE = @PHPINC@ +PHP_SO = @PHP_SO@ -php4: $(SRCS) +php: $(SRCS) $(SWIG) -php5 $(SWIGOPT) $(INTERFACEPATH) - $(CC) -c $(CCSHARED) $(CFLAGS) $(SRCS) $(ISRCS) $(INCLUDES) $(PHP4_INCLUDE) - $(LDSHARED) $(CFLAGS) $(OBJS) $(IOBJS) $(LIBS) -o $(LIBPREFIX)$(TARGET)$(PHP4_SO) + $(CC) -c $(CCSHARED) $(CFLAGS) $(SRCS) $(ISRCS) $(INCLUDES) $(PHP_INCLUDE) + $(LDSHARED) $(CFLAGS) $(OBJS) $(IOBJS) $(LIBS) -o $(LIBPREFIX)$(TARGET)$(PHP_SO) # -------------------------------------------------------------------- -# Build a PHP4 dynamically loadable module (C++) +# Build a PHP dynamically loadable module (C++) # -------------------------------------------------------------------- -php4_cpp: $(SRCS) +php_cpp: $(SRCS) $(SWIG) -php5 -cppext cxx -c++ $(SWIGOPT) $(INTERFACEPATH) - $(CXX) -c $(CCSHARED) $(CFLAGS) $(SRCS) $(CXXSRCS) $(ICXXSRCS) $(INCLUDES) $(PHP4_INCLUDE) - $(CXXSHARED) $(CFLAGS) $(OBJS) $(IOBJS) $(LIBS) $(CPP_DLLIBS) -o $(LIBPREFIX)$(TARGET)$(PHP4_SO) + $(CXX) -c $(CCSHARED) $(CFLAGS) $(SRCS) $(CXXSRCS) $(ICXXSRCS) $(INCLUDES) $(PHP_INCLUDE) + $(CXXSHARED) $(CFLAGS) $(OBJS) $(IOBJS) $(LIBS) $(CPP_DLLIBS) -o $(LIBPREFIX)$(TARGET)$(PHP_SO) # ----------------------------------------------------------------- -# Running a PHP4 example +# Running a PHP example # ----------------------------------------------------------------- -PHP4=@PHP4@ -PHP4SCRIPT ?= runme.php4 +PHP=@PHP@ +PHPSCRIPT ?= runme.php -php4_run: - env LD_LIBRARY_PATH=.:$$LD_LIBRARY_PATH $(RUNTOOL) $(PHP4) -n -q -d extension_dir=. $(PHP4SCRIPT) +php_run: + env LD_LIBRARY_PATH=.:$$LD_LIBRARY_PATH $(RUNTOOL) $(PHP) -n -q -d extension_dir=. $(PHPSCRIPT) # ----------------------------------------------------------------- -# Cleaning the PHP4 examples +# Cleaning the PHP examples # ----------------------------------------------------------------- -php4_clean: +php_clean: rm -f *_wrap* *~ .~* example.php php_example.h rm -f core @EXTRA_CLEAN@ rm -f *.@OBJEXT@ *@SO@ Modified: trunk/Examples/php/class/Makefile =================================================================== --- trunk/Examples/php/class/Makefile 2008-12-06 17:18:38 UTC (rev 10966) +++ trunk/Examples/php/class/Makefile 2008-12-06 21:40:54 UTC (rev 10967) @@ -9,16 +9,16 @@ all:: $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \ SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' \ - php4_cpp + php_cpp static:: $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \ - SWIGOPT='$(SWIGOPT)' TARGET='myphp4' INTERFACE='$(INTERFACE)' \ - php4_cpp_static + SWIGOPT='$(SWIGOPT)' TARGET='myphp' INTERFACE='$(INTERFACE)' \ + php_cpp_static clean:: - $(MAKE) -f $(TOP)/Makefile php4_clean + $(MAKE) -f $(TOP)/Makefile php_clean rm -f $(TARGET).php check: all - $(MAKE) -f $(TOP)/Makefile php4_run + $(MAKE) -f $(TOP)/Makefile php_run Copied: trunk/Examples/php/class/runme.php (from rev 10966, trunk/Examples/php/class/runme.php4) =================================================================== --- trunk/Examples/php/class/runme.php (rev 0) +++ trunk/Examples/php/class/runme.php 2008-12-06 21:40:54 UTC (rev 10967) @@ -0,0 +1,64 @@ +<?php + +# This file illustrates the low-level C++ interface +# created by SWIG. In this case, all of our C++ classes +# get converted into function calls. + +require("example.php"); + +# ----- Object creation ----- + +print "Creating some objects:\n"; +$c = new_Circle(10); +print " Created circle $c\n"; +$s = new_Square(10); +print " Created square $s\n"; + +# ----- Access a static member ----- + +print "\nA total of " . nshapes() . " shapes were created\n"; + +# ----- Member data access ----- + +# Set the location of the object. +# Note: methods in the base class Shape are used since +# x and y are defined there. + +Shape_x_set($c, 20); +Shape_y_set($c, 30); +Shape_x_set($s,-10); +Shape_y_set($s,5); + +print "\nHere is their current position:\n"; +print " Circle = (" . Shape_x_get($c) . "," . Shape_y_get($c) . ")\n"; +print " Square = (" . Shape_x_get($s) . "," . Shape_y_get($s) . ")\n"; + +# ----- Call some methods ----- + +# Notice how the Shape_area() and Shape_perimeter() functions really +# invoke the appropriate virtual method on each object. +print "\nHere are some properties of the shapes:\n"; +foreach (array($c,$s) as $o) { + print " $o\n"; + print " area = " . Shape_area($o) . "\n"; + print " perimeter = " . Shape_perimeter($o) . "\n"; + } + +# ----- Delete everything ----- + +print "\nGuess I'll clean up now\n"; + +# Note: this invokes the virtual destructor +#delete_Shape($c); +#delete_Shape($s); +$c = NULL; +$s = NULL; + +# and don't forget the $o from the for loop above. It still refers to +# the square. +$o = NULL; + +print nshapes() . " shapes remain\n"; +print "Goodbye\n"; + +?> Property changes on: trunk/Examples/php/class/runme.php ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:mergeinfo + Added: svn:eol-style + native Deleted: trunk/Examples/php/class/runme.php4 =================================================================== --- trunk/Examples/php/class/runme.php4 2008-12-06 17:18:38 UTC (rev 10966) +++ trunk/Examples/php/class/runme.php4 2008-12-06 21:40:54 UTC (rev 10967) @@ -1,64 +0,0 @@ -<?php - -# This file illustrates the low-level C++ interface -# created by SWIG. In this case, all of our C++ classes -# get converted into function calls. - -require("example.php"); - -# ----- Object creation ----- - -print "Creating some objects:\n"; -$c = new_Circle(10); -print " Created circle $c\n"; -$s = new_Square(10); -print " Created square $s\n"; - -# ----- Access a static member ----- - -print "\nA total of " . nshapes() . " shapes were created\n"; - -# ----- Member data access ----- - -# Set the location of the object. -# Note: methods in the base class Shape are used since -# x and y are defined there. - -Shape_x_set($c, 20); -Shape_y_set($c, 30); -Shape_x_set($s,-10); -Shape_y_set($s,5); - -print "\nHere is their current position:\n"; -print " Circle = (" . Shape_x_get($c) . "," . Shape_y_get($c) . ")\n"; -print " Square = (" . Shape_x_get($s) . "," . Shape_y_get($s) . ")\n"; - -# ----- Call some methods ----- - -# Notice how the Shape_area() and Shape_perimeter() functions really -# invoke the appropriate virtual method on each object. -print "\nHere are some properties of the shapes:\n"; -foreach (array($c,$s) as $o) { - print " $o\n"; - print " area = " . Shape_area($o) . "\n"; - print " perimeter = " . Shape_perimeter($o) . "\n"; - } - -# ----- Delete everything ----- - -print "\nGuess I'll clean up now\n"; - -# Note: this invokes the virtual destructor -#delete_Shape($c); -#delete_Shape($s); -$c = NULL; -$s = NULL; - -# and don't forget the $o from the for loop above. It still refers to -# the square. -$o = NULL; - -print nshapes() . " shapes remain\n"; -print "Goodbye\n"; - -?> Modified: trunk/Examples/php/constants/Makefile =================================================================== --- trunk/Examples/php/constants/Makefile 2008-12-06 17:18:38 UTC (rev 10966) +++ trunk/Examples/php/constants/Makefile 2008-12-06 21:40:54 UTC (rev 10967) @@ -9,16 +9,16 @@ all:: $(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \ SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' \ - php4 + php static:: $(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \ - SWIGOPT='$(SWIGOPT)' TARGET='myphp4' INTERFACE='$(INTERFACE)' \ - php4_static + SWIGOPT='$(SWIGOPT)' TARGET='myphp' INTERFACE='$(INTERFACE)' \ + php_static clean:: - $(MAKE) -f $(TOP)/Makefile php4_clean + $(MAKE) -f $(TOP)/Makefile php_clean rm -f $(TARGET).php check: all - $(MAKE) -f $(TOP)/Makefile php4_run + $(MAKE) -f $(TOP)/Makefile php_run Copied: trunk/Examples/php/constants/runme.php (from rev 10966, trunk/Examples/php/constants/runme.php4) =================================================================== --- trunk/Examples/php/constants/runme.php (rev 0) +++ trunk/Examples/php/constants/runme.php 2008-12-06 21:40:54 UTC (rev 10967) @@ -0,0 +1,28 @@ +<?php + +require "example.php"; + +print "ICONST = " . ICONST . " (should be 42)\n"; +print "FCONST = " . FCONST . " (should be 2.1828)\n"; +print "CCONST = " . CCONST . " (should be 'x')\n"; +print "CCONST2 = " . CCONST2 . " (this should be on a new line)\n"; +print "SCONST = " . SCONST . " (should be 'Hello World')\n"; +print "SCONST2 = " . SCONST2 . " (should be '\"Hello World\"')\n"; +print "EXPR = " . EXPR . " (should be 48.5484)\n"; +print "iconst = " . iconst . " (should be 37)\n"; +print "fconst = " . fconst . " (should be 3.14)\n"; + +if (EXTERN!="EXTERN") { + print "EXTERN = " . EXTERN . " (Arg! This shouldn't print anything)\n"; +} else { + print "EXTERN defaults to 'EXTERN', it probably isn't defined (good)\n"; +} + +if (FOO!="FOO") { + print "FOO = " . FOO . "(Arg! This shouldn't print anything)\n"; +} else { + print "FOO defaults to 'FOO', it probably isn't defined (good)\n"; +} + + +?> Property changes on: trunk/Examples/php/constants/runme.php ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:mergeinfo + Added: svn:eol-style + native Deleted: trunk/Examples/php/constants/runme.php4 =================================================================== --- trunk/Examples/php/constants/runme.php4 2008-12-06 17:18:38 UTC (rev 10966) +++ trunk/Examples/php/constants/runme.php4 2008-12-06 21:40:54 UTC (rev 10967) @@ -1,28 +0,0 @@ -<?php - -require "example.php"; - -print "ICONST = " . ICONST . " (should be 42)\n"; -print "FCONST = " . FCONST . " (should be 2.1828)\n"; -print "CCONST = " . CCONST . " (should be 'x')\n"; -print "CCONST2 = " . CCONST2 . " (this should be on a new line)\n"; -print "SCONST = " . SCONST . " (should be 'Hello World')\n"; -print "SCONST2 = " . SCONST2 . " (should be '\"Hello World\"')\n"; -print "EXPR = " . EXPR . " (should be 48.5484)\n"; -print "iconst = " . iconst . " (should be 37)\n"; -print "fconst = " . fconst . " (should be 3.14)\n"; - -if (EXTERN!="EXTERN") { - print "EXTERN = " . EXTERN . " (Arg! This shouldn't print anything)\n"; -} else { - print "EXTERN defaults to 'EXTERN', it probably isn't defined (good)\n"; -} - -if (FOO!="FOO") { - print "FOO = " . FOO . "(Arg! This shouldn't print anything)\n"; -} else { - print "FOO defaults to 'FOO', it probably isn't defined (good)\n"; -} - - -?> Modified: trunk/Examples/php/cpointer/Makefile =================================================================== --- trunk/Examples/php/cpointer/Makefile 2008-12-06 17:18:38 UTC (rev 10966) +++ trunk/Examples/php/cpointer/Makefile 2008-12-06 21:40:54 UTC (rev 10967) @@ -9,16 +9,16 @@ all:: $(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \ SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' \ - php4 + php static:: $(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \ - SWIGOPT='$(SWIGOPT)' TARGET='myphp4' INTERFACE='$(INTERFACE)' \ - php4_static + SWIGOPT='$(SWIGOPT)' TARGET='myphp' INTERFACE='$(INTERFACE)' \ + php_static clean:: - $(MAKE) -f $(TOP)/Makefile php4_clean + $(MAKE) -f $(TOP)/Makefile php_clean rm -f $(TARGET).php check: all - $(MAKE) -f $(TOP)/Makefile php4_run + $(MAKE) -f $(TOP)/Makefile php_run Copied: trunk/Examples/php/cpointer/runme.php (from rev 10966, trunk/Examples/php/cpointer/runme.php4) =================================================================== --- trunk/Examples/php/cpointer/runme.php (rev 0) +++ trunk/Examples/php/cpointer/runme.php 2008-12-06 21:40:54 UTC (rev 10967) @@ -0,0 +1,45 @@ +<?php + + require "example.php"; + + # First create some objects using the pointer library. + + print "Testing the pointer library\n"; + + $a = new_intp(); + $b = new_intp(); + $c = new_intp(); + intp_assign($a,37); + intp_assign($b,42); + + print " a = $a\n"; + print " b = $b\n"; + print " c = $c\n"; + + # Call the add() function wuth some pointers + add($a,$b,$c); + + # Now get the result + $r = intp_value($c); + + print " 38 + 42 = $r\n"; + + # Clean up the pointers + delete_intp($a); + delete_intp($b); + delete_intp($c); + + # Now try the typemap library + # This should be much easier. Now how it is no longer + # necessary to manufacture pointers. + + print "Trying the typemap library\n"; + $r = sub(37,42); + print " 37 - 42 = $r\n"; + + # Now try the version with multiple return values + # print "Testing multiple return values\n"; + # ($q,$r) = divide(42,37); + # print " 42/37 = $q remainder $r\n"; + +?> Property changes on: trunk/Examples/php/cpointer/runme.php ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:mergeinfo + Added: svn:eol-style + native Deleted: trunk/Examples/php/cpointer/runme.php4 =================================================================== --- trunk/Examples/php/cpointer/runme.php4 2008-12-06 17:18:38 UTC (rev 10966) +++ trunk/Examples/php/cpointer/runme.php4 2008-12-06 21:40:54 UTC (rev 10967) @@ -1,45 +0,0 @@ -<?php - - require "example.php"; - - # First create some objects using the pointer library. - - print "Testing the pointer library\n"; - - $a = new_intp(); - $b = new_intp(); - $c = new_intp(); - intp_assign($a,37); - intp_assign($b,42); - - print " a = $a\n"; - print " b = $b\n"; - print " c = $c\n"; - - # Call the add() function wuth some pointers - add($a,$b,$c); - - # Now get the result - $r = intp_value($c); - - print " 38 + 42 = $r\n"; - - # Clean up the pointers - delete_intp($a); - delete_intp($b); - delete_intp($c); - - # Now try the typemap library - # This should be much easier. Now how it is no longer - # necessary to manufacture pointers. - - print "Trying the typemap library\n"; - $r = sub(37,42); - print " 37 - 42 = $r\n"; - - # Now try the version with multiple return values - # print "Testing multiple return values\n"; - # ($q,$r) = divide(42,37); - # print " 42/37 = $q remainder $r\n"; - -?> Modified: trunk/Examples/php/disown/Makefile =================================================================== --- trunk/Examples/php/disown/Makefile 2008-12-06 17:18:38 UTC (rev 10966) +++ trunk/Examples/php/disown/Makefile 2008-12-06 21:40:54 UTC (rev 10967) @@ -9,16 +9,16 @@ all:: $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \ SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' \ - php4_cpp + php_cpp static:: $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \ - SWIGOPT='$(SWIGOPT)' TARGET='myphp4' INTERFACE='$(INTERFACE)' \ - php4_cpp_static + SWIGOPT='$(SWIGOPT)' TARGET='myphp' INTERFACE='$(INTERFACE)' \ + php_cpp_static clean:: - $(MAKE) -f $(TOP)/Makefile php4_clean + $(MAKE) -f $(TOP)/Makefile php_clean rm -f $(TARGET).php check: all - $(MAKE) -f $(TOP)/Makefile php4_run + $(MAKE) -f $(TOP)/Makefile php_run Copied: trunk/Examples/php/disown/runme.php (from rev 10966, trunk/Examples/php/disown/runme.php4) =================================================================== --- trunk/Examples/php/disown/runme.php (rev 0) +++ trunk/Examples/php/disown/runme.php 2008-12-06 21:40:54 UTC (rev 10967) @@ -0,0 +1,49 @@ +<?php + +# This file illustrates the low-level C++ interface +# created by SWIG. In this case, all of our C++ classes +# get converted into function calls. + +require("example.php"); + +# ----- Object creation ----- + +print "Creating some objects:\n"; +$c = new Circle(10); +print " Created circle $c\n"; +$s = new Square(10); +print " Created square $s\n"; + +# ----- Create the ShapeContainer ---- + +$container = new ShapeContainer(); + +$container->addShape($c); +$container->addShape($s); + +# ----- Access a static member ----- + +print "\nA total of " . Shape::nshapes() . " shapes were created\n"; + +# ----- Delete by the old references ----- +# This should not truely delete the shapes because they are now owned +# by the ShapeContainer. + +print "Delete the old references."; + +# Note: this invokes the virtual destructor +$c = NULL; +$s = NULL; + +print "\nA total of " . Shape::nshapes() . " shapes remain\n"; + +# ----- Delete by the container ----- +# This should truely delete the shapes + +print "Delete the container."; +$container = NULL; +print "\nA total of " . Shape::nshapes() . " shapes remain\n"; + +print "Goodbye\n"; + +?> Property changes on: trunk/Examples/php/disown/runme.php ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:mergeinfo + Added: svn:eol-style + native Deleted: trunk/Examples/php/disown/runme.php4 =================================================================== --- trunk/Examples/php/disown/runme.php4 2008-12-06 17:18:38 UTC (rev 10966) +++ trunk/Examples/php/disown/runme.php4 2008-12-06 21:40:54 UTC (rev 10967) @@ -1,49 +0,0 @@ -<?php - -# This file illustrates the low-level C++ interface -# created by SWIG. In this case, all of our C++ classes -# get converted into function calls. - -require("example.php"); - -# ----- Object creation ----- - -print "Creating some objects:\n"; -$c = new Circle(10); -print " Created circle $c\n"; -$s = new Square(10); -print " Created square $s\n"; - -# ----- Create the ShapeContainer ---- - -$container = new ShapeContainer(); - -$container->addShape($c); -$container->addShape($s); - -# ----- Access a static member ----- - -print "\nA total of " . Shape::nshapes() . " shapes were created\n"; - -# ----- Delete by the old references ----- -# This should not truely delete the shapes because they are now owned -# by the ShapeContainer. - -print "Delete the old references."; - -# Note: this invokes the virtual destructor -$c = NULL; -$s = NULL; - -print "\nA total of " . Shape::nshapes() . " shapes remain\n"; - -# ----- Delete by the container ----- -# This should truely delete the shapes - -print "Delete the container."; -$container = NULL; -print "\nA total of " . Shape::nshapes() . " shapes remain\n"; - -print "Goodbye\n"; - -?> Modified: trunk/Examples/php/enum/Makefile =================================================================== --- trunk/Examples/php/enum/Makefile 2008-12-06 17:18:38 UTC (rev 10966) +++ trunk/Examples/php/enum/Makefile 2008-12-06 21:40:54 UTC (rev 10967) @@ -9,16 +9,16 @@ all:: $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \ SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' \ - php4_cpp + php_cpp static:: $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \ - SWIGOPT='$(SWIGOPT)' TARGET='myphp4' INTERFACE='$(INTERFACE)' \ - php4_cpp_static + SWIGOPT='$(SWIGOPT)' TARGET='myphp' INTERFACE='$(INTERFACE)' \ + php_cpp_static clean:: - $(MAKE) -f $(TOP)/Makefile php4_clean + $(MAKE) -f $(TOP)/Makefile php_clean rm -f $(TARGET).php check: all - $(MAKE) -f $(TOP)/Makefile php4_run + $(MAKE) -f $(TOP)/Makefile php_run Copied: trunk/Examples/php/enum/runme.php (from rev 10966, trunk/Examples/php/enum/runme.php4) =================================================================== --- trunk/Examples/php/enum/runme.php (rev 0) +++ trunk/Examples/php/enum/runme.php 2008-12-06 21:40:54 UTC (rev 10967) @@ -0,0 +1,32 @@ +<?php + +require "example.php"; + +# ----- Object creation ----- + +# Print out the value of some enums +print "*** color ***"; +print " RED =" . RED; +print " BLUE =" . BLUE; +print " GREEN =" . GREEN; + +print "\n*** Foo::speed ***"; +print " Foo_IMPULSE =" . Foo_IMPULSE; +print " Foo_WARP =" . Foo_WARP; +print " Foo_LUDICROUS =" . Foo_LUDICROUS; + +print "\nTesting use of enums with functions\n"; + +enum_test(RED, Foo_IMPULSE); +enum_test(BLUE, Foo_WARP); +enum_test(GREEN, Foo_LUDICROUS); +enum_test(1234,5678); + +print "\nTesting use of enum with class method\n"; +$f = new_Foo(); + +Foo_enum_test($f,Foo_IMPULSE); +Foo_enum_test($f,Foo_WARP); +Foo_enum_test($f,Foo_LUDICROUS); + +?> Property changes on: trunk/Examples/php/enum/runme.php ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:mergeinfo + Added: svn:eol-style + native Deleted: trunk/Examples/php/enum/runme.php4 =================================================================== --- trunk/Examples/php/enum/runme.php4 2008-12-06 17:18:38 UTC (rev 10966) +++ trunk/Examples/php/enum/runme.php4 2008-12-06 21:40:54 UTC (rev 10967) @@ -1,32 +0,0 @@ -<?php - -require "example.php"; - -# ----- Object creation ----- - -# Print out the value of some enums -print "*** color ***"; -print " RED =" . RED; -print " BLUE =" . BLUE; -print " GREEN =" . GREEN; - -print "\n*** Foo::speed ***"; -print " Foo_IMPULSE =" . Foo_IMPULSE; -print " Foo_WARP =" . Foo_WARP; -print " Foo_LUDICROUS =" . Foo_LUDICROUS; - -print "\nTesting use of enums with functions\n"; - -enum_test(RED, Foo_IMPULSE); -enum_test(BLUE, Foo_WARP); -enum_test(GREEN, Foo_LUDICROUS); -enum_test(1234,5678); - -print "\nTesting use of enum with class method\n"; -$f = new_Foo(); - -Foo_enum_test($f,Foo_IMPULSE); -Foo_enum_test($f,Foo_WARP); -Foo_enum_test($f,Foo_LUDICROUS); - -?> Modified: trunk/Examples/php/funcptr/Makefile =================================================================== --- trunk/Examples/php/funcptr/Makefile 2008-12-06 17:18:38 UTC (rev 10966) +++ trunk/Examples/php/funcptr/Makefile 2008-12-06 21:40:54 UTC (rev 10967) @@ -9,16 +9,16 @@ all:: $(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \ SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' \ - php4 + php static:: $(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \ - SWIGOPT='$(SWIGOPT)' TARGET='myphp4' INTERFACE='$(INTERFACE)' \ - php4_static + SWIGOPT='$(SWIGOPT)' TARGET='myphp' INTERFACE='$(INTERFACE)' \ + php_static clean:: - $(MAKE) -f $(TOP)/Makefile php4_clean + $(MAKE) -f $(TOP)/Makefile php_clean rm -f $(TARGET).php check: all - $(MAKE) -f $(TOP)/Makefile php4_run + $(MAKE) -f $(TOP)/Makefile php_run Copied: trunk/Examples/php/funcptr/runme.php (from rev 10966, trunk/Examples/php/funcptr/runme.php4) =================================================================== --- trunk/Examples/php/funcptr/runme.php (rev 0) +++ trunk/Examples/php/funcptr/runme.php 2008-12-06 21:40:54 UTC (rev 10967) @@ -0,0 +1,24 @@ +<?php + +require "example.php"; + +$a = 37; +$b = 42; + +# Now call our C function with a bunch of callbacks + +print "Trying some C callback functions\n"; +print " a = $a\n"; +print " b = $b\n"; +print " ADD(a,b) = ". do_op($a,$b,ADD)."\n"; +print " SUB(a,b) = ". do_op($a,$b,SUB)."\n"; +print " MUL(a,b) = ". do_op($a,$b,MUL)."\n"; + +print "Here is what the C callback function objects look like in php\n"; +print "Using swig style string pointers as we need them registered as constants\n"; +print " ADD = " . ADD . "\n"; +print " SUB = " . SUB . "\n"; +print " MUL = " . MUL . "\n"; + +?> + Property changes on: trunk/Examples/php/funcptr/runme.php ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:mergeinfo + Added: svn:eol-style + native Deleted: trunk/Examples/php/funcptr/runme.php4 =================================================================== --- trunk/Examples/php/funcptr/runme.php4 2008-12-06 17:18:38 UTC (rev 10966) +++ trunk/Examples/php/funcptr/runme.php4 2008-12-06 21:40:54 UTC (rev 10967) @@ -1,24 +0,0 @@ -<?php - -require "example.php"; - -$a = 37; -$b = 42; - -# Now call our C function with a bunch of callbacks - -print "Trying some C callback functions\n"; -print " a = $a\n"; -print " b = $b\n"; -print " ADD(a,b) = ". do_op($a,$b,ADD)."\n"; -print " SUB(a,b) = ". do_op($a,$b,SUB)."\n"; -print " MUL(a,b) = ". do_op($a,$b,MUL)."\n"; - -print "Here is what the C callback function objects look like in php\n"; -print "Using swig style string pointers as we need them registered as constants\n"; -print " ADD = " . ADD . "\n"; -print " SUB = " . SUB . "\n"; -print " MUL = " . MUL . "\n"; - -?> - Modified: trunk/Examples/php/overloading/Makefile =================================================================== --- trunk/Examples/php/overloading/Makefile 2008-12-06 17:18:38 UTC (rev 10966) +++ trunk/Examples/php/overloading/Makefile 2008-12-06 21:40:54 UTC (rev 10967) @@ -9,16 +9,16 @@ all:: $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \ SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' \ - php4_cpp + php_cpp static:: $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \ - SWIGOPT='$(SWIGOPT)' TARGET='myphp4' INTERFACE='$(INTERFACE)' \ - php4_cpp_static + SWIGOPT='$(SWIGOPT)' TARGET='myphp' INTERFACE='$(INTERFACE)' \ + php_cpp_static clean:: - $(MAKE) -f $(TOP)/Makefile php4_clean + $(MAKE) -f $(TOP)/Makefile php_clean rm -f $(TARGET).php check: all - $(MAKE) -f $(TOP)/Makefile php4_run + $(MAKE) -f $(TOP)/Makefile php_run Copied: trunk/Examples/php/overloading/runme.php (from rev 10966, trunk/Examples/php/overloading/runme.php4) =================================================================== --- trunk/Examples/php/overloading/runme.php (rev 0) +++ trunk/Examples/php/overloading/runme.php 2008-12-06 21:40:54 UTC (rev 10967) @@ -0,0 +1,59 @@ +<?php + +# This file illustrates the low-level C++ interface +# created by SWIG. In this case, all of our C++ classes +# get converted into function calls. + +include("example.php"); + +# ----- Object creation ----- + +print "Creating some objects:\n"; +$c = new Circle(10); +print " Created circle $c\n"; +$s = new Square(10); +print " Created square $s\n"; + +# ----- Access a static member ----- + +print "\nA total of " . Shape::nshapes() . " shapes were created\n"; + +# ----- Member data access ----- + +# Set the location of the object. +# Note: methods in the base class Shape are used since +# x and y are defined there. + +$c->x = 20; +$c->y = 30; +$s->x = -10; +$s->y = 5; + +print "\nHere is their current position:\n"; +print " Circle = (" . $c->x . "," . $c->y . ")\n"; +print " Square = (" . $s->x . "," . $s->y . ")\n"; + +# ----- Call some methods ----- + +print "\nHere are some properties of the shapes:\n"; +foreach (array(1, 2.1, "quick brown fox", $c, $s) as $o) { + print " ".get_class($o)." $o\n"; + print " overloaded = " . overloaded($o) . "\n"; + } + +# Need to unset($o) or else we hang on to a reference to the Square object. +unset($o); + +# ----- Delete everything ----- + +print "\nGuess I'll clean up now\n"; + +# Note: this invokes the virtual destructor +unset($c); +$s = 42; + +print Shape::nshapes() . " shapes remain\n"; + +print "Goodbye\n"; + +?> Property changes on: trunk/Examples/php/overloading/runme.php ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:mergeinfo + Added: svn:eol-style + native Deleted: trunk/Examples/php/overloading/runme.php4 =================================================================== --- trunk/Examples/php/overloading/runme.php4 2008-12-06 17:18:38 UTC (rev 10966) +++ trunk/Examples/php/overloading/runme.php4 2008-12-06 21:40:54 UTC (rev 10967) @@ -1,59 +0,0 @@ -<?php - -# This file illustrates the low-level C++ interface -# created by SWIG. In this case, all of our C++ classes -# get converted into function calls. - -include("example.php"); - -# ----- Object creation ----- - -print "Creating some objects:\n"; -$c = new Circle(10); -print " Created circle $c\n"; -$s = new Square(10); -print " Created square $s\n"; - -# ----- Access a static member ----- - -print "\nA total of " . Shape::nshapes() . " shapes were created\n"; - -# ----- Member data access ----- - -# Set the location of the object. -# Note: methods in the base class Shape are used since -# x and y are defined there. - -$c->x = 20; -$c->y = 30; -$s->x = -10; -$s->y = 5; - -print "\nHere is their current position:\n"; -print " Circle = (" . $c->x . "," . $c->y . ")\n"; -print " Square = (" . $s->x . "," . $s->y . ")\n"; - -# ----- Call some methods ----- - -print "\nHere are some properties of the shapes:\n"; -foreach (array(1, 2.1, "quick brown fox", $c, $s) as $o) { - print " ".get_class($o)." $o\n"; - print " overloaded = " . overloaded($o) . "\n"; - } - -# Need to unset($o) or else we hang on to a reference to the Square object. -unset($o); - -# ----- Delete everything ----- - -print "\nGuess I'll clean up now\n"; - -# Note: this invokes the virtual destructor -unset($c); -$s = 42; - -print Shape::nshapes() . " shapes remain\n"; - -print "Goodbye\n"; - -?> Modified: trunk/Examples/php/pointer/Makefile =================================================================== --- trunk/Examples/php/pointer/Makefile 2008-12-06 17:18:38 UTC (rev 10966) +++ trunk/Examples/php/pointer/Makefile 2008-12-06 21:40:54 UTC (rev 10967) @@ -9,16 +9,16 @@ all:: $(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \ SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' \ - php4 + php static:: $(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \ - SWIGOPT='$(SWIGOPT)' TARGET='myphp4' INTERFACE='$(INTERFACE)' \ - php4_static + SWIGOPT='$(SWIGOPT)' TARGET='myphp' INTERFACE='$(INTERFACE)' \ + php_static clean:: - $(MAKE) -f $(TOP)/Makefile php4_clean + $(MAKE) -f $(TOP)/Makefile php_clean rm -f $(TARGET).php check: all - $(MAKE) -f $(TOP)/Makefile php4_run + $(MAKE) -f $(TOP)/Makefile php_run Copied: trunk/Examples/php/pointer/runme.php (from rev 10966, trunk/Examples/php/pointer/runme.php4) =================================================================== --- trunk/Examples/php/pointer/runme.php (rev 0) +++ trunk/Examples/php/pointer/runme.php 2008-12-06 21:40:54 UTC (rev 10967) @@ -0,0 +1,35 @@ +<?php + + require "example.php"; + + # First create some objects using the pointer library. + + print "Testing the pointer library\n"; + + $a = 37.145; + $b = 42.555; + $c = ""; // $c must be defined and not null. + + print " a = $a\n"; + print " b = $b\n"; + print " c = $c\n"; + + # Call the add() function wuth some pointers + add(&$a,&$b,&$c); + + print " $a + $b = $c\n"; + + # Now try the typemap library + # This should be much easier. Now how it is no longer + # necessary to manufacture pointers. + + print "Trying the typemap library\n"; + $r = sub(37,42); + print " 37 - 42 = $r\n"; + + # Now try the version with multiple return values + # print "Testing multiple return values\n"; + # ($q,$r) = divide(42,37); + # print " 42/37 = $q remainder $r\n"; + +?> Property changes on: trunk/Examples/php/pointer/runme.php ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:mergeinfo + Added: svn:eol-style + native Deleted: trunk/Examples/php/pointer/runme.php4 =================================================================== --- trunk/Examples/php/pointer/runme.php4 2008-12-06 17:18:38 UTC (rev 10966) +++ trunk/Examples/php/pointer/runme.php4 2008-12-06 21:40:54 UTC (rev 10967) @@ -1,35 +0,0 @@ -<?php - - require "example.php"; - - # First create some objects using the pointer library. - - print "Testing the pointer library\n"; - - $a = 37.145; - $b = 42.555; - $c = ""; // $c must be defined and not null. - - print " a = $a\n"; - print " b = $b\n"; - print " c = $c\n"; - - # Call the add() function wuth some pointers - add(&$a,&$b,&$c); - - print " $a + $b = $c\n"; - - # Now try the typemap library - # This should be much easier. Now how it is no longer - # necessary to manufacture pointers. - - print "Trying the typemap library\n"; - $r = sub(37,42); - print " 37 - 42 = $r\n"; - - # Now try the version with multiple return values - # print "Testing multiple return values\n"; - # ($q,$r) = divide(42,37); - # print " 42/37 = $q remainder $r\n"; - -?> Modified: trunk/Examples/php/pragmas/Makefile =================================================================== --- trunk/Examples/php/pragmas/Makefile 2008-12-06 17:18:38 UTC (rev 10966) +++ trunk/Examples/php/pragmas/Makefile 2008-12-06 21:40:54 UTC (rev 10967) @@ -9,16 +9,16 @@ all:: $(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \ SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' \ - php4 + php static:: $(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \ - SWIGOPT='$(SWIGOPT)' TARGET='myphp4' INTERFACE='$(INTERFACE)' \ - php4_static + SWIGOPT='$(SWIGOPT)' TARGET='myphp' INTERFACE='$(INTERFACE)' \ + php_static clean:: - $(MAKE) -f $(TOP)/Makefile php4_clean + $(MAKE) -f $(TOP)/Makefile php_clean rm -f $(TARGET).php check: all - $(MAKE) -f $(TOP)/Makefile php4_run + $(MAKE) -f $(TOP)/Makefile php_run Copied: trunk/Examples/php/pragmas/runme.php (from rev 10966, trunk/Examples/php/pragmas/runme.php4) =================================================================== --- trunk/Examples/php/pragmas/runme.php (rev 0) +++ trunk/Examples/php/pragmas/runme.php 2008-12-06 21:40:54 UTC (rev 10967) @@ -0,0 +1,5 @@ +<?php + +require "example.php"; + +?> Property changes on: trunk/Examples/php/pragmas/runme.php ___________________________________________________________________ Added: svn:executable + * Added: svn:keywords + Author Date Id Revision Added: svn:mergeinfo + Added: svn:eol-style + native Deleted: trunk/Examples/php/pragmas/runme.php4 =================================================================== --- trunk/Examples/php/pragmas/runme.php4 2008-12-06 17:18:38 UTC (rev 10966) +++ trunk/Examples/php/pragmas/runme.php4 2008-12-06 21:40:54 UTC (rev 10967) @@ -1,5 +0,0 @@ -<?php - -require "example.php"; - -?> Modified: trunk/Examples/php/proxy/Makefile =================================================================== --- trunk/Examples/php/proxy/Makefile 2008-12-06 17:18:38 UTC (rev 10966) +++ trunk/Examples/php/proxy/Makefile 2008-12-06 21:40:54 UTC (rev 10967) @@ -9,16 +9,16 @@ all:: $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \ SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' \ - php4_cpp + php_cpp static:: $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \ - SWIGOPT='$(SWIGOPT)' TARGET='myphp4' INTERFACE='$(INTERFACE)' \ - php4_cpp_static + SWIGOPT='$(SWIGOPT)' TARGET='myphp' INTERFACE='$(INTERFACE)' \ + php_cpp_static clean:: - $(MAKE) -f $(TOP)/Makefile php4_clean + $(MAKE) -f $(TOP)/Makefile php_clean rm -f $(TARGET).php check: all - $(MAKE) -f $(TOP)/Makefile php4_run + $(MAKE) -f $(TOP)/Makefile php_run Copied: trunk/Examples/php/proxy/runme.php (from rev 10966, trunk/Examples/php/proxy/runme.php4) =================================================================== --- trunk/Examples/php/proxy/runme.php (rev 0) +++ trunk/Examples/php/proxy/runme.php 2008-12-06 21:40:54 UTC (rev 10967) @@ -0,0 +1,68 @@ +<?php + +# This file illustrates the low-level C++ interface +# created by SWIG. In this case, all of our C++ classes +# get converted into function calls. + +include("example.php"); + +# ----- Object creation ----- + +print "Creating some objects:\n"; +$c = CircleFactory(10); +print " Created circle $c with area ". $c->area() ."\n"; +$s = new Square(10); +print " Created square $s\n"; + +# ----- Access a static member ----- + +print "\nA total of " . Shape::nshapes() . " shapes were created\n"; + +# ----- Member data access ----- + +# Set the location of the object. +# Note: methods in the base class Shape are used since +# x and y are defined there. + +$c->x = 20; +$c->y = 30; +$s->x = -10; +$s->y = 5; + +print "\nHere is their current position:\n"; +print " Circle = (" . $c->x . "," . $c->y . ")\n"; +print " Square = (" . $s->x . "," . $s->y . ")\n"; + +# ----- Call some methods ----- + +print "\nHere are some properties of the shapes:\n"; +foreach (array($c,$s) as $o) { + print " ".get_class($o)." $o\n"; + print " x = " . $o->x . "\n"; + print " y = " . $o->y . "\n"; + print " area = " . $o->area() . "\n"; + print " perimeter = " . $o->perimeter() . "\n"; + } + +# Need to unset($o) or else we hang on to a reference to the Square object. +unset($o); + +# ----- Delete everything ----- + +print "\nGuess I'll clean up now\n"; + +# Note: this invokes the virtual destructor +unset($c); +$s = 42; + +print Shape::nshapes() . " shapes remain\n"; + +print "Manually setting nshapes\n"; + +Shape::nshapes(42); + +print Shape::get_nshapes() ." == 42\n"; + +print "Goodbye\n"; + +?> Property changes on: trunk/Examples/php/proxy/runme.php ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:mergeinfo + Added: svn:eol-style + native Deleted: trunk/Examples/php/proxy/runme.php4 =================================================================== --- trunk/Examples/php/proxy/runme.php4 2008-12-06 17:18:38 UTC (rev 10966) +++ trunk/Examples/php/proxy/runme.php4 2008-12-06 21:40:54 UTC (rev 10967) @@ -1,68 +0,0 @@ -<?php - -# This file illustrates the low-level C++ interface -# created by SWIG. In this case, all of our C++ classes -# get converted into function calls. - -include("example.php"); - -# ----- Object creation ----- - -print "Creating some objects:\n"; -$c = CircleFactory(10); -print " Created circle $c with area ". $c->area() ."\n"; -$s = new Square(10); -print " Created square $s\n"; - -# ----- Access a static member ----- - -print "\nA total of " . Shape::nshapes() . " shapes were created\n"; - -# ----- Member data access ----- - -# Set the location of the object. -# Note: methods in the base class Shape are used since -# x and y are defined there. - -$c->x = 20; -$c->y = 30; -$s->x = -10; -$s->y = 5; - -print "\nHere is their current position:\n"; -print " Circle = (" . $c->x . "," . $c->y . ")\n"; -print " Square = (" . $s->x . "," . $s->y . ")\n"; - -# ----- Call some methods ----- - -print "\nHere are some properties of the shapes:\n"; -foreach (array($c,$s) as $o) { - print " ".get_class($o)." $o\n"; - print " x = " . $o->x . "\n"; - print " y = " . $o->y . "\n"; - print " area = " . $o->area() . "\n"; - print " perimeter = " . $o->perimeter() . "\n"; - } - -# Need to unset($o) or else we hang on to a reference to the Square object. -unset($o); - -# ----- Delete everything ----- - -print "\nGuess I'll clean up now\n"; - -# Note: this invokes the virtual destructor -unset($c); -$s = 42; - -print Shape::nshapes() . " shapes remain\n"; - -print "Manually setting nshapes\n"; - -Shape::nshapes(42); - -print Shape::get_nshapes() ." == 42\n"; - -print "Goodbye\n"; - -?> Modified: trunk/Examples/php/reference/Makefile =================================================================== --- trunk/Examples/php/reference/Makefile 2008-12-06 17:18:38 UTC (rev 10966) +++ trunk/Examples/php/reference/Makefile 2008-12-06 21:40:54 UTC (rev 10967) @@ -9,16 +9,16 @@ all:: $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \ SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' \ - php4_cpp + php_cpp static:: $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \ - SWIGOPT='$(SWIGOPT)' TARGET='myphp4' INTERFACE='$(INTERFACE)' \ - php4_cpp_static + SWIGOPT='$(SWIGOPT)' TARGET='myphp' INTERFACE='$(INTERFACE)' \ + php_cpp_static clean:: - $(MAKE) -f $(TOP)/Makefile php4_clean + $(MAKE) -f $(TOP)/Makefile php_clean rm -f $(TARGET).php check: all - $(MAKE) -f $(TOP)/Makefile php4_run + $(MAKE) -f $(TOP)/Makefile php_run Copied: trunk/Examples/php/reference/runme.php (from rev 10966, trunk/Examples/php/reference/runme.php4) =================================================================== --- trunk/Examples/php/reference/runme.php (rev 0) +++ trunk/Examples/php/reference/runme.php 2008-12-06 21:40:54 UTC (rev 10967) @@ -0,0 +1,78 @@ +<?php + +# This file illustrates the manipulation of C++ references in Php. +# This uses the low-level interface. Proxy classes work differently. + +require "example.php"; + +# ----- Object creation ----- + +print "Creating some objects:\n"; +$a = new_Vector(3,4,5); +$b = new_Vector(10,11,12); + +print " Created a: $a " . Vector_print($a) . "\n"; +print " Created b: $b " . Vector_print($b) . "\n"; + +# ----- Call an overloaded operator ----- + +# This calls the wrapper we placed around +# +# operator+(const Vector &a, const Vector &) +# +# It returns a new allocated object. + +print "Adding a+b\n"; +$c = addv($a,$b); +print " a+b =". Vector_print($c)."\n"; + +# Note: Unless we free the result, a memory leak will occur +$c = None; + +# ----- Create a vector array ----- + +# Note: Using the high-level interface here +print "Creating an array of vectors\n"; +$va = new_VectorArray(10); + +print " va: $va size=".VectorArray_size($va)."\n"; + +# ----- Set some values in the array ----- + +# These operators copy the value of $a and $b to the vector array +VectorArray_set($va,0,$a); +VectorArray_set($va,1,$b); + +VectorArray_get($va,0); +# This will work, but it will cause a memory leak! + +VectorArray_set($va,2,addv($a,$b)); + +# The non-leaky way to do it + +$c = addv($a,$b); +VectorArray_set($va,3,$c); +$c = None; + +# Get some values from the array + +print "Getting some array values\n"; +for ($i = 0; $i < 5; $i++) { +print "do $i\n"; + print " va($i) = ". Vector_print(VectorArray_get($va,$i)). "\n"; +} + +# Watch under resource meter to check on this +#print "Making sure we don't leak memory.\n"; +#for ($i = 0; $i < 1000000; $i++) { +# $c = VectorArray_get($va,$i % 10); +#} + +# ----- Clean up ----- +print "Cleaning up\n"; +# wants fixing FIXME +$va = None; +$a = None; +$b = None; + +?> Property changes on: trunk/Examples/php/reference/runme.php ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:mergeinfo + Added: svn:eol-style + native Deleted: trunk/Examples/php/reference/runme.php4 =================================================================== --- trunk/Examples/php/reference/runme.php4 2008-12-06 17:18:38 UTC (rev 10966) +++ trunk/Examples/php/reference/runme.php4 2008-12-06 21:40:54 UTC (rev 10967) @@ -1,78 +0,0 @@ -<?php - -# This file illustrates the manipulation of C++ references in Php. -# This uses the low-level interface. Proxy classes work differently. - -require "example.php"; - -# ----- Object creation ----- - -print "Creating some objects:\n"; -$a = new_Vector(3,4,5); -$b = new_Vector(10,11,12); - -print " Created a: $a " . Vector_print($a) . "\n"; -print " Created b: $b " . Vector_print($b) . "\n"; - -# ----- Call an overloaded operator ----- - -# This calls the wrapper we placed around -# -# operator+(const Vector &a, const Vector &) -# -# It returns a new allocated object. - -print "Adding a+b\n"; -$c = addv($a,$b); -print " a+b =". Vector_print($c)."\n"; - -# Note: Unless we free the result, a memory leak will occur -$c = None; - -# ----- Create a vector array ----- - -# Note: Using the high-level interface here -print "Creating an array of vectors\n"; -$va = new_VectorArray(10); - -print " va: $va size=".VectorArray_size($va)."\n"; - -# ----- Set some values in the array ----- - -# These operators copy the value of $a and $b to the vector array -VectorArray_set($va,0,$a); -VectorArray_set($va,1,$b); - -VectorArray_get($va,0); -# This will work, but it will cause a memory leak! - -VectorArray_set($va,2,addv($a,$b)); - -# The non-leaky way to do it - -$c = addv($a,$b); -VectorArray_set($va,3,$c); -$c = None; - -# Get some values from the array - -print "Getting some array values\n"; -for ($i = 0; $i < 5; $i++) { -print "do $i\n"; - print " va($i) = ". Vector_print(VectorArray_get($va,$i)). "\n"; -} - -# Watch under resource meter to check on this -#print "Making sure we don't leak memory.\n"; -#for ($i = 0; $i < 1000000; $i++) { -# $c = VectorArray_get($va,$i % 10); -#} - -# ----- Clean up ----- -print "Cleaning up\n"; -# wants fixing FIXME -$va = None; -$a = None; -$b = None; - -?> Modified: trunk/Examples/php/simple/Makefile =================================================================== --- trunk/Examples/php/simple/Makefile 2008-12-06 17:18:38 UTC (rev 10966) +++ trunk/Examples/php/simple/Makefile 2008-12-06 21:40:54 UTC (rev 10967) @@ -9,16 +9,16 @@ all:: $(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \ SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' \ - php4 + php static:: $(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \ - SWIGOPT='$(SWIGOPT)' TARGET='myphp4' INTERFACE='$(INTERFACE)' \ - php4_static + SWIGOPT='$(SWIGOPT)' TARGET='myphp' INTERFACE='$(INTERFACE)' \ + php_static clean:: - $(MAKE) -f $(TOP)/Makefile php4_clean + $(MAKE) -f $(TOP)/Makefile php_clean rm -f $(TARGET).php check: all - $(MAKE) -f $(TOP)/Makefile php4_run + $(MAKE) -f $(TOP)/Makefile php_run Copied: trunk/Examples/php/simple/runme.php (from rev 10966, trunk/Examples/php/simple/runme.php4) =================================================================== --- trunk/Examples/php/simple/runme.php (rev 0) +++ trunk/Examples/php/simple/runme.php 2008-12-06 21:40:54 UTC (rev 10967) @@ -0,0 +1,25 @@ +<?php + +require "example.php"; + +# Call our gcd() function + +$x = "42 aaa"; +$y = 105; +$g = gcd($x,$y); +print "The gcd of $x and $y is $g\n"; + +# Manipulate the Foo global variable + +# Output its current value +print "Foo = " . Foo_get() . "\n"; + +# Change its value +Foo_set(3.1415926); + +# See if the change took effect ( this isn't a good example for php, see +# manual for why. ) +print "Foo = " . Foo_get() . "\n"; +print_Foo(); + +?> Property changes on: trunk/Examples/php/simple/runme.php ___________________________________________________________________ Added: svn:executable + * Added: svn:keywords + Author Date Id Revision Added: svn:mergeinfo + Added: svn:eol-style + native Deleted: trunk/Examples/php/simple/runme.php4 =================================================================== --- trunk/Examples/php/simple/runme.php4 2008-12-06 17:18:38 UTC (rev 10966) +++ trunk/Examples/php/simple/runme.php4 2008-12-06 21:40:54 UTC (rev 10967) @@ -1,25 +0,0 @@ -<?php - -require "example.php"; - -# Call our gcd() function - -$x = "42 aaa"; -$y = 105; -$g = gcd($x,$y); -print "The gcd of $x and $y is $g\n"; - -# Manipulate the Foo global variable - -# Output its current value -print "Foo = " . Foo_get() . "\n"; - -# Change its value -Foo_set(3.1415926); - -# See if the change took effect ( this isn't a good example for php, see -# manual for why. ) -print "Foo = " . Foo_get() . "\n"; -print_Foo(); - -?> Modified: trunk/Examples/php/sync/Makefile =================================================================== --- trunk/Examples/php/sync/Makefile 2008-12-06 17:18:38 UTC (rev 10966) +++ trunk/Examples/php/sync/Makefile 2008-12-06 21:40:54 UTC (rev 10967) @@ -9,16 +9,16 @@ all:: $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \ SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' \ - php4_cpp + php_cpp static:: $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \ - SWIGOPT='$(SWIGOPT)' TARGET='myphp4' INTERFACE='$(INTERFACE)' \ - php4_cpp_static + SWIGOPT='$(SWIGOPT)' TARGET='myphp' INTERFACE='$(INTERFACE)' \ + php_cpp_static clean:: - $(MAKE) -f $(TOP)/Makefile php4_clean + $(MAKE) -f $(TOP)/Makefile php_clean rm -f $(TARGET).php check: all - $(MAKE) -f $(TOP)/Makefile php4_run + $(MAKE) -f $(TOP)/Makefile php_run Copied: trunk/Examples/php/sync/runme.php (from rev 10966, trunk/Examples/php/sync/runme.php4) =================================================================== --- trunk/Examples/php/sync/runme.php (rev 0) +++ trunk/Examples/php/sync/runme.php 2008-12-06 21:40:54 UTC (rev 10967) @@ -0,0 +1,15 @@ +<? + +// Load module and PHP classes. +include("example.php"); + +echo "Got new object\n"; +echo "Got string $s and value $x \n"; + +$s = new Sync(); +echo "Got new object\n"; + +$s->printer(); + +?> + Property changes on: trunk/Examples/php/sync/runme.php ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:mergeinfo + Added: svn:eol-style + native Deleted: trunk/Examples/php/sync/runme.php4 =================================================================== --- trunk/Examples/php/sync/runme.php4 2008-12-06 17:18:38 UTC (rev 10966) +++ trunk/Examples/php/sync/runme.php4 2008-12-06 21:40:54 UTC (rev 10967) @@ -1,15 +0,0 @@ -<? - -// Load module and PHP classes. -include("example.php"); - -echo "Got new object\n"; -echo "Got string $s and value $x \n"; - -$s = new Sync(); -echo "Got new object\n"; - -$s->printer(); - -?> - Modified: trunk/Examples/php/value/Makefile =================================================================== --- trunk/Examples/php/value/Makefile 2008-12-06 17:18:38 UTC (rev 10966) +++ trunk/Examples/php/value/Makefile 2008-12-06 21:40:54 UTC (rev 10967) @@ -9,16 +9,16 @@ all:: $(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \ SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' \ - php4 + php static:: $(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \ - SWIGOPT='$(SWIGOPT)' TARGET='myphp4' INTERFACE='$(INTERFACE)' \ - php4_static + SWIGOPT='$(SWIGOPT)' TARGET='myphp' INTERFACE='$(INTERFACE)' \ + php_static clean:: - $(MAKE) -f $(TOP)/Makefile php4_clean + $(MAKE) -f $(TOP)/Makefile php_clean rm -f $(TARGET).php check: all - $(MAKE) -f $(TOP)/Makefile php4_run + $(MAKE) -f $(TOP)/Makefile php_run Copied: trunk/Examples/php/value/runme.php (from rev 10966, trunk/Examples/php/value/runme.php4) =================================================================== --- trunk/Examples/php/value/runme.php (rev 0) +++ trunk/Examples/php/value/runme.php 2008-12-06 21:40:54 UTC (rev 10967) @@ -0,0 +1,43 @@ +<?php + + require "example.php"; + + + $v = new_vector(); + vector_x_set($v,1.0); + vector_y_set($v,2.0); + vector_z_set($v,3.0); + + $w = new_vector(); + vector_x_set($w,10.0); + vector_y_set($w,11.0); + vector_z_set($w,12.0); + + echo "I just created the following vector\n"; + vector_print($v); + vector_print($w); + + echo "\nNow I'm going to compute the dot product\n"; + + $d = dot_product($v, $w); + + echo "dot product = $d (should be 68)\n"; + + echo "\nNow I'm going to add the vectors together\n"; + + $r = new_vector(); + vector_add($v, $w, $r); + + vector_print($r); + + echo "The value should be (11,13,15)\n"; + + echo "\nNow I'm going to clean up the return result\n"; + +# free($r); + + echo "Good\n"; + +?> + + Property changes on: trunk/Examples/php/value/runme.php ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:mergeinfo + Added: svn:eol-style + native Deleted: trunk/Examples/php/value/runme.php4 =================================================================== --- trunk/Examples/php/value/runme.php4 2008-12-06 17:18:38 UTC (rev 10966) +++ trunk/Examples/php/value/runme.php4 2008-12-06 21:40:54 UTC (rev 10967) @@ -1,43 +0,0 @@ -<?php - - require "example.php"; - - - $v = new_vector(); - vector_x_set($v,1.0); - vector_y_set($v,2.0); - vector_z_set($v,3.0); - - $w = new_vector(); - vector_x_set($w,10.0); - vector_y_set($w,11.0); - vector_z_set($w,12.0); - - echo "I just created the following vector\n"; - vector_print($v); - vector_print($w); - - echo "\nNow I'm going to compute the dot product\n"; - - $d = dot_product($v, $w); - - echo "dot product = $d (should be 68)\n"; - - echo "\nNow I'm going to add the vectors together\n"; - - $r = new_vector(); - vector_add($v, $w, $r); - - vector_print($r); - - echo "The value should be (11,13,15)\n"; - - echo "\nNow I'm going to clean up the return result\n"; - -# free($r); - - echo "Good\n"; - -?> - - Modified: trunk/Examples/php/variables/Makefile =================================================================== --- trunk/Examples/php/variables/Makefile 2008-12-06 17:18:38 UTC (rev 10966) +++ trunk/Examples/php/variables/Makefile 2008-12-06 21:40:54 UTC (rev 10967) @@ -9,16 +9,16 @@ all:: $(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \ SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' \ - php4 + php static:: $(MAKE) -f $(TOP)/Makefile SRCS='$(SRCS)' SWIG='$(SWIG)' \ - SWIGOPT='$(SWIGOPT)' T... [truncated message content] |
From: <wsf...@us...> - 2008-12-06 23:15:24
|
Revision: 10969 http://swig.svn.sourceforge.net/swig/?rev=10969&view=rev Author: wsfulton Date: 2008-12-06 23:15:20 +0000 (Sat, 06 Dec 2008) Log Message: ----------- remove last vestiges of php4 and encourage use of -php rather than -php5 Modified Paths: -------------- trunk/CHANGES.current trunk/Doc/Manual/Extending.html trunk/Doc/Manual/Php.html trunk/Doc/Manual/Preprocessor.html trunk/Doc/Manual/SWIG.html trunk/Doc/Manual/Warnings.html trunk/Examples/Makefile.in trunk/Examples/php/pragmas/example.i trunk/Lib/allkw.swg trunk/Lib/php/phprun.swg trunk/Lib/php/typemaps.i trunk/Source/Include/swigwarn.h trunk/Source/Modules/php.cxx trunk/Source/Modules/swigmain.cxx Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2008-12-06 21:55:15 UTC (rev 10968) +++ trunk/CHANGES.current 2008-12-06 23:15:20 UTC (rev 10969) @@ -1,6 +1,14 @@ Version 1.3.37 (in progress) ============================ +2008-12-02: wsfulton + [PHP] Deprecate %pragma(php4). Please use %pragma(php) instead. + The following two warnings have been renamed: + WARN_PHP4_MULTIPLE_INHERITANCE -> WARN_PHP_MULTIPLE_INHERITANCE + WARN_PHP4_UNKNOWN_PRAGMA -> WARN_PHP_UNKNOWN_PRAGMA + + *** POTENTIAL INCOMPATIBILITY *** + 2008-12-04: bhy [Python] Applied patch SF#2158938: all the SWIG symbol names started with Py are changed, since they are inappropriate and discouraged in Python Modified: trunk/Doc/Manual/Extending.html =================================================================== --- trunk/Doc/Manual/Extending.html 2008-12-06 21:55:15 UTC (rev 10968) +++ trunk/Doc/Manual/Extending.html 2008-12-06 23:15:20 UTC (rev 10969) @@ -3114,7 +3114,7 @@ <p> At the end of the new section is the place to put the aforementioned -nickname kludges (should they be needed). See Perl5 and Php4 for +nickname kludges (should they be needed). See Perl5 for examples of what to do. [If this is still unclear after you've read the code, ping me and I'll expand on this further. --ttn] </p> Modified: trunk/Doc/Manual/Php.html =================================================================== --- trunk/Doc/Manual/Php.html 2008-12-06 21:55:15 UTC (rev 10968) +++ trunk/Doc/Manual/Php.html 2008-12-06 23:15:20 UTC (rev 10969) @@ -413,7 +413,7 @@ <!-- This isn't correct for 1.3.30 and needs rewriting to reflect reality <p> -Because PHP4 is a dynamically typed language, simple values can be +Because PHP is a dynamically typed language, simple values can be silently converted from one type to another. For example, integers, doubles and strings silently convert to each other depending on context. This situation make overloading slightly problematic because @@ -433,7 +433,7 @@ <p> In order to provide the most natural experience to PHP programmers, -the default <tt>%typecheck</tt> implemented in <tt>php4.swg</tt> +the default <tt>%typecheck</tt> implemented in <tt>php.swg</tt> allows any simple type (integer, double, string) in PHP to be used for any simple C type (int, double, char *). The function selected then depends only on the argument type precedence defined by SWIG. @@ -783,7 +783,7 @@ <p> Note: Currently pragmas for PHP need to be specified using -<tt>%pragma(php4)</tt> but also apply for PHP5! This is just a historical +<tt>%pragma(php)</tt> but also apply for PHP5! This is just a historical oddity because SWIG's PHP support predates PHP5. </p> @@ -795,7 +795,7 @@ <div class="code"><pre> %module example -%pragma(php4) code=" +%pragma(php) code=" # This code is inserted into example.php echo \"example.php execution\\n\"; " @@ -817,7 +817,7 @@ <div class="code"><pre> %module example -%pragma(php4) code=" +%pragma(php) code=" include \"include.php\"; " %pragma(php) include="include.php" // equivalent. @@ -831,7 +831,7 @@ <div class="code"><pre> %module example; -%pragma(php4) phpinfo=" +%pragma(php) phpinfo=" zend_printf("An example of PHP support through SWIG\n"); php_info_print_table_start(); php_info_print_table_header(2, \"Directive\", \"Value\"); Modified: trunk/Doc/Manual/Preprocessor.html =================================================================== --- trunk/Doc/Manual/Preprocessor.html 2008-12-06 21:55:15 UTC (rev 10968) +++ trunk/Doc/Manual/Preprocessor.html 2008-12-06 23:15:20 UTC (rev 10969) @@ -118,7 +118,6 @@ SWIGPERL Defined when using Perl SWIGPERL5 Defined when using Perl5 SWIGPHP Defined when using PHP -SWIGPHP4 Defined when using PHP4 SWIGPHP5 Defined when using PHP5 SWIGPIKE Defined when using Pike SWIGPYTHON Defined when using Python Modified: trunk/Doc/Manual/SWIG.html =================================================================== --- trunk/Doc/Manual/SWIG.html 2008-12-06 21:55:15 UTC (rev 10968) +++ trunk/Doc/Manual/SWIG.html 2008-12-06 23:15:20 UTC (rev 10969) @@ -120,7 +120,7 @@ -mzscheme Generate Mzscheme wrappers -ocaml Generate Ocaml wrappers -perl Generate Perl wrappers --php5 Generate PHP5 wrappers +-php Generate PHP wrappers -pike Generate Pike wrappers -python Generate Python wrappers -r Generate R (aka GNU S) wrappers Modified: trunk/Doc/Manual/Warnings.html =================================================================== --- trunk/Doc/Manual/Warnings.html 2008-12-06 21:55:15 UTC (rev 10968) +++ trunk/Doc/Manual/Warnings.html 2008-12-06 23:15:20 UTC (rev 10969) @@ -558,7 +558,7 @@ </ul> <ul> -<li>870. Warning for <em>classname</em>: Base <em>baseclass</em> ignored. Multiple inheritance is not supported in Php4. (Php). +<li>870. Warning for <em>classname</em>: Base <em>baseclass</em> ignored. Multiple inheritance is not supported in PHP. <li>871. Unrecognized pragma <em>pragma</em>. (Php). </ul> Modified: trunk/Examples/Makefile.in =================================================================== --- trunk/Examples/Makefile.in 2008-12-06 21:55:15 UTC (rev 10968) +++ trunk/Examples/Makefile.in 2008-12-06 23:15:20 UTC (rev 10969) @@ -753,7 +753,7 @@ PHP_SO = @PHP_SO@ php: $(SRCS) - $(SWIG) -php5 $(SWIGOPT) $(INTERFACEPATH) + $(SWIG) -php $(SWIGOPT) $(INTERFACEPATH) $(CC) -c $(CCSHARED) $(CFLAGS) $(SRCS) $(ISRCS) $(INCLUDES) $(PHP_INCLUDE) $(LDSHARED) $(CFLAGS) $(OBJS) $(IOBJS) $(LIBS) -o $(LIBPREFIX)$(TARGET)$(PHP_SO) @@ -762,7 +762,7 @@ # -------------------------------------------------------------------- php_cpp: $(SRCS) - $(SWIG) -php5 -cppext cxx -c++ $(SWIGOPT) $(INTERFACEPATH) + $(SWIG) -php -cppext cxx -c++ $(SWIGOPT) $(INTERFACEPATH) $(CXX) -c $(CCSHARED) $(CFLAGS) $(SRCS) $(CXXSRCS) $(ICXXSRCS) $(INCLUDES) $(PHP_INCLUDE) $(CXXSHARED) $(CFLAGS) $(OBJS) $(IOBJS) $(LIBS) $(CPP_DLLIBS) -o $(LIBPREFIX)$(TARGET)$(PHP_SO) Modified: trunk/Examples/php/pragmas/example.i =================================================================== --- trunk/Examples/php/pragmas/example.i 2008-12-06 21:55:15 UTC (rev 10968) +++ trunk/Examples/php/pragmas/example.i 2008-12-06 23:15:20 UTC (rev 10969) @@ -21,11 +21,11 @@ zend_printf("This was %%rshutdown\n"); } -%pragma(php4) include="include.php"; +%pragma(php) include="include.php"; -%pragma(php4) code=" +%pragma(php) code=" # This code is inserted into example.php -echo \"this was php4 code\\n\"; +echo \"this was php code\\n\"; " -%pragma(php4) phpinfo="php_info_print_table_start();" +%pragma(php) phpinfo="php_info_print_table_start();" Modified: trunk/Lib/allkw.swg =================================================================== --- trunk/Lib/allkw.swg 2008-12-06 21:55:15 UTC (rev 10968) +++ trunk/Lib/allkw.swg 2008-12-06 23:15:20 UTC (rev 10969) @@ -19,7 +19,7 @@ %include <chicken/chickenkw.swg> %include <csharp/csharpkw.swg> %include <java/javakw.swg> -%include <php4/php4kw.swg> +%include <php/php.swg> %include <pike/pikekw.swg> %include <python/pythonkw.swg> %include <ocaml/ocamlkw.swg> Modified: trunk/Lib/php/phprun.swg =================================================================== --- trunk/Lib/php/phprun.swg 2008-12-06 21:55:15 UTC (rev 10968) +++ trunk/Lib/php/phprun.swg 2008-12-06 23:15:20 UTC (rev 10969) @@ -70,8 +70,8 @@ if (!(expr) ) { zend_printf("Contract Assert Failed %s\n",msg ); } else /* Standard SWIG API */ -#define SWIG_GetModule(clientdata) SWIG_Php4_GetModule() -#define SWIG_SetModule(clientdata, pointer) SWIG_Php4_SetModule(pointer) +#define SWIG_GetModule(clientdata) SWIG_Php_GetModule() +#define SWIG_SetModule(clientdata, pointer) SWIG_Php_SetModule(pointer) /* used to wrap returned objects in so we know whether they are newobject and need freeing, or not */ @@ -199,7 +199,7 @@ } static char const_name[] = "swig_runtime_data_type_pointer"; -static swig_module_info *SWIG_Php4_GetModule() { +static swig_module_info *SWIG_Php_GetModule() { zval *pointer; swig_module_info *ret = 0; @@ -216,7 +216,7 @@ return ret; } -static void SWIG_Php4_SetModule(swig_module_info *pointer) { +static void SWIG_Php_SetModule(swig_module_info *pointer) { TSRMLS_FETCH(); REGISTER_MAIN_LONG_CONSTANT(const_name, (long) pointer, 0); } Modified: trunk/Lib/php/typemaps.i =================================================================== --- trunk/Lib/php/typemaps.i 2008-12-06 21:55:15 UTC (rev 10968) +++ trunk/Lib/php/typemaps.i 2008-12-06 23:15:20 UTC (rev 10969) @@ -4,7 +4,7 @@ * * typemaps.i. * - * SWIG Typemap library for PHP4. + * SWIG Typemap library for PHP. * * This library provides standard typemaps for modifying SWIG's behavior. * With enough entries in this file, I hope that very few people actually Modified: trunk/Source/Include/swigwarn.h =================================================================== --- trunk/Source/Include/swigwarn.h 2008-12-06 21:55:15 UTC (rev 10968) +++ trunk/Source/Include/swigwarn.h 2008-12-06 23:15:20 UTC (rev 10969) @@ -252,8 +252,8 @@ * PHP4 versions of new warnings since existing user interface files can't * be using them. */ -#define WARN_PHP4_MULTIPLE_INHERITANCE 870 -#define WARN_PHP4_UNKNOWN_PRAGMA 871 +#define WARN_PHP_MULTIPLE_INHERITANCE 870 +#define WARN_PHP_UNKNOWN_PRAGMA 871 #define WARN_PHP_MULTIPLE_INHERITANCE 870 #define WARN_PHP_UNKNOWN_PRAGMA 871 Modified: trunk/Source/Modules/php.cxx =================================================================== --- trunk/Source/Modules/php.cxx 2008-12-06 21:55:15 UTC (rev 10968) +++ trunk/Source/Modules/php.cxx 2008-12-06 23:15:20 UTC (rev 10969) @@ -48,13 +48,13 @@ #include <errno.h> static const char *usage = (char *) "\ -PHP Options (available with -php5)\n\ +PHP Options (available with -php)\n\ -cppext - cpp file extension (default to .cpp)\n\ -noproxy - Don't generate proxy classes.\n\ - -prefix <prefix> - Prepend <prefix> to all class names in PHP5 wrappers\n\ + -prefix <prefix> - Prepend <prefix> to all class names in PHP wrappers\n\ \n"; -/* The original class wrappers for PHP4 stored the pointer to the C++ class in +/* The original class wrappers for PHP stored the pointer to the C++ class in * the object property _cPtr. If we use the same name for the member variable * which we put the pointer to the C++ class in, then the flat function * wrappers will automatically pull it out without any changes being required. @@ -240,7 +240,7 @@ Preprocessor_define("SWIGPHP 1", 0); Preprocessor_define("SWIGPHP5 1", 0); - SWIG_typemap_lang("php4"); + SWIG_typemap_lang("php"); SWIG_config_file("php.swg"); allow_overloading(); } @@ -1576,8 +1576,8 @@ * * Pragma directive. * - * %pragma(php4) code="String" # Includes a string in the .php file - * %pragma(php4) include="file.pl" # Includes a file in the .php file + * %pragma(php) code="String" # Includes a string in the .php file + * %pragma(php) include="file.pl" # Includes a file in the .php file */ virtual int pragmaDirective(Node *n) { @@ -1586,7 +1586,7 @@ String *type = Getattr(n, "name"); String *value = Getattr(n, "value"); - if (Strcmp(lang, "php4") == 0) { + if (Strcmp(lang, "php") == 0 || Strcmp(lang, "php4") == 0) { if (Strcmp(type, "code") == 0) { if (value) { Printf(pragma_code, "%s\n", value); @@ -2071,6 +2071,6 @@ return NULL; // To avoid compiler warnings. } -extern "C" Language *swig_php5(void) { +extern "C" Language *swig_php(void) { return new_swig_php(); } Modified: trunk/Source/Modules/swigmain.cxx =================================================================== --- trunk/Source/Modules/swigmain.cxx 2008-12-06 21:55:15 UTC (rev 10968) +++ trunk/Source/Modules/swigmain.cxx 2008-12-06 23:15:20 UTC (rev 10969) @@ -32,8 +32,8 @@ Language *swig_modula3(void); Language *swig_mzscheme(void); Language *swig_java(void); + Language *swig_php(void); Language *swig_php4(void); - Language *swig_php5(void); Language *swig_ocaml(void); Language *swig_octave(void); Language *swig_pike(void); @@ -74,9 +74,9 @@ {"-octave", swig_octave, "Octave"}, {"-perl", swig_perl5, "Perl"}, {"-perl5", swig_perl5, 0}, - {"-php", swig_php5, 0}, + {"-php", swig_php, "PHP"}, {"-php4", swig_php4, 0}, - {"-php5", swig_php5, "PHP5"}, + {"-php5", swig_php, 0}, {"-pike", swig_pike, "Pike"}, {"-python", swig_python, "Python"}, {"-r", swig_r, "R (aka GNU S)"}, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ol...@us...> - 2008-12-07 00:38:19
|
Revision: 10970 http://swig.svn.sourceforge.net/swig/?rev=10970&view=rev Author: olly Date: 2008-12-07 00:38:14 +0000 (Sun, 07 Dec 2008) Log Message: ----------- [PHP] Fix warnings when compiling generated wrapper with GCC 4.3. Modified Paths: -------------- trunk/CHANGES.current trunk/Source/Modules/php.cxx Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2008-12-06 23:15:20 UTC (rev 10969) +++ trunk/CHANGES.current 2008-12-07 00:38:14 UTC (rev 10970) @@ -1,7 +1,10 @@ Version 1.3.37 (in progress) ============================ -2008-12-02: wsfulton +2008-12-07: olly + [PHP] Fix warnings when compiling generated wrapper with GCC 4.3. + +2008-12-06: wsfulton [PHP] Deprecate %pragma(php4). Please use %pragma(php) instead. The following two warnings have been renamed: WARN_PHP4_MULTIPLE_INHERITANCE -> WARN_PHP_MULTIPLE_INHERITANCE Modified: trunk/Source/Modules/php.cxx =================================================================== --- trunk/Source/Modules/php.cxx 2008-12-06 23:15:20 UTC (rev 10969) +++ trunk/Source/Modules/php.cxx 2008-12-07 00:38:14 UTC (rev 10970) @@ -586,7 +586,7 @@ Printf(f->code, "SWIG_ErrorCode() = E_ERROR;\n"); Printf(f->code, "SWIG_ErrorMsg() = \"No matching function for overloaded '%s'\";\n", symname); - Printv(f->code, "zend_error(SWIG_ErrorCode(),SWIG_ErrorMsg());\n", NIL); + Printv(f->code, "zend_error(SWIG_ErrorCode(),\"%s\",SWIG_ErrorMsg());\n", NIL); Printv(f->code, "}\n", NIL); Wrapper_print(f, s_wrappers); @@ -842,7 +842,7 @@ /* Error handling code */ Printf(f->code, "fail:\n"); Printv(f->code, cleanup, NIL); - Printv(f->code, "zend_error(SWIG_ErrorCode(),SWIG_ErrorMsg());", NIL); + Printv(f->code, "zend_error(SWIG_ErrorCode(),\"%s\",SWIG_ErrorMsg());", NIL); Printf(f->code, "}\n"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2008-12-08 20:40:25
|
Revision: 10973 http://swig.svn.sourceforge.net/swig/?rev=10973&view=rev Author: wsfulton Date: 2008-12-08 20:40:20 +0000 (Mon, 08 Dec 2008) Log Message: ----------- Add ccache uninstall target. Fix ccache install/uninstall to take account of --program-prefix --program-suffix Modified Paths: -------------- trunk/CCache/Makefile.in trunk/CCache/configure.in trunk/Makefile.in Modified: trunk/CCache/Makefile.in =================================================================== --- trunk/CCache/Makefile.in 2008-12-07 13:40:36 UTC (rev 10972) +++ trunk/CCache/Makefile.in 2008-12-08 20:40:20 UTC (rev 10973) @@ -15,6 +15,9 @@ SWIG_LIB=../../Lib EXEEXT=@EXEEXT@ +# Use standard autoconf approach to transform executable name using --program-prefix and --program-suffix +transform = @program_transform_name@ + LIBS= @LIBS@ OBJS= ccache.o mdfour.o hash.o execute.o util.o args.o stats.o \ cleanup.o snprintf.o unify.o @@ -36,10 +39,14 @@ install: $(PACKAGE_NAME)$(EXEEXT) $(PACKAGE_NAME).1 ${INSTALLCMD} -d $(DESTDIR)${bindir} - ${INSTALLCMD} -m 755 $(PACKAGE_NAME)$(EXEEXT) $(DESTDIR)${bindir} + ${INSTALLCMD} -m 755 $(PACKAGE_NAME)$(EXEEXT) $(DESTDIR)${bindir}/`echo $(PACKAGE_NAME) | sed '$(transform)'`$(EXEEXT) ${INSTALLCMD} -d $(DESTDIR)${mandir}/man1 - ${INSTALLCMD} -m 644 ${srcdir}/$(PACKAGE_NAME).1 $(DESTDIR)${mandir}/man1/ + ${INSTALLCMD} -m 644 ${srcdir}/$(PACKAGE_NAME).1 $(DESTDIR)${mandir}/man1/`echo $(PACKAGE_NAME) | sed '$(transform)'`.1 +uninstall: $(PACKAGE_NAME)$(EXEEXT) $(PACKAGE_NAME).1 + rm -f $(DESTDIR)${bindir}/`echo $(PACKAGE_NAME) | sed '$(transform)'`$(EXEEXT) + rm -f $(DESTDIR)${mandir}/man1/`echo $(PACKAGE_NAME) | sed '$(transform)'`.1 + clean: /bin/rm -f $(OBJS) *~ $(PACKAGE_NAME)$(EXEEXT) Modified: trunk/CCache/configure.in =================================================================== --- trunk/CCache/configure.in 2008-12-07 13:40:36 UTC (rev 10972) +++ trunk/CCache/configure.in 2008-12-08 20:40:20 UTC (rev 10973) @@ -12,6 +12,7 @@ AC_PROG_CC AC_PROG_CPP AC_PROG_INSTALL +AC_ARG_PROGRAM # for program_transform_name AC_DEFINE([_GNU_SOURCE], 1, [Define _GNU_SOURCE so that we get all necessary prototypes]) Modified: trunk/Makefile.in =================================================================== --- trunk/Makefile.in 2008-12-07 13:40:36 UTC (rev 10972) +++ trunk/Makefile.in 2008-12-08 20:40:20 UTC (rev 10973) @@ -496,7 +496,7 @@ # TARGETS: uninstall & friends ##################################################################### -uninstall: uninstall-main uninstall-lib +uninstall: uninstall-main uninstall-lib uninstall-ccache @echo "Uninstall complete" uninstall-main: @@ -507,6 +507,9 @@ @echo "Uninstalling the SWIG library" rm -rf $(DESTDIR)$(SWIG_LIB)/ +uninstall-ccache: + test -z "$(ENABLE_CCACHE)" || (cd $(CCACHE) && $(MAKE) uninstall) + ############################################################################ # DIST and other maintenance ############################################################################ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2008-12-09 22:55:35
|
Revision: 10976 http://swig.svn.sourceforge.net/swig/?rev=10976&view=rev Author: wsfulton Date: 2008-12-09 21:33:19 +0000 (Tue, 09 Dec 2008) Log Message: ----------- refine Makefile targets for documentation generation and remove generated ccache documentation from svn Modified Paths: -------------- trunk/CCache/Makefile.in trunk/Doc/Manual/Makefile trunk/Makefile.in trunk/Tools/mkdist.py Removed Paths: ------------- trunk/CCache/ccache.1 trunk/CCache/web/ccache-man.html Modified: trunk/CCache/Makefile.in =================================================================== --- trunk/CCache/Makefile.in 2008-12-09 21:31:31 UTC (rev 10975) +++ trunk/CCache/Makefile.in 2008-12-09 21:33:19 UTC (rev 10976) @@ -25,7 +25,7 @@ all: $(PACKAGE_NAME)$(EXEEXT) -docs: $(PACKAGE_NAME).1 web/$(PACKAGE_NAME)-man.html +docs: $(PACKAGE_NAME).1 web/ccache-man.html $(PACKAGE_NAME)$(EXEEXT): $(OBJS) $(HEADERS) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(OBJS) $(LIBS) @@ -33,9 +33,9 @@ $(PACKAGE_NAME).1: ccache.yo -yodl2man -o $(PACKAGE_NAME).1 ccache.yo -web/$(PACKAGE_NAME)-man.html: ccache.yo +web/ccache-man.html: ccache.yo mkdir -p man - yodl2html -o web/$(PACKAGE_NAME)-man.html ccache.yo + yodl2html -o web/ccache-man.html ccache.yo install: $(PACKAGE_NAME)$(EXEEXT) $(PACKAGE_NAME).1 ${INSTALLCMD} -d $(DESTDIR)${bindir} @@ -50,6 +50,9 @@ clean: /bin/rm -f $(OBJS) *~ $(PACKAGE_NAME)$(EXEEXT) +clean-docs: + rm -f $(PACKAGE_NAME).1 web/ccache-man.html + check : test test: test.sh Deleted: trunk/CCache/ccache.1 =================================================================== --- trunk/CCache/ccache.1 2008-12-09 21:31:31 UTC (rev 10975) +++ trunk/CCache/ccache.1 2008-12-09 21:33:19 UTC (rev 10976) @@ -1,404 +0,0 @@ -.TH "ccache" "1" "April 2002" "" "" -.SH "NAME" -ccache \- a fast compiler cache -.SH "SYNOPSIS" -.PP -ccache [OPTION] -.PP -ccache <compiler> [COMPILER OPTIONS] -.PP -<compiler> [COMPILER OPTIONS] -.PP -.SH "DESCRIPTION" -.PP -ccache is a compiler cache\&. It speeds up re-compilation of C/C++ code -by caching previous compiles and detecting when the same compile is -being done again\&. -.PP -.SH "OPTIONS SUMMARY" -.PP -Here is a summary of the options to ccache\&. -.PP - -.nf - - --s show statistics summary --z zero statistics --c run a cache cleanup --C clear the cache completely --F <maxfiles> set maximum files in cache --M <maxsize> set maximum size of cache (use G, M or K) --h this help page --V print version number - -.fi - - -.PP -.SH "OPTIONS" -.PP -These options only apply when you invoke ccache as "ccache"\&. When -invoked as a compiler none of these options apply\&. In that case your -normal compiler options apply and you should refer to your compilers -documentation\&. -.PP -.IP "\fB-h\fP" -Print a options summary page -.IP -.IP "\fB-s\fP" -Print the current statistics summary for the cache\&. The -statistics are stored spread across the subdirectories of the -cache\&. Using "ccache \-s" adds up the statistics across all -subdirectories and prints the totals\&. -.IP -.IP "\fB-z\fP" -Zero the cache statistics\&. -.IP -.IP "\fB-V\fP" -Print the ccache version number -.IP -.IP "\fB-c\fP" -Clean the cache and re-calculate the cache file count and -size totals\&. Normally the \-c option should not be necessary as ccache -keeps the cache below the specified limits at runtime and keeps -statistics up to date on each compile\&. This option is mostly useful -if you manually modify the cache contents or believe that the cache -size statistics may be inaccurate\&. -.IP -.IP "\fB-C\fP" -Clear the entire cache, removing all cached files\&. -.IP -.IP "\fB-F maxfiles\fP" -This sets the maximum number of files allowed in -the cache\&. The value is stored inside the cache directory and applies -to all future compiles\&. Due to the way the value is stored the actual -value used is always rounded down to the nearest multiple of 16\&. -.IP -.IP "\fB-M maxsize\fP" -This sets the maximum cache size\&. You can specify -a value in gigabytes, megabytes or kilobytes by appending a G, M or K -to the value\&. The default is gigabytes\&. The actual value stored is -rounded down to the nearest multiple of 16 kilobytes\&. -.IP -.PP -.SH "INSTALLATION" -.PP -There are two ways to use ccache\&. You can either prefix your compile -commands with "ccache" or you can create a symbolic link between -ccache and the names of your compilers\&. The first method is most -convenient if you just want to try out ccache or wish to use it for -some specific projects\&. The second method is most useful for when you -wish to use ccache for all your compiles\&. -.PP -To install for usage by the first method just copy ccache to somewhere -in your path\&. -.PP -To install for the second method do something like this: - -.nf - - - cp ccache /usr/local/bin/ - ln \-s /usr/local/bin/ccache /usr/local/bin/gcc - ln \-s /usr/local/bin/ccache /usr/local/bin/g++ - ln \-s /usr/local/bin/ccache /usr/local/bin/cc - -.fi - - -This will work as long as /usr/local/bin comes before the path to gcc -(which is usually in /usr/bin)\&. After installing you may wish to run -"which gcc" to make sure that the correct link is being used\&. -.PP -Note! Do not use a hard link, use a symbolic link\&. A hardlink will -cause "interesting" problems\&. -.PP -.SH "EXTRA OPTIONS" -.PP -When run as a compiler front end ccache usually just takes the same -command line options as the compiler you are using\&. The only exception -to this is the option \&'\-\-ccache-skip\&'\&. That option can be used to tell -ccache that the next option is definitely not a input filename, and -should be passed along to the compiler as-is\&. -.PP -The reason this can be important is that ccache does need to parse the -command line and determine what is an input filename and what is a -compiler option, as it needs the input filename to determine the name -of the resulting object file (among other things)\&. The heuristic -ccache uses in this parse is that any string on the command line that -exists as a file is treated as an input file name (usually a C -file)\&. By using \-\-ccache-skip you can force an option to not be -treated as an input file name and instead be passed along to the -compiler as a command line option\&. -.PP -.SH "ENVIRONMENT VARIABLES" -.PP -ccache uses a number of environment variables to control operation\&. In -most cases you won\&'t need any of these as the defaults will be fine\&. -.PP -.IP -.IP "\fBCCACHE_DIR\fP" -the CCACHE_DIR environment variable specifies -where ccache will keep its cached compiler output\&. The default is -"$HOME/\&.ccache"\&. -.IP -.IP "\fBCCACHE_TEMPDIR\fP" -the CCACHE_TEMPDIR environment variable specifies -where ccache will put temporary files\&. The default is the same as -CCACHE_DIR\&. Note that the CCACHE_TEMPDIR path must be on the same -filesystem as the CCACHE_DIR path, so that renames of files between -the two directories can work\&. -.IP -.IP "\fBCCACHE_LOGFILE\fP" -If you set the CCACHE_LOGFILE environment -variable then ccache will write some log information on cache hits -and misses in that file\&. This is useful for tracking down problems\&. -.IP -.IP "\fBCCACHE_PATH\fP" -You can optionally set CCACHE_PATH to a colon -separated path where ccache will look for the real compilers\&. If you -don\&'t do this then ccache will look for the first executable matching -the compiler name in the normal PATH that isn\&'t a symbolic link to -ccache itself\&. -.IP -.IP "\fBCCACHE_CC\fP" -You can optionally set CCACHE_CC to force the name -of the compiler to use\&. If you don\&'t do this then ccache works it out -from the command line\&. -.IP -.IP "\fBCCACHE_PREFIX\fP" -This option adds a prefix to the command line -that ccache runs when invoking the compiler\&. Also see the section -below on using ccache with distcc\&. -.IP -.IP "\fBCCACHE_DISABLE\fP" -If you set the environment variable -CCACHE_DISABLE then ccache will just call the real compiler, -bypassing the cache completely\&. -.IP -.IP "\fBCCACHE_READONLY\fP" -the CCACHE_READONLY environment variable -tells ccache to attempt to use existing cached object files, but not -to try to add anything new to the cache\&. If you are using this because -your CCACHE_DIR is read-only, then you may find that you also need to -set CCACHE_TEMPDIR as otherwise ccache will fail to create the -temporary files\&. -.IP -.IP "\fBCCACHE_CPP2\fP" -If you set the environment variable CCACHE_CPP2 -then ccache will not use the optimisation of avoiding the 2nd call to -the pre-processor by compiling the pre-processed output that was used -for finding the hash in the case of a cache miss\&. This is primarily a -debugging option, although it is possible that some unusual compilers -will have problems with the intermediate filename extensions used in -this optimisation, in which case this option could allow ccache to be -used\&. -.IP -.IP "\fBCCACHE_NOSTATS\fP" -If you set the environment variable -CCACHE_NOSTATS then ccache will not update the statistics files on -each compile\&. -.IP -.IP "\fBCCACHE_NLEVELS\fP" -The environment variable CCACHE_NLEVELS allows -you to choose the number of levels of hash in the cache directory\&. The -default is 2\&. The minimum is 1 and the maximum is 8\&. -.IP -.IP "\fBCCACHE_HARDLINK\fP" -If you set the environment variable -CCACHE_HARDLINK then ccache will attempt to use hard links from the -cache directory when creating the compiler output rather than using a -file copy\&. Using hard links is faster, but can confuse programs like -\&'make\&' that rely on modification times\&. Hard links are never made for -compressed cache files\&. -.IP -.IP "\fBCCACHE_RECACHE\fP" -This forces ccache to not use any cached -results, even if it finds them\&. New results are still cached, but -existing cache entries are ignored\&. -.IP -.IP "\fBCCACHE_UMASK\fP" -This sets the umask for ccache and all child -processes (such as the compiler)\&. This is mostly useful when you wish -to share your cache with other users\&. Note that this also affects the -file permissions set on the object files created from your -compilations\&. -.IP -.IP "\fBCCACHE_HASHDIR\fP" -This tells ccache to hash the current working -directory when calculating the hash that is used to distinguish two -compiles\&. This prevents a problem with the storage of the current -working directory in the debug info of a object file, which can lead -ccache to give a cached object file that has the working directory in -the debug info set incorrectly\&. This option is off by default as the -incorrect setting of this debug info rarely causes problems\&. If you -strike problems with gdb not using the correct directory then enable -this option\&. -.IP -.IP "\fBCCACHE_UNIFY\fP" -If you set the environment variable CCACHE_UNIFY -then ccache will use the C/C++ unifier when hashing the pre-processor -output if \-g is not used in the compile\&. The unifier is slower than a -normal hash, so setting this environment variable loses a little bit -of speed, but it means that ccache can take advantage of not -recompiling when the changes to the source code consist of -reformatting only\&. Note that using CCACHE_UNIFY changes the hash, so -cached compiles with CCACHE_UNIFY set cannot be used when -CCACHE_UNIFY is not set and vice versa\&. The reason the unifier is off -by default is that it can give incorrect line number information in -compiler warning messages\&. -.IP -.IP "\fBCCACHE_EXTENSION\fP" -Normally ccache tries to automatically -determine the extension to use for intermediate C pre-processor files -based on the type of file being compiled\&. Unfortunately this sometimes -doesn\&'t work, for example when using the aCC compiler on HP-UX\&. On -systems like this you can use the CCACHE_EXTENSION option to override -the default\&. On HP-UX set this environment variable to "i" if you use -the aCC compiler\&. -.IP -.IP "\fBCCACHE_NOCOMPRESS\fP" -If you set the environment variable -CCACHE_NOCOMPRESS then there is no compression used on files that go -into the cache\&. -.IP -.PP -.SH "CACHE SIZE MANAGEMENT" -.PP -By default ccache has a one gigabyte limit on the cache size and no -maximum number of files\&. You can set a different limit using the -"ccache \-M" and "ccache \-F" options, which set the size and number of -files limits\&. -.PP -When these limits are reached ccache will reduce the cache to 20% -below the numbers you specified in order to avoid doing the cache -clean operation too often\&. -.PP -.SH "CACHE COMPRESSION" -.PP -By default ccache will compress all files it puts into the cache -using the zlib compression\&. While this involves a negligible -performance slowdown, it significantly increases the number of files -that fit in the cache\&. You can turn off compression setting the -CCACHE_NOCOMPRESS environment variable\&. -.PP -.SH "HOW IT WORKS" -.PP -The basic idea is to detect when you are compiling exactly the same -code a 2nd time and use the previously compiled output\&. You detect -that it is the same code by forming a hash of: -.PP -.IP o -the pre-processor output from running the compiler with \-E -.IP o -the command line options -.IP o -the real compilers size and modification time -.IP o -any stderr output generated by the compiler -.PP -These are hashed using md4 (a strong hash) and a cache file is formed -based on that hash result\&. When the same compilation is done a second -time ccache is able to supply the correct compiler output (including -all warnings etc) from the cache\&. -.PP -ccache has been carefully written to always produce exactly the same -compiler output that you would get without the cache\&. If you ever -discover a case where ccache changes the output of your compiler then -please let me know\&. -.PP -.SH "USING CCACHE WITH DISTCC" -.PP -distcc is a very useful program for distributing compilation across a -range of compiler servers\&. It is often useful to combine distcc with -ccache, so that compiles that are done are sped up by distcc, but that -ccache avoids the compile completely where possible\&. -.PP -To use distcc with ccache I recommend using the CCACHE_PREFIX -option\&. You just need to set the environment variable CCACHE_PREFIX to -\&'distcc\&' and ccache will prefix the command line used with the -compiler with the command \&'distcc\&'\&. -.PP -.SH "SHARING A CACHE" -.PP -A group of developers can increase the cache hit rate by sharing a -cache directory\&. The hard links however cause unwanted side effects, -as all links to a cached file share the file\&'s modification timestamp\&. -This results in false dependencies to be triggered by timestamp-based -build systems whenever another user links to an existing -file\&. Typically, users will see that their libraries and binaries are -relinked without reason\&. To share a cache without side effects, the -following conditions need to be met: -.PP -.IP o -Use the same \fBCCACHE_DIR\fP environment variable setting -.IP o -Set the \fBCCACHE_NOLINK\fP environment variable -.IP o -Make sure everyone sets the CCACHE_UMASK environment variable -to 002, this ensures that cached files are accessible to everyone in -the group\&. -.IP o -Make sure that all users have write permission in the entire -cache directory (and that you trust all users of the shared cache)\&. -.IP o -Make sure that the setgid bit is set on all directories in the -cache\&. This tells the filesystem to inherit group ownership for new -directories\&. The command "chmod g+s `find $CCACHE_DIR \-type d`" might -be useful for this\&. -.PP -.SH "HISTORY" -.PP -ccache was inspired by the compilercache shell script script written -by Erik Thiele and I would like to thank him for an excellent piece of -work\&. See -http://www\&.erikyyy\&.de/compilercache/ -for the Erik\&'s scripts\&. -.PP -I wrote ccache because I wanted to get a bit more speed out of a -compiler cache and I wanted to remove some of the limitations of the -shell-script version\&. -.PP -.SH "DIFFERENCES FROM COMPILERCACHE" -.PP -The biggest differences between Erik\&'s compilercache script and ccache -are: -.IP o -ccache is written in C, which makes it a bit faster (calling out to -external programs is mostly what slowed down the scripts)\&. -.IP o -ccache can automatically find the real compiler -.IP o -ccache keeps statistics on hits/misses -.IP o -ccache can do automatic cache management -.IP o -ccache can cache compiler output that includes warnings\&. In many -cases this gives ccache a much higher cache hit rate\&. -.IP o -ccache can handle a much wider ranger of compiler options -.IP o -ccache avoids a double call to cpp on a cache miss -.PP -.SH "CREDITS" -.PP -Thanks to the following people for their contributions to ccache -.IP o -Erik Thiele for the original compilercache script -.IP o -Luciano Rocha for the idea of compiling the pre-processor output -to avoid a 2nd cpp pass -.IP o -Paul Russell for many suggestions and the debian packaging -.PP -.SH "AUTHOR" -.PP -ccache was written by Andrew Tridgell -http://samba\&.org/~tridge/ -.PP -If you wish to report a problem or make a suggestion then please email -bugs@ccache\&.samba\&.org -.PP -ccache is released under the GNU General Public License version 2 or -later\&. Please see the file COPYING for license details\&. Deleted: trunk/CCache/web/ccache-man.html =================================================================== --- trunk/CCache/web/ccache-man.html 2008-12-09 21:31:31 UTC (rev 10975) +++ trunk/CCache/web/ccache-man.html 2008-12-09 21:33:19 UTC (rev 10976) @@ -1,318 +0,0 @@ - - - - - -<html><head><title>ccache</title> - -<link rev="made" href="mailto:bu...@cc..."> -</head> -<body> - -<hr> - -<h1>ccache</h1> -<h2>April 2002</h2> - - - -<h2>NAME</h2> - ccache - a fast compiler cache -<h2>SYNOPSIS</h2> - -<p>ccache [OPTION] -<p>ccache <compiler> [COMPILER OPTIONS] -<p><compiler> [COMPILER OPTIONS] -<p><h2>DESCRIPTION</h2> - -<p>ccache is a compiler cache. It speeds up re-compilation of C/C++ code -by caching previous compiles and detecting when the same compile is -being done again. -<p><h2>OPTIONS SUMMARY</h2> - -<p>Here is a summary of the options to ccache. -<p><pre> - --s show statistics summary --z zero statistics --c run a cache cleanup --C clear the cache completely --F <maxfiles> set maximum files in cache --M <maxsize> set maximum size of cache (use G, M or K) --h this help page --V print version number - -</pre> - -<p><h2>OPTIONS</h2> - -<p>These options only apply when you invoke ccache as "ccache". When -invoked as a compiler none of these options apply. In that case your -normal compiler options apply and you should refer to your compilers -documentation. -<p><dl> -<p></p><dt><strong><strong>-h</strong></strong><dd> Print a options summary page -<p><p></p><dt><strong><strong>-s</strong></strong><dd> Print the current statistics summary for the cache. The -statistics are stored spread across the subdirectories of the -cache. Using "ccache -s" adds up the statistics across all -subdirectories and prints the totals. -<p><p></p><dt><strong><strong>-z</strong></strong><dd> Zero the cache statistics. -<p><p></p><dt><strong><strong>-V</strong></strong><dd> Print the ccache version number -<p><p></p><dt><strong><strong>-c</strong></strong><dd> Clean the cache and re-calculate the cache file count and -size totals. Normally the -c option should not be necessary as ccache -keeps the cache below the specified limits at runtime and keeps -statistics up to date on each compile. This option is mostly useful -if you manually modify the cache contents or believe that the cache -size statistics may be inaccurate. -<p><p></p><dt><strong><strong>-C</strong></strong><dd> Clear the entire cache, removing all cached files. -<p><p></p><dt><strong><strong>-F maxfiles</strong></strong><dd> This sets the maximum number of files allowed in -the cache. The value is stored inside the cache directory and applies -to all future compiles. Due to the way the value is stored the actual -value used is always rounded down to the nearest multiple of 16. -<p><p></p><dt><strong><strong>-M maxsize</strong></strong><dd> This sets the maximum cache size. You can specify -a value in gigabytes, megabytes or kilobytes by appending a G, M or K -to the value. The default is gigabytes. The actual value stored is -rounded down to the nearest multiple of 16 kilobytes. -<p></dl> -<p><h2>INSTALLATION</h2> - -<p>There are two ways to use ccache. You can either prefix your compile -commands with "ccache" or you can create a symbolic link between -ccache and the names of your compilers. The first method is most -convenient if you just want to try out ccache or wish to use it for -some specific projects. The second method is most useful for when you -wish to use ccache for all your compiles. -<p>To install for usage by the first method just copy ccache to somewhere -in your path. -<p>To install for the second method do something like this: -<pre> - - cp ccache /usr/local/bin/ - ln -s /usr/local/bin/ccache /usr/local/bin/gcc - ln -s /usr/local/bin/ccache /usr/local/bin/g++ - ln -s /usr/local/bin/ccache /usr/local/bin/cc - -</pre> - -This will work as long as /usr/local/bin comes before the path to gcc -(which is usually in /usr/bin). After installing you may wish to run -"which gcc" to make sure that the correct link is being used. -<p>Note! Do not use a hard link, use a symbolic link. A hardlink will -cause "interesting" problems. -<p><h2>EXTRA OPTIONS</h2> - -<p>When run as a compiler front end ccache usually just takes the same -command line options as the compiler you are using. The only exception -to this is the option '--ccache-skip'. That option can be used to tell -ccache that the next option is definitely not a input filename, and -should be passed along to the compiler as-is. -<p>The reason this can be important is that ccache does need to parse the -command line and determine what is an input filename and what is a -compiler option, as it needs the input filename to determine the name -of the resulting object file (among other things). The heuristic -ccache uses in this parse is that any string on the command line that -exists as a file is treated as an input file name (usually a C -file). By using --ccache-skip you can force an option to not be -treated as an input file name and instead be passed along to the -compiler as a command line option. -<p><h2>ENVIRONMENT VARIABLES</h2> - -<p>ccache uses a number of environment variables to control operation. In -most cases you won't need any of these as the defaults will be fine. -<p><dl> -<p><p></p><dt><strong><strong>CCACHE_DIR</strong></strong><dd> the CCACHE_DIR environment variable specifies -where ccache will keep its cached compiler output. The default is -"$HOME/.ccache". -<p><p></p><dt><strong><strong>CCACHE_TEMPDIR</strong></strong><dd> the CCACHE_TEMPDIR environment variable specifies -where ccache will put temporary files. The default is the same as -CCACHE_DIR. Note that the CCACHE_TEMPDIR path must be on the same -filesystem as the CCACHE_DIR path, so that renames of files between -the two directories can work. -<p><p></p><dt><strong><strong>CCACHE_LOGFILE</strong></strong><dd> If you set the CCACHE_LOGFILE environment -variable then ccache will write some log information on cache hits -and misses in that file. This is useful for tracking down problems. -<p><p></p><dt><strong><strong>CCACHE_PATH</strong></strong><dd> You can optionally set CCACHE_PATH to a colon -separated path where ccache will look for the real compilers. If you -don't do this then ccache will look for the first executable matching -the compiler name in the normal PATH that isn't a symbolic link to -ccache itself. -<p><p></p><dt><strong><strong>CCACHE_CC</strong></strong><dd> You can optionally set CCACHE_CC to force the name -of the compiler to use. If you don't do this then ccache works it out -from the command line. -<p><p></p><dt><strong><strong>CCACHE_PREFIX</strong></strong><dd> This option adds a prefix to the command line -that ccache runs when invoking the compiler. Also see the section -below on using ccache with distcc. -<p><p></p><dt><strong><strong>CCACHE_DISABLE</strong></strong><dd> If you set the environment variable -CCACHE_DISABLE then ccache will just call the real compiler, -bypassing the cache completely. -<p><p></p><dt><strong><strong>CCACHE_READONLY</strong></strong><dd> the CCACHE_READONLY environment variable -tells ccache to attempt to use existing cached object files, but not -to try to add anything new to the cache. If you are using this because -your CCACHE_DIR is read-only, then you may find that you also need to -set CCACHE_TEMPDIR as otherwise ccache will fail to create the -temporary files. -<p><p></p><dt><strong><strong>CCACHE_CPP2</strong></strong><dd> If you set the environment variable CCACHE_CPP2 -then ccache will not use the optimisation of avoiding the 2nd call to -the pre-processor by compiling the pre-processed output that was used -for finding the hash in the case of a cache miss. This is primarily a -debugging option, although it is possible that some unusual compilers -will have problems with the intermediate filename extensions used in -this optimisation, in which case this option could allow ccache to be -used. -<p><p></p><dt><strong><strong>CCACHE_NOSTATS</strong></strong><dd> If you set the environment variable -CCACHE_NOSTATS then ccache will not update the statistics files on -each compile. -<p><p></p><dt><strong><strong>CCACHE_NLEVELS</strong></strong><dd> The environment variable CCACHE_NLEVELS allows -you to choose the number of levels of hash in the cache directory. The -default is 2. The minimum is 1 and the maximum is 8. -<p><p></p><dt><strong><strong>CCACHE_HARDLINK</strong></strong><dd> If you set the environment variable -CCACHE_HARDLINK then ccache will attempt to use hard links from the -cache directory when creating the compiler output rather than using a -file copy. Using hard links is faster, but can confuse programs like -'make' that rely on modification times. -<p><p></p><dt><strong><strong>CCACHE_RECACHE</strong></strong><dd> This forces ccache to not use any cached -results, even if it finds them. New results are still cached, but -existing cache entries are ignored. -<p><p></p><dt><strong><strong>CCACHE_UMASK</strong></strong><dd> This sets the umask for ccache and all child -processes (such as the compiler). This is mostly useful when you wish -to share your cache with other users. Note that this also affects the -file permissions set on the object files created from your -compilations. -<p><p></p><dt><strong><strong>CCACHE_HASHDIR</strong></strong><dd> This tells ccache to hash the current working -directory when calculating the hash that is used to distinguish two -compiles. This prevents a problem with the storage of the current -working directory in the debug info of a object file, which can lead -ccache to give a cached object file that has the working directory in -the debug info set incorrectly. This option is off by default as the -incorrect setting of this debug info rarely causes problems. If you -strike problems with gdb not using the correct directory then enable -this option. -<p><p></p><dt><strong><strong>CCACHE_UNIFY</strong></strong><dd> If you set the environment variable CCACHE_UNIFY -then ccache will use the C/C++ unifier when hashing the pre-processor -output if -g is not used in the compile. The unifier is slower than a -normal hash, so setting this environment variable loses a little bit -of speed, but it means that ccache can take advantage of not -recompiling when the changes to the source code consist of -reformatting only. Note that using CCACHE_UNIFY changes the hash, so -cached compiles with CCACHE_UNIFY set cannot be used when -CCACHE_UNIFY is not set and vice versa. The reason the unifier is off -by default is that it can give incorrect line number information in -compiler warning messages. -<p><p></p><dt><strong><strong>CCACHE_EXTENSION</strong></strong><dd> Normally ccache tries to automatically -determine the extension to use for intermediate C pre-processor files -based on the type of file being compiled. Unfortunately this sometimes -doesn't work, for example when using the aCC compiler on HP-UX. On -systems like this you can use the CCACHE_EXTENSION option to override -the default. On HP-UX set this environment variable to "i" if you use -the aCC compiler. -<p></dl> -<p><h2>CACHE SIZE MANAGEMENT</h2> - -<p>By default ccache has a one gigabyte limit on the cache size and no -maximum number of files. You can set a different limit using the -"ccache -M" and "ccache -F" options, which set the size and number of -files limits. -<p>When these limits are reached ccache will reduce the cache to 20% -below the numbers you specified in order to avoid doing the cache -clean operation too often. -<p><h2>HOW IT WORKS</h2> - -<p>The basic idea is to detect when you are compiling exactly the same -code a 2nd time and use the previously compiled output. You detect -that it is the same code by forming a hash of: -<p><ul> - <li > the pre-processor output from running the compiler with -E - <li > the command line options - <li > the real compilers size and modification time - <li > any stderr output generated by the compiler -</ul> -<p>These are hashed using md4 (a strong hash) and a cache file is formed -based on that hash result. When the same compilation is done a second -time ccache is able to supply the correct compiler output (including -all warnings etc) from the cache. -<p>ccache has been carefully written to always produce exactly the same -compiler output that you would get without the cache. If you ever -discover a case where ccache changes the output of your compiler then -please let me know. -<p><h2>USING CCACHE WITH DISTCC</h2> - -<p>distcc is a very useful program for distributing compilation across a -range of compiler servers. It is often useful to combine distcc with -ccache, so that compiles that are done are sped up by distcc, but that -ccache avoids the compile completely where possible. -<p>To use distcc with ccache I recommend using the CCACHE_PREFIX -option. You just need to set the environment variable CCACHE_PREFIX to -'distcc' and ccache will prefix the command line used with the -compiler with the command 'distcc'. -<p><h2>SHARING A CACHE</h2> - -<p>A group of developers can increase the cache hit rate by sharing a -cache directory. The hard links however cause unwanted side effects, -as all links to a cached file share the file's modification timestamp. -This results in false dependencies to be triggered by timestamp-based -build systems whenever another user links to an existing -file. Typically, users will see that their libraries and binaries are -relinked without reason. To share a cache without side effects, the -following conditions need to be met: -<p><ul> - <li > Use the same <strong>CCACHE_DIR</strong> environment variable setting - <li > Set the <strong>CCACHE_NOLINK</strong> environment variable - <li > Make sure everyone sets the CCACHE_UMASK environment variable - to 002, this ensures that cached files are accessible to everyone in - the group. - <li > Make sure that all users have write permission in the entire - cache directory (and that you trust all users of the shared cache). - <li > Make sure that the setgid bit is set on all directories in the - cache. This tells the filesystem to inherit group ownership for new - directories. The command "chmod g+s `find $CCACHE_DIR -type d`" might - be useful for this. -</ul> -<p><h2>HISTORY</h2> - -<p>ccache was inspired by the compilercache shell script script written -by Erik Thiele and I would like to thank him for an excellent piece of -work. See -<a href="http://www.erikyyy.de/compilercache/">http://www.erikyyy.de/compilercache/</a> -for the Erik's scripts. -<p>I wrote ccache because I wanted to get a bit more speed out of a -compiler cache and I wanted to remove some of the limitations of the -shell-script version. -<p><h2>DIFFERENCES FROM COMPILERCACHE</h2> - -<p>The biggest differences between Erik's compilercache script and ccache -are: -<ul> -<li > ccache is written in C, which makes it a bit faster (calling out to - external programs is mostly what slowed down the scripts). -<li > ccache can automatically find the real compiler -<li > ccache keeps statistics on hits/misses -<li > ccache can do automatic cache management -<li > ccache can cache compiler output that includes warnings. In many - cases this gives ccache a much higher cache hit rate. -<li > ccache can handle a much wider ranger of compiler options -<li > ccache avoids a double call to cpp on a cache miss -</ul> -<p><h2>BUGS</h2> - -<p>When the cache is stored on an NFS filesystem, the filesystem must be -exported with the <strong>no_subtree_check</strong> option to make renames between -directories reliable. -<p><h2>CREDITS</h2> - -<p>Thanks to the following people for their contributions to ccache -<ul> - <li > Erik Thiele for the original compilercache script - <li > Luciano Rocha for the idea of compiling the pre-processor output - to avoid a 2nd cpp pass - <li > Paul Russell for many suggestions and the debian packaging -</ul> -<p><h2>AUTHOR</h2> - -<p>ccache was written by Andrew Tridgell -<a href="http://samba.org/~tridge/">http://samba.org/~tridge/</a> -<p>If you wish to report a problem or make a suggestion then please email -b...@cc... -<p>ccache is released under the GNU General Public License version 2 or -later. Please see the file COPYING for license details. -</body> -</html> Modified: trunk/Doc/Manual/Makefile =================================================================== --- trunk/Doc/Manual/Makefile 2008-12-09 21:31:31 UTC (rev 10975) +++ trunk/Doc/Manual/Makefile 2008-12-09 21:33:19 UTC (rev 10976) @@ -45,11 +45,13 @@ echo "Sections.html" >> swightml.book cat chapters >> swightml.book -clean: +clean: clean-baks rm -f swightml.book rm -f swigpdf.book rm -f SWIGDocumentation.html rm -f SWIGDocumentation.pdf + +clean-baks: rm -f *.bak test: Modified: trunk/Makefile.in =================================================================== --- trunk/Makefile.in 2008-12-09 21:31:31 UTC (rev 10975) +++ trunk/Makefile.in 2008-12-09 21:33:19 UTC (rev 10976) @@ -35,8 +35,19 @@ maintainer: libfiles @cd $(SOURCE) && $(MAKE) CParse/parser.h -.PHONY: source libfiles maintainer +##################################################################### +# Documentation +##################################################################### +docs: docs-main docs-ccache + +docs-main: + @echo making docs + @test -d $(DOCS) || exit 0; cd $(DOCS) && $(MAKE) all clean-baks + +docs-ccache: + test -z "$(ENABLE_CCACHE)" || (cd $(CCACHE) && $(MAKE) docs) + ##################################################################### # All the languages SWIG speaks (when it wants to) ##################################################################### @@ -353,13 +364,18 @@ clean-%-gifplot: @$(MAKE) -k -s check-$*-gifplot ACTION=clean -clean-docs: - @echo cleaning Docs - @test -d $(DOCS) || exit 0; cd $(DOCS) && $(MAKE) -s clean - clean-ccache: test -z "$(ENABLE_CCACHE)" || (cd $(CCACHE) && $(MAKE) -s clean) +clean-docs: clean-docs-main clean-docs-ccache + +clean-docs-main: + @echo cleaning Docs + @test -d $(DOCS) || exit 0; cd $(DOCS) && $(MAKE) clean + +clean-docs-ccache: + @test -z "$(ENABLE_CCACHE)" || (cd $(CCACHE) && $(MAKE) clean-docs) + maintainer-clean: clean-libfiles @cd $(SOURCE) && $(MAKE) maintainer-clean Modified: trunk/Tools/mkdist.py =================================================================== --- trunk/Tools/mkdist.py 2008-12-09 21:31:31 UTC (rev 10975) +++ trunk/Tools/mkdist.py 2008-12-09 21:33:19 UTC (rev 10976) @@ -61,7 +61,7 @@ # Build documentation print "Building documentation" -os.system("cd "+dirname+"/Doc/Manual && make && rm *.bak") == 0 or failed() +os.system("cd "+dirname+" && make docs") == 0 or failed() # Build the tar-ball os.system("tar -cf "+dirname+".tar "+dirname) == 0 or failed() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2008-12-12 21:55:09
|
Revision: 10981 http://swig.svn.sourceforge.net/swig/?rev=10981&view=rev Author: wsfulton Date: 2008-12-12 21:31:21 +0000 (Fri, 12 Dec 2008) Log Message: ----------- Apply patch from Kalyanov Dmitry which fixes parsing of nested structs containing comments Modified Paths: -------------- trunk/CHANGES.current trunk/Examples/test-suite/common.mk trunk/Examples/test-suite/nested_comment.i trunk/Source/CParse/parser.y Added Paths: ----------- trunk/Examples/test-suite/nested_structs.i Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2008-12-12 21:10:48 UTC (rev 10980) +++ trunk/CHANGES.current 2008-12-12 21:31:21 UTC (rev 10981) @@ -1,6 +1,14 @@ Version 1.3.37 (in progress) ============================ +2008-12-12: wsfulton + Apply patch from Kalyanov Dmitry which fixes parsing of nested structs + containing comments. + +2008-12-12: wsfulton + Fix error message in some nested struct and %inline parsing error situations + such as unterminated strings and comments. + 2008-12-07: olly [PHP] Fix warnings when compiling generated wrapper with GCC 4.3. Modified: trunk/Examples/test-suite/common.mk =================================================================== --- trunk/Examples/test-suite/common.mk 2008-12-12 21:10:48 UTC (rev 10980) +++ trunk/Examples/test-suite/common.mk 2008-12-12 21:31:21 UTC (rev 10981) @@ -79,7 +79,7 @@ extend_variable \ li_std_vector_ptr \ namespace_union \ - nested_comment \ + nested_struct \ overload_complicated \ template_default_pointer \ template_expr @@ -235,6 +235,7 @@ namespace_typemap \ namespace_virtual_method \ naturalvar \ + nested_comment \ newobject1 \ null_pointer \ operator_overload \ Modified: trunk/Examples/test-suite/nested_comment.i =================================================================== --- trunk/Examples/test-suite/nested_comment.i 2008-12-12 21:10:48 UTC (rev 10980) +++ trunk/Examples/test-suite/nested_comment.i 2008-12-12 21:31:21 UTC (rev 10981) @@ -18,24 +18,17 @@ char *name; } n ; } s2; - %} -// bug #491476 +// comment in nested struct %inline %{ -struct { -struct { -int a; -} a, b; -} a; - -%} - -// bug #909387 -%inline %{ -struct foo { - struct happy; // no warning - struct sad { int x; }; // warning - happy *good(); // produces good code - sad *bad(); // produces bad code +struct a +{ + struct { + /*struct*/ + struct { + int b; + } c; + } d; }; +%} Added: trunk/Examples/test-suite/nested_structs.i =================================================================== --- trunk/Examples/test-suite/nested_structs.i (rev 0) +++ trunk/Examples/test-suite/nested_structs.i 2008-12-12 21:31:21 UTC (rev 10981) @@ -0,0 +1,22 @@ +%module nested_structs + +// bug #491476 +%inline %{ +struct { +struct { +int a; +} a, b; +} a; + +%} + +// bug #909387 +%inline %{ +struct foo { + struct happy; // no warning + struct sad { int x; }; // warning + happy *good(); // produces good code + sad *bad(); // produces bad code +}; +%} + Modified: trunk/Source/CParse/parser.y =================================================================== --- trunk/Source/CParse/parser.y 2008-12-12 21:10:48 UTC (rev 10980) +++ trunk/Source/CParse/parser.y 2008-12-12 21:31:21 UTC (rev 10981) @@ -1002,6 +1002,68 @@ } } +/* Strips C-style and C++-style comments from string in-place. */ +static void strip_comments(char *string) { + int state = 0; /* + * 0 - not in comment + * 1 - in c-style comment + * 2 - in c++-style comment + * 3 - in string + * 4 - after reading / not in comments + * 5 - after reading * in c-style comments + * 6 - after reading \ in strings + */ + char * c = string; + while (*c) { + switch (state) { + case 0: + if (*c == '\"') + state = 3; + else if (*c == '/') + state = 4; + break; + case 1: + if (*c == '*') + state = 5; + *c = ' '; + break; + case 2: + if (*c == '\n') + state = 0; + else + *c = ' '; + break; + case 3: + if (*c == '\"') + state = 0; + else if (*c == '\\') + state = 6; + break; + case 4: + if (*c == '/') { + *(c-1) = ' '; + *c = ' '; + state = 2; + } else if (*c == '*') { + *(c-1) = ' '; + *c = ' '; + state = 1; + } else + state = 0; + break; + case 5: + if (*c == '/') + state = 0; + *c = ' '; + break; + case 6: + state = 3; + break; + } + ++c; + } +} + /* Dump all of the nested class declarations to the inline processor * However. We need to do a few name replacements and other munging * first. This function must be called before closing a class! */ @@ -1053,6 +1115,9 @@ ret = retx; */ + /* Strip comments - further code may break in presence of comments. */ + strip_comments(Char(n->code)); + /* Make all SWIG created typedef structs/unions/classes unnamed else redefinition errors occur - nasty hack alert.*/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2008-12-20 01:51:48
|
Revision: 10990 http://swig.svn.sourceforge.net/swig/?rev=10990&view=rev Author: wsfulton Date: 2008-12-20 01:45:11 +0000 (Sat, 20 Dec 2008) Log Message: ----------- Add ccache documentation to main docs Modified Paths: -------------- trunk/CCache/Makefile.in trunk/CCache/ccache.yo trunk/CHANGES.current trunk/Doc/Manual/Makefile trunk/Tools/mkdist.py Modified: trunk/CCache/Makefile.in =================================================================== --- trunk/CCache/Makefile.in 2008-12-19 23:29:00 UTC (rev 10989) +++ trunk/CCache/Makefile.in 2008-12-20 01:45:11 UTC (rev 10990) @@ -27,6 +27,7 @@ all: $(PACKAGE_NAME)$(EXEEXT) +# Note that HTML documentation is actually generated and used from the main SWIG documentation Makefile docs: $(PACKAGE_NAME).1 web/ccache-man.html $(PACKAGE_NAME)$(EXEEXT): $(OBJS) $(HEADERS) Modified: trunk/CCache/ccache.yo =================================================================== --- trunk/CCache/ccache.yo 2008-12-19 23:29:00 UTC (rev 10989) +++ trunk/CCache/ccache.yo 2008-12-20 01:45:11 UTC (rev 10990) @@ -1,6 +1,32 @@ -mailto(swig-devel see: http://www.swig.org/mail.html) +whenman( +COMMENT(html output not great if included when using html2doc) manpage(ccache-swig)(1)()()() +) + +whenhtml(htmlcommand( + +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<html> +<head> +<title>swig-ccache(1) manpage</title> +<link rel="stylesheet" type="text/css" href="style.css"> +</head> + +<body bgcolor="#ffffff"> +<H1><a name="CCache"></a>swig-ccache(1) manpage</H1> +<!-- INDEX --> +<div class="sectiontoc"> +<!-- INDEX --> + +)) + + manpagename(ccache-swig)(a fast compiler cache) + +whenhtml(htmlcommand( +ccache-swig - a fast compiler cache +)) + manpagesynopsis() ccache-swig [OPTION] @@ -380,3 +406,10 @@ ccache is released under the GNU General Public License version 2 or later. Please see the file COPYING for license details. + +whenhtml(htmlcommand( + +</body> +</html> + +)) Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2008-12-19 23:29:00 UTC (rev 10989) +++ trunk/CHANGES.current 2008-12-20 01:45:11 UTC (rev 10990) @@ -1,6 +1,13 @@ Version 1.3.37 (in progress) ============================ +2008-12-20: wsfulton + The ccache compiler cache has been adapted to work with SWIG and + named ccache-swig. It now works with C/C++ compilers as well as SWIG + and can result in impressive speedups when used to recompile unchanged + code with either a C/C++ compiler or SWIG. Documentation is in CCache.html + or the installed ccache-swig man page. + 2008-12-12: wsfulton Apply patch from Kalyanov Dmitry which fixes parsing of nested structs containing comments. Modified: trunk/Doc/Manual/Makefile =================================================================== --- trunk/Doc/Manual/Makefile 2008-12-19 23:29:00 UTC (rev 10989) +++ trunk/Doc/Manual/Makefile 2008-12-20 01:45:11 UTC (rev 10990) @@ -18,15 +18,19 @@ all: maketoc check generate -maketoc: +maketoc: CCache.html python maketoc.py +CCache.html: ../../CCache/ccache.yo + yodl2html -o CCache.html ../../CCache/ccache.yo + # Use htmltidy to warn about some HTML errors. Note that it is not used to clean/tidy the HTML, # it is just used as a primitive HTML checker. +# CCache.html is generated by yodl2html and has a few insignificant problems, so we don't put it through tidy check: tidy -errors --gnu-emacs yes -quiet index.html tidy -errors --gnu-emacs yes -quiet Sections.html - all=`sed '/^#/d' chapters`; for a in $$all; do tidy -errors --gnu-emacs yes -quiet $$a; done; + all=`sed '/^#/d' chapters | grep -v CCache.html`; for a in $$all; do tidy -errors --gnu-emacs yes -quiet $$a; done; generate: swightml.book swigpdf.book htmldoc --batch swightml.book || true @@ -48,6 +52,7 @@ clean: clean-baks rm -f swightml.book rm -f swigpdf.book + rm -f CCache.html rm -f SWIGDocumentation.html rm -f SWIGDocumentation.pdf Modified: trunk/Tools/mkdist.py =================================================================== --- trunk/Tools/mkdist.py 2008-12-19 23:29:00 UTC (rev 10989) +++ trunk/Tools/mkdist.py 2008-12-20 01:45:11 UTC (rev 10990) @@ -57,7 +57,7 @@ # Build documentation print "Building documentation" os.system("cd "+dirname+"/Doc/Manual && make all clean-baks") == 0 or failed() -os.system("cd "+dirname+"/CCache && yodl2man -o swig-ccache.1 ccache.yo && mkdir -p man && yodl2html -o web/ccache-man.html ccache.yo") == 0 or failed() +os.system("cd "+dirname+"/CCache && yodl2man -o swig-ccache.1 ccache.yo") == 0 or failed() # Build the tar-ball os.system("tar -cf "+dirname+".tar "+dirname) == 0 or failed() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2008-12-21 00:29:52
|
Revision: 10994 http://swig.svn.sourceforge.net/swig/?rev=10994&view=rev Author: wsfulton Date: 2008-12-21 00:29:48 +0000 (Sun, 21 Dec 2008) Log Message: ----------- Apply patch #2440046 which fixes possible seg faults for member and global variable char arrays when the strings are larger than the string array size. Modified Paths: -------------- trunk/CHANGES.current trunk/Lib/swig.swg Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2008-12-20 23:59:03 UTC (rev 10993) +++ trunk/CHANGES.current 2008-12-21 00:29:48 UTC (rev 10994) @@ -1,6 +1,10 @@ Version 1.3.37 (in progress) ============================ +2008-12-21: wsfulton + Apply patch #2440046 which fixes possible seg faults for member and global + variable char arrays when the strings are larger than the string array size. + 2008-12-20: wsfulton The ccache compiler cache has been adapted to work with SWIG and named ccache-swig. It now works with C/C++ compilers as well as SWIG Modified: trunk/Lib/swig.swg =================================================================== --- trunk/Lib/swig.swg 2008-12-20 23:59:03 UTC (rev 10993) +++ trunk/Lib/swig.swg 2008-12-21 00:29:48 UTC (rev 10994) @@ -423,13 +423,21 @@ /* Character array handling */ %typemap(memberin) char [ANY] { - if ($input) strncpy((char *)$1, (const char *)$input, $1_dim0); - else $1[0] = 0; + if($input) { + strncpy((char*)$1, (const char *)$input, $1_dim0-1); + $1[$1_dim0-1] = 0; + } else { + $1[0] = 0; + } } %typemap(globalin) char [ANY] { - if ($input) strncpy((char *)$1, (const char *)$input, $1_dim0); - else $1[0] = 0; + if($input) { + strncpy((char*)$1, (const char *)$input, $1_dim0-1); + $1[$1_dim0-1] = 0; + } else { + $1[0] = 0; + } } %typemap(memberin) char [] { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2008-12-22 22:56:36
|
Revision: 10997 http://swig.svn.sourceforge.net/swig/?rev=10997&view=rev Author: wsfulton Date: 2008-12-22 21:43:48 +0000 (Mon, 22 Dec 2008) Log Message: ----------- Fix #2432801 - Make SwigValueWrapper exception safe for when copy constructors throw exceptions Modified Paths: -------------- trunk/CHANGES.current trunk/Lib/swig.swg Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2008-12-21 23:16:56 UTC (rev 10996) +++ trunk/CHANGES.current 2008-12-22 21:43:48 UTC (rev 10997) @@ -1,6 +1,10 @@ Version 1.3.37 (in progress) ============================ +2008-12-22: wsfulton + Fix #2432801 - Make SwigValueWrapper exception safe for when copy constructors + throw exceptions. + 2008-12-21: wsfulton Apply patch #2440046 which fixes possible seg faults for member and global variable char arrays when the strings are larger than the string array size. Modified: trunk/Lib/swig.swg =================================================================== --- trunk/Lib/swig.swg 2008-12-21 23:16:56 UTC (rev 10996) +++ trunk/Lib/swig.swg 2008-12-22 21:43:48 UTC (rev 10997) @@ -647,7 +647,7 @@ SwigValueWrapper(const SwigValueWrapper<T>& rhs) : tt(new T(*rhs.tt)) { } SwigValueWrapper(const T& t) : tt(new T(t)) { } ~SwigValueWrapper() { delete tt; } - SwigValueWrapper& operator=(const T& t) { delete tt; tt = new T(t); return *this; } + SwigValueWrapper& operator=(const T& t) { T *oldtt = tt; tt = 0; delete oldtt; tt = new T(t); return *this; } operator T&() const { return *tt; } T *operator&() { return tt; } private: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2008-12-23 07:45:04
|
Revision: 10998 http://swig.svn.sourceforge.net/swig/?rev=10998&view=rev Author: wsfulton Date: 2008-12-23 07:44:59 +0000 (Tue, 23 Dec 2008) Log Message: ----------- Fix #2153773 - %nojavaexception - disabling and clearing Java checked exceptions Modified Paths: -------------- trunk/CHANGES.current trunk/Doc/Manual/Customization.html trunk/Doc/Manual/Java.html trunk/Examples/test-suite/java/java_throws_runme.java trunk/Examples/test-suite/java_throws.i trunk/Lib/java/java.swg trunk/Source/Modules/java.cxx Modified: trunk/CHANGES.current =================================================================== --- trunk/CHANGES.current 2008-12-22 21:43:48 UTC (rev 10997) +++ trunk/CHANGES.current 2008-12-23 07:44:59 UTC (rev 10998) @@ -1,6 +1,11 @@ Version 1.3.37 (in progress) ============================ +2008-12-23: wsfulton + [Java] Fix #2153773 - %nojavaexception was clearing the exception feature + instead of disabling it. Clearing checked Java exceptions also didn't work. + The new %clearjavaexception can be used for clearing the exception feature. + 2008-12-22: wsfulton Fix #2432801 - Make SwigValueWrapper exception safe for when copy constructors throw exceptions. Modified: trunk/Doc/Manual/Customization.html =================================================================== --- trunk/Doc/Manual/Customization.html 2008-12-22 21:43:48 UTC (rev 10997) +++ trunk/Doc/Manual/Customization.html 2008-12-23 07:44:59 UTC (rev 10998) @@ -1019,6 +1019,20 @@ </pre> </div> +<p> +SWIG provides macros for disabling and clearing features. Many of these can be found in the <tt>swig.swg</tt> library file. +The typical pattern is to define three macros; one to define the feature itself, one to disable the feature and one to clear the feature. +The three macros below show this for the "except" feature: +</p> + +<div class="code"> +<pre> +#define %exception %feature("except") +#define %noexception %feature("except","0") +#define %clearexception %feature("except","") +</pre> +</div> + <H3><a name="Customization_features_default_args"></a>11.3.4 Features and default arguments</H3> Modified: trunk/Doc/Manual/Java.html =================================================================== --- trunk/Doc/Manual/Java.html 2008-12-22 21:43:48 UTC (rev 10997) +++ trunk/Doc/Manual/Java.html 2008-12-23 07:44:59 UTC (rev 10998) @@ -3820,7 +3820,9 @@ In the example above, <tt>java.lang.Exception</tt> is a checked exception class and so ought to be declared in the throws clause of <tt>getitem</tt>. Classes can be specified for adding to the throws clause using <tt>%javaexception(classes)</tt> instead of <tt>%exception</tt>, where <tt>classes</tt> is a string containing one or more comma separated Java classes. -The <tt>%nojavaexception</tt> feature is the equivalent to <tt>%noexception</tt> and clears previously declared exception handlers. +The <tt>%clearjavaexception</tt> feature is the equivalent to <tt>%clearexception</tt> and clears previously declared exception handlers. +The <tt>%nojavaexception</tt> feature is the equivalent to <tt>%noexception</tt> and disables the exception handler. +See <a href="Customization.html#Customization_clearing_features">Clearing features</a> for the difference on disabling and clearing features. </p> <div class="code"> Modified: trunk/Examples/test-suite/java/java_throws_runme.java =================================================================== --- trunk/Examples/test-suite/java/java_throws_runme.java 2008-12-22 21:43:48 UTC (rev 10997) +++ trunk/Examples/test-suite/java/java_throws_runme.java 2008-12-23 07:44:59 UTC (rev 10998) @@ -94,5 +94,20 @@ if (!pass) throw new RuntimeException("Test 7 failed"); + + // Test %nojavaexception + NoExceptTest net = new NoExceptTest(); + + pass = false; + try { + net.exceptionPlease(); + pass = true; + } + catch (MyException e) {} + + if (!pass) + throw new RuntimeException("Test 8 failed"); + + net.noExceptionPlease(); } } Modified: trunk/Examples/test-suite/java_throws.i =================================================================== --- trunk/Examples/test-suite/java_throws.i 2008-12-22 21:43:48 UTC (rev 10997) +++ trunk/Examples/test-suite/java_throws.i 2008-12-23 07:44:59 UTC (rev 10998) @@ -143,3 +143,41 @@ } %} +// Test %nojavaexception +%javaexception("MyException") %{ +/* global exception handler */ +try { + $action +} catch (MyException) { + jclass excep = jenv->FindClass("java_throws/MyException"); + if (excep) + jenv->ThrowNew(excep, "exception message"); + return $null; +} +%} + +%nojavaexception *::noExceptionPlease(); +%nojavaexception NoExceptTest::NoExceptTest(); + +// Need to handle the checked exception in NoExceptTest.delete() +%typemap(javafinalize) SWIGTYPE %{ + protected void finalize() { + try { + delete(); + } catch (MyException e) { + throw new RuntimeException(e); + } + } +%} + +%inline %{ +struct NoExceptTest { + unsigned int noExceptionPlease() { return 123; } + unsigned int exceptionPlease() { return 456; } + ~NoExceptTest() {} +}; +%} + +// Turn global exceptions off (for the implicit destructors) +%nojavaexception; + Modified: trunk/Lib/java/java.swg =================================================================== --- trunk/Lib/java/java.swg 2008-12-22 21:43:48 UTC (rev 10997) +++ trunk/Lib/java/java.swg 2008-12-23 07:44:59 UTC (rev 10998) @@ -1191,7 +1191,8 @@ #define %javaenum(wrapapproach) %feature("java:enum","wrapapproach") #define %javamethodmodifiers %feature("java:methodmodifiers") #define %javaexception(exceptionclasses) %feature("except",throws=exceptionclasses) -#define %nojavaexception %feature("except","",throws="") +#define %nojavaexception %feature("except","0",throws="") +#define %clearjavaexception %feature("except","",throws="") %pragma(java) jniclassclassmodifiers="class" %pragma(java) moduleclassmodifiers="public class" Modified: trunk/Source/Modules/java.cxx =================================================================== --- trunk/Source/Modules/java.cxx 2008-12-22 21:43:48 UTC (rev 10997) +++ trunk/Source/Modules/java.cxx 2008-12-23 07:44:59 UTC (rev 10998) @@ -70,6 +70,7 @@ String *imclass_cppcasts_code; //C++ casts up inheritance hierarchies intermediary class code String *imclass_directors; // Intermediate class director code String *destructor_call; //C++ destructor call if any + String *destructor_throws_clause; //C++ destructor throws clause if any // Director method stuff: List *dmethods_seq; @@ -141,6 +142,7 @@ imclass_cppcasts_code(NULL), imclass_directors(NULL), destructor_call(NULL), + destructor_throws_clause(NULL), dmethods_seq(NULL), dmethods_table(NULL), n_dmethods(0), @@ -1654,7 +1656,7 @@ else Replaceall(destruct, "$jnicall", "throw new UnsupportedOperationException(\"C++ destructor does not have public access\")"); if (*Char(destruct)) - Printv(proxy_class_def, "\n ", destruct_methodmodifiers, " void ", destruct_methodname, "() ", destruct, "\n", NIL); + Printv(proxy_class_def, "\n ", destruct_methodmodifiers, " void ", destruct_methodname, "()", destructor_throws_clause, " ", destruct, "\n", NIL); } /* Insert directordisconnect typemap, if this class has directors enabled */ @@ -1761,6 +1763,7 @@ Clear(proxy_class_code); destructor_call = NewString(""); + destructor_throws_clause = NewString(""); proxy_class_constants_code = NewString(""); } @@ -1819,6 +1822,8 @@ proxy_class_name = NULL; Delete(destructor_call); destructor_call = NULL; + Delete(destructor_throws_clause); + destructor_throws_clause = NULL; Delete(proxy_class_constants_code); proxy_class_constants_code = NULL; } @@ -2336,6 +2341,7 @@ if (proxy_flag) { Printv(destructor_call, imclass_name, ".", Swig_name_destroy(symname), "(swigCPtr)", NIL); + generateThrowsClause(n, destructor_throws_clause); } return SWIG_OK; } @@ -2870,7 +2876,7 @@ String *throws_attribute = NewStringf("%s:throws", attribute); String *throws = Getattr(parameter, throws_attribute); - if (throws) { + if (throws && Len(throws) > 0) { String *throws_list = Getattr(n, "java:throwslist"); if (!throws_list) { throws_list = NewList(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wsf...@us...> - 2008-12-28 20:32:48
|
Revision: 11008 http://swig.svn.sourceforge.net/swig/?rev=11008&view=rev Author: wsfulton Date: 2008-12-28 20:32:44 +0000 (Sun, 28 Dec 2008) Log Message: ----------- Add boost::intrusive_ptr wrappers from Mike Rowbotham Added Paths: ----------- trunk/Examples/test-suite/java/li_boost_intrusive_ptr_runme.java trunk/Examples/test-suite/li_boost_intrusive_ptr.i trunk/Lib/intrusive_ptr.i trunk/Lib/java/boost_intrusive_ptr.i Added: trunk/Examples/test-suite/java/li_boost_intrusive_ptr_runme.java =================================================================== --- trunk/Examples/test-suite/java/li_boost_intrusive_ptr_runme.java (rev 0) +++ trunk/Examples/test-suite/java/li_boost_intrusive_ptr_runme.java 2008-12-28 20:32:44 UTC (rev 11008) @@ -0,0 +1,701 @@ +import li_boost_intrusive_ptr.*; + +public class li_boost_intrusive_ptr_runme { + static { + try { + System.loadLibrary("li_boost_intrusive_ptr"); + } catch (UnsatisfiedLinkError e) { + System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e); + System.exit(1); + } + } + + // Debugging flag + public final static boolean debug = false; + + public static void main(String argv[]) + { + if (debug) + System.out.println("Started"); + + li_boost_intrusive_ptr.setDebug_shared(debug); + + // Change loop count to run for a long time to monitor memory + final int loopCount = 5000; //5000; + for (int i=0; i<loopCount; i++) { + new li_boost_intrusive_ptr_runme().runtest(); + System.gc(); + System.runFinalization(); + try { + if (i%100 == 0) { + java.lang.Thread.sleep(1); // give some time to the lower priority finalizer thread + } + } catch (java.lang.InterruptedException e) { + } + } + + if (debug) + System.out.println("Nearly finished"); + + int countdown = 50; + while (true) { + System.gc(); + System.runFinalization(); + try { + java.lang.Thread.sleep(100); + } catch (java.lang.InterruptedException e) { + } + if (--countdown == 0) + break; + if (Klass.getTotal_count() == 1 && KlassWithoutRefCount.getTotal_count() == 0 && + li_boost_intrusive_ptr.getTotal_IgnoredRefCountingBase_count() == 0 && + KlassDerived.getTotal_count() == 0 && KlassDerivedDerived.getTotal_count() == 1) + // Expect 1 Klass instance - the one global variable (GlobalValue) + break; + }; + if (Klass.getTotal_count() != 1) + throw new RuntimeException("Klass.total_count=" + Klass.getTotal_count()); + if (KlassWithoutRefCount.getTotal_count() != 0) + throw new RuntimeException("KlassWithoutRefCount.total_count=" + KlassWithoutRefCount.getTotal_count()); + if (li_boost_intrusive_ptr.getTotal_IgnoredRefCountingBase_count() != 0) + throw new RuntimeException("IgnoredRefCountingBase.total_count=" + li_boost_intrusive_ptr.getTotal_IgnoredRefCountingBase_count()); + if (KlassDerived.getTotal_count() != 0) + throw new RuntimeException("KlassDerived.total_count=" + KlassDerived.getTotal_count()); + if (KlassDerivedDerived.getTotal_count() != 0) + throw new RuntimeException("KlassDerivedDerived.total_count=" + KlassDerivedDerived.getTotal_count()); + + int wrapper_count = li_boost_intrusive_ptr.intrusive_ptr_wrapper_count(); + if (wrapper_count != li_boost_intrusive_ptr.getNOT_COUNTING()) + if (wrapper_count != 1) // Expect 1 instance - the one global variable (GlobalSmartValue) + throw new RuntimeException("shared_ptr wrapper count=" + wrapper_count); + + if (debug) + System.out.println("Finished"); + } + + private void runtest() { + // simple shared_ptr usage - created in C++ + { + Klass k = new Klass("me oh my"); + String val = k.getValue(); + verifyValue("me oh my", val); + verifyCount(1, k); + } + + // simple shared_ptr usage - not created in C++ + { + Klass k = li_boost_intrusive_ptr.factorycreate(); + String val = k.getValue(); + verifyValue("factorycreate", val); + verifyCount(1, k); + } + + // pass by shared_ptr + { + Klass k = new Klass("me oh my"); + Klass kret = li_boost_intrusive_ptr.smartpointertest(k); + String val = kret.getValue(); + verifyValue("me oh my smartpointertest", val); + verifyCount(1, k); + verifyIntrusiveCount(2, k); + verifyCount(1, kret); + verifyIntrusiveCount(2, kret); + } + + // pass by shared_ptr pointer + { + Klass k = new Klass("me oh my"); + Klass kret = li_boost_intrusive_ptr.smartpointerpointertest(k); + String val = kret.getValue(); + verifyValue("me oh my smartpointerpointertest", val); + verifyCount(1, k); + verifyIntrusiveCount(2, k); + verifyCount(1, kret); + verifyIntrusiveCount(2, kret); + } + + // pass by shared_ptr reference + { + Klass k = new Klass("me oh my"); + Klass kret = li_boost_intrusive_ptr.smartpointerreftest(k); + String val = kret.getValue(); + verifyValue("me oh my smartpointerreftest", val); + verifyCount(1, k); + verifyIntrusiveCount(2, k); + verifyCount(1, kret); + verifyIntrusiveCount(2, kret); + } + + // pass by shared_ptr pointer reference + { + Klass k = new Klass("me oh my"); + Klass kret = li_boost_intrusive_ptr.smartpointerpointerreftest(k); + String val = kret.getValue(); + verifyValue("me oh my smartpointerpointerreftest", val); + verifyCount(1, k); + verifyIntrusiveCount(2, k); + verifyCount(1, kret); + verifyIntrusiveCount(2, kret); + } + + // const pass by shared_ptr + { + Klass k = new Klass("me oh my"); + Klass kret = li_boost_intrusive_ptr.constsmartpointertest(k); + String val = kret.getValue(); + verifyValue("me oh my", val); + verifyCount(1, k); + verifyIntrusiveCount(2, k); + verifyCount(1, kret); + verifyIntrusiveCount(2, kret); + } + + // const pass by shared_ptr pointer + { + Klass k = new Klass("me oh my"); + Klass kret = li_boost_intrusive_ptr.constsmartpointerpointertest(k); + String val = kret.getValue(); + verifyValue("me oh my", val); + verifyCount(1, k); + verifyIntrusiveCount(2, k); + verifyCount(1, kret); + verifyIntrusiveCount(2, kret); + } + + // const pass by shared_ptr reference + { + Klass k = new Klass("me oh my"); + Klass kret = li_boost_intrusive_ptr.constsmartpointerreftest(k); + String val = kret.getValue(); + verifyValue("me oh my", val); + verifyCount(1, k); + verifyIntrusiveCount(2, k); + verifyCount(1, kret); + verifyIntrusiveCount(2, kret); + } + + // pass by value + { + Klass k = new Klass("me oh my"); + Klass kret = li_boost_intrusive_ptr.valuetest(k); + String val = kret.getValue(); + verifyValue("me oh my valuetest", val); + verifyCount(1, k); + verifyCount(1, kret); + } + + // pass by pointer + { + Klass k = new Klass("me oh my"); + Klass kret = li_boost_intrusive_ptr.pointertest(k); + String val = kret.getValue(); + verifyValue("me oh my pointertest", val); + verifyCount(1, k); + verifyCount(1, kret); + } + + // pass by reference + { + Klass k = new Klass("me oh my"); + Klass kret = li_boost_intrusive_ptr.reftest(k); + String val = kret.getValue(); + verifyValue("me oh my reftest", val); + verifyCount(1, k); + verifyCount(1, kret); + } + + // pass by pointer reference + { + Klass k = new Klass("me oh my"); + Klass kret = li_boost_intrusive_ptr.pointerreftest(k); + String val = kret.getValue(); + verifyValue("me oh my pointerreftest", val); + verifyCount(1, k); + verifyCount(1, kret); + } + + // null tests + { + Klass k = null; + + if (li_boost_intrusive_ptr.smartpointertest(k) != null) + throw new RuntimeException("return was not null"); + + if (li_boost_intrusive_ptr.smartpointerpointertest(k) != null) + throw new RuntimeException("return was not null"); + + if (li_boost_intrusive_ptr.smartpointerreftest(k) != null) + throw new RuntimeException("return was not null"); + + if (li_boost_intrusive_ptr.smartpointerpointerreftest(k) != null) + throw new RuntimeException("return was not null"); + + if (!li_boost_intrusive_ptr.nullsmartpointerpointertest(null).equals("null pointer")) + throw new RuntimeException("not null smartpointer pointer"); + + try { li_boost_intrusive_ptr.valuetest(k); throw new RuntimeException("Failed to catch null pointer"); } catch (NullPointerException e) {} + + if (li_boost_intrusive_ptr.pointertest(k) != null) + throw new RuntimeException("return was not null"); + + try { li_boost_intrusive_ptr.reftest(k); throw new RuntimeException("Failed to catch null pointer"); } catch (NullPointerException e) {} + } + + // $owner + { + Klass k = li_boost_intrusive_ptr.pointerownertest(); + String val = k.getValue(); + verifyValue("pointerownertest", val); + verifyCount(1, k); + } + { + Klass k = li_boost_intrusive_ptr.smartpointerpointerownertest(); + String val = k.getValue(); + verifyValue("smartpointerpointerownertest", val); + verifyCount(1, k); + } + + ////////////////////////////////// Derived classes //////////////////////////////////////// + // derived access to base class which cannot be wrapped in an intrusive_ptr + { + KlassWithoutRefCount k = new KlassDerived("me oh my"); + verifyValue("this class cannot be wrapped by intrusive_ptrs but we can still use it", k.getSpecialValueFromUnwrappableClass()); + } + // derived pass by shared_ptr + { + KlassDerived k = new KlassDerived("me oh my"); + KlassDerived kret = li_boost_intrusive_ptr.derivedsmartptrtest(k); + String val = kret.getValue(); + verifyValue("me oh my derivedsmartptrtest-Derived", val); + verifyIntrusiveCount(2, k); + verifyCount(2, k); // includes extra reference for upcast + verifyIntrusiveCount(2, kret); + verifyCount(2, kret); + } + + // derived pass by shared_ptr pointer + { + KlassDerived k = new KlassDerived("me oh my"); + KlassDerived kret = li_boost_intrusive_ptr.derivedsmartptrpointertest(k); + String val = kret.getValue(); + verifyValue("me oh my derivedsmartptrpointertest-Derived", val); + verifyIntrusiveCount(2, k); + verifyCount(2, k); // includes extra reference for upcast + verifyIntrusiveCount(2, kret); + verifyCount(2, kret); + } + // derived pass by shared_ptr ref + { + KlassDerived k = new KlassDerived("me oh my"); + KlassDerived kret = li_boost_intrusive_ptr.derivedsmartptrreftest(k); + String val = kret.getValue(); + verifyValue("me oh my derivedsmartptrreftest-Derived", val); + verifyIntrusiveCount(2, k); + verifyCount(2, k); // includes extra reference for upcast + verifyIntrusiveCount(2, kret); + verifyCount(2, kret); + } + // derived pass by shared_ptr pointer ref + { + KlassDerived k = new KlassDerived("me oh my"); + KlassDerived kret = li_boost_intrusive_ptr.derivedsmartptrpointerreftest(k); + String val = kret.getValue(); + verifyValue("me oh my derivedsmartptrpointerreftest-Derived", val); + verifyIntrusiveCount(2, k); + verifyCount(2, k); // includes extra reference for upcast + verifyIntrusiveCount(2, kret); + verifyCount(2, kret); + } + // derived pass by pointer + { + KlassDerived k = new KlassDerived("me oh my"); + verifyCount(2, k); // includes an extra reference for the upcast in the proxy class + KlassDerived kret = li_boost_intrusive_ptr.derivedpointertest(k); + verifyCount(2, kret); + String val = kret.getValue(); + verifyValue("me oh my derivedpointertest-Derived", val); + verifyIntrusiveCount(1, k); //one shared_ptr has a null deleter + verifyCount(2, k); // includes extra reference for upcast + verifyIntrusiveCount(1, kret); //one shared_ptr has a null deleter + verifyCount(2, kret); + } + // derived pass by ref + { + KlassDerived k = new KlassDerived("me oh my"); + verifyCount(2, k); // includes an extra reference for the upcast in the proxy class + KlassDerived kret = li_boost_intrusive_ptr.derivedreftest(k); + verifyCount(2, kret); + String val = kret.getValue(); + verifyValue("me oh my derivedreftest-Derived", val); + verifyIntrusiveCount(1, k); //one shared_ptr has a null deleter + verifyCount(2, k); // includes extra reference for upcast + verifyIntrusiveCount(1, kret); //one shared_ptr has a null deleter + verifyCount(2, kret); + } + + ////////////////////////////////// Derived and base class mixed //////////////////////////////////////// + // pass by shared_ptr (mixed) + { + KlassDerived k = new KlassDerivedDerived("me oh my"); + KlassDerived kret = li_boost_intrusive_ptr.derivedsmartptrtest(k); + String val = kret.getValue(); + verifyValue("me oh my derivedsmartptrtest-DerivedDerived", val); + verifyIntrusiveCount(2, k); + verifyCount(3, k); // an extra reference for the upcast in the proxy class + verifyIntrusiveCount(2, kret); + verifyCount(2, kret); + } + + // pass by shared_ptr pointer (mixed) + { + KlassDerived k = new KlassDerivedDerived("me oh my"); + KlassDerived kret = li_boost_intrusive_ptr.derivedsmartptrpointertest(k); + String val = kret.getValue(); + verifyValue("me oh my derivedsmartptrpointertest-DerivedDerived", val); + verifyIntrusiveCount(2, k); + verifyCount(3, k); // an extra reference for the upcast in the proxy class + verifyIntrusiveCount(2, kret); + verifyCount(2, kret); + } + + // pass by shared_ptr reference (mixed) + { + KlassDerived k = new KlassDerivedDerived("me oh my"); + KlassDerived kret = li_boost_intrusive_ptr.derivedsmartptrreftest(k); + String val = kret.getValue(); + verifyValue("me oh my derivedsmartptrreftest-DerivedDerived", val); + verifyIntrusiveCount(2, k); + verifyCount(3, k); // an extra reference for the upcast in the proxy class + verifyIntrusiveCount(2, kret); + verifyCount(2, kret); + } + + // pass by shared_ptr pointer reference (mixed) + { + KlassDerived k = new KlassDerivedDerived("me oh my"); + KlassDerived kret = li_boost_intrusive_ptr.derivedsmartptrpointerreftest(k); + String val = kret.getValue(); + verifyValue("me oh my derivedsmartptrpointerreftest-DerivedDerived", val); + verifyIntrusiveCount(2, k); + verifyCount(3, k); // an extra reference for the upcast in the proxy class + verifyIntrusiveCount(2, kret); + verifyCount(2, kret); + } + + // pass by value (mixed) + { + KlassDerived k = new KlassDerivedDerived("me oh my"); + KlassDerived kret = li_boost_intrusive_ptr.derivedvaluetest(k); + String val = kret.getValue(); + verifyValue("me oh my derivedvaluetest-Derived", val); // note slicing + verifyIntrusiveCount(1, k); + verifyCount(3, k); // an extra reference for the upcast in the proxy class + verifyIntrusiveCount(1, kret); + verifyCount(2, kret); + } + + // pass by pointer (mixed) + { + KlassDerived k = new KlassDerivedDerived("me oh my"); + KlassDerived kret = li_boost_intrusive_ptr.derivedpointertest(k); + String val = kret.getValue(); + verifyValue("me oh my derivedpointertest-DerivedDerived", val); + verifyIntrusiveCount(1, k); //one shared_ptr has a null deleter + verifyCount(3, k); // an extra reference for the upcast in the proxy class + verifyIntrusiveCount(1, kret); //one shared_ptr has a null deleter + verifyCount(2, kret); + } + + // pass by ref (mixed) + { + KlassDerived k = new KlassDerivedDerived("me oh my"); + KlassDerived kret = li_boost_intrusive_ptr.derivedreftest(k); + String val = kret.getValue(); + verifyValue("me oh my derivedreftest-DerivedDerived", val); + verifyIntrusiveCount(1, k); //one shared_ptr has a null deleter + verifyCount(3, k); // an extra reference for the upcast in the proxy class + verifyIntrusiveCount(1, kret); //one shared_ptr has a null deleter + verifyCount(2, kret); + } + + ////////////////////////////////// Member variables //////////////////////////////////////// + // smart pointer by value + { + MemberVariables m = new MemberVariables(); + Klass k = new Klass("smart member value"); + m.setSmartMemberValue(k); + String val = k.getValue(); + verifyValue("smart member value", val); + verifyIntrusiveCount(2, k); + verifyCount(1, k); + + Klass kmember = m.getSmartMemberValue(); + val = kmember.getValue(); + verifyValue("smart member value", val); + verifyIntrusiveCount(3, kmember); + verifyIntrusiveCount(3, k); + verifyCount(1, k); + verifyCount(1, kmember); + + m.delete(); + verifyIntrusiveCount(2, kmember); + verifyIntrusiveCount(2, k); + } + + // smart pointer by pointer + { + MemberVariables m = new MemberVariables(); + Klass k = new Klass("smart member pointer"); + m.setSmartMemberPointer(k); + String val = k.getValue(); + verifyValue("smart member pointer", val); + verifyCount(1, k); + verifyIntrusiveCount(2, k); + + Klass kmember = m.getSmartMemberPointer(); + val = kmember.getValue(); + verifyValue("smart member pointer", val); + verifyIntrusiveCount(3, kmember); + verifyCount(1, kmember); + verifyIntrusiveCount(3, k); + verifyCount(1, k); + + m.delete(); + verifyIntrusiveCount(2, kmember); + verifyCount(1, kmember); + verifyIntrusiveCount(2, k); + verifyCount(1, k); + } + // smart pointer by reference + { + MemberVariables m = new MemberVariables(); + Klass k = new Klass("smart member reference"); + m.setSmartMemberReference(k); + String val = k.getValue(); + verifyValue("smart member reference", val); + verifyIntrusiveCount(2, k); + verifyCount(1, k); + + Klass kmember = m.getSmartMemberReference(); + val = kmember.getValue(); + verifyValue("smart member reference", val); + verifyIntrusiveCount(3, kmember); + verifyCount(1, kmember); + verifyIntrusiveCount(3, k); + verifyCount(1, k); + + // The C++ reference refers to SmartMemberValue... + m.setSmartMemberValue(k); + Klass kmemberVal = m.getSmartMemberValue(); + val = kmember.getValue(); + verifyValue("smart member reference", val); + verifyIntrusiveCount(5, kmemberVal); + verifyCount(1, kmemberVal); + verifyIntrusiveCount(5, kmember); + verifyCount(1, kmember); + verifyIntrusiveCount(5, k); + verifyCount(1, k); + + m.delete(); + verifyIntrusiveCount(3, kmemberVal); + verifyCount(1, kmemberVal); + verifyIntrusiveCount(3, kmember); + verifyCount(1, kmember); + verifyIntrusiveCount(3, k); + verifyCount(1, k); + } + + //plain by value + { + MemberVariables m = new MemberVariables(); + Klass k = new Klass("plain member value"); + m.setMemberValue(k); + String val = k.getValue(); + verifyValue("plain member value", val); + verifyCount(1, k); + + Klass kmember = m.getMemberValue(); + val = kmember.getValue(); + verifyValue("plain member value", val); + verifyCount(1, kmember); + verifyCount(1, k); + + m.delete(); + verifyCount(1, kmember); + verifyCount(1, k); + } + //plain by pointer + { + MemberVariables m = new MemberVariables(); + Klass k = new Klass("plain member pointer"); + m.setMemberPointer(k); + String val = k.getValue(); + verifyValue("plain member pointer", val); + verifyCount(1, k); + + Klass kmember = m.getMemberPointer(); + val = kmember.getValue(); + verifyValue("plain member pointer", val); + verifyCount(1, kmember); + verifyCount(1, k); + + m.delete(); + verifyCount(1, kmember); + verifyCount(1, k); + } + //plain by reference + { + MemberVariables m = new MemberVariables(); + Klass k = new Klass("plain member reference"); + m.setMemberReference(k); + String val = k.getValue(); + verifyValue("plain member reference", val); + verifyCount(1, k); + + Klass kmember = m.getMemberReference(); + val = kmember.getValue(); + verifyValue("plain member reference", val); + verifyCount(1, kmember); + verifyCount(1, k); + + m.delete(); + verifyCount(1, kmember); + verifyCount(1, k); + } + //null member variables + { + MemberVariables m = new MemberVariables(); + + // shared_ptr by value + Klass k = m.getSmartMemberValue(); + if (k != null) + throw new RuntimeException("expected null"); + m.setSmartMemberValue(null); + k = m.getSmartMemberValue(); + if (k != null) + throw new RuntimeException("expected null"); + verifyCount(0, k); + + // plain by value + try { m.setMemberValue(null); throw new RuntimeException("Failed to catch null pointer"); } catch (NullPointerException e) {} + } +} +private void toIgnore() { + ////////////////////////////////// Global variables //////////////////////////////////////// + // smart pointer + { + Klass kglobal = li_boost_intrusive_ptr.getGlobalSmartValue(); + if (kglobal != null) + throw new RuntimeException("expected null"); + + Klass k = new Klass("smart global value"); + li_boost_intrusive_ptr.setGlobalSmartValue(k); + verifyIntrusiveCount(2, k); + verifyCount(1, k); + + kglobal = li_boost_intrusive_ptr.getGlobalSmartValue(); + String val = kglobal.getValue(); + verifyValue("smart global value", val); + verifyIntrusiveCount(3, kglobal); + verifyCount(1, kglobal); + verifyIntrusiveCount(3, k); + verifyCount(1, k); + verifyValue("smart global value", li_boost_intrusive_ptr.getGlobalSmartValue().getValue()); + li_boost_intrusive_ptr.setGlobalSmartValue(null); + } + // plain value + { + Klass kglobal; + + Klass k = new Klass("global value"); + li_boost_intrusive_ptr.setGlobalValue(k); + verifyCount(1, k); + + kglobal = li_boost_intrusive_ptr.getGlobalValue(); + String val = kglobal.getValue(); + verifyValue("global value", val); + verifyCount(1, kglobal); + verifyCount(1, k); + verifyValue("global value", li_boost_intrusive_ptr.getGlobalValue().getValue()); + + try { li_boost_intrusive_ptr.setGlobalValue(null); throw new RuntimeException("Failed to catch null pointer"); } catch (NullPointerException e) {} + } + //plain pointer + { + Klass kglobal = li_boost_intrusive_ptr.getGlobalPointer(); + if (kglobal != null) + throw new RuntimeException("expected null"); + + Klass k = new Klass("global pointer"); + li_boost_intrusive_ptr.setGlobalPointer(k); + verifyCount(1, k); + + kglobal = li_boost_intrusive_ptr.getGlobalPointer(); + String val = kglobal.getValue(); + verifyValue("global pointer", val); + verifyCount(1, kglobal); + verifyCount(1, k); + li_boost_intrusive_ptr.setGlobalPointer(null); + } + + // plain reference + { + Klass kglobal; + + Klass k = new Klass("global reference"); + li_boost_intrusive_ptr.setGlobalReference(k); + verifyCount(1, k); + + kglobal = li_boost_intrusive_ptr.getGlobalReference(); + String val = kglobal.getValue(); + verifyValue("global reference", val); + verifyCount(1, kglobal); + verifyCount(1, k); + + try { li_boost_intrusive_ptr.setGlobalReference(null); throw new RuntimeException("Failed to catch null pointer"); } catch (NullPointerException e) {} + } + + ////////////////////////////////// Templates //////////////////////////////////////// + { + PairIntDouble pid = new PairIntDouble(10, 20.2); + if (pid.getBaseVal1() != 20 || pid.getBaseVal2() != 40.4) + throw new RuntimeException("Base values wrong"); + if (pid.getVal1() != 10 || pid.getVal2() != 20.2) + throw new RuntimeException("Derived Values wrong"); + } + } + private void verifyValue(String expected, String got) { + if (!expected.equals(got)) + throw new RuntimeException("verify value failed. Expected: " + expected + " Got: " + got); + } + private void verifyCount(int expected, Klass k) { + int got = li_boost_intrusive_ptr.use_count(k); + if (expected != got) + throw new RuntimeException("verify use_count failed. Expected: " + expected + " Got: " + got); + } + private void verifyCount(int expected, KlassDerived kd) { + int got = li_boost_intrusive_ptr.use_count(kd); + if (expected != got) + throw new RuntimeException("verify use_count failed. Expected: " + expected + " Got: " + got); + } + private void verifyCount(int expected, KlassDerivedDerived kdd) { + int got = li_boost_intrusive_ptr.use_count(kdd); + if (expected != got) + throw new RuntimeException("verify use_count failed. Expected: " + expected + " Got: " + got); + } + private void verifyIntrusiveCount(int expected, Klass k) { + int got = k.use_count(); + if (expected != got) + throw new RuntimeException("verify use_count failed. Expected: " + expected + " Got: " + got); + } + private void verifyIntrusiveCount(int expected, KlassDerived kd) { + int got = kd.use_count(); + if (expected != got) + throw new RuntimeException("verify use_count failed. Expected: " + expected + " Got: " + got); + } + private void verifyIntrusiveCount(int expected, KlassDerivedDerived kdd) { + int got = kdd.use_count(); + if (expected != got) + throw new RuntimeException("verify use_count failed. Expected: " + expected + " Got: " + got); + } +} Added: trunk/Examples/test-suite/li_boost_intrusive_ptr.i =================================================================== --- trunk/Examples/test-suite/li_boost_intrusive_ptr.i (rev 0) +++ trunk/Examples/test-suite/li_boost_intrusive_ptr.i 2008-12-28 20:32:44 UTC (rev 11008) @@ -0,0 +1,492 @@ +// This tests intrusive_ptr is working okay. It also checks that there are no memory leaks in the +// class that intrusive_ptr is pointing via a counting mechanism in the constructors and destructor of Klass. +// In order to test that there are no leaks of the intrusive_ptr class itself (as it is created on the heap) +// the runtime tests can be run for a long time to monitor memory leaks using memory monitor tools +// like 'top'. There is a wrapper for intrusive_ptr in intrusive_ptr_wrapper.h which enables one to +// count the instances of intrusive_ptr. Uncomment the INTRUSIVE_PTR_WRAPPER macro to turn this on. +// +// Also note the debug_shared flag which can be set from the target language. + +%module li_boost_intrusive_ptr + +%warnfilter(SWIGWARN_TYPEMAP_SWIGTYPELEAK); + +%inline %{ +#include "boost/intrusive_ptr.hpp" +#include <boost/detail/atomic_count.hpp> + +// Uncomment macro below to turn on intrusive_ptr memory leak checking as described above +//#define INTRUSIVE_PTR_WRAPPER + +#ifdef INTRUSIVE_PTR_WRAPPER +# include "intrusive_ptr_wrapper.h" +# include "shared_ptr_wrapper.h" +#endif +%} + +%{ +#ifndef INTRUSIVE_PTR_WRAPPER +# define SwigBoost boost +#endif +%} + +%include "std_string.i" +#ifndef INTRUSIVE_PTR_WRAPPER +# define SWIG_INTRUSIVE_PTR_NAMESPACE SwigBoost +#endif + +#if defined(SWIGJAVA) || defined(SWIGCSHARP) || defined(SWIGPYTHON) +#define INTRUSIVE_PTR_WRAPPERS_IMPLEMENTED +#endif + +#if defined(INTRUSIVE_PTR_WRAPPERS_IMPLEMENTED) + +%include <boost_intrusive_ptr.i> +SWIG_INTRUSIVE_PTR(Klass, Space::Klass) +SWIG_INTRUSIVE_PTR_NO_WRAP(KlassWithoutRefCount, Space::KlassWithoutRefCount) +SWIG_INTRUSIVE_PTR_DERIVED(KlassDerived, Space::KlassWithoutRefCount, Space::KlassDerived) +SWIG_INTRUSIVE_PTR_DERIVED(KlassDerivedDerived, Space::KlassDerived, Space::KlassDerivedDerived) + +//For the use_count shared_ptr functions +%typemap(in) SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< Space::Klass > & ($*1_ltype tempnull) %{ + $1 = $input ? *($&1_ltype)&$input : &tempnull; +%} +%typemap (jni) SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< Space::Klass > & "jlong" +%typemap (jtype) SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< Space::Klass > & "long" +%typemap (jstype) SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< Space::Klass > & "Klass" +%typemap(javain) SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< Space::Klass > & "Klass.getCPtr($javainput)" + +%typemap(in) SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< Space::KlassDerived > & ($*1_ltype tempnull) %{ + $1 = $input ? *($&1_ltype)&$input : &tempnull; +%} +%typemap (jni) SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< Space::KlassDerived > & "jlong" +%typemap (jtype) SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< Space::KlassDerived > & "long" +%typemap (jstype) SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< Space::KlassDerived > & "KlassDerived" +%typemap(javain) SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< Space::KlassDerived > & "KlassDerived.getCPtr($javainput)" + +%typemap(in) SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< Space::KlassDerivedDerived > & ($*1_ltype tempnull) %{ + $1 = $input ? *($&1_ltype)&$input : &tempnull; +%} +%typemap (jni) SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< Space::KlassDerivedDerived > & "jlong" +%typemap (jtype) SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< Space::KlassDerivedDerived > & "long" +%typemap (jstype) SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< Space::KlassDerivedDerived > & "KlassDerivedDerived" +%typemap(javain) SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< Space::KlassDerivedDerived > & "KlassDerivedDerived.getCPtr($javainput)" + +#endif + +// TODO: +// const intrusive_ptr +// std::vector +// Add in generic %extend for the Upcast function for derived classes +// Remove proxy upcast method - implement %feature("shadow") ??? which replaces the proxy method + +%exception { + if (debug_shared) { + cout << "++++++" << endl << flush; + cout << "calling $name" << endl << flush; + } + $action + if (debug_shared) { + cout << "------" << endl << flush; + } +} + +%ignore IgnoredRefCountingBase; +%ignore *::operator=; +%ignore intrusive_ptr_add_ref; +%ignore intrusive_ptr_release; +%newobject pointerownertest(); +%newobject smartpointerpointerownertest(); + +%inline %{ +#include <iostream> +using namespace std; + +static bool debug_shared = false; + +namespace Space { + +struct Klass { + Klass() : value("EMPTY"), count(0) { if (debug_shared) cout << "Klass() [" << value << "]" << endl << flush; increment(); } + + Klass(const std::string &val) : value(val), count(0) { if (debug_shared) cout << "Klass(string) [" << value << "]" << endl << flush; increment(); } + + virtual ~Klass() { if (debug_shared) cout << "~Klass() [" << value << "]" << endl << flush; decrement(); } + virtual std::string getValue() const { return value; } + void append(const std::string &s) { value += s; } + Klass(const Klass &other) : value(other.value), count(0) { if (debug_shared) cout << "Klass(const Klass&) [" << value << "]" << endl << flush; increment(); } + + Klass &operator=(const Klass &other) { value = other.value; return *this; } + + void addref(void) const { ++count; } + void release(void) const { if (--count == 0) delete this; } + int use_count(void) const { return count; } + static long getTotal_count() { return total_count; } + +private: + static void increment() { ++total_count; if (debug_shared) cout << " ++xxxxx Klass::increment tot: " << total_count << endl;} + static void decrement() { --total_count; if (debug_shared) cout << " --xxxxx Klass::decrement tot: " << total_count << endl;} + static boost::detail::atomic_count total_count; + std::string value; + int array[1024]; + mutable boost::detail::atomic_count count; +}; + +struct KlassWithoutRefCount { + KlassWithoutRefCount() : value("EMPTY") { if (debug_shared) cout << "KlassWithoutRefCount() [" << value << "]" << endl << flush; increment(); } + + KlassWithoutRefCount(const std::string &val) : value(val) { if (debug_shared) cout << "KlassWithoutRefCount(string) [" << value << "]" << endl << flush; increment(); } + + virtual ~KlassWithoutRefCount() { if (debug_shared) cout << "~KlassWithoutRefCount() [" << value << "]" << endl << flush; decrement(); } + virtual std::string getValue() const { return value; } + void append(const std::string &s) { value += s; } + KlassWithoutRefCount(const KlassWithoutRefCount &other) : value(other.value) { if (debug_shared) cout << "KlassWithoutRefCount(const KlassWithoutRefCount&) [" << value << "]" << endl << flush; increment(); } + std::string getSpecialValueFromUnwrappableClass() { return "this class cannot be wrapped by intrusive_ptrs but we can still use it"; } + KlassWithoutRefCount &operator=(const KlassWithoutRefCount &other) { value = other.value; return *this; } + static long getTotal_count() { return total_count; } + +private: + static void increment() { ++total_count; if (debug_shared) cout << " ++xxxxx KlassWithoutRefCount::increment tot: " << total_count << endl;} + static void decrement() { --total_count; if (debug_shared) cout << " --xxxxx KlassWithoutRefCount::decrement tot: " << total_count << endl;} + static boost::detail::atomic_count total_count; + std::string value; + int array[1024]; +}; + +struct IgnoredRefCountingBase { + IgnoredRefCountingBase() : count(0) { if (debug_shared) cout << "IgnoredRefCountingBase()" << endl << flush; increment(); } + + IgnoredRefCountingBase(const IgnoredRefCountingBase &other) : count(0) { if (debug_shared) cout << "IgnoredRefCountingBase(const IgnoredRefCountingBase&)" << endl << flush; increment(); } + + IgnoredRefCountingBase &operator=(const IgnoredRefCountingBase& other) { + return *this; + } + + virtual ~IgnoredRefCountingBase() { if (debug_shared) cout << "~IgnoredRefCountingBase()" << endl << flush; decrement(); } + + void addref(void) const { ++count; } + void release(void) const { if (--count == 0) delete this; } + int use_count(void) const { return count; } + static long getTotal_count() { return total_count; } + + private: + static void increment() { ++total_count; if (debug_shared) cout << " ++xxxxx IgnoredRefCountingBase::increment tot: " << total_count << endl;} + static void decrement() { --total_count; if (debug_shared) cout << " --xxxxx IgnoredRefCountingBase::decrement tot: " << total_count << endl;} + static boost::detail::atomic_count total_count; + double d; + double e; + mutable boost::detail::atomic_count count; +}; + +long getTotal_IgnoredRefCountingBase_count() { + return IgnoredRefCountingBase::getTotal_count(); +} + +// For most compilers, this use of multiple inheritance results in different derived and base class +// pointer values ... for some more challenging tests :) +struct KlassDerived : IgnoredRefCountingBase, KlassWithoutRefCount { + KlassDerived() : KlassWithoutRefCount() { if (debug_shared) cout << "KlassDerived()" << endl << flush; increment(); } + KlassDerived(const std::string &val) : KlassWithoutRefCount(val) { if (debug_shared) cout << "KlassDerived(string) [" << val << "]" << endl << flush; increment(); } + KlassDerived(const KlassDerived &other) : KlassWithoutRefCount(other) { if (debug_shared) cout << "KlassDerived(const KlassDerived&))" << endl << flush; increment(); } + virtual ~KlassDerived() { if (debug_shared) cout << "~KlassDerived()" << endl << flush; decrement(); } + virtual std::string getValue() const { return KlassWithoutRefCount::getValue() + "-Derived"; } + int use_count(void) const { return IgnoredRefCountingBase::use_count(); } + static long getTotal_count() { return total_count; } + + private: + static void increment() { ++total_count; if (debug_shared) cout << " ++xxxxx KlassDerived::increment tot: " << total_count << endl;} + static void decrement() { --total_count; if (debug_shared) cout << " --xxxxx KlassDerived::decrement tot: " << total_count << endl;} + static boost::detail::atomic_count total_count; +}; +struct KlassDerivedDerived : KlassDerived { + KlassDerivedDerived() : KlassDerived() { if (debug_shared) cout << "KlassDerivedDerived()" << endl << flush; increment(); } + KlassDerivedDerived(const std::string &val) : KlassDerived(val) { if (debug_shared) cout << "KlassDerivedDerived(string) [" << val << "]" << endl << flush; increment(); } + KlassDerivedDerived(const KlassDerived &other) : KlassDerived(other) { if (debug_shared) cout << "KlassDerivedDerived(const KlassDerivedDerived&))" << endl << flush; increment(); } + virtual ~KlassDerivedDerived() { if (debug_shared) cout << "~KlassDerivedDerived()" << endl << flush; decrement(); } + virtual std::string getValue() const { return KlassWithoutRefCount::getValue() + "-DerivedDerived"; } + static long getTotal_count() { return total_count; } + + private: + static void increment() { ++total_count; if (debug_shared) cout << " ++xxxxx KlassDerivedDerived::increment tot: " << total_count << endl;} + static void decrement() { --total_count; if (debug_shared) cout << " --xxxxx KlassDerivedDerived::decrement tot: " << total_count << endl;} + static boost::detail::atomic_count total_count; +}; +KlassDerived* derivedpointertest(KlassDerived* kd) { + if (kd) + kd->append(" derivedpointertest"); + return kd; +} +KlassDerived derivedvaluetest(KlassDerived kd) { + kd.append(" derivedvaluetest"); + return kd; +} +KlassDerived& derivedreftest(KlassDerived& kd) { + kd.append(" derivedreftest"); + return kd; +} +SwigBoost::intrusive_ptr<KlassDerived> derivedsmartptrtest(SwigBoost::intrusive_ptr<KlassDerived> kd) { + if (kd) + kd->append(" derivedsmartptrtest"); + return kd; +} +SwigBoost::intrusive_ptr<KlassDerived>* derivedsmartptrpointertest(SwigBoost::intrusive_ptr<KlassDerived>* kd) { + if (kd && *kd) + (*kd)->append(" derivedsmartptrpointertest"); + return kd; +} +SwigBoost::intrusive_ptr<KlassDerived>* derivedsmartptrreftest(SwigBoost::intrusive_ptr<KlassDerived>* kd) { + if (kd && *kd) + (*kd)->append(" derivedsmartptrreftest"); + return kd; +} +SwigBoost::intrusive_ptr<KlassDerived>*& derivedsmartptrpointerreftest(SwigBoost::intrusive_ptr<KlassDerived>*& kd) { + if (kd && *kd) + (*kd)->append(" derivedsmartptrpointerreftest"); + return kd; +} + +SwigBoost::intrusive_ptr<Klass> factorycreate() { + return SwigBoost::intrusive_ptr<Klass>(new Klass("factorycreate")); +} +// smart pointer +SwigBoost::intrusive_ptr<Klass> smartpointertest(SwigBoost::intrusive_ptr<Klass> k) { + if (k) + k->append(" smartpointertest"); + return SwigBoost::intrusive_ptr<Klass>(k); +} +SwigBoost::intrusive_ptr<Klass>* smartpointerpointertest(SwigBoost::intrusive_ptr<Klass>* k) { + if (k && *k) + (*k)->append(" smartpointerpointertest"); + return k; +} +SwigBoost::intrusive_ptr<Klass>& smartpointerreftest(SwigBoost::intrusive_ptr<Klass>& k) { + if (k) + k->append(" smartpointerreftest"); + return k; +} +SwigBoost::intrusive_ptr<Klass>*& smartpointerpointerreftest(SwigBoost::intrusive_ptr<Klass>*& k) { + if (k && *k) + (*k)->append(" smartpointerpointerreftest"); + return k; +} +// const +SwigBoost::intrusive_ptr<const Klass> constsmartpointertest(SwigBoost::intrusive_ptr<const Klass> k) { + return SwigBoost::intrusive_ptr<const Klass>(k); +} +SwigBoost::intrusive_ptr<const Klass>* constsmartpointerpointertest(SwigBoost::intrusive_ptr<const Klass>* k) { + return k; +} +SwigBoost::intrusive_ptr<const Klass>& constsmartpointerreftest(SwigBoost::intrusive_ptr<const Klass>& k) { + return k; +} +// plain pointer +Klass valuetest(Klass k) { + k.append(" valuetest"); + return k; +} +Klass *pointertest(Klass *k) { + if (k) + k->append(" pointertest"); + return k; +} +Klass& reftest(Klass& k) { + k.append(" reftest"); + return k; +} +Klass*& pointerreftest(Klass*& k) { + k->append(" pointerreftest"); + return k; +} +// null +std::string nullsmartpointerpointertest(SwigBoost::intrusive_ptr<Klass>* k) { + if (k && *k) + return "not null"; + else if (!k) + return "null smartpointer pointer"; + else if (!*k) + return "null pointer"; + else + return "also not null"; +} +// $owner +Klass *pointerownertest() { + return new Klass("pointerownertest"); +} +SwigBoost::intrusive_ptr<Klass>* smartpointerpointerownertest() { + return new SwigBoost::intrusive_ptr<Klass>(new Klass("smartpointerpointerownertest")); +} + +const SwigBoost::intrusive_ptr<Klass>& ref_1() { + static SwigBoost::intrusive_ptr<Klass> sptr; + return sptr; +} + +// overloading tests +std::string overload_rawbyval(int i) { return "int"; } +std::string overload_rawbyval(Klass k) { return "rawbyval"; } + +std::string overload_rawbyref(int i) { return "int"; } +std::string overload_rawbyref(Klass &k) { return "rawbyref"; } + +std::string overload_rawbyptr(int i) { return "int"; } +std::string overload_rawbyptr(Klass *k) { return "rawbyptr"; } + +std::string overload_rawbyptrref(int i) { return "int"; } +std::string overload_rawbyptrref(Klass *&k) { return "rawbyptrref"; } + + + +std::string overload_smartbyval(int i) { return "int"; } +std::string overload_smartbyval(SwigBoost::intrusive_ptr<Klass> k) { return "smartbyval"; } + +std::string overload_smartbyref(int i) { return "int"; } +std::string overload_smartbyref(SwigBoost::intrusive_ptr<Klass> &k) { return "smartbyref"; } + +std::string overload_smartbyptr(int i) { return "int"; } +std::string overload_smartbyptr(SwigBoost::intrusive_ptr<Klass> *k) { return "smartbyptr"; } + +std::string overload_smartbyptrref(int i) { return "int"; } +std::string overload_smartbyptrref(SwigBoost::intrusive_ptr<Klass> *&k) { return "smartbyptrref"; } + +} // namespace Space + +%} +%{ + boost::detail::atomic_count Space::Klass::total_count(0); + boost::detail::atomic_count Space::KlassWithoutRefCount::total_count(0); + boost::detail::atomic_count Space::IgnoredRefCountingBase::total_count(0); + boost::detail::atomic_count Space::KlassDerived::total_count(0); + boost::detail::atomic_count Space::KlassDerivedDerived::total_count(0); +%} + +// Member variables + +%inline %{ +struct MemberVariables { + MemberVariables() : SmartMemberPointer(new SwigBoost::intrusive_ptr<Space::Klass>()), SmartMemberReference(*(new SwigBoost::intrusive_ptr<Space::Klass>())), MemberPointer(0), MemberReference(MemberValue) {} + virtual ~MemberVariables() { + delete SmartMemberPointer; + delete &SmartMemberReference; + } + SwigBoost::intrusive_ptr<Space::Klass> SmartMemberValue; + SwigBoost::intrusive_ptr<Space::Klass> * SmartMemberPointer; + SwigBoost::intrusive_ptr<Space::Klass> & SmartMemberReference; + Space::Klass MemberValue; + Space::Klass * MemberPointer; + Space::Klass & MemberReference; +}; + +// Global variables +SwigBoost::intrusive_ptr<Space::Klass> GlobalSmartValue; +Space::Klass GlobalValue; +Space::Klass * GlobalPointer = 0; +Space::Klass & GlobalReference = GlobalValue; + +%} + +#if defined(INTRUSIVE_PTR_WRAPPERS_IMPLEMENTED) + +// Note: %template after the intrusive_ptr typemaps +SWIG_INTRUSIVE_PTR(BaseIntDouble, Base<int, double>) +// Note: cannot use Base<int, double> in the macro below because of the comma in the type, +// so we use a typedef instead. Alternatively use %arg(Base<int, double>). %arg is defined in swigmacros.swg. +SWIG_INTRUSIVE_PTR_DERIVED(PairIntDouble, BaseIntDouble_t, Pair<int, double>) + +#endif + +// Templates +%inline %{ +template <class T1, class T2> struct Base { + Space::Klass klassBase; + T1 baseVal1; + T2 baseVal2; + Base(T1 t1, T2 t2) : baseVal1(t1*2), baseVal2(t2*2) {} + virtual std::string getValue() const { return "Base<>"; }; + mutable int count; + void addref(void) const { count++; } + void release(void) const { if (--count == 0) delete this; } + int use_count(void) const { return count; } +}; +typedef Base<int, double> BaseIntDouble_t; +%} + +%template(BaseIntDouble) Base<int, double>; + +%inline %{ +template <class T1, class T2> struct Pair : Base<T1, T2> { + Space::Klass klassPair; + T1 val1; + T2 val2; + Pair(T1 t1, T2 t2) : Base<T1, T2>(t1, t2), val1(t1), val2(t2) {} + virtual std::string getValue() const { return "Pair<>"; }; +}; + +Pair<int, double> pair_id2(Pair<int, double> p) { return p; } +SwigBoost::intrusive_ptr< Pair<int, double> > pair_id1(SwigBoost::intrusive_ptr< Pair<int, double> > p) { return p; } + +template<typename T> void intrusive_ptr_add_ref(const T* r) { r->addref(); } + +template<typename T> void intrusive_ptr_release(const T* r) { r->release(); } + +long use_count(const SwigBoost::shared_ptr<Space::Klass>& sptr) { + return sptr.use_count(); +} +long use_count(const SwigBoost::shared_ptr<Space::KlassDerived>& sptr) { + return sptr.use_count(); +} +long use_count(const SwigBoost::shared_ptr<Space::KlassDerivedDerived>& sptr) { + return sptr.use_count(); +} +%} + +%template(PairIntDouble) Pair<int, double>; + +// For counting the instances of intrusive_ptr (all of which are created on the heap) +// intrusive_ptr_wrapper_count() gives overall count +%inline %{ +namespace SwigBoost { + const int NOT_COUNTING = -123456; + int intrusive_ptr_wrapper_count() { + #ifdef INTRUSIVE_PTR_WRAPPER + return SwigBoost::IntrusivePtrWrapper::getTotalCount(); + #else + return NOT_COUNTING; + #endif + } + #ifdef INTRUSIVE_PTR_WRAPPER + template<> std::string show_message(boost::intrusive_ptr<Space::Klass >*t) { + if (!t) + return "null intrusive_ptr!!!"; + if (*t) + return "Klass: " + (*t)->getValue(); + else + return "Klass: NULL"; + } + template<> std::string show_message(boost::intrusive_ptr<const Space::Klass >*t) { + if (!t) + return "null intrusive_ptr!!!"; + if (*t) + return "Klass: " + (*t)->getValue(); + else + return "Klass: NULL"; + } + template<> std::string show_message(boost::intrusive_ptr<Space::KlassDerived >*t) { + if (!t) + return "null intrusive_ptr!!!"; + if (*t) + return "KlassDerived: " + (*t)->getValue(); + else + return "KlassDerived: NULL"; + } + template<> std::string show_message(boost::intrusive_ptr<const Space::KlassDerived >*t) { + if (!t) + return "null intrusive_ptr!!!"; + if (*t) + return "KlassDerived: " + (*t)->getValue(); + else + return "KlassDerived: NULL"; + } + #endif +} +%} + Added: trunk/Lib/intrusive_ptr.i =================================================================== --- trunk/Lib/intrusive_ptr.i (rev 0) +++ trunk/Lib/intrusive_ptr.i 2008-12-28 20:32:44 UTC (rev 11008) @@ -0,0 +1,97 @@ +// intrusive_ptr namespaces could be boost or std or std::tr1 +#if !defined(SWIG_INTRUSIVE_PTR_NAMESPACE) +# define SWIG_INTRUSIVE_PTR_NAMESPACE boost +#endif + +#if defined(SWIG_INTRUSIVE_PTR_SUBNAMESPACE) +# define SWIG_INTRUSIVE_PTR_QNAMESPACE SWIG_INTRUSIVE_PTR_NAMESPACE::SWIG_INTRUSIVE_PTR_SUBNAMESPACE +#else +# define SWIG_INTRUSIVE_PTR_QNAMESPACE SWIG_INTRUSIVE_PTR_NAMESPACE +#endif + +namespace SWIG_INTRUSIVE_PTR_NAMESPACE { +#if defined(SWIG_INTRUSIVE_PTR_SUBNAMESPACE) + namespace SWIG_INTRUSIVE_PTR_SUBNAMESPACE { +#endif + template <class T> class shared_ptr { + }; + + template <class T> class intrusive_ptr { + }; +#if defined(SWIG_INTRUSIVE_PTR_SUBNAMESPACE) + } +#endif +} + +%inline %{ + #include "boost/shared_ptr.hpp" +%} + +%fragment("SWIG_intrusive_deleter", "header") { +template<class T> struct SWIG_intrusive_deleter +{ + void operator()(T * p) + { + if(p) intrusive_ptr_release(p); + } +}; +} + +%fragment("SWIG_null_deleter", "header") { +struct SWIG_null_deleter { + void operator() (void const *) const { + } +}; +%#define SWIG_NO_NULL_DELETER_0 , SWIG_null_deleter() +%#define SWIG_NO_NULL_DELETER_1 +} + +// Main user macro for defining intrusive_ptr typemaps for both const and non-const pointer types +// For plain classes, do not use for derived classes +%define SWIG_INTRUSIVE_PTR(PROXYCLASS, TYPE...) +SWIG_INTRUSIVE_PTR_TYPEMAPS(PROXYCLASS, , TYPE) +SWIG_INTRUSIVE_PTR_TYPEMAPS(PROXYCLASS, const, TYPE) +%enddef + +// Main user macro for defining intrusive_ptr typemaps for both const and non-const pointer types +// For derived classes +%define SWIG_INTRUSIVE_PTR_DERIVED(PROXYCLASS, BASECLASSTYPE, TYPE...) +SWIG_INTRUSIVE_PTR_TYPEMAPS(PROXYCLASS, , TYPE) +SWIG_INTRUSIVE_PTR_TYPEMAPS(PROXYCLASS, const, TYPE) +%types(SWIG_INTRUSIVE_PTR_NAMESPACE::shared_ptr< TYPE > = SWIG_INTRUSIVE_PTR_NAMESPACE::shared_ptr< BASECLASSTYPE >) %{ + *newmemory = SWIG_CAST_NEW_MEMORY; + return (void *) new SWIG_INTRUSIVE_PTR_NAMESPACE::shared_ptr< BASECLASSTYPE >(*(SWIG_INTRUSIVE_PTR_NAMESPACE::shared_ptr< TYPE > *)$from); + %} +%extend TYPE { + static SWIG_INTRUSIVE_PTR_NAMESPACE::shared_ptr< BASECLASSTYPE > SWIGSharedPtrUpcast(SWIG_INTRUSIVE_PTR_NAMESPACE::shared_ptr< TYPE > swigSharedPtrUpcast) { + return swigSharedPtrUpcast; + } +} +%enddef + +// Extra user macro for including classes in intrusive_ptr typemaps for both const and non-const pointer types +// This caters for classes which cannot be wrapped by intrusive_ptrs but are still part of the class hierarchy +// For plain classes, do not use for derived classes +%define SWIG_INTRUSIVE_PTR_NO_WRAP(PROXYCLASS, TYPE...) +SWIG_INTRUSIVE_PTR_TYPEMAPS_NO_WRAP(PROXYCLASS, , TYPE) +SWIG_INTRUSIVE_PTR_TYPEMAPS_NO_WRAP(PROXYCLASS, const, TYPE) +%enddef + +// Extra user macro for including classes in intrusive_ptr typemaps for both const and non-const pointer types +// This caters for classes which cannot be wrapped by intrusive_ptrs but are still part of the class hierarchy +// For derived classes +%define SWIG_INTRUSIVE_PTR_DERIVED_NO_WRAP(PROXYCLASS, BASECLASSTYPE, TYPE...) +SWIG_INTRUSIVE_PTR_TYPEMAPS_NO_WRAP(PROXYCLASS, , TYPE) +SWIG_INTRUSIVE_PTR_TYPEMAPS_NO_WRAP(PROXYCLASS, const, TYPE) +%types(SWIG_INTRUSIVE_PTR_NAMESPACE::shared_ptr< TYPE > = SWIG_INTRUSIVE_PTR_NAMESPACE::shared_ptr< BASECLASSTYPE >) %{ + *newmemory = SWIG_CAST_NEW_MEMORY; + return (void *) new SWIG_INTRUSIVE_PTR_NAMESPACE::shared_ptr< BASECLASSTYPE >(*(SWIG_INTRUSIVE_PTR_NAMESPACE::shared_ptr< TYPE > *)$from); + %} +%extend TYPE { + static SWIG_INTRUSIVE_PTR_NAMESPACE::shared_ptr< BASECLASSTYPE > SWIGSharedPtrUpcast(SWIG_INTRUSIVE_PTR_NAMESPACE::shared_ptr< TYPE > swigSharedPtrUpcast) { + return swigSharedPtrUpcast; + } +} +%enddef + + Added: trunk/Lib/java/boost_intrusive_ptr.i =================================================================== --- trunk/Lib/java/boost_intrusive_ptr.i (rev 0) +++ trunk/Lib/java/boost_intrusive_ptr.i 2008-12-28 20:32:44 UTC (rev 11008) @@ -0,0 +1,456 @@ +%include <intrusive_ptr.i> + +%define SWIG_INTRUSIVE_PTR_TYPEMAPS(PROXYCLASS, CONST, TYPE...) + +%naturalvar TYPE; +%naturalvar SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >; + +// destructor mods +%feature("unref") TYPE "(void)arg1; delete smartarg1;" + + +%typemap(in) CONST TYPE ($&1_type argp = 0, SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ + // plain value + argp = (*(SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0; + if (!argp) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "Attempt to dereference null $1_type"); + return $null; + } + $1 = *argp; +%} +%typemap(out, fragment="SWIG_intrusive_deleter") CONST TYPE %{ + //plain value(out) + $1_ltype* resultp = new $1_ltype(($1_ltype &)$1); + intrusive_ptr_add_ref(resultp); + *(SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(resultp, SWIG_intrusive_deleter< CONST TYPE >()); +%} + +%typemap(in) CONST TYPE * (SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ + // plain pointer + smartarg = *(SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input; + $1 = (TYPE *)(smartarg ? smartarg->get() : 0); +%} +%typemap(out, fragment="SWIG_intrusive_deleter,SWIG_null_deleter") CONST TYPE * %{ + //plain pointer(out) + #if ($owner) + if ($1) { + intrusive_ptr_add_ref($1); + *(SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1, SWIG_intrusive_deleter< CONST TYPE >()); + } else { + *(SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = 0; + } + #else + *(SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = $1 ? new SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; + #endif +%} + +%typemap(in) CONST TYPE & (SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ + // plain reference + $1 = ($1_ltype)((*(SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0); + if(!$1) { + SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "$1_type reference is null"); + return $null; + } +%} +%typemap(out, fragment="SWIG_intrusive_deleter,SWIG_null_deleter") CONST TYPE & %{ + //plain reference(out) + #if ($owner) + if ($1) { + intrusive_ptr_add_ref($1); + *(SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1, SWIG_intrusive_deleter< CONST TYPE >()); + } else { + *(SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = 0; + } + #else + *(SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = $1 ? new SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; + #endif +%} + +%typemap(in) CONST TYPE *& ($*1_ltype temp = 0, SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ + // plain pointer by reference + temp = ((*(SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0); + $1 = &temp; +%} +%typemap(out, fragment="SWIG_intrusive_deleter,SWIG_null_deleter") CONST TYPE *& %{ + // plain pointer by reference(out) + #if ($owner) + if (*$1) { + intrusive_ptr_add_ref(*$1); + *(SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1, SWIG_intrusive_deleter< CONST TYPE >()); + } else { + *(SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = 0; + } + #else + *(SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1 SWIG_NO_NULL_DELETER_0); + #endif +%} + +%typemap(in) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > ($&1_type argp, SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * smartarg) %{ + // intrusive_ptr by value + smartarg = *(SWIG_INTRUSIVE_PTR_NAMESPACE::shared_ptr< CONST TYPE >**)&$input; + if (smartarg) { + $1 = SWIG_INTRUSIVE_PTR_NAMESPACE::intrusive_ptr< CONST TYPE >(smartarg->get(), true); + } +%} +%typemap(out, fragment="SWIG_intrusive_deleter") SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > %{ + if ($1) { + intrusive_ptr_add_ref(result.get()); + *(SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(result.get(), SWIG_intrusive_deleter< CONST TYPE >()); + } else { + *(SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = 0; + } +%} + +%typemap(in) SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< CONST TYPE > swigSharedPtrUpcast ($&1_type smartarg) %{ + // shared_ptr by value + smartarg = *($&1_ltype*)&$input; + if (smartarg) $1 = *smartarg; +%} +%typemap(out) SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< CONST TYPE > ANY_TYPE_SWIGSharedPtrUpcast %{ + *($&1_ltype*)&$result = $1 ? new $1_ltype($1) : 0; +%} + +%typemap(in) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > & ($*1_ltype tempnull, $*1_ltype temp, SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * smartarg) %{ + // intrusive_ptr by reference + if ( $input ) { + smartarg = *(SWIG_INTRUSIVE_PTR_NAMESPACE::shared_ptr< CONST TYPE >**)&$input; + temp = SWIG_INTRUSIVE_PTR_NAMESPACE::intrusive_ptr< CONST TYPE >(smartarg->get(), true); + $1 = &temp; + } else { + $1 = &tempnull; + } +%} +%typemap(memberin) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > & %{ + delete &($1); + if ($self) { + SWIG_INTRUSIVE_PTR_NAMESPACE::intrusive_ptr< CONST TYPE > * temp = new SWIG_INTRUSIVE_PTR_NAMESPACE::intrusive_ptr< CONST TYPE >(*$input); + $1 = *temp; + } +%} +%typemap(out, fragment="SWIG_intrusive_deleter") SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > & %{ + if (*$1) { + intrusive_ptr_add_ref($1->get()); + *(SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1->get(), SWIG_intrusive_deleter< CONST TYPE >()); + } else { + *(SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = 0; + } +%} + +%typemap(in) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > * ($*1_ltype tempnull, $*1_ltype temp, SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * smartarg) %{ + // intrusive_ptr by pointer + if ( $input ) { + smartarg = *(SWIG_INTRUSIVE_PTR_NAMESPACE::shared_ptr< CONST TYPE >**)&$input; + temp = SWIG_INTRUSIVE_PTR_NAMESPACE::intrusive_ptr< CONST TYPE >(smartarg->get(), true); + $1 = &temp; + } else { + $1 = &tempnull; + } +%} +%typemap(memberin) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > * %{ + delete $1; + if ($self) $1 = new SWIG_INTRUSIVE_PTR_NAMESPACE::intrusive_ptr< CONST TYPE >(*$input); +%} +%typemap(out, fragment="SWIG_intrusive_deleter") SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > * %{ + if ($1 && *$1) { + intrusive_ptr_add_ref($1->get()); + *(SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1->get(), SWIG_intrusive_deleter< CONST TYPE >()); + } else { + *(SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = 0; + } + if ($owner) delete $1; +%} + +%typemap(in) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& (SWIG_INTRUSIVE_PTR_NAMESPACE::intrusive_ptr< CONST TYPE > temp, $*1_ltype tempp = 0, SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * smartarg) %{ + // intrusive_ptr by pointer reference + smartarg = *(SWIG_INTRUSIVE_PTR_NAMESPACE::shared_ptr< CONST TYPE >**)&$input; + if ($input) { + temp = SWIG_INTRUSIVE_PTR_NAMESPACE::intrusive_ptr< CONST TYPE >(smartarg->get(), true); + } + tempp = &temp; + $1 = &tempp; +%} +%typemap(memberin) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& %{ + if ($self) $1 = *$input; +%} +%typemap(out, fragment="SWIG_intrusive_deleter") SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& %{ + if (*$1 && **$1) { + intrusive_ptr_add_ref((*$1)->get()); + *(SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< CONST TYPE >((*$1)->get(), SWIG_intrusive_deleter< CONST TYPE >()); + } else { + *(SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = 0; + } +%} + +// various missing typemaps - If ever used (unlikely) ensure compilation error rather than runtime bug +%typemap(in) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ +#error "typemaps for $1_type not available" +%} +%typemap(out) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ +#error "typemaps for $1_type not available" +%} + + +%typemap (jni) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >, + SWIG_INTRUSIVE_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, + ... [truncated message content] |