com php-src: Merge branch 'master' into str_size_and_int 64: Zend/Zend.dsp Zend/ZendTS.dsp Zend/zend.h Zend/zend_API.c Zend/zend_builtin_functions.c
Zend/zend_compile.c Zend/zend_compile.h Zend/zend _execute_API.c Zend/zend_hash.c Zend/zend_hash .h Zend/zend_language_parser.y Zend/zend_operator s.h
Zend/zend_ts_hash.c Zend/zend_ts_hash.h Zend/zend_vm_def.h Zend/zend_vm_execute.h co nfigure.in ext/date/lib/timelib.h ext/date/php_date .c
ext/reflection/p
| From: | Anatol Belski | Date: | Thu, 28 Nov 2013 16:27:59 +0000 |
| Subject: | com php-src: Merge branch 'master' into str_size_and_int 64: Zend/Zend.dsp Zend/ZendTS.dsp Zend/zend.h Zend/zend_API.c Zend/zend_builtin_functions.c Zend/zend_compile.c Zend/zend_compile.h Zend/zend _execute_API.c Zend/zend_hash.c Zend/zend_hash .h Zend/zend_language_parser.y Zend/zend_operator s.h Zend/zend_ts_hash.c Zend/zend_ts_hash.h Zend/zend_vm_def.h Zend/zend_vm_execute.h co nfigure.in ext/date/lib/timelib.h ext/date/php_date .c ext/reflection/p |
||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-74142@lists.php.net to get a copy of this message | ||
Commit: 5ced3db9714c02d2fd40370f632f23d047f51987
Author: Anatol Belski <ab@php.net> Thu, 28 Nov 2013 17:27:59 +0100
Parents: a7862de2db615f351fd746bd2fb87564b9631e73 0d65cd50ddd409d37b208ae3fc5adbb7b22d1379
Branches: str_size_and_int64
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=5ced3db9714c02d2fd40370f632f23d047f51987
Log:
Merge branch 'master' into str_size_and_int64
Conflicts:
Zend/zend.h
Zend/zend_hash.c
Zend/zend_hash.h
Zend/zend_language_parser.y
Zend/zend_vm_def.h
Zend/zend_vm_execute.h
Changed paths:
MM Zend/Zend.dsp
MM Zend/ZendTS.dsp
MM Zend/zend.h
MM Zend/zend_API.c
MM Zend/zend_builtin_functions.c
MM Zend/zend_compile.c
MM Zend/zend_compile.h
MM Zend/zend_execute_API.c
MM Zend/zend_hash.c
MM Zend/zend_hash.h
MM Zend/zend_language_parser.y
MM Zend/zend_operators.h
MM Zend/zend_ts_hash.c
MM Zend/zend_ts_hash.h
MM Zend/zend_vm_def.h
MM Zend/zend_vm_execute.h
MM configure.in
MM ext/date/lib/timelib.h
MM ext/date/php_date.c
MM ext/reflection/php_reflection.c
MM win32/build/config.w32
diff --cc Zend/zend.h index 01db626,1c86d57..9e3fc06 --- a/Zend/zend.h +++ b/Zend/zend.h @@@ -317,9 -317,10 +317,10 @@@ typedef struct _zend_object } zend_object; #include "zend_object_handlers.h" + #include "zend_ast.h" typedef union _zvalue_value { - long lval; /* long value */ + zend_int_t lval; /* long value */ double dval; /* double value */ struct { char *val; @@@ -587,8 -589,8 +589,9 @@@ typedef int (*zend_write_func_t)(const #define IS_RESOURCE 7 #define IS_CONSTANT 8 #define IS_CONSTANT_ARRAY 9 - #define IS_CALLABLE 10 + #define IS_CONSTANT_AST 10 + #define IS_CALLABLE 11 +#define IS_LONG IS_INT /* Ugly hack to support constants as static array indices */ #define IS_CONSTANT_TYPE_MASK 0x00f diff --cc Zend/zend_compile.c index 3cc95b5,8f870c6..8f964fb --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@@ -1908,14 -1908,14 +1908,14 @@@ void zend_do_receive_param(zend_uchar o } } else { cur_arg_info->type_hint = IS_OBJECT; - if (ZEND_FETCH_CLASS_DEFAULT == zend_get_class_fetch_type(Z_STRVAL(class_type->u.constant), Z_STRLEN(class_type->u.constant))) { + if (ZEND_FETCH_CLASS_DEFAULT == zend_get_class_fetch_type(Z_STRVAL(class_type->u.constant), Z_STRSIZE(class_type->u.constant))) { zend_resolve_class_name(class_type TSRMLS_CC); } - Z_STRVAL(class_type->u.constant) = (char*)zend_new_interned_string(Z_STRVAL(class_type->u.constant), Z_STRLEN(class_type->u.constant) + 1, 1 TSRMLS_CC); + Z_STRVAL(class_type->u.constant) = (char*)zend_new_interned_string(Z_STRVAL(class_type->u.constant), Z_STRSIZE(class_type->u.constant) + 1, 1 TSRMLS_CC); cur_arg_info->class_name = Z_STRVAL(class_type->u.constant); - cur_arg_info->class_name_len = Z_STRLEN(class_type->u.constant); + cur_arg_info->class_name_len = Z_STRSIZE(class_type->u.constant); if (op == ZEND_RECV_INIT) { - if (Z_TYPE(initialization->u.constant) == IS_NULL || (Z_TYPE(initialization->u.constant) == IS_CONSTANT && !strcasecmp(Z_STRVAL(initialization->u.constant), "NULL"))) { + if (Z_TYPE(initialization->u.constant) == IS_NULL || (Z_TYPE(initialization->u.constant) == IS_CONSTANT && !strcasecmp(Z_STRVAL(initialization->u.constant), "NULL")) || Z_TYPE(initialization->u.constant) == IS_CONSTANT_AST) { cur_arg_info->allow_null = 1; } else { zend_error_noreturn(E_COMPILE_ERROR, "Default value for parameters with a class type hint can only be NULL"); @@@ -5778,14 -5777,28 +5777,28 @@@ void zend_do_add_static_array_element(z case IS_CONSTANT: /* Ugly hack to denote that this value has a constant index */ Z_TYPE_P(element) |= IS_CONSTANT_INDEX; - Z_STRVAL(offset->u.constant) = erealloc(Z_STRVAL(offset->u.constant), Z_STRLEN(offset->u.constant)+3); - Z_STRVAL(offset->u.constant)[Z_STRLEN(offset->u.constant)+1] = Z_TYPE(offset->u.constant); - Z_STRVAL(offset->u.constant)[Z_STRLEN(offset->u.constant)+2] = 0; - zend_symtable_update(Z_ARRVAL(result->u.constant), Z_STRVAL(offset->u.constant), Z_STRLEN(offset->u.constant)+3, &element, sizeof(zval *), NULL); + Z_STRVAL(offset->u.constant) = erealloc(Z_STRVAL(offset->u.constant), Z_STRSIZE(offset->u.constant)+3); + Z_STRVAL(offset->u.constant)[Z_STRSIZE(offset->u.constant)+1] = Z_TYPE(offset->u.constant); + Z_STRVAL(offset->u.constant)[Z_STRSIZE(offset->u.constant)+2] = 0; + zend_symtable_update(Z_ARRVAL(result->u.constant), Z_STRVAL(offset->u.constant), Z_STRSIZE(offset->u.constant)+3, &element, sizeof(zval *), NULL); zval_dtor(&offset->u.constant); break; + case IS_CONSTANT_AST: { + /* Another ugly hack to store the data about the AST in the array */ + char* key; + int len = sizeof(zend_ast *); + Z_TYPE_P(element) |= IS_CONSTANT_INDEX; + + key = emalloc(len + 2); + *(zend_ast **)key = Z_AST(offset->u.constant); + key[len] = Z_TYPE(offset->u.constant); + key[len + 1] = 0; + zend_symtable_update(Z_ARRVAL(result->u.constant), key, len + 2, &element, sizeof(zval *), NULL); + efree(key); + break; + } case IS_STRING: - zend_symtable_update(Z_ARRVAL(result->u.constant), Z_STRVAL(offset->u.constant), Z_STRLEN(offset->u.constant)+1, &element, sizeof(zval *), NULL); + zend_symtable_update(Z_ARRVAL(result->u.constant), Z_STRVAL(offset->u.constant), Z_STRSIZE(offset->u.constant)+1, &element, sizeof(zval *), NULL); zval_dtor(&offset->u.constant); break; case IS_NULL: diff --cc Zend/zend_hash.h index 0f556f5,c97412b..0e4a4c6 --- a/Zend/zend_hash.h +++ b/Zend/zend_hash.h @@@ -97,15 -97,15 +97,15 @@@ typedef Bucket* HashPosition BEGIN_EXTERN_C() /* startup/shutdown */ - ZEND_API int _zend_hash_init(HashTable *ht, uint nSize, hash_func_t pHashFunction, dtor_func_t pDestructor, zend_bool persistent ZEND_FILE_LINE_DC); - ZEND_API int _zend_hash_init_ex(HashTable *ht, uint nSize, hash_func_t pHashFunction, dtor_func_t pDestructor, zend_bool persistent, zend_bool bApplyProtection ZEND_FILE_LINE_DC); + ZEND_API int _zend_hash_init(HashTable *ht, uint nSize, dtor_func_t pDestructor, zend_bool persistent ZEND_FILE_LINE_DC); + ZEND_API int _zend_hash_init_ex(HashTable *ht, uint nSize, dtor_func_t pDestructor, zend_bool persistent, zend_bool bApplyProtection ZEND_FILE_LINE_DC); ZEND_API void zend_hash_destroy(HashTable *ht); ZEND_API void zend_hash_clean(HashTable *ht); - #define zend_hash_init(ht, nSize, pHashFunction, pDestructor, persistent) _zend_hash_init((ht), (nSize), (pHashFunction), (pDestructor), (persistent) ZEND_FILE_LINE_CC) - #define zend_hash_init_ex(ht, nSize, pHashFunction, pDestructor, persistent, bApplyProtection) _zend_hash_init_ex((ht), (nSize), (pHashFunction), (pDestructor), (persistent), (bApplyProtection) ZEND_FILE_LINE_CC) + #define zend_hash_init(ht, nSize, pHashFunction, pDestructor, persistent) _zend_hash_init((ht), (nSize), (pDestructor), (persistent) ZEND_FILE_LINE_CC) + #define zend_hash_init_ex(ht, nSize, pHashFunction, pDestructor, persistent, bApplyProtection) _zend_hash_init_ex((ht), (nSize), (pDestructor), (persistent), (bApplyProtection) ZEND_FILE_LINE_CC) /* additions/updates/changes */ -ZEND_API int _zend_hash_add_or_update(HashTable *ht, const char *arKey, uint nKeyLength, void *pData, uint nDataSize, void **pDest, int flag ZEND_FILE_LINE_DC); +ZEND_API int _zend_hash_add_or_update(HashTable *ht, const char *arKey, zend_str_size_uint nKeyLength, void *pData, uint nDataSize, void **pDest, int flag ZEND_FILE_LINE_DC); #define zend_hash_update(ht, arKey, nKeyLength, pData, nDataSize, pDest) \ _zend_hash_add_or_update(ht, arKey, nKeyLength, pData, nDataSize, pDest, HASH_UPDATE ZEND_FILE_LINE_CC) #define zend_hash_add(ht, arKey, nKeyLength, pData, nDataSize, pDest) \ @@@ -157,19 -157,19 +157,19 @@@ ZEND_API int zend_hash_del_key_or_index zend_hash_del_key_or_index(ht, arKey, nKeyLength, h, HASH_DEL_KEY_QUICK) #define zend_hash_index_del(ht, h) \ zend_hash_del_key_or_index(ht, NULL, 0, h, HASH_DEL_INDEX) - - ZEND_API zend_uint_t zend_get_hash_value(const char *arKey, zend_str_size_uint nKeyLength); + #define zend_get_hash_value \ + zend_hash_func /* Data retreival */ -ZEND_API int zend_hash_find(const HashTable *ht, const char *arKey, uint nKeyLength, void **pData); -ZEND_API int zend_hash_quick_find(const HashTable *ht, const char *arKey, uint nKeyLength, ulong h, void **pData); -ZEND_API int zend_hash_index_find(const HashTable *ht, ulong h, void **pData); +ZEND_API int zend_hash_find(const HashTable *ht, const char *arKey, zend_str_size_uint nKeyLength, void **pData); +ZEND_API int zend_hash_quick_find(const HashTable *ht, const char *arKey, zend_str_size_uint nKeyLength, zend_uint_t h, void **pData); +ZEND_API int zend_hash_index_find(const HashTable *ht, zend_uint_t h, void **pData); /* Misc */ -ZEND_API int zend_hash_exists(const HashTable *ht, const char *arKey, uint nKeyLength); -ZEND_API int zend_hash_quick_exists(const HashTable *ht, const char *arKey, uint nKeyLength, ulong h); -ZEND_API int zend_hash_index_exists(const HashTable *ht, ulong h); -ZEND_API ulong zend_hash_next_free_element(const HashTable *ht); +ZEND_API int zend_hash_exists(const HashTable *ht, const char *arKey, zend_str_size_uint nKeyLength); +ZEND_API int zend_hash_quick_exists(const HashTable *ht, const char *arKey, zend_str_size_uint nKeyLength, zend_uint_t h); +ZEND_API int zend_hash_index_exists(const HashTable *ht, zend_uint_t h); +ZEND_API zend_uint_t zend_hash_next_free_element(const HashTable *ht); /* traversing */ #define zend_hash_has_more_elements_ex(ht, pos) \ diff --cc Zend/zend_operators.h index 7b11445,0152e03..2187581 --- a/Zend/zend_operators.h +++ b/Zend/zend_operators.h @@@ -445,15 -441,9 +445,16 @@@ END_EXTERN_C( #define Z_BVAL(zval) ((zend_bool)(zval).value.lval) #define Z_DVAL(zval) (zval).value.dval #define Z_STRVAL(zval) (zval).value.str.val + +#ifdef ZEND_USE_LEGACY_STRING_TYPES #define Z_STRLEN(zval) (zval).value.str.len +#define Z_STRLEN_P(zval_p) Z_STRLEN(*zval_p) +#define Z_STRLEN_PP(zval_pp) Z_STRLEN(**zval_pp) +#endif + +#define Z_STRSIZE(zval) (zval).value.str.len #define Z_ARRVAL(zval) (zval).value.ht + #define Z_AST(zval) (zval).value.ast #define Z_OBJVAL(zval) (zval).value.obj #define Z_OBJ_HANDLE(zval) Z_OBJVAL(zval).handle #define Z_OBJ_HT(zval) Z_OBJVAL(zval).handlers @@@ -467,8 -457,9 +468,9 @@@ #define Z_BVAL_P(zval_p) Z_BVAL(*zval_p) #define Z_DVAL_P(zval_p) Z_DVAL(*zval_p) #define Z_STRVAL_P(zval_p) Z_STRVAL(*zval_p) -#define Z_STRLEN_P(zval_p) Z_STRLEN(*zval_p) +#define Z_STRSIZE_P(zval_p) Z_STRSIZE(*zval_p) #define Z_ARRVAL_P(zval_p) Z_ARRVAL(*zval_p) + #define Z_AST_P(zval_p) Z_AST(*zval_p) #define Z_OBJPROP_P(zval_p) Z_OBJPROP(*zval_p) #define Z_OBJCE_P(zval_p) Z_OBJCE(*zval_p) #define Z_RESVAL_P(zval_p) Z_RESVAL(*zval_p) @@@ -482,8 -473,9 +484,9 @@@ #define Z_BVAL_PP(zval_pp) Z_BVAL(**zval_pp) #define Z_DVAL_PP(zval_pp) Z_DVAL(**zval_pp) #define Z_STRVAL_PP(zval_pp) Z_STRVAL(**zval_pp) -#define Z_STRLEN_PP(zval_pp) Z_STRLEN(**zval_pp) +#define Z_STRSIZE_PP(zval_pp) Z_STRSIZE(**zval_pp) #define Z_ARRVAL_PP(zval_pp) Z_ARRVAL(**zval_pp) + #define Z_AST_PP(zval_p) Z_AST(**zval_p) #define Z_OBJPROP_PP(zval_pp) Z_OBJPROP(**zval_pp) #define Z_OBJCE_PP(zval_pp) Z_OBJCE(**zval_pp) #define Z_RESVAL_PP(zval_pp) Z_RESVAL(**zval_pp) diff --cc Zend/zend_vm_def.h index 3821374,f5da051..b479914 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@@ -3569,9 -3568,8 +3568,8 @@@ ZEND_VM_HANDLER(99, ZEND_FETCH_CONSTANT } } - if (EXPECTED(zend_hash_quick_find(&ce->constants_table, Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv)+1, Z_HASH_P(opline->op2.zv), (void **) &value) == SUCCESS)) { + if (EXPECTED(zend_hash_quick_find(&ce->constants_table, Z_STRVAL_P(opline->op2.zv), Z_STRSIZE_P(opline->op2.zv)+1, Z_HASH_P(opline->op2.zv), (void **) &value) == SUCCESS)) { - if (Z_TYPE_PP(value) == IS_CONSTANT_ARRAY || - (Z_TYPE_PP(value) & IS_CONSTANT_TYPE_MASK) == IS_CONSTANT) { + if (IS_CONSTANT_TYPE(Z_TYPE_PP(value))) { zend_class_entry *old_scope = EG(scope); EG(scope) = ce; diff --cc Zend/zend_vm_execute.h index 0e38bb7,c6333ed..91875a8 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@@ -3782,9 -3781,8 +3781,8 @@@ static int ZEND_FASTCALL ZEND_FETCH_CO } } - if (EXPECTED(zend_hash_quick_find(&ce->constants_table, Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv)+1, Z_HASH_P(opline->op2.zv), (void **) &value) == SUCCESS)) { + if (EXPECTED(zend_hash_quick_find(&ce->constants_table, Z_STRVAL_P(opline->op2.zv), Z_STRSIZE_P(opline->op2.zv)+1, Z_HASH_P(opline->op2.zv), (void **) &value) == SUCCESS)) { - if (Z_TYPE_PP(value) == IS_CONSTANT_ARRAY || - (Z_TYPE_PP(value) & IS_CONSTANT_TYPE_MASK) == IS_CONSTANT) { + if (IS_CONSTANT_TYPE(Z_TYPE_PP(value))) { zend_class_entry *old_scope = EG(scope); EG(scope) = ce; @@@ -15551,9 -15549,8 +15549,8 @@@ static int ZEND_FASTCALL ZEND_FETCH_CO } } - if (EXPECTED(zend_hash_quick_find(&ce->constants_table, Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv)+1, Z_HASH_P(opline->op2.zv), (void **) &value) == SUCCESS)) { + if (EXPECTED(zend_hash_quick_find(&ce->constants_table, Z_STRVAL_P(opline->op2.zv), Z_STRSIZE_P(opline->op2.zv)+1, Z_HASH_P(opline->op2.zv), (void **) &value) == SUCCESS)) { - if (Z_TYPE_PP(value) == IS_CONSTANT_ARRAY || - (Z_TYPE_PP(value) & IS_CONSTANT_TYPE_MASK) == IS_CONSTANT) { + if (IS_CONSTANT_TYPE(Z_TYPE_PP(value))) { zend_class_entry *old_scope = EG(scope); EG(scope) = ce; @@@ -25048,9 -25045,8 +25045,8 @@@ static int ZEND_FASTCALL ZEND_FETCH_CO } } - if (EXPECTED(zend_hash_quick_find(&ce->constants_table, Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv)+1, Z_HASH_P(opline->op2.zv), (void **) &value) == SUCCESS)) { + if (EXPECTED(zend_hash_quick_find(&ce->constants_table, Z_STRVAL_P(opline->op2.zv), Z_STRSIZE_P(opline->op2.zv)+1, Z_HASH_P(opline->op2.zv), (void **) &value) == SUCCESS)) { - if (Z_TYPE_PP(value) == IS_CONSTANT_ARRAY || - (Z_TYPE_PP(value) & IS_CONSTANT_TYPE_MASK) == IS_CONSTANT) { + if (IS_CONSTANT_TYPE(Z_TYPE_PP(value))) { zend_class_entry *old_scope = EG(scope); EG(scope) = ce;
diff --cc Zend/zend.h index 01db626,1c86d57..9e3fc06 --- a/Zend/zend.h +++ b/Zend/zend.h @@@ -317,9 -317,10 +317,10 @@@ typedef struct _zend_object } zend_object; #include "zend_object_handlers.h" + #include "zend_ast.h" typedef union _zvalue_value { - long lval; /* long value */ + zend_int_t lval; /* long value */ double dval; /* double value */ struct { char *val; @@@ -587,8 -589,8 +589,9 @@@ typedef int (*zend_write_func_t)(const #define IS_RESOURCE 7 #define IS_CONSTANT 8 #define IS_CONSTANT_ARRAY 9 - #define IS_CALLABLE 10 + #define IS_CONSTANT_AST 10 + #define IS_CALLABLE 11 +#define IS_LONG IS_INT /* Ugly hack to support constants as static array indices */ #define IS_CONSTANT_TYPE_MASK 0x00f diff --cc Zend/zend_compile.c index 3cc95b5,8f870c6..8f964fb --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@@ -1908,14 -1908,14 +1908,14 @@@ void zend_do_receive_param(zend_uchar o } } else { cur_arg_info->type_hint = IS_OBJECT; - if (ZEND_FETCH_CLASS_DEFAULT == zend_get_class_fetch_type(Z_STRVAL(class_type->u.constant), Z_STRLEN(class_type->u.constant))) { + if (ZEND_FETCH_CLASS_DEFAULT == zend_get_class_fetch_type(Z_STRVAL(class_type->u.constant), Z_STRSIZE(class_type->u.constant))) { zend_resolve_class_name(class_type TSRMLS_CC); } - Z_STRVAL(class_type->u.constant) = (char*)zend_new_interned_string(Z_STRVAL(class_type->u.constant), Z_STRLEN(class_type->u.constant) + 1, 1 TSRMLS_CC); + Z_STRVAL(class_type->u.constant) = (char*)zend_new_interned_string(Z_STRVAL(class_type->u.constant), Z_STRSIZE(class_type->u.constant) + 1, 1 TSRMLS_CC); cur_arg_info->class_name = Z_STRVAL(class_type->u.constant); - cur_arg_info->class_name_len = Z_STRLEN(class_type->u.constant); + cur_arg_info->class_name_len = Z_STRSIZE(class_type->u.constant); if (op == ZEND_RECV_INIT) { - if (Z_TYPE(initialization->u.constant) == IS_NULL || (Z_TYPE(initialization->u.constant) == IS_CONSTANT && !strcasecmp(Z_STRVAL(initialization->u.constant), "NULL"))) { + if (Z_TYPE(initialization->u.constant) == IS_NULL || (Z_TYPE(initialization->u.constant) == IS_CONSTANT && !strcasecmp(Z_STRVAL(initialization->u.constant), "NULL")) || Z_TYPE(initialization->u.constant) == IS_CONSTANT_AST) { cur_arg_info->allow_null = 1; } else { zend_error_noreturn(E_COMPILE_ERROR, "Default value for parameters with a class type hint can only be NULL"); @@@ -5778,14 -5777,28 +5777,28 @@@ void zend_do_add_static_array_element(z case IS_CONSTANT: /* Ugly hack to denote that this value has a constant index */ Z_TYPE_P(element) |= IS_CONSTANT_INDEX; - Z_STRVAL(offset->u.constant) = erealloc(Z_STRVAL(offset->u.constant), Z_STRLEN(offset->u.constant)+3); - Z_STRVAL(offset->u.constant)[Z_STRLEN(offset->u.constant)+1] = Z_TYPE(offset->u.constant); - Z_STRVAL(offset->u.constant)[Z_STRLEN(offset->u.constant)+2] = 0; - zend_symtable_update(Z_ARRVAL(result->u.constant), Z_STRVAL(offset->u.constant), Z_STRLEN(offset->u.constant)+3, &element, sizeof(zval *), NULL); + Z_STRVAL(offset->u.constant) = erealloc(Z_STRVAL(offset->u.constant), Z_STRSIZE(offset->u.constant)+3); + Z_STRVAL(offset->u.constant)[Z_STRSIZE(offset->u.constant)+1] = Z_TYPE(offset->u.constant); + Z_STRVAL(offset->u.constant)[Z_STRSIZE(offset->u.constant)+2] = 0; + zend_symtable_update(Z_ARRVAL(result->u.constant), Z_STRVAL(offset->u.constant), Z_STRSIZE(offset->u.constant)+3, &element, sizeof(zval *), NULL); zval_dtor(&offset->u.constant); break; + case IS_CONSTANT_AST: { + /* Another ugly hack to store the data about the AST in the array */ + char* key; + int len = sizeof(zend_ast *); + Z_TYPE_P(element) |= IS_CONSTANT_INDEX; + + key = emalloc(len + 2); + *(zend_ast **)key = Z_AST(offset->u.constant); + key[len] = Z_TYPE(offset->u.constant); + key[len + 1] = 0; + zend_symtable_update(Z_ARRVAL(result->u.constant), key, len + 2, &element, sizeof(zval *), NULL); + efree(key); + break; + } case IS_STRING: - zend_symtable_update(Z_ARRVAL(result->u.constant), Z_STRVAL(offset->u.constant), Z_STRLEN(offset->u.constant)+1, &element, sizeof(zval *), NULL); + zend_symtable_update(Z_ARRVAL(result->u.constant), Z_STRVAL(offset->u.constant), Z_STRSIZE(offset->u.constant)+1, &element, sizeof(zval *), NULL); zval_dtor(&offset->u.constant); break; case IS_NULL: diff --cc Zend/zend_hash.h index 0f556f5,c97412b..0e4a4c6 --- a/Zend/zend_hash.h +++ b/Zend/zend_hash.h @@@ -97,15 -97,15 +97,15 @@@ typedef Bucket* HashPosition BEGIN_EXTERN_C() /* startup/shutdown */ - ZEND_API int _zend_hash_init(HashTable *ht, uint nSize, hash_func_t pHashFunction, dtor_func_t pDestructor, zend_bool persistent ZEND_FILE_LINE_DC); - ZEND_API int _zend_hash_init_ex(HashTable *ht, uint nSize, hash_func_t pHashFunction, dtor_func_t pDestructor, zend_bool persistent, zend_bool bApplyProtection ZEND_FILE_LINE_DC); + ZEND_API int _zend_hash_init(HashTable *ht, uint nSize, dtor_func_t pDestructor, zend_bool persistent ZEND_FILE_LINE_DC); + ZEND_API int _zend_hash_init_ex(HashTable *ht, uint nSize, dtor_func_t pDestructor, zend_bool persistent, zend_bool bApplyProtection ZEND_FILE_LINE_DC); ZEND_API void zend_hash_destroy(HashTable *ht); ZEND_API void zend_hash_clean(HashTable *ht); - #define zend_hash_init(ht, nSize, pHashFunction, pDestructor, persistent) _zend_hash_init((ht), (nSize), (pHashFunction), (pDestructor), (persistent) ZEND_FILE_LINE_CC) - #define zend_hash_init_ex(ht, nSize, pHashFunction, pDestructor, persistent, bApplyProtection) _zend_hash_init_ex((ht), (nSize), (pHashFunction), (pDestructor), (persistent), (bApplyProtection) ZEND_FILE_LINE_CC) + #define zend_hash_init(ht, nSize, pHashFunction, pDestructor, persistent) _zend_hash_init((ht), (nSize), (pDestructor), (persistent) ZEND_FILE_LINE_CC) + #define zend_hash_init_ex(ht, nSize, pHashFunction, pDestructor, persistent, bApplyProtection) _zend_hash_init_ex((ht), (nSize), (pDestructor), (persistent), (bApplyProtection) ZEND_FILE_LINE_CC) /* additions/updates/changes */ -ZEND_API int _zend_hash_add_or_update(HashTable *ht, const char *arKey, uint nKeyLength, void *pData, uint nDataSize, void **pDest, int flag ZEND_FILE_LINE_DC); +ZEND_API int _zend_hash_add_or_update(HashTable *ht, const char *arKey, zend_str_size_uint nKeyLength, void *pData, uint nDataSize, void **pDest, int flag ZEND_FILE_LINE_DC); #define zend_hash_update(ht, arKey, nKeyLength, pData, nDataSize, pDest) \ _zend_hash_add_or_update(ht, arKey, nKeyLength, pData, nDataSize, pDest, HASH_UPDATE ZEND_FILE_LINE_CC) #define zend_hash_add(ht, arKey, nKeyLength, pData, nDataSize, pDest) \ @@@ -157,19 -157,19 +157,19 @@@ ZEND_API int zend_hash_del_key_or_index zend_hash_del_key_or_index(ht, arKey, nKeyLength, h, HASH_DEL_KEY_QUICK) #define zend_hash_index_del(ht, h) \ zend_hash_del_key_or_index(ht, NULL, 0, h, HASH_DEL_INDEX) - - ZEND_API zend_uint_t zend_get_hash_value(const char *arKey, zend_str_size_uint nKeyLength); + #define zend_get_hash_value \ + zend_hash_func /* Data retreival */ -ZEND_API int zend_hash_find(const HashTable *ht, const char *arKey, uint nKeyLength, void **pData); -ZEND_API int zend_hash_quick_find(const HashTable *ht, const char *arKey, uint nKeyLength, ulong h, void **pData); -ZEND_API int zend_hash_index_find(const HashTable *ht, ulong h, void **pData); +ZEND_API int zend_hash_find(const HashTable *ht, const char *arKey, zend_str_size_uint nKeyLength, void **pData); +ZEND_API int zend_hash_quick_find(const HashTable *ht, const char *arKey, zend_str_size_uint nKeyLength, zend_uint_t h, void **pData); +ZEND_API int zend_hash_index_find(const HashTable *ht, zend_uint_t h, void **pData); /* Misc */ -ZEND_API int zend_hash_exists(const HashTable *ht, const char *arKey, uint nKeyLength); -ZEND_API int zend_hash_quick_exists(const HashTable *ht, const char *arKey, uint nKeyLength, ulong h); -ZEND_API int zend_hash_index_exists(const HashTable *ht, ulong h); -ZEND_API ulong zend_hash_next_free_element(const HashTable *ht); +ZEND_API int zend_hash_exists(const HashTable *ht, const char *arKey, zend_str_size_uint nKeyLength); +ZEND_API int zend_hash_quick_exists(const HashTable *ht, const char *arKey, zend_str_size_uint nKeyLength, zend_uint_t h); +ZEND_API int zend_hash_index_exists(const HashTable *ht, zend_uint_t h); +ZEND_API zend_uint_t zend_hash_next_free_element(const HashTable *ht); /* traversing */ #define zend_hash_has_more_elements_ex(ht, pos) \ diff --cc Zend/zend_operators.h index 7b11445,0152e03..2187581 --- a/Zend/zend_operators.h +++ b/Zend/zend_operators.h @@@ -445,15 -441,9 +445,16 @@@ END_EXTERN_C( #define Z_BVAL(zval) ((zend_bool)(zval).value.lval) #define Z_DVAL(zval) (zval).value.dval #define Z_STRVAL(zval) (zval).value.str.val + +#ifdef ZEND_USE_LEGACY_STRING_TYPES #define Z_STRLEN(zval) (zval).value.str.len +#define Z_STRLEN_P(zval_p) Z_STRLEN(*zval_p) +#define Z_STRLEN_PP(zval_pp) Z_STRLEN(**zval_pp) +#endif + +#define Z_STRSIZE(zval) (zval).value.str.len #define Z_ARRVAL(zval) (zval).value.ht + #define Z_AST(zval) (zval).value.ast #define Z_OBJVAL(zval) (zval).value.obj #define Z_OBJ_HANDLE(zval) Z_OBJVAL(zval).handle #define Z_OBJ_HT(zval) Z_OBJVAL(zval).handlers @@@ -467,8 -457,9 +468,9 @@@ #define Z_BVAL_P(zval_p) Z_BVAL(*zval_p) #define Z_DVAL_P(zval_p) Z_DVAL(*zval_p) #define Z_STRVAL_P(zval_p) Z_STRVAL(*zval_p) -#define Z_STRLEN_P(zval_p) Z_STRLEN(*zval_p) +#define Z_STRSIZE_P(zval_p) Z_STRSIZE(*zval_p) #define Z_ARRVAL_P(zval_p) Z_ARRVAL(*zval_p) + #define Z_AST_P(zval_p) Z_AST(*zval_p) #define Z_OBJPROP_P(zval_p) Z_OBJPROP(*zval_p) #define Z_OBJCE_P(zval_p) Z_OBJCE(*zval_p) #define Z_RESVAL_P(zval_p) Z_RESVAL(*zval_p) @@@ -482,8 -473,9 +484,9 @@@ #define Z_BVAL_PP(zval_pp) Z_BVAL(**zval_pp) #define Z_DVAL_PP(zval_pp) Z_DVAL(**zval_pp) #define Z_STRVAL_PP(zval_pp) Z_STRVAL(**zval_pp) -#define Z_STRLEN_PP(zval_pp) Z_STRLEN(**zval_pp) +#define Z_STRSIZE_PP(zval_pp) Z_STRSIZE(**zval_pp) #define Z_ARRVAL_PP(zval_pp) Z_ARRVAL(**zval_pp) + #define Z_AST_PP(zval_p) Z_AST(**zval_p) #define Z_OBJPROP_PP(zval_pp) Z_OBJPROP(**zval_pp) #define Z_OBJCE_PP(zval_pp) Z_OBJCE(**zval_pp) #define Z_RESVAL_PP(zval_pp) Z_RESVAL(**zval_pp) diff --cc Zend/zend_vm_def.h index 3821374,f5da051..b479914 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@@ -3569,9 -3568,8 +3568,8 @@@ ZEND_VM_HANDLER(99, ZEND_FETCH_CONSTANT } } - if (EXPECTED(zend_hash_quick_find(&ce->constants_table, Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv)+1, Z_HASH_P(opline->op2.zv), (void **) &value) == SUCCESS)) { + if (EXPECTED(zend_hash_quick_find(&ce->constants_table, Z_STRVAL_P(opline->op2.zv), Z_STRSIZE_P(opline->op2.zv)+1, Z_HASH_P(opline->op2.zv), (void **) &value) == SUCCESS)) { - if (Z_TYPE_PP(value) == IS_CONSTANT_ARRAY || - (Z_TYPE_PP(value) & IS_CONSTANT_TYPE_MASK) == IS_CONSTANT) { + if (IS_CONSTANT_TYPE(Z_TYPE_PP(value))) { zend_class_entry *old_scope = EG(scope); EG(scope) = ce; diff --cc Zend/zend_vm_execute.h index 0e38bb7,c6333ed..91875a8 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@@ -3782,9 -3781,8 +3781,8 @@@ static int ZEND_FASTCALL ZEND_FETCH_CO } } - if (EXPECTED(zend_hash_quick_find(&ce->constants_table, Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv)+1, Z_HASH_P(opline->op2.zv), (void **) &value) == SUCCESS)) { + if (EXPECTED(zend_hash_quick_find(&ce->constants_table, Z_STRVAL_P(opline->op2.zv), Z_STRSIZE_P(opline->op2.zv)+1, Z_HASH_P(opline->op2.zv), (void **) &value) == SUCCESS)) { - if (Z_TYPE_PP(value) == IS_CONSTANT_ARRAY || - (Z_TYPE_PP(value) & IS_CONSTANT_TYPE_MASK) == IS_CONSTANT) { + if (IS_CONSTANT_TYPE(Z_TYPE_PP(value))) { zend_class_entry *old_scope = EG(scope); EG(scope) = ce; @@@ -15551,9 -15549,8 +15549,8 @@@ static int ZEND_FASTCALL ZEND_FETCH_CO } } - if (EXPECTED(zend_hash_quick_find(&ce->constants_table, Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv)+1, Z_HASH_P(opline->op2.zv), (void **) &value) == SUCCESS)) { + if (EXPECTED(zend_hash_quick_find(&ce->constants_table, Z_STRVAL_P(opline->op2.zv), Z_STRSIZE_P(opline->op2.zv)+1, Z_HASH_P(opline->op2.zv), (void **) &value) == SUCCESS)) { - if (Z_TYPE_PP(value) == IS_CONSTANT_ARRAY || - (Z_TYPE_PP(value) & IS_CONSTANT_TYPE_MASK) == IS_CONSTANT) { + if (IS_CONSTANT_TYPE(Z_TYPE_PP(value))) { zend_class_entry *old_scope = EG(scope); EG(scope) = ce; @@@ -25048,9 -25045,8 +25045,8 @@@ static int ZEND_FASTCALL ZEND_FETCH_CO } } - if (EXPECTED(zend_hash_quick_find(&ce->constants_table, Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv)+1, Z_HASH_P(opline->op2.zv), (void **) &value) == SUCCESS)) { + if (EXPECTED(zend_hash_quick_find(&ce->constants_table, Z_STRVAL_P(opline->op2.zv), Z_STRSIZE_P(opline->op2.zv)+1, Z_HASH_P(opline->op2.zv), (void **) &value) == SUCCESS)) { - if (Z_TYPE_PP(value) == IS_CONSTANT_ARRAY || - (Z_TYPE_PP(value) & IS_CONSTANT_TYPE_MASK) == IS_CONSTANT) { + if (IS_CONSTANT_TYPE(Z_TYPE_PP(value))) { zend_class_entry *old_scope = EG(scope); EG(scope) = ce;