private void loadObjectDescriptors(System.IO.Stream stream, SmalltalkArchive archive) { long objectId = 0; var objects = DefaultObjects; while ((objectId = readInteger(stream)) != NUL) { var classId = readInteger(stream); var size = (int)readInteger(stream); var @class = archive.Classes[classId]; var hash = readInteger(stream); if (@class.IsBytes) { var bytes = new byte[size]; stream.Read(bytes, 0, size); var obj = new SmalltalkBytesObject(objectId, size, hash, @class, bytes); objects.Add(objectId, obj); } else if (@class.IsVariable) { var obj = new SmalltalkVariableObject(objectId, size, hash, @class); loadInstVarIds(stream, archive, obj, size); objects.Add(objectId, obj); } else { var obj = new SmalltalkPointerObject(objectId, size, hash, @class); loadInstVarIds(stream, archive, obj, size); objects.Add(objectId, obj); } } archive.Objects = objects; }
private void Export(SmalltalkPointerObject obj, XElement xmlObject) { if (obj.Class.ClassName == SmalltalkClass.OrderedCollectionClassName) { int startPosition = (int)obj.InstVars[0].LongValue - 1; // convert to 0 based int endPosition = (int)obj.InstVars[1].LongValue - 1; var variable = ((SmalltalkVariableObject)obj.InstVars[2].Value); var size = 0; ExportedObjs.Add(variable.ObjectId);// Do not export this object for (int i = startPosition; i <= endPosition; i++) { size++; var nodeName = "Value"; var value = variable.InstVars[i]; if (value.HasObjectValue) { xmlObject.Add(new XElement(nodeName, new XAttribute("refid", value.ObjectId))); } else if (value.HasLongValue) { xmlObject.Add(new XElement(nodeName, new XAttribute("int", value.LongValue))); } else if (value.HasCharValue) { xmlObject.Add(new XElement(nodeName, new XAttribute("char", value.CharValue))); } else { throw new NotImplementedException($"Unexpected value {value.Value}"); } } xmlObject.SetAttributeValue("size", size); return; } var instVarNames = obj.Class.InstVarNames; for (int i = 0; i < instVarNames.Count; i++) { var nodeName = instVarNames[i]; var value = obj.InstVars[i]; if (value.HasObjectValue) { xmlObject.Add(new XElement(nodeName, new XAttribute("refid", value.ObjectId))); } else if (value.HasLongValue) { xmlObject.Add(new XElement(nodeName, new XAttribute("int", value.LongValue))); } else if (value.HasCharValue) { xmlObject.Add(new XElement(nodeName, new XAttribute("char", value.CharValue))); } else { throw new NotImplementedException($"Unexpected value {value.Value}"); } } }
private void loadInstVarIds(System.IO.Stream stream, SmalltalkArchive archive, SmalltalkPointerObject obj, int size) { for (int i = 0; i < obj.Class.InstVarNames.Count; i++) { obj.InstVars[i] = new SmalltalkValueReference(archive, readInteger(stream)); } if (size > 0) { if (obj.Class.IsVariable) { for (int i = 0; i < size; i++) { obj.InstVars.Add(new SmalltalkValueReference(archive, (readInteger(stream)))); } } else { // Drop filed indexed values on the floor for (int i = 0; i < size; i++) { readInteger(stream); } } } }