Skip to content

Commit d271d2c

Browse files
committed
Make ZEND_RECV_INIT and ZEND_BIND_GLOBALS opcodes to be "repeatabe" with inner-loop instead of main interpreter loop.
1 parent 3057034 commit d271d2c

File tree

3 files changed

+30
-6
lines changed

3 files changed

+30
-6
lines changed

Zend/zend_execute.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2215,6 +2215,12 @@ static zend_always_inline zend_generator *zend_get_running_generator(zend_execut
22152215
#define ZEND_VM_INC_OPCODE() \
22162216
OPLINE++
22172217

2218+
#define ZEND_VM_REPEATABLE_OPCODE \
2219+
do {
2220+
2221+
#define ZEND_VM_REPEAT_OPCODE(_opcode) \
2222+
} while (UNEXPECTED(OPLINE->opcode == _opcode))
2223+
22182224
#ifdef __GNUC__
22192225
# define ZEND_VM_GUARD(name) __asm__("#" #name)
22202226
#else

Zend/zend_vm_def.h

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4608,9 +4608,12 @@ ZEND_VM_HANDLER(63, ZEND_RECV, ANY, ANY)
46084608
ZEND_VM_HANDLER(64, ZEND_RECV_INIT, ANY, CONST)
46094609
{
46104610
USE_OPLINE
4611-
uint32_t arg_num = opline->op1.num;
4611+
uint32_t arg_num;
46124612
zval *param;
46134613

4614+
ZEND_VM_REPEATABLE_OPCODE
4615+
4616+
arg_num = opline->op1.num;
46144617
param = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->result.var);
46154618
if (arg_num > EX_NUM_ARGS()) {
46164619
ZVAL_COPY_VALUE(param, EX_CONSTANT(opline->op2));
@@ -4635,7 +4638,9 @@ ZEND_VM_HANDLER(64, ZEND_RECV_INIT, ANY, CONST)
46354638
}
46364639
}
46374640

4638-
ZEND_VM_NEXT_OPCODE();
4641+
ZEND_VM_INC_OPCODE();
4642+
ZEND_VM_REPEAT_OPCODE(ZEND_RECV_INIT);
4643+
ZEND_VM_CONTINUE();
46394644
}
46404645

46414646
ZEND_VM_HANDLER(164, ZEND_RECV_VARIADIC, ANY, ANY)
@@ -7613,6 +7618,8 @@ ZEND_VM_HANDLER(168, ZEND_BIND_GLOBAL, CV, CONST)
76137618
zval *variable_ptr;
76147619
uint32_t idx;
76157620

7621+
ZEND_VM_REPEATABLE_OPCODE
7622+
76167623
varname = GET_OP2_ZVAL_PTR(BP_VAR_R);
76177624

76187625
/* We store "hash slot index" + 1 (NULL is a mark of uninitialized cache slot) */
@@ -7677,7 +7684,9 @@ ZEND_VM_C_LABEL(check_indirect):
76777684
ZVAL_REF(variable_ptr, ref);
76787685
}
76797686

7680-
ZEND_VM_NEXT_OPCODE();
7687+
ZEND_VM_INC_OPCODE();
7688+
ZEND_VM_REPEAT_OPCODE(ZEND_BIND_GLOBAL);
7689+
ZEND_VM_CONTINUE();
76817690
}
76827691

76837692
ZEND_VM_HANDLER(121, ZEND_STRLEN, CONST|TMPVAR|CV, ANY)

Zend/zend_vm_execute.h

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2224,9 +2224,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_FCALL_SPEC_CONST_HANDLER(
22242224
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RECV_INIT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
22252225
{
22262226
USE_OPLINE
2227-
uint32_t arg_num = opline->op1.num;
2227+
uint32_t arg_num;
22282228
zval *param;
22292229

2230+
ZEND_VM_REPEATABLE_OPCODE
2231+
2232+
arg_num = opline->op1.num;
22302233
param = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->result.var);
22312234
if (arg_num > EX_NUM_ARGS()) {
22322235
ZVAL_COPY_VALUE(param, EX_CONSTANT(opline->op2));
@@ -2251,7 +2254,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RECV_INIT_SPEC_CONST_HANDLER(Z
22512254
}
22522255
}
22532256

2254-
ZEND_VM_NEXT_OPCODE();
2257+
ZEND_VM_INC_OPCODE();
2258+
ZEND_VM_REPEAT_OPCODE(ZEND_RECV_INIT);
2259+
ZEND_VM_CONTINUE();
22552260
}
22562261

22572262
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BRK_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -32556,6 +32561,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BIND_GLOBAL_SPEC_CV_CONST_HAND
3255632561
zval *variable_ptr;
3255732562
uint32_t idx;
3255832563

32564+
ZEND_VM_REPEATABLE_OPCODE
32565+
3255932566
varname = EX_CONSTANT(opline->op2);
3256032567

3256132568
/* We store "hash slot index" + 1 (NULL is a mark of uninitialized cache slot) */
@@ -32620,7 +32627,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BIND_GLOBAL_SPEC_CV_CONST_HAND
3262032627
ZVAL_REF(variable_ptr, ref);
3262132628
}
3262232629

32623-
ZEND_VM_NEXT_OPCODE();
32630+
ZEND_VM_INC_OPCODE();
32631+
ZEND_VM_REPEAT_OPCODE(ZEND_BIND_GLOBAL);
32632+
ZEND_VM_CONTINUE();
3262432633
}
3262532634

3262632635
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)

0 commit comments

Comments
 (0)