예제 #1
0
		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;
		}