Skip to content

Commit 925fd0f

Browse files
committed
Introduce and use ZEND_VM_INLINE_HANDLER() to avoid ZEND_RETURN exception
1 parent 27e1a95 commit 925fd0f

File tree

2 files changed

+7
-6
lines changed

2 files changed

+7
-6
lines changed

Zend/zend_vm_def.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4142,7 +4142,7 @@ ZEND_VM_COLD_CONST_HANDLER(124, ZEND_VERIFY_RETURN_TYPE, CONST|TMP|VAR|UNUSED|CV
41424142
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
41434143
}
41444144

4145-
ZEND_VM_HOT_HANDLER(62, ZEND_RETURN, CONST|TMP|VAR|CV, ANY)
4145+
ZEND_VM_INLINE_HANDLER(62, ZEND_RETURN, CONST|TMP|VAR|CV, ANY)
41464146
{
41474147
USE_OPLINE
41484148
zval *retval_ptr;

Zend/zend_vm_gen.php

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1069,7 +1069,7 @@ function skip_extra_spec_function($op1, $op2, $extra_spec) {
10691069
}
10701070

10711071
function is_hot_handler($hot, $op1, $op2, $extra_spec) {
1072-
if ($hot === 'HOT_') {
1072+
if ($hot === 'HOT_' || $hot === 'INLINE_') {
10731073
return true;
10741074
} else if ($hot === 'HOT_NOCONST_') {
10751075
return ($op1 !== 'CONST');
@@ -1099,8 +1099,7 @@ function is_cold_handler($hot, $op1, $op2, $extra_spec) {
10991099
}
11001100

11011101
function is_inline_hybrid_handler($name, $hot, $op1, $op2, $extra_spec) {
1102-
return $name == "ZEND_RETURN";
1103-
//return $hot && is_hot_handler($hot, $op1, $op2, $extra_spec);
1102+
return ($hot === 'INLINE_');
11041103
}
11051104

11061105
// Generates opcode handler
@@ -2391,6 +2390,7 @@ function gen_vm($def, $skel) {
23912390
foreach ($in as $line) {
23922391
++$lineno;
23932392
if (strpos($line,"ZEND_VM_HANDLER(") === 0 ||
2393+
strpos($line,"ZEND_VM_INLINE_HANDLER(") === 0 ||
23942394
strpos($line,"ZEND_VM_HOT_HANDLER(") === 0 ||
23952395
strpos($line,"ZEND_VM_HOT_NOCONST_HANDLER(") === 0 ||
23962396
strpos($line,"ZEND_VM_HOT_SEND_HANDLER(") === 0 ||
@@ -2400,7 +2400,7 @@ function gen_vm($def, $skel) {
24002400
strpos($line,"ZEND_VM_COLD_CONSTCONST_HANDLER(") === 0) {
24012401
// Parsing opcode handler's definition
24022402
if (preg_match(
2403-
"/^ZEND_VM_(HOT_|HOT_OBJ_|HOT_SEND_|HOT_NOCONST_|COLD_|COLD_CONST_|COLD_CONSTCONST_)?HANDLER\(\s*([0-9]+)\s*,\s*([A-Z_]+)\s*,\s*([A-Z_|]+)\s*,\s*([A-Z_|]+)\s*(,\s*([A-Z_|]+)\s*)?(,\s*SPEC\(([A-Z_|=,]+)\)\s*)?\)/",
2403+
"/^ZEND_VM_(HOT_|INLINE_|HOT_OBJ_|HOT_SEND_|HOT_NOCONST_|COLD_|COLD_CONST_|COLD_CONSTCONST_)?HANDLER\(\s*([0-9]+)\s*,\s*([A-Z_]+)\s*,\s*([A-Z_|]+)\s*,\s*([A-Z_|]+)\s*(,\s*([A-Z_|]+)\s*)?(,\s*SPEC\(([A-Z_|=,]+)\)\s*)?\)/",
24042404
$line,
24052405
$m) == 0) {
24062406
die("ERROR ($def:$lineno): Invalid ZEND_VM_HANDLER definition.\n");
@@ -2443,13 +2443,14 @@ function gen_vm($def, $skel) {
24432443
$helper = null;
24442444
$list[$lineno] = array("handler"=>$handler);
24452445
} else if (strpos($line,"ZEND_VM_TYPE_SPEC_HANDLER(") === 0 ||
2446+
strpos($line,"ZEND_VM_INLINE_TYPE_SPEC_HANDLER(") === 0 ||
24462447
strpos($line,"ZEND_VM_HOT_TYPE_SPEC_HANDLER(") === 0 ||
24472448
strpos($line,"ZEND_VM_HOT_NOCONST_TYPE_SPEC_HANDLER(") === 0 ||
24482449
strpos($line,"ZEND_VM_HOT_SEND_TYPE_SPEC_HANDLER(") === 0 ||
24492450
strpos($line,"ZEND_VM_HOT_OBJ_TYPE_SPEC_HANDLER(") === 0) {
24502451
// Parsing opcode handler's definition
24512452
if (preg_match(
2452-
"/^ZEND_VM_(HOT_|HOT_OBJ_|HOT_SEND_|HOT_NOCONST_)?TYPE_SPEC_HANDLER\(\s*([A-Z_]+)\s*,\s*((?:[^(,]|\([^()]*|(?R)*\))*),\s*([A-Za-z_]+)\s*,\s*([A-Z_|]+)\s*,\s*([A-Z_|]+)\s*(,\s*([A-Z_|]+)\s*)?(,\s*SPEC\(([A-Z_|=,]+)\)\s*)?\)/",
2453+
"/^ZEND_VM_(HOT_|INLINE_|HOT_OBJ_|HOT_SEND_|HOT_NOCONST_)?TYPE_SPEC_HANDLER\(\s*([A-Z_]+)\s*,\s*((?:[^(,]|\([^()]*|(?R)*\))*),\s*([A-Za-z_]+)\s*,\s*([A-Z_|]+)\s*,\s*([A-Z_|]+)\s*(,\s*([A-Z_|]+)\s*)?(,\s*SPEC\(([A-Z_|=,]+)\)\s*)?\)/",
24532454
$line,
24542455
$m) == 0) {
24552456
die("ERROR ($def:$lineno): Invalid ZEND_VM_TYPE_HANDLER_HANDLER definition.\n");

0 commit comments

Comments
 (0)