cvs: ZendEngine2 / zend_hash.c zend_hash.h
[email protected] ("Dmitry Stogov") Wed, 18 Mar 2009 09:49:07 -0000
| Newsgroups | php.zend-engine.cvs |
|---|---|
| Message-ID | <cvsdmitry1237369747@cvsserver> |
dmitry Wed Mar 18 09:49:07 2009 UTC
Modified files:
/ZendEngine2 zend_hash.c zend_hash.h
Log:
Better fix for bug #45877 (smaller and faster)
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_hash.c?r1=1.161&r2=1.162&diff_format=u
Index: ZendEngine2/zend_hash.c
diff -u ZendEngine2/zend_hash.c:1.161 ZendEngine2/zend_hash.c:1.162
--- ZendEngine2/zend_hash.c:1.161 Wed Dec 31 11:12:29 2008
+++ ZendEngine2/zend_hash.c Wed Mar 18 09:49:07 2009
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_hash.c,v 1.161 2008/12/31 11:12:29 sebastian Exp $ */
+/* $Id: zend_hash.c,v 1.162 2009/03/18 09:49:07 dmitry Exp $ */
#include "zend.h"
#include "zend_operators.h"
@@ -2071,7 +2071,7 @@
ZEND_API int zend_symtable_del(HashTable *ht, const char *arKey, uint nKeyLength) /* {{{ */
{
- ZEND_HANDLE_NUMERIC(arKey, nKeyLength, zend_hash_index_del(ht, idx))
+ ZEND_HANDLE_NUMERIC(arKey, nKeyLength, zend_hash_index_del(ht, idx));
return zend_hash_del(ht, arKey, nKeyLength);
}
/* }}} */
@@ -2106,7 +2106,7 @@
ZEND_API int zend_ascii_symtable_del(HashTable *ht, const char *arKey, uint nKeyLength) /* {{{ */
{
- ZEND_HANDLE_NUMERIC(arKey, nKeyLength, zend_hash_index_del(ht, idx))
+ ZEND_HANDLE_NUMERIC(arKey, nKeyLength, zend_hash_index_del(ht, idx));
return zend_ascii_hash_del(ht, arKey, nKeyLength);
}
/* }}} */
@@ -2134,7 +2134,7 @@
ZEND_API int zend_rt_symtable_del(HashTable *ht, const char *arKey, uint nKeyLength) /* {{{ */
{
- ZEND_HANDLE_NUMERIC(arKey, nKeyLength, zend_hash_index_del(ht, idx))
+ ZEND_HANDLE_NUMERIC(arKey, nKeyLength, zend_hash_index_del(ht, idx));
return zend_rt_hash_del(ht, arKey, nKeyLength);
}
/* }}} */
@@ -2162,7 +2162,7 @@
ZEND_API int zend_utf8_symtable_del(HashTable *ht, const char *arKey, uint nKeyLength) /* {{{ */
{
- ZEND_HANDLE_NUMERIC(arKey, nKeyLength, zend_hash_index_del(ht, idx))
+ ZEND_HANDLE_NUMERIC(arKey, nKeyLength, zend_hash_index_del(ht, idx));
return zend_utf8_hash_del(ht, arKey, nKeyLength);
}
/* }}} */
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_hash.h?r1=1.99&r2=1.100&diff_format=u
Index: ZendEngine2/zend_hash.h
diff -u ZendEngine2/zend_hash.h:1.99 ZendEngine2/zend_hash.h:1.100
--- ZendEngine2/zend_hash.h:1.99 Wed Mar 18 01:06:30 2009
+++ ZendEngine2/zend_hash.h Wed Mar 18 09:49:07 2009
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_hash.h,v 1.99 2009/03/18 01:06:30 mattwil Exp $ */
+/* $Id: zend_hash.h,v 1.100 2009/03/18 09:49:07 dmitry Exp $ */
#ifndef ZEND_HASH_H
#define ZEND_HASH_H
@@ -398,75 +398,69 @@
ZEND_API int zend_u_symtable_update_current_key(HashTable *ht, zend_uchar type, zstr arKey, uint nKeyLength, int mode);
/* {{{ ZEND_HANDLE_*_NUMERIC macros */
-#define ZEND_HANDLE_NUMERIC(key, length, func) { \
- register const char *tmp=key; \
- \
- if (*tmp=='-') { \
- tmp++; \
- } \
- if ((*tmp>='0' && *tmp<='9')) do { /* possibly a numeric index */ \
- const char *end=key+length-1; \
- long idx = end - tmp; /* temp var for remaining length (number of digits) */ \
- \
- if (idx > MAX_LENGTH_OF_LONG - 1 || (*tmp++ == '0' && length > 2)) { \
- /* don't accept numbers too long or with leading zeros */ \
- break; \
- } \
- while (tmp<end) { \
- if (!(*tmp>='0' && *tmp<='9')) { \
- break; \
- } \
- tmp++; \
- } \
- if (tmp==end && *tmp=='\0') { /* a numeric index */ \
- if (idx == MAX_LENGTH_OF_LONG - 1) { \
- int cmp = strcmp(end - (MAX_LENGTH_OF_LONG - 1), long_min_digits); \
- \
- if (!(cmp < 0 || (cmp == 0 && *key == '-'))) { \
- break; \
- } \
- } \
- \
- idx = strtol(key, NULL, 10); \
- return func; \
- } \
- } while (0); \
-}
-
-#define ZEND_HANDLE_U_NUMERIC(key, length, func) { \
- register UChar *tmp=key; \
- \
- if (*tmp==0x2D /*'-'*/) { \
- tmp++; \
- } \
- if ((*tmp>=0x30 /*'0'*/ && *tmp<=0x39 /*'9'*/)) do { /* possibly a numeric index */ \
- UChar *end=key+length-1; \
- long idx = end - tmp; /* temp var for remaining length (number of digits) */ \
- \
- if (idx > MAX_LENGTH_OF_LONG - 1 || (*tmp++ == 0x30 && length > 2)) { \
- /* don't accept numbers too long or with leading zeros */ \
- break; \
- } \
- while (tmp<end) { \
- if (!(*tmp>=0x30 /*'0'*/ && *tmp<=0x39 /*'9'*/)) { \
- break; \
- } \
- tmp++; \
- } \
- if (tmp==end && *tmp==0) { /* a numeric index */ \
- if (idx == MAX_LENGTH_OF_LONG - 1) { \
- int cmp = zend_cmp_unicode_and_literal(end - (MAX_LENGTH_OF_LONG - 1), idx, long_min_digits, idx); \
- \
- if (!(cmp < 0 || (cmp == 0 && *key == 0x2D /*'-'*/))) { \
- break; \
- } \
- } \
- \
- idx = zend_u_strtol(key, NULL, 10); \
- return func; \
- } \
- } while (0); \
-}
+#define ZEND_HANDLE_NUMERIC(key, length, func) do { \
+ register const char *tmp = key; \
+ const char *end = key + length - 1; \
+ long idx; \
+ \
+ if (*tmp == '-') { \
+ tmp++; \
+ } \
+ if ((*tmp >= '1' && *tmp <= '9' && (end - tmp) < MAX_LENGTH_OF_LONG) || \
+ (*tmp == '0' && (end - tmp) == 1)) { \
+ /* possibly a numeric index without leading zeroes */ \
+ idx = (*tmp++ - '0'); \
+ while (1) { \
+ if (tmp == end && *tmp == '\0') { /* a numeric index */ \
+ if (*key == '-') { \
+ idx = -idx; \
+ if (idx > 0) { /* overflow */ \
+ break; \
+ } \
+ } else if (idx < 0) { /* overflow */ \
+ break; \
+ } \
+ return func; \
+ } else if (*tmp >= '0' && *tmp <= '9') { \
+ idx = (idx * 10) + (*tmp++ - '0'); \
+ } else { \
+ break; \
+ } \
+ } \
+ } \
+} while (0)
+
+#define ZEND_HANDLE_U_NUMERIC(key, length, func) do { \
+ register const UChar *tmp = key; \
+ const UChar *end = key + length - 1; \
+ long idx; \
+ \
+ if (*tmp == '-') { \
+ tmp++; \
+ } \
+ if ((*tmp >= '1' && *tmp <= '9' && (end - tmp) < MAX_LENGTH_OF_LONG) || \
+ (*tmp == '0' && (end - tmp) == 1)) { \
+ /* possibly a numeric index without leading zeroes */ \
+ idx = (*tmp++ - '0'); \
+ while (1) { \
+ if (tmp == end && *tmp == '\0') { /* a numeric index */ \
+ if (*key == '-') { \
+ idx = -idx; \
+ if (idx > 0) { /* overflow */ \
+ break; \
+ } \
+ } else if (idx < 0) { /* overflow */ \
+ break; \
+ } \
+ return func; \
+ } else if (*tmp >= '0' && *tmp <= '9') { \
+ idx = (idx * 10) + (*tmp++ - '0'); \
+ } else { \
+ break; \
+ } \
+ } \
+ } \
+} while (0)
/* }}} */
#endif /* ZEND_HASH_H */