]> granicus.if.org Git - php/commitdiff
Improved GENERATOR_CREATE opcode handler.
authorDmitry Stogov <dmitry@zend.com>
Mon, 9 Jan 2017 19:24:21 +0000 (22:24 +0300)
committerDmitry Stogov <dmitry@zend.com>
Mon, 9 Jan 2017 19:24:21 +0000 (22:24 +0300)
NEWS
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

diff --git a/NEWS b/NEWS
index 082f7836f4e84541520a8052882390f1a4c64db7..bd7cabc225e387832fee266b6e05d4f0e7e04f70 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -3,6 +3,7 @@ PHP                                                                        NEWS
 ?? ??? 2017, PHP 7.1.2
 
 - Core:
+  . Improved GENERATOR_CREATE opcode handler. (Bob, Dmitry)
   . Fixed bug #73877 (readlink() returns garbage for UTF-8 paths). (Anatol)
   . Fixed bug #73876 (Crash when exporting **= in expansion of assign op).
     (Sara)
index 8987e6bcf7e64a199c5fb1d1ad5b0f2d3ce7f2f4..80b06ff25a2395305cc9704e915b91119c2f6b53 100644 (file)
@@ -4093,8 +4093,14 @@ ZEND_VM_HANDLER(41, ZEND_GENERATOR_CREATE, ANY, ANY)
                 * is allocated on heap.
                 */
                num_args = EX_NUM_ARGS();
-               used_stack = (ZEND_CALL_FRAME_SLOT + num_args + EX(func)->op_array.last_var + EX(func)->op_array.T - MIN(EX(func)->op_array.num_args, num_args)) * sizeof(zval);
-               gen_execute_data = (zend_execute_data*)emalloc(used_stack);
+               if (EXPECTED(num_args <= EX(func)->op_array.last_var)) {
+                       used_stack = (ZEND_CALL_FRAME_SLOT + EX(func)->op_array.last_var + EX(func)->op_array.T) * sizeof(zval);
+                       gen_execute_data = (zend_execute_data*)emalloc(used_stack);
+                       used_stack = (ZEND_CALL_FRAME_SLOT + EX(func)->op_array.last_var) * sizeof(zval);
+               } else {
+                       used_stack = (ZEND_CALL_FRAME_SLOT + num_args + EX(func)->op_array.last_var + EX(func)->op_array.T - EX(func)->op_array.num_args) * sizeof(zval);
+                       gen_execute_data = (zend_execute_data*)emalloc(used_stack);
+               }
                memcpy(gen_execute_data, execute_data, used_stack);
 
                /* Save execution context in generator object. */
index 972594df006c7877015a8ab634d933cca35e78b4..04f33ca12c63af731b07f6bdb4a0ba98c896e433 100644 (file)
@@ -1179,8 +1179,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GENERATOR_CREATE_SPEC_HANDLER(
                 * is allocated on heap.
                 */
                num_args = EX_NUM_ARGS();
-               used_stack = (ZEND_CALL_FRAME_SLOT + num_args + EX(func)->op_array.last_var + EX(func)->op_array.T - MIN(EX(func)->op_array.num_args, num_args)) * sizeof(zval);
-               gen_execute_data = (zend_execute_data*)emalloc(used_stack);
+               if (EXPECTED(num_args <= EX(func)->op_array.last_var)) {
+                       used_stack = (ZEND_CALL_FRAME_SLOT + EX(func)->op_array.last_var + EX(func)->op_array.T) * sizeof(zval);
+                       gen_execute_data = (zend_execute_data*)emalloc(used_stack);
+                       used_stack = (ZEND_CALL_FRAME_SLOT + EX(func)->op_array.last_var) * sizeof(zval);
+               } else {
+                       used_stack = (ZEND_CALL_FRAME_SLOT + num_args + EX(func)->op_array.last_var + EX(func)->op_array.T - EX(func)->op_array.num_args) * sizeof(zval);
+                       gen_execute_data = (zend_execute_data*)emalloc(used_stack);
+               }
                memcpy(gen_execute_data, execute_data, used_stack);
 
                /* Save execution context in generator object. */