([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:
mccallum 1995-09-08 22:44:23 +00:00
parent bc323d7a06
commit 2c8b6a7b05

View file

@ -156,8 +156,9 @@ my_object_is_class(id object)
// [s retain]; // [s retain];
stream = s; stream = s;
object_table = nil; object_table = nil;
in_progress_table = [[Set alloc] initWithType:@encode(unsigned)];
const_ptr_table = [[Dictionary alloc] initWithType:@encode(void*) const_ptr_table = [[Dictionary alloc] initWithType:@encode(void*)
keyType:@encode(unsigned)]; keyType:@encode(unsigned)];
root_object_tables = nil; root_object_tables = nil;
forward_object_tables = nil; forward_object_tables = nil;
return self; return self;
@ -918,7 +919,8 @@ exc_return_null(arglist_t f)
at:&xref at:&xref
withName:"Object cross-reference number"]; 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 encodeTag:CODER_OBJECT_FORWARD_REFERENCE];
[self encodeValueOfSimpleType:@encode(unsigned) [self encodeValueOfSimpleType:@encode(unsigned)
@ -927,7 +929,7 @@ exc_return_null(arglist_t f)
} }
else else
{ {
[self _internalCoderPutObject:anObj atReference:xref]; [in_progess_table addElement:xref];
[self encodeTag:CODER_OBJECT]; [self encodeTag:CODER_OBJECT];
[self encodeValueOfSimpleType:@encode(unsigned) [self encodeValueOfSimpleType:@encode(unsigned)
at:&xref at:&xref
@ -938,6 +940,8 @@ exc_return_null(arglist_t f)
else else
[self _doEncodeObject:anObj]; [self _doEncodeObject:anObj];
[self encodeUnindent]; [self encodeUnindent];
[self _internalCoderPutObject:anObj atReference:xref];
[in_progess_table removeElement:xref];
} }
} }
[self encodeUnindent]; [self encodeUnindent];
@ -1168,6 +1172,7 @@ exc_return_null(arglist_t f)
{ {
/* xxx No. [self _finishDecodeRootObject]; */ /* xxx No. [self _finishDecodeRootObject]; */
[const_ptr_table release]; [const_ptr_table release];
[in_progress_table release];
[object_table release]; [object_table release];
[forward_object_tables release]; [forward_object_tables release];
[root_object_tables release]; [root_object_tables release];