@@ -48,7 +48,7 @@ public Iterator<Any> iterator() {
48
48
if (lastParsedPos == tail ) {
49
49
return cache .iterator ();
50
50
} else {
51
- return new LazyIterator (new JsonIterator () );
51
+ return new LazyIterator ();
52
52
}
53
53
}
54
54
@@ -89,46 +89,87 @@ private void fillCache() {
89
89
if (lastParsedPos == tail ) {
90
90
return ;
91
91
}
92
- LazyIterator iter = new LazyIterator (JsonIterator .tlsIter .get ());
93
- while (iter .hasNext ()) {
94
- // cache will be filled in the process
95
- iter .next ();
92
+ if (cache == null ) {
93
+ cache = new ArrayList <Any >(4 );
94
+ }
95
+ try {
96
+ JsonIterator iter = JsonIterator .tlsIter .get ();
97
+ if (lastParsedPos == head ) {
98
+ iter .reset (data , lastParsedPos , tail );
99
+ if (!CodegenAccess .readArrayStart (iter )) {
100
+ lastParsedPos = tail ;
101
+ return ;
102
+ }
103
+ cache .add (iter .readAny ());
104
+ }
105
+ while (CodegenAccess .nextToken (iter ) == ',' ) {
106
+ cache .add (iter .readAny ());
107
+ }
108
+ lastParsedPos = tail ;
109
+ } catch (IOException e ) {
110
+ throw new JsonException (e );
96
111
}
97
112
}
98
113
99
114
private Any fillCache (int target ) {
100
115
if (lastParsedPos == tail ) {
101
116
return cache .get (target );
102
117
}
103
- int i = 0 ;
104
- LazyIterator iter = new LazyIterator (JsonIterator .tlsIter .get ());
105
- while (iter .hasNext ()) {
106
- Any element = iter .next ();
107
- if (i == target ) {
108
- return element ;
118
+ if (cache == null ) {
119
+ cache = new ArrayList <Any >(4 );
120
+ }
121
+ int i = cache .size ();
122
+ if (target < i ) {
123
+ return cache .get (i );
124
+ }
125
+ try {
126
+ JsonIterator iter = JsonIterator .tlsIter .get ();
127
+ if (lastParsedPos == head ) {
128
+ iter .reset (data , lastParsedPos , tail );
129
+ if (!CodegenAccess .readArrayStart (iter )) {
130
+ lastParsedPos = tail ;
131
+ return null ;
132
+ }
133
+ Any element = iter .readAny ();
134
+ cache .add (element );
135
+ if (target == 0 ) {
136
+ lastParsedPos = CodegenAccess .head (iter );
137
+ return element ;
138
+ }
139
+ }
140
+ while (CodegenAccess .nextToken (iter ) == ',' ) {
141
+ Any element = iter .readAny ();
142
+ cache .add (element );
143
+ if (i ++ == target ) {
144
+ lastParsedPos = CodegenAccess .head (iter );
145
+ return element ;
146
+ }
109
147
}
110
- i ++;
148
+ lastParsedPos = tail ;
149
+ } catch (IOException e ) {
150
+ throw new JsonException (e );
111
151
}
112
- throw new IndexOutOfBoundsException () ;
152
+ return null ;
113
153
}
114
154
115
155
private class LazyIterator implements Iterator <Any > {
116
156
117
- private JsonIterator jsonIter ;
118
157
private final int cacheSize ;
119
158
private int cachePos ;
120
159
121
- public LazyIterator (JsonIterator jsonIter ) {
160
+ public LazyIterator () {
122
161
try {
123
- if (jsonIter != null ) {
124
- this .jsonIter = jsonIter ;
125
- this .jsonIter .reset (data , lastParsedPos , tail );
126
- }
127
162
if (cache == null ) {
128
163
cache = new ArrayList <Any >(4 );
129
164
}
130
165
if (lastParsedPos == head ) {
131
- readHead (jsonIter );
166
+ JsonIterator iter = JsonIterator .tlsIter .get ();
167
+ iter .reset (data , lastParsedPos , tail );
168
+ if (!CodegenAccess .readArrayStart (iter )) {
169
+ lastParsedPos = tail ;
170
+ } else {
171
+ lastParsedPos = CodegenAccess .head (iter );
172
+ }
132
173
}
133
174
} catch (IOException e ) {
134
175
throw new JsonException (e );
@@ -137,16 +178,6 @@ public LazyIterator(JsonIterator jsonIter) {
137
178
cachePos = 0 ;
138
179
}
139
180
140
- private void readHead (JsonIterator jsonIter ) throws IOException {
141
- if (jsonIter == null ) {
142
- jsonIter = JsonIterator .tlsIter .get ();
143
- jsonIter .reset (data , lastParsedPos , tail );
144
- }
145
- if (!CodegenAccess .readArrayStart (jsonIter )) {
146
- lastParsedPos = tail ;
147
- }
148
- }
149
-
150
181
@ Override
151
182
public void remove () {
152
183
throw new UnsupportedOperationException ();
@@ -170,11 +201,8 @@ private Any next_() throws IOException {
170
201
if (cachePos != cacheSize ) {
171
202
return cache .get (cachePos ++);
172
203
}
173
- JsonIterator iter = jsonIter ;
174
- if (iter == null ) {
175
- iter = JsonIterator .tlsIter .get ();
176
- iter .reset (data , lastParsedPos , tail );
177
- }
204
+ JsonIterator iter = JsonIterator .tlsIter .get ();
205
+ iter .reset (data , lastParsedPos , tail );
178
206
Any element = iter .readAny ();
179
207
cache .add (element );
180
208
if (CodegenAccess .nextToken (iter ) == ',' ) {
0 commit comments