summaryrefslogtreecommitdiff
path: root/Zend/zend_execute.c
diff options
context:
space:
mode:
Diffstat (limited to 'Zend/zend_execute.c')
-rw-r--r--Zend/zend_execute.c86
1 files changed, 22 insertions, 64 deletions
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c
index 1c0866d8a1..64325d2394 100644
--- a/Zend/zend_execute.c
+++ b/Zend/zend_execute.c
@@ -2202,81 +2202,39 @@ int zend_add_var_handler(ZEND_OPCODE_HANDLER_ARGS)
NEXT_OPCODE();
}
+
int zend_fetch_class_handler(ZEND_OPCODE_HANDLER_ARGS)
{
- zend_class_entry **pce;
- zend_class_entry *ce = NULL;
- zend_bool is_const;
char *class_name_strval;
- zend_uint class_name_strlen;
- zend_bool free_class_name = 0;
- zval *class_name;
+ zval *class_name;
+
if (EX(opline)->op2.op_type == IS_UNUSED) {
- if (EX(opline)->extended_value == ZEND_FETCH_CLASS_SELF) {
- if (!EG(scope)) {
- 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();
- } else if (EX(opline)->extended_value == ZEND_FETCH_CLASS_PARENT) {
- if (!EG(scope)) {
- zend_error(E_ERROR, "Cannot access parent:: when no class scope is active");
- }
- if (!EG(scope)->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();
- }
+ EX_T(EX(opline)->result.u.var).EA.class_entry = zend_fetch_class(NULL, 0, EX(opline)->extended_value TSRMLS_CC);
+ NEXT_OPCODE();
}
- is_const = (EX(opline)->op2.op_type == IS_CONST);
+ class_name = get_zval_ptr(&EX(opline)->op2, EX(Ts), &EG(free_op2), BP_VAR_R);
- if (is_const) {
- class_name_strval = EX(opline)->op2.u.constant.value.str.val;
- class_name_strlen = EX(opline)->op2.u.constant.value.str.len;
- } else {
- class_name = get_zval_ptr(&EX(opline)->op2, EX(Ts), &EG(free_op2), BP_VAR_R);
-
- switch (class_name->type) {
- case IS_OBJECT:
- ce = Z_OBJCE_P(class_name);
- break;
- case IS_STRING:
- convert_to_string_ex(&class_name);
+ switch (class_name->type) {
+ case IS_OBJECT:
+ EX_T(EX(opline)->result.u.var).EA.class_entry = Z_OBJCE_P(class_name);
+ break;
+ case IS_STRING:
+ if (EX(opline)->op2.op_type != IS_CONST) {
class_name_strval = zend_str_tolower_dup(class_name->value.str.val, class_name->value.str.len);
- class_name_strlen = class_name->value.str.len;
- free_class_name = 1;
- break;
- default:
- zend_error(E_ERROR, "Class name must be a valid object or a string");
- break;
- }
- }
-
- if (!ce) {
- int retval;
-
- if (EX(opline)->op1.op_type == IS_UNUSED) {
- retval = zend_lookup_class(class_name_strval, class_name_strlen, &pce TSRMLS_CC);
- }
- if (retval==SUCCESS) {
- ce = *pce;
- }
+ EX_T(EX(opline)->result.u.var).EA.class_entry = zend_fetch_class(class_name_strval, Z_STRLEN_P(class_name), ZEND_FETCH_CLASS_DEFAULT TSRMLS_CC);
+ efree(class_name_strval);
+ } else {
+ EX_T(EX(opline)->result.u.var).EA.class_entry = zend_fetch_class(Z_STRVAL_P(class_name), Z_STRLEN_P(class_name), ZEND_FETCH_CLASS_DEFAULT TSRMLS_CC);
+ }
+ break;
+ default:
+ zend_error(E_ERROR, "Class name must be a valid object or a string");
+ break;
}
- if (!ce) {
- zend_error(E_ERROR, "Class '%s' not found", class_name_strval);
- } else {
- EX_T(EX(opline)->result.u.var).EA.class_entry = ce;
- }
- if (!is_const) {
- if (free_class_name) {
- efree(class_name_strval);
- }
- FREE_OP(EX(Ts), &EX(opline)->op2, EG(free_op2));
- }
+ FREE_OP(EX(Ts), &EX(opline)->op2, EG(free_op2));
NEXT_OPCODE();
}