[PHP-CVS] com php-src: Fixed ZTS build: ext/opcache/Optimizer/optimize_func_calls.c
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
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
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
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
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
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
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
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
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
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
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