/*#io
Object ioDoc(
*/
#include "IoObject_persistence.h"
#include "IoState.h"
#include "IoCFunction.h"
#include "Datum.h"
void IoObject_writeToStore_stream_(IoObject *self, IoStore *store, BStream *stream)
{
if (self->tag->writeToStoreOnStreamFunc)
{
(*(self->tag->writeToStoreOnStreamFunc))(self, store, stream);
}
IoObject_writeSlotsToStore_stream_(self, store, stream);
}
IoObject *IoObject_allocFromStore_stream_(IoObject *self, IoStore *store, BStream *stream)
{
if (self->tag->allocFromStoreOnStreamFunc)
{
return (*(self->tag->allocFromStoreOnStreamFunc))(self, store, stream);
}
return self;
}
void IoObject_readFromStore_stream_(IoObject *self, IoStore *store, BStream *stream)
{
if (self->tag->readFromStoreOnStreamFunc)
{
(*(self->tag->readFromStoreOnStreamFunc))(self, store, stream);
}
IoObject_readSlotsFromStore_stream_(self, store, stream);
}
int IoObject_nonCFunctionSlotCount(IoObject *self)
{
int count = 0;
IoSymbol *key = PHash_firstKey(self->slots);
while (key)
{
IoObject *value = PHash_at_(self->slots, key);
if (!ISCFUNCTION(value))
{
count ++;
}
key = PHash_nextKey(self->slots);
}
return count;
}
void IoObject_writeProtosToStore_stream_(IoObject *self, IoStore *store, BStream *stream)
{
int i, protosCount = IoObject_rawProtosCount(self);
BStream_writeTaggedInt32_(stream, protosCount);
for (i = 0; i < protosCount; i ++)
{
IoObject *proto = IoObject_rawProtoAt_(self, i);
int protoId = IoStore_pidForObject_(store, proto);
BStream_writeTaggedInt32_(stream, protoId);
}
}
void IoObject_writeSlotsToStore_stream_(IoObject *self, IoStore *store, BStream *stream)
{
IoObject_writeProtosToStore_stream_(self, store, stream);
if (self->ownsSlots)
{
BStream_writeTaggedInt32_(stream, IoObject_nonCFunctionSlotCount(self));
if (self->slots)
{
IoSymbol *key = PHash_firstKey(self->slots);
while (key)
{
IoObject *value = PHash_at_(self->slots, key);
if (!ISCFUNCTION(value))
{
BStream_writeTaggedInt32_(stream, IoStore_pidForObject_(store, key));
BStream_writeTaggedInt32_(stream, IoStore_pidForObject_(store, value));
if (IoStore_debugIsOn(store))
{
printf("%s%" PID_FORMAT " %s %s%" PID_FORMAT "\n",
IoObject_name(self), IoObject_persistentId(self),
CSTRING(key), IoObject_name(value), IoStore_pidForObject_(store, value));
}
}
key = PHash_nextKey(self->slots);
}
}
}
}
void IoObject_readProtosFromStore_stream_(IoObject *self, IoStore *store, BStream *stream)
{
int i, max = BStream_readTaggedInt32(stream);
IoObject_rawRemoveAllProtos(self);
for (i = 0; i < max; i ++)
{
int protoId = BStream_readTaggedInt32(stream);
IoObject *proto = IoStore_objectWithPid_(store, protoId);
IoObject_rawAppendProto_(self, proto);
}
}
void IoObject_readSlotsFromStore_stream_(IoObject *self, IoStore *store, BStream *stream)
{
int k, v;
IoSymbol *key;
IoObject *value;
int i, max;
IoObject_readProtosFromStore_stream_(self, store, stream);
max = BStream_readTaggedInt32(stream);
for (i = 0; i < max; i ++)
{
k = BStream_readTaggedInt32(stream);
v = BStream_readTaggedInt32(stream);
if (IoStore_debugIsOn(store))
{
printf("%s%" PID_FORMAT " load slot %i, %i\n",
IoObject_name(self), IoObject_persistentId(self), k, v);
}
key = IoStore_objectWithPid_(store, k);
value = IoStore_objectWithPid_(store, v);
IoObject_setSlot_to_(self, key, value);
}
}
PID_TYPE IoObject_persistentId(IoObject *self)
{
return self->persistentId;
}
void IoObject_setPersistentId_(IoObject *self, PID_TYPE pid)
{
self->persistentId = pid;
}
syntax highlighted by Code2HTML, v. 0.9.1