diff options
author | Nikita Popov <nikic@php.net> | 2013-02-16 19:13:36 +0100 |
---|---|---|
committer | Nikita Popov <nikic@php.net> | 2013-03-12 17:27:31 +0100 |
commit | fcc6611de9054327441786e52444b5f8eecdd525 (patch) | |
tree | 072a133a6e3ea1c067d9ad30cb07bb8130691094 /Zend/zend_API.c | |
parent | 8436342d8861650930f985249ce3da7f92f03506 (diff) | |
download | php-git-fcc6611de9054327441786e52444b5f8eecdd525.tar.gz |
Add support for non-scalar Iterator keys in foreach
RFC: https://wiki.php.net/rfc/foreach-non-scalar-keys
Diffstat (limited to 'Zend/zend_API.c')
-rw-r--r-- | Zend/zend_API.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 95c90ea753..2653d0849a 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -1502,6 +1502,40 @@ ZEND_API int add_get_index_stringl(zval *arg, ulong index, const char *str, uint } /* }}} */ +ZEND_API int array_set_zval_key(HashTable *ht, zval *key, zval *value) /* {{{ */ +{ + int result; + + switch (Z_TYPE_P(key)) { + case IS_STRING: + result = zend_symtable_update(ht, Z_STRVAL_P(key), Z_STRLEN_P(key) + 1, &value, sizeof(zval *), NULL); + break; + case IS_NULL: + result = zend_symtable_update(ht, "", 1, &value, sizeof(zval *), NULL); + break; + case IS_RESOURCE: + zend_error(E_STRICT, "Resource ID#%ld used as offset, casting to integer (%ld)", Z_LVAL_P(key), Z_LVAL_P(key)); + /* break missing intentionally */ + case IS_BOOL: + case IS_LONG: + result = zend_hash_index_update(ht, Z_LVAL_P(key), &value, sizeof(zval *), NULL); + break; + case IS_DOUBLE: + result = zend_hash_index_update(ht, zend_dval_to_lval(Z_LVAL_P(key)), &value, sizeof(zval *), NULL); + break; + default: + zend_error(E_WARNING, "Illegal offset type"); + result = FAILURE; + } + + if (result == SUCCESS) { + Z_ADDREF_P(value); + } + + return result; +} +/* }}} */ + ZEND_API int add_property_long_ex(zval *arg, const char *key, uint key_len, long n TSRMLS_DC) /* {{{ */ { zval *tmp; |