summaryrefslogtreecommitdiff
path: root/Zend
diff options
context:
space:
mode:
authorZeev Suraski <zeev@php.net>2003-02-10 09:45:27 +0000
committerZeev Suraski <zeev@php.net>2003-02-10 09:45:27 +0000
commitdbb73d8f1ee28c6b1edaaa3b630cf1dc3f5f32bf (patch)
tree7bd4c08bbeb54d34962f8efda144f6f45aff91eb /Zend
parentedc8e67e3b47603b2aa3b37e4f7c48cf13a59574 (diff)
downloadphp-git-dbb73d8f1ee28c6b1edaaa3b630cf1dc3f5f32bf.tar.gz
Add ability to reference self:: and parent:: in constant initializers
(bug #21849)
Diffstat (limited to 'Zend')
-rw-r--r--Zend/zend_execute.c6
-rw-r--r--Zend/zend_execute_API.c17
2 files changed, 20 insertions, 3 deletions
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c
index 3693fc6397..8e4ba13a36 100644
--- a/Zend/zend_execute.c
+++ b/Zend/zend_execute.c
@@ -2211,7 +2211,7 @@ int zend_fetch_class_handler(ZEND_OPCODE_HANDLER_ARGS)
if (EX(opline)->op1.op_type == IS_UNUSED) {
if (EX(opline)->extended_value == ZEND_FETCH_CLASS_SELF) {
if (!EG(scope)) {
- zend_error(E_ERROR, "Cannot fetch self:: when no class scope is active");
+ zend_error(E_ERROR, "Cannot access self:: when no class scope is active");
}
EX_T(EX(opline)->result.u.var).EA.class_entry = EG(scope);
NEXT_OPCODE();
@@ -2220,10 +2220,10 @@ int zend_fetch_class_handler(ZEND_OPCODE_HANDLER_ARGS)
NEXT_OPCODE();
} else if (EX(opline)->extended_value == ZEND_FETCH_CLASS_PARENT) {
if (!EG(scope)) {
- zend_error(E_ERROR, "Cannot fetch parent:: when no class scope is active");
+ zend_error(E_ERROR, "Cannot access parent:: when no class scope is active");
}
if (!EG(scope)->parent) {
- zend_error(E_ERROR, "Cannot fetch parent:: as current class scope has no parent");
+ zend_error(E_ERROR, "Cannot access parent:: when current class scope has no parent");
}
EX_T(EX(opline)->result.u.var).EA.class_entry = EG(scope)->parent;
NEXT_OPCODE();
diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c
index 3788ae263f..b170603bec 100644
--- a/Zend/zend_execute_API.c
+++ b/Zend/zend_execute_API.c
@@ -378,6 +378,23 @@ ZEND_API int zval_update_constant(zval **pp, void *arg TSRMLS_DC)
last = tsrm_strtok_r(p->value.str.val, ":", &temp);
+ if (strcasecmp(last, "self")==0) {
+ if (EG(scope)) {
+ last = EG(scope)->name;
+ } else {
+ zend_error(E_ERROR, "Cannot access self:: when no class scope is active");
+ }
+ } else if (strcasecmp(last, "parent")==0) {
+ if (!EG(scope)) {
+ zend_error(E_ERROR, "Cannot access parent:: when no class scope is active");
+ } else if (!EG(scope)->parent) {
+ zend_error(E_ERROR, "Cannot access parent:: when current class scope has no parent");
+ } else {
+ last = EG(scope)->parent->name;
+ }
+ }
+
+
if (zend_lookup_class(last, strlen(last), &ce TSRMLS_CC) == FAILURE) {
zend_error(E_ERROR, "Undefined class '%s'", last);
}