Skip to content

Commit d5d7bff

Browse files
committed
Pass opline via op handler args
1 parent 65d4331 commit d5d7bff

File tree

2 files changed

+39
-29
lines changed

2 files changed

+39
-29
lines changed

Zend/zend_vm_execute.skl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
#include "Zend/zend_config.h"
2+
#include "Zend/zend_vm_opcodes.h"
3+
14
{%DEFINES%}
25

36
#if (ZEND_VM_KIND != ZEND_VM_KIND_CALL) && (ZEND_GCC_VERSION >= 4000) && !defined(__clang__)

Zend/zend_vm_gen.php

Lines changed: 36 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1873,8 +1873,8 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name)
18731873
out($f,"# define ZEND_OPCODE_HANDLER_ARGS_DC\n");
18741874
out($f,"# define ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC\n");
18751875
out($f,"#else\n");
1876-
out($f,"# define ZEND_OPCODE_HANDLER_ARGS zend_execute_data *execute_data\n");
1877-
out($f,"# define ZEND_OPCODE_HANDLER_ARGS_PASSTHRU execute_data\n");
1876+
out($f,"# define ZEND_OPCODE_HANDLER_ARGS zend_execute_data *execute_data, const zend_op *opline\n");
1877+
out($f,"# define ZEND_OPCODE_HANDLER_ARGS_PASSTHRU execute_data, opline\n");
18781878
out($f,"# define ZEND_OPCODE_HANDLER_ARGS_DC , ZEND_OPCODE_HANDLER_ARGS\n");
18791879
out($f,"# define ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC , ZEND_OPCODE_HANDLER_ARGS_PASSTHRU\n");
18801880
out($f,"#endif\n");
@@ -1902,10 +1902,10 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name)
19021902
out($f,"# define ZEND_VM_COLD ZEND_COLD ZEND_OPT_SIZE\n");
19031903
}
19041904
out($f,"#else\n");
1905-
out($f,"# define ZEND_OPCODE_HANDLER_RET int\n");
1905+
out($f,"# define ZEND_OPCODE_HANDLER_RET const zend_op *\n");
19061906
out($f,"# define ZEND_VM_TAIL_CALL(call) return call\n");
1907-
out($f,"# define ZEND_VM_CONTINUE() return 0\n");
1908-
out($f,"# define ZEND_VM_RETURN() return -1\n");
1907+
out($f,"# define ZEND_VM_CONTINUE() return opline\n");
1908+
out($f,"# define ZEND_VM_RETURN() return NULL\n");
19091909
if ($kind == ZEND_VM_KIND_HYBRID) {
19101910
out($f,"# define ZEND_VM_HOT\n");
19111911
}
@@ -1914,8 +1914,8 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name)
19141914
out($f,"\n");
19151915
out($f,"typedef ZEND_OPCODE_HANDLER_RET (ZEND_FASTCALL *opcode_handler_t) (ZEND_OPCODE_HANDLER_ARGS);\n");
19161916
out($f,"\n");
1917-
out($f,"#define DCL_OPLINE\n");
19181917
out($f,"#ifdef ZEND_VM_IP_GLOBAL_REG\n");
1918+
out($f,"# define DCL_OPLINE\n");
19191919
out($f,"# define OPLINE opline\n");
19201920
out($f,"# define USE_OPLINE\n");
19211921
out($f,"# define LOAD_OPLINE() opline = EX(opline)\n");
@@ -1924,12 +1924,13 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name)
19241924
out($f,"# define SAVE_OPLINE() EX(opline) = opline\n");
19251925
out($f,"# define SAVE_OPLINE_EX() SAVE_OPLINE()\n");
19261926
out($f,"#else\n");
1927-
out($f,"# define OPLINE EX(opline)\n");
1928-
out($f,"# define USE_OPLINE const zend_op *opline = EX(opline);\n");
1929-
out($f,"# define LOAD_OPLINE()\n");
1930-
out($f,"# define LOAD_OPLINE_EX()\n");
1931-
out($f,"# define LOAD_NEXT_OPLINE() ZEND_VM_INC_OPCODE()\n");
1932-
out($f,"# define SAVE_OPLINE()\n");
1927+
out($f,"# define DCL_OPLINE const zend_op *opline;\n");
1928+
out($f,"# define OPLINE opline\n");
1929+
out($f,"# define USE_OPLINE\n");
1930+
out($f,"# define LOAD_OPLINE() opline = EX(opline)\n");
1931+
out($f,"# define LOAD_OPLINE_EX() opline = EX(opline)\n");
1932+
out($f,"# define LOAD_NEXT_OPLINE() opline = EX(opline) + 1\n");
1933+
out($f,"# define SAVE_OPLINE() EX(opline) = opline\n");
19331934
out($f,"# define SAVE_OPLINE_EX()\n");
19341935
out($f,"#endif\n");
19351936
out($f,"#define HANDLE_EXCEPTION() ZEND_ASSERT(EG(exception)); LOAD_OPLINE(); ZEND_VM_CONTINUE()\n");
@@ -1943,9 +1944,9 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name)
19431944
out($f,"# define ZEND_VM_ENTER() opline = EG(current_execute_data)->opline; ZEND_VM_ENTER_EX()\n");
19441945
out($f,"# define ZEND_VM_LEAVE() return 2\n");
19451946
out($f,"#else\n");
1946-
out($f,"# define ZEND_VM_ENTER_EX() return 1\n");
1947-
out($f,"# define ZEND_VM_ENTER() return 1\n");
1948-
out($f,"# define ZEND_VM_LEAVE() return 2\n");
1947+
out($f,"# define ZEND_VM_ENTER_EX() return (zend_op*)-(uintptr_t)opline\n");
1948+
out($f,"# define ZEND_VM_ENTER() execute_data = EG(current_execute_data); LOAD_OPLINE(); ZEND_VM_ENTER_EX()\n");
1949+
out($f,"# define ZEND_VM_LEAVE() return (zend_op*)-(uintptr_t)opline\n");
19491950
out($f,"#endif\n");
19501951
out($f,"#define ZEND_VM_INTERRUPT() ZEND_VM_TAIL_CALL(zend_interrupt_helper".($spec?"_SPEC":"")."(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));\n");
19511952
out($f,"#define ZEND_VM_LOOP_INTERRUPT() zend_interrupt_helper".($spec?"_SPEC":"")."(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);\n");
@@ -2119,12 +2120,7 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name)
21192120
}
21202121
break;
21212122
case "ZEND_VM_CONTINUE_LABEL":
2122-
if ($kind == ZEND_VM_KIND_CALL || $kind == ZEND_VM_KIND_HYBRID) {
2123-
// Only SWITCH dispatch method use it
2124-
out($f,"#if !defined(ZEND_VM_FP_GLOBAL_REG) || !defined(ZEND_VM_IP_GLOBAL_REG)\n");
2125-
out($f,$m[1]."\tint ret;".$m[3]."\n");
2126-
out($f,"#endif\n");
2127-
} else if ($kind == ZEND_VM_KIND_SWITCH) {
2123+
if ($kind == ZEND_VM_KIND_SWITCH) {
21282124
// Only SWITCH dispatch method use it
21292125
out($f,"zend_vm_continue:".$m[3]."\n");
21302126
} else {
@@ -2143,16 +2139,17 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name)
21432139
case ZEND_VM_KIND_HYBRID:
21442140
out($f,"#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID)\n");
21452141
out($f, $m[1]."HYBRID_SWITCH()".$m[3]."\n");
2146-
out($f,"#else\n");
2142+
out($f,"#else /* ZEND_VM_KIND != ZEND_VM_KIND_HYBRID */\n");
21472143
case ZEND_VM_KIND_CALL:
21482144
out($f,"#if defined(ZEND_VM_FP_GLOBAL_REG) && defined(ZEND_VM_IP_GLOBAL_REG)\n");
21492145
out($f, $m[1]."((opcode_handler_t)OPLINE->handler)(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);\n");
21502146
out($f, $m[1]."if (UNEXPECTED(!OPLINE))".$m[3]."\n");
21512147
out($f,"#else\n");
2152-
out($f, $m[1]."if (UNEXPECTED((ret = ((opcode_handler_t)OPLINE->handler)(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)) != 0))".$m[3]."\n");
2148+
out($f, $m[1]."opline = ((opcode_handler_t)opline->handler)(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);\n");
2149+
out($f, $m[1]."if (UNEXPECTED((intptr_t)OPLINE <= 0))".$m[3]."\n");
21532150
out($f,"#endif\n");
21542151
if ($kind == ZEND_VM_KIND_HYBRID) {
2155-
out($f,"#endif\n");
2152+
out($f,"#endif /* ZEND_VM_KIND != ZEND_VM_KIND_HYBRID */\n");
21562153
}
21572154
break;
21582155
}
@@ -2168,7 +2165,7 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name)
21682165
if ($kind == ZEND_VM_KIND_CALL || $kind == ZEND_VM_KIND_HYBRID) {
21692166
// Executor is defined as a set of functions
21702167
if ($kind == ZEND_VM_KIND_HYBRID) {
2171-
out($f,"#else\n");
2168+
out($f,"#else /* ZEND_VM_KIND != ZEND_VM_KIND_HYBRID */\n");
21722169
}
21732170
out($f,
21742171
"#ifdef ZEND_VM_FP_GLOBAL_REG\n" .
@@ -2178,7 +2175,8 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name)
21782175
"# endif\n" .
21792176
$m[1]."return;\n" .
21802177
"#else\n" .
2181-
$m[1]."if (EXPECTED(ret > 0)) {\n" .
2178+
$m[1]."if (EXPECTED(opline != NULL)) {\n" .
2179+
$m[1]."\topline = (zend_op*)-(uintptr_t)opline;\n".
21822180
$m[1]."\texecute_data = EG(current_execute_data);\n".
21832181
$m[1]."\tZEND_VM_LOOP_INTERRUPT_CHECK();\n".
21842182
$m[1]."} else {\n" .
@@ -2189,7 +2187,7 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name)
21892187
$m[1]."}\n".
21902188
"#endif\n");
21912189
if ($kind == ZEND_VM_KIND_HYBRID) {
2192-
out($f,"#endif\n");
2190+
out($f,"#endif /* ZEND_VM_KIND != ZEND_VM_KIND_HYBRID */\n");
21932191
}
21942192
}
21952193
break;
@@ -2335,6 +2333,9 @@ function gen_vm_opcodes_header(
23352333
): string {
23362334
$str = HEADER_TEXT;
23372335
$str .= "#ifndef ZEND_VM_OPCODES_H\n#define ZEND_VM_OPCODES_H\n\n";
2336+
$str .= "#include \"Zend/zend_config.h\"\n";
2337+
$str .= "#include \"Zend/zend_portability.h\"\n";
2338+
$str .= "\n";
23382339
$str .= "#define ZEND_VM_SPEC\t\t" . ZEND_VM_SPEC . "\n";
23392340
$str .= "#define ZEND_VM_LINES\t\t" . ZEND_VM_LINES . "\n";
23402341
$str .= "#define ZEND_VM_KIND_CALL\t" . ZEND_VM_KIND_CALL . "\n";
@@ -2962,6 +2963,7 @@ function gen_vm($def, $skel) {
29622963
out($f, "\topcode_handler_t handler;\n");
29632964
out($f,"#endif\n");
29642965
}
2966+
out($f, "\tDCL_OPLINE;\n");
29652967
out($f, "\tint ret;\n");
29662968
out($f, "#ifdef ZEND_VM_IP_GLOBAL_REG\n");
29672969
out($f, "\tconst zend_op *orig_opline = opline;\n");
@@ -2995,8 +2997,13 @@ function gen_vm($def, $skel) {
29952997
out($f, "\t\tret = -1;\n");
29962998
out($f, "\t}\n");
29972999
out($f, "#else\n");
2998-
out($f, "\tret = ((opcode_handler_t)OPLINE->handler)(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);\n");
2999-
out($f, "\tSAVE_OPLINE();\n");
3000+
out($f, "\topline = ((opcode_handler_t)OPLINE->handler)(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);\n");
3001+
out($f, "\tif (EXPECTED(opline != NULL)) {\n");
3002+
out($f, "\t\tret = EG(current_execute_data) != ex ? (int)(EG(current_execute_data)->prev_execute_data != ex) + 1 : 0;\n");
3003+
out($f, "\t\tSAVE_OPLINE();\n");
3004+
out($f, "\t} else {\n");
3005+
out($f, "\t\tret = -1;\n");
3006+
out($f, "\t}\n");
30003007
out($f, "#endif\n");
30013008
out($f, "#ifdef ZEND_VM_FP_GLOBAL_REG\n");
30023009
out($f, "\texecute_data = orig_execute_data;\n");

0 commit comments

Comments
 (0)