From 2c8b6a7b05285bda09c68933b7e9f1910a340f8b Mon Sep 17 00:00:00 2001 From: mccallum Date: Fri, 8 Sep 1995 22:44:23 +0000 Subject: [PATCH] ([Coder -doInitOnStream:isDecoding:]): Init in_progress_table. ([Coder -dealloc]): Release in_progress_table. ([Coder -_encodeObject:withName:isBycopy:isForwardReference:]): If the object is in progress, treat it like a forward reference. Add the object to the in_progess_table before really encoding the object; remove it when done. (NOTE, this isn't an excuse not to set up "encoding interconnected objects" mode.) git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@600 72102866-910b-0410-8b05-ffd578937521 --- Source/Coder.m | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/Source/Coder.m b/Source/Coder.m index af408da53..dcedd3495 100644 --- a/Source/Coder.m +++ b/Source/Coder.m @@ -156,8 +156,9 @@ my_object_is_class(id object) // [s retain]; stream = s; object_table = nil; + in_progress_table = [[Set alloc] initWithType:@encode(unsigned)]; const_ptr_table = [[Dictionary alloc] initWithType:@encode(void*) - keyType:@encode(unsigned)]; + keyType:@encode(unsigned)]; root_object_tables = nil; forward_object_tables = nil; return self; @@ -918,7 +919,8 @@ exc_return_null(arglist_t f) at:&xref withName:"Object cross-reference number"]; } - else if (forward_ref_flag) + else if (forward_ref_flag + || [in_progress_table containsElement:xref]) { [self encodeTag:CODER_OBJECT_FORWARD_REFERENCE]; [self encodeValueOfSimpleType:@encode(unsigned) @@ -927,7 +929,7 @@ exc_return_null(arglist_t f) } else { - [self _internalCoderPutObject:anObj atReference:xref]; + [in_progess_table addElement:xref]; [self encodeTag:CODER_OBJECT]; [self encodeValueOfSimpleType:@encode(unsigned) at:&xref @@ -938,6 +940,8 @@ exc_return_null(arglist_t f) else [self _doEncodeObject:anObj]; [self encodeUnindent]; + [self _internalCoderPutObject:anObj atReference:xref]; + [in_progess_table removeElement:xref]; } } [self encodeUnindent]; @@ -1168,6 +1172,7 @@ exc_return_null(arglist_t f) { /* xxx No. [self _finishDecodeRootObject]; */ [const_ptr_table release]; + [in_progress_table release]; [object_table release]; [forward_object_tables release]; [root_object_tables release];