@@ -678,7 +678,7 @@ JsonInit(Json *json)
678678}
679679
680680static Size
681- jsonGetFlatSize2 (Json * json )
681+ jsonGetFlatSize2 (Json * json , void * * context )
682682{
683683 Size size ;
684684
@@ -693,7 +693,10 @@ jsonGetFlatSize2(Json *json)
693693 {
694694 char * str = JsonToCString (& json -> root );
695695 size = VARHDRSZ + strlen (str );
696- pfree (str );
696+ if (context )
697+ * context = str ;
698+ else
699+ pfree (str );
697700 }
698701 }
699702#endif
@@ -709,7 +712,10 @@ jsonGetFlatSize2(Json *json)
709712 JsonValue val ;
710713 void * js = JsonValueToJsonb (JsonToJsonValue (json , & val ));
711714 size = VARSIZE (js );
712- pfree (js );
715+ if (context )
716+ * context = js ;
717+ else
718+ pfree (js );
713719 }
714720 }
715721#endif
@@ -718,7 +724,7 @@ jsonGetFlatSize2(Json *json)
718724}
719725
720726static void *
721- jsonFlatten (Json * json )
727+ jsonFlatten (Json * json , void * * context )
722728{
723729#ifdef JSON_FLATTEN_INTO_TARGET
724730 if (json -> is_json )
@@ -729,7 +735,7 @@ jsonFlatten(Json *json)
729735 return cstring_to_text_with_len (json -> root .data , json -> root .len );
730736 else
731737 {
732- char * str = JsonToCString (JsonRoot (json ));
738+ char * str = context ? ( char * ) * context : JsonToCString (JsonRoot (json ));
733739 text * text = cstring_to_text (str );
734740 pfree (str );
735741 return text ;
@@ -748,6 +754,8 @@ jsonFlatten(Json *json)
748754 memcpy (VARDATA (res ), json -> root .data , json -> root .len );
749755 return res ;
750756 }
757+ else if (context )
758+ return * context ;
751759 else
752760 {
753761 JsonValue val ;
@@ -758,7 +766,7 @@ jsonFlatten(Json *json)
758766}
759767
760768static Size
761- jsonGetFlatSize (ExpandedObjectHeader * eoh )
769+ jsonGetFlatSize (ExpandedObjectHeader * eoh , void * * context )
762770{
763771 Json * json = (Json * ) eoh ;
764772
@@ -773,19 +781,20 @@ jsonGetFlatSize(ExpandedObjectHeader *eoh)
773781 {
774782 tmp .data = NULL ;
775783 tmp .ops = flatContainerOps ;
776- tmp .len = jsonGetFlatSize2 (json ) - VARHDRSZ ;
784+ tmp .len = jsonGetFlatSize2 (json , context ) - VARHDRSZ ;
777785 flat = & tmp ;
778786 }
779787
780788 return jsonGetExtendedSize (flat );
781789 }
782790#else
783- return jsonGetFlatSize2 (json );
791+ return jsonGetFlatSize2 (json , context );
784792#endif
785793}
786794
787795static void
788- jsonFlattenInto (ExpandedObjectHeader * eoh , void * result , Size allocated_size )
796+ jsonFlattenInto (ExpandedObjectHeader * eoh , void * result , Size allocated_size ,
797+ void * * context )
789798{
790799 Json * json = (Json * ) eoh ;
791800
@@ -799,7 +808,7 @@ jsonFlattenInto(ExpandedObjectHeader *eoh, void *result, Size allocated_size)
799808
800809 if (flat -> ops == & jsonvContainerOps )
801810 {
802- tmpData = jsonFlatten (json );
811+ tmpData = jsonFlatten (json , context );
803812
804813 tmp .ops = flatContainerOps ;
805814 tmp .data = VARDATA (tmpData );
@@ -815,7 +824,7 @@ jsonFlattenInto(ExpandedObjectHeader *eoh, void *result, Size allocated_size)
815824 }
816825#else
817826 {
818- void * data = jsonFlatten (json );
827+ void * data = jsonFlatten (json , context );
819828 memcpy (result , data , allocated_size );
820829 pfree (data );
821830 }
0 commit comments