Skip to content

Commit b1bd6f5

Browse files
committed
Properly define ZEND_OP_DATA in zend_vm_def.h
This allows zend_vm_gen.php to define them in zend_vm_opcodes.{c,h} without further hacks.
1 parent 31e9838 commit b1bd6f5

File tree

6 files changed

+33
-6
lines changed

6 files changed

+33
-6
lines changed

Zend/zend_compile.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -766,8 +766,6 @@ ZEND_API void zend_assert_valid_class_name(const zend_string *const_name);
766766

767767
#include "zend_vm_opcodes.h"
768768

769-
#define ZEND_OP_DATA 137
770-
771769
/* END: OPCODES */
772770

773771
/* class fetches */

Zend/zend_vm_def.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7875,3 +7875,5 @@ ZEND_VM_C_LABEL(call_trampoline_end):
78757875
ZEND_VM_INC_OPCODE();
78767876
ZEND_VM_LEAVE();
78777877
}
7878+
7879+
ZEND_VM_DEFINE_OP(137, ZEND_OP_DATA);

Zend/zend_vm_execute.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1911,6 +1911,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CALL_TRAMPOLINE_SPEC_HANDLER(Z
19111911
ZEND_VM_INC_OPCODE();
19121912
ZEND_VM_LEAVE();
19131913
}
1914+
19141915
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
19151916
{
19161917
USE_OPLINE

Zend/zend_vm_gen.php

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1353,6 +1353,31 @@ function gen_vm($def, $skel) {
13531353
die("ERROR ($def:$lineno): helper '{$m[2]}' is not defined.\n");
13541354
}
13551355
$export[] = array("helper",$m[1],$m[2]);
1356+
} else if (strpos($line,"ZEND_VM_DEFINE_OP(") === 0) {
1357+
if (preg_match(
1358+
"/^ZEND_VM_DEFINE_OP\(\s*([0-9]+)\s*,\s*([A-Z_]+)\s*\);/",
1359+
$line,
1360+
$m) == 0) {
1361+
die("ERROR ($def:$lineno): Invalid ZEND_VM_DEFINE_OP definition.\n");
1362+
}
1363+
$code = (int)$m[1];
1364+
$op = $m[2];
1365+
$len = strlen($op);
1366+
1367+
if ($len > $max_opcode_len) {
1368+
$max_opcode_len = $len;
1369+
}
1370+
if ($code > $max_opcode) {
1371+
$max_opcode = $code;
1372+
}
1373+
if (isset($opcodes[$code])) {
1374+
die("ERROR ($def:$lineno): Opcode with code '$code' is already defined.\n");
1375+
}
1376+
if (isset($opnames[$op])) {
1377+
die("ERROR ($def:$lineno): Opcode with name '$op' is already defined.\n");
1378+
}
1379+
$opcodes[$code] = array("op"=>$op,"code"=>"");
1380+
$opnames[$op] = $code;
13561381
} else if ($handler !== null) {
13571382
// Add line of code to current opcode handler
13581383
$opcodes[$handler]["code"] .= $line;
@@ -1418,9 +1443,9 @@ function gen_vm($def, $skel) {
14181443
}
14191444
fputs($f, "};\n\n");
14201445

1421-
fputs($f, "ZEND_API const char* zend_get_opcode_name(zend_uchar opcode) {\n");
1422-
fputs($f, "\treturn zend_vm_opcodes_map[opcode];\n");
1423-
fputs($f, "}\n");
1446+
fputs($f, "ZEND_API const char* zend_get_opcode_name(zend_uchar opcode) {\n");
1447+
fputs($f, "\treturn zend_vm_opcodes_map[opcode];\n");
1448+
fputs($f, "}\n");
14241449

14251450
fclose($f);
14261451
echo "zend_vm_opcodes.c generated successfully.\n";

Zend/zend_vm_opcodes.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ const char *zend_vm_opcodes_map[171] = {
159159
"ZEND_POST_INC_OBJ",
160160
"ZEND_POST_DEC_OBJ",
161161
"ZEND_ASSIGN_OBJ",
162-
NULL,
162+
"ZEND_OP_DATA",
163163
"ZEND_INSTANCEOF",
164164
"ZEND_DECLARE_CLASS",
165165
"ZEND_DECLARE_INHERITED_CLASS",

Zend/zend_vm_opcodes.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ END_EXTERN_C()
169169
#define ZEND_POST_INC_OBJ 134
170170
#define ZEND_POST_DEC_OBJ 135
171171
#define ZEND_ASSIGN_OBJ 136
172+
#define ZEND_OP_DATA 137
172173
#define ZEND_INSTANCEOF 138
173174
#define ZEND_DECLARE_CLASS 139
174175
#define ZEND_DECLARE_INHERITED_CLASS 140

0 commit comments

Comments
 (0)