@@ -748,7 +748,9 @@ static zend_always_inline zval *_zend_hash_add_or_update_i(HashTable *ht, zend_s
748748 zval * data ;
749749
750750 ZEND_ASSERT ((flag & HASH_ADD_NEW ) == 0 );
751- if (flag & HASH_ADD ) {
751+ if (flag & HASH_LOOKUP ) {
752+ return & p -> val ;
753+ } else if (flag & HASH_ADD ) {
752754 if (!(flag & HASH_UPDATE_INDIRECT )) {
753755 return NULL ;
754756 }
@@ -793,7 +795,11 @@ static zend_always_inline zval *_zend_hash_add_or_update_i(HashTable *ht, zend_s
793795 nIndex = h | ht -> nTableMask ;
794796 Z_NEXT (p -> val ) = HT_HASH_EX (arData , nIndex );
795797 HT_HASH_EX (arData , nIndex ) = HT_IDX_TO_HASH (idx );
796- ZVAL_COPY_VALUE (& p -> val , pData );
798+ if (flag & HASH_LOOKUP ) {
799+ ZVAL_NULL (& p -> val );
800+ } else {
801+ ZVAL_COPY_VALUE (& p -> val , pData );
802+ }
797803
798804 return & p -> val ;
799805}
@@ -821,7 +827,9 @@ static zend_always_inline zval *_zend_hash_str_add_or_update_i(HashTable *ht, co
821827 if (p ) {
822828 zval * data ;
823829
824- if (flag & HASH_ADD ) {
830+ if (flag & HASH_LOOKUP ) {
831+ return & p -> val ;
832+ } else if (flag & HASH_ADD ) {
825833 if (!(flag & HASH_UPDATE_INDIRECT )) {
826834 return NULL ;
827835 }
@@ -859,7 +867,11 @@ static zend_always_inline zval *_zend_hash_str_add_or_update_i(HashTable *ht, co
859867 p -> key = key = zend_string_init (str , len , GC_FLAGS (ht ) & IS_ARRAY_PERSISTENT );
860868 p -> h = ZSTR_H (key ) = h ;
861869 HT_FLAGS (ht ) &= ~HASH_FLAG_STATIC_KEYS ;
862- ZVAL_COPY_VALUE (& p -> val , pData );
870+ if (flag & HASH_LOOKUP ) {
871+ ZVAL_NULL (& p -> val );
872+ } else {
873+ ZVAL_COPY_VALUE (& p -> val , pData );
874+ }
863875 nIndex = h | ht -> nTableMask ;
864876 Z_NEXT (p -> val ) = HT_HASH (ht , nIndex );
865877 HT_HASH (ht , nIndex ) = HT_IDX_TO_HASH (idx );
@@ -901,6 +913,11 @@ ZEND_API zval* ZEND_FASTCALL zend_hash_add_new(HashTable *ht, zend_string *key,
901913 return _zend_hash_add_or_update_i (ht , key , pData , HASH_ADD_NEW );
902914}
903915
916+ ZEND_API zval * ZEND_FASTCALL zend_hash_lookup (HashTable * ht , zend_string * key )
917+ {
918+ return _zend_hash_add_or_update_i (ht , key , NULL , HASH_LOOKUP );
919+ }
920+
904921ZEND_API zval * ZEND_FASTCALL zend_hash_str_add_or_update (HashTable * ht , const char * str , size_t len , zval * pData , uint32_t flag )
905922{
906923 if (flag == HASH_ADD ) {
@@ -984,6 +1001,9 @@ static zend_always_inline zval *_zend_hash_index_add_or_update_i(HashTable *ht,
9841001 if (h < ht -> nNumUsed ) {
9851002 p = ht -> arData + h ;
9861003 if (Z_TYPE (p -> val ) != IS_UNDEF ) {
1004+ if (flag & HASH_LOOKUP ) {
1005+ return & p -> val ;
1006+ }
9871007replace :
9881008 if (flag & HASH_ADD ) {
9891009 return NULL ;
@@ -1032,6 +1052,9 @@ static zend_always_inline zval *_zend_hash_index_add_or_update_i(HashTable *ht,
10321052 if ((flag & HASH_ADD_NEW ) == 0 || ZEND_DEBUG ) {
10331053 p = zend_hash_index_find_bucket (ht , h );
10341054 if (p ) {
1055+ if (flag & HASH_LOOKUP ) {
1056+ return & p -> val ;
1057+ }
10351058 ZEND_ASSERT ((flag & HASH_ADD_NEW ) == 0 );
10361059 goto replace ;
10371060 }
@@ -1051,7 +1074,11 @@ static zend_always_inline zval *_zend_hash_index_add_or_update_i(HashTable *ht,
10511074 ht -> nNumOfElements ++ ;
10521075 p -> h = h ;
10531076 p -> key = NULL ;
1054- ZVAL_COPY_VALUE (& p -> val , pData );
1077+ if (flag & HASH_LOOKUP ) {
1078+ ZVAL_NULL (& p -> val );
1079+ } else {
1080+ ZVAL_COPY_VALUE (& p -> val , pData );
1081+ }
10551082
10561083 return & p -> val ;
10571084}
@@ -1099,6 +1126,11 @@ ZEND_API zval* ZEND_FASTCALL zend_hash_next_index_insert_new(HashTable *ht, zval
10991126 return _zend_hash_index_add_or_update_i (ht , ht -> nNextFreeElement , pData , HASH_ADD | HASH_ADD_NEW | HASH_ADD_NEXT );
11001127}
11011128
1129+ ZEND_API zval * ZEND_FASTCALL zend_hash_index_lookup (HashTable * ht , zend_ulong h )
1130+ {
1131+ return _zend_hash_index_add_or_update_i (ht , h , NULL , HASH_LOOKUP );
1132+ }
1133+
11021134ZEND_API zval * ZEND_FASTCALL zend_hash_set_bucket_key (HashTable * ht , Bucket * b , zend_string * key )
11031135{
11041136 uint32_t nIndex ;
0 commit comments