private void Allocate(TagIdent ident, int size) { //create virtual stream to write into var tagCacheStream = new VirtualStream(Index[Index.GlobalsIdent].VirtualAddress); var binaryWriter = new BinaryWriter(tagCacheStream); for (var i = 0; i < Index.Count; ++i) { var datum = Index[i]; // is this address affected by the shift? if (datum.Identifier == ident) { var alignment = Guerilla.Guerilla.AlignmentOf(Halo2.GetTypeOf(Index[ident].Class)); datum.VirtualAddress = binaryWriter.BaseStream.Align(alignment); binaryWriter.Write(new byte[size]); datum.Length = size; Index.Update(datum.Identifier, datum); } else { var data = Deserialize(datum.Identifier); var length = binaryWriter.BaseStream.Length; binaryWriter.Write(data); binaryWriter.Seek(0, SeekOrigin.End); length = (int)binaryWriter.BaseStream.Length - length; datum.Length = (int)length; Index.Update(datum.Identifier, datum); } } binaryWriter.WritePadding(512); }
static void DeserializeTag(this BinaryReader sourceReader, object item, FieldInfo field) { var reference = sourceReader.ReadTagReference(); Source.Position = Source[reference.Ident].Meta.VirtualAddress; field.SetValue(item, Deserialize(sourceReader, Halo2.GetTypeOf(reference.Class))); }
public T Deserialize <T>(TagIdent ident) where T : GuerillaBlock { GuerillaBlock deserializedTag; if (_deserializedTagCache.TryGetValue(ident, out deserializedTag)) { return(( T )deserializedTag); } var type = Halo2.GetTypeOf(Index[ident].Class); if (type == null) { return(null); } Seek(ident); _deserializedTagCache[ident] = Deserialize(type); _tagHashDictionary[ident] = CalculateHash(ident); return(( T )_deserializedTagCache[ident]); }
public ClassTreeNode(TagClass @class) { Text = Halo2.GetTypeOf(@class).Name; Class = @class; }