summaryrefslogtreecommitdiff
path: root/Zend/zend_compile.c
diff options
context:
space:
mode:
authorZeev Suraski <zeev@php.net>2003-08-03 08:21:08 +0000
committerZeev Suraski <zeev@php.net>2003-08-03 08:21:08 +0000
commit9d7122fb53fd7f043f2cde7eeb4f9aa0e2115adf (patch)
treea978e8d04915e4df8a3ae1f1524ebcc55f1aed7a /Zend/zend_compile.c
parent973b85672b4af12e8cb50376d89149b358c484f5 (diff)
downloadphp-git-9d7122fb53fd7f043f2cde7eeb4f9aa0e2115adf.tar.gz
Generalize fetch_class
Diffstat (limited to 'Zend/zend_compile.c')
-rw-r--r--Zend/zend_compile.c39
1 files changed, 27 insertions, 12 deletions
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index 605e4e491d..a4e212a973 100644
--- a/Zend/zend_compile.c
+++ b/Zend/zend_compile.c
@@ -1185,19 +1185,20 @@ void zend_do_fetch_class(znode *result, znode *class_name TSRMLS_DC)
opline->extended_value = ZEND_FETCH_CLASS_GLOBAL;
CG(catch_begin) = fetch_class_op_number;
if (class_name->op_type == IS_CONST) {
+ int fetch_type;
+
zend_str_tolower(class_name->u.constant.value.str.val, class_name->u.constant.value.str.len);
- if ((class_name->u.constant.value.str.len == (sizeof("self") - 1)) &&
- !memcmp(class_name->u.constant.value.str.val, "self", sizeof("self"))) {
- SET_UNUSED(opline->op2);
- opline->extended_value = ZEND_FETCH_CLASS_SELF;
- zval_dtor(&class_name->u.constant);
- } else if ((class_name->u.constant.value.str.len == (sizeof("parent") - 1)) &&
- !memcmp(class_name->u.constant.value.str.val, "parent", sizeof("parent"))) {
- SET_UNUSED(opline->op2);
- opline->extended_value = ZEND_FETCH_CLASS_PARENT;
- zval_dtor(&class_name->u.constant);
- } else {
- opline->op2 = *class_name;
+ fetch_type = zend_get_class_fetch_type(class_name->u.constant.value.str.val, class_name->u.constant.value.str.len);
+ switch (fetch_type) {
+ case ZEND_FETCH_CLASS_SELF:
+ case ZEND_FETCH_CLASS_PARENT:
+ SET_UNUSED(opline->op2);
+ opline->extended_value = fetch_type;
+ zval_dtor(&class_name->u.constant);
+ break;
+ default:
+ opline->op2 = *class_name;
+ break;
}
} else {
opline->op2 = *class_name;
@@ -3414,6 +3415,20 @@ void zend_initialize_class_data(zend_class_entry *ce, zend_bool nullify_handlers
ce->interfaces = NULL;
}
+
+int zend_get_class_fetch_type(char *class_name, uint class_name_len)
+{
+ if ((class_name_len == sizeof("self")-1) &&
+ !memcmp(class_name, "self", sizeof("self"))) {
+ return ZEND_FETCH_CLASS_SELF;
+ } else if ((class_name_len == sizeof("parent")-1) &&
+ !memcmp(class_name, "parent", sizeof("parent"))) {
+ return ZEND_FETCH_CLASS_PARENT;
+ } else {
+ return ZEND_FETCH_CLASS_DEFAULT;
+ }
+}
+
/*
* Local variables:
* tab-width: 4