([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
This commit is contained in:
Andrew McCallum 1995-09-08 22:44:23 +00:00
parent e41200a1ef
commit 9097909752

View file

@ -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];