Commit:    676e737f5b99d3036adf18287cf928d624484d2f
Author:    Xinchen Hui <larue...@php.net>         Fri, 19 Apr 2013 11:06:38 
+0800
Parents:   580d6fe94d67f2d8780136a871e4d5290bb3dea8
Branches:  master

Link:       
http://git.php.net/?p=php-src.git;a=commitdiff;h=676e737f5b99d3036adf18287cf928d624484d2f

Log:
Fix other typos & add test script

Changed paths:
  M  ext/opcache/Optimizer/optimize_func_calls.c
  A  ext/opcache/tests/optimize_func_calls.phpt


Diff:
diff --git a/ext/opcache/Optimizer/optimize_func_calls.c 
b/ext/opcache/Optimizer/optimize_func_calls.c
index 27f3ac5..98bfc1e 100644
--- a/ext/opcache/Optimizer/optimize_func_calls.c
+++ b/ext/opcache/Optimizer/optimize_func_calls.c
@@ -81,7 +81,7 @@ static void optimize_func_calls(zend_op_array *op_array, 
zend_persistent_script
                        case ZEND_FETCH_OBJ_FUNC_ARG:
                        case ZEND_FETCH_DIM_FUNC_ARG:
                                if (call_stack[call - 1].func) {
-                                       if 
(ARG_SHOULD_BE_SENT_BY_REF(call_stack[call].func, (opline->extended_value & 
ZEND_FETCH_ARG_MASK))) {
+                                       if 
(ARG_SHOULD_BE_SENT_BY_REF(call_stack[call - 1].func, (opline->extended_value & 
ZEND_FETCH_ARG_MASK))) {
                                                opline->extended_value = 0;
                                                opline->opcode -= 9;
                                        } else {
@@ -92,9 +92,9 @@ static void optimize_func_calls(zend_op_array *op_array, 
zend_persistent_script
                                break;
                        case ZEND_SEND_VAL:
                                if (opline->extended_value == 
ZEND_DO_FCALL_BY_NAME && call_stack[call - 1].func) {
-                                       if 
(ARG_MUST_BE_SENT_BY_REF(call_stack[call].func, opline->op2.num)) {
+                                       if 
(ARG_MUST_BE_SENT_BY_REF(call_stack[call - 1].func, opline->op2.num)) {
                                                /* We won't convert it 
into_DO_FCALL to emit error at run-time */
-                                               call_stack[call].opline = NULL;
+                                               call_stack[call - 1].opline = 
NULL;
                                        } else {
                                                opline->extended_value = 
ZEND_DO_FCALL;
                                        }
@@ -102,7 +102,7 @@ static void optimize_func_calls(zend_op_array *op_array, 
zend_persistent_script
                                break;
                        case ZEND_SEND_VAR:
                                if (opline->extended_value == 
ZEND_DO_FCALL_BY_NAME && call_stack[call - 1].func) {
-                                       if 
(ARG_SHOULD_BE_SENT_BY_REF(call_stack[call].func, opline->op2.num)) {
+                                       if 
(ARG_SHOULD_BE_SENT_BY_REF(call_stack[call - 1].func, opline->op2.num)) {
                                                opline->opcode = ZEND_SEND_REF;
                                        }
                                        opline->extended_value = ZEND_DO_FCALL;
@@ -110,7 +110,7 @@ static void optimize_func_calls(zend_op_array *op_array, 
zend_persistent_script
                                break;
                        case ZEND_SEND_VAR_NO_REF:
                                if (!(opline->extended_value & 
ZEND_ARG_COMPILE_TIME_BOUND) && call_stack[call - 1].func) {
-                                       if 
(ARG_SHOULD_BE_SENT_BY_REF(call_stack[call].func, opline->op2.num)) {
+                                       if 
(ARG_SHOULD_BE_SENT_BY_REF(call_stack[call - 1].func, opline->op2.num)) {
                                                opline->extended_value |= 
ZEND_ARG_COMPILE_TIME_BOUND | ZEND_ARG_SEND_BY_REF;
                                        } else if (opline->extended_value) {
                                                opline->extended_value |= 
ZEND_ARG_COMPILE_TIME_BOUND;
@@ -123,7 +123,7 @@ static void optimize_func_calls(zend_op_array *op_array, 
zend_persistent_script
                        case ZEND_SEND_REF:
                                if (opline->extended_value == 
ZEND_DO_FCALL_BY_NAME && call_stack[call - 1].func) {
                                        /* We won't handle run-time pass by 
reference */
-                                       call_stack[call].opline = NULL;
+                                       call_stack[call - 1].opline = NULL;
                                }
                                break;
 
diff --git a/ext/opcache/tests/optimize_func_calls.phpt 
b/ext/opcache/tests/optimize_func_calls.phpt
new file mode 100644
index 0000000..b3bc8da
--- /dev/null
+++ b/ext/opcache/tests/optimize_func_calls.phpt
@@ -0,0 +1,130 @@
+--TEST--
+Test with optimization of function calls
+--INI--
+opcache.enable=1
+opcache.enable_cli=1
+opcache.optimization_level=-1
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+
+class A {
+       public $obj;
+       public function test($a) {
+       }
+}
+
+function a(&$b) {
+       $b = "changed";
+       return "done";
+}
+
+$a = "a";
+$b = "b";
+$c = "c";
+$f = "a";
+
+/*
+ * INIT_FCALL_BY_NAME
+ * SEND_VAR
+ * DO_FCALL
+ * DO_FCALL_BY_NAME
+ */
+foo(a($a));
+var_dump($a);
+$a = "a";
+
+/*
+ * INIT_FCALL_BY_NAME
+ *   INIT_FCALL_BY_NAME -- un-optimizable
+ *   DO_FCALL_BY_NAME   -- un-optimizable
+ * DO_FCALL_BY_NAME
+ */
+foo($f($a));
+var_dump($a);
+
+/*
+ * INIT_FCALL_BY_NAME
+ *   ZEND_NEW
+ *   DO_FCALL_BY_NAME
+ * DO_FCALL_BY_NAME
+ */
+foo(new A());
+
+/*
+ * INIT_FCALL_BY_NAME
+ * FETCH_OBJ_FUNC_ARG
+ * ZEND_SEND_VAR
+ * DO_FCALL_BY_NAME
+ */
+foo((new A)->obj);
+$obj = new A;
+ref($obj->obj);
+var_dump($obj->obj);
+
+ref(retarray()[0]);
+
+$a = "a";
+foo(a($a), $a, ref($b, $c), $obj);
+var_dump($a);
+var_dump($b);
+
+/*
+ * INIT_FCALL_BY_NAME
+ * SEND_VAL
+ * DO_FCALL_BY_NAME
+ */
+ref("xxx");
+
+function retarray() {
+       return array("retarray");
+}
+
+function foo($a) {
+       print_r(func_get_args());
+}
+
+function ref(&$b) {
+       $b = "changed";
+       return "ref";
+}
+--EXPECTF--
+Array
+(
+    [0] => done
+)
+string(7) "changed"
+Array
+(
+    [0] => done
+)
+string(7) "changed"
+Array
+(
+    [0] => A Object
+        (
+            [obj] => 
+        )
+
+)
+Array
+(
+    [0] => 
+)
+string(7) "changed"
+Array
+(
+    [0] => done
+    [1] => changed
+    [2] => ref
+    [3] => A Object
+        (
+            [obj] => changed
+        )
+
+)
+string(7) "changed"
+string(7) "changed"
+
+Fatal error: Cannot pass parameter 1 by reference in %soptimize_func_calls.php 
on line %d


--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to