diff options
author | Remi Collet <remi@remirepo.net> | 2018-07-04 12:24:21 +0200 |
---|---|---|
committer | Remi Collet <remi@remirepo.net> | 2018-07-04 12:24:21 +0200 |
commit | 2befa842cd07b38716efee28b8041a24154aa42e (patch) | |
tree | 49b87d98e4444081dd81e1e5f0a19a86e9b10fba /33.patch | |
parent | e135fbbc964385fd3787bf3b6201deae050f297a (diff) |
add better patch for PHP 7.3 from https://github.com/php/pecl-file_formats-yaml/pull/33
Diffstat (limited to '33.patch')
-rw-r--r-- | 33.patch | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/33.patch b/33.patch new file mode 100644 index 0000000..6e1f935 --- /dev/null +++ b/33.patch @@ -0,0 +1,130 @@ +From 4a3eb9f1c92e9dff6ce723bd94daef1580d080d2 Mon Sep 17 00:00:00 2001 +From: Remi Collet <remi@remirepo.net> +Date: Wed, 4 Jul 2018 12:14:48 +0200 +Subject: [PATCH] Fix for PHP 7.3 + +--- + .gitignore | 2 ++ + .travis.yml | 3 +++ + emit.c | 53 ++++++++++++++++++++++++++++++++++++++++++----------- + 3 files changed, 47 insertions(+), 11 deletions(-) + +diff --git a/emit.c b/emit.c +index 993a666..fd3769e 100644 +--- a/emit.c ++++ b/emit.c +@@ -173,7 +173,11 @@ static void y_scan_recursion(const y_emit_state_t *state, zval *data TSRMLS_DC) + return; + } + ++#if PHP_VERSION_ID >= 70300 ++ if (!(GC_FLAGS(ht) & GC_IMMUTABLE) && GC_IS_RECURSIVE(ht)) { ++#else + if (ZEND_HASH_APPLY_PROTECTION(ht) && ht->u.v.nApplyCount > 0) { ++#endif + zval tmp; + ZVAL_LONG(&tmp, (zend_ulong) ht); + +@@ -182,17 +186,29 @@ static void y_scan_recursion(const y_emit_state_t *state, zval *data TSRMLS_DC) + return; + } + ++#if PHP_VERSION_ID >= 70300 ++ if (!(GC_FLAGS(ht) & GC_IMMUTABLE)) { ++ GC_PROTECT_RECURSION(ht); ++ } ++#else + if (ZEND_HASH_APPLY_PROTECTION(ht)) { + ht->u.v.nApplyCount++; + } ++#endif + + ZEND_HASH_FOREACH_VAL(ht, elm) { + y_scan_recursion(state, elm TSRMLS_CC); + } ZEND_HASH_FOREACH_END(); + ++#if PHP_VERSION_ID >= 70300 ++ if (!(GC_FLAGS(ht) & GC_IMMUTABLE)) { ++ GC_UNPROTECT_RECURSION(ht); ++ } ++#else + if (ZEND_HASH_APPLY_PROTECTION(ht)) { + ht->u.v.nApplyCount--; + } ++#endif + + return; + } +@@ -462,7 +478,6 @@ static int y_write_array( + zval key_zval; + zend_ulong kidx; + zend_string *kstr; +- HashTable *tmp_ht; + zend_long recursive_idx = -1; + char *anchor = { 0 }; + size_t anchor_size; +@@ -495,7 +510,11 @@ static int y_write_array( + anchor = (char*) emalloc(anchor_size + 1); + snprintf(anchor, anchor_size + 1, "refid%ld", recursive_idx + 1); + +- if (ZEND_HASH_APPLY_PROTECTION(ht) && ht->u.v.nApplyCount > 1) { ++#if PHP_VERSION_ID >= 70300 ++ if (!(GC_FLAGS(ht) & GC_IMMUTABLE) && GC_IS_RECURSIVE(ht)) { ++#else ++ if (ZEND_HASH_APPLY_PROTECTION(ht) && ht->u.v.nApplyCount > 0) { ++#endif + /* node has been visited before */ + status = yaml_alias_event_initialize( + &event, (yaml_char_t *) anchor); +@@ -536,6 +555,18 @@ static int y_write_array( + return FAILURE; + } + ++#if PHP_VERSION_ID >= 70300 ++ if (!(GC_FLAGS(ht) & GC_IMMUTABLE)) { ++ /* increment access count for hash */ ++ GC_PROTECT_RECURSION(ht); ++ } ++#else ++ if (ZEND_HASH_APPLY_PROTECTION(ht)) { ++ /* increment access count for hash */ ++ ht->u.v.nApplyCount++; ++ } ++#endif ++ + /* emit array elements */ + ZEND_HASH_FOREACH_KEY_VAL(ht, kidx, kstr, elm) { + ZVAL_DEREF(elm); +@@ -555,23 +586,23 @@ static int y_write_array( + } + } + +- tmp_ht = HASH_OF(elm); +- if (tmp_ht && ZEND_HASH_APPLY_PROTECTION(tmp_ht)) { +- /* increment access count for hash */ +- tmp_ht->u.v.nApplyCount++; +- } +- + status = y_write_zval(state, elm, NULL TSRMLS_CC); + +- if (tmp_ht && ZEND_HASH_APPLY_PROTECTION(tmp_ht)) { +- tmp_ht->u.v.nApplyCount--; +- } + + if (SUCCESS != status) { + return FAILURE; + } + } ZEND_HASH_FOREACH_END(); + ++#if PHP_VERSION_ID >= 70300 ++ if (!(GC_FLAGS(ht) & GC_IMMUTABLE)) { ++ GC_UNPROTECT_RECURSION(ht); ++ } ++#else ++ if (ZEND_HASH_APPLY_PROTECTION(ht)) { ++ ht->u.v.nApplyCount--; ++ } ++#endif + + if (Y_ARRAY_SEQUENCE == array_type) { + status = yaml_sequence_end_event_initialize(&event); |