From 3c53a0b7306711683492be3bd0c84bcb92902d4f Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Fri, 18 Aug 2017 00:15:02 +0200 Subject: [PATCH] Update the PHP SWIG version to PHP 7, with various crash fixes, too. --- {php5-swig => php7-swig}/Makefile | 8 ++++-- {php5-swig => php7-swig}/attribute-empty.php | 0 {php5-swig => php7-swig}/attribute.php | 0 {php5-swig => php7-swig}/attribute2.php | 0 {php5-swig => php7-swig}/attribute3.php | 2 +- {php5-swig => php7-swig}/clone.php | 0 {php5-swig => php7-swig}/include.php | 0 {php5-swig => php7-swig}/namespace.php | 0 {php5-swig => php7-swig}/namespace2.php | 0 {php5-swig => php7-swig}/passthru.php | 0 {php5-swig => php7-swig}/simple.php | 0 {php5-swig => php7-swig}/structure.php | 0 {php5-swig => php7-swig}/xml-template.php | 0 {php5-swig => php7-swig}/xml-template.swig | 30 +++++++++----------- tests/test.sh | 4 +-- 15 files changed, 22 insertions(+), 22 deletions(-) rename {php5-swig => php7-swig}/Makefile (53%) rename {php5-swig => php7-swig}/attribute-empty.php (100%) rename {php5-swig => php7-swig}/attribute.php (100%) rename {php5-swig => php7-swig}/attribute2.php (100%) rename {php5-swig => php7-swig}/attribute3.php (88%) rename {php5-swig => php7-swig}/clone.php (100%) rename {php5-swig => php7-swig}/include.php (100%) rename {php5-swig => php7-swig}/namespace.php (100%) rename {php5-swig => php7-swig}/namespace2.php (100%) rename {php5-swig => php7-swig}/passthru.php (100%) rename {php5-swig => php7-swig}/simple.php (100%) rename {php5-swig => php7-swig}/structure.php (100%) rename {php5-swig => php7-swig}/xml-template.php (100%) rename {php5-swig => php7-swig}/xml-template.swig (91%) diff --git a/php5-swig/Makefile b/php7-swig/Makefile similarity index 53% rename from php5-swig/Makefile rename to php7-swig/Makefile index cc90f0a..5bf3c01 100644 --- a/php5-swig/Makefile +++ b/php7-swig/Makefile @@ -6,10 +6,12 @@ LIBS=../c++11/xml-template.o XML_Template_SWIG.so: xml-template_wrap.o $(LIBS) $(CXX) $(LDFLAGS) -o $@ $< $(LIBS) -xml-template_wrap.cpp XML_Template_SWIG.php php_XML_Template_SWIG.h : xml-template.swig - swig -c++ -php $< +xml-template_wrap.cxx XML_Template_SWIG.php php_XML_Template_SWIG.h : xml-template.swig + swig -c++ -php7 $< clean: $(RM) XML_Template_SWIG.so xml-template_wrap.o - $(RM) xml-template_wrap.cpp XML_Template_SWIG.php php_XML_Template_SWIG.h + $(RM) xml-template_wrap.cxx xml-template_wrap.cpp XML_Template_SWIG.php php_XML_Template_SWIG.h +xml-template_wrap.cpp: xml-template_wrap.cxx + cp xml-template_wrap.cxx xml-template_wrap.cpp diff --git a/php5-swig/attribute-empty.php b/php7-swig/attribute-empty.php similarity index 100% rename from php5-swig/attribute-empty.php rename to php7-swig/attribute-empty.php diff --git a/php5-swig/attribute.php b/php7-swig/attribute.php similarity index 100% rename from php5-swig/attribute.php rename to php7-swig/attribute.php diff --git a/php5-swig/attribute2.php b/php7-swig/attribute2.php similarity index 100% rename from php5-swig/attribute2.php rename to php7-swig/attribute2.php diff --git a/php5-swig/attribute3.php b/php7-swig/attribute3.php similarity index 88% rename from php5-swig/attribute3.php rename to php7-swig/attribute3.php index 1262a90..b8ce7ea 100644 --- a/php5-swig/attribute3.php +++ b/php7-swig/attribute3.php @@ -11,5 +11,5 @@ $doc = XML_Template_process_file('../xml/clone.xml', array( array( 'li' => 'Warm, woolen mittens' ), ), array('odd', 'even')) ), true); -print XML_Template_convert_doc_to_string($doc); +print XML_Template_convert_doc_to_string($doc, 0); ?> diff --git a/php5-swig/clone.php b/php7-swig/clone.php similarity index 100% rename from php5-swig/clone.php rename to php7-swig/clone.php diff --git a/php5-swig/include.php b/php7-swig/include.php similarity index 100% rename from php5-swig/include.php rename to php7-swig/include.php diff --git a/php5-swig/namespace.php b/php7-swig/namespace.php similarity index 100% rename from php5-swig/namespace.php rename to php7-swig/namespace.php diff --git a/php5-swig/namespace2.php b/php7-swig/namespace2.php similarity index 100% rename from php5-swig/namespace2.php rename to php7-swig/namespace2.php diff --git a/php5-swig/passthru.php b/php7-swig/passthru.php similarity index 100% rename from php5-swig/passthru.php rename to php7-swig/passthru.php diff --git a/php5-swig/simple.php b/php7-swig/simple.php similarity index 100% rename from php5-swig/simple.php rename to php7-swig/simple.php diff --git a/php5-swig/structure.php b/php7-swig/structure.php similarity index 100% rename from php5-swig/structure.php rename to php7-swig/structure.php diff --git a/php5-swig/xml-template.php b/php7-swig/xml-template.php similarity index 100% rename from php5-swig/xml-template.php rename to php7-swig/xml-template.php diff --git a/php5-swig/xml-template.swig b/php7-swig/xml-template.swig similarity index 91% rename from php5-swig/xml-template.swig rename to php7-swig/xml-template.swig index 458296e..f31df58 100644 --- a/php5-swig/xml-template.swig +++ b/php7-swig/xml-template.swig @@ -38,38 +38,34 @@ Directive* convert_php_objects_to_directive(zval *obj) HashTable *ht = Z_ARRVAL_P(obj); if (is_associative_array(ht)) { std::unordered_map my_map; - for (zend_hash_internal_pointer_reset(ht); zend_hash_has_more_elements(ht) == SUCCESS; zend_hash_move_forward(ht)) { - char *str_key; - ulong num_key; - zend_hash_get_current_key(ht, &str_key, &num_key, 0); - + zend_string *str_key; + zval *zv; + ulong num_key; + ZEND_HASH_FOREACH_KEY_VAL(ht, num_key, str_key, zv) { std::string key; - if (zend_hash_get_current_key_type(ht) == HASH_KEY_IS_STRING) { - key = str_key; + if (str_key) { + key.assign(str_key->val, str_key->len); } else { char buf[32]; sprintf(buf, "%lu", num_key); key = buf; } - zval **data; - zend_hash_get_current_data(ht, (void **)&data); - my_map.insert(make_pair(key, convert_php_objects_to_directive(*data))); - } + my_map.insert(make_pair(key, convert_php_objects_to_directive(zv))); + } ZEND_HASH_FOREACH_END(); return new Substitute(my_map); } else { std::vector subdirectives; for (unsigned i = 0; i < ht->nNumOfElements; ++i) { - zval **data; - zend_hash_index_find(ht, i, (void **)&data); - subdirectives.push_back(convert_php_objects_to_directive(*data)); + zval *data = zend_hash_index_find(ht, i); + subdirectives.push_back(convert_php_objects_to_directive(data)); } return new Clone(subdirectives); } break; } case IS_STRING: { - char *str = Z_STRVAL_P(obj); + std::string str(Z_STRVAL_P(obj), Z_STRLEN_P(obj)); return new Replace(str); } case IS_LONG: { @@ -89,6 +85,8 @@ Directive* convert_php_objects_to_directive(zval *obj) } return new ReplaceInclude(xmlCopyDoc((*doc)->ptr, 1)); } + case IS_REFERENCE: + return convert_php_objects_to_directive(&Z_REF_P(obj)->val); case IS_NULL: return new Replace { "" }; default: @@ -243,7 +241,7 @@ void XML_Template_clean_whitespace(XmlDocPtrWrapper doc, bool aggressive) %} %typemap(in) Directive* { - $1 = convert_php_objects_to_directive(*$input); + $1 = convert_php_objects_to_directive(&$input); } XmlDocPtrWrapper XML_Template_process_file(const std::string &input_filename, Directive *root_directive, bool clean); diff --git a/tests/test.sh b/tests/test.sh index 1b66e17..bf92fca 100755 --- a/tests/test.sh +++ b/tests/test.sh @@ -24,8 +24,8 @@ for L in $LANGUAGES; do if [ "$L" = "php5" ]; then php5-cgi -q ../php5/$T.php > $TEMPFILE fi - if [ "$L" = "php5-swig" ]; then - ( cd ../c++11 && make -s && cd ../php5-swig && make -s && sudo cp XML_Template_SWIG.so /usr/lib/php5/20090626+lfs ) && php5-cgi -q ../php5-swig/$T.php > $TEMPFILE + if [ "$L" = "php7-swig" ]; then + ( cd ../c++11 && make -s && cd ../php7-swig && make -s && sudo cp XML_Template_SWIG.so /usr/lib/php/20151012 ) && php7-cgi -q ../php7-swig/$T.php > $TEMPFILE fi if [ "$L" = "python" ]; then python2 ../python/$T.py > $TEMPFILE -- 2.39.2