summaryrefslogtreecommitdiff
path: root/linux-x86/share/swig/php/director.swg
diff options
context:
space:
mode:
Diffstat (limited to 'linux-x86/share/swig/php/director.swg')
-rw-r--r--linux-x86/share/swig/php/director.swg170
1 files changed, 170 insertions, 0 deletions
diff --git a/linux-x86/share/swig/php/director.swg b/linux-x86/share/swig/php/director.swg
new file mode 100644
index 0000000..ea0eba8
--- /dev/null
+++ b/linux-x86/share/swig/php/director.swg
@@ -0,0 +1,170 @@
+/* -----------------------------------------------------------------------------
+ * director.swg
+ *
+ * This file contains support for director classes so that PHP proxy
+ * methods can be called from C++.
+ * ----------------------------------------------------------------------------- */
+
+#ifndef SWIG_DIRECTOR_PHP_HEADER_
+#define SWIG_DIRECTOR_PHP_HEADER_
+
+#include <string>
+#include <exception>
+#include <map>
+
+namespace Swig {
+
+ /* memory handler */
+ struct GCItem {
+ virtual ~GCItem() {
+ }
+
+ virtual int get_own() const {
+ return 0;
+ }
+ };
+
+ struct GCItem_var {
+ GCItem_var(GCItem *item = 0) : _item(item) {
+ }
+
+ GCItem_var& operator=(GCItem *item) {
+ GCItem *tmp = _item;
+ _item = item;
+ delete tmp;
+ return *this;
+ }
+
+ ~GCItem_var() {
+ delete _item;
+ }
+
+ GCItem * operator->() const {
+ return _item;
+ }
+
+ private:
+ GCItem *_item;
+ };
+
+ struct GCItem_Object : GCItem {
+ GCItem_Object(int own) : _own(own) {
+ }
+
+ virtual ~GCItem_Object() {
+ }
+
+ int get_own() const {
+ return _own;
+ }
+
+ private:
+ int _own;
+ };
+
+ template <typename Type>
+ struct GCItem_T : GCItem {
+ GCItem_T(Type *ptr) : _ptr(ptr) {
+ }
+
+ virtual ~GCItem_T() {
+ delete _ptr;
+ }
+
+ private:
+ Type *_ptr;
+ };
+
+ class Director {
+ protected:
+ // "mutable" so we can get a non-const pointer to it in const methods.
+ mutable zval swig_self;
+ typedef std::map<void *, GCItem_var> swig_ownership_map;
+ mutable swig_ownership_map swig_owner;
+ public:
+ Director(zval *self) {
+ ZVAL_COPY_VALUE(&swig_self, self);
+ }
+
+ static bool swig_is_overridden_method(const char *cname, const char *lc_fname) {
+ bool result = false;
+ zend_string * cname_str = zend_string_init(cname, strlen(cname), 0);
+ zend_class_entry *ce = zend_lookup_class(cname_str);
+ if (ce) {
+ zval * mptr = zend_hash_str_find(&ce->function_table, lc_fname, strlen(lc_fname));
+ if (mptr) {
+ // common.scope points to zend_class_entry for the declaring class,
+ // and there's only one of those per class, so we can just use a
+ // pointer compare here.
+ result = Z_FUNC_P(mptr)->common.scope != ce;
+ }
+ }
+ zend_string_release(cname_str);
+ return result;
+ }
+
+ template <typename Type>
+ void swig_acquire_ownership(Type *vptr) const {
+ if (vptr) {
+ swig_owner[vptr] = new GCItem_T<Type>(vptr);
+ }
+ }
+ };
+
+ /* base class for director exceptions */
+ class DirectorException : public std::exception {
+ protected:
+ std::string swig_msg;
+ public:
+ DirectorException(int code, const char *hdr, const char *msg) : swig_msg(hdr) {
+ if (msg && msg[0]) {
+ swig_msg += " ";
+ swig_msg += msg;
+ }
+ SWIG_ErrorCode() = code;
+ SWIG_ErrorMsg() = swig_msg.c_str();
+ }
+
+ virtual ~DirectorException() throw() {
+ }
+
+ const char *what() const throw() {
+ return swig_msg.c_str();
+ }
+
+ static void raise(int code, const char *hdr, const char *msg) {
+ throw DirectorException(code, hdr, msg);
+ }
+ };
+
+ /* attempt to call a pure virtual method via a director method */
+ class DirectorPureVirtualException : public DirectorException {
+ public:
+ DirectorPureVirtualException(const char *msg)
+ : DirectorException(E_ERROR, "SWIG director pure virtual method called", msg) {
+ }
+
+ static void raise(const char *msg) {
+ throw DirectorPureVirtualException(msg);
+ }
+ };
+
+ /* any php exception that occurs during a director method call */
+ class DirectorMethodException : public DirectorException
+ {
+ public:
+ DirectorMethodException()
+ : DirectorException(E_ERROR, "SWIG director method error", NULL) {
+ }
+
+ DirectorMethodException(const char *msg)
+ : DirectorException(E_ERROR, "SWIG director method error", msg) {
+ }
+
+ static void raise(const char *msg) {
+ throw DirectorMethodException(msg);
+ }
+ };
+}
+
+#endif