summaryrefslogtreecommitdiff
path: root/Zend/zend_hash.h
diff options
context:
space:
mode:
Diffstat (limited to 'Zend/zend_hash.h')
-rw-r--r--Zend/zend_hash.h17
1 files changed, 17 insertions, 0 deletions
diff --git a/Zend/zend_hash.h b/Zend/zend_hash.h
index 64a9220573..25d48f6237 100644
--- a/Zend/zend_hash.h
+++ b/Zend/zend_hash.h
@@ -32,6 +32,7 @@
#define HASH_UPDATE_INDIRECT (1<<2)
#define HASH_ADD_NEW (1<<3)
#define HASH_ADD_NEXT (1<<4)
+#define HASH_LOOKUP (1<<5)
#define HASH_FLAG_CONSISTENCY ((1<<0) | (1<<1))
#define HASH_FLAG_PACKED (1<<2)
@@ -206,6 +207,22 @@ static zend_always_inline zval *zend_hash_find_ex(const HashTable *ht, zend_stri
} while (0)
+/* Find or add NULL, if doesn't exist */
+ZEND_API zval* ZEND_FASTCALL zend_hash_lookup(HashTable *ht, zend_string *key);
+ZEND_API zval* ZEND_FASTCALL zend_hash_index_lookup(HashTable *ht, zend_ulong h);
+
+#define ZEND_HASH_INDEX_LOOKUP(_ht, _h, _ret) do { \
+ if (EXPECTED(HT_FLAGS(_ht) & HASH_FLAG_PACKED)) { \
+ if (EXPECTED((zend_ulong)(_h) < (zend_ulong)(_ht)->nNumUsed)) { \
+ _ret = &_ht->arData[_h].val; \
+ if (EXPECTED(Z_TYPE_P(_ret) != IS_UNDEF)) { \
+ break; \
+ } \
+ } \
+ } \
+ _ret = zend_hash_index_lookup(_ht, _h); \
+ } while (0)
+
/* Misc */
static zend_always_inline bool zend_hash_exists(const HashTable *ht, zend_string *key)
{