summaryrefslogtreecommitdiff
path: root/Zend/zend_vm_execute.h
diff options
context:
space:
mode:
authorNikita Popov <nikic@php.net>2015-05-05 18:22:20 +0200
committerNikita Popov <nikic@php.net>2015-05-05 21:14:03 +0200
commitdd1fdfb17c05931d73c67603231acc557ce59620 (patch)
treea89b05453ed98fd6a42716d09b08cf5b6a39dabc /Zend/zend_vm_execute.h
parentd7351a5c7497103795c75f6c8d99bebc79c2abd9 (diff)
downloadphp-git-dd1fdfb17c05931d73c67603231acc557ce59620.tar.gz
Use ZEND_FETCH_CLASS_NAME for dynamic self::class etc
Extend the opcode to support getting the parent and static name and then use it for dynamic ::class resolution.
Diffstat (limited to 'Zend/zend_vm_execute.h')
-rw-r--r--Zend/zend_vm_execute.h26
1 files changed, 16 insertions, 10 deletions
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index a9342fc111..2e2f0209bf 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -1793,7 +1793,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_NAME_SPEC_HANDLER(
USE_OPLINE
if (EG(scope) && EG(scope)->name) {
- ZVAL_STR_COPY(EX_VAR(opline->result.var), EG(scope)->name);
+ switch (opline->extended_value) {
+ case ZEND_FETCH_CLASS_SELF:
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), EG(scope)->name);
+ break;
+ case ZEND_FETCH_CLASS_PARENT:
+ if (EG(scope)->parent) {
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), EG(scope)->parent->name);
+ } else {
+ ZVAL_EMPTY_STRING(EX_VAR(opline->result.var));
+ }
+ break;
+ case ZEND_FETCH_CLASS_STATIC:
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), EX(called_scope)->name);
+ break;
+ EMPTY_SWITCH_DEFAULT_CASE()
+ }
} else {
ZVAL_EMPTY_STRING(EX_VAR(opline->result.var));
}
@@ -5819,9 +5834,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CONSTANT_SPEC_CONST_CONS
CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce, value);
}
ZVAL_DUP(EX_VAR(opline->result.var), value);
- } else if (Z_STRLEN_P(EX_CONSTANT(opline->op2)) == sizeof("class")-1 && memcmp(Z_STRVAL_P(EX_CONSTANT(opline->op2)), "class", sizeof("class") - 1) == 0) {
- /* "class" is assigned as a case-sensitive keyword from zend_do_resolve_class_name */
- ZVAL_STR_COPY(EX_VAR(opline->result.var), ce->name);
} else {
zend_error(E_EXCEPTION | E_ERROR, "Undefined class constant '%s'", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
}
@@ -17408,9 +17420,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CONSTANT_SPEC_VAR_CONST_
CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce, value);
}
ZVAL_DUP(EX_VAR(opline->result.var), value);
- } else if (Z_STRLEN_P(EX_CONSTANT(opline->op2)) == sizeof("class")-1 && memcmp(Z_STRVAL_P(EX_CONSTANT(opline->op2)), "class", sizeof("class") - 1) == 0) {
- /* "class" is assigned as a case-sensitive keyword from zend_do_resolve_class_name */
- ZVAL_STR_COPY(EX_VAR(opline->result.var), ce->name);
} else {
zend_error(E_EXCEPTION | E_ERROR, "Undefined class constant '%s'", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
}
@@ -23780,9 +23789,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CONSTANT_SPEC_UNUSED_CON
CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce, value);
}
ZVAL_DUP(EX_VAR(opline->result.var), value);
- } else if (Z_STRLEN_P(EX_CONSTANT(opline->op2)) == sizeof("class")-1 && memcmp(Z_STRVAL_P(EX_CONSTANT(opline->op2)), "class", sizeof("class") - 1) == 0) {
- /* "class" is assigned as a case-sensitive keyword from zend_do_resolve_class_name */
- ZVAL_STR_COPY(EX_VAR(opline->result.var), ce->name);
} else {
zend_error(E_EXCEPTION | E_ERROR, "Undefined class constant '%s'", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
}