merge from trunk

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/branches/gsoc2009-sploving@11627 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
Baozeng Ding 2009-08-17 16:29:31 +00:00
commit b6b2fce6ae
103 changed files with 893 additions and 786 deletions

View file

@ -53,7 +53,7 @@ uninstall: $(PACKAGE_NAME)$(EXEEXT) $(PACKAGE_NAME).1
clean: clean:
/bin/rm -f $(OBJS) *~ $(PACKAGE_NAME)$(EXEEXT) /bin/rm -f $(OBJS) *~ $(PACKAGE_NAME)$(EXEEXT)
clean-docs: distclean-docs:
rm -f $(PACKAGE_NAME).1 web/ccache-man.html rm -f $(PACKAGE_NAME).1 web/ccache-man.html
check : test check : test
@ -63,7 +63,7 @@ test: test.sh
check: test check: test
distclean: clean distclean: clean distclean-docs
/bin/rm -f Makefile config.h config.sub config.log build-stamp config.status configure config.h /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 # FIXME: To fix this, test.sh needs to be able to take ccache from the

View file

@ -1,6 +1,57 @@
Version 1.3.40 (in progress) Version 1.3.40 (in progress)
============================ ============================
2009-08-17: olly
[Perl] Add "#undef do_exec" to our clean up of Perl global
namespace pollution.
2009-08-17: olly
[PHP] Fix to wrap a resource returned by __get() in a PHP object (SF#2549217).
2009-08-17: wsfulton
Fix #2797485 After doing a 'make clean', install fails if yodl2man or yodl2html
is not available.
2009-08-16: wsfulton
[Octave] Caught exceptions display the type of the C++ exception instead of the
generic "c++-side threw an exception" message.
2009-08-16: wsfulton
[Java] When %catches is used, fix so that any classes specified in the "throws"
attribute of the "throws" typemap are generated into the Java method's throws clause.
2009-08-16: wsfulton
[C#] Fix exception handling when %catches is used, reported by Juan Manuel Alvarez.
2009-08-15: wsfulton
Fix %template seg fault on some cases of overloading the templated method.
Bug reported by Jan Kupec.
2009-08-15: wsfulton
[Ruby] Add numerous missing wrapped methods for std::vector<bool> specialization
as reported by Youssef Jones.
2009-08-14: wsfulton
[Perl] Add SWIG_ConvertPtrAndOwn() method into the runtime for smart pointer
memory ownership control. shared_ptr support still to be added. Patch from
David Fletcher.
2009-08-14: olly
[PHP] PHP5 now wraps static member variables as documented.
2009-08-14: olly
[PHP] Update the PHP "class" example to work with PHP5 and use
modern wrapping features.
2009-08-13: wsfulton
[PHP] std::vector wrappers overhaul. They no longer require the
specialize_std_vector() macro. Added wrappers for capacity() and reserve().
2009-08-13: wsfulton
[PHP] Add const reference typemaps. const reference primitive types are
now passed by value rather than pointer like the other target languages.
Fixes SF#2524029.
2009-08-08: wsfulton 2009-08-08: wsfulton
[Python] More user friendly AttributeError is raised when there are [Python] More user friendly AttributeError is raised when there are
no constructors generated for the proxy class in the event that the no constructors generated for the proxy class in the event that the
@ -81,6 +132,9 @@ Version 1.3.40 (in progress)
different name to the class, as such constructors can still take different name to the class, as such constructors can still take
parameters. parameters.
2009-07-12: xavier98
[Octave] Add support for Octave 3.2 API
2009-07-05: olly 2009-07-05: olly
[PHP] Update the list of PHP keywords - "cfunction" is no longer a [PHP] Update the list of PHP keywords - "cfunction" is no longer a
keyword in PHP5 and PHP 5.3 added "goto", "namespace", "__DIR__", keyword in PHP5 and PHP 5.3 added "goto", "namespace", "__DIR__",
@ -100,8 +154,8 @@ Version 1.3.40 (in progress)
Fix -Wallkw option as reported by Solomon Gibbs. Fix -Wallkw option as reported by Solomon Gibbs.
2009-07-02: wsfulton 2009-07-02: wsfulton
Fix syntax error when a nested struct contains a comment containing a * followed eventually by a /. Fix syntax error when a nested struct contains a comment containing a * followed
Regression from 1.3.37, reported by Solomon Gibbs. eventually by a /. Regression from 1.3.37, reported by Solomon Gibbs.
2009-07-01: vmiklos 2009-07-01: vmiklos
[PHP] Unknown properties are no longer ignored in proxy [PHP] Unknown properties are no longer ignored in proxy

View file

@ -2173,7 +2173,7 @@ reference to be used as a char ** datatype.
}; };
myav = av_make(len,svs); myav = av_make(len,svs);
free(svs); free(svs);
$result = newRV((SV*)myav); $result = newRV_noinc((SV*)myav);
sv_2mortal($result); sv_2mortal($result);
argvi++; argvi++;
} }

View file

@ -667,7 +667,6 @@ enum boolean {NO=0, YES=1};
enum months {JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, enum months {JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG,
SEP, OCT, NOV, DEC}; SEP, OCT, NOV, DEC};
%constant double BLAH = 42.37; %constant double BLAH = 42.37;
#define F_CONST (double) 5 // A floating pointer constant with cast
#define PI_4 PI/4 #define PI_4 PI/4
#define FLAGS 0x04 | 0x08 | 0x40 #define FLAGS 0x04 | 0x08 | 0x40
@ -706,8 +705,15 @@ the declaration
<p> <p>
defines a constant because <tt>PI</tt> was already defined as a defines a constant because <tt>PI</tt> was already defined as a
constant and the value is known. constant and the value is known.
However, for the same conservative reasons even a constant with a simple cast will be ignored, such as
</p> </p>
<div class="code">
<pre>
#define F_CONST (double) 5 // A floating pointer constant with cast
</pre>
</div>
<p> <p>
The use of constant expressions is allowed, but SWIG does not evaluate The use of constant expressions is allowed, but SWIG does not evaluate
them. Rather, it passes them through to the output file and lets the C them. Rather, it passes them through to the output file and lets the C
@ -2382,6 +2388,10 @@ You can make a <tt>Vector</tt> look a lot like a class by writing a SWIG interfa
<p> <p>
Note the usage of the <tt>$self</tt> special variable. Note the usage of the <tt>$self</tt> special variable.
Its usage is identical to a C++ 'this' pointer and should be used whenever access to the struct instance is required. Its usage is identical to a C++ 'this' pointer and should be used whenever access to the struct instance is required.
Also note that C++ constructor and destructor syntax has been used to simulate a constructor and destructor, even for C code.
There is one subtle difference to a normal C++ constructor implementation though and that is although the constructor declaration
is as per a normal C++ constructor, the newly constructed object must be returned <b>as if</b> the constructor declaration
had a return value, a <tt>Vector *</tt> in this case.
</p> </p>
<p> <p>
@ -2706,6 +2716,10 @@ initialization code (in that order).
</p> </p>
<ul> <ul>
<li><b>Begin section</b>. <br>
A placeholder to put code at the beginning of the C/C++ wrapper file.
</li>
<li><b>Runtime code</b>. <br> <li><b>Runtime code</b>. <br>
This code is internal to SWIG and is used to include This code is internal to SWIG and is used to include
type-checking and other support functions that are used by the rest of the module. type-checking and other support functions that are used by the rest of the module.

View file

@ -1,16 +1,18 @@
# see top-level Makefile.in # see top-level Makefile.in
# (see also top-level configure.in kludge) # (see also top-level configure.in kludge)
callback
class class
constants constants
cpointer cpointer
disown disown
enum enum
extend
funcptr funcptr
overloading overloading
pointer pointer
pragmas pragmas
reference
proxy proxy
reference
simple simple
sync sync
value value

View file

@ -4,7 +4,7 @@ CXXSRCS = example.cxx
TARGET = example TARGET = example
INTERFACE = example.i INTERFACE = example.i
LIBS = LIBS =
SWIGOPT = -noproxy SWIGOPT =
all:: all::
$(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \ $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \

View file

@ -1,22 +1,20 @@
<?php <?php
# This file illustrates the low-level C++ interface # This example illustrates how member variables are wrapped.
# created by SWIG. In this case, all of our C++ classes
# get converted into function calls.
require("example.php"); require("example.php");
# ----- Object creation ----- # ----- Object creation -----
print "Creating some objects:\n"; print "Creating some objects:\n";
$c = new_Circle(10); $c = new Circle(10);
print " Created circle $c\n"; print " Created circle\n";
$s = new_Square(10); $s = new Square(10);
print " Created square $s\n"; print " Created square\n";
# ----- Access a static member ----- # ----- Access a static member -----
print "\nA total of " . nshapes() . " shapes were created\n"; print "\nA total of " . Shape::get_nshapes() . " shapes were created\n";
# ----- Member data access ----- # ----- Member data access -----
@ -24,14 +22,14 @@ print "\nA total of " . nshapes() . " shapes were created\n";
# Note: methods in the base class Shape are used since # Note: methods in the base class Shape are used since
# x and y are defined there. # x and y are defined there.
Shape_x_set($c, 20); $c->x = 20;
Shape_y_set($c, 30); $c->y = 30;
Shape_x_set($s,-10); $s->x = -10;
Shape_y_set($s,5); $s->y = 5;
print "\nHere is their current position:\n"; print "\nHere is their current position:\n";
print " Circle = (" . Shape_x_get($c) . "," . Shape_y_get($c) . ")\n"; print " Circle = ({$c->x},{$c->y})\n";
print " Square = (" . Shape_x_get($s) . "," . Shape_y_get($s) . ")\n"; print " Square = ({$s->x},{$s->y})\n";
# ----- Call some methods ----- # ----- Call some methods -----
@ -39,18 +37,16 @@ print " Square = (" . Shape_x_get($s) . "," . Shape_y_get($s) . ")\n";
# invoke the appropriate virtual method on each object. # invoke the appropriate virtual method on each object.
print "\nHere are some properties of the shapes:\n"; print "\nHere are some properties of the shapes:\n";
foreach (array($c,$s) as $o) { foreach (array($c,$s) as $o) {
print " $o\n"; print " ". get_class($o) . "\n";
print " area = " . Shape_area($o) . "\n"; print " area = {$o->area()}\n";
print " perimeter = " . Shape_perimeter($o) . "\n"; print " perimeter = {$o->perimeter()}\n";
} }
# ----- Delete everything ----- # ----- Delete everything -----
print "\nGuess I'll clean up now\n"; print "\nGuess I'll clean up now\n";
# Note: this invokes the virtual destructor # Note: this invokes the virtual destructor
#delete_Shape($c);
#delete_Shape($s);
$c = NULL; $c = NULL;
$s = NULL; $s = NULL;
@ -58,7 +54,7 @@ $s = NULL;
# the square. # the square.
$o = NULL; $o = NULL;
print nshapes() . " shapes remain\n"; print Shape::get_nshapes() . " shapes remain\n";
print "Goodbye\n"; print "Goodbye\n";
?> ?>

View file

@ -4,7 +4,7 @@ CXXSRCS = example.cxx
TARGET = example TARGET = example
INTERFACE = example.i INTERFACE = example.i
LIBS = LIBS =
SWIGOPT = -noproxy SWIGOPT =
all:: all::
$(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \ $(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \

View file

@ -17,7 +17,7 @@ Vector operator+(const Vector &a, const Vector &b) {
return r; return r;
} }
char *Vector::print() { char *Vector::as_string() {
static char temp[512]; static char temp[512];
sprintf(temp,"Vector %p (%g,%g,%g)", this, x,y,z); sprintf(temp,"Vector %p (%g,%g,%g)", this, x,y,z);
return temp; return temp;
@ -47,4 +47,3 @@ int VectorArray::size() {
printf("VectorArray: size %d self=%p\n",maxsize,this); printf("VectorArray: size %d self=%p\n",maxsize,this);
return maxsize; return maxsize;
} }

View file

@ -7,7 +7,7 @@ public:
Vector() : x(0), y(0), z(0) { }; Vector() : x(0), y(0), z(0) { };
Vector(double x, double y, double z) : x(x), y(y), z(z) { }; Vector(double x, double y, double z) : x(x), y(y), z(z) { };
friend Vector operator+(const Vector &a, const Vector &b); friend Vector operator+(const Vector &a, const Vector &b);
char *print(); char *as_string();
}; };
class VectorArray { class VectorArray {

View file

@ -1,6 +1,10 @@
/* File : example.i */ /* File : example.i */
/* This file has a few "typical" uses of C++ references. */ /* This example has nothing to do with references but the name is used by all
* the other languages so it's hard to rename to something more meaningful.
*
* Mostly it shows how to use %extend.
*/
%module example %module example
@ -12,7 +16,7 @@ class Vector {
public: public:
Vector(double x, double y, double z); Vector(double x, double y, double z);
~Vector(); ~Vector();
char *print(); char *as_string();
}; };
/* This helper function calls an overloaded operator */ /* This helper function calls an overloaded operator */
@ -41,4 +45,3 @@ public:
} }
} }
}; };

