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
|
|
@ -5,6 +5,10 @@ See the RELEASENOTES file for a summary of changes in each release.
|
||||||
Version 3.0.11 (in progress)
|
Version 3.0.11 (in progress)
|
||||||
============================
|
============================
|
||||||
|
|
||||||
|
2016-09-16: olly
|
||||||
|
[PHP] Fix SWIG_exception() macro to return from the current function.
|
||||||
|
Fixes #240, reported by Sergey Seroshtan.
|
||||||
|
|
||||||
2016-09-12: xypron
|
2016-09-12: xypron
|
||||||
[C#] Patch #786 Keyword rename to be CLS compliant by adding an underscore
|
[C#] Patch #786 Keyword rename to be CLS compliant by adding an underscore
|
||||||
suffix instead of an underscore suffix to the C symbol name. Please use an explicit
|
suffix instead of an underscore suffix to the C symbol name. Please use an explicit
|
||||||
|
|
|
||||||
|
|
@ -389,6 +389,7 @@ CPP_TEST_CASES += \
|
||||||
string_constants \
|
string_constants \
|
||||||
struct_initialization_cpp \
|
struct_initialization_cpp \
|
||||||
struct_value \
|
struct_value \
|
||||||
|
swig_exception \
|
||||||
symbol_clash \
|
symbol_clash \
|
||||||
template_arg_replace \
|
template_arg_replace \
|
||||||
template_arg_scope \
|
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;
|
||||||
|
}
|
||||||
|
%}
|
||||||
|
|
@ -15,7 +15,7 @@
|
||||||
#ifdef SWIGPHP
|
#ifdef SWIGPHP
|
||||||
%{
|
%{
|
||||||
#include "zend_exceptions.h"
|
#include "zend_exceptions.h"
|
||||||
#define SWIG_exception(code, msg) zend_throw_exception(NULL, (char*)msg, code TSRMLS_CC)
|
#define SWIG_exception(code, msg) do { zend_throw_exception(NULL, (char*)msg, code TSRMLS_CC); goto thrown; } while (0)
|
||||||
%}
|
%}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1000,6 +1000,7 @@ public:
|
||||||
Delete(tm);
|
Delete(tm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Printf(f->code, "thrown:\n");
|
||||||
Printf(f->code, "return;\n");
|
Printf(f->code, "return;\n");
|
||||||
|
|
||||||
/* Error handling code */
|
/* Error handling code */
|
||||||
|
|
@ -2356,6 +2357,7 @@ done:
|
||||||
Append(f->code, actioncode);
|
Append(f->code, actioncode);
|
||||||
Delete(actioncode);
|
Delete(actioncode);
|
||||||
|
|
||||||
|
Printf(f->code, "thrown:\n");
|
||||||
Append(f->code, "return;\n");
|
Append(f->code, "return;\n");
|
||||||
Append(f->code, "fail:\n");
|
Append(f->code, "fail:\n");
|
||||||
Append(f->code, "SWIG_FAIL(TSRMLS_C);\n");
|
Append(f->code, "SWIG_FAIL(TSRMLS_C);\n");
|
||||||
|
|
@ -2715,6 +2717,7 @@ done:
|
||||||
Delete(outarg);
|
Delete(outarg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Append(w->code, "thrown:\n");
|
||||||
if (!is_void) {
|
if (!is_void) {
|
||||||
if (!(ignored_method && !pure_virtual)) {
|
if (!(ignored_method && !pure_virtual)) {
|
||||||
String *rettype = SwigType_str(returntype, 0);
|
String *rettype = SwigType_str(returntype, 0);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue