@@ -1186,7 +1186,7 @@ function gen_null_label($f, $kind, $prolog) {
11861186 out ($ f ,$ prolog ."ZEND_NULL_HANDLER, \n" );
11871187 break ;
11881188 case ZEND_VM_KIND_SWITCH :
1189- out ($ f ,$ prolog ."(void*)(uintptr_t) -1, \n" );
1189+ out ($ f ,$ prolog ."-1, \n" );
11901190 break ;
11911191 case ZEND_VM_KIND_GOTO :
11921192 out ($ f ,$ prolog ."(void*)&&ZEND_NULL_LABEL, \n" );
@@ -1388,7 +1388,7 @@ function gen_labels($f, $spec, $kind, $prolog, &$specs, $switch_labels = array()
13881388 out ($ f ,"$ prolog {$ spec_name }_HANDLER, \n" );
13891389 break ;
13901390 case ZEND_VM_KIND_SWITCH :
1391- out ($ f ,$ prolog ."(void*)(uintptr_t) $ switch_labels [$ spec_name ], \n" );
1391+ out ($ f ,$ prolog ."$ switch_labels [$ spec_name ], \n" );
13921392 break ;
13931393 case ZEND_VM_KIND_GOTO :
13941394 out ($ f ,$ prolog ."(void*)&& {$ spec_name }_LABEL, \n" );
@@ -1436,7 +1436,7 @@ function gen_labels($f, $spec, $kind, $prolog, &$specs, $switch_labels = array()
14361436 out ($ f ,$ prolog ."ZEND_NULL_HANDLER, \n" );
14371437 break ;
14381438 case ZEND_VM_KIND_SWITCH :
1439- out ($ f ,$ prolog ."(void*)(uintptr_t) -1, \n" );
1439+ out ($ f ,$ prolog ."-1, \n" );
14401440 break ;
14411441 case ZEND_VM_KIND_GOTO :
14421442 out ($ f ,$ prolog ."(void*)&&ZEND_NULL_LABEL, \n" );
@@ -1467,7 +1467,7 @@ function gen_labels($f, $spec, $kind, $prolog, &$specs, $switch_labels = array()
14671467 out ($ f ,$ prolog .$ dsc ["op " ]."_HANDLER, \n" );
14681468 break ;
14691469 case ZEND_VM_KIND_SWITCH :
1470- out ($ f ,$ prolog ." (void*)(uintptr_t) " . ((string )$ num ).", \n" );
1470+ out ($ f ,$ prolog .((string )$ num ).", \n" );
14711471 break ;
14721472 case ZEND_VM_KIND_GOTO :
14731473 out ($ f ,$ prolog ."(void*)&& " .$ dsc ["op " ]."_LABEL, \n" );
@@ -1480,7 +1480,7 @@ function gen_labels($f, $spec, $kind, $prolog, &$specs, $switch_labels = array()
14801480 out ($ f ,$ prolog ."ZEND_NULL_HANDLER, \n" );
14811481 break ;
14821482 case ZEND_VM_KIND_SWITCH :
1483- out ($ f ,$ prolog ."(void*)(uintptr_t) -1, \n" );
1483+ out ($ f ,$ prolog ."-1, \n" );
14841484 break ;
14851485 case ZEND_VM_KIND_GOTO :
14861486 out ($ f ,$ prolog ."(void*)&&ZEND_NULL_LABEL, \n" );
@@ -1497,7 +1497,7 @@ function gen_labels($f, $spec, $kind, $prolog, &$specs, $switch_labels = array()
14971497 out ($ f ,$ prolog ."ZEND_NULL_HANDLER \n" );
14981498 break ;
14991499 case ZEND_VM_KIND_SWITCH :
1500- out ($ f ,$ prolog ."(void*)(uintptr_t) -1 \n" );
1500+ out ($ f ,$ prolog ."-1 \n" );
15011501 break ;
15021502 case ZEND_VM_KIND_GOTO :
15031503 out ($ f ,$ prolog ."(void*)&&ZEND_NULL_LABEL \n" );
@@ -1813,16 +1813,16 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name)
18131813 out ($ f ,"#define SPEC_RULE_OBSERVER 0x02000000 \n" );
18141814 out ($ f ,"\n" );
18151815 out ($ f ,"static const uint32_t *zend_spec_handlers; \n" );
1816- out ($ f ,"static const void * const *zend_opcode_handlers; \n" );
1816+ out ($ f ,"static zend_vm_opcode_handler_t const *zend_opcode_handlers; \n" );
18171817 out ($ f ,"static int zend_handlers_count; \n" );
18181818 if ($ kind == ZEND_VM_KIND_HYBRID ) {
18191819 out ($ f ,"#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID) \n" );
1820- out ($ f ,"static const void * const * zend_opcode_handler_funcs; \n" );
1820+ out ($ f ,"static zend_vm_opcode_handler_func_t const * zend_opcode_handler_funcs; \n" );
18211821 out ($ f ,"static zend_op hybrid_halt_op; \n" );
18221822 out ($ f ,"#endif \n" );
18231823 }
18241824 out ($ f ,"#if (ZEND_VM_KIND != ZEND_VM_KIND_HYBRID) || !ZEND_VM_SPEC \n" );
1825- out ($ f ,"static const void * zend_vm_get_opcode_handler(uint8_t opcode, const zend_op* op); \n" );
1825+ out ($ f ,"static zend_vm_opcode_handler_t zend_vm_get_opcode_handler(uint8_t opcode, const zend_op* op); \n" );
18261826 out ($ f ,"#endif \n\n" );
18271827 if ($ kind == ZEND_VM_KIND_HYBRID ) {
18281828 out ($ f ,"#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID) \n" );
@@ -2040,7 +2040,7 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name)
20402040 break ;
20412041 case "HELPER_VARS " :
20422042 if ($ kind == ZEND_VM_KIND_SWITCH ) {
2043- out ($ f ,$ m [1 ]."const void * dispatch_handler; \n" );
2043+ out ($ f ,$ m [1 ]."zend_vm_opcode_handler_t dispatch_handler; \n" );
20442044 }
20452045 if ($ kind != ZEND_VM_KIND_CALL && count ($ params )) {
20462046 if ($ kind == ZEND_VM_KIND_HYBRID ) {
@@ -2097,8 +2097,8 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name)
20972097 out ($ f ,$ prolog ."\tstatic const void * const labels[] = { \n" );
20982098 gen_labels ($ f , $ spec , ($ kind == ZEND_VM_KIND_HYBRID ) ? ZEND_VM_KIND_GOTO : $ kind , $ prolog ."\t\t" , $ specs );
20992099 out ($ f ,$ prolog ."\t}; \n" );
2100- out ($ f ,$ prolog ."\tzend_opcode_handlers = (const void * *) labels; \n" );
2101- out ($ f ,$ prolog ."\tzend_handlers_count = sizeof(labels) / sizeof(void* ); \n" );
2100+ out ($ f ,$ prolog ."\tzend_opcode_handlers = (zend_vm_opcode_handler_t *) labels; \n" );
2101+ out ($ f ,$ prolog ."\tzend_handlers_count = sizeof(labels) / sizeof(labels[0] ); \n" );
21022102 if ($ kind == ZEND_VM_KIND_HYBRID ) {
21032103 out ($ f ,$ prolog ."\tmemset(&hybrid_halt_op, 0, sizeof(hybrid_halt_op)); \n" );
21042104 out ($ f ,$ prolog ."\thybrid_halt_op.handler = (void*)&&HYBRID_HALT_LABEL; \n" );
@@ -2212,7 +2212,11 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name)
22122212 out ($ f ,$ prolog ."zend_spec_handlers = specs; \n" );
22132213 out ($ f ,$ prolog .$ executor_name ."_ex(NULL); \n" );
22142214 } else {
2215- out ($ f ,$ prolog ."static const void * const labels[] = { \n" );
2215+ out ($ f ,"#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID) \n" );
2216+ out ($ f ,$ prolog ."static zend_vm_opcode_handler_func_t const labels[] = { \n" );
2217+ out ($ f ,"#else \n" );
2218+ out ($ f ,$ prolog ."static zend_vm_opcode_handler_t const labels[] = { \n" );
2219+ out ($ f ,"#endif \n" );
22162220 gen_labels ($ f , $ spec , ($ kind == ZEND_VM_KIND_HYBRID ) ? ZEND_VM_KIND_CALL : $ kind , $ prolog ."\t" , $ specs , $ switch_labels );
22172221 out ($ f ,$ prolog ."}; \n" );
22182222 out ($ f ,$ prolog ."static const uint32_t specs[] = { \n" );
@@ -2226,7 +2230,7 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name)
22262230 out ($ f ,"#else \n" );
22272231 }
22282232 out ($ f ,$ prolog ."zend_opcode_handlers = labels; \n" );
2229- out ($ f ,$ prolog ."zend_handlers_count = sizeof(labels) / sizeof(void* ); \n" );
2233+ out ($ f ,$ prolog ."zend_handlers_count = sizeof(labels) / sizeof(labels[0] ); \n" );
22302234 out ($ f ,$ prolog ."zend_spec_handlers = specs; \n" );
22312235 if ($ kind == ZEND_VM_KIND_HYBRID ) {
22322236 out ($ f ,"#endif \n" );
@@ -2359,6 +2363,20 @@ function gen_vm_opcodes_header(
23592363 $ str .= "# endif \n" ;
23602364 $ str .= "#endif \n" ;
23612365 $ str .= "\n" ;
2366+ $ str .= "#if ZEND_VM_KIND == ZEND_VM_KIND_HYBRID \n" ;
2367+ $ str .= "typedef const void* zend_vm_opcode_handler_t; \n" ;
2368+ $ str .= "typedef void (ZEND_FASTCALL *zend_vm_opcode_handler_func_t)(void); \n" ;
2369+ $ str .= "#elif ZEND_VM_KIND == ZEND_VM_KIND_CALL \n" ;
2370+ $ str .= "typedef const struct _zend_op *(ZEND_FASTCALL *zend_vm_opcode_handler_t)(struct _zend_execute_data *execute_data, const struct _zend_op *opline); \n" ;
2371+ $ str .= "typedef const struct _zend_op *(ZEND_FASTCALL *zend_vm_opcode_handler_func_t)(struct _zend_execute_data *execute_data, const struct _zend_op *opline); \n" ;
2372+ $ str .= "#elif ZEND_VM_KIND == ZEND_VM_KIND_SWITCH \n" ;
2373+ $ str .= "typedef int zend_vm_opcode_handler_t; \n" ;
2374+ $ str .= "#elif ZEND_VM_KIND == ZEND_VM_KIND_GOTO \n" ;
2375+ $ str .= "typedef const void* zend_vm_opcode_handler_t; \n" ;
2376+ $ str .= "#else \n" ;
2377+ $ str .= "# error \n" ;
2378+ $ str .= "#endif \n" ;
2379+ $ str .= "\n" ;
23622380 foreach ($ vm_op_flags as $ name => $ val ) {
23632381 $ str .= sprintf ("#define %-24s 0x%08x \n" , $ name , $ val );
23642382 }
@@ -2840,7 +2858,7 @@ function gen_vm($def, $skel) {
28402858 }
28412859 out ($ f , "} \n\n" );
28422860 out ($ f , "#if (ZEND_VM_KIND != ZEND_VM_KIND_HYBRID) || !ZEND_VM_SPEC \n" );
2843- out ($ f , "static const void * zend_vm_get_opcode_handler(uint8_t opcode, const zend_op* op) \n" );
2861+ out ($ f , "static zend_vm_opcode_handler_t zend_vm_get_opcode_handler(uint8_t opcode, const zend_op* op) \n" );
28442862 out ($ f , "{ \n" );
28452863 if (!ZEND_VM_SPEC ) {
28462864 out ($ f , "\treturn zend_opcode_handlers[zend_vm_get_opcode_handler_idx(opcode, op)]; \n" );
0 commit comments