View file

@ -1,18 +1,17 @@
<?php <?php
# This file illustrates the manipulation of C++ references in Php. # This file illustrates the manipulation of C++ references in PHP.
# This uses the low-level interface. Proxy classes work differently.
require "example.php"; require "example.php";
# ----- Object creation ----- # ----- Object creation -----
print "Creating some objects:\n"; print "Creating some objects:\n";
$a = new_Vector(3,4,5); $a = new Vector(3, 4, 5);
$b = new_Vector(10,11,12); $b = new Vector(10, 11, 12);
print " Created a: $a " . Vector_print($a) . "\n"; print " Created a: {$a->as_string()}\n";
print " Created b: $b " . Vector_print($b) . "\n"; print " Created b: {$b->as_string()}\n";
# ----- Call an overloaded operator ----- # ----- Call an overloaded operator -----
@ -23,56 +22,28 @@ print " Created b: $b " . Vector_print($b) . "\n";
# It returns a new allocated object. # It returns a new allocated object.
print "Adding a+b\n"; print "Adding a+b\n";
$c = addv($a,$b); $c = example::addv($a, $b);
print " a+b =". Vector_print($c)."\n"; print " a+b ={$c->as_string()}\n";
# Note: Unless we free the result, a memory leak will occur
$c = None;
# ----- Create a vector array ----- # ----- Create a vector array -----
# Note: Using the high-level interface here
print "Creating an array of vectors\n"; print "Creating an array of vectors\n";
$va = new_VectorArray(10); $va = new VectorArray(10);
print " va: $va size=".VectorArray_size($va)."\n"; print " va: size={$va->size()}\n";
# ----- Set some values in the array ----- # ----- Set some values in the array -----
# These operators copy the value of $a and $b to the vector array # These operators copy the value of $a and $b to the vector array
VectorArray_set($va,0,$a); $va->set(0, $a);
VectorArray_set($va,1,$b); $va->set(1, $b);
$va->set(2, addv($a, $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 # Get some values from the array
print "Getting some array values\n"; print "Getting some array values\n";
for ($i = 0; $i < 5; $i++) { for ($i = 0; $i < 5; $i++) {
print "do $i\n"; print " va[$i] = {$va->get($i)->as_string()}\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;
?> ?>

View file

@ -0,0 +1,33 @@
%module catches
%{
#if defined(_MSC_VER)
#pragma warning(disable: 4290) // C++ exception specification ignored except to indicate a function is not __declspec(nothrow)
#endif
%}
%include <exception.i> // for throws(...) typemap
%catches(int, const char *, const ThreeException&) test_catches(int i);
%catches(int, ...) test_exception_specification(int i); // override the exception specification
%catches(...) test_catches_all(int i);
%inline %{
struct ThreeException {};
void test_catches(int i) {
if (i == 1) {
throw int(1);
} else if (i == 2) {
throw (const char *)"two";
} else if (i == 3) {
throw ThreeException();
}
}
void test_exception_specification(int i) throw(int, const char *, const ThreeException&) {
test_catches(i);
}
void test_catches_all(int i) {
test_catches(i);
}
%}

View file

@ -149,6 +149,18 @@ const char global_const_char_array2[sizeof(CPLUSPLUS_MSG)+1] = CPLUSPLUS_MSG;
%inline %{ %inline %{
// char *& tests // char *& tests
char *&GetCharPointerRef() {
static char str[] = CPLUSPLUS_MSG;
static char *ptr = str;
return ptr;
}
bool SetCharPointerRef(char *&str, unsigned int number) {
static char static_str[] = CPLUSPLUS_MSG;
strcpy(static_str, str);
return check(static_str, number);
}
const char *&GetConstCharPointerRef() { const char *&GetConstCharPointerRef() {
static const char str[] = CPLUSPLUS_MSG; static const char str[] = CPLUSPLUS_MSG;
static const char *ptr = str; static const char *ptr = str;

View file

@ -117,6 +117,7 @@ CPP_TEST_CASES += \
arrays_scope \ arrays_scope \
bloody_hell \ bloody_hell \
bools \ bools \
catches \
cast_operator \ cast_operator \
casts \ casts \
char_strings \ char_strings \

View file

@ -0,0 +1,66 @@
using System;
using catchesNamespace;
public class runme {
static void Main() {
// test_catches()
try {
catches.test_catches(1);
throw new Exception("missed exception");
} catch (ApplicationException e) {
if (e.Message != "C++ int exception thrown, value: 1")
throw new ApplicationException("bad exception order: " + e.Message);
}
try {
catches.test_catches(2);
throw new Exception("missed exception");
} catch (ApplicationException e) {
if (e.Message != "two")
throw new ApplicationException("bad exception order: " + e.Message);
}
try {
catches.test_catches(3);
throw new Exception("missed exception");
} catch (ApplicationException e) {
if (e.Message != "C++ ThreeException const & exception thrown")
throw new ApplicationException("bad exception order: " + e.Message);
}
// test_exception_specification()
try {
catches.test_exception_specification(1);
throw new Exception("missed exception");
} catch (ApplicationException e) {
if (e.Message != "C++ int exception thrown, value: 1")
throw new ApplicationException("bad exception order: " + e.Message);
}
try {
catches.test_exception_specification(2);
throw new Exception("missed exception");
} catch (ApplicationException e) {
if (e.Message != "unknown exception")
throw new ApplicationException("bad exception order: " + e.Message);
}
try {
catches.test_exception_specification(3);
throw new Exception("missed exception");
} catch (ApplicationException e) {
if (e.Message != "unknown exception")
throw new ApplicationException("bad exception order: " + e.Message);
}
// test_catches_all()
try {
catches.test_catches_all(1);
throw new Exception("missed exception");
} catch (ApplicationException e) {
if (e.Message != "unknown exception")
throw new ApplicationException("bad exception order: " + e.Message);
}
}
}

View file

@ -120,15 +120,26 @@ public class char_strings_runme {
// char *& tests // char *& tests
for (i=0; i<count; i++) { for (i=0; i<count; i++) {
String str = char_strings.GetConstCharPointerRef(); String str = char_strings.GetCharPointerRef();
if (str != CPLUSPLUS_MSG) if (str != CPLUSPLUS_MSG)
throw new Exception("Test char pointer ref get failed, iteration " + i); throw new Exception("Test char pointer ref get failed, iteration " + i);
} }
for (i=0; i<count; i++) { for (i=0; i<count; i++) {
if (!char_strings.SetConstCharPointerRef(OTHERLAND_MSG + i, i)) if (!char_strings.SetCharPointerRef(OTHERLAND_MSG + i, i))
throw new Exception("Test char pointer ref set failed, iteration " + i); throw new Exception("Test char pointer ref set failed, iteration " + i);
} }
for (i=0; i<count; i++) {
String str = char_strings.GetConstCharPointerRef();
if (str != CPLUSPLUS_MSG)
throw new Exception("Test const char pointer ref get failed, iteration " + i);
}
for (i=0; i<count; i++) {
if (!char_strings.SetConstCharPointerRef(OTHERLAND_MSG + i, i))
throw new Exception("Test const char pointer ref set failed, iteration " + i);
}
} }
} }

View file

@ -0,0 +1,48 @@
using System;
using exception_orderNamespace;
public class runme {
static void Main() {
A a = new A();
try {
a.foo();
throw new Exception("missed exception");
} catch (ApplicationException e) {
if (e.Message != "C++ E1 exception thrown")
throw new ApplicationException("bad exception order: " + e.Message);
}
try {
a.bar();
throw new Exception("missed exception");
} catch (ApplicationException e) {
if (e.Message != "C++ E2 exception thrown")
throw new ApplicationException("bad exception order: " + e.Message);
}
try {
a.foobar();
throw new Exception("missed exception");
} catch (ApplicationException e) {
if (e.Message != "postcatch unknown")
throw new ApplicationException("bad exception order: " + e.Message);
}
try {
a.barfoo(1);
throw new Exception("missed exception");
} catch (ApplicationException e) {
if (e.Message != "C++ E1 exception thrown")
throw new ApplicationException("bad exception order: " + e.Message);
}
try {
a.barfoo(2);
throw new Exception("missed exception");
} catch (ApplicationException e) {
if (e.Message != "C++ E2 * exception thrown")
throw new ApplicationException("bad exception order: " + e.Message);
}
}
}

View file

@ -7,8 +7,8 @@ public class runme
{ {
int f = overload_template.foo(); int f = overload_template.foo();
f += overload_template.max(3,4); f += overload_template.maximum(3,4);
double b = overload_template.max(3.4,5.2); double b = overload_template.maximum(3.4,5.2);
b++; // warning suppression b++; // warning suppression
// mix 1 // mix 1

View file

@ -32,8 +32,14 @@ bar3(foo3 x) {}
enum sad { boo, hoo = 5 }; enum sad { boo, hoo = 5 };
#ifdef __cplusplus /* For Octave and g++ which compiles C test code as C++ */
extern "C" {
#endif
/* Unnamed enum instance */ /* Unnamed enum instance */
enum { globalinstance1, globalinstance2, globalinstance3 = 30 } GlobalInstance; enum { globalinstance1, globalinstance2, globalinstance3 = 30 } GlobalInstance;
#ifdef __cplusplus
}
#endif
/* Anonymous enum */ /* Anonymous enum */
enum { AnonEnum1, AnonEnum2 = 100 }; enum { AnonEnum1, AnonEnum2 = 100 };

View file

@ -127,15 +127,26 @@ public class char_strings_runme {
// char *& tests // char *& tests
for (i=0; i<count; i++) { for (i=0; i<count; i++) {
String str = char_strings.GetConstCharPointerRef(); String str = char_strings.GetCharPointerRef();
if (!str.equals(CPLUSPLUS_MSG)) if (!str.equals(CPLUSPLUS_MSG))
throw new RuntimeException("Test char pointer ref get failed, iteration " + i); throw new RuntimeException("Test char pointer ref get failed, iteration " + i);
} }
for (i=0; i<count; i++) { for (i=0; i<count; i++) {
if (!char_strings.SetConstCharPointerRef(OTHERLAND_MSG + i, i)) if (!char_strings.SetCharPointerRef(OTHERLAND_MSG + i, i))
throw new RuntimeException("Test char pointer ref set failed, iteration " + i); throw new RuntimeException("Test char pointer ref set failed, iteration " + i);
} }
for (i=0; i<count; i++) {
String str = char_strings.GetConstCharPointerRef();
if (!str.equals(CPLUSPLUS_MSG))
throw new RuntimeException("Test const char pointer ref get failed, iteration " + i);
}
for (i=0; i<count; i++) {
if (!char_strings.SetConstCharPointerRef(OTHERLAND_MSG + i, i))
throw new RuntimeException("Test const char pointer ref set failed, iteration " + i);
}
} }
} }

View file

@ -40,6 +40,16 @@ public class java_throws_runme {
if (!pass) if (!pass)
throw new RuntimeException("Test 2 failed"); throw new RuntimeException("Test 2 failed");
// Check the exception class is used with %catches
pass = false;
try {
java_throws.catches_function(100);
}
catch (IllegalAccessException e) { pass = true; }
if (!pass)
throw new RuntimeException("Test 3 failed");
// Check newfree typemap throws attribute // Check newfree typemap throws attribute
try { try {
TestClass tc = java_throws.makeTestClass(); TestClass tc = java_throws.makeTestClass();

View file

@ -16,8 +16,8 @@ public class overload_template_runme {
public static void main(String argv[]) { public static void main(String argv[]) {
int f = overload_template.foo(); int f = overload_template.foo();
int a = overload_template.max(3,4); int a = overload_template.maximum(3,4);
double b = overload_template.max(3.4,5.2); double b = overload_template.maximum(3.4,5.2);
// mix 1 // mix 1
if (overload_template.mix1("hi") != 101) if (overload_template.mix1("hi") != 101)

View file

@ -32,6 +32,13 @@ public class template_methods_runme {
k.KlassTMethodBool(); k.KlassTMethodBool();
b = Klass.KlassStaticTMethodBoolRenamed(true); b = Klass.KlassStaticTMethodBoolRenamed(true);
Klass.KlassStaticTMethodBool(); Klass.KlassStaticTMethodBool();
//
ComponentProperties cp = new ComponentProperties();
cp.adda("key1", "val1", "key2", 22.2);
cp.adda("key1", "val1", "key2", "val2", "key3", "val3");
cp.adda("key1", 1, "key2", 2, "key3", 3);
} }
} }

View file

@ -42,12 +42,16 @@ short full_of_exceptions(int num) {
#if defined(_MSC_VER) #if defined(_MSC_VER)
#pragma warning(disable: 4290) // C++ exception specification ignored except to indicate a function is not __declspec(nothrow) #pragma warning(disable: 4290) // C++ exception specification ignored except to indicate a function is not __declspec(nothrow)
#endif #endif
void throw_spec_function(int value) throw (int) { throw (int)0; } bool throw_spec_function(int value) throw (int) { throw (int)0; }
#if defined(_MSC_VER) #if defined(_MSC_VER)
#pragma warning(default: 4290) // C++ exception specification ignored except to indicate a function is not __declspec(nothrow) #pragma warning(default: 4290) // C++ exception specification ignored except to indicate a function is not __declspec(nothrow)
#endif #endif
%} %}
%catches(int) catches_function(int value);
%inline %{
bool catches_function(int value) { throw (int)0; }
%}
// Check newfree typemap throws attribute // Check newfree typemap throws attribute
%newobject makeTestClass; %newobject makeTestClass;

View file

@ -30,13 +30,13 @@ code is not functioning properly it will fail to compile.
%typemap(in) Animal () %typemap(in) Animal ()
{ {
void *space_needed = malloc(HEIGHT_$1_lextype * WIDTH_$1_lextype); void *space_needed = malloc(HEIGHT_$1_lextype * WIDTH_$1_lextype);
$1 = space_needed; $1 = ($1_ltype)space_needed;
} }
%typemap(in) Animal[2] () %typemap(in) Animal[2] ()
{ {
void *space_needed = malloc(2 * HEIGHT_$1_lextype * WIDTH_$1_lextype); void *space_needed = malloc(2 * HEIGHT_$1_lextype * WIDTH_$1_lextype);
$1 = space_needed; $1 = ($1_ltype)space_needed;
} }
%inline %{ %inline %{

View file

@ -1,2 +1,7 @@
%module li_math %module li_math
#ifdef SWIGPHP
// PHP already provides these functions with the same names, so just kill that
// warning.
%warnfilter(SWIGWARN_PARSE_KEYWORD);
#endif
%include math.i %include math.i

View file

@ -2,12 +2,12 @@ require("import") -- the import fn
import("overload_template") -- import code import("overload_template") -- import code
for k,v in pairs(overload_template) do _G[k]=v end -- move to global for k,v in pairs(overload_template) do _G[k]=v end -- move to global
-- lua has only one numeric type, so max(int,int) and max(double,double) are the same -- lua has only one numeric type, so maximum(int,int) and maximum(double,double) are the same
-- whichever one was wrapper first will be used (which is int) -- whichever one was wrapper first will be used (which is int)
f = foo() f = foo()
a = max(3,4) a = maximum(3,4)
-- mix 1 -- mix 1
assert(mix1("hi") == 101) assert(mix1("hi") == 101)

View file

@ -1,57 +0,0 @@
director_exception
MyFoo=@() subclass(Foo(),
'ping',@(self) raise(NotImplementedError("MyFoo::ping() EXCEPTION")));
MyFoo2=@() subclass(Foo(),
'ping',@(self) true);
ok = 0;
a = MyFoo();
b = launder(a);
try
b.pong();
catch
[etype,e]=raised();
if (etype=="NotImplementedError")
ok=1;
endif
end_try_catch
if (!ok)
error
endif
ok = 0;
a = MyFoo2();
b = launder(a);
try
b.pong();
catch
ok = 1;
end_try_catch
if (!ok)
error
endif
try
raise(Exception2());
catch
if (!strcmp(raised,"Exception2"))
rethrow(lasterr);
endif
end_try_catch
try
raise(Exception1());
catch
if (!strcmp(raised,"Exception1"))
rethrow(lasterr);
endif
end_try_catch

View file

@ -1,56 +0,0 @@
director_finalizer
MyFoo=@() subclass(Foo(),'__del__',@delete_MyFoo);
function delete_MyFoo(self)
self.orStatus(2);
try
Foo.__del__(self);
catch
end_try_catch
endfunction
resetStatus();
a = MyFoo();
clear a;
if (getStatus() != 3)
error
endif
resetStatus();
a = MyFoo();
launder(a);
if (getStatus() != 0)
error
endif
clear a;
if (getStatus() != 3)
error
endif
resetStatus();
a = MyFoo().__disown__();
deleteFoo(a);
if (getStatus() != 3)
error
endif
resetStatus();
a = MyFoo().__disown__();
deleteFoo(launder(a));
if (getStatus() != 3)
error
endif
resetStatus();

View file

@ -1,17 +1,2 @@
empty empty
printf("begin\n");
who global
printf("after load\n");
who global
#clear -g
printf("after clear\n");
who global
#clear empty
printf("after clear specific\n");
who global
printf("before shutdown\n");

View file

@ -6,40 +6,39 @@ a = A();
try try
a.foo() a.foo()
catch catch
if (!strcmp(raised(),"E1")) if (!strcmp(lasterror.message, "error: C++ side threw an exception of type E1\n"))
error, "bad exception order" error("bad exception order")
endif endif
end_try_catch end_try_catch
try try
a.bar() a.bar()
catch catch
if (!strcmp(raised(),"E2")) if (!strcmp(lasterror.message, "error: C++ side threw an exception of type E2\n"))
error, "bad exception order" error("bad exception order")
endif endif
end_try_catch end_try_catch
try try
a.foobar() a.foobar()
catch catch
[t,e]=raised(); if (!strcmp(lasterror.message, "error: postcatch unknown (SWIG_RuntimeError)\n"))
if (!strcmp(e.args(0),"postcatch unknown")) error("bad exception order")
error
endif endif
end_try_catch end_try_catch
try try
a.barfoo(1) a.barfoo(1)
catch catch
if (!strcmp(raised(),"E1")) if (!strcmp(lasterror.message, "error: C++ side threw an exception of type E1\n"))
error, "bad exception order" error("bad exception order")
endif endif
end_try_catch end_try_catch
try try
a.barfoo(2) a.barfoo(2)
catch catch
if (!strcmp(raised(),"E2")) if (!strcmp(lasterror.message, "error: C++ side threw an exception of type E2 *\n"))
error, "bad exception order" error("bad exception order")
endif endif
end_try_catch end_try_catch

View file

@ -1,7 +1,7 @@
# This is the import runtime testcase. # This is the import runtime testcase.
imports_b imports_b;
imports_a imports_a;
x = imports_b.B(); x = imports_b.B();
x.hello(); x.hello();

View file

@ -1,160 +1,11 @@
li_std_vector li_std_vector
iv = IntVector(4); iv = IntVector(4);
for i=0:4, for i=0:3,
iv(i) = i; iv(i) = i;
endfor endfor
x = average(iv); x = average(iv);
y = average([1,2,3,4]);
a = half([10,10.5,11,11.5]); if (x != 1.5)
error("average failed");
dv = DoubleVector(10);
for i=0:10,
dv(i) = i/2.0;
endfor
halve_in_place(dv);
bv = BoolVector(4);
bv(0)= 1;
bv(1)= 0;
bv(2)= 4;
bv(3)= 0;
if (bv(0) != bv(2))
error("bad std::vector<bool> mapping")
endif endif
b = B(5);
va = VecA([b,None,b,b]);
if (va(0).f(1) != 6)
error("bad std::vector<A*> mapping")
endif
if (vecAptr(va) != 6)
error("bad std::vector<A*> mapping")
endif
b.val = 7;
if (va(3).f(1) != 8)
error("bad std::vector<A*> mapping")
endif
ip = PtrInt();
ap = new_ArrInt(10);
ArrInt_setitem(ip,0,123);
ArrInt_setitem(ap,2,123);
vi = IntPtrVector((ip,ap,None));
if (ArrInt_getitem(vi[0],0) != ArrInt_getitem(vi[1],2))
error("bad std::vector<int*> mapping")
endif
delete_ArrInt(ap);
a = halfs([10,8,4,3]);
v = IntVector();
v(0:2) = [1,2];
if (v(0) != 1 || v[1] != 2)
error("bad setslice")
endif
if (v(0:-1)(0) != 1)
error("bad getslice")
endif
if (v(0:-2).size() != 0)
error("bad getslice")
v(0:1) = [2];
if (v(0) != 2)
error("bad setslice")
endif
v(1:) = [3];
if (v(1) != 3)
error("bad setslice")
endif
v(2:) = [3]
if (v(2) != 3)
error("bad setslice")
endif
if (v(0:)(0) != v(0))
error("bad getslice")
endif
v.erase(:)
if (v.size() != 0)
error("bad getslice")
endif
v.erase(:)
if (v.size() != 0)
error("bad getslice")
endif
v = vecStr({"hello ", "world"});
if (v(0) != 'hello world')
error,"bad std::string+std::vector"
endif
pv = pyvector({1, "hello", (1,2)});
if (pv(1) != "hello")
error
endif
iv = IntVector(5);
for i=0:5,
iv(i) = i
endif
iv(1:3) = [];
if (iv(1) != 3)
error
endif
# Overloading checks
if (overloaded1(iv) != "vector<int>")
error
endif
if (overloaded1(dv) != "vector<double>")
error
endif
if (overloaded2(iv) != "vector<int>")
error
endif
if (overloaded2(dv) != "vector<double>")
error
endif
if (overloaded3(iv) != "vector<int> *")
error
endif
if (overloaded3(None) != "vector<int> *")
error
endif
if (overloaded3(100) != "int")
error
endif

View file

@ -1,5 +1,5 @@
multi_import_a multi_import_a;
multi_import_b multi_import_b;
x = multi_import_b.XXX(); x = multi_import_b.XXX();
if (x.testx() != 0) if (x.testx() != 0)

View file

@ -1,8 +1,8 @@
overload_template overload_template
f = foo(); f = foo();
a = max(3,4); a = maximum(3,4);
b = max(3.4,5.2); b = maximum(3.4,5.2);
# mix 1 # mix 1
if (mix1("hi") != 101) if (mix1("hi") != 101)

View file

@ -3,7 +3,7 @@
#ifdef SWIGLUA #ifdef SWIGLUA
// lua only has one numeric type, so most of the overloads shadow each other creating warnings // lua only has one numeric type, so most of the overloads shadow each other creating warnings
%warnfilter(SWIGWARN_LANG_OVERLOAD_SHADOW) foo; %warnfilter(SWIGWARN_LANG_OVERLOAD_SHADOW) foo;
%warnfilter(SWIGWARN_LANG_OVERLOAD_SHADOW) max; %warnfilter(SWIGWARN_LANG_OVERLOAD_SHADOW) maximum;
%warnfilter(SWIGWARN_LANG_OVERLOAD_SHADOW) specialization; %warnfilter(SWIGWARN_LANG_OVERLOAD_SHADOW) specialization;
%warnfilter(SWIGWARN_LANG_OVERLOAD_SHADOW) overload; %warnfilter(SWIGWARN_LANG_OVERLOAD_SHADOW) overload;
%warnfilter(SWIGWARN_LANG_OVERLOAD_SHADOW) space::nsoverload; %warnfilter(SWIGWARN_LANG_OVERLOAD_SHADOW) space::nsoverload;
@ -11,12 +11,6 @@
%warnfilter(SWIGWARN_LANG_OVERLOAD_SHADOW) barT; %warnfilter(SWIGWARN_LANG_OVERLOAD_SHADOW) barT;
#endif #endif
%{
#ifdef max
#undef max
#endif
%}
%inline %{ %inline %{
int foo() { int foo() {
@ -29,15 +23,15 @@ template <class T>
} }
template<class T> template<class T>
T max(T a, T b) { return (a > b) ? a : b; } T maximum(T a, T b) { return (a > b) ? a : b; }
%} %}
%template(foo) foo<int>; %template(foo) foo<int>;
%template(foo) foo<double>; %template(foo) foo<double>;
%template(max) max<int>; %template(maximum) maximum<int>;
%template(max) max<double>; %template(maximum) maximum<double>;
// Mix template overloading with plain function overload // Mix template overloading with plain function overload
// Mix 1 // Mix 1

View file

@ -1,5 +1,4 @@
<?php <?php
// Sample test file
require "tests.php"; require "tests.php";
require "add_link.php"; require "add_link.php";

View file

@ -1,5 +1,4 @@
<?php <?php
// Sample test file
require "tests.php"; require "tests.php";
require "arrayptr.php"; require "arrayptr.php";

View file

@ -1,5 +1,4 @@
<?php <?php
// Sample test file
require "tests.php"; require "tests.php";
require "arrays_global.php"; require "arrays_global.php";

View file

@ -1,5 +1,4 @@
<?php <?php
// Sample test file
require "tests.php"; require "tests.php";
require "arrays_global_twodim.php"; require "arrays_global_twodim.php";

View file

@ -1,5 +1,4 @@
<?php <?php
// Sample test file
require "tests.php"; require "tests.php";
require "arrays.php"; require "arrays.php";

View file

@ -1,5 +1,4 @@
<?php <?php
// Sample test file
require "tests.php"; require "tests.php";
require "arrays_scope.php"; require "arrays_scope.php";

View file

@ -1,5 +1,4 @@
<?php <?php
// Sample test file
require "tests.php"; require "tests.php";
require "casts.php"; require "casts.php";

View file

@ -0,0 +1,43 @@
<?php
require "tests.php";
require "char_strings.php";
$CPLUSPLUS_MSG = "A message from the deep dark world of C++, where anything is possible.";
$OTHERLAND_MSG_10 = "Little message from the safe world.10";
check::equal(GetCharHeapString(), $CPLUSPLUS_MSG, "failed GetCharHeapString");
check::equal(GetConstCharProgramCodeString(), $CPLUSPLUS_MSG, "failed GetConstCharProgramCodeString");
check::equal(GetCharStaticString(), $CPLUSPLUS_MSG, "failed GetCharStaticString");
check::equal(GetCharStaticStringFixed(), $CPLUSPLUS_MSG, "failed GetCharStaticStringFixed");
check::equal(GetConstCharStaticStringFixed(), $CPLUSPLUS_MSG, "failed GetConstCharStaticStringFixed");
check::equal(SetCharHeapString($OTHERLAND_MSG_10, 10), true, "failed GetConstCharStaticStringFixed");
check::equal(SetCharStaticString($OTHERLAND_MSG_10, 10), true, "failed SetCharStaticString");
check::equal(SetCharArrayStaticString($OTHERLAND_MSG_10, 10), true, "failed SetCharArrayStaticString");
check::equal(SetConstCharHeapString($OTHERLAND_MSG_10, 10), true, "failed SetConstCharHeapString");
check::equal(SetConstCharStaticString($OTHERLAND_MSG_10, 10), true, "failed SetConstCharStaticString");
check::equal(SetConstCharArrayStaticString($OTHERLAND_MSG_10, 10), true, "failed SetConstCharArrayStaticString");
check::equal(CharPingPong($OTHERLAND_MSG_10), $OTHERLAND_MSG_10, "failed CharPingPong");
Global_char_set($OTHERLAND_MSG_10);
check::equal(Global_char_get(), $OTHERLAND_MSG_10, "failed Global_char_get");
Global_char_array1_set($OTHERLAND_MSG_10);
check::equal(Global_char_array1_get(), $OTHERLAND_MSG_10, "failed Global_char_array1_get");
Global_char_array2_set($OTHERLAND_MSG_10);
check::equal(Global_char_array2_get(), $OTHERLAND_MSG_10, "failed Global_char_array2_get");
check::equal(Global_const_char_get(), $CPLUSPLUS_MSG, "failed Global_const_char");
check::equal(Global_const_char_array1_get(), $CPLUSPLUS_MSG, "failed Global_const_char_array1");
check::equal(Global_const_char_array2_get(), $CPLUSPLUS_MSG, "failed Global_const_char_array2");
check::equal(GetCharPointerRef(), $CPLUSPLUS_MSG, "failed GetCharPointerRef");
check::equal(SetCharPointerRef($OTHERLAND_MSG_10, 10), true, "failed SetCharPointerRef");
check::equal(GetConstCharPointerRef(), $CPLUSPLUS_MSG, "failed GetConstCharPointerRef");
check::equal(SetConstCharPointerRef($OTHERLAND_MSG_10, 10), true, "failed SetConstCharPointerRef");
check::done();
?>

View file

@ -1,5 +1,4 @@
<?php <?php
// Sample test file
require "tests.php"; require "tests.php";
require "class_ignore.php"; require "class_ignore.php";

View file

@ -1,5 +1,4 @@
<?php <?php
// Sample test file
require "tests.php"; require "tests.php";
require "conversion_namespace.php"; require "conversion_namespace.php";

View file

@ -1,5 +1,4 @@
<?php <?php
// Sample test file
require "tests.php"; require "tests.php";
require "conversion.php"; require "conversion.php";

View file

@ -1,5 +1,4 @@
<?php <?php
// Sample test file
require "tests.php"; require "tests.php";
require "cpp_static.php"; require "cpp_static.php";

View file

@ -1,5 +1,4 @@
<?php <?php
// Sample test file
require "tests.php"; require "tests.php";
require "director_nested.php"; require "director_nested.php";

View file

@ -4,7 +4,7 @@ require "tests.php";
require "director_string.php"; require "director_string.php";
// No new functions // No new functions
check::functions(array(a_get_first,a_call_get_first,a_string_length,a_process_text,a_call_process_func,stringvector_size,stringvector_is_empty,stringvector_clear,stringvector_push,stringvector_pop)); check::functions(array(a_get_first,a_call_get_first,a_string_length,a_process_text,a_call_process_func,stringvector_size,stringvector_is_empty,stringvector_clear,stringvector_push,stringvector_pop,stringvector_capacity,stringvector_reserve));
// No new classes // No new classes
check::classes(array(A,StringVector)); check::classes(array(A,StringVector));
// now new vars // now new vars

View file

@ -1,14 +1,12 @@
<?php <?php
// Sample test file
require "tests.php"; require "tests.php";
require "enum_scope_template.php"; require "enum_scope_template.php";
check::classes(array("enum_scope_template", "TreeInt")); check::classes(array("enum_scope_template", "TreeInt"));
check::functions("chops"); check::functions("chops");
check::equal(0,TreeInt_Oak,"0==TreeInt_Oak"); check::equal(0,TreeInt_Oak,"0==TreeInt_Oak");
check::equal(1,TreeInt_Fir,"0==TreeInt_Fir"); check::equal(1,TreeInt_Fir,"1==TreeInt_Fir");
check::equal(2,TreeInt_Cedar,"0==TreeInt_Cedar"); check::equal(2,TreeInt_Cedar,"2==TreeInt_Cedar");
check::equal(TreeInt_Oak,chops(TreeInt_Oak),"TreeInt_Oak==chops(TreeInt_Oak)"); check::equal(TreeInt_Oak,chops(TreeInt_Oak),"TreeInt_Oak==chops(TreeInt_Oak)");
check::equal(TreeInt_Fir,chops(TreeInt_Fir),"TreeInt_Fir==chops(TreeInt_Fir)"); check::equal(TreeInt_Fir,chops(TreeInt_Fir),"TreeInt_Fir==chops(TreeInt_Fir)");
check::equal(TreeInt_Cedar,chops(TreeInt_Cedar),"TreeInt_Cedar==chops(TreeInt_Cedar)"); check::equal(TreeInt_Cedar,chops(TreeInt_Cedar),"TreeInt_Cedar==chops(TreeInt_Cedar)");

View file

@ -1,5 +1,4 @@
<?php <?php
// Sample test file
require "tests.php"; require "tests.php";
require "evil_diamond_ns.php"; require "evil_diamond_ns.php";

View file

@ -1,5 +1,4 @@
<?php <?php
// Sample test file
require "tests.php"; require "tests.php";
require "evil_diamond_prop.php"; require "evil_diamond_prop.php";

View file

@ -1,5 +1,4 @@
<?php <?php
// Sample test file
require "tests.php"; require "tests.php";
require "evil_diamond.php"; require "evil_diamond.php";

View file

@ -1,5 +1,4 @@
<?php <?php
// Sample test file
require "tests.php"; require "tests.php";
require "extend_template_ns.php"; require "extend_template_ns.php";

View file

@ -1,5 +1,4 @@
<?php <?php
// Sample test file
require "tests.php"; require "tests.php";
require "extend_template.php"; require "extend_template.php";

View file

@ -1,5 +1,4 @@
<?php <?php
// Sample test file
require "tests.php"; require "tests.php";
require "grouping.php"; require "grouping.php";

View file

@ -1,5 +1,4 @@
<?php <?php
// Sample test file
require "tests.php"; require "tests.php";
require "ignore_parameter.php"; require "ignore_parameter.php";

View file

@ -1,14 +1,15 @@
<?php <?php
// Sample test file
require "tests.php"; require "tests.php";
require "li_carrays.php"; require "li_carrays.php";
// No new functions // Check functions.
check::functions(array(new_intarray,delete_intarray,intarray_getitem,intarray_setitem)); check::functions(array(new_intarray,delete_intarray,intarray_getitem,intarray_setitem));
// No new classes
check::classes(array(doubleArray)); // Check classes.
// now new vars // NB An "li_carrays" class is created as a mock namespace.
check::classes(array(li_carrays,doubleArray,AB,XY,XYArray));
// No new global variables.
check::globals(array()); check::globals(array());
$d = new doubleArray(10); $d = new doubleArray(10);

View file

@ -1,5 +1,4 @@
<?php <?php
// Sample test file
require "tests.php"; require "tests.php";
require "li_std_string.php"; require "li_std_string.php";

View file

@ -1,5 +1,4 @@
<?php <?php
// Sample test file
require "tests.php"; require "tests.php";
require "newobject1.php"; require "newobject1.php";

View file

@ -0,0 +1,15 @@
<?php
require "tests.php";
require "pointer_reference.php";
$s = pointer_reference::get();
check::equal($s->value, 10, "pointer_reference::get() failed");
$ss = new Struct(20);
pointer_reference::set($ss);
$i = Struct::instance();
check::equal($i->value, 20, "pointer_reference::set() failed");
check::done();
?>

View file

@ -1,5 +1,4 @@
<?php <?php
// Sample test file
require "tests.php"; require "tests.php";
require "prefix.php"; require "prefix.php";

View file

@ -0,0 +1,25 @@
<?php
require "tests.php";
require "primitive_ref.php";
check::equal(ref_over(3), 3, "ref_over failed");
check::equal(ref_int(3), 3, "ref_int failed");
check::equal(ref_uint(3), 3, "ref_uint failed");
check::equal(ref_short(3), 3, "ref_short failed");
check::equal(ref_ushort(3), 3, "ref_ushort failed");
check::equal(ref_long(3), 3, "ref_long failed");
check::equal(ref_ulong(3), 3, "ref_ulong failed");
check::equal(ref_schar(3), 3, "ref_schar failed");
check::equal(ref_uchar(3), 3, "ref_uchar failed");
check::equal(ref_bool(true), true, "ref_bool failed");
check::equal(ref_float(3.5), 3.5, "ref_float failed");
check::equal(ref_double(3.5), 3.5, "ref_double failed");
check::equal(ref_char('x'), 'x', "ref_char failed");
//check::equal(ref_longlong(0x123456789ABCDEF0), 0x123456789ABCDEF0, "ref_longlong failed");
//check::equal(ref_ulonglong(0xF23456789ABCDEF0), 0xF23456789ABCDEF0, "ref_ulonglong failed");
printf("TODO: long long and unsigned long long const reference typemaps\n");
check::done();
?>

View file

@ -1,15 +1,14 @@
<?php <?php
// Sample test file
require "tests.php"; require "tests.php";
require "rename_scope.php"; require "rename_scope.php";
check::classes(array("rename_scope","Interface_UP","Interface_BP","Natural_UP","Natural_BP","Bucket")); check::classes(array("rename_scope","Interface_UP","Interface_BP","Natural_UP","Natural_BP","Bucket"));
check::classmethods("Interface_UP",array("__construct")); check::classmethods("Interface_UP",array("__construct","__set","__isset","__get"));
check::classmethods("Interface_BP",array("__construct")); check::classmethods("Interface_BP",array("__construct","__set","__isset","__get"));
check::classmethods("Natural_UP",array("__construct","rtest")); check::classmethods("Natural_UP",array("__construct","__set","__isset","__get","rtest"));
check::classmethods("Natural_BP",array("__construct","rtest")); check::classmethods("Natural_BP",array("__construct","__set","__isset","__get","rtest"));
check::classparent("Natural_UP","Interface_UP"); check::classparent("Natural_UP","Interface_UP");
check::classparent("Natural_BP","Interface_BP"); check::classparent("Natural_BP","Interface_BP");

View file

@ -1,12 +1,11 @@
<?php <?php
// Sample test file
require "tests.php"; require "tests.php";
require "smart_pointer_rename.php"; require "smart_pointer_rename.php";
check::classes(array("Foo","Bar")); check::classes(array("Foo","Bar"));
check::classmethods("foo",array("foo","ftest1","ftest2")); check::classmethods("foo",array("ftest1","ftest2","__set","__isset","__get","__construct"));
check::classmethods("bar",array("__deref__","bar","test","ftest1","ftest2")); check::classmethods("bar",array("__deref__","test","ftest1","ftest2","__set","__isset","__get","__construct"));
$foo=new foo(); $foo=new foo();
check::classname("foo",$foo); check::classname("foo",$foo);
$bar=new bar($foo); $bar=new bar($foo);

View file

@ -1,5 +1,4 @@
<?php <?php
// Sample test file
require "tests.php"; require "tests.php";
require "sym.php"; require "sym.php";

View file

@ -1,5 +1,4 @@
<?php <?php
// Sample test file
require "tests.php"; require "tests.php";
require "template_arg_typename.php"; require "template_arg_typename.php";

View file

@ -1,5 +1,4 @@
<?php <?php
// Sample test file
require "tests.php"; require "tests.php";
require "valuewrapper_base.php"; require "valuewrapper_base.php";
@ -7,7 +6,7 @@ require "valuewrapper_base.php";
check::classes(array("valuewrapper_base","Base","Interface_BP")); check::classes(array("valuewrapper_base","Base","Interface_BP"));
check::functions("make_interface_bp"); check::functions("make_interface_bp");
$ibp=make_interface_bp(); $ibp=valuewrapper_base::make_interface_bp();
check::classname("interface_bp",$ibp); check::classname("interface_bp",$ibp);
check::done(); check::done();

View file

@ -1,10 +1,15 @@
%module php_namewarn_rename %module php_namewarn_rename
#ifdef SWIGPHP
%warnfilter(SWIGWARN_PARSE_KEYWORD) Empty();
// FIXME: this doesn't work for me:
%warnfilter(SWIGWARN_PARSE_KEYWORD) stdClass;
%warnfilter(SWIGWARN_PARSE_KEYWORD) Hello::empty();
#endif
%inline %{ %inline %{
void Empty() {}; void Empty() {}
class stdClass class stdClass
{ {
@ -15,6 +20,4 @@
void empty() {} void empty() {}
}; };
%} %}

View file

@ -139,13 +139,13 @@ endif
# Clean: remove the generated .py file # Clean: remove the generated .py file
%.clean: %.clean:
@rm -f hugemod.h hugemod_a.i hugemod_b.i hugemod_a.py hugemod_b.py hugemod_runme.py
@rm -f $*.py; @rm -f $*.py;
@#We only remove the _runme3.py if it is generated by 2to3 from a _runme.py. @#We only remove the _runme3.py if it is generated by 2to3 from a _runme.py.
@if [ -f $(py2_runme) ]; then rm -f $(py3_runme) $(py3_runme).bak; fi @if [ -f $(py2_runme) ]; then rm -f $(py3_runme) $(py3_runme).bak; fi
clean: clean:
$(MAKE) -f $(top_builddir)/$(EXAMPLES)/Makefile python_clean $(MAKE) -f $(top_builddir)/$(EXAMPLES)/Makefile python_clean
rm -f hugemod.h hugemod_a.i hugemod_b.i hugemod_a.py hugemod_b.py hugemod_runme.py
cvsignore: cvsignore:
@echo '*wrap* *.pyc *.so *.dll *.exp *.lib' @echo '*wrap* *.pyc *.so *.dll *.exp *.lib'
@ -168,3 +168,4 @@ hugemod:
$(MAKE) hugemod_b.cpptest $(MAKE) hugemod_b.cpptest
sh -c "time $(PYTHON) $(hugemod_runme)" sh -c "time $(PYTHON) $(hugemod_runme)"
sh -c "time $(PYTHON) $(hugemod_runme)" sh -c "time $(PYTHON) $(hugemod_runme)"

View file

@ -1,8 +1,8 @@
from overload_template import * from overload_template import *
f = foo() f = foo()
a = max(3,4) a = maximum(3,4)
b = max(3.4,5.2) b = maximum(3.4,5.2)
# mix 1 # mix 1
if (mix1("hi") != 101): if (mix1("hi") != 101):

View file

@ -7,7 +7,7 @@
enum Polarization { UnaryPolarization, BinaryPolarization }; enum Polarization { UnaryPolarization, BinaryPolarization };
template <Polarization P> template <Polarization P>
struct Interface struct Interface_
{ {
}; };
} }
@ -15,9 +15,9 @@
namespace oss namespace oss
{ {
// Interface // Interface_
%template(Interface_UP) Interface<UnaryPolarization>; %template(Interface_UP) Interface_<UnaryPolarization>;
%template(Interface_BP) Interface<BinaryPolarization>; %template(Interface_BP) Interface_<BinaryPolarization>;
} }
%inline %inline
@ -27,7 +27,7 @@ namespace oss
namespace interfaces namespace interfaces
{ {
template <Polarization P> template <Polarization P>
struct Natural : Interface<P> struct Natural : Interface_<P>
{ {
int test(void) { return 1; } int test(void) { return 1; }
}; };

View file

@ -98,6 +98,13 @@ sv[1] = Li_std_vector::Struct.new
EOF EOF
bv = BoolVector.new(2)
[true, false, true, true].each { |i| bv.push(i) }
0.upto(bv.size-1) { |i| bv[i] = !bv[i] }
bv_check = [true, true, false, true, false, false]
for i in 0..bv.size-1 do
swig_assert(bv_check[i] == bv[i], binding, "bv[#{i}]")
end
swig_assert_each_line(<<'EOF', binding) swig_assert_each_line(<<'EOF', binding)
lv = LanguageVector.new lv = LanguageVector.new

View file

@ -13,5 +13,5 @@ require 'overload_template'
f = Overload_template.foo() f = Overload_template.foo()
a = Overload_template.max(3,4) a = Overload_template.maximum(3,4)
b = Overload_template.max(3.4,5.2) b = Overload_template.maximum(3.4,5.2)

View file

@ -12,14 +12,14 @@
enum Polarization { UnaryPolarization, BinaryPolarization }; enum Polarization { UnaryPolarization, BinaryPolarization };
template <Polarization P> template <Polarization P>
struct Interface struct Interface_
{ {
}; };
namespace modules namespace modules
{ {
template <class traits, class base = Interface<traits::pmode> > template <class traits, class base = Interface_<traits::pmode> >
// *** problem here **** // *** problem here ****
struct Module : base struct Module : base
{ {
@ -35,7 +35,7 @@
namespace oss namespace oss
{ {
%template(Interface_UP) Interface<UnaryPolarization>; %template(Interface_UP) Interface_<UnaryPolarization>;
namespace modules namespace modules
{ {
%template(Module_etraits) Module<etraits>; %template(Module_etraits) Module<etraits>;

View file

@ -6,7 +6,7 @@
enum Polarization { UnaryPolarization, BinaryPolarization }; enum Polarization { UnaryPolarization, BinaryPolarization };
template <Polarization P> template <Polarization P>
struct Interface struct Interface_
{ {
}; };
@ -21,8 +21,8 @@
namespace oss namespace oss
{ {
%template(Interface_UP) Interface<UnaryPolarization>; %template(Interface_UP) Interface_<UnaryPolarization>;
%template(Module_UPIUP) Module<UnaryPolarization,Interface<UnaryPolarization> >; %template(Module_UPIUP) Module<UnaryPolarization,Interface_<UnaryPolarization> >;
} }
%inline %{ %inline %{
@ -31,16 +31,16 @@ namespace oss
namespace hello namespace hello
{ {
struct HInterface1 : struct HInterface1 :
Interface<oss::UnaryPolarization> // this works (with fullns qualification) Interface_<oss::UnaryPolarization> // this works (with fullns qualification)
{ {
}; };
struct HInterface2 : struct HInterface2 :
Interface<UnaryPolarization> // this doesn't work Interface_<UnaryPolarization> // this doesn't work
{ {
}; };
struct HModule1 : Module<UnaryPolarization, Interface<UnaryPolarization> > { struct HModule1 : Module<UnaryPolarization, Interface_<UnaryPolarization> > {
}; };
} }

View file

@ -9,7 +9,7 @@
enum Polarization { UnaryPolarization, BinaryPolarization }; enum Polarization { UnaryPolarization, BinaryPolarization };
template <Polarization P> template <Polarization P>
struct Interface struct Interface_
{ {
}; };
@ -25,7 +25,7 @@
typedef Traits traits; typedef Traits traits;
static const Polarization P = traits::pmode; static const Polarization P = traits::pmode;
void get(Interface<P> arg) { }; // Here P is only replace by traits::pmode void get(Interface_<P> arg) { }; // Here P is only replace by traits::pmode
}; };
} }
@ -34,6 +34,6 @@
namespace oss namespace oss
{ {
%template(Interface_UP) Interface<UnaryPolarization>; %template(Interface_UP) Interface_<UnaryPolarization>;
%template(Module_UP) Module<etraits>; %template(Module_UP) Module<etraits>;
} }

View file

@ -5,6 +5,8 @@
%warnfilter(SWIGWARN_LANG_TEMPLATE_METHOD_IGNORE) convolve1<float>(); %warnfilter(SWIGWARN_LANG_TEMPLATE_METHOD_IGNORE) convolve1<float>();
%warnfilter(SWIGWARN_LANG_TEMPLATE_METHOD_IGNORE) convolve3<float>(); %warnfilter(SWIGWARN_LANG_TEMPLATE_METHOD_IGNORE) convolve3<float>();
%include <std_string.i>
/////////////////// ///////////////////
%ignore convolve1<float>(float a); %ignore convolve1<float>(float a);
@ -76,3 +78,23 @@ struct Klass {
%template(KlassTMethodBool) Klass::tmethod<bool>; %template(KlassTMethodBool) Klass::tmethod<bool>;
%template(KlassStaticTMethodBool) Klass::statictmethod<bool>; %template(KlassStaticTMethodBool) Klass::statictmethod<bool>;
////////////////////////////////////////////////////////////////////////////
%inline %{
class ComponentProperties{
public:
ComponentProperties() {}
~ComponentProperties() {}
template <typename T1> void adda(std::string key, T1 val) {}
template <typename T1, typename T2> void adda(std::string key1, T1 val1, std::string key2, T2 val2) {}
template <typename T1, typename T2, typename T3> void adda(std::string key1, T1 val1, std::string key2, T2 val2, std::string key3, T3 val3) {}
};
%}
%extend ComponentProperties {
%template(adda) adda<std::string, double>;
%template(adda) adda<std::string, std::string, std::string>; // ERROR OCCURS HERE
%template(adda) adda<int, int, int>;
}

View file

@ -8,13 +8,13 @@
}; };
template <class ArgType, class ResType> template <class ArgType, class ResType>
struct Function struct Function_
{ {
char *test() { return (char *) "test"; } char *test() { return (char *) "test"; }
}; };
template <class AF, class RF> template <class AF, class RF>
struct ArithFunction : Function<AF, RF> struct ArithFunction : Function_<AF, RF>
{ {
}; };
@ -40,7 +40,7 @@
}; };
template <class AF, class RF> template <class AF, class RF>
class Class : public ArithFunction< typename traits<AF, RF>::arg_type, class Class_ : public ArithFunction< typename traits<AF, RF>::arg_type,
typename traits<AF, RF>::res_type > typename traits<AF, RF>::res_type >
{ {
}; };
@ -49,7 +49,7 @@
typename traits<AF, RF>::base typename traits<AF, RF>::base
make_Class() make_Class()
{ {
return Class<AF, RF>(); return Class_<AF, RF>();
} }
@ -58,9 +58,9 @@
%{ %{
namespace hello { namespace hello {
template struct Function <Double, Double>; template struct Function_ <Double, Double>;
template struct ArithFunction <Double, Double>; template struct ArithFunction <Double, Double>;
template class Class <Double, Double>; template class Class_ <Double, Double>;
} }
%} %}
@ -69,9 +69,9 @@
// This complains only when using a namespace // This complains only when using a namespace
// //
%template() traits<Double,Double>; %template() traits<Double,Double>;
%template(Function_DD) Function <Double, Double>; %template(Function_DD) Function_ <Double, Double>;
%template(ArithFunction_DD) ArithFunction <Double, Double>; %template(ArithFunction_DD) ArithFunction <Double, Double>;
%template(Class_DD) Class <Double, Double>; %template(Class_DD) Class_ <Double, Double>;
%template(make_Class_DD) make_Class <Double, Double>; %template(make_Class_DD) make_Class <Double, Double>;
} }

View file

@ -10,9 +10,9 @@
}; };
template <Polarization P> template <Polarization P>
struct Interface : Base struct Interface_ : Base
{ {
Interface(const Base& b) { }; Interface_(const Base& b) { };
}; };
template <class Result> template <class Result>
@ -23,6 +23,6 @@
namespace oss namespace oss
{ {
// Interface // Interface
%template(Interface_BP) Interface<BinaryPolarization>; %template(Interface_BP) Interface_<BinaryPolarization>;
%template(make_Interface_BP) make<Interface<BinaryPolarization> >; %template(make_Interface_BP) make<Interface_<BinaryPolarization> >;
} }

View file

@ -262,9 +262,15 @@ SWIGINTERN void SWIG_CSharpException(int code, const char *msg) {
/* rethrow the unknown exception */ /* rethrow the unknown exception */
#ifdef SWIGCSHARP
%typemap(throws,noblock=1, canthrow=1) (...) {
SWIG_exception(SWIG_RuntimeError,"unknown exception");
}
#else
%typemap(throws,noblock=1) (...) { %typemap(throws,noblock=1) (...) {
SWIG_exception(SWIG_RuntimeError,"unknown exception"); SWIG_exception(SWIG_RuntimeError,"unknown exception");
} }
#endif
#endif /* __cplusplus */ #endif /* __cplusplus */

View file

@ -1,4 +1,26 @@
#if OCTAVE_API_VERSION_OPTION>0
#define USE_OCTAVE_API_VERSION OCTAVE_API_VERSION_OPTION
#else
#include <octave/version.h>
#ifdef OCTAVE_API_VERSION_N
#define USE_OCTAVE_API_VERSION OCTAVE_API_VERSION_N
#else // Interim hack to distinguish between Octave 3.2 and earlier versions.
#define ComplexLU __ignore
#include <octave/CmplxLU.h>
#undef ComplexLU
#ifdef octave_Complex_LU_h
#define USE_OCTAVE_API_VERSION 36
#else
#define USE_OCTAVE_API_VERSION 37
#endif
#endif
#endif
SWIGRUNTIME bool SWIG_check_num_args(const char *func_name, int num_args, int max_args, int min_args, int varargs) { SWIGRUNTIME bool SWIG_check_num_args(const char *func_name, int num_args, int max_args, int min_args, int varargs) {
if (num_args > max_args && !varargs) if (num_args > max_args && !varargs)

View file

@ -32,7 +32,7 @@
#define SWIG_SetConstant(name, obj) SWIG_Octave_SetConstant(module_ns,name,obj) #define SWIG_SetConstant(name, obj) SWIG_Octave_SetConstant(module_ns,name,obj)
// raise // raise
#define SWIG_Octave_Raise(obj, type, desc) error("c++-side threw an exception") #define SWIG_Octave_Raise(OBJ, TYPE, DESC) error("C++ side threw an exception of type " TYPE)
#define SWIG_Raise(obj, type, desc) SWIG_Octave_Raise(obj, type, desc) #define SWIG_Raise(obj, type, desc) SWIG_Octave_Raise(obj, type, desc)
// Include the unified typemap library // Include the unified typemap library

View file

@ -7,6 +7,9 @@
#ifdef do_close #ifdef do_close
#undef do_close #undef do_close
#endif #endif
#ifdef do_exec
#undef do_exec
#endif
#ifdef scalar #ifdef scalar
#undef scalar #undef scalar
#endif #endif

View file

@ -18,6 +18,7 @@
/* for raw pointers */ /* for raw pointers */
#define SWIG_ConvertPtr(obj, pp, type, flags) SWIG_Perl_ConvertPtr(SWIG_PERL_OBJECT_CALL obj, pp, type, flags) #define SWIG_ConvertPtr(obj, pp, type, flags) SWIG_Perl_ConvertPtr(SWIG_PERL_OBJECT_CALL obj, pp, type, flags)
#define SWIG_ConvertPtrAndOwn(obj, pp, type, flags,own) SWIG_Perl_ConvertPtrAndOwn(SWIG_PERL_OBJECT_CALL obj, pp, type, flags, own)
#define SWIG_NewPointerObj(p, type, flags) SWIG_Perl_NewPointerObj(SWIG_PERL_OBJECT_CALL p, type, flags) #define SWIG_NewPointerObj(p, type, flags) SWIG_Perl_NewPointerObj(SWIG_PERL_OBJECT_CALL p, type, flags)
/* for raw packed data */ /* for raw packed data */
@ -234,10 +235,14 @@ SWIG_TypeProxyCheck(const char *c, swig_type_info *ty) {
/* Function for getting a pointer value */ /* Function for getting a pointer value */
SWIGRUNTIME int SWIGRUNTIME int
SWIG_Perl_ConvertPtr(SWIG_MAYBE_PERL_OBJECT SV *sv, void **ptr, swig_type_info *_t, int flags) { SWIG_Perl_ConvertPtrAndOwn(SWIG_MAYBE_PERL_OBJECT SV *sv, void **ptr, swig_type_info *_t, int flags, int *own) {
swig_cast_info *tc; swig_cast_info *tc;
void *voidptr = (void *)0; void *voidptr = (void *)0;
SV *tsv = 0; SV *tsv = 0;
if (own)
*own = 0;
/* If magical, apply more magic */ /* If magical, apply more magic */
if (SvGMAGICAL(sv)) if (SvGMAGICAL(sv))
mg_get(sv); mg_get(sv);
@ -287,7 +292,11 @@ SWIG_Perl_ConvertPtr(SWIG_MAYBE_PERL_OBJECT SV *sv, void **ptr, swig_type_info *
{ {
int newmemory = 0; int newmemory = 0;
*ptr = SWIG_TypeCast(tc,voidptr,&newmemory); *ptr = SWIG_TypeCast(tc,voidptr,&newmemory);
assert(!newmemory); /* newmemory handling not yet implemented */ if (newmemory == SWIG_CAST_NEW_MEMORY) {
assert(own);
if (own)
*own = *own | SWIG_CAST_NEW_MEMORY;
}
} }
} else { } else {
*ptr = voidptr; *ptr = voidptr;
@ -317,9 +326,14 @@ SWIG_Perl_ConvertPtr(SWIG_MAYBE_PERL_OBJECT SV *sv, void **ptr, swig_type_info *
return SWIG_OK; return SWIG_OK;
} }
SWIGRUNTIME int
SWIG_Perl_ConvertPtr(SWIG_MAYBE_PERL_OBJECT SV *sv, void **ptr, swig_type_info *_t, int flags) {
return SWIG_Perl_ConvertPtrAndOwn(sv, ptr, _t, flags, 0);
}
SWIGRUNTIME void SWIGRUNTIME void
SWIG_Perl_MakePtr(SWIG_MAYBE_PERL_OBJECT SV *sv, void *ptr, swig_type_info *t, int flags) { SWIG_Perl_MakePtr(SWIG_MAYBE_PERL_OBJECT SV *sv, void *ptr, swig_type_info *t, int flags) {
if (ptr && (flags & SWIG_SHADOW)) { if (ptr && (flags & (SWIG_SHADOW | SWIG_POINTER_OWN))) {
SV *self; SV *self;
SV *obj=newSV(0); SV *obj=newSV(0);
HV *hash=newHV(); HV *hash=newHV();

View file

@ -64,6 +64,8 @@
%pass_by_val(double, CONVERT_FLOAT_IN); %pass_by_val(double, CONVERT_FLOAT_IN);
%pass_by_val(char *, CONVERT_STRING_IN); %pass_by_val(char *, CONVERT_STRING_IN);
%typemap(in) char *& = const char *&;
%typemap(directorout) char *& = const char *&;
// char array can be in/out, though the passed string may not be big enough... // char array can be in/out, though the passed string may not be big enough...
// so we have to size it // so we have to size it
@ -112,6 +114,14 @@
} }
} }
%typemap(in) SWIGTYPE *& ($*ltype temp)
{
if(SWIG_ConvertPtr(*$input, (void **) &temp, $*1_descriptor, 0) < 0) {
SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $*1_descriptor");
}
$1 = &temp;
}
%typemap(in) SWIGTYPE *DISOWN %typemap(in) SWIGTYPE *DISOWN
{ {
if(SWIG_ConvertPtr(*$input, (void **) &$1, $1_descriptor, SWIG_POINTER_DISOWN ) < 0) { if(SWIG_ConvertPtr(*$input, (void **) &$1, $1_descriptor, SWIG_POINTER_DISOWN ) < 0) {
@ -184,6 +194,21 @@
ZVAL_LONG(return_value,$1); ZVAL_LONG(return_value,$1);
} }
%typemap(out) const int &,
const unsigned int &,
const short &,
const unsigned short &,
const long &,
const unsigned long &,
const signed char &,
const unsigned char &,
const bool &,
const size_t &,
const enum SWIGTYPE &
{
ZVAL_LONG(return_value,*$1);
}
%typemap(directorin) int, %typemap(directorin) int,
unsigned int, unsigned int,
short, short,
@ -203,6 +228,11 @@
ZVAL_BOOL(return_value,($1)?1:0); ZVAL_BOOL(return_value,($1)?1:0);
} }
%typemap(out) const bool &
{
ZVAL_BOOL(return_value,(*$1)?1:0);
}
%typemap(directorin) bool %typemap(directorin) bool
{ {
ZVAL_BOOL($input,($1_name)?1:0); ZVAL_BOOL($input,($1_name)?1:0);
@ -214,8 +244,14 @@
ZVAL_DOUBLE(return_value,$1); ZVAL_DOUBLE(return_value,$1);
} }
%typemap(out) const float &,
const double &
{
ZVAL_DOUBLE(return_value,*$1);
}
%typemap(directorin) float, %typemap(directorin) float,
double double
{ {
ZVAL_DOUBLE($input,$1_name); ZVAL_DOUBLE($input,$1_name);
} }
@ -225,6 +261,11 @@
ZVAL_STRINGL(return_value,&$1, 1, 1); ZVAL_STRINGL(return_value,&$1, 1, 1);
} }
%typemap(out) const char &
{
ZVAL_STRINGL(return_value,&*$1, 1, 1);
}
%typemap(out) char *, %typemap(out) char *,
char [] char []
{ {
@ -235,6 +276,15 @@
} }
} }
%typemap(out) char *&
{
if(!*$1) {
ZVAL_NULL(return_value);
} else {
ZVAL_STRING(return_value, (char *)*$1, 1);
}
}
%typemap(out) SWIGTYPE *, %typemap(out) SWIGTYPE *,
SWIGTYPE [], SWIGTYPE [],
SWIGTYPE & SWIGTYPE &
@ -242,9 +292,14 @@
SWIG_SetPointerZval(return_value, (void *)$1, $1_descriptor, $owner); SWIG_SetPointerZval(return_value, (void *)$1, $1_descriptor, $owner);
%} %}
%typemap(out) SWIGTYPE *&
%{
SWIG_SetPointerZval(return_value, (void *)*$1, $*1_descriptor, $owner);
%}
%typemap(directorin) SWIGTYPE *, %typemap(directorin) SWIGTYPE *,
SWIGTYPE [], SWIGTYPE [],
SWIGTYPE & SWIGTYPE &
%{ %{
SWIG_SetPointerZval($input, (void *)&$1_name, $1_descriptor, $owner); SWIG_SetPointerZval($input, (void *)&$1_name, $1_descriptor, $owner);
%} %}
@ -271,17 +326,13 @@
#endif #endif
%typemap(directorin) SWIGTYPE %typemap(directorin) SWIGTYPE
#ifdef __cplusplus
{ {
SWIG_SetPointerZval($input, SWIG_as_voidptr(&$1_name), $&1_descriptor, 2); SWIG_SetPointerZval($input, SWIG_as_voidptr(&$1_name), $&1_descriptor, 2);
} }
#else
{ /* Array reference typemaps */
$&1_ltype resultobj = ($&1_ltype) emalloc(sizeof($1_type)); %apply SWIGTYPE & { SWIGTYPE ((&)[ANY]) }
memcpy(resultobj, &$1, sizeof($1_type));
SWIG_SetPointerZval($input, (void *)resultobj, $&1_descriptor, 2);
}
#endif
%typemap(out) void ""; %typemap(out) void "";
@ -296,7 +347,7 @@
// an argument to be converted from a different PHP type, you must convert // an argument to be converted from a different PHP type, you must convert
// it yourself before passing it (e.g. (string)4.7 or (int)"6"). // it yourself before passing it (e.g. (string)4.7 or (int)"6").
%define %php_typecheck(_type,_prec,is) %define %php_typecheck(_type,_prec,is)
%typemap(typecheck,precedence=_prec) _type %typemap(typecheck,precedence=_prec) _type, const _type &
" $1 = (Z_TYPE_PP($input) == is); " " $1 = (Z_TYPE_PP($input) == is); "
%enddef %enddef
@ -311,13 +362,12 @@
%php_typecheck(size_t,SWIG_TYPECHECK_INT16,IS_LONG) %php_typecheck(size_t,SWIG_TYPECHECK_INT16,IS_LONG)
%php_typecheck(enum SWIGTYPE,SWIG_TYPECHECK_INT8,IS_LONG) %php_typecheck(enum SWIGTYPE,SWIG_TYPECHECK_INT8,IS_LONG)
%php_typecheck(bool,SWIG_TYPECHECK_BOOL,IS_BOOL) %php_typecheck(bool,SWIG_TYPECHECK_BOOL,IS_BOOL)
%php_typecheck(char,SWIG_TYPECHECK_CHAR,IS_STRING)
%php_typecheck(char *,SWIG_TYPECHECK_STRING,IS_STRING)
%php_typecheck(char [],SWIG_TYPECHECK_STRING,IS_STRING)
%php_typecheck(float,SWIG_TYPECHECK_FLOAT,IS_DOUBLE) %php_typecheck(float,SWIG_TYPECHECK_FLOAT,IS_DOUBLE)
%php_typecheck(double,SWIG_TYPECHECK_BOOL,IS_DOUBLE) %php_typecheck(double,SWIG_TYPECHECK_BOOL,IS_DOUBLE)
%php_typecheck(char,SWIG_TYPECHECK_CHAR,IS_STRING)
%typemap(typecheck,precedence=SWIG_TYPECHECK_STRING) char *, char *&, char []
" $1 = (Z_TYPE_PP($input) == IS_STRING); "
%typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE
{ {
@ -327,7 +377,8 @@
%typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE *, %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE *,
SWIGTYPE [], SWIGTYPE [],
SWIGTYPE & SWIGTYPE &,
SWIGTYPE *&
{ {
void *tmp; void *tmp;
_v = (SWIG_ConvertPtr(*$input, (void**)&tmp, $1_descriptor, 0) >= 0); _v = (SWIG_ConvertPtr(*$input, (void**)&tmp, $1_descriptor, 0) >= 0);

View file

@ -13,7 +13,6 @@
#define PHPBN2(x) %builtinwarn("'" `x` "' conflicts with a built-in name in PHP") "::" `x` #define PHPBN2(x) %builtinwarn("'" `x` "' conflicts with a built-in name in PHP") "::" `x`
#define PHPFN(x) %keywordwarn("'" `x` "' is a PHP built-in function, renamed as 'c_" `x` "'",sourcefmt="%(lower)s",%$isfunction,%$not %$ismember,rename="c_%s") `x` #define PHPFN(x) %keywordwarn("'" `x` "' is a PHP built-in function, renamed as 'c_" `x` "'",sourcefmt="%(lower)s",%$isfunction,%$not %$ismember,rename="c_%s") `x`
/* /*
From From
@ -475,6 +474,8 @@ PHPFN(sqrt);
PHPFN(ceil); PHPFN(ceil);
PHPFN(floor); PHPFN(floor);
PHPFN(fmod); PHPFN(fmod);
PHPFN(min);
PHPFN(max);
#undef PHPKW #undef PHPKW
#undef PHPBN1 #undef PHPBN1

View file

@ -113,8 +113,14 @@ SWIG_ZTS_SetPointerZval(zval *z, void *ptr, swig_type_info *type, int newobject
value->ptr=ptr; value->ptr=ptr;
value->newobject=newobject; value->newobject=newobject;
if (newobject <= 1) { if (newobject <= 1) {
/* Just register the pointer as a resource. */
ZEND_REGISTER_RESOURCE(z, value, *(int *)(type->clientdata)); ZEND_REGISTER_RESOURCE(z, value, *(int *)(type->clientdata));
} else { } else {
/*
* Wrap the resource in an object, the resource will be accessible
* via the "_cPtr" member. This is currently only used by
* directorin typemaps.
*/
value->newobject = 0; value->newobject = 0;
zval *resource; zval *resource;
MAKE_STD_ZVAL(resource); MAKE_STD_ZVAL(resource);

View file

@ -3,132 +3,103 @@
* of SWIG, and the README file for authors - http://www.swig.org/release.html. * of SWIG, and the README file for authors - http://www.swig.org/release.html.
* *
* std_vector.i * std_vector.i
*
* SWIG typemaps for std::vector types
* ----------------------------------------------------------------------------- */ * ----------------------------------------------------------------------------- */
%include <std_common.i> %include <std_common.i>
// ------------------------------------------------------------------------
// std::vector
//
// The aim of all that follows would be to integrate std::vector with
// PHP as much as possible, namely, to allow the user to pass and
// be returned PHP lists.
// const declarations are used to guess the intent of the function being
// exported; therefore, the following rationale is applied:
//
// -- f(std::vector<T>), f(const std::vector<T>&), f(const std::vector<T>*):
// the parameter being read-only, either a PHP sequence or a
// previously wrapped std::vector<T> can be passed.
// -- f(std::vector<T>&), f(std::vector<T>*):
// the parameter must be modified; therefore, only a wrapped std::vector
// can be passed.
// -- std::vector<T> f():
// the vector is returned by copy; therefore, a PHP sequence of T:s
// is returned which is most easily used in other PHP functions
// -- std::vector<T>& f(), std::vector<T>* f(), const std::vector<T>& f(),
// const std::vector<T>* f():
// the vector is returned by reference; therefore, a wrapped std::vector
// is returned
// ------------------------------------------------------------------------
%{ %{
#include <vector> #include <vector>
#include <algorithm>
#include <stdexcept> #include <stdexcept>
%} %}
// exported class
namespace std { namespace std {
template<class T> class vector { template<class T> class vector {
// add generic typemaps here public:
public: typedef size_t size_type;
vector(unsigned int size = 0); typedef T value_type;
unsigned int size() const; typedef const value_type& const_reference;
%rename(is_empty) empty; vector();
bool empty() const; vector(size_type n);
void clear(); size_type size() const;
%rename(push) push_back; size_type capacity() const;
void push_back(const T& x); void reserve(size_type n);
%extend { void clear();
T pop() throw (std::out_of_range) { %rename(push) push_back;
if (self->size() == 0) void push_back(const value_type& x);
throw std::out_of_range("pop from empty vector"); %extend {
T x = self->back(); bool is_empty() const {
self->pop_back(); return $self->empty();
return x; }
} T pop() throw (std::out_of_range) {
T& get(int i) throw (std::out_of_range) { if (self->size() == 0)
int size = int(self->size()); throw std::out_of_range("pop from empty vector");
if (i>=0 && i<size) T x = self->back();
return (*self)[i]; self->pop_back();
else return x;
throw std::out_of_range("vector index out of range"); }
} const_reference get(int i) throw (std::out_of_range) {
void set(int i, const T& x) throw (std::out_of_range) { int size = int(self->size());
int size = int(self->size()); if (i>=0 && i<size)
if (i>=0 && i<size) return (*self)[i];
(*self)[i] = x; else
else throw std::out_of_range("vector index out of range");
throw std::out_of_range("vector index out of range"); }
} void set(int i, const value_type& val) throw (std::out_of_range) {
} int size = int(self->size());
}; if (i>=0 && i<size)
(*self)[i] = val;
else
// specializations for built-ins throw std::out_of_range("vector index out of range");
}
%define specialize_std_vector(T) }
template<> class vector<T> { };
// add specialized typemaps here
public:
vector(unsigned int size = 0);
unsigned int size() const;
%rename(is_empty) empty;
bool empty() const;
void clear();
%rename(push) push_back;
void push_back(T x);
%extend {
T pop() throw (std::out_of_range) {
if (self->size() == 0)
throw std::out_of_range("pop from empty vector");
T x = self->back();
self->pop_back();
return x;
}
T get(int i) throw (std::out_of_range) {
int size = int(self->size());
if (i>=0 && i<size)
return (*self)[i];
else
throw std::out_of_range("vector index out of range");
}
void set(int i, T x) throw (std::out_of_range) {
int size = int(self->size());
if (i>=0 && i<size)
(*self)[i] = x;
else
throw std::out_of_range("vector index out of range");
}
}
};
%enddef
specialize_std_vector(bool);
specialize_std_vector(char);
specialize_std_vector(int);
specialize_std_vector(short);
specialize_std_vector(long);
specialize_std_vector(unsigned char);
specialize_std_vector(unsigned int);
specialize_std_vector(unsigned short);
specialize_std_vector(unsigned long);
specialize_std_vector(float);
specialize_std_vector(double);
// bool specialization
template<> class vector<bool> {
public:
typedef size_t size_type;
typedef bool value_type;
typedef bool const_reference;
vector();
vector(size_type n);
size_type size() const;
size_type capacity() const;
void reserve(size_type n);
void clear();
%rename(push) push_back;
void push_back(const value_type& x);
%extend {
bool is_empty() const {
return $self->empty();
}
bool pop() throw (std::out_of_range) {
if (self->size() == 0)
throw std::out_of_range("pop from empty vector");
bool x = self->back();
self->pop_back();
return x;
}
const_reference get(int i) throw (std::out_of_range) {
int size = int(self->size());
if (i>=0 && i<size)
return (*self)[i];
else
throw std::out_of_range("vector index out of range");
}
void set(int i, const value_type& val) throw (std::out_of_range) {
int size = int(self->size());
if (i>=0 && i<size)
(*self)[i] = val;
else
throw std::out_of_range("vector index out of range");
}
}
};
} }
%define specialize_std_vector(T)
#warning "specialize_std_vector - specialization for type T no longer needed"
%enddef

View file

@ -33,14 +33,24 @@
%enddef %enddef
%define %pass_by_val( TYPE, CONVERT_IN ) %define %pass_by_val( TYPE, CONVERT_IN )
%typemap(in) TYPE, const TYPE & %typemap(in) TYPE
%{ %{
CONVERT_IN($1,$1_ltype,$input); CONVERT_IN($1,$1_ltype,$input);
%} %}
%typemap(directorout) TYPE, const TYPE & %typemap(in) const TYPE & ($*1_ltype temp)
%{
CONVERT_IN(temp,$*1_ltype,$input);
$1 = &temp;
%}
%typemap(directorout) TYPE
%{ %{
CONVERT_IN($result,$1_ltype,$input); CONVERT_IN($result,$1_ltype,$input);
%} %}
%typemap(directorout) const TYPE & ($*1_ltype temp)
%{
CONVERT_IN(temp,$*1_ltype,$input);
$result = &temp;
%}
%enddef %enddef
%fragment("t_output_helper","header") %{ %fragment("t_output_helper","header") %{

View file

@ -1163,10 +1163,10 @@ SWIG_Python_ConvertFunctionPtr(PyObject *obj, void **ptr, swig_type_info *ty) {
/* here we get the method pointer for callbacks */ /* here we get the method pointer for callbacks */
const char *doc = (((PyCFunctionObject *)obj) -> m_ml -> ml_doc); const char *doc = (((PyCFunctionObject *)obj) -> m_ml -> ml_doc);
const char *desc = doc ? strstr(doc, "swig_ptr: ") : 0; const char *desc = doc ? strstr(doc, "swig_ptr: ") : 0;
if (desc) { if (desc)
desc = ty ? SWIG_UnpackVoidPtr(desc + 10, &vptr, ty->name) : 0; desc = ty ? SWIG_UnpackVoidPtr(desc + 10, &vptr, ty->name) : 0;
if (!desc) return SWIG_ERROR; if (!desc)
} return SWIG_ERROR;
if (ty) { if (ty) {
swig_cast_info *tc = SWIG_TypeCheck(desc,ty); swig_cast_info *tc = SWIG_TypeCheck(desc,ty);
if (tc) { if (tc) {

View file

@ -875,31 +875,8 @@ namespace swig
} }
%enddef %enddef
// ..I don't think %swig_sequence_methods_val are really used at all anymore...
%define %swig_sequence_methods_val(Sequence...) %define %swig_sequence_methods_val(Sequence...)
%swig_sequence_methods_common(%arg(Sequence)) %swig_sequence_methods(%arg(Sequence))
%extend {
VALUE __getitem__(difference_type i) {
VALUE r = Qnil;
try {
r = swig::from< Sequence::value_type >( *(swig::cgetpos(self, i)) );
}
catch( std::out_of_range )
{
}
return r;
}
VALUE __setitem__(difference_type i, value_type x) {
std::size_t len = $self->size();
if ( i < 0 ) i = len - i;
else if ( static_cast<std::size_t>(i) >= len )
$self->resize( i+1, x );
else *(swig::getpos(self,i)) = x;
return swig::from< Sequence::value_type >( x );
}
}
%enddef %enddef

View file

@ -380,7 +380,7 @@ clean-docs-main:
@test -d $(DOCS) || exit 0; cd $(DOCS) && $(MAKE) clean @test -d $(DOCS) || exit 0; cd $(DOCS) && $(MAKE) clean
clean-docs-ccache: clean-docs-ccache:
@test -z "$(ENABLE_CCACHE)" || (cd $(CCACHE) && $(MAKE) clean-docs) @# Use distclean-docs-ccache, else a user requires the yodl tools to generate the docs after a clean
maintainer-clean: clean-libfiles maintainer-clean: clean-libfiles
@cd $(SOURCE) && $(MAKE) maintainer-clean @cd $(SOURCE) && $(MAKE) maintainer-clean
@ -407,6 +407,9 @@ distclean-test-suite:
distclean-ccache: distclean-ccache:
test -z "$(ENABLE_CCACHE)" || (cd $(CCACHE) && $(MAKE) -s distclean) test -z "$(ENABLE_CCACHE)" || (cd $(CCACHE) && $(MAKE) -s distclean)
distclean-docs-ccache:
@test -z "$(ENABLE_CCACHE)" || (cd $(CCACHE) && $(MAKE) distclean-docs)
distclean-dead: distclean-dead:
rm -f $(DISTCLEAN-DEAD) rm -f $(DISTCLEAN-DEAD)

4
README
View file

@ -96,6 +96,10 @@ A SWIG FAQ and other hints can be found on the SWIG Wiki:
What's New? What's New?
=========== ===========
SWIG-1.3.40 summary:
- SWIG now supports directors for PHP.
- PHP support improved in general.
SWIG-1.3.39 summary: SWIG-1.3.39 summary:
- Some new small feature enhancements. - Some new small feature enhancements.
- Improved C# std::vector wrappers. - Improved C# std::vector wrappers.

View file

@ -2726,7 +2726,7 @@ template_directive: SWIGTEMPLATE LPAREN idstringopt RPAREN idcolonnt LESSTHAN va
Parm *ti = targs; Parm *ti = targs;
String *tv = Getattr(tp,"value"); String *tv = Getattr(tp,"value");
if (!tv) tv = Getattr(tp,"type"); if (!tv) tv = Getattr(tp,"type");
while(pi != tp) { while(pi != tp && ti && pi) {
String *name = Getattr(ti,"name"); String *name = Getattr(ti,"name");
String *value = Getattr(pi,"value"); String *value = Getattr(pi,"value");
if (!value) value = Getattr(pi,"type"); if (!value) value = Getattr(pi,"type");

View file

@ -527,8 +527,7 @@ class Allocate:public Dispatcher {
} }
ParmList *throws = Getattr(n, "throws"); ParmList *throws = Getattr(n, "throws");
if (throws) { if (throws) {
/* if there is no an explicit catchlist, /* if there is no explicit catchlist, we catch everything in the throws list */
we catch everything in the throwlist */
if (!catchlist) { if (!catchlist) {
Setattr(n, "catchlist", throws); Setattr(n, "catchlist", throws);
} }

View file

@ -898,9 +898,9 @@ public:
} }
} }
// Get any C# exception classes in the throws typemap // Look for usage of throws typemap and the canthrow flag
ParmList *throw_parm_list = NULL; ParmList *throw_parm_list = NULL;
if ((throw_parm_list = Getattr(n, "throws"))) { if ((throw_parm_list = Getattr(n, "catchlist"))) {
Swig_typemap_attach_parms("throws", throw_parm_list, f); Swig_typemap_attach_parms("throws", throw_parm_list, f);
for (p = throw_parm_list; p; p = nextSibling(p)) { for (p = throw_parm_list; p; p = nextSibling(p)) {
if ((tm = Getattr(p, "tmap:throws"))) { if ((tm = Getattr(p, "tmap:throws"))) {
@ -3063,13 +3063,6 @@ public:
return tm; return tm;
} }
/* -----------------------------------------------------------------------------
* addThrows()
// TODO: remove
* ----------------------------------------------------------------------------- */
void addThrows(Node *, const String *, Node *) {
}
/* ----------------------------------------------------------------------------- /* -----------------------------------------------------------------------------
* canThrow() * canThrow()
* Determine whether the code in the typemap can throw a C# exception. * Determine whether the code in the typemap can throw a C# exception.
@ -3417,10 +3410,6 @@ public:
Printf(arg, "j%s", ln); Printf(arg, "j%s", ln);
/* Add various typemap's 'throws' clauses */
addThrows(n, "tmap:directorin", p);
addThrows(n, "tmap:out", p);
/* And add to the upcall args */ /* And add to the upcall args */
if (gencomma > 0) if (gencomma > 0)
Printf(jupcall_args, ", "); Printf(jupcall_args, ", ");
@ -3549,9 +3538,8 @@ public:
Printf(declaration, " virtual %s", target); Printf(declaration, " virtual %s", target);
Delete(target); Delete(target);
// Get any Java exception classes in the throws typemap // Add any exception specifications to the methods in the director class
ParmList *throw_parm_list = NULL; ParmList *throw_parm_list = NULL;
if ((throw_parm_list = Getattr(n, "throws")) || Getattr(n, "throw")) { if ((throw_parm_list = Getattr(n, "throws")) || Getattr(n, "throw")) {
int gencomma = 0; int gencomma = 0;
@ -3562,13 +3550,10 @@ public:
Swig_typemap_attach_parms("throws", throw_parm_list, 0); Swig_typemap_attach_parms("throws", throw_parm_list, 0);
for (p = throw_parm_list; p; p = nextSibling(p)) { for (p = throw_parm_list; p; p = nextSibling(p)) {
if ((tm = Getattr(p, "tmap:throws"))) { if ((tm = Getattr(p, "tmap:throws"))) {
addThrows(n, "tmap:throws", p);
if (gencomma++) { if (gencomma++) {
Append(w->def, ", "); Append(w->def, ", ");
Append(declaration, ", "); Append(declaration, ", ");
} }
Printf(w->def, "%s", SwigType_str(Getattr(p, "type"), 0)); Printf(w->def, "%s", SwigType_str(Getattr(p, "type"), 0));
Printf(declaration, "%s", SwigType_str(Getattr(p, "type"), 0)); Printf(declaration, "%s", SwigType_str(Getattr(p, "type"), 0));
} }
@ -3621,7 +3606,6 @@ public:
/* Copy jresult into c_result... */ /* Copy jresult into c_result... */
if ((tm = Swig_typemap_lookup("directorout", tp, result_str, w))) { if ((tm = Swig_typemap_lookup("directorout", tp, result_str, w))) {
addThrows(n, "tmap:directorout", tp);
Replaceall(tm, "$input", jresult_str); Replaceall(tm, "$input", jresult_str);
Replaceall(tm, "$result", result_str); Replaceall(tm, "$result", result_str);
Printf(w->code, "%s\n", tm); Printf(w->code, "%s\n", tm);

View file

@ -980,7 +980,7 @@ public:
// Get any Java exception classes in the throws typemap // Get any Java exception classes in the throws typemap
ParmList *throw_parm_list = NULL; ParmList *throw_parm_list = NULL;
if ((throw_parm_list = Getattr(n, "throws"))) { if ((throw_parm_list = Getattr(n, "catchlist"))) {
Swig_typemap_attach_parms("throws", throw_parm_list, f); Swig_typemap_attach_parms("throws", throw_parm_list, f);
for (p = throw_parm_list; p; p = nextSibling(p)) { for (p = throw_parm_list; p; p = nextSibling(p)) {
if ((tm = Getattr(p, "tmap:throws"))) { if ((tm = Getattr(p, "tmap:throws"))) {
@ -3679,6 +3679,7 @@ public:
Printf(declaration, " virtual %s", target); Printf(declaration, " virtual %s", target);
Delete(target); Delete(target);
// Add any exception specifications to the methods in the director class
// Get any Java exception classes in the throws typemap // Get any Java exception classes in the throws typemap
ParmList *throw_parm_list = NULL; ParmList *throw_parm_list = NULL;

Some files were not shown because too many files have changed in this diff Show more