Browse Source

Optimized ZEND_FETCH_CLASS + ZEND_ADD_INTERFACE into single ZEND_ADD_INTERFACE opcode

experimental/first_unicode_implementation
Dmitry Stogov 18 years ago
parent
commit
b8debfd876
  1. 22
      Zend/zend_compile.c
  2. 4
      Zend/zend_vm_def.h
  3. 80
      Zend/zend_vm_execute.h

22
Zend/zend_compile.c

@ -3493,35 +3493,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_TYPE(interface_name->u.constant), Z_UNIVAL(interface_name->u.constant), Z_UNILEN(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 '%R' as interface name as it is reserved", Z_TYPE(interface_name->u.constant), Z_UNIVAL(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++;
}
/* }}} */

4
Zend/zend_vm_def.h

@ -4176,11 +4176,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_u_fetch_class(Z_TYPE(opline->op2.u.constant), Z_UNIVAL(opline->op2.u.constant), Z_UNILEN(opline->op2.u.constant), opline->extended_value TSRMLS_CC);
if (!(iface->ce_flags & ZEND_ACC_INTERFACE)) {
zend_error_noreturn(E_ERROR, "%v cannot implement %v - it is not an interface", ce->name, iface->name);

80
Zend/zend_vm_execute.h

@ -506,21 +506,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, "%v cannot implement %v - 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;
@ -806,6 +791,21 @@ static int ZEND_GOTO_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
ZEND_VM_JMP(opline->op1.u.jmp_addr);
}
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_u_fetch_class(Z_TYPE(opline->op2.u.constant), Z_UNIVAL(opline->op2.u.constant), Z_UNILEN(opline->op2.u.constant), opline->extended_value TSRMLS_CC);
if (!(iface->ce_flags & ZEND_ACC_INTERFACE)) {
zend_error_noreturn(E_ERROR, "%v cannot implement %v - 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);
@ -34116,31 +34116,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…
Cancel
Save