diff options
author | Dmitry Stogov <dmitry@zend.com> | 2015-09-25 12:54:51 +0300 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2015-09-25 12:54:51 +0300 |
commit | 7e797f13026440c54e24f89cf29f46bb0b262a39 (patch) | |
tree | d9a530877994eaf892bb9ad7db2e101d3b35e41b /Zend/zend_vm_gen.php | |
parent | 37c85ebb9469b4411bb5d144e6d9ec525ea552a1 (diff) | |
download | php-git-7e797f13026440c54e24f89cf29f46bb0b262a39.tar.gz |
Allow an experimental VM with tail call dispatch technique (disabled by default).
This VM may work only if all tail calls are optimized, otherwaise it will crach because of stack overflow.
Unfortunately, we can't guarantee tail call optimization in C.
Diffstat (limited to 'Zend/zend_vm_gen.php')
-rw-r--r-- | Zend/zend_vm_gen.php | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/Zend/zend_vm_gen.php b/Zend/zend_vm_gen.php index 8f06bb4894..613b4c9338 100644 --- a/Zend/zend_vm_gen.php +++ b/Zend/zend_vm_gen.php @@ -1058,8 +1058,12 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name) out($f,"#if defined(ZEND_VM_FP_GLOBAL_REG) && defined(ZEND_VM_IP_GLOBAL_REG)\n"); out($f,"# define ZEND_OPCODE_HANDLER_RET void\n"); out($f,"# define ZEND_VM_TAIL_CALL(call) call; return\n"); - out($f,"# define ZEND_VM_CONTINUE() return\n"); - out($f,"# define ZEND_VM_RETURN() opline = NULL; ZEND_VM_CONTINUE()\n"); + out($f,"# ifdef ZEND_VM_TAIL_CALL_DISPATCH\n"); + out($f,"# define ZEND_VM_CONTINUE() ((opcode_handler_t)OPLINE->handler)(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); return\n"); + out($f,"# else\n"); + out($f,"# define ZEND_VM_CONTINUE() return\n"); + out($f,"# endif\n"); + out($f,"# define ZEND_VM_RETURN() opline = NULL; return\n"); out($f,"#else\n"); out($f,"# define ZEND_OPCODE_HANDLER_RET int\n"); out($f,"# define ZEND_VM_TAIL_CALL(call) return call\n"); |