@@ -641,6 +641,7 @@ Token* nextToken(Parser* parser) {
641
641
return newToken ;
642
642
}
643
643
644
+ // TODO: Recycle the token object and delete it along with the parser.
644
645
Token * consume (Parser * parser ) {
645
646
Token * temporary = parser -> lt1 ;
646
647
parser -> lt1 = nextToken (parser );
@@ -688,9 +689,10 @@ jtk_JsonValue_t* parseObject(Parser* parser) {
688
689
689
690
if (parser -> lt1 -> type == TOKEN_STRING ) {
690
691
Token * key = consume (parser );
692
+ uint8_t * keyText = jtk_CString_newEx (key -> text , key -> length );
691
693
match (parser , TOKEN_COLON );
692
694
jtk_JsonValue_t * value = parseValue (parser );
693
- jtk_HashMap_put (result -> object , key -> text , value );
695
+ jtk_HashMap_put (result -> object , keyText , value );
694
696
695
697
while (parser -> lt1 -> type == TOKEN_COMMA ) {
696
698
consume (parser );
@@ -825,6 +827,36 @@ jtk_JsonValue_t* jtk_JsonValue_forTrue() {
825
827
return value ;
826
828
}
827
829
830
+ void jtk_JsonValue_delete (jtk_JsonValue_t * value ) {
831
+ if (value != NULL ) {
832
+ if (value -> type == JTK_JSON_VALUE_STRING ) {
833
+ jtk_CString_delete (value -> string .bytes );
834
+ }
835
+ else if (value -> type == JTK_JSON_VALUE_ARRAY ) {
836
+ int32_t limit = jtk_ArrayList_getSize (value -> array );
837
+ int32_t i ;
838
+ for (i = 0 ; i < limit ; i ++ ) {
839
+ jtk_JsonValue_t * temporary =
840
+ (jtk_JsonValue_t * )jtk_ArrayList_getValue (value -> array , i );
841
+ jtk_JsonValue_delete (temporary );
842
+ }
843
+ jtk_ArrayList_delete (value -> array );
844
+ }
845
+ else if (value -> type == JTK_JSON_VALUE_OBJECT ) {
846
+ jtk_Iterator_t * iterator = jtk_HashMap_getEntryIterator (value -> object );
847
+ while (jtk_Iterator_hasNext (iterator )) {
848
+ jtk_HashMapEntry_t * entry =
849
+ (jtk_HashMapEntry_t * )jtk_Iterator_getNext (iterator );
850
+ jtk_CString_delete ((uint8_t * )entry -> m_key );
851
+ jtk_JsonValue_delete ((jtk_JsonValue_t * )entry -> m_value );
852
+ }
853
+ jtk_Iterator_delete (iterator );
854
+ jtk_HashMap_delete (value -> object );
855
+ }
856
+ deallocate (value );
857
+ }
858
+ }
859
+
828
860
void handleError () {
829
861
printf ("Errro!\n" );
830
862
}
@@ -852,6 +884,7 @@ void toString(jtk_StringBuilder_t* builder, jtk_JsonValue_t* value) {
852
884
853
885
first = false;
854
886
}
887
+ jtk_Iterator_delete (iterator );
855
888
jtk_StringBuilder_appendCodePoint (builder , '}' );
856
889
}
857
890
else if (value -> type == JTK_JSON_VALUE_ARRAY ) {
@@ -896,6 +929,7 @@ void toPrettyString(jtk_StringBuilder_t* builder, jtk_JsonValue_t* value,
896
929
897
930
first = false;
898
931
}
932
+ jtk_Iterator_delete (iterator );
899
933
jtk_StringBuilder_appendCodePoint (builder , '\n' );
900
934
indent (builder , depth );
901
935
jtk_StringBuilder_appendCodePoint (builder , '}' );
0 commit comments