Skip to content

Commit fd1984a

Browse files
committed
PHPC-1230: Allow cloning Symbol objects
1 parent 625ffaf commit fd1984a

File tree

2 files changed

+57
-0
lines changed

2 files changed

+57
-0
lines changed

src/BSON/Symbol.c

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,32 @@ phongo_create_object_retval php_phongo_symbol_create_object(zend_class_entry* cl
249249
#endif
250250
} /* }}} */
251251

252+
static phongo_create_object_retval php_phongo_symbol_clone_object(zval* object TSRMLS_DC) /* {{{ */
253+
{
254+
php_phongo_symbol_t* intern;
255+
php_phongo_symbol_t* new_intern;
256+
phongo_create_object_retval new_object;
257+
258+
intern = Z_SYMBOL_OBJ_P(object);
259+
new_object = php_phongo_symbol_create_object(Z_OBJCE_P(object) TSRMLS_CC);
260+
261+
#if PHP_VERSION_ID >= 70000
262+
new_intern = Z_OBJ_SYMBOL(new_object);
263+
zend_objects_clone_members(&new_intern->std, &intern->std TSRMLS_CC);
264+
#else
265+
{
266+
zend_object_handle handle = Z_OBJ_HANDLE_P(object);
267+
268+
new_intern = (php_phongo_symbol_t*) zend_object_store_get_object_by_handle(new_object.handle TSRMLS_CC);
269+
zend_objects_clone_members(&new_intern->std, new_object, &intern->std, handle TSRMLS_CC);
270+
}
271+
#endif
272+
273+
php_phongo_symbol_init(new_intern, intern->symbol, intern->symbol_len TSRMLS_CC);
274+
275+
return new_object;
276+
} /* }}} */
277+
252278
static int php_phongo_symbol_compare_objects(zval* o1, zval* o2 TSRMLS_DC) /* {{{ */
253279
{
254280
php_phongo_symbol_t *intern1, *intern2;
@@ -326,6 +352,7 @@ void php_phongo_symbol_init_ce(INIT_FUNC_ARGS) /* {{{ */
326352
zend_class_implements(php_phongo_symbol_ce TSRMLS_CC, 1, zend_ce_serializable);
327353

328354
memcpy(&php_phongo_handler_symbol, phongo_get_std_object_handlers(), sizeof(zend_object_handlers));
355+
php_phongo_handler_symbol.clone_obj = php_phongo_symbol_clone_object;
329356
php_phongo_handler_symbol.compare_objects = php_phongo_symbol_compare_objects;
330357
php_phongo_handler_symbol.get_debug_info = php_phongo_symbol_get_debug_info;
331358
php_phongo_handler_symbol.get_gc = php_phongo_symbol_get_gc;

tests/bson/bson-symbol-clone-001.phpt

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
--TEST--
2+
MongoDB\BSON\Symbol can be cloned
3+
--FILE--
4+
<?php
5+
6+
require_once __DIR__ . '/../utils/tools.php';
7+
8+
$test = MongoDB\BSON\toPHP(MongoDB\BSON\fromJSON('{ "symbol": {"$symbol": "test"} }'));
9+
10+
$symbol = $test->symbol;
11+
12+
$clone = clone $symbol;
13+
14+
var_dump($clone == $symbol);
15+
var_dump($clone === $symbol);
16+
17+
unset($symbol);
18+
19+
var_dump($clone);
20+
?>
21+
===DONE===
22+
<?php exit(0); ?>
23+
--EXPECTF--
24+
bool(true)
25+
bool(false)
26+
object(MongoDB\BSON\Symbol)#%d (1) {
27+
["symbol"]=>
28+
string(4) "test"
29+
}
30+
===DONE===

0 commit comments

Comments
 (0)