Dmitry Stogov
6a911e833f
Optimized JMPZNZ to avoid multiplication at runtime (may be it makes sense to use relative addresses everywere it'll lead to Position Independent Code)
2014-04-30 11:23:19 +04:00
Dmitry Stogov
8a8df2ce68
Changed order of types
2014-04-29 10:54:59 +04:00
Nikita Popov
4cd97b3ebd
Fix by-reference argument unpacking
2014-04-26 10:40:12 +02:00
Nikita Popov
5db9312ec8
Add dst parameter to convert_object_to_type macro
...
Avoids a ZVAL_DUP in the zval_get_* functions.
Also improve object-to-array cast a bit by initializing the array
with correct number of elements and not doing a alloc-init-free
cycle when convert_object_to_type succeeds.
2014-04-25 23:21:05 +02:00
Nikita Popov
778946b3b6
Use convert_scalar_to_array only for arrays
2014-04-25 23:21:05 +02:00
Nikita Popov
4c16b777fe
Uhm, do we really need to support that?
2014-04-25 23:21:05 +02:00
Nikita Popov
9263d18bd9
Optimize ZEND_CAST to avoid zval copies
...
The scalar type casts IS_NULL, IS_BOOL, IS_LONG, IS_DOUBLE and
IS_STRING will no longer require a copy when casting.
A copy is now only made when casting to IS_ARRAY and IS_OBJECT, if
the type doesn't already match.
I tweaked the reference handling for the type-already-correct case
to DEREF the zval after that check. References require a copy anyway,
so they can go through the slow codepath.
2014-04-25 23:21:05 +02:00
Nikita Popov
dd419d24ca
Replace more convert_to_* calls
2014-04-25 23:21:05 +02:00
Nikita Popov
93f9518a58
Align zval_get_long/double with zval_get_string
2014-04-25 23:21:04 +02:00
Dmitry Stogov
f9927a6c97
Merge mainstream 'master' branch into refactoring
...
During merge I had to revert:
Nikita's patch for php_splice() (it probably needs to be applyed again)
Bob Weinand's patches related to constant expression handling (we need to review them carefully)
I also reverted all our attempts to support sapi/phpdbg (we didn't test it anyway)
Conflicts:
Zend/zend.h
Zend/zend_API.c
Zend/zend_ast.c
Zend/zend_compile.c
Zend/zend_compile.h
Zend/zend_constants.c
Zend/zend_exceptions.c
Zend/zend_execute.c
Zend/zend_execute.h
Zend/zend_execute_API.c
Zend/zend_hash.c
Zend/zend_highlight.c
Zend/zend_language_parser.y
Zend/zend_language_scanner.c
Zend/zend_language_scanner_defs.h
Zend/zend_variables.c
Zend/zend_vm_def.h
Zend/zend_vm_execute.h
ext/date/php_date.c
ext/dom/documenttype.c
ext/hash/hash.c
ext/iconv/iconv.c
ext/mbstring/tests/zend_multibyte-10.phpt
ext/mbstring/tests/zend_multibyte-11.phpt
ext/mbstring/tests/zend_multibyte-12.phpt
ext/mysql/php_mysql.c
ext/mysqli/mysqli.c
ext/mysqlnd/mysqlnd_reverse_api.c
ext/mysqlnd/php_mysqlnd.c
ext/opcache/ZendAccelerator.c
ext/opcache/zend_accelerator_util_funcs.c
ext/opcache/zend_persist.c
ext/opcache/zend_persist_calc.c
ext/pcre/php_pcre.c
ext/pdo/pdo_dbh.c
ext/pdo/pdo_stmt.c
ext/pdo_pgsql/pgsql_driver.c
ext/pgsql/pgsql.c
ext/reflection/php_reflection.c
ext/session/session.c
ext/spl/spl_array.c
ext/spl/spl_observer.c
ext/standard/array.c
ext/standard/basic_functions.c
ext/standard/html.c
ext/standard/mail.c
ext/standard/php_array.h
ext/standard/proc_open.c
ext/standard/streamsfuncs.c
ext/standard/user_filters.c
ext/standard/var_unserializer.c
ext/standard/var_unserializer.re
main/php_variables.c
sapi/phpdbg/phpdbg.c
sapi/phpdbg/phpdbg_bp.c
sapi/phpdbg/phpdbg_frame.c
sapi/phpdbg/phpdbg_help.c
sapi/phpdbg/phpdbg_list.c
sapi/phpdbg/phpdbg_print.c
sapi/phpdbg/phpdbg_prompt.c
2014-04-26 00:32:51 +04:00
Dmitry Stogov
4e7cbf3f58
Use appropriate macros
2014-04-25 11:54:10 +04:00
Dmitry Stogov
42a33085c8
Avoid useless allocations
2014-04-25 11:29:18 +04:00
Dmitry Stogov
df7ca608ce
Optimized constant lookup
2014-04-25 00:56:15 +04:00
Dmitry Stogov
b1ff152782
Reimplement strtr()
2014-04-24 19:14:29 +04:00
Dmitry Stogov
65e2ed6e50
Redesigned zend_execute_data layout now EX(object), EX(scope) and EX(called_scope) arr properties of the current function execution co
...
ntext. They are set during zend_execute_data initialization and never changed.
2014-04-24 15:53:20 +04:00
Nikita Popov
c98d373eb6
Fix strict array comparison
...
Fixes Symfony test failures
2014-04-23 20:34:45 +02:00
Nikita Popov
08ae88157b
Allocate zend_strings with correct size
...
For me (32bit) sizeof(zend_string) is 20, which means that the
char[1] array at the end is padded with three bytes. Thus allocating
based on sizeof(zend_string)-1 overallocates by those 3 padding bytes.
This commit fixes the allocation size, by using XtOffsetOf.
2014-04-23 19:34:51 +02:00
Dmitry Stogov
7e424f5a95
Use symbolic names instead of magic constants + optimization
2014-04-23 02:47:41 +04:00
Nikita Popov
9c70603f4a
Initialize hash as unpacked if it contains string keys
2014-04-22 21:33:49 +02:00
Nikita Popov
4912bec514
Fix zts
2014-04-22 19:39:13 +02:00
Nikita Popov
3d3a55cbcb
Pass expected array size hint in INIT_ARRAY
...
To avoid unnecessary rehashes
2014-04-22 18:57:03 +02:00
Dmitry Stogov
7584ae3200
Fixed compilaation warnings
2014-04-22 18:52:59 +04:00
Dmitry Stogov
5864ce8a44
Fixed compilation warnings
2014-04-22 17:46:34 +04:00
Dmitry Stogov
e295518bf3
Fixed typo
2014-04-22 13:11:07 +04:00
Dmitry Stogov
32e6e89887
Optimized ZEND_SEND_REF
2014-04-22 13:10:53 +04:00
Dmitry Stogov
5d479ef693
ZEND_SEND_* optimization
2014-04-22 12:33:00 +04:00
Dmitry Stogov
022fee2166
Cache knowledge about missing property_info
2014-04-22 10:11:41 +04:00
Dmitry Stogov
fa588a5c82
Use shorter call chain
2014-04-22 02:34:34 +04:00
Dmitry Stogov
1f181c0f4c
Chiper __autoload() function caching
2014-04-22 01:41:40 +04:00
Dmitry Stogov
a821009a6e
Avoid string duplication
2014-04-22 01:41:09 +04:00
Dmitry Stogov
ff6dc3e1f2
zend_isset_isempty_dim_prop_obj_handler() split into separate handlers. (Actually, it shared near nothing)
2014-04-22 00:32:29 +04:00
Dmitry Stogov
9610977d10
Reverted chunk committed by mistake
2014-04-21 23:32:36 +04:00
Dmitry Stogov
b9d45cc0a9
Handle references in "slow path"
2014-04-21 23:30:19 +04:00
Dmitry Stogov
4ed452c1b5
Convert zval_get_string() into "fast path" macro and "slow path" function
2014-04-21 22:36:01 +04:00
Dmitry Stogov
8ad8254a16
Merge branch 'refactoring2' of github.com:zendtech/php into refactoring2
2014-04-21 21:39:15 +04:00
Dmitry Stogov
4533269839
Fast path for pre/post inc/dec
2014-04-21 21:38:44 +04:00
Nikita Popov
0d43a277b8
Use zval_get_string in a few more places
2014-04-21 17:55:58 +02:00
Nikita Popov
bda96e3c58
Use zval_get_string in print_zval and propagate TSRMLS
2014-04-21 17:55:58 +02:00
Nikita Popov
5c8697184f
Bring zval_get_string implement in line with make_printable_zval
...
As make_printable_zval is the "main" string cast, match that one.
2014-04-21 17:55:58 +02:00
Dmitry Stogov
72c287bd23
Combine HashTable.flags and HashTable.nApplyCount into single 32-bit word
2014-04-21 18:25:34 +04:00
Dmitry Stogov
afe66d89a1
Cleanup
2014-04-21 16:34:40 +04:00
Dmitry Stogov
acd77dec81
Use alloca() for temporary allocation
2014-04-21 15:18:19 +04:00
Dmitry Stogov
fd24614cd9
Inline simple function
2014-04-21 15:18:05 +04:00
Dmitry Stogov
3c42593735
Removed duplicate code
2014-04-21 15:17:48 +04:00
Dmitry Stogov
f71da39210
Use ZEND_HASH_FOEACH_* instead of zend_hash_apply_*
2014-04-21 13:55:25 +04:00
Dmitry Stogov
e9f4d822b0
Avoid useles copy ctor
2014-04-21 13:19:52 +04:00
Dmitry Stogov
54d9ad53f4
More ZEND_HASH_FOREACH_* related changes
2014-04-19 00:08:14 +04:00
Dmitry Stogov
7652a977a8
Use ZEND_FETCH_FOREACH_* macros to iterate over HashTables instead of zend_hash_move_forward() and family.
2014-04-18 19:18:11 +04:00
Anatol Belski
f5f1abdc29
Merge branch 'PHP-5.6'
...
* PHP-5.6:
refixed the test related to bug #67072
Improved the fix for bug #67072 , thanks Nikita
2014-04-18 15:17:39 +02:00
Anatol Belski
cfd20c90a5
Merge branch 'PHP-5.5' into PHP-5.6
...
* PHP-5.5:
refixed the test related to bug #67072
Improved the fix for bug #67072 , thanks Nikita
2014-04-18 15:17:12 +02:00
Anatol Belski
d963cf94a5
refixed the test related to bug #67072
2014-04-18 15:16:09 +02:00
Dmitry Stogov
ea2e1bb1eb
Optimized zend_leave_helper()
2014-04-18 13:46:36 +04:00
Stanislav Malyshev
3405d799f8
Merge branch 'PHP-5.6'
...
* PHP-5.6:
Fixed test case for 5328d42
2014-04-17 17:37:05 -07:00
Stanislav Malyshev
ce4c78dd07
Merge branch 'PHP-5.5' into PHP-5.6
...
* PHP-5.5:
Fixed test case for 5328d42
2014-04-17 17:36:26 -07:00
Tjerk Meesters
5e988a888a
Fixed test case for 5328d42
2014-04-17 17:36:03 -07:00
Dmitry Stogov
e7b3b1132a
Fixed support for references
2014-04-17 17:21:59 +04:00
Dmitry Stogov
5c02e0fc5f
Cache op_array->run_time_cache in zend_execute_data for faster access
2014-04-17 16:36:04 +04:00
Dmitry Stogov
3cca67f740
Use local variables instead of opline operands to access cache_slots
2014-04-17 16:10:16 +04:00
Dmitry Stogov
e96073b1e4
Moved zend_literal->cache_slot right into zval.
...
It should be accessed using Z_CACHE_SLOT() macro.
zend_literal structure is removed.
API functions that accepted pointer to zend_literal now accept pointer to zval or cache_slot directly.
Calls of such functiond that now accept cache_slot need to be changed to pass -1 instead of NULL.
2014-04-17 15:40:45 +04:00
Dmitry Stogov
dfaf8b6d28
Merge branch 'refactoring2' of github.com:zendtech/php into refactoring2
2014-04-17 02:12:52 +04:00
Dmitry Stogov
6976eb2919
Fixed support for unspecialized and GOTO and SWITCH executor
2014-04-17 02:12:06 +04:00
Nikita Popov
f98937fa80
Don't copy in ZEND_CAST if type is already correct
2014-04-16 22:39:50 +02:00
Dmitry Stogov
5bb493c40b
op_array->filename and op_array->filename may be kept in opcache SHM
2014-04-16 22:39:23 +04:00
Dmitry Stogov
2d62a12128
Prevented modification of constant arguments
2014-04-16 21:31:32 +04:00
Dmitry Stogov
54c338acc1
Fixed reference counting
2014-04-16 18:06:03 +04:00
Dmitry Stogov
533a8b65f8
Fixed typo
2014-04-16 16:35:41 +04:00
Dmitry Stogov
2f65090a38
Fixed reference counting
2014-04-16 12:33:25 +04:00
Dmitry Stogov
fb4e0a6364
Removed invalid STR_RELEASE()
2014-04-16 12:28:20 +04:00
Dmitry Stogov
e99e6958bc
Cleanup
2014-04-16 01:45:40 +04:00
Nikita Popov
7a1a6092f6
Add functions for extracting long/double/string from zval
...
These function get the long / double / string value of a zval with
usual cast semantics, but without actually modifying the zval.
Didn't go on a killing spree for convert_to_* yet...
2014-04-15 20:32:47 +02:00
Dmitry Stogov
f9b26bc39a
Cleanup (2-nd round)
2014-04-15 21:56:30 +04:00
Dmitry Stogov
050d7e38ad
Cleanup (1-st round)
2014-04-15 15:40:40 +04:00
Dmitry Stogov
93d3a613d8
Fixed support for references
2014-04-15 11:13:23 +04:00
Xinchen Hui
a0690ff288
Fixed zend_object_get_t in simpleXML
2014-04-15 11:05:03 +08:00
Dmitry Stogov
460120c887
Fixed reference counting
2014-04-15 01:16:09 +04:00
Dmitry Stogov
cc50ebc487
Fixed memory leak
2014-04-14 23:53:25 +04:00
Dmitry Stogov
9629eea9e7
The test works out of the box
2014-04-14 22:43:33 +04:00
Dmitry Stogov
b0b54e8db4
Fixed nested GC calls (valgrind error in Zend/tests/gc_016.phpt)
2014-04-14 22:41:42 +04:00
Dmitry Stogov
5dc52e4880
Fixed interface constants inheritance.
...
Now we use IS_REFERENCE for inhereted class constants.
I might miss some edje cases.
2014-04-14 13:24:43 +04:00
Nikita Popov
4fc3d2d104
Copy varname before unset
...
Otherwise we get issues when the varname variable coincides with
the variable that is deleted.
2014-04-13 23:07:10 +02:00
Ferenc Kovacs
c459805cb2
Merge branch 'PHP-5.6'
...
* PHP-5.6:
Fix bug #66660 : use str_efree instead of efree to handle interned empty strings correctly
2014-04-13 10:48:42 +02:00
Ferenc Kovacs
20036525e2
Fix bug #66660 : use str_efree instead of efree to handle interned empty strings correctly
2014-04-13 10:45:46 +02:00
Dmitry Stogov
b178992cd1
Temporary fix for Zend/tests/bug46238.phpt
2014-04-12 00:50:36 +04:00
Bob Weinand
ca447a8f6f
Merge branch 'PHP-5.6'
2014-04-11 20:14:44 +02:00
Bob Weinand
096e40a027
Fixed tests for recent constant array changes
2014-04-11 20:13:24 +02:00
Nikita Popov
2c6ee5dcb5
Fix argument unpacking
2014-04-11 19:53:14 +02:00
Bob Weinand
ccf863c8ce
Merge branch 'PHP-5.6'
2014-04-11 19:35:11 +02:00
Bob Weinand
99d1a1bb3f
Shut up, my lovely compiler; I do not like your warnings
2014-04-11 19:33:56 +02:00
Bob Weinand
35b895fdf0
Removed useless void* parameter and replaced with zend_bool on zval_update_constant* functions
2014-04-11 19:18:58 +02:00
Bob Weinand
38ec4d20bf
Merge branch 'PHP-5.6'
2014-04-11 18:24:41 +02:00
Bob Weinand
ee2a7c7d41
Fixed disallowal of array usage in constants at run-time
...
Added at the same time the possibility of array dereferencing
to complete the set of features (useful application of arrays in constants)
2014-04-11 18:21:46 +02:00
Bob Weinand
53e71e47b9
Merge branch 'PHP-5.6'
2014-04-11 16:21:15 +02:00
Bob Weinand
ad05d3898e
Updated zend_vm_execute.h
2014-04-11 16:18:42 +02:00
Dmitry Stogov
e27eca90a5
for some reason gcc -O2 compiled the previous code in unexpected way
2014-04-11 18:16:03 +04:00
Dmitry Stogov
13f0c8b18c
Fixed double free
2014-04-11 16:48:38 +04:00
Dmitry Stogov
b6af031e52
Fixed support for references
2014-04-11 15:05:12 +04:00
Dmitry Stogov
f1f3e3c371
fixed persistent reaource destruction
2014-04-11 14:47:38 +04:00
Dmitry Stogov
ec4314f818
Fixed reference counting
2014-04-11 12:43:22 +04:00
Bob Weinand
9663193bbc
Merge branch 'PHP-5.6'
2014-04-11 10:11:58 +02:00
Bob Weinand
f614fc6898
Fix bug #66015 by reverting "Removed operations on constant arrays."
2014-04-11 10:08:44 +02:00
Dmitry Stogov
aeb64f5447
Fixed support for references
2014-04-11 11:15:31 +04:00
Dmitry Stogov
91ed685e26
Close all files and resources before before destroying object storage, because resources may point to objects. (THIS CHANGE MAY BE DANGEROUS)
2014-04-11 02:22:00 +04:00
Dmitry Stogov
98350cdcea
Introduced API to close all resources at once
2014-04-11 02:21:06 +04:00
Dmitry Stogov
a9599c9512
Fixed memory leak
2014-04-10 23:36:16 +04:00
Dmitry Stogov
8eb8d123e0
Fixed suppor for multibyte encoding
2014-04-10 18:47:47 +04:00
Nikita Popov
f449b04713
Fix some ZTS issues and leaks
2014-04-10 13:50:25 +02:00
Nikita Popov
a6be32f59a
IS_INTERNED is not always 0 in ZTS
...
The current implementation chooses to intern "" in ZTS. Either that
should be removed or IS_INTERNED needs to actually check the flag.
2014-04-09 23:54:03 +02:00
Nikita Popov
19ccd79942
Fix copying of constants for ZTS
...
Just a quick hack, should probably add an internal_copy_ctor
function for this.
2014-04-09 23:41:17 +02:00
Nikita Popov
3ce96eabc0
Fix function copying in ZTS
...
Still doesn't entirely work :/
2014-04-09 23:41:16 +02:00
Nikita Popov
20f2e5986e
Fix ZTS build
...
This only makes it compile, it doesn't actually work, presumably
because interned strings are assumed in some places.
2014-04-09 23:41:16 +02:00
Dmitry Stogov
d8a0c6c6ab
typo
2014-04-10 00:22:13 +04:00
Dmitry Stogov
29f068779f
Fixed ext/spl/tests/iterator_035.phpt
2014-04-09 23:49:58 +04:00
Dmitry Stogov
816f8dfefb
Fixed macro
2014-04-09 22:23:22 +04:00
Dmitry Stogov
8732f5e5d7
Removed useless code
2014-04-09 17:55:40 +04:00
Nikita Popov
21e01f2b70
Merge branch 'PHP-5.6'
2014-04-09 12:31:35 +02:00
Nikita Popov
ad2ef3d97e
Add only_integer_keys option to zend_hash_reindex
...
This allows to either do a full reindex, or only reindex the integer
keys.
2014-04-09 12:31:21 +02:00
Nikita Popov
22d3eb3117
Add zend_hash_splice
...
This implements the original functionality of php_splice, but
as an in-place operation, thus avoiding copying the HT.
This is much faster (~10x) if the splice removes a small portion
of the array and doesn't insert many elements.
2014-04-09 12:31:21 +02:00
Nikita Popov
1aa8719e32
Add zend_hash_reindex
...
The implementation differs from the original in array.c in that it
rehashes the hashtable in the same loop. This is approximately two
times faster (not counting the rare case of a purely associative
array).
2014-04-09 12:31:21 +02:00
Dmitry Stogov
abbb1c0f00
Unset CV before calling zval_ptr_dtor(), because its destructor may bailout and stay CV value in inconsistet state
2014-04-09 10:47:24 +04:00
Dmitry Stogov
c99b767537
Fixed generator destruction
2014-04-09 10:47:03 +04:00
Dmitry Stogov
7402af380b
Fixed destruction of objects and iterators on unclean request shutdown and GC (few cases are still unfixed).
...
Now we destroy objects it two steps. At first - object properties of all objects and only then the objects their selves.
2014-04-09 01:50:15 +04:00
Dmitry Stogov
0e7d30e8d3
Optimized ASSIGN_OP
2014-04-08 02:25:49 +04:00
Dmitry Stogov
3d0b32b3db
IS_CONST can't be a reference
2014-04-08 00:52:07 +04:00
Dmitry Stogov
f3c57716f7
Optimized ZEND_FETCH_R and family
2014-04-08 00:38:54 +04:00
Dmitry Stogov
3d17219cd8
Refactored zend_hash_* iteration API zend_hash_fove_forward_ex(ht, pos) and family require second argument to be real pointer.
...
&(ht)->nInternalPointer should be passed instead of NULL.
zend_hash_update_current_key() may work only with internal pointer.
2014-04-07 23:14:17 +04:00
Bob Weinand
d58a7500a7
Merge branch 'PHP-5.6'
2014-04-07 17:16:48 +02:00
Bob Weinand
0e273217cf
Fix Linux specific fail in error traces
...
Linux apparently does not like memcpy in overlapping regions...
2014-04-07 17:14:38 +02:00
Dmitry Stogov
3167b49ce9
Allocate HashTable->arData and HashTable->arHash at once
2014-04-07 18:22:03 +04:00
Dmitry Stogov
66b3b907c2
Cleanup
2014-04-07 16:50:41 +04:00
Dmitry Stogov
bf35b22af5
Optimized ISSET_ISEMPTY_DIM_OBJ
2014-04-07 14:56:34 +04:00
Dmitry Stogov
3485b11499
"incremental" hash bucket initialization
2014-04-07 13:31:44 +04:00
Dmitry Stogov
df7293b072
don't use memset() for array of zval initialization
2014-04-07 12:14:44 +04:00
Dmitry Stogov
8b2bb30137
Use macros
2014-04-07 10:57:58 +04:00
Dmitry Stogov
a94923d5cb
Avoid double zval copying in ZEND_SEND_VAL and zend_send_by_var_helper
2014-04-05 02:14:17 +04:00
Dmitry Stogov
a80e945835
Optimized ZEND_FETCH_DIM_*
2014-04-05 01:56:51 +04:00
Dmitry Stogov
c11dc75b4e
Refactored IS_INDIRECT IS_VAR passing between opcodes to avoid reference counting
2014-04-04 19:01:53 +04:00
Dmitry Stogov
cea26aa2eb
Tergets of ASSIGN and ASSIGN_REF don't have to be initialized
2014-04-04 15:22:41 +04:00
Dmitry Stogov
eaeb3c39b4
Optimized RECV_* opcodes
2014-04-04 14:36:34 +04:00
Dmitry Stogov
3bc8810b1e
Constant duplication optimization
...
Argument receiving optimization
2014-04-04 03:55:27 +04:00
Dmitry Stogov
58f0f2503c
Various VM optimizations
2014-04-04 02:52:53 +04:00
Dmitry Stogov
58871730c8
ASSIGN_REF optimization
2014-04-03 16:53:30 +04:00
Dmitry Stogov
76cc99fe60
Refactored ZVAL flags usage to simplify various checks (e.g. Z_REFCOUNTED(), candidate for GC, etc)
2014-04-03 15:26:23 +04:00
Dmitry Stogov
d8099d0468
Changed data layout to allow more efficient operations
2014-04-02 14:34:44 +04:00
Dmitry Stogov
5c912a805b
Use "fast" comparison function
2014-04-02 00:48:26 +04:00
Dmitry Stogov
60961bba3d
Avoid useless memset()
2014-04-01 23:56:45 +04:00
Dmitry Stogov
4456bfaa72
Avoid unnecessry reallocations
2014-04-01 23:27:51 +04:00
Dmitry Stogov
6b2ed577fd
Avoid unnecessry reallocations
2014-04-01 22:36:17 +04:00
Dmitry Stogov
8ddda2f649
Avoid unnecessry reallocation
2014-04-01 21:19:44 +04:00
Dmitry Stogov
8dedaf8512
Use interned strings for one character strings
2014-04-01 18:06:50 +04:00
Dmitry Stogov
042c937f69
Use STR_COPY() instead of STR_DUP() where possible
2014-04-01 17:10:15 +04:00