mirror of
https://github.com/php/php-src.git
synced 2024-09-21 09:57:23 +00:00
Optimized ZEND_FETCH_CLASS + ZEND_ADD_INTERFACE into single ZEND_ADD_INTERFACE opcode
This commit is contained in:
parent
0f2247ae94
commit
be8daf1f47
2
NEWS
2
NEWS
@ -88,6 +88,8 @@ PHP NEWS
|
||||
ZEND_HANDLE_EXCEPTION opcode in the end. (Dmitry)
|
||||
. Optimized require_once() and include_once() by eliminating fopen(3) on
|
||||
second usage. (Dmitry)
|
||||
. Optimized ZEND_FETCH_CLASS + ZEND_ADD_INTERFACE into single
|
||||
ZEND_ADD_INTERFACE opcode (Dmitry)
|
||||
- Improved php.ini handling: (Jani)
|
||||
. Added ".htaccess" style user-defined php.ini files support for CGI/FastCGI
|
||||
. Added support for special [PATH=/opt/httpd/www.example.com/] and
|
||||
|
@ -3261,35 +3261,25 @@ void zend_do_end_class_declaration(znode *class_token, znode *parent_token TSRML
|
||||
|
||||
void zend_do_implements_interface(znode *interface_name TSRMLS_DC)
|
||||
{
|
||||
znode interface_node;
|
||||
zend_op *opline;
|
||||
|
||||
zend_do_fetch_class(&interface_node, interface_name TSRMLS_CC);
|
||||
switch (interface_node.u.EA.type) {
|
||||
switch (zend_get_class_fetch_type(Z_STRVAL(interface_name->u.constant), Z_STRLEN(interface_name->u.constant))) {
|
||||
case ZEND_FETCH_CLASS_SELF:
|
||||
zend_error(E_COMPILE_ERROR, "Cannot use 'self' as interface name as it is reserved");
|
||||
break;
|
||||
case ZEND_FETCH_CLASS_PARENT:
|
||||
zend_error(E_COMPILE_ERROR, "Cannot use 'parent' as interface name as it is reserved");
|
||||
break;
|
||||
case ZEND_FETCH_CLASS_STATIC:
|
||||
zend_error(E_COMPILE_ERROR, "Cannot use 'static' as interface name as it is reserved");
|
||||
zend_error(E_COMPILE_ERROR, "Cannot use '%s' as interface name as it is reserved", Z_STRVAL(interface_name->u.constant));
|
||||
break;
|
||||
default:
|
||||
if (CG(active_op_array)->last > 0) {
|
||||
opline = &CG(active_op_array)->opcodes[CG(active_op_array)->last-1];
|
||||
if (opline->opcode == ZEND_FETCH_CLASS) {
|
||||
opline->extended_value = (opline->extended_value & ~ZEND_FETCH_CLASS_MASK) | ZEND_FETCH_CLASS_INTERFACE;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
opline = get_next_op(CG(active_op_array) TSRMLS_CC);
|
||||
opline->opcode = ZEND_ADD_INTERFACE;
|
||||
opline->op1 = CG(implementing_class);
|
||||
opline->op2 = interface_node;
|
||||
opline->extended_value = CG(active_class_entry)->num_interfaces++;
|
||||
zend_resolve_class_name(interface_name, &opline->extended_value, 0 TSRMLS_CC);
|
||||
opline->extended_value = (opline->extended_value & ~ZEND_FETCH_CLASS_MASK) | ZEND_FETCH_CLASS_INTERFACE;
|
||||
opline->op2 = *interface_name;
|
||||
CG(active_class_entry)->num_interfaces++;
|
||||
}
|
||||
|
||||
|
||||
|
@ -4008,11 +4008,11 @@ ZEND_VM_HANDLER(0, ZEND_NOP, ANY, ANY)
|
||||
ZEND_VM_NEXT_OPCODE();
|
||||
}
|
||||
|
||||
ZEND_VM_HANDLER(144, ZEND_ADD_INTERFACE, ANY, ANY)
|
||||
ZEND_VM_HANDLER(144, ZEND_ADD_INTERFACE, ANY, CONST)
|
||||
{
|
||||
zend_op *opline = EX(opline);
|
||||
zend_class_entry *ce = EX_T(opline->op1.u.var).class_entry;
|
||||
zend_class_entry *iface = EX_T(opline->op2.u.var).class_entry;
|
||||
zend_class_entry *iface = zend_fetch_class(Z_STRVAL(opline->op2.u.constant), Z_STRLEN(opline->op2.u.constant), opline->extended_value TSRMLS_CC);
|
||||
|
||||
if (!(iface->ce_flags & ZEND_ACC_INTERFACE)) {
|
||||
zend_error_noreturn(E_ERROR, "%s cannot implement %s - it is not an interface", ce->name, iface->name);
|
||||
|
@ -498,21 +498,6 @@ static int ZEND_NOP_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
|
||||
ZEND_VM_NEXT_OPCODE();
|
||||
}
|
||||
|
||||
static int ZEND_ADD_INTERFACE_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
|
||||
{
|
||||
zend_op *opline = EX(opline);
|
||||
zend_class_entry *ce = EX_T(opline->op1.u.var).class_entry;
|
||||
zend_class_entry *iface = EX_T(opline->op2.u.var).class_entry;
|
||||
|
||||
if (!(iface->ce_flags & ZEND_ACC_INTERFACE)) {
|
||||
zend_error_noreturn(E_ERROR, "%s cannot implement %s - it is not an interface", ce->name, iface->name);
|
||||
}
|
||||
|
||||
zend_do_implement_interface(ce, iface TSRMLS_CC);
|
||||
|
||||
ZEND_VM_NEXT_OPCODE();
|
||||
}
|
||||
|
||||
static int ZEND_HANDLE_EXCEPTION_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
|
||||
{
|
||||
zend_uint op_num = EG(opline_before_exception)-EG(active_op_array)->opcodes;
|
||||
@ -775,6 +760,21 @@ static int ZEND_CONT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
|
||||
ZEND_VM_JMP(EX(op_array)->opcodes + el->cont);
|
||||
}
|
||||
|
||||
static int ZEND_ADD_INTERFACE_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
|
||||
{
|
||||
zend_op *opline = EX(opline);
|
||||
zend_class_entry *ce = EX_T(opline->op1.u.var).class_entry;
|
||||
zend_class_entry *iface = zend_fetch_class(Z_STRVAL(opline->op2.u.constant), Z_STRLEN(opline->op2.u.constant), opline->extended_value TSRMLS_CC);
|
||||
|
||||
if (!(iface->ce_flags & ZEND_ACC_INTERFACE)) {
|
||||
zend_error_noreturn(E_ERROR, "%s cannot implement %s - it is not an interface", ce->name, iface->name);
|
||||
}
|
||||
|
||||
zend_do_implement_interface(ce, iface TSRMLS_CC);
|
||||
|
||||
ZEND_VM_NEXT_OPCODE();
|
||||
}
|
||||
|
||||
static int ZEND_FETCH_CLASS_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
|
||||
{
|
||||
zend_op *opline = EX(opline);
|
||||
@ -32965,31 +32965,31 @@ void zend_init_opcodes_handlers(void)
|
||||
ZEND_NULL_HANDLER,
|
||||
ZEND_NULL_HANDLER,
|
||||
ZEND_NULL_HANDLER,
|
||||
ZEND_ADD_INTERFACE_SPEC_HANDLER,
|
||||
ZEND_ADD_INTERFACE_SPEC_HANDLER,
|
||||
ZEND_ADD_INTERFACE_SPEC_HANDLER,
|
||||
ZEND_ADD_INTERFACE_SPEC_HANDLER,
|
||||
ZEND_ADD_INTERFACE_SPEC_HANDLER,
|
||||
ZEND_ADD_INTERFACE_SPEC_HANDLER,
|
||||
ZEND_ADD_INTERFACE_SPEC_HANDLER,
|
||||
ZEND_ADD_INTERFACE_SPEC_HANDLER,
|
||||
ZEND_ADD_INTERFACE_SPEC_HANDLER,
|
||||
ZEND_ADD_INTERFACE_SPEC_HANDLER,
|
||||
ZEND_ADD_INTERFACE_SPEC_HANDLER,
|
||||
ZEND_ADD_INTERFACE_SPEC_HANDLER,
|
||||
ZEND_ADD_INTERFACE_SPEC_HANDLER,
|
||||
ZEND_ADD_INTERFACE_SPEC_HANDLER,
|
||||
ZEND_ADD_INTERFACE_SPEC_HANDLER,
|
||||
ZEND_ADD_INTERFACE_SPEC_HANDLER,
|
||||
ZEND_ADD_INTERFACE_SPEC_HANDLER,
|
||||
ZEND_ADD_INTERFACE_SPEC_HANDLER,
|
||||
ZEND_ADD_INTERFACE_SPEC_HANDLER,
|
||||
ZEND_ADD_INTERFACE_SPEC_HANDLER,
|
||||
ZEND_ADD_INTERFACE_SPEC_HANDLER,
|
||||
ZEND_ADD_INTERFACE_SPEC_HANDLER,
|
||||
ZEND_ADD_INTERFACE_SPEC_HANDLER,
|
||||
ZEND_ADD_INTERFACE_SPEC_HANDLER,
|
||||
ZEND_ADD_INTERFACE_SPEC_HANDLER,
|
||||
ZEND_ADD_INTERFACE_SPEC_CONST_HANDLER,
|
||||
ZEND_NULL_HANDLER,
|
||||
ZEND_NULL_HANDLER,
|
||||
ZEND_NULL_HANDLER,
|
||||
ZEND_NULL_HANDLER,
|
||||
ZEND_ADD_INTERFACE_SPEC_CONST_HANDLER,
|
||||
ZEND_NULL_HANDLER,
|
||||
ZEND_NULL_HANDLER,
|
||||
ZEND_NULL_HANDLER,
|
||||
ZEND_NULL_HANDLER,
|
||||
ZEND_ADD_INTERFACE_SPEC_CONST_HANDLER,
|
||||
ZEND_NULL_HANDLER,
|
||||
ZEND_NULL_HANDLER,
|
||||
ZEND_NULL_HANDLER,
|
||||
ZEND_NULL_HANDLER,
|
||||
ZEND_ADD_INTERFACE_SPEC_CONST_HANDLER,
|
||||
ZEND_NULL_HANDLER,
|
||||
ZEND_NULL_HANDLER,
|
||||
ZEND_NULL_HANDLER,
|
||||
ZEND_NULL_HANDLER,
|
||||
ZEND_ADD_INTERFACE_SPEC_CONST_HANDLER,
|
||||
ZEND_NULL_HANDLER,
|
||||
ZEND_NULL_HANDLER,
|
||||
ZEND_NULL_HANDLER,
|
||||
ZEND_NULL_HANDLER,
|
||||
ZEND_NULL_HANDLER,
|
||||
ZEND_NULL_HANDLER,
|
||||
ZEND_NULL_HANDLER,
|
||||
|
Loading…
Reference in New Issue
Block a user