Skip to content

Commit a3dccb4

Browse files
author
Phalcon
committed
Merge pull request #1279 from sjinks/issue-1277
[1.3.0] Fix #1277 (ability to clone \Phalcon\Config)
2 parents 731f242 + 5a7bc48 commit a3dccb4

File tree

3 files changed

+46
-2
lines changed

3 files changed

+46
-2
lines changed

ext/config.c

+16-2
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,7 @@ static void phalcon_config_object_dtor(void* v TSRMLS_DC)
316316
*/
317317
static zend_object_value phalcon_config_object_ctor(zend_class_entry* ce TSRMLS_DC)
318318
{
319-
phalcon_config_object* obj = ecalloc(1, sizeof(phalcon_config_object));
319+
phalcon_config_object *obj = ecalloc(1, sizeof(phalcon_config_object));
320320
zend_object_value retval;
321321

322322
zend_object_std_init(&obj->obj, ce TSRMLS_CC);
@@ -331,14 +331,27 @@ static zend_object_value phalcon_config_object_ctor(zend_class_entry* ce TSRMLS_
331331
obj,
332332
(zend_objects_store_dtor_t)zend_objects_destroy_object,
333333
phalcon_config_object_dtor,
334-
NULL TSRMLS_CC
334+
NULL
335+
TSRMLS_CC
335336
);
336337

337338
retval.handlers = &phalcon_config_object_handlers;
338339

339340
return retval;
340341
}
341342

343+
static zend_object_value phalcon_config_clone_obj(zval *object TSRMLS_DC)
344+
{
345+
phalcon_config_object *orig = fetchPhalconConfigObject(object TSRMLS_CC);
346+
zend_object_value result = phalcon_config_object_ctor(Z_OBJCE_P(object) TSRMLS_CC);
347+
phalcon_config_object *clone = zend_object_store_get_object_by_handle(result.handle TSRMLS_CC);
348+
349+
zend_objects_clone_members(&clone->obj, result, &orig->obj, Z_OBJ_HANDLE_P(object) TSRMLS_CC);
350+
zend_hash_copy(clone->props, orig->props, (copy_ctor_func_t)zval_add_ref, NULL, sizeof(zval*));
351+
352+
return result;
353+
}
354+
342355
/**
343356
* Phalcon\Config initializer
344357
*/
@@ -360,6 +373,7 @@ PHALCON_INIT_CLASS(Phalcon_Config){
360373
phalcon_config_object_handlers.has_dimension = phalcon_config_has_dimension;
361374
phalcon_config_object_handlers.get_properties = phalcon_config_get_properties;
362375
phalcon_config_object_handlers.compare_objects = phalcon_config_compare_objects;
376+
phalcon_config_object_handlers.clone_obj = phalcon_config_clone_obj;
363377

364378
zend_class_implements(phalcon_config_ce TSRMLS_CC, 2, zend_ce_arrayaccess, spl_ce_Countable);
365379

ext/tests/issue-1277.phpt

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
--TEST--
2+
Phalcon\Config after clone is empty - https://github.com/phalcon/cphalcon/issues/1277
3+
--SKIPIF--
4+
<?php include('skipif.inc'); ?>
5+
--FILE--
6+
<?php
7+
$c1 = new Phalcon\Config();
8+
$c1["test"] = 1;
9+
$c2 = clone $c1;
10+
var_dump($c1);
11+
var_dump($c2);
12+
?>
13+
--EXPECT--
14+
object(Phalcon\Config)#1 (1) {
15+
["test"]=>
16+
int(1)
17+
}
18+
object(Phalcon\Config)#2 (1) {
19+
["test"]=>
20+
int(1)
21+
}

unit-tests/ConfigTest.php

+9
Original file line numberDiff line numberDiff line change
@@ -331,4 +331,13 @@ public function testIssue1024()
331331
),
332332
);
333333
}
334+
335+
public function testIssue1277()
336+
{
337+
$c1 = new \Phalcon\Config();
338+
$c1["test"] = 1;
339+
$c2 = clone $c1;
340+
$this->assertEquals($c1, $c2);
341+
$this->assertEquals($c1->toArray(), $c2->toArray());
342+
}
334343
}

0 commit comments

Comments
 (0)