summaryrefslogtreecommitdiff
path: root/Lib
diff options
context:
space:
mode:
authorOlly Betts <olly@survex.com>2021-05-05 12:02:38 +1200
committerOlly Betts <olly@survex.com>2021-05-25 16:28:44 +1200
commit3c168ef332ed66929c404cbf8c02ec04bfd02780 (patch)
tree0c5dd3787b2252275543095deb998b226dd16e4e /Lib
parente82725b22e9352f269875ecee0c868dd434a04fb (diff)
downloadswig-3c168ef332ed66929c404cbf8c02ec04bfd02780.tar.gz
Map known PHP interfaces to zend_class_entry*
Most pre-defined interfaces are accessible via zend_class_entry* variables declared in the PHP C API - we can use these to add an interface at MINIT time (rather than having to wait until RINIT to look up by name) by having a mapping from PHP interface name to them. This will also be a little faster than looking up by name. Closes #2013
Diffstat (limited to 'Lib')
-rw-r--r--Lib/php/php.swg3
-rw-r--r--Lib/php/phpinterfaces.i62
-rw-r--r--Lib/php/phprun.swg2
3 files changed, 67 insertions, 0 deletions
diff --git a/Lib/php/php.swg b/Lib/php/php.swg
index 468c7bb55..42985eac7 100644
--- a/Lib/php/php.swg
+++ b/Lib/php/php.swg
@@ -547,3 +547,6 @@
/* php keywords */
%include <phpkw.swg>
+
+/* PHP known interfaces */
+%include <phpinterfaces.i>
diff --git a/Lib/php/phpinterfaces.i b/Lib/php/phpinterfaces.i
new file mode 100644
index 000000000..dda219d91
--- /dev/null
+++ b/Lib/php/phpinterfaces.i
@@ -0,0 +1,62 @@
+/* -----------------------------------------------------------------------------
+ * phpinterfaces.i
+ *
+ * Define "known" PHP interfaces.
+ *
+ * These can be added at MINIT time (which is when PHP loads the extension
+ * module).
+ *
+ * Any interface can be added via phpinterfaces, but looking up the
+ * zend_class_entry by name has to wait until RINIT time, which means it
+ * happens for every request.
+ * ----------------------------------------------------------------------------- */
+
+// Note: Abstract interfaces such as "Traversable" can't be used in
+// "implements" so are not relevant here.
+
+%insert(header) %{
+
+#define SWIG_PHP_INTERFACE_Iterator_CE zend_ce_iterator
+#define SWIG_PHP_INTERFACE_Iterator_HEADER "zend_interfaces.h"
+
+#define SWIG_PHP_INTERFACE_IteratorAggregate_CE zend_ce_aggregate
+#define SWIG_PHP_INTERFACE_IteratorAggregate_HEADER "zend_interfaces.h"
+
+#define SWIG_PHP_INTERFACE_ArrayAccess_CE zend_ce_arrayaccess
+#define SWIG_PHP_INTERFACE_ArrayAccess_HEADER "zend_interfaces.h"
+
+#define SWIG_PHP_INTERFACE_Serializable_CE zend_ce_serializable
+#define SWIG_PHP_INTERFACE_Serializable_HEADER "zend_interfaces.h"
+
+#define SWIG_PHP_INTERFACE_Countable_CE zend_ce_countable
+#define SWIG_PHP_INTERFACE_Countable_HEADER "zend_interfaces.h"
+
+#define SWIG_PHP_INTERFACE_OuterIterator_CE spl_ce_OuterIterator
+#define SWIG_PHP_INTERFACE_OuterIterator_HEADER "ext/spl/spl_iterators.h"
+
+#define SWIG_PHP_INTERFACE_RecursiveIterator_CE spl_ce_RecursiveIterator
+#define SWIG_PHP_INTERFACE_RecursiveIterator_HEADER "ext/spl/spl_iterators.h"
+
+#define SWIG_PHP_INTERFACE_SeekableIterator_CE spl_ce_SeekableIterator
+#define SWIG_PHP_INTERFACE_SeekableIterator_HEADER "ext/spl/spl_iterators.h"
+
+#define SWIG_PHP_INTERFACE_SplObserver_CE spl_ce_SplObserver
+#define SWIG_PHP_INTERFACE_SplObserver_HEADER "ext/spl/spl_observer.h"
+
+#define SWIG_PHP_INTERFACE_SplSubject_CE spl_ce_SplSubject
+#define SWIG_PHP_INTERFACE_SplSubject_HEADER "ext/spl/spl_observer.h"
+
+#define SWIG_PHP_INTERFACE_DateTimeInterface_CE php_date_get_interface_ce()
+#define SWIG_PHP_INTERFACE_DateTimeInterface_HEADER "ext/date/php_date.h"
+
+// The "json" extension needs to be loaded earlier that us for this to work.
+#define SWIG_PHP_INTERFACE_JsonSerializable_CE php_json_serializable_ce
+#define SWIG_PHP_INTERFACE_JsonSerializable_HEADER "ext/json/php_json.h"
+
+// New in PHP 8.0.
+#if PHP_MAJOR >= 8
+# define SWIG_PHP_INTERFACE_Stringable_CE zend_ce_stringable
+# define SWIG_PHP_INTERFACE_Stringable_HEADER "zend_interfaces.h"
+#endif
+
+%}
diff --git a/Lib/php/phprun.swg b/Lib/php/phprun.swg
index b0376314e..880c98f41 100644
--- a/Lib/php/phprun.swg
+++ b/Lib/php/phprun.swg
@@ -16,7 +16,9 @@ extern "C" {
# error These bindings need PHP 7 or later - to generate PHP5 bindings use: SWIG < 4.0.0 and swig -php5
#endif
+#include "zend_inheritance.h"
#include "zend_exceptions.h"
+#include "zend_inheritance.h"
#include <stdlib.h> /* for abort(), used in generated code. */