summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@php.net>2007-11-02 10:11:59 +0000
committerDmitry Stogov <dmitry@php.net>2007-11-02 10:11:59 +0000
commit860fd6fd2bf5094231fb69a6c9f0b1a4ec953ed6 (patch)
tree0035c2ff7ac556bf8a67ebea1aa72dd3d5003ebd
parent006b676806fc0ff50ebadd4287ba6447b22faca1 (diff)
downloadphp-git-860fd6fd2bf5094231fb69a6c9f0b1a4ec953ed6.tar.gz
Reimplemented support for namespaces in indexes id constant arrays (removed zval.idx_type)
-rw-r--r--Zend/zend.h1
-rw-r--r--Zend/zend_compile.c15
-rw-r--r--Zend/zend_execute_API.c51
3 files changed, 27 insertions, 40 deletions
diff --git a/Zend/zend.h b/Zend/zend.h
index 8f922e1572..58327d2a00 100644
--- a/Zend/zend.h
+++ b/Zend/zend.h
@@ -336,7 +336,6 @@ struct _zval_struct {
zend_uint refcount__gc;
zend_uchar type; /* active type */
zend_uchar is_ref__gc;
- zend_uchar idx_type; /* type of element's index in constant array */
};
#define Z_REFCOUNT_PP(ppz) Z_REFCOUNT_P(*(ppz))
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index f8c956664f..9e880bb36c 100644
--- a/Zend/zend_compile.c
+++ b/Zend/zend_compile.c
@@ -3946,9 +3946,18 @@ void zend_do_add_static_array_element(znode *result, znode *offset, znode *expr)
case IS_CONSTANT:
/* Ugly hack to denote that this value has a constant index */
Z_TYPE_P(element) |= IS_CONSTANT_INDEX;
- element->idx_type = Z_TYPE(offset->u.constant);
- /* break missing intentionally */
- utype = UG(unicode)?IS_UNICODE:IS_STRING;
+ if (UG(unicode)) {
+ Z_USTRVAL(offset->u.constant) = eurealloc(Z_USTRVAL(offset->u.constant), Z_USTRLEN(offset->u.constant)+3);
+ Z_USTRVAL(offset->u.constant)[Z_USTRLEN(offset->u.constant)+1] = Z_TYPE(offset->u.constant);
+ Z_USTRVAL(offset->u.constant)[Z_USTRLEN(offset->u.constant)+2] = 0;
+ } else {
+ 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_u_symtable_update(result->u.constant.value.ht, ZEND_STR_TYPE, Z_UNIVAL(offset->u.constant), Z_UNILEN(offset->u.constant)+3, &element, sizeof(zval *), NULL);
+ zval_dtor(&offset->u.constant);
+ break;
case IS_STRING:
case IS_UNICODE:
zend_u_symtable_update(Z_ARRVAL(result->u.constant), utype, Z_UNIVAL(offset->u.constant), Z_UNILEN(offset->u.constant)+1, &element, sizeof(zval *), NULL);
diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c
index 7145517464..f3a549d39b 100644
--- a/Zend/zend_execute_API.c
+++ b/Zend/zend_execute_API.c
@@ -549,50 +549,29 @@ ZEND_API int zval_update_constant_ex(zval **pp, void *arg, zend_class_entry *sco
zend_hash_move_forward(Z_ARRVAL_P(p));
continue;
}
- if (!zend_u_get_constant_ex(ZEND_STR_TYPE, str_index, str_index_len - 1, &const_value, scope, (*element)->idx_type TSRMLS_CC)) {
- if ((UG(unicode) && (colon.u = u_memchr(str_index.u, ':', str_index_len - 1)) && colon.u[1] == ':') ||
- (!UG(unicode) && (colon.s = memchr(str_index.s, ':', str_index_len - 1)) && colon.s[1] == ':')
+ if (!zend_u_get_constant_ex(ZEND_STR_TYPE, str_index, str_index_len - 3, &const_value, scope, (UG(unicode) ? str_index.u[str_index_len-2] : str_index.s[str_index_len-2]) TSRMLS_CC)) {
+ if ((UG(unicode) && (colon.u = u_memchr(str_index.u, ':', str_index_len - 3)) && colon.u[1] == ':') ||
+ (!UG(unicode) && (colon.s = memchr(str_index.s, ':', str_index_len - 3)) && colon.s[1] == ':')
) {
zend_error(E_ERROR, "Undefined class constant '%v'", str_index);
}
zend_error(E_NOTICE, "Use of undefined constant %v - assumed '%v'", str_index, str_index);
- zend_hash_move_forward(Z_ARRVAL_P(p));
- continue;
+ ZVAL_TEXTL(&const_value, str_index, str_index_len-3, 1);
}
- if (UG(unicode)) {
- if (Z_TYPE(const_value) == IS_UNICODE &&
- Z_USTRLEN(const_value) == str_index_len - 1 &&
- !u_strncmp(Z_USTRVAL(const_value), str_index.u, str_index_len)
- ) {
- /* constant value is the same as its name */
- zval_dtor(&const_value);
- zend_hash_move_forward(Z_ARRVAL_P(p));
- continue;
- }
- } else {
- if (Z_TYPE(const_value) == IS_STRING &&
- Z_STRLEN(const_value) == str_index_len - 1 &&
- !strncmp(Z_STRVAL(const_value), str_index.s, str_index_len)
- ) {
- /* constant value is the same as its name */
- zval_dtor(&const_value);
- zend_hash_move_forward(Z_ARRVAL_P(p));
- continue;
- }
+ if (Z_REFCOUNT_PP(element) > 1) {
+ ALLOC_ZVAL(new_val);
+ *new_val = **element;
+ zval_copy_ctor(new_val);
+ Z_SET_REFCOUNT_P(new_val, 1);
+ Z_UNSET_ISREF_P(new_val);
+
+ /* preserve this bit for inheritance */
+ Z_TYPE_PP(element) |= IS_CONSTANT_INDEX;
+ zval_ptr_dtor(element);
+ *element = new_val;
}
- ALLOC_ZVAL(new_val);
- *new_val = **element;
- zval_copy_ctor(new_val);
- Z_SET_REFCOUNT_P(new_val, 1);
- Z_UNSET_ISREF_P(new_val);
-
- /* preserve this bit for inheritance */
- Z_TYPE_PP(element) |= IS_CONSTANT_INDEX;
- zval_ptr_dtor(element);
- *element = new_val;
-
switch (Z_TYPE(const_value)) {
case IS_STRING:
case IS_UNICODE: