@@ -56,6 +56,7 @@ class JGenerator implements JsonGenerator {
56
56
private static final int OP_END = 4 ;
57
57
58
58
private final Grisu3 .FastDtoaBuilder doubleBuilder = new Grisu3 .FastDtoaBuilder ();
59
+ private final int largeStringMax ;
59
60
private byte [] buffer ;
60
61
private JsonOutput target ;
61
62
private int lastOp ;
@@ -77,6 +78,8 @@ class JGenerator implements JsonGenerator {
77
78
78
79
JGenerator (final byte [] buffer ) {
79
80
this .buffer = buffer ;
81
+ // each char can take up to 6 bytes when Unicode escaped, round down 1/8 number of chars
82
+ this .largeStringMax = buffer .length >> 3 ;
80
83
}
81
84
82
85
@ Override
@@ -132,26 +135,50 @@ private void writeByte(final byte value) {
132
135
133
136
private void writeString (final String value ) {
134
137
final int len = value .length ();
138
+ if (len > largeStringMax ) {
139
+ writeLargeString (value );
140
+ return ;
141
+ }
135
142
if (position + (len << 2 ) + (len << 1 ) + 2 >= buffer .length ) {
136
143
enlargeOrFlush (position , (len << 2 ) + (len << 1 ) + 2 );
137
144
}
138
- final byte [] _result = buffer ;
139
- _result [position ] = QUOTE ;
140
- int cur = position + 1 ;
141
- for (int i = 0 ; i < len ; i ++) {
145
+ buffer [position ++] = QUOTE ;
146
+ writeStringSegment (value , 0 , len );
147
+ buffer [position ++] = QUOTE ;
148
+ }
149
+
150
+ private void writeStringSegment (String value , int i , int end ) {
151
+ int cur = position ;
152
+ for (;i < end ; i ++) {
142
153
final char c = value .charAt (i );
143
154
if (c > 31 && c != '"' && c != '\\' && c < 126 ) {
144
- _result [cur ++] = (byte ) c ;
155
+ buffer [cur ++] = (byte ) c ;
145
156
} else {
146
- writeQuotedString (value , i , cur , len );
157
+ writeStringEscape (value , i , cur , end );
147
158
return ;
148
159
}
149
160
}
150
- _result [cur ] = QUOTE ;
151
- position = cur + 1 ;
161
+ position = cur ;
162
+ }
163
+
164
+ /** Break a large string into segments and flush when necessary */
165
+ private void writeLargeString (String text ) {
166
+ writeByte (QUOTE );
167
+ int left = text .length ();
168
+ int offset = 0 ;
169
+ while (left > 0 ) {
170
+ final int len = Math .min (largeStringMax , left );
171
+ if (position + (len << 2 ) + (len << 1 ) + 2 >= buffer .length ) {
172
+ enlargeOrFlush (position , 0 ); // just flush
173
+ }
174
+ writeStringSegment (text , offset , offset + len );
175
+ offset += len ;
176
+ left -= len ;
177
+ }
178
+ writeByte (QUOTE );
152
179
}
153
180
154
- private void writeQuotedString (final String str , int i , int cur , final int len ) {
181
+ private void writeStringEscape (final String str , int i , int cur , final int len ) {
155
182
final byte [] _result = this .buffer ;
156
183
for (; i < len ; i ++) {
157
184
final char c = str .charAt (i );
@@ -327,8 +354,7 @@ private void writeQuotedString(final String str, int i, int cur, final int len)
327
354
}
328
355
}
329
356
}
330
- _result [cur ] = QUOTE ;
331
- position = cur + 1 ;
357
+ position = cur ;
332
358
}
333
359
334
360
@ SuppressWarnings ("deprecation" )
0 commit comments