[PHP-CVS] com php-src: Fixed ZTS build: ext/opcache/Optimizer/optimize_func_calls.c

2013-04-18 Thread Dmitry Stogov
Commit:0040aa29b956008128ce771ebe01fa296ff05425
Author:Dmitry Stogov  Fri, 19 Apr 2013 10:43:00 
+0400
Parents:   60a59d27b48a7d2db204011322a6b32dfc186008
Branches:  master

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

Log:
Fixed ZTS build

Changed paths:
  M  ext/opcache/Optimizer/optimize_func_calls.c


Diff:
diff --git a/ext/opcache/Optimizer/optimize_func_calls.c 
b/ext/opcache/Optimizer/optimize_func_calls.c
index 727678b..a597fd9 100644
--- a/ext/opcache/Optimizer/optimize_func_calls.c
+++ b/ext/opcache/Optimizer/optimize_func_calls.c
@@ -8,7 +8,7 @@ typedef struct _optimizer_call_info {
zend_op   *opline;
 } optimizer_call_info;
 
-static void optimize_func_calls(zend_op_array *op_array, 
zend_persistent_script *script TSRMLS_CC) {
+static void optimize_func_calls(zend_op_array *op_array, 
zend_persistent_script *script TSRMLS_DC) {
zend_op *opline = op_array->opcodes;
zend_op *end = opline + op_array->last;
int call = 0;


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



[PHP-CVS] com php-src: Fix other typos & add test script: ext/opcache/Optimizer/optimize_func_calls.c ext/opcache/tests/optimize_func_calls.phpt

2013-04-18 Thread Xinchen Hui
Commit:676e737f5b99d3036adf18287cf928d624484d2f
Author:Xinchen Hui  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 000..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--
+
+--FILE--
+obj);
+$obj = 

[PHP-CVS] com php-src: Fix typo: ext/opcache/Optimizer/optimize_func_calls.c

2013-04-18 Thread Xinchen Hui
Commit:580d6fe94d67f2d8780136a871e4d5290bb3dea8
Author:Xinchen Hui  Fri, 19 Apr 2013 10:55:11 
+0800
Parents:   1192cfa58cb9b8f4c75b6d28072a4ad32fbcf5c3
Branches:  master

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

Log:
Fix typo

Changed paths:
  M  ext/opcache/Optimizer/optimize_func_calls.c


Diff:
diff --git a/ext/opcache/Optimizer/optimize_func_calls.c 
b/ext/opcache/Optimizer/optimize_func_calls.c
index a597fd9..27f3ac5 100644
--- a/ext/opcache/Optimizer/optimize_func_calls.c
+++ b/ext/opcache/Optimizer/optimize_func_calls.c
@@ -62,7 +62,7 @@ static void optimize_func_calls(zend_op_array *op_array, 
zend_persistent_script
MAKE_NOP(fcall);
} else if (opline->extended_value == 0 &&
   call_stack[call].opline &&
-  call_stack[call].opline == 
ZEND_INIT_FCALL_BY_NAME &&
+  call_stack[call].opline->opcode == 
ZEND_INIT_FCALL_BY_NAME &&
   
ZEND_OP2_TYPE(call_stack[call].opline) == IS_CONST) {
 
zend_op *fcall = 
call_stack[call].opline;


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



[PHP-CVS] com php-src: - Fixed ZTS build: ext/opcache/Optimizer/optimize_func_calls.c

2013-04-18 Thread Felipe Pena
Commit:1192cfa58cb9b8f4c75b6d28072a4ad32fbcf5c3
Author:Felipe Pena  Thu, 18 Apr 2013 19:27:02 
-0300
Parents:   3735d96ce0f2efa9b504ad1a645b1a0deb5d89cb
Branches:  master

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

Log:
- Fixed ZTS build

Changed paths:
  M  ext/opcache/Optimizer/optimize_func_calls.c


Diff:
diff --git a/ext/opcache/Optimizer/optimize_func_calls.c 
b/ext/opcache/Optimizer/optimize_func_calls.c
index 727678b..a597fd9 100644
--- a/ext/opcache/Optimizer/optimize_func_calls.c
+++ b/ext/opcache/Optimizer/optimize_func_calls.c
@@ -8,7 +8,7 @@ typedef struct _optimizer_call_info {
zend_op   *opline;
 } optimizer_call_info;
 
-static void optimize_func_calls(zend_op_array *op_array, 
zend_persistent_script *script TSRMLS_CC) {
+static void optimize_func_calls(zend_op_array *op_array, 
zend_persistent_script *script TSRMLS_DC) {
zend_op *opline = op_array->opcodes;
zend_op *end = opline + op_array->last;
int call = 0;


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



[PHP-CVS] svn: /SVNROOT/ global_avail

2013-04-18 Thread Pierre Joye
pajoye   Thu, 18 Apr 2013 19:34:40 +

Revision: http://svn.php.net/viewvc?view=revision&revision=330117

Log:
give Ondrej access to ext/gd, surely php-src later

Changed paths:
U   SVNROOT/global_avail

Modified: SVNROOT/global_avail
===
--- SVNROOT/global_avail2013-04-18 14:23:33 UTC (rev 330116)
+++ SVNROOT/global_avail2013-04-18 19:34:40 UTC (rev 330117)
@@ -166,7 +166,7 @@
 avail|steinm|php-src.git/ext/fdf
 avail|alan_k|php-src.git/ext/dio
 avail|askalski|php-src.git/ext/ftp
-avail|jah,ttoohey,smantoor|php-src.git/ext/gd
+avail|jah,ttoohey,smantoor,ondrej|php-src.git/ext/gd
 avail|alex|php-src.git/ext/gettext
 avail|steinm|php-src.git/ext/hyperwave
 avail|musone|php-src.git/ext/icap

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

[PHP-CVS] com php-src: Added an optimization pass to convert FCALL_BY_NAME into DO_FCALL.: ext/opcache/Optimizer/optimize_func_calls.c ext/opcache/Optimizer/pass1_5.c ext/opcache/Optimizer/zend_optimi

2013-04-18 Thread Dmitry Stogov
Commit:edfeab8bf2750da4616f802650d28b0774eccba3
Author:Dmitry Stogov  Thu, 18 Apr 2013 22:12:31 
+0400
Parents:   7deb3d41ebd80131e21733d6eaa51e7ccab3b949
Branches:  master

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

Log:
Added an optimization pass to convert FCALL_BY_NAME into DO_FCALL.

Changed paths:
  A  ext/opcache/Optimizer/optimize_func_calls.c
  M  ext/opcache/Optimizer/pass1_5.c
  M  ext/opcache/Optimizer/zend_optimizer.c
  M  ext/opcache/Optimizer/zend_optimizer.h

diff --git a/ext/opcache/Optimizer/optimize_func_calls.c 
b/ext/opcache/Optimizer/optimize_func_calls.c
new file mode 100644
index 000..ee271f2
--- /dev/null
+++ b/ext/opcache/Optimizer/optimize_func_calls.c
@@ -0,0 +1,136 @@
+/* pass 4
+ * - optimize INIT_FCALL_BY_NAME to DO_FCALL
+ */
+
+typedef struct _optimizer_call_info {
+   zend_function *func;
+   zend_op   *opline;
+} optimizer_call_info;
+
+static void optimize_func_calls(zend_op_array *op_array, 
zend_persistent_script *script TSRMLS_CC) {
+   zend_op *opline = op_array->opcodes;
+   zend_op *end = opline + op_array->last;
+   int call = 0;
+#if ZEND_EXTENSION_API_NO > PHP_5_4_X_API_NO
+   optimizer_call_info *call_stack = ecalloc(op_array->nested_calls + 1, 
sizeof(optimizer_call_info));
+#else
+   int stack_size = 4;
+   optimizer_call_info *call_stack = ecalloc(stack_size, 
sizeof(optimizer_call_info));
+#endif
+
+   while (opline < end) {
+   switch (opline->opcode) {
+   case ZEND_INIT_FCALL_BY_NAME:
+   case ZEND_INIT_NS_FCALL_BY_NAME:
+   if (ZEND_OP2_TYPE(opline) == IS_CONST) {
+   zend_function *func;
+   zval *function_name = 
&op_array->literals[opline->op2.constant + 1].constant;
+   if 
((zend_hash_quick_find(&script->function_table,
+   
Z_STRVAL_P(function_name), Z_STRLEN_P(function_name) + 1,
+   
Z_HASH_P(function_name), (void **)&func) == SUCCESS)) {
+   call_stack[call].func = func;
+   }
+   }
+   /* break missing intentionally */
+   case ZEND_NEW:
+   case ZEND_INIT_METHOD_CALL:
+   case ZEND_INIT_STATIC_METHOD_CALL:
+   call_stack[call].opline = opline;
+   call++;
+#if ZEND_EXTENSION_API_NO < PHP_5_5_X_API_NO
+   if (call == stack_size) {
+   stack_size += 4;
+   call_stack = erealloc(call_stack, 
sizeof(optimizer_call_info) * stack_size);
+   memset(call_stack + 4, 0, 4 * 
sizeof(optimizer_call_info));
+   }
+#endif
+   break;
+   case ZEND_DO_FCALL_BY_NAME:
+   call--;
+   if (call_stack[call].func && 
call_stack[call].opline) {
+   zend_op *fcall = 
call_stack[call].opline;
+
+   opline->opcode = ZEND_DO_FCALL;
+   ZEND_OP1_TYPE(opline) = IS_CONST;
+   opline->op1.constant = 
fcall->op2.constant + 1;
+   op_array->literals[fcall->op2.constant 
+ 1].cache_slot = op_array->literals[fcall->op2.constant].cache_slot;
+   literal_dtor(&ZEND_OP2_LITERAL(fcall));
+   if (fcall->opcode == 
ZEND_INIT_NS_FCALL_BY_NAME) {
+   
literal_dtor(&op_array->literals[fcall->op2.constant + 2].constant);
+   }
+   MAKE_NOP(fcall);
+   } else if (opline->extended_value == 0 &&
+  call_stack[call].opline &&
+  call_stack[call].opline == 
ZEND_INIT_FCALL_BY_NAME &&
+  
ZEND_OP2_TYPE(call_stack[call].opline) == IS_CONST) {
+
+   zend_op *fcall = 
call_stack[call].opline;
+
+   opline->opcode = ZEND_DO_FCALL;
+   ZEND_OP1_TYPE(opline) = IS_CONST;
+   opline->op1.constant = 
fcall->op2.constant + 1;
+   op_array->literals[fcall->op2.constant 
+ 1].cache_slot = op_array->literals

[PHP-CVS] com php-src: Disable FCALL optimization pass for PHP older than 5.4: ext/opcache/Optimizer/optimize_func_calls.c ext/opcache/Optimizer/zend_optimizer.c

2013-04-18 Thread Dmitry Stogov
Commit:60a59d27b48a7d2db204011322a6b32dfc186008
Author:Dmitry Stogov  Thu, 18 Apr 2013 22:22:48 
+0400
Parents:   edfeab8bf2750da4616f802650d28b0774eccba3
Branches:  master

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

Log:
Disable FCALL optimization pass for PHP older than 5.4

Changed paths:
  M  ext/opcache/Optimizer/optimize_func_calls.c
  M  ext/opcache/Optimizer/zend_optimizer.c


Diff:
diff --git a/ext/opcache/Optimizer/optimize_func_calls.c 
b/ext/opcache/Optimizer/optimize_func_calls.c
index ee271f2..727678b 100644
--- a/ext/opcache/Optimizer/optimize_func_calls.c
+++ b/ext/opcache/Optimizer/optimize_func_calls.c
@@ -1,6 +1,7 @@
 /* pass 4
  * - optimize INIT_FCALL_BY_NAME to DO_FCALL
  */
+#if ZEND_EXTENSION_API_NO > PHP_5_3_X_API_NO
 
 typedef struct _optimizer_call_info {
zend_function *func;
@@ -134,3 +135,4 @@ static void optimize_func_calls(zend_op_array *op_array, 
zend_persistent_script
 
efree(call_stack);
 }
+#endif
diff --git a/ext/opcache/Optimizer/zend_optimizer.c 
b/ext/opcache/Optimizer/zend_optimizer.c
index 9cbcd06..f3fbabc 100644
--- a/ext/opcache/Optimizer/zend_optimizer.c
+++ b/ext/opcache/Optimizer/zend_optimizer.c
@@ -146,12 +146,14 @@ static void zend_optimize(zend_op_array   
*op_array,
 */
 #include "Optimizer/pass3.c"
 
+#if ZEND_EXTENSION_API_NO > PHP_5_3_X_API_NO
/* pass 4:
 * - INIT_FCALL_BY_NAME -> DO_FCALL
 */
if (ZEND_OPTIMIZER_PASS_4 & OPTIMIZATION_LEVEL) {
optimize_func_calls(op_array, script TSRMLS_CC);
}
+#endif
 
/* pass 5:
 * - CFG optimization


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



[PHP-CVS] com php-src: Fixed compiler warning "cast from pointer to integer of different size": ext/opcache/shared_alloc_shm.c ext/opcache/zend_shared_alloc.c

2013-04-18 Thread Xinchen Hui
Commit:0704e4badb3abdfbdd5efc2b6d51c8abd6e5629a
Author:Xinchen Hui  Thu, 18 Apr 2013 17:32:46 
+0800
Parents:   5a897009a83bba1a0f32982d7438d6967d1eddeb
Branches:  PHP-5.5 master

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

Log:
Fixed compiler warning "cast from pointer to integer of different size"

Changed paths:
  M  ext/opcache/shared_alloc_shm.c
  M  ext/opcache/zend_shared_alloc.c


Diff:
diff --git a/ext/opcache/shared_alloc_shm.c b/ext/opcache/shared_alloc_shm.c
index d2b8423..d53236b 100644
--- a/ext/opcache/shared_alloc_shm.c
+++ b/ext/opcache/shared_alloc_shm.c
@@ -111,7 +111,7 @@ static int create_segments(size_t requested_size, 
zend_shared_segment_shm ***sha
}
 
shared_segments[i].common.p = shmat(shared_segments[i].shm_id, 
NULL, 0);
-   if (((int) shared_segments[i].common.p) == -1) {
+   if (shared_segments[i].common.p == (void *)-1) {
*error_in = "shmat";
shmctl(shared_segments[i].shm_id, IPC_RMID, &sds);
return ALLOC_FAILURE;
diff --git a/ext/opcache/zend_shared_alloc.c b/ext/opcache/zend_shared_alloc.c
index ebfdea2..5405751 100644
--- a/ext/opcache/zend_shared_alloc.c
+++ b/ext/opcache/zend_shared_alloc.c
@@ -137,7 +137,7 @@ static int zend_shared_alloc_try(const 
zend_shared_memory_handler_entry *he, int
int i;
/* cleanup */
for (i = 0; i < *shared_segments_count; i++) {
-   if ((*shared_segments_p)[i]->p && 
(int)(*shared_segments_p)[i]->p != -1) {
+   if ((*shared_segments_p)[i]->p && 
(*shared_segments_p)[i]->p != (void *)-1) {
S_H(detach_segment)((*shared_segments_p)[i]);
}
}


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



[PHP-CVS] com php-src: Optimizer may hide some repeating error messages: Zend/tests/bug30820.phpt

2013-04-18 Thread Dmitry Stogov
Commit:26c761915b6a6ca726965e0f1c8a7007d32fe263
Author:Dmitry Stogov  Thu, 18 Apr 2013 11:53:44 
+0400
Parents:   2bfb523f45cc0c64b5b63f9ad7fb6ec7c701d695
Branches:  master

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

Log:
Optimizer may hide some repeating error messages

Changed paths:
  M  Zend/tests/bug30820.phpt


Diff:
diff --git a/Zend/tests/bug30820.phpt b/Zend/tests/bug30820.phpt
index 97e46e9..a0f71e7 100644
--- a/Zend/tests/bug30820.phpt
+++ b/Zend/tests/bug30820.phpt
@@ -2,6 +2,7 @@
 Bug #30820 (static member conflict with $this->member silently ignored)
 --INI--
 error_reporting=4095
+opcache.optimization_level=0
 --FILE--
 http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



[PHP-CVS] com php-src: Merge branch 'PHP-5.5' into PHP-5.5-opcache: ext/opcache/Optimizer/zend_optimizer.c

2013-04-18 Thread Dmitry Stogov
Commit:36d343c0c44da754957cfcb9b9544acdf0a9e229
Author:Dmitry Stogov  Wed, 17 Apr 2013 21:32:08 
+0400
Parents:   e16f24327dd756f81997bf714e0dc28f63a1dc0c 
5a897009a83bba1a0f32982d7438d6967d1eddeb
Branches:  master

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

Log:
Merge branch 'PHP-5.5' into PHP-5.5-opcache

* PHP-5.5:
  Initialize literals hash_value and cache_slot
  Added curl config test for windows
  updated lib versions
  updated lib versions
  fixed EOL
  updated lib versions
  allow lcov 1.10
  allow lcov 1.10

Conflicts:
ext/opcache/Optimizer/zend_optimizer.c

Changed paths:
  MM  ext/opcache/Optimizer/zend_optimizer.c


Diff:
diff --cc ext/opcache/Optimizer/zend_optimizer.c
index 92f5f4a,a6450ab..b2148e1
--- a/ext/opcache/Optimizer/zend_optimizer.c
+++ b/ext/opcache/Optimizer/zend_optimizer.c
@@@ -64,8 -33,13 +64,10 @@@ int zend_optimizer_add_literal(zend_op_
  {
int i = op_array->last_literal;
op_array->last_literal++;
 -  if (i >= CG(context).literals_size) {
 -  CG(context).literals_size += 16; /* FIXME */
 -  op_array->literals = 
(zend_literal*)erealloc(op_array->literals, CG(context).literals_size * 
sizeof(zend_literal));
 -  }
 +  op_array->literals = (zend_literal*)erealloc(op_array->literals, 
op_array->last_literal * sizeof(zend_literal));
op_array->literals[i].constant = *zv;
+   op_array->literals[i].hash_value = 0;
+   op_array->literals[i].cache_slot = -1;
Z_SET_REFCOUNT(op_array->literals[i].constant, 2);
Z_SET_ISREF(op_array->literals[i].constant);
return i;


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



[PHP-CVS] com php-src: Merge identical constants (and related cache_slots) in op_array->literals table.: ext/opcache/Optimizer/compact_literals.c ext/opcache/Optimizer/zend_optimizer.c ext/opcache/Opt

2013-04-18 Thread Dmitry Stogov
Commit:2bfb523f45cc0c64b5b63f9ad7fb6ec7c701d695
Author:Dmitry Stogov  Thu, 18 Apr 2013 10:48:16 
+0400
Parents:   36d343c0c44da754957cfcb9b9544acdf0a9e229
Branches:  master

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

Log:
Merge identical constants (and related cache_slots) in op_array->literals table.

Changed paths:
  A  ext/opcache/Optimizer/compact_literals.c
  M  ext/opcache/Optimizer/zend_optimizer.c
  M  ext/opcache/Optimizer/zend_optimizer.h
  A  ext/opcache/tests/compact_literals.phpt

diff --git a/ext/opcache/Optimizer/compact_literals.c 
b/ext/opcache/Optimizer/compact_literals.c
new file mode 100644
index 000..b292413
--- /dev/null
+++ b/ext/opcache/Optimizer/compact_literals.c
@@ -0,0 +1,481 @@
+/* pass 11
+ * - compact literals table
+ */
+#if ZEND_EXTENSION_API_NO > PHP_5_3_X_API_NO
+
+#define DEBUG_COMPACT_LITERALS 0
+
+#define LITERAL_VALUE0x0100
+#define LITERAL_FUNC 0x0200
+#define LITERAL_CLASS0x0300
+#define LITERAL_CONST0x0400
+#define LITERAL_CLASS_CONST  0x0500
+#define LITERAL_STATIC_METHOD0x0600
+#define LITERAL_STATIC_PROPERTY  0x0700
+#define LITERAL_METHOD   0x0800
+#define LITERAL_PROPERTY 0x0900
+
+#define LITERAL_EX_CLASS 0x4000
+#define LITERAL_EX_OBJ   0x2000
+#define LITERAL_MAY_MERGE0x1000
+#define LITERAL_KIND_MASK0x0f00
+#define LITERAL_NUM_RELATED_MASK 0x000f
+#define LITERAL_NUM_SLOTS_MASK   0x00f0
+#define LITERAL_NUM_SLOTS_SHIFT  4
+
+#define LITERAL_NUM_RELATED(info) (info & LITERAL_NUM_RELATED_MASK)
+#define LITERAL_NUM_SLOTS(info)   ((info & LITERAL_NUM_SLOTS_MASK) >> 
LITERAL_NUM_SLOTS_SHIFT)
+
+typedef struct _literal_info {
+   zend_uint  flags; /* bitmask (see defines above) */
+   union {
+   intnum;   /* variable number or class name literal number */
+   } u;
+} literal_info;
+
+#define LITERAL_FLAGS(kind, slots, related) \
+   ((kind) | ((slots) << LITERAL_NUM_SLOTS_SHIFT) | (related))
+
+#define LITERAL_INFO(n, kind, merge, slots, related) do { \
+   info[n].flags = (((merge) ? LITERAL_MAY_MERGE : 0) | 
LITERAL_FLAGS(kind, slots, related)); \
+   } while (0)
+
+#define LITERAL_INFO_CLASS(n, kind, merge, slots, related, _num) do { \
+   info[n].flags = (LITERAL_EX_CLASS | ((merge) ? 
LITERAL_MAY_MERGE : 0) | LITERAL_FLAGS(kind, slots, related)); \
+   info[n].u.num = (_num); \
+   } while (0)
+
+#define LITERAL_INFO_OBJ(n, kind, merge, slots, related, _num) do { \
+   info[n].flags = (LITERAL_EX_OBJ | ((merge) ? LITERAL_MAY_MERGE 
: 0) | LITERAL_FLAGS(kind, slots, related)); \
+   info[n].u.num = (_num); \
+   } while (0)
+
+static void optimizer_literal_obj_info(literal_info   *info,
+   zend_uchar  op_type,
+   znode_opop,
+   int constant,
+   zend_uint   kind,
+   zend_uint   slots,
+   zend_uint   related,
+   zend_op_array  *op_array)
+{
+   /* For now we merge only $this object properties and methods.
+* In general it's also possible to do it for any CV variable as well,
+* but it would require complex dataflow and/or type analysis.
+*/
+   if (Z_TYPE(op_array->literals[constant].constant) == IS_STRING &&
+   op_type == IS_UNUSED) {
+   LITERAL_INFO_OBJ(constant, kind, 1, slots, related, 
op_array->this_var);
+   } else {
+   LITERAL_INFO(constant, kind, 0, slots, related);
+   }
+}
+
+static void optimizer_literal_class_info(literal_info   *info,
+ zend_uchar  op_type,
+ znode_opop,
+ int constant,
+ zend_uint   kind,
+ zend_uint   slots,
+ zend_uint   related,
+ zend_op_array  *op_array)
+{
+   if (op_type == IS_CONST) {
+   LITERAL_INFO_CLASS(constant, kind, 1, slots, related, 
op.constant);
+   } else {
+   LITERAL_INFO(constant, kind, 0, slots, related);
+   }
+}
+
+static void optimizer_compact_literals(zend_op_array *op_array TSRMLS_DC)
+{
+   zend_op *opline, *end;
+   int i, j, n, *pos, *map, cache_slots;
+   ulong h;
+   literal_info *info;
+   int