bool LoadModule (Stream stream, string filePath, bool primaryFile) { Log.Debug ($"Loading FastDev typemap from module: {filePath}"); stream.Seek (0, SeekOrigin.Begin); string assemblyName = String.Empty; var javaToManaged = new List<Entry> (); var managedToJava = new List<Entry> (); using (var br = new BinaryReader (stream, Encoding.UTF8, leaveOpen: true)) { if (!EnsureValidModule (br, filePath, primaryFile)) { return false; } UInt32 entryCount = br.ReadUInt32 (); if (entryCount == 0) { Log.Warning ($"FastDev typemap module file {filePath} has no entries"); return false; } UInt32 javaNameWidth = br.ReadUInt32 (); if (javaNameWidth == 0) { Log.Error ($"FastDev module {filePath} indicates Java type name width is 0"); return false; } UInt32 managedNameWidth = br.ReadUInt32 (); if (managedNameWidth == 0) { Log.Error ($"FastDev module {filePath} indicates managed type name width is 0"); return false; } UInt32 assemblyNameSize = br.ReadUInt32 (); if (assemblyNameSize == 0) { Log.Error ($"FastDev module {filePath} indicates assembly name length is 0"); return false; } byte[] data = Utilities.BytePool.Rent ((int)assemblyNameSize); int read = br.Read (data, 0, (int)assemblyNameSize); if (read != (int)assemblyNameSize) { Log.Error ($"FastDev typemap module file {filePath} is too short: not enough bytes to read assembly name"); Utilities.BytePool.Return (data); return false; } assemblyName = Encoding.UTF8.GetString (data, 0, read); Utilities.BytePool.Return (data); if (!LoadModuleTable (br, assemblyName, filePath, javaToManaged, entryCount, javaNameWidth)) { Log.Error ($"Failed to read java-to-managed table from module {filePath}"); return false; } if (!LoadModuleTable (br, assemblyName, filePath, managedToJava, entryCount, managedNameWidth)) { Log.Error ($"Failed to read managed-to-java table from module {filePath}"); return false; } AddToMap (javaToManaged, managedToJava); } return true; }