diff options
author | Olly Betts <olly@survex.com> | 2021-05-05 12:02:38 +1200 |
---|---|---|
committer | Olly Betts <olly@survex.com> | 2021-05-25 16:28:44 +1200 |
commit | 3c168ef332ed66929c404cbf8c02ec04bfd02780 (patch) | |
tree | 0c5dd3787b2252275543095deb998b226dd16e4e /Lib | |
parent | e82725b22e9352f269875ecee0c868dd434a04fb (diff) | |
download | swig-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.swg | 3 | ||||
-rw-r--r-- | Lib/php/phpinterfaces.i | 62 | ||||
-rw-r--r-- | Lib/php/phprun.swg | 2 |
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. */ |