Skip to content

Commit 3d84aef

Browse files
committed
Separate zend_fetch_static_property_address() into an inline function
1 parent fafce65 commit 3d84aef

File tree

3 files changed

+95
-800
lines changed

3 files changed

+95
-800
lines changed

Zend/zend_execute.c

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1927,6 +1927,91 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c
19271927
}
19281928
}
19291929

1930+
static zend_always_inline zval* zend_fetch_static_property_address(zend_execute_data *execute_data, zval *varname, zend_uchar varname_type, znode_op op2, zend_uchar op2_type)
1931+
{
1932+
zval *retval;
1933+
zend_string *name;
1934+
zend_class_entry *ce;
1935+
1936+
if (varname_type == IS_CONST) {
1937+
name = Z_STR_P(varname);
1938+
} else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
1939+
name = Z_STR_P(varname);
1940+
zend_string_addref(name);
1941+
} else {
1942+
if (varname_type == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
1943+
zval_undefined_cv(EX(opline)->op1.var, execute_data);
1944+
}
1945+
name = zval_get_string(varname);
1946+
}
1947+
1948+
if (op2_type == IS_CONST) {
1949+
if (varname_type == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(varname))) != NULL)) {
1950+
retval = CACHED_PTR(Z_CACHE_SLOT_P(varname) + sizeof(void*));
1951+
1952+
/* check if static properties were destoyed */
1953+
if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
1954+
zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
1955+
return NULL;
1956+
}
1957+
1958+
return retval;
1959+
} else {
1960+
zval *class_name = EX_CONSTANT(op2);
1961+
1962+
if (UNEXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(class_name))) == NULL)) {
1963+
ce = zend_fetch_class_by_name(Z_STR_P(class_name), class_name + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
1964+
if (UNEXPECTED(ce == NULL)) {
1965+
if (varname_type != IS_CONST) {
1966+
zend_string_release(name);
1967+
}
1968+
return NULL;
1969+
}
1970+
CACHE_PTR(Z_CACHE_SLOT_P(class_name), ce);
1971+
}
1972+
}
1973+
} else {
1974+
if (op2_type == IS_UNUSED) {
1975+
ce = zend_fetch_class(NULL, op2.num);
1976+
if (UNEXPECTED(ce == NULL)) {
1977+
if (varname_type != IS_CONST) {
1978+
zend_string_release(name);
1979+
}
1980+
return NULL;
1981+
}
1982+
} else {
1983+
ce = Z_CE_P(EX_VAR(op2.var));
1984+
}
1985+
if (varname_type == IS_CONST &&
1986+
(retval = CACHED_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(varname), ce)) != NULL) {
1987+
1988+
/* check if static properties were destoyed */
1989+
if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
1990+
zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
1991+
return NULL;
1992+
}
1993+
1994+
return retval;
1995+
}
1996+
}
1997+
1998+
retval = zend_std_get_static_property(ce, name, 0);
1999+
2000+
if (varname_type != IS_CONST) {
2001+
zend_string_release(name);
2002+
}
2003+
2004+
if (UNEXPECTED(retval == NULL)) {
2005+
return NULL;
2006+
}
2007+
2008+
if (varname_type == IS_CONST) {
2009+
CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(varname), ce, retval);
2010+
}
2011+
2012+
return retval;
2013+
}
2014+
19302015
#if ZEND_INTENSIVE_DEBUGGING
19312016

19322017
#define CHECK_SYMBOL_TABLES() \

Zend/zend_vm_def.h

Lines changed: 1 addition & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -1538,100 +1538,21 @@ ZEND_VM_HELPER(zend_fetch_static_prop_helper, CONST|TMPVAR|CV, UNUSED|CONST|VAR,
15381538
zend_free_op free_op1;
15391539
zval *varname;
15401540
zval *retval;
1541-
zend_string *name;
1542-
zend_class_entry *ce;
15431541

15441542
SAVE_OPLINE();
15451543
varname = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
15461544

1547-
if (OP1_TYPE == IS_CONST) {
1548-
name = Z_STR_P(varname);
1549-
} else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
1550-
name = Z_STR_P(varname);
1551-
zend_string_addref(name);
1552-
} else {
1553-
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
1554-
GET_OP1_UNDEF_CV(varname, BP_VAR_R);
1555-
}
1556-
name = zval_get_string(varname);
1557-
}
1558-
1559-
if (OP2_TYPE == IS_CONST) {
1560-
if (OP1_TYPE == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) {
1561-
retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*));
1562-
1563-
/* check if static properties were destoyed */
1564-
if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
1565-
zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
1566-
FREE_OP1();
1567-
ZVAL_UNDEF(EX_VAR(opline->result.var));
1568-
HANDLE_EXCEPTION();
1569-
}
1570-
1571-
ZEND_VM_C_GOTO(fetch_static_prop_return);
1572-
} else if (UNEXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) {
1573-
ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
1574-
if (UNEXPECTED(ce == NULL)) {
1575-
ZEND_ASSERT(EG(exception));
1576-
if (OP1_TYPE != IS_CONST) {
1577-
zend_string_release(name);
1578-
}
1579-
FREE_OP1();
1580-
ZVAL_UNDEF(EX_VAR(opline->result.var));
1581-
HANDLE_EXCEPTION();
1582-
}
1583-
CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
1584-
}
1585-
} else {
1586-
if (OP2_TYPE == IS_UNUSED) {
1587-
ce = zend_fetch_class(NULL, opline->op2.num);
1588-
if (UNEXPECTED(ce == NULL)) {
1589-
ZEND_ASSERT(EG(exception));
1590-
if (OP1_TYPE != IS_CONST) {
1591-
zend_string_release(name);
1592-
}
1593-
FREE_OP1();
1594-
ZVAL_UNDEF(EX_VAR(opline->result.var));
1595-
HANDLE_EXCEPTION();
1596-
}
1597-
} else {
1598-
ce = Z_CE_P(EX_VAR(opline->op2.var));
1599-
}
1600-
if (OP1_TYPE == IS_CONST &&
1601-
(retval = CACHED_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce)) != NULL) {
1602-
1603-
/* check if static properties were destoyed */
1604-
if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) {
1605-
zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name));
1606-
FREE_OP1();
1607-
ZVAL_UNDEF(EX_VAR(opline->result.var));
1608-
HANDLE_EXCEPTION();
1609-
}
1545+
retval = zend_fetch_static_property_address(execute_data, varname, OP1_TYPE, opline->op2, OP2_TYPE);
16101546

1611-
ZEND_VM_C_GOTO(fetch_static_prop_return);
1612-
}
1613-
}
1614-
retval = zend_std_get_static_property(ce, name, 0);
16151547
if (UNEXPECTED(retval == NULL)) {
16161548
ZEND_ASSERT(EG(exception));
1617-
if (OP1_TYPE != IS_CONST) {
1618-
zend_string_release(name);
1619-
}
16201549
FREE_OP1();
16211550
ZVAL_UNDEF(EX_VAR(opline->result.var));
16221551
HANDLE_EXCEPTION();
16231552
}
1624-
if (OP1_TYPE == IS_CONST && retval) {
1625-
CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval);
1626-
}
16271553

16281554
FREE_OP1();
16291555

1630-
if (OP1_TYPE != IS_CONST) {
1631-
zend_string_release(name);
1632-
}
1633-
1634-
ZEND_VM_C_LABEL(fetch_static_prop_return):
16351556
if (type == BP_VAR_R || type == BP_VAR_IS) {
16361557
ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
16371558
} else {

0 commit comments

Comments
 (0)