@@ -72,7 +72,7 @@ public function getValue($recursive = false)
72
72
if ($ item instanceof Stub && Stub::TYPE_REF === $ item ->type && !$ item ->position ) {
73
73
$ item = $ item ->value ;
74
74
}
75
- if (!$ item instanceof Stub) {
75
+ if (!( $ item = $ this -> getStub ( $ item )) instanceof Stub) {
76
76
return $ item ;
77
77
}
78
78
if (Stub::TYPE_STRING === $ item ->type ) {
@@ -82,20 +82,20 @@ public function getValue($recursive = false)
82
82
$ children = $ item ->position ? $ this ->data [$ item ->position ] : array ();
83
83
84
84
foreach ($ children as $ k => $ v ) {
85
- if ($ recursive && !$ v instanceof Stub) {
85
+ if ($ recursive && !( $ v = $ this -> getStub ( $ v )) instanceof Stub) {
86
86
continue ;
87
87
}
88
88
$ children [$ k ] = clone $ this ;
89
89
$ children [$ k ]->key = $ k ;
90
90
$ children [$ k ]->position = $ item ->position ;
91
91
92
92
if ($ recursive ) {
93
- if ($ v instanceof Stub && Stub ::TYPE_REF === $ v ->type && $ v -> value instanceof Stub) {
93
+ if (Stub::TYPE_REF === $ v ->type && ( $ v = $ this -> getStub ( $ v -> value )) instanceof Stub) {
94
94
$ recursive = (array ) $ recursive ;
95
- if (isset ($ recursive [$ v ->value -> position ])) {
95
+ if (isset ($ recursive [$ v ->position ])) {
96
96
continue ;
97
97
}
98
- $ recursive [$ v ->value -> position ] = true ;
98
+ $ recursive [$ v ->position ] = true ;
99
99
}
100
100
$ children [$ k ] = $ children [$ k ]->getValue ($ recursive );
101
101
}
@@ -123,7 +123,7 @@ public function getIterator()
123
123
public function __get ($ key )
124
124
{
125
125
if (null !== $ data = $ this ->seek ($ key )) {
126
- $ item = $ data ->data [$ data ->position ][$ data ->key ];
126
+ $ item = $ this -> getStub ( $ data ->data [$ data ->position ][$ data ->key ]) ;
127
127
128
128
return $ item instanceof Stub || array () === $ item ? $ data : $ item ;
129
129
}
@@ -236,7 +236,7 @@ public function seek($key)
236
236
if ($ item instanceof Stub && Stub::TYPE_REF === $ item ->type && !$ item ->position ) {
237
237
$ item = $ item ->value ;
238
238
}
239
- if (!$ item instanceof Stub || !$ item ->position ) {
239
+ if (!( $ item = $ this -> getStub ( $ item )) instanceof Stub || !$ item ->position ) {
240
240
return ;
241
241
}
242
242
$ keys = array ($ key );
@@ -288,13 +288,7 @@ public function serialize()
288
288
foreach ($ data as $ i => $ values ) {
289
289
foreach ($ values as $ k => $ v ) {
290
290
if ($ v instanceof Stub) {
291
- if (Stub::TYPE_ARRAY === $ v ->type ) {
292
- $ v = self ::mapStubConsts ($ v , false );
293
- $ data [$ i ][$ k ] = array ($ v ->class , $ v ->position , $ v ->cut );
294
- } else {
295
- $ v = self ::mapStubConsts ($ v , false );
296
- $ data [$ i ][$ k ] = array ($ v ->class , $ v ->position , $ v ->cut , $ v ->type , $ v ->value , $ v ->handle , $ v ->refCount , $ v ->attr );
297
- }
291
+ $ data [$ i ][$ k ] = array ($ v ->class , $ v ->position , $ v ->cut , $ v ->type , $ v ->value , $ v ->handle , $ v ->refCount , $ v ->attr );
298
292
}
299
293
}
300
294
}
@@ -311,17 +305,10 @@ public function unserialize($serialized)
311
305
312
306
foreach ($ data as $ i => $ values ) {
313
307
foreach ($ values as $ k => $ v ) {
314
- if ($ v && is_array ($ v )) {
308
+ if ($ v && is_array ($ v ) && isset ( $ v [ 7 ]) ) {
315
309
$ s = new Stub ();
316
- if (3 === count ($ v )) {
317
- $ s ->type = Stub::TYPE_ARRAY ;
318
- $ s = self ::mapStubConsts ($ s , false );
319
- list ($ s ->class , $ s ->position , $ s ->cut ) = $ v ;
320
- $ s ->value = $ s ->cut + count ($ data [$ s ->position ]);
321
- } else {
322
- list ($ s ->class , $ s ->position , $ s ->cut , $ s ->type , $ s ->value , $ s ->handle , $ s ->refCount , $ s ->attr ) = $ v ;
323
- }
324
- $ data [$ i ][$ k ] = self ::mapStubConsts ($ s , true );
310
+ list ($ s ->class , $ s ->position , $ s ->cut , $ s ->type , $ s ->value , $ s ->handle , $ s ->refCount , $ s ->attr ) = $ v ;
311
+ $ data [$ i ][$ k ] = $ s ;
325
312
}
326
313
}
327
314
}
@@ -347,6 +334,9 @@ private function dumpItem($dumper, $cursor, &$refs, $item)
347
334
if (!$ item instanceof Stub) {
348
335
$ cursor ->attr = array ();
349
336
$ type = gettype ($ item );
337
+ if ($ item && 'array ' === $ type ) {
338
+ $ item = $ this ->getStub ($ item );
339
+ }
350
340
} elseif (Stub::TYPE_REF === $ item ->type ) {
351
341
if ($ item ->handle ) {
352
342
if (!isset ($ refs [$ r = $ item ->handle - (PHP_INT_MAX >> 1 )])) {
@@ -360,7 +350,7 @@ private function dumpItem($dumper, $cursor, &$refs, $item)
360
350
}
361
351
$ cursor ->attr = $ item ->attr ;
362
352
$ type = $ item ->class ?: gettype ($ item ->value );
363
- $ item = $ item ->value ;
353
+ $ item = $ this -> getStub ( $ item ->value ) ;
364
354
}
365
355
if ($ item instanceof Stub) {
366
356
if ($ item ->refCount ) {
@@ -458,21 +448,19 @@ private function dumpChildren($dumper, $parentCursor, &$refs, $children, $hashCu
458
448
return $ hashCut ;
459
449
}
460
450
461
- private static function mapStubConsts ( Stub $ stub , $ resolve )
451
+ private function getStub ( $ item )
462
452
{
463
- static $ stubConstIndexes , $ stubConstValues ;
464
-
465
- if (null === $ stubConstIndexes ) {
466
- $ r = new \ReflectionClass (Stub::class);
467
- $ stubConstIndexes = array_flip (array_values ($ r ->getConstants ()));
468
- $ stubConstValues = array_flip ($ stubConstIndexes );
453
+ if (!$ item || $ item instanceof Stub || !is_array ($ item )) {
454
+ return $ item ;
469
455
}
470
456
471
- $ map = $ resolve ? $ stubConstValues : $ stubConstIndexes ;
472
-
473
- $ stub = clone $ stub ;
474
- $ stub ->type = $ map [$ stub ->type ];
475
- $ stub ->class = isset ($ map [$ stub ->class ]) ? $ map [$ stub ->class ] : $ stub ->class ;
457
+ $ stub = new Stub ();
458
+ $ stub ->type = Stub::TYPE_ARRAY ;
459
+ list ($ stub ->class , $ stub ->position ) = $ item ;
460
+ if (isset ($ item [2 ])) {
461
+ $ stub ->cut = $ item [2 ];
462
+ }
463
+ $ stub ->value = $ stub ->cut + count ($ this ->data [$ stub ->position ]);
476
464
477
465
return $ stub ;
478
466
}
0 commit comments