summaryrefslogtreecommitdiff
path: root/Zend/zend_constants.c
diff options
context:
space:
mode:
authorMarcus Boerger <helly@php.net>2008-11-04 15:58:55 +0000
committerMarcus Boerger <helly@php.net>2008-11-04 15:58:55 +0000
commit7126de4912d9d4c7499deb1f9239980400aa7ec7 (patch)
treedc1bbf251d26825d2f65f599a6139044effdbc48 /Zend/zend_constants.c
parent6ca3ad3f41fd44b6f00adb9692d5503a33ecd290 (diff)
downloadphp-git-7126de4912d9d4c7499deb1f9239980400aa7ec7.tar.gz
- Next step in namespaces, using / as namespace separator.
Diffstat (limited to 'Zend/zend_constants.c')
-rw-r--r--Zend/zend_constants.c111
1 files changed, 60 insertions, 51 deletions
diff --git a/Zend/zend_constants.c b/Zend/zend_constants.c
index 0b76ab28ad..4bff7b6e7e 100644
--- a/Zend/zend_constants.c
+++ b/Zend/zend_constants.c
@@ -277,27 +277,27 @@ ZEND_API int zend_get_constant_ex(const char *name, uint name_len, zval *result,
zend_constant *c;
int retval = 1;
char *colon;
+ zend_class_entry *ce = NULL;
+ char *class_name;
+ zval **ret_constant;
/* Skip leading :: */
- if (name[0] == ':' && name[1] == ':') {
- name += 2;
- name_len -= 2;
+ if (name[0] == '\\') {
+ name += 1;
+ name_len -= 1;
flags &= ZEND_FETCH_CLASS_SILENT;
}
-
+
if ((colon = zend_memrchr(name, ':', name_len)) &&
- colon > name &&
- *(colon-1) == ':') {
- /* compound constant name */
- zend_class_entry *ce = NULL;
+ colon > name && (*(colon - 1) == ':')) {
int class_name_len = colon - name - 1;
int const_name_len = name_len - class_name_len - 2;
- char *constant_name = constant_name = colon + 1;
- char *class_name = estrndup(name, class_name_len);
- char *lcname = zend_str_tolower_dup(class_name, class_name_len);
- zval **ret_constant;
+ char *constant_name = colon + 1;
+ char *lcname;
+ class_name = estrndup(name, class_name_len);
+ lcname = zend_str_tolower_dup(class_name, class_name_len);
if (!scope) {
if (EG(in_execution)) {
scope = EG(scope);
@@ -334,59 +334,68 @@ ZEND_API int zend_get_constant_ex(const char *name, uint name_len, zval *result,
}
efree(lcname);
} else {
- /* Check for namespace constant */
- char *nsname;
- unsigned int nsname_len;
-
- /* Concatenate lowercase namespace name and constant name */
- lcname = erealloc(lcname, class_name_len + 2 + const_name_len + 1);
- lcname[class_name_len] = ':';
- lcname[class_name_len+1] = ':';
- memcpy(lcname + class_name_len + 2, constant_name, const_name_len + 1);
-
- nsname = lcname;
- nsname_len = class_name_len + 2 + const_name_len;
- if (flags & ZEND_FETCH_CLASS_RT_NS_NAME) {
- nsname = (char *)memchr(nsname, ':', nsname_len) + 2;
- nsname_len -= (nsname - lcname);
- }
-
- if (zend_hash_find(EG(zend_constants), nsname, nsname_len+1, (void **) &c) == SUCCESS) {
- efree(lcname);
- efree(class_name);
- *result = c->value;
- zval_update_constant_ex(&result, (void*)1, NULL TSRMLS_CC);
- zval_copy_ctor(result);
- Z_SET_REFCOUNT_P(result, 1);
- Z_UNSET_ISREF_P(result);
- return 1;
- }
efree(lcname);
-
if ((flags & IS_CONSTANT_RT_NS_CHECK) == 0) {
/* Check for class */
ce = zend_fetch_class(class_name, class_name_len, flags TSRMLS_CC);
}
}
-
if (retval && ce) {
if (zend_hash_find(&ce->constants_table, constant_name, const_name_len+1, (void **) &ret_constant) != SUCCESS) {
retval = 0;
- }
- } else {
- if ((flags & ZEND_FETCH_CLASS_RT_NS_NAME) == 0) {
- if ((flags & IS_CONSTANT_RT_NS_CHECK) != 0) {
- name = constant_name;
- name_len = const_name_len;
- efree(class_name);
- return zend_get_constant(name, name_len, result TSRMLS_CC);
- }
if ((flags & ZEND_FETCH_CLASS_SILENT) == 0) {
- zend_error(E_ERROR, "Class '%s' not found", class_name);
+ zend_error(E_ERROR, "Undefined class constant '%s::%s'", class_name, constant_name);
}
}
+ } else if (!ce) {
retval = 0;
}
+ goto finish;
+ }
+
+ if ((colon = zend_memrchr(name, '\\', name_len)) &&
+ colon > name) {
+ /* compound constant name */
+ int class_name_len = colon - name;
+ int const_name_len = name_len - class_name_len - 1;
+ char *constant_name = colon + 1;
+ char *lcname;
+ char *nsname;
+ unsigned int nsname_len;
+
+ class_name = estrndup(name, class_name_len);
+ lcname = zend_str_tolower_dup(class_name, class_name_len);
+ /* Check for namespace constant */
+
+ /* Concatenate lowercase namespace name and constant name */
+ lcname = erealloc(lcname, class_name_len + 1 + const_name_len + 1);
+ lcname[class_name_len] = '\\';
+ memcpy(lcname + class_name_len + 1, constant_name, const_name_len + 1);
+
+ nsname = lcname;
+ nsname_len = class_name_len + 1 + const_name_len;
+
+ if (zend_hash_find(EG(zend_constants), nsname, nsname_len+1, (void **) &c) == SUCCESS) {
+ efree(lcname);
+ efree(class_name);
+ *result = c->value;
+ zval_update_constant_ex(&result, (void*)1, NULL TSRMLS_CC);
+ zval_copy_ctor(result);
+ Z_SET_REFCOUNT_P(result, 1);
+ Z_UNSET_ISREF_P(result);
+ return 1;
+ }
+
+ efree(lcname);
+
+ if ((flags & IS_CONSTANT_RT_NS_CHECK) != 0) {
+ name = constant_name;
+ name_len = const_name_len;
+ efree(class_name);
+ return zend_get_constant(name, name_len, result TSRMLS_CC);
+ }
+ retval = 0;
+finish:
efree(class_name);
if (retval) {