@@ -59,7 +59,7 @@ public function getLimitedClone($maxDepth, $maxItemsPerDepth)
59
59
public function dump (DumperInterface $ dumper )
60
60
{
61
61
$ refs = array (0 );
62
- $ this ->dumpItem ($ dumper , new Cursor , $ refs , $ this ->data [0 ][0 ]);
62
+ $ this ->dumpItem ($ dumper , new Cursor () , $ refs , $ this ->data [0 ][0 ]);
63
63
}
64
64
65
65
/**
@@ -72,40 +72,41 @@ public function dump(DumperInterface $dumper)
72
72
*/
73
73
private function dumpItem ($ dumper , $ cursor , &$ refs , $ item )
74
74
{
75
- $ cursor ->refIndex = $ cursor ->softRefTo = $ cursor ->hardRefTo = false ;
75
+ $ cursor ->refIndex = 0 ;
76
+ $ cursor ->softRefTo = $ cursor ->softRefHandle = $ cursor ->softRefCount = 0 ;
77
+ $ cursor ->hardRefTo = $ cursor ->hardRefHandle = $ cursor ->hardRefCount = 0 ;
78
+ $ firstSeen = true ;
76
79
77
80
if (!$ item instanceof Stub) {
78
81
$ type = gettype ($ item );
79
82
} elseif (Stub::TYPE_REF === $ item ->type ) {
80
- if ($ item ->ref ) {
81
- if (isset ($ refs [$ r = $ item ->ref ])) {
82
- $ cursor ->hardRefTo = $ refs [$ r ];
83
+ if ($ item ->handle ) {
84
+ if (! isset ($ refs [$ r = $ item ->handle - ( PHP_INT_MAX >> 1 ) ])) {
85
+ $ cursor ->refIndex = $ refs [$ r] = $ cursor -> refIndex ?: ++ $ refs [ 0 ];
83
86
} else {
84
- $ cursor -> refIndex = $ refs [ $ r ] = ++ $ refs [ 0 ] ;
87
+ $ firstSeen = false ;
85
88
}
89
+ $ cursor ->hardRefTo = $ refs [$ r ];
90
+ $ cursor ->hardRefHandle = $ item ->handle ;
91
+ $ cursor ->hardRefCount = $ item ->refCount ;
86
92
}
87
93
$ type = $ item ->class ?: gettype ($ item ->value );
88
94
$ item = $ item ->value ;
89
95
}
90
96
if ($ item instanceof Stub) {
91
- if ($ item ->ref ) {
92
- if (isset ($ refs [$ r = $ item ->ref ])) {
93
- if (Stub::TYPE_ARRAY === $ item ->type ) {
94
- if (false === $ cursor ->hardRefTo ) {
95
- $ cursor ->hardRefTo = $ refs [$ r ];
96
- }
97
- } elseif (false === $ cursor ->softRefTo ) {
98
- $ cursor ->softRefTo = $ refs [$ r ];
99
- }
100
- } elseif (false !== $ cursor ->refIndex ) {
101
- $ refs [$ r ] = $ cursor ->refIndex ;
97
+ if ($ item ->refCount ) {
98
+ if (!isset ($ refs [$ r = $ item ->handle ])) {
99
+ $ cursor ->refIndex = $ refs [$ r ] = $ cursor ->refIndex ?: ++$ refs [0 ];
102
100
} else {
103
- $ cursor -> refIndex = $ refs [ $ r ] = ++ $ refs [ 0 ] ;
101
+ $ firstSeen = false ;
104
102
}
103
+ $ cursor ->softRefTo = $ refs [$ r ];
105
104
}
105
+ $ cursor ->softRefHandle = $ item ->handle ;
106
+ $ cursor ->softRefCount = $ item ->refCount ;
106
107
$ cut = $ item ->cut ;
107
108
108
- if ($ item ->position && false === $ cursor -> softRefTo && false === $ cursor -> hardRefTo ) {
109
+ if ($ item ->position && $ firstSeen ) {
109
110
$ children = $ this ->data [$ item ->position ];
110
111
111
112
if ($ cursor ->stop ) {
@@ -123,29 +124,24 @@ private function dumpItem($dumper, $cursor, &$refs, $item)
123
124
break ;
124
125
125
126
case Stub::TYPE_ARRAY :
126
- $ dumper ->enterArray ($ cursor , $ item ->value , Stub:: ARRAY_INDEXED === $ item ->class , (bool ) $ children );
127
+ $ dumper ->enterHash ($ cursor , $ item ->class , $ item ->value , (bool ) $ children );
127
128
$ cut = $ this ->dumpChildren ($ dumper , $ cursor , $ refs , $ children , $ cut , $ item ->class );
128
- $ dumper ->leaveArray ($ cursor , $ item ->value , Stub:: ARRAY_INDEXED === $ item ->class , (bool ) $ children , $ cut );
129
+ $ dumper ->leaveHash ($ cursor , $ item ->class , $ item ->value , (bool ) $ children , $ cut );
129
130
break ;
130
131
131
132
case Stub::TYPE_OBJECT :
132
- $ dumper ->enterObject ($ cursor , $ item ->class , (bool ) $ children );
133
- $ cut = $ this ->dumpChildren ($ dumper , $ cursor , $ refs , $ children , $ cut , Cursor::HASH_OBJECT );
134
- $ dumper ->leaveObject ($ cursor , $ item ->class , (bool ) $ children , $ cut );
135
- break ;
136
-
137
133
case Stub::TYPE_RESOURCE :
138
- $ dumper ->enterResource ($ cursor , $ item ->class , (bool ) $ children );
139
- $ cut = $ this ->dumpChildren ($ dumper , $ cursor , $ refs , $ children , $ cut , Cursor:: HASH_RESOURCE );
140
- $ dumper ->leaveResource ($ cursor , $ item ->class , (bool ) $ children , $ cut );
134
+ $ dumper ->enterHash ($ cursor, $ item -> type , $ item ->class , (bool ) $ children );
135
+ $ cut = $ this ->dumpChildren ($ dumper , $ cursor , $ refs , $ children , $ cut , $ item -> type );
136
+ $ dumper ->leaveHash ($ cursor, $ item -> type , $ item ->class , (bool ) $ children , $ cut );
141
137
break ;
142
138
143
139
default :
144
140
throw new \RuntimeException (sprintf ('Unexpected Stub type: %s ' , $ item ->type ));
145
141
}
146
142
} elseif ('array ' === $ type ) {
147
- $ dumper ->enterArray ($ cursor , 0 , true , 0 , 0 );
148
- $ dumper ->leaveArray ($ cursor , 0 , true , 0 , 0 );
143
+ $ dumper ->enterHash ($ cursor , Cursor:: HASH_INDEXED , 0 , false );
144
+ $ dumper ->leaveHash ($ cursor , Cursor:: HASH_INDEXED , 0 , false , 0 );
149
145
} else {
150
146
$ dumper ->dumpScalar ($ cursor , $ type , $ item );
151
147
}
0 commit comments