mirror of
https://github.com/php/php-src.git
synced 2025-08-16 05:58:45 +02:00
Refactored using specialized opcodes
This commit is contained in:
parent
8361893444
commit
94245bc14c
11 changed files with 189 additions and 55 deletions
|
@ -1055,16 +1055,9 @@ ZEND_API zend_class_entry *do_bind_class(const zend_op_array* op_array, const ze
|
|||
zend_error_noreturn(E_COMPILE_ERROR, "Internal Zend error - Missing class information for %s", Z_STRVAL_P(op1));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (ce->ce_flags & ZEND_ACC_ANON_BOUND) {
|
||||
return ce;
|
||||
}
|
||||
|
||||
ce->refcount++;
|
||||
|
||||
if (zend_hash_add_ptr(class_table, Z_STR_P(op2), ce) == NULL) {
|
||||
ce->refcount--;
|
||||
|
||||
if (!compile_time) {
|
||||
/* If we're in compile time, in practice, it's quite possible
|
||||
* that we'll never reach this class declaration at runtime,
|
||||
|
@ -1114,11 +1107,6 @@ ZEND_API zend_class_entry *do_bind_inherited_class(const zend_op_array *op_array
|
|||
zend_error_noreturn(E_COMPILE_ERROR, "Cannot declare %s %s, because the name is already in use", zend_get_object_type(ce), ce->name->val);
|
||||
}
|
||||
|
||||
/* Reuse anonymous bound class */
|
||||
if (ce->ce_flags & ZEND_ACC_ANON_BOUND) {
|
||||
return ce;
|
||||
}
|
||||
|
||||
zend_do_inheritance(ce, parent_ce);
|
||||
|
||||
ce->refcount++;
|
||||
|
@ -1127,7 +1115,6 @@ ZEND_API zend_class_entry *do_bind_inherited_class(const zend_op_array *op_array
|
|||
if (zend_hash_add_ptr(class_table, Z_STR_P(op2), ce) == NULL) {
|
||||
zend_error_noreturn(E_COMPILE_ERROR, "Cannot declare %s %s, because the name is already in use", zend_get_object_type(ce), ce->name->val);
|
||||
}
|
||||
|
||||
return ce;
|
||||
}
|
||||
/* }}} */
|
||||
|
@ -3257,9 +3244,16 @@ void zend_compile_new(znode *result, zend_ast *ast) /* {{{ */
|
|||
class_node.op_type = IS_CONST;
|
||||
ZVAL_STR(&class_node.u.constant, zend_resolve_class_name_ast(class_ast));
|
||||
} else if (class_ast->kind == ZEND_AST_CLASS) {
|
||||
uint32_t dcl_opnum = get_next_op_number(CG(active_op_array));
|
||||
zend_class_entry *ce = zend_compile_class_decl(class_ast);
|
||||
class_node.op_type = IS_CONST;
|
||||
ZVAL_STR_COPY(&class_node.u.constant, ce->name);
|
||||
/* jump over anon class declaration */
|
||||
opline = &CG(active_op_array)->opcodes[dcl_opnum];
|
||||
if (opline->opcode == ZEND_FETCH_CLASS) {
|
||||
opline++;
|
||||
}
|
||||
opline->op1.opline_num = get_next_op_number(CG(active_op_array));
|
||||
} else {
|
||||
zend_compile_class_ref(&class_node, class_ast, 1);
|
||||
}
|
||||
|
@ -4904,7 +4898,7 @@ void zend_compile_implements(znode *class_node, zend_ast *ast) /* {{{ */
|
|||
}
|
||||
/* }}} */
|
||||
|
||||
static zend_string *zend_generate_anon_class_name() /* {{{ */
|
||||
static zend_string *zend_generate_anon_class_name(void) /* {{{ */
|
||||
{
|
||||
// TODO The opline pointer may be reused, this is not safe!
|
||||
uint32_t next = get_next_op_number(CG(active_op_array));
|
||||
|
@ -4996,15 +4990,28 @@ zend_class_entry *zend_compile_class_decl(zend_ast *ast) /* {{{ */
|
|||
opline->op2_type = IS_CONST;
|
||||
LITERAL_STR(opline->op2, lcname);
|
||||
|
||||
if (extends_ast) {
|
||||
opline->opcode = ZEND_DECLARE_INHERITED_CLASS;
|
||||
opline->extended_value = extends_node.u.op.var;
|
||||
} else {
|
||||
opline->opcode = ZEND_DECLARE_CLASS;
|
||||
}
|
||||
if (decl->flags & ZEND_ACC_ANON_CLASS) {
|
||||
if (extends_ast) {
|
||||
opline->opcode = ZEND_DECLARE_ANON_INHERITED_CLASS;
|
||||
opline->extended_value = extends_node.u.op.var;
|
||||
} else {
|
||||
opline->opcode = ZEND_DECLARE_ANON_CLASS;
|
||||
}
|
||||
|
||||
{
|
||||
zend_string *key = zend_build_runtime_definition_key(lcname, decl->lex_pos);
|
||||
opline->op1_type = IS_UNUSED;
|
||||
|
||||
zend_hash_update_ptr(CG(class_table), lcname, ce);
|
||||
} else {
|
||||
zend_string *key;
|
||||
|
||||
if (extends_ast) {
|
||||
opline->opcode = ZEND_DECLARE_INHERITED_CLASS;
|
||||
opline->extended_value = extends_node.u.op.var;
|
||||
} else {
|
||||
opline->opcode = ZEND_DECLARE_CLASS;
|
||||
}
|
||||
|
||||
key = zend_build_runtime_definition_key(lcname, decl->lex_pos);
|
||||
|
||||
opline->op1_type = IS_CONST;
|
||||
LITERAL_STR(opline->op1, key);
|
||||
|
|
|
@ -761,6 +761,9 @@ ZEND_API int pass_two(zend_op_array *op_array)
|
|||
opline->result.var = (uint32_t)(zend_intptr_t)ZEND_CALL_VAR_NUM(NULL, op_array->last_var + opline->result.var);
|
||||
}
|
||||
switch (opline->opcode) {
|
||||
case ZEND_DECLARE_ANON_INHERITED_CLASS:
|
||||
ZEND_PASS_TWO_UPDATE_JMP_TARGET(op_array, opline, opline->op1);
|
||||
/* break omitted intentionally */
|
||||
case ZEND_DECLARE_INHERITED_CLASS:
|
||||
case ZEND_DECLARE_INHERITED_CLASS_DELAYED:
|
||||
opline->extended_value = (uint32_t)(zend_intptr_t)ZEND_CALL_VAR_NUM(NULL, op_array->last_var + opline->extended_value);
|
||||
|
@ -772,6 +775,7 @@ ZEND_API int pass_two(zend_op_array *op_array)
|
|||
/* break omitted intentionally */
|
||||
case ZEND_JMP:
|
||||
case ZEND_FAST_CALL:
|
||||
case ZEND_DECLARE_ANON_CLASS:
|
||||
ZEND_PASS_TWO_UPDATE_JMP_TARGET(op_array, opline, opline->op1);
|
||||
break;
|
||||
case ZEND_JMPZNZ:
|
||||
|
|
|
@ -6723,14 +6723,6 @@ ZEND_VM_HANDLER(139, ZEND_DECLARE_CLASS, ANY, ANY)
|
|||
|
||||
SAVE_OPLINE();
|
||||
Z_CE_P(EX_VAR(opline->result.var)) = do_bind_class(&EX(func)->op_array, opline, EG(class_table), 0);
|
||||
if (Z_CE_P(EX_VAR(opline->result.var))->ce_flags & ZEND_ACC_ANON_CLASS) {
|
||||
if (Z_CE_P(EX_VAR(opline->result.var))->ce_flags & ZEND_ACC_ANON_BOUND) {
|
||||
while (opline->opcode != ZEND_NEW) {
|
||||
opline++;
|
||||
}
|
||||
ZEND_VM_JMP(opline);
|
||||
} else Z_CE_P(EX_VAR(opline->result.var))->ce_flags |= ZEND_ACC_ANON_BOUND;
|
||||
}
|
||||
CHECK_EXCEPTION();
|
||||
ZEND_VM_NEXT_OPCODE();
|
||||
}
|
||||
|
@ -6741,14 +6733,6 @@ ZEND_VM_HANDLER(140, ZEND_DECLARE_INHERITED_CLASS, ANY, ANY)
|
|||
|
||||
SAVE_OPLINE();
|
||||
Z_CE_P(EX_VAR(opline->result.var)) = do_bind_inherited_class(&EX(func)->op_array, opline, EG(class_table), Z_CE_P(EX_VAR(opline->extended_value)), 0);
|
||||
if (Z_CE_P(EX_VAR(opline->result.var))->ce_flags & ZEND_ACC_ANON_CLASS) {
|
||||
if (Z_CE_P(EX_VAR(opline->result.var))->ce_flags & ZEND_ACC_ANON_BOUND) {
|
||||
while (opline->opcode != ZEND_NEW) {
|
||||
opline++;
|
||||
}
|
||||
ZEND_VM_JMP(opline);
|
||||
} else Z_CE_P(EX_VAR(opline->result.var))->ce_flags |= ZEND_ACC_ANON_BOUND;
|
||||
}
|
||||
CHECK_EXCEPTION();
|
||||
ZEND_VM_NEXT_OPCODE();
|
||||
}
|
||||
|
@ -6768,6 +6752,48 @@ ZEND_VM_HANDLER(145, ZEND_DECLARE_INHERITED_CLASS_DELAYED, ANY, ANY)
|
|||
ZEND_VM_NEXT_OPCODE();
|
||||
}
|
||||
|
||||
ZEND_VM_HANDLER(171, ZEND_DECLARE_ANON_CLASS, ANY, ANY)
|
||||
{
|
||||
zend_class_entry *ce;
|
||||
USE_OPLINE
|
||||
|
||||
SAVE_OPLINE();
|
||||
ce = zend_hash_find_ptr(EG(class_table), Z_STR_P(EX_CONSTANT(opline->op2)));
|
||||
Z_CE_P(EX_VAR(opline->result.var)) = ce;
|
||||
ZEND_ASSERT(ce != NULL);
|
||||
|
||||
if (ce->ce_flags & ZEND_ACC_ANON_BOUND) {
|
||||
ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op1));
|
||||
}
|
||||
|
||||
if (!(ce->ce_flags & (ZEND_ACC_INTERFACE|ZEND_ACC_IMPLEMENT_INTERFACES|ZEND_ACC_IMPLEMENT_TRAITS))) {
|
||||
zend_verify_abstract_class(ce);
|
||||
}
|
||||
ce->ce_flags |= ZEND_ACC_ANON_BOUND;
|
||||
CHECK_EXCEPTION();
|
||||
ZEND_VM_NEXT_OPCODE();
|
||||
}
|
||||
|
||||
ZEND_VM_HANDLER(172, ZEND_DECLARE_ANON_INHERITED_CLASS, ANY, ANY)
|
||||
{
|
||||
zend_class_entry *ce;
|
||||
USE_OPLINE
|
||||
|
||||
SAVE_OPLINE();
|
||||
ce = zend_hash_find_ptr(EG(class_table), Z_STR_P(EX_CONSTANT(opline->op2)));
|
||||
Z_CE_P(EX_VAR(opline->result.var)) = ce;
|
||||
ZEND_ASSERT(ce != NULL);
|
||||
|
||||
if (ce->ce_flags & ZEND_ACC_ANON_BOUND) {
|
||||
ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op1));
|
||||
}
|
||||
|
||||
zend_do_inheritance(ce, Z_CE_P(EX_VAR(opline->extended_value)));
|
||||
ce->ce_flags |= ZEND_ACC_ANON_BOUND;
|
||||
CHECK_EXCEPTION();
|
||||
ZEND_VM_NEXT_OPCODE();
|
||||
}
|
||||
|
||||
ZEND_VM_HANDLER(141, ZEND_DECLARE_FUNCTION, ANY, ANY)
|
||||
{
|
||||
USE_OPLINE
|
||||
|
|
|
@ -1305,14 +1305,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_CLASS_SPEC_HANDLER(ZEN
|
|||
|
||||
SAVE_OPLINE();
|
||||
Z_CE_P(EX_VAR(opline->result.var)) = do_bind_class(&EX(func)->op_array, opline, EG(class_table), 0);
|
||||
if (Z_CE_P(EX_VAR(opline->result.var))->ce_flags & ZEND_ACC_ANON_CLASS) {
|
||||
if (Z_CE_P(EX_VAR(opline->result.var))->ce_flags & ZEND_ACC_ANON_BOUND) {
|
||||
while (opline->opcode != ZEND_NEW) {
|
||||
opline++;
|
||||
}
|
||||
ZEND_VM_JMP(opline);
|
||||
} else Z_CE_P(EX_VAR(opline->result.var))->ce_flags |= ZEND_ACC_ANON_BOUND;
|
||||
}
|
||||
CHECK_EXCEPTION();
|
||||
ZEND_VM_NEXT_OPCODE();
|
||||
}
|
||||
|
@ -1323,14 +1315,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_INHERITED_CLASS_SPEC_H
|
|||
|
||||
SAVE_OPLINE();
|
||||
Z_CE_P(EX_VAR(opline->result.var)) = do_bind_inherited_class(&EX(func)->op_array, opline, EG(class_table), Z_CE_P(EX_VAR(opline->extended_value)), 0);
|
||||
if (Z_CE_P(EX_VAR(opline->result.var))->ce_flags & ZEND_ACC_ANON_CLASS) {
|
||||
if (Z_CE_P(EX_VAR(opline->result.var))->ce_flags & ZEND_ACC_ANON_BOUND) {
|
||||
while (opline->opcode != ZEND_NEW) {
|
||||
opline++;
|
||||
}
|
||||
ZEND_VM_JMP(opline);
|
||||
} else Z_CE_P(EX_VAR(opline->result.var))->ce_flags |= ZEND_ACC_ANON_BOUND;
|
||||
}
|
||||
CHECK_EXCEPTION();
|
||||
ZEND_VM_NEXT_OPCODE();
|
||||
}
|
||||
|
@ -1350,6 +1334,48 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_INHERITED_CLASS_DELAYE
|
|||
ZEND_VM_NEXT_OPCODE();
|
||||
}
|
||||
|
||||
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
|
||||
{
|
||||
zend_class_entry *ce;
|
||||
USE_OPLINE
|
||||
|
||||
SAVE_OPLINE();
|
||||
ce = zend_hash_find_ptr(EG(class_table), Z_STR_P(EX_CONSTANT(opline->op2)));
|
||||
Z_CE_P(EX_VAR(opline->result.var)) = ce;
|
||||
ZEND_ASSERT(ce != NULL);
|
||||
|
||||
if (ce->ce_flags & ZEND_ACC_ANON_BOUND) {
|
||||
ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op1));
|
||||
}
|
||||
|
||||
if (!(ce->ce_flags & (ZEND_ACC_INTERFACE|ZEND_ACC_IMPLEMENT_INTERFACES|ZEND_ACC_IMPLEMENT_TRAITS))) {
|
||||
zend_verify_abstract_class(ce);
|
||||
}
|
||||
ce->ce_flags |= ZEND_ACC_ANON_BOUND;
|
||||
CHECK_EXCEPTION();
|
||||
ZEND_VM_NEXT_OPCODE();
|
||||
}
|
||||
|
||||
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
|
||||
{
|
||||
zend_class_entry *ce;
|
||||
USE_OPLINE
|
||||
|
||||
SAVE_OPLINE();
|
||||
ce = zend_hash_find_ptr(EG(class_table), Z_STR_P(EX_CONSTANT(opline->op2)));
|
||||
Z_CE_P(EX_VAR(opline->result.var)) = ce;
|
||||
ZEND_ASSERT(ce != NULL);
|
||||
|
||||
if (ce->ce_flags & ZEND_ACC_ANON_BOUND) {
|
||||
ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op1));
|
||||
}
|
||||
|
||||
zend_do_inheritance(ce, Z_CE_P(EX_VAR(opline->extended_value)));
|
||||
ce->ce_flags |= ZEND_ACC_ANON_BOUND;
|
||||
CHECK_EXCEPTION();
|
||||
ZEND_VM_NEXT_OPCODE();
|
||||
}
|
||||
|
||||
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_FUNCTION_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
|
||||
{
|
||||
USE_OPLINE
|
||||
|
@ -48776,6 +48802,56 @@ void zend_init_opcodes_handlers(void)
|
|||
ZEND_SPACESHIP_SPEC_CV_TMPVAR_HANDLER,
|
||||
ZEND_NULL_HANDLER,
|
||||
ZEND_SPACESHIP_SPEC_CV_CV_HANDLER,
|
||||
ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER,
|
||||
ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER,
|
||||
ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER,
|
||||
ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER,
|
||||
ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER,
|
||||
ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER,
|
||||
ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER,
|
||||
ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER,
|
||||
ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER,
|
||||
ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER,
|
||||
ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER,
|
||||
ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER,
|
||||
ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER,
|
||||
ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER,
|
||||
ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER,
|
||||
ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER,
|
||||
ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER,
|
||||
ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER,
|
||||
ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER,
|
||||
ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER,
|
||||
ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER,
|
||||
ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER,
|
||||
ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER,
|
||||
ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER,
|
||||
ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER,
|
||||
ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER,
|
||||
ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER,
|
||||
ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER,
|
||||
ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER,
|
||||
ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER,
|
||||
ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER,
|
||||
ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER,
|
||||
ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER,
|
||||
ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER,
|
||||
ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER,
|
||||
ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER,
|
||||
ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER,
|
||||
ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER,
|
||||
ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER,
|
||||
ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER,
|
||||
ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER,
|
||||
ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER,
|
||||
ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER,
|
||||
ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER,
|
||||
ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER,
|
||||
ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER,
|
||||
ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER,
|
||||
ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER,
|
||||
ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER,
|
||||
ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER,
|
||||
ZEND_NULL_HANDLER
|
||||
};
|
||||
zend_opcode_handlers = labels;
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
#include <stdio.h>
|
||||
#include <zend.h>
|
||||
|
||||
const char *zend_vm_opcodes_map[171] = {
|
||||
const char *zend_vm_opcodes_map[173] = {
|
||||
"ZEND_NOP",
|
||||
"ZEND_ADD",
|
||||
"ZEND_SUB",
|
||||
|
@ -193,6 +193,8 @@ const char *zend_vm_opcodes_map[171] = {
|
|||
"ZEND_BIND_GLOBAL",
|
||||
"ZEND_COALESCE",
|
||||
"ZEND_SPACESHIP",
|
||||
"ZEND_DECLARE_ANON_CLASS",
|
||||
"ZEND_DECLARE_ANON_INHERITED_CLASS",
|
||||
};
|
||||
|
||||
ZEND_API const char* zend_get_opcode_name(zend_uchar opcode) {
|
||||
|
|
|
@ -203,5 +203,7 @@ END_EXTERN_C()
|
|||
#define ZEND_BIND_GLOBAL 168
|
||||
#define ZEND_COALESCE 169
|
||||
#define ZEND_SPACESHIP 170
|
||||
#define ZEND_DECLARE_ANON_CLASS 171
|
||||
#define ZEND_DECLARE_ANON_INHERITED_CLASS 172
|
||||
|
||||
#endif
|
||||
|
|
|
@ -144,6 +144,8 @@ static int find_code_blocks(zend_op_array *op_array, zend_cfg *cfg, zend_optimiz
|
|||
START_BLOCK_OP(opno + 1);
|
||||
break;
|
||||
case ZEND_JMP:
|
||||
case ZEND_DECLARE_ANON_CLASS:
|
||||
case ZEND_DECLARE_ANON_INHERITED_CLASS:
|
||||
START_BLOCK_OP(ZEND_OP1(opline).opline_num);
|
||||
/* break missing intentionally */
|
||||
case ZEND_RETURN:
|
||||
|
@ -288,6 +290,11 @@ static int find_code_blocks(zend_op_array *op_array, zend_cfg *cfg, zend_optimiz
|
|||
case ZEND_JMP:
|
||||
cur_block->op1_to = &blocks[ZEND_OP1(opline).opline_num];
|
||||
break;
|
||||
case ZEND_DECLARE_ANON_CLASS:
|
||||
case ZEND_DECLARE_ANON_INHERITED_CLASS:
|
||||
cur_block->op1_to = &blocks[ZEND_OP1(opline).opline_num];
|
||||
cur_block->follow_to = &blocks[opno];
|
||||
break;
|
||||
case ZEND_JMPZNZ:
|
||||
cur_block->op2_to = &blocks[ZEND_OP2(opline).opline_num];
|
||||
cur_block->ext_to = &blocks[opline->extended_value];
|
||||
|
|
|
@ -87,6 +87,8 @@ void zend_optimizer_nop_removal(zend_op_array *op_array)
|
|||
case ZEND_JMP:
|
||||
case ZEND_GOTO:
|
||||
case ZEND_FAST_CALL:
|
||||
case ZEND_DECLARE_ANON_CLASS:
|
||||
case ZEND_DECLARE_ANON_INHERITED_CLASS:
|
||||
ZEND_OP1(opline).opline_num -= shiftlist[ZEND_OP1(opline).opline_num];
|
||||
break;
|
||||
case ZEND_JMPZ:
|
||||
|
|
|
@ -125,6 +125,7 @@ void optimize_temporary_variables(zend_op_array *op_array, zend_optimizer_ctx *c
|
|||
}
|
||||
|
||||
if (opline->opcode == ZEND_DECLARE_INHERITED_CLASS ||
|
||||
opline->opcode == ZEND_DECLARE_ANON_INHERITED_CLASS ||
|
||||
opline->opcode == ZEND_DECLARE_INHERITED_CLASS_DELAYED) {
|
||||
currT = VAR_NUM(opline->extended_value) - offset;
|
||||
if (!valid_T[currT]) {
|
||||
|
|
|
@ -89,6 +89,7 @@ int zend_optimizer_lookup_cv(zend_op_array *op_array, zend_string* name)
|
|||
opline->result.var += sizeof(zval);
|
||||
}
|
||||
if (opline->opcode == ZEND_DECLARE_INHERITED_CLASS ||
|
||||
opline->opcode == ZEND_DECLARE_ANON_INHERITED_CLASS ||
|
||||
opline->opcode == ZEND_DECLARE_INHERITED_CLASS_DELAYED) {
|
||||
opline->extended_value += sizeof(zval);
|
||||
}
|
||||
|
@ -497,6 +498,8 @@ static void zend_accel_optimize(zend_op_array *op_array,
|
|||
case ZEND_JMP:
|
||||
case ZEND_GOTO:
|
||||
case ZEND_FAST_CALL:
|
||||
case ZEND_DECLARE_ANON_CLASS:
|
||||
case ZEND_DECLARE_ANON_INHERITED_CLASS:
|
||||
ZEND_PASS_TWO_UNDO_JMP_TARGET(op_array, opline, ZEND_OP1(opline));
|
||||
break;
|
||||
case ZEND_JMPZNZ:
|
||||
|
@ -538,6 +541,8 @@ static void zend_accel_optimize(zend_op_array *op_array,
|
|||
case ZEND_JMP:
|
||||
case ZEND_GOTO:
|
||||
case ZEND_FAST_CALL:
|
||||
case ZEND_DECLARE_ANON_CLASS:
|
||||
case ZEND_DECLARE_ANON_INHERITED_CLASS:
|
||||
ZEND_PASS_TWO_UPDATE_JMP_TARGET(op_array, opline, ZEND_OP1(opline));
|
||||
break;
|
||||
case ZEND_JMPZNZ:
|
||||
|
|
|
@ -502,6 +502,8 @@ static void zend_persist_op_array_ex(zend_op_array *op_array, zend_persistent_sc
|
|||
case ZEND_JMP:
|
||||
case ZEND_GOTO:
|
||||
case ZEND_FAST_CALL:
|
||||
case ZEND_DECLARE_ANON_CLASS:
|
||||
case ZEND_DECLARE_ANON_INHERITED_CLASS:
|
||||
ZEND_OP1(opline).jmp_addr = &new_opcodes[ZEND_OP1(opline).jmp_addr - op_array->opcodes];
|
||||
break;
|
||||
case ZEND_JMPZNZ:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue