Skip to content

Commit 8861fac

Browse files
committed
Fix bugs, implement __set_state
1 parent db8dfaf commit 8861fac

File tree

5 files changed

+116
-14
lines changed

5 files changed

+116
-14
lines changed

ext/spl/spl_immutablekeyvaluesequence.c

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,7 @@ static HashTable* spl_immutablekeyvaluesequence_object_get_properties(zend_objec
307307
Z_TRY_ADDREF_P(&entries[i].key);
308308
Z_TRY_ADDREF_P(&entries[i].value);
309309
ZVAL_ARR(&tmp, zend_new_pair(&entries[i].key, &entries[i].value));
310-
zend_hash_index_update(ht, i++, &tmp);
310+
zend_hash_index_update(ht, i, &tmp);
311311
}
312312

313313
return ht;
@@ -675,14 +675,7 @@ static void spl_cached_entries_init_from_traversable_pairs(spl_cached_entries *a
675675
}
676676
}
677677

678-
PHP_METHOD(ImmutableKeyValueSequence, fromPairs)
679-
{
680-
zval *iterable;
681-
682-
ZEND_PARSE_PARAMETERS_START(1, 1)
683-
Z_PARAM_ITERABLE(iterable)
684-
ZEND_PARSE_PARAMETERS_END();
685-
678+
static zend_object* create_from_pairs(zval *iterable) {
686679
zend_object *object = spl_immutablekeyvaluesequence_new(spl_ce_ImmutableKeyValueSequence);
687680
spl_immutablekeyvaluesequence_object *intern = cached_iterable_from_obj(object);
688681
switch (Z_TYPE_P(iterable)) {
@@ -694,6 +687,30 @@ PHP_METHOD(ImmutableKeyValueSequence, fromPairs)
694687
break;
695688
EMPTY_SWITCH_DEFAULT_CASE();
696689
}
690+
return object;
691+
}
692+
693+
PHP_METHOD(ImmutableKeyValueSequence, fromPairs)
694+
{
695+
zval *iterable;
696+
697+
ZEND_PARSE_PARAMETERS_START(1, 1)
698+
Z_PARAM_ITERABLE(iterable)
699+
ZEND_PARSE_PARAMETERS_END();
700+
701+
RETURN_OBJ(create_from_pairs(iterable));
702+
}
703+
704+
PHP_METHOD(ImmutableKeyValueSequence, __set_state)
705+
{
706+
zend_array *array_ht;
707+
708+
ZEND_PARSE_PARAMETERS_START(1, 1)
709+
Z_PARAM_ARRAY_HT(array_ht)
710+
ZEND_PARSE_PARAMETERS_END();
711+
zend_object *object = spl_immutablekeyvaluesequence_new(spl_ce_ImmutableKeyValueSequence);
712+
spl_immutablekeyvaluesequence_object *intern = cached_iterable_from_obj(object);
713+
spl_cached_entries_init_from_array_pairs(&intern->array, array_ht);
697714

698715
RETURN_OBJ(object);
699716
}

ext/spl/spl_immutablekeyvaluesequence.stub.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,12 @@ final class ImmutableKeyValueSequence implements IteratorAggregate, Countable, J
77
public function __construct(iterable $iterator) {}
88
public function getIterator(): InternalIterator {}
99
public function count(): int {}
10-
public static function fromPairs(iterable $pairs): ImmutableKeyValueSequence;
11-
public function toPairs(): array;
10+
public static function fromPairs(iterable $pairs): ImmutableKeyValueSequence {}
11+
public function toPairs(): array {}
1212

1313
public function __serialize(): array {}
1414
public function __unserialize(array $data): void {}
15+
public static function __set_state(array $array): ImmutableKeyValueSequence {}
1516

1617
public function keys(): array {}
1718
public function values(): array {}

ext/spl/spl_immutablekeyvaluesequence_arginfo.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* This is a generated file, edit the .stub.php file instead.
2-
* Stub hash: d3090bb712370a96756fa04444ef292c4815640a */
2+
* Stub hash: 730dc375507a0bea337b9c242d493a2d9cfbf268 */
33

44
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ImmutableKeyValueSequence___construct, 0, 0, 1)
55
ZEND_ARG_TYPE_INFO(0, iterator, IS_ITERABLE, 0)
@@ -24,6 +24,10 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_ImmutableKeyValueSequence_
2424
ZEND_ARG_TYPE_INFO(0, data, IS_ARRAY, 0)
2525
ZEND_END_ARG_INFO()
2626

27+
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_class_ImmutableKeyValueSequence___set_state, 0, 1, ImmutableKeyValueSequence, 0)
28+
ZEND_ARG_TYPE_INFO(0, array, IS_ARRAY, 0)
29+
ZEND_END_ARG_INFO()
30+
2731
#define arginfo_class_ImmutableKeyValueSequence_keys arginfo_class_ImmutableKeyValueSequence_toPairs
2832

2933
#define arginfo_class_ImmutableKeyValueSequence_values arginfo_class_ImmutableKeyValueSequence_toPairs
@@ -44,6 +48,7 @@ ZEND_METHOD(ImmutableKeyValueSequence, fromPairs);
4448
ZEND_METHOD(ImmutableKeyValueSequence, toPairs);
4549
ZEND_METHOD(ImmutableKeyValueSequence, __serialize);
4650
ZEND_METHOD(ImmutableKeyValueSequence, __unserialize);
51+
ZEND_METHOD(ImmutableKeyValueSequence, __set_state);
4752
ZEND_METHOD(ImmutableKeyValueSequence, keys);
4853
ZEND_METHOD(ImmutableKeyValueSequence, values);
4954
ZEND_METHOD(ImmutableKeyValueSequence, keyAt);
@@ -59,6 +64,7 @@ static const zend_function_entry class_ImmutableKeyValueSequence_methods[] = {
5964
ZEND_ME(ImmutableKeyValueSequence, toPairs, arginfo_class_ImmutableKeyValueSequence_toPairs, ZEND_ACC_PUBLIC)
6065
ZEND_ME(ImmutableKeyValueSequence, __serialize, arginfo_class_ImmutableKeyValueSequence___serialize, ZEND_ACC_PUBLIC)
6166
ZEND_ME(ImmutableKeyValueSequence, __unserialize, arginfo_class_ImmutableKeyValueSequence___unserialize, ZEND_ACC_PUBLIC)
67+
ZEND_ME(ImmutableKeyValueSequence, __set_state, arginfo_class_ImmutableKeyValueSequence___set_state, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
6268
ZEND_ME(ImmutableKeyValueSequence, keys, arginfo_class_ImmutableKeyValueSequence_keys, ZEND_ACC_PUBLIC)
6369
ZEND_ME(ImmutableKeyValueSequence, values, arginfo_class_ImmutableKeyValueSequence_values, ZEND_ACC_PUBLIC)
6470
ZEND_ME(ImmutableKeyValueSequence, keyAt, arginfo_class_ImmutableKeyValueSequence_keyAt, ZEND_ACC_PUBLIC)

ext/spl/tests/CachedIterable/CachedIterable.phpt

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,23 +25,39 @@ Value: 'x'
2525
Key: 'second'
2626
Value: (object) array(
2727
)
28-
object(ImmutableKeyValueSequence)#1 (1) {
28+
object(ImmutableKeyValueSequence)#1 (2) {
2929
[0]=>
3030
array(2) {
3131
[0]=>
3232
string(5) "first"
3333
[1]=>
3434
string(1) "x"
3535
}
36+
[1]=>
37+
array(2) {
38+
[0]=>
39+
string(6) "second"
40+
[1]=>
41+
object(stdClass)#2 (0) {
42+
}
43+
}
3644
}
37-
array(1) {
45+
array(2) {
3846
[0]=>
3947
array(2) {
4048
[0]=>
4149
string(5) "first"
4250
[1]=>
4351
string(1) "x"
4452
}
53+
[1]=>
54+
array(2) {
55+
[0]=>
56+
string(6) "second"
57+
[1]=>
58+
object(stdClass)#2 (0) {
59+
}
60+
}
4561
}
4662
object(ImmutableKeyValueSequence)#3 (0) {
4763
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
--TEST--
2+
ImmutableKeyValueSequence::__set_state
3+
--FILE--
4+
<?php
5+
6+
function dump_repr($obj) {
7+
echo str_replace(" \n", "\n", var_export($obj, true)), "\n";
8+
}
9+
dump_repr(ImmutableKeyValueSequence::__set_state([]));
10+
try {
11+
ImmutableKeyValueSequence::__set_state(['first' => 'x']);
12+
} catch (Throwable $e) {
13+
printf("Caught %s: %s\n", $e::class, $e->getMessage());
14+
}
15+
$it = ImmutableKeyValueSequence::__set_state([['first', 'x'], [(object)['key' => 'value'], null]]);
16+
foreach ($it as $key => $value) {
17+
printf("key=%s value=%s\n", json_encode($key), json_encode($value));
18+
}
19+
dump_repr($it);
20+
var_dump($it->toPairs());
21+
22+
?>
23+
--EXPECT--
24+
ImmutableKeyValueSequence::__set_state(array(
25+
))
26+
Caught UnexpectedValueException: Expected to find pair in array but got non-array
27+
key="first" value="x"
28+
key={"key":"value"} value=null
29+
ImmutableKeyValueSequence::__set_state(array(
30+
0 =>
31+
array (
32+
0 => 'first',
33+
1 => 'x',
34+
),
35+
1 =>
36+
array (
37+
0 =>
38+
(object) array(
39+
'key' => 'value',
40+
),
41+
1 => NULL,
42+
),
43+
))
44+
array(2) {
45+
[0]=>
46+
array(2) {
47+
[0]=>
48+
string(5) "first"
49+
[1]=>
50+
string(1) "x"
51+
}
52+
[1]=>
53+
array(2) {
54+
[0]=>
55+
object(stdClass)#1 (1) {
56+
["key"]=>
57+
string(5) "value"
58+
}
59+
[1]=>
60+
NULL
61+
}
62+
}

0 commit comments

Comments
 (0)