@@ -163,26 +163,36 @@ bool Reader::readValue() {
163163 successful = decodeString (token);
164164 break ;
165165 case tokenTrue:
166- currentValue () = true ;
166+ {
167+ Value v (true );
168+ currentValue ().swapPayload (v);
167169 currentValue ().setOffsetStart (token.start_ - begin_);
168170 currentValue ().setOffsetLimit (token.end_ - begin_);
171+ }
169172 break ;
170173 case tokenFalse:
171- currentValue () = false ;
174+ {
175+ Value v (false );
176+ currentValue ().swapPayload (v);
172177 currentValue ().setOffsetStart (token.start_ - begin_);
173178 currentValue ().setOffsetLimit (token.end_ - begin_);
179+ }
174180 break ;
175181 case tokenNull:
176- currentValue () = Value ();
182+ {
183+ Value v;
184+ currentValue ().swapPayload (v);
177185 currentValue ().setOffsetStart (token.start_ - begin_);
178186 currentValue ().setOffsetLimit (token.end_ - begin_);
187+ }
179188 break ;
180189 case tokenArraySeparator:
181190 if (features_.allowDroppedNullPlaceholders_ ) {
182191 // "Un-read" the current token and mark the current value as a null
183192 // token.
184193 current_--;
185- currentValue () = Value ();
194+ Value v;
195+ currentValue ().swapPayload (v);
186196 currentValue ().setOffsetStart (current_ - begin_ - 1 );
187197 currentValue ().setOffsetLimit (current_ - begin_);
188198 break ;
@@ -393,7 +403,8 @@ bool Reader::readString() {
393403bool Reader::readObject (Token& tokenStart) {
394404 Token tokenName;
395405 std::string name;
396- currentValue () = Value (objectValue);
406+ Value init (objectValue);
407+ currentValue ().swapPayload (init);
397408 currentValue ().setOffsetStart (tokenStart.start_ - begin_);
398409 while (readToken (tokenName)) {
399410 bool initialTokenOk = true ;
@@ -446,7 +457,8 @@ bool Reader::readObject(Token& tokenStart) {
446457}
447458
448459bool Reader::readArray (Token& tokenStart) {
449- currentValue () = Value (arrayValue);
460+ Value init (arrayValue);
461+ currentValue ().swapPayload (init);
450462 currentValue ().setOffsetStart (tokenStart.start_ - begin_);
451463 skipSpaces ();
452464 if (*current_ == ' ]' ) // empty array
@@ -486,7 +498,7 @@ bool Reader::decodeNumber(Token& token) {
486498 Value decoded;
487499 if (!decodeNumber (token, decoded))
488500 return false ;
489- currentValue () = decoded;
501+ currentValue (). swapPayload ( decoded) ;
490502 currentValue ().setOffsetStart (token.start_ - begin_);
491503 currentValue ().setOffsetLimit (token.end_ - begin_);
492504 return true ;
@@ -536,7 +548,7 @@ bool Reader::decodeDouble(Token& token) {
536548 Value decoded;
537549 if (!decodeDouble (token, decoded))
538550 return false ;
539- currentValue () = decoded;
551+ currentValue (). swapPayload ( decoded) ;
540552 currentValue ().setOffsetStart (token.start_ - begin_);
541553 currentValue ().setOffsetLimit (token.end_ - begin_);
542554 return true ;
@@ -579,10 +591,11 @@ bool Reader::decodeDouble(Token& token, Value& decoded) {
579591}
580592
581593bool Reader::decodeString (Token& token) {
582- std::string decoded ;
583- if (!decodeString (token, decoded ))
594+ std::string decoded_string ;
595+ if (!decodeString (token, decoded_string ))
584596 return false ;
585- currentValue () = decoded;
597+ Value decoded (decoded_string);
598+ currentValue ().swapPayload (decoded);
586599 currentValue ().setOffsetStart (token.start_ - begin_);
587600 currentValue ().setOffsetLimit (token.end_ - begin_);
588601 return true ;
0 commit comments