switch (fetch_type) {
case ZEND_FETCH_CLASS_SELF:
if (CG(active_class_entry)->ce_flags & ZEND_ACC_TRAIT) {
- zval class_str_zv;
- zend_ast *class_str_ast, *class_const_ast;
-
- ZVAL_STRING(&class_str_zv, "class");
- class_str_ast = zend_ast_create_zval(&class_str_zv);
- class_const_ast = zend_ast_create(ZEND_AST_CLASS_CONST, name_ast, class_str_ast);
-
- zend_compile_expr(result, class_const_ast);
-
- zval_ptr_dtor(&class_str_zv);
+ zend_op *opline = zend_emit_op_tmp(result, ZEND_FETCH_CLASS_NAME, NULL, NULL);
+ opline->extended_value = fetch_type;
} else {
result->op_type = IS_CONST;
ZVAL_STR_COPY(&result->u.constant, CG(active_class_entry)->name);
case ZEND_FETCH_CLASS_STATIC:
case ZEND_FETCH_CLASS_PARENT:
{
- zval class_str_zv;
- zend_ast *class_str_ast, *class_const_ast;
-
- ZVAL_STRING(&class_str_zv, "class");
- class_str_ast = zend_ast_create_zval(&class_str_zv);
- class_const_ast = zend_ast_create(
- ZEND_AST_CLASS_CONST, name_ast, class_str_ast);
-
- zend_compile_expr(result, class_const_ast);
-
- zval_ptr_dtor(&class_str_zv);
+ zend_op *opline = zend_emit_op_tmp(result, ZEND_FETCH_CLASS_NAME, NULL, NULL);
+ opline->extended_value = fetch_type;
}
break;
case ZEND_FETCH_CLASS_DEFAULT:
void zend_compile_magic_const(znode *result, zend_ast *ast) /* {{{ */
{
+ zend_op *opline;
+
if (zend_try_ct_eval_magic_const(&result->u.constant, ast)) {
result->op_type = IS_CONST;
return;
CG(active_class_entry) &&
(CG(active_class_entry)->ce_flags & ZEND_ACC_TRAIT) != 0);
- zend_emit_op_tmp(result, ZEND_FETCH_CLASS_NAME, NULL, NULL);
+ opline = zend_emit_op_tmp(result, ZEND_FETCH_CLASS_NAME, NULL, NULL);
+ opline->extended_value = ZEND_FETCH_CLASS_SELF;
}
/* }}} */
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)));
}
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));
}
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));
}
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)));
}
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)));
}
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)));
}