From 526344aa5ee3190b754e3678e0c71b0d7f272876 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 24 Jan 2019 10:56:04 +0100 Subject: [PATCH] Add flag to disable jumptable optimization This is useful for coverage. While it is currently safe to just skip over the SWITCH_* opcodes, this may not be true in the future due to opcache optimizations, so it's safer to disable emission of SWITCH_* opcodes entirely. --- Zend/zend_compile.c | 4 ++++ Zend/zend_compile.h | 3 +++ 2 files changed, 7 insertions(+) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index d91b656182..28336130cc 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -4907,6 +4907,10 @@ static zend_uchar determine_switch_jumptable_type(zend_ast_list *cases) { } static zend_bool should_use_jumptable(zend_ast_list *cases, zend_uchar jumptable_type) { + if (CG(compiler_options) & ZEND_COMPILE_NO_JUMPTABLES) { + return 0; + } + /* Thresholds are chosen based on when the average switch time for equidistributed * input becomes smaller when using the jumptable optimization. */ if (jumptable_type == IS_LONG) { diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index b9345e4384..47430576ec 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -1040,6 +1040,9 @@ END_EXTERN_C() /* disable builtin special case function calls */ #define ZEND_COMPILE_NO_BUILTINS (1<<10) +/* disable jumptable optimization for switch statements */ +#define ZEND_COMPILE_NO_JUMPTABLES (1<<11) + /* The default value for CG(compiler_options) */ #define ZEND_COMPILE_DEFAULT ZEND_COMPILE_HANDLE_OP_ARRAY -- 2.40.0