Arrange to return after calling zend_throw_exception()
Fixes github issue#240.
This commit is contained in:
parent
902f5d3f32
commit
26bbc96d58
6 changed files with 133 additions and 1 deletions
|
|
@ -389,6 +389,7 @@ CPP_TEST_CASES += \
|
|||
string_constants \
|
||||
struct_initialization_cpp \
|
||||
struct_value \
|
||||
swig_exception \
|
||||
symbol_clash \
|
||||
template_arg_replace \
|
||||
template_arg_scope \
|
||||
|
|
|
|||
33
Examples/test-suite/php/swig_exception_runme.php
Normal file
33
Examples/test-suite/php/swig_exception_runme.php
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
<?php
|
||||
|
||||
require("swig_exception.php");
|
||||
require("tests.php");
|
||||
|
||||
$c = new Circle(10);
|
||||
$s = new Square(10);
|
||||
|
||||
if (Shape::nshapes() != 2) {
|
||||
check::fail("Shape::nshapes() should be 2, actually ".Shape::nshapes());
|
||||
}
|
||||
|
||||
# ----- Throw exception -----
|
||||
try {
|
||||
$c->throwException();
|
||||
check::fail("Exception wasn't thrown");
|
||||
} catch (Exception $e) {
|
||||
if ($e->getMessage() != "OK") {
|
||||
check::fail("Exception getMessage() should be \"OK\", actually \"".$e->getMessage()."\"");
|
||||
}
|
||||
}
|
||||
|
||||
# ----- Delete everything -----
|
||||
|
||||
$c = NULL;
|
||||
$s = NULL;
|
||||
$e = NULL;
|
||||
|
||||
if (Shape::nshapes() != 0) {
|
||||
check::fail("Shape::nshapes() should be 0, actually ".Shape::nshapes());
|
||||
}
|
||||
|
||||
?>
|
||||
91
Examples/test-suite/swig_exception.i
Normal file
91
Examples/test-suite/swig_exception.i
Normal file
|
|
@ -0,0 +1,91 @@
|
|||
/* File : swig_exception.i
|
||||
* Test SWIG_exception().
|
||||
*/
|
||||
%module swig_exception
|
||||
|
||||
%include exception.i
|
||||
|
||||
%exception {
|
||||
try {
|
||||
$action
|
||||
} catch (std::exception& e) {
|
||||
SWIG_exception(SWIG_SystemError, e.what());
|
||||
}
|
||||
}
|
||||
|
||||
%inline %{
|
||||
class Value {
|
||||
int a_;
|
||||
int b_;
|
||||
public:
|
||||
Value(int a, int b) : a_(a), b_(b) {}
|
||||
};
|
||||
|
||||
class Shape {
|
||||
public:
|
||||
Shape() {
|
||||
nshapes++;
|
||||
}
|
||||
virtual ~Shape() {
|
||||
nshapes--;
|
||||
}
|
||||
double x, y;
|
||||
void move(double dx, double dy);
|
||||
virtual double area() = 0;
|
||||
virtual double perimeter() = 0;
|
||||
virtual Value throwException();
|
||||
static int nshapes;
|
||||
};
|
||||
|
||||
class Circle : public Shape {
|
||||
private:
|
||||
double radius;
|
||||
public:
|
||||
Circle(double r) : radius(r) { }
|
||||
virtual double area();
|
||||
virtual double perimeter();
|
||||
};
|
||||
|
||||
class Square : public Shape {
|
||||
private:
|
||||
double width;
|
||||
public:
|
||||
Square(double w) : width(w) { }
|
||||
virtual double area();
|
||||
virtual double perimeter();
|
||||
};
|
||||
%}
|
||||
|
||||
%{
|
||||
#define PI 3.14159265358979323846
|
||||
|
||||
#include <stdexcept>
|
||||
|
||||
/* Move the shape to a new location */
|
||||
void Shape::move(double dx, double dy) {
|
||||
x += dx;
|
||||
y += dy;
|
||||
}
|
||||
|
||||
Value Shape::throwException() {
|
||||
throw std::logic_error("OK");
|
||||
}
|
||||
|
||||
int Shape::nshapes = 0;
|
||||
|
||||
double Circle::area() {
|
||||
return PI*radius*radius;
|
||||
}
|
||||
|
||||
double Circle::perimeter() {
|
||||
return 2*PI*radius;
|
||||
}
|
||||
|
||||
double Square::area() {
|
||||
return width*width;
|
||||
}
|
||||
|
||||
double Square::perimeter() {
|
||||
return 4*width;
|
||||
}
|
||||
%}
|
||||
Loading…
Add table
Add a link
Reference in a new issue