public void TestResolveCallOfCall() { NfConfig.AssemblySearchPaths.Add(@"C:\Projects\31g\trunk\Code\NoFuture.Tests\ExampleDlls\"); NfConfig.UseReflectionOnlyLoad = false; NoFuture.Util.FxPointers.AddResolveAsmEventHandlerToDomain(); var testAsm = System.Reflection.Assembly.Load( System.IO.File.ReadAllBytes( @"C:\Projects\31g\trunk\Code\NoFuture.Tests\ExampleDlls\AdventureWorks2012.dll")); System.Reflection.Assembly.Load( System.IO.File.ReadAllBytes( @"C:\Projects\31g\trunk\Code\NoFuture.Tests\ExampleDlls\Iesi.Collections.dll")); System.Reflection.Assembly.Load( System.IO.File.ReadAllBytes( @"C:\Projects\31g\trunk\Code\NoFuture.Tests\ExampleDlls\NHibernate.dll")); System.Reflection.Assembly.Load( System.IO.File.ReadAllBytes( @"C:\Projects\31g\trunk\Code\NoFuture.Tests\ExampleDlls\NoFuture.Hbm.Sid.dll")); System.Reflection.Assembly.Load( System.IO.File.ReadAllBytes( @"C:\Projects\31g\trunk\Code\NoFuture.Tests\ExampleDlls\SomeSecondDll.dll")); System.Reflection.Assembly.Load( System.IO.File.ReadAllBytes( @"C:\Projects\31g\trunk\Code\NoFuture.Tests\ExampleDlls\SomethingShared.dll")); System.Reflection.Assembly.Load( System.IO.File.ReadAllBytes( @"C:\Projects\31g\trunk\Code\NoFuture.Tests\ExampleDlls\ThirdDll.dll")); var tp = new IaaProgram(new[] {"noop"}) { RootAssembly = testAsm, AssemblyNameRegexPattern = "(Some|ThirdDll)" }; tp.Init(testAsm); tp.AssignAsmIndicies(testAsm); var testAsmTypes = testAsm.GetTypes(); var testTokens = testAsmTypes.Select(x => NoFuture.Util.Gia.AssemblyAnalysis.GetMetadataToken(x)).ToArray(); var dee = testTokens.FirstOrDefault(); Assert.IsNotNull(dee); var tProgram = new IaaProgram(null); var tGetTokenIds = new GetTokenIds(tProgram); var testDepth = 0; foreach (var iToken in testTokens) { foreach (var tToken in iToken.Items) { foreach (var vToken in tToken.Items) { tGetTokenIds.ResolveCallOfCall(vToken, ref testDepth, new Stack<MetadataTokenId>(), null); } } } Assert.IsNotNull(testTokens); //got this from ildasm var targetTokenType = 0x2000060; Assert.IsTrue(testTokens.Any(x => x.Id == targetTokenType)); var testTokenRslt = testTokens.First(x => x.Id == targetTokenType); var tokenPrint = MetadataTokenId.Print(testTokenRslt); System.Diagnostics.Debug.WriteLine(tokenPrint); var testFlattenedRslt = MetadataTokenId.FlattenToDistinct(testTokenRslt); Assert.IsTrue(tokenPrint.Split('\n').Length >= testFlattenedRslt.Length); var testTokenNames = tProgram.UtilityMethods.ResolveAllTokenNames(testFlattenedRslt); Assert.IsNotNull(testTokenNames); Assert.AreNotEqual(0, testTokenNames.Count); foreach (var tname in testTokenNames) { System.Diagnostics.Debug.WriteLine(string.Format("{0}.{1} ({2})", tname.RslvAsmIdx,tname.Id.ToString("X4"), tname.Name)); } }
/// <summary> /// Handles a specific set of formatted runtime commands as printed in <see cref="RuntimeHelp"/> /// </summary> /// <param name="ut">User entered text</param> protected internal void RtCommands(string ut) { try { if (string.IsNullOrWhiteSpace(ut)) return; if (!ut.StartsWith(Constants.CMD_LINE_ARG_SWITCH)) return; var cmds = ut.Split(' '); var rtArgHash = ConsoleCmd.ArgHash(cmds); if (rtArgHash.ContainsKey(ASSIGN_REGEX_PATTERN_RT_CMD)) { var regexPattern = rtArgHash[ASSIGN_REGEX_PATTERN_RT_CMD]; if (string.IsNullOrWhiteSpace(regexPattern?.ToString())) return; AssemblyNameRegexPattern = regexPattern.ToString().Trim(); PrintToConsole($"AssemblyNameRegexPattern = {AssemblyNameRegexPattern}"); } if (rtArgHash.ContainsKey(RESOLVE_TOKEN_ID_CMD)) { var tokenCmd = rtArgHash[RESOLVE_TOKEN_ID_CMD]; if (string.IsNullOrWhiteSpace(tokenCmd?.ToString())) return; var tokenCmdStr = tokenCmd.ToString().Trim(); if (!Regex.IsMatch(tokenCmdStr, @"^[0-9]\.([0-9]+|0x[0-9a-fA-F]+)$")) return; var asmIdxStr = tokenCmdStr.Split('.')[0]; var tokenIdStr = tokenCmdStr.Split('.')[1]; int tokenId; int asmIdx; if (!int.TryParse(asmIdxStr, out asmIdx)) return; if (Regex.IsMatch(tokenIdStr, "0x[0-9a-fA-F]+")) { tokenIdStr = tokenIdStr.Substring(2); if (!int.TryParse(tokenIdStr, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out tokenId)) return; } else { if (!int.TryParse(tokenIdStr, out tokenId)) return; } var mdt = new MetadataTokenId { Id = tokenId, RslvAsmIdx = asmIdx }; MetadataTokenName tokenName; if (!_utilityMethods.ResolveSingleTokenName(mdt, out tokenName)) { PrintToConsole($"could not resolve name {ut}"); return; } PrintToConsole(tokenName.Name); if (!tokenName.IsMethodName()) return; var resolveDepth = 0; var st = new Stack<MetadataTokenId>(); var msg = new StringBuilder(); var tTokensIds = new GetTokenIds(this); tTokensIds.ResolveCallOfCall(mdt, ref resolveDepth, st, msg); if (mdt.Items == null || mdt.Items.Length <= 0) { PrintToConsole("ResolveCallOfCall returned nothing"); PrintToConsole(msg.ToString(), false); return; } Console.WriteLine(); PrintToConsole(MetadataTokenId.Print(mdt), false); } } catch (Exception ex) { PrintToConsole("console entry error"); PrintToConsole(ex); } }
/// <summary> /// Handles a specific set of formatted runtime commands as printed in <see cref="RuntimeHelp"/> /// </summary> /// <param name="ut">User entered text</param> protected internal void RtCommands(string ut) { try { if (string.IsNullOrWhiteSpace(ut)) { return; } if (!ut.StartsWith(NfConfig.CmdLineArgSwitch)) { return; } var cmds = ut.Split(' '); var rtArgHash = ConsoleCmd.ArgHash(cmds); if (rtArgHash.ContainsKey(ASSIGN_REGEX_PATTERN_RT_CMD)) { var regexPattern = rtArgHash[ASSIGN_REGEX_PATTERN_RT_CMD]; if (string.IsNullOrWhiteSpace(regexPattern?.ToString())) { return; } AssemblyNameRegexPattern = regexPattern.ToString().Trim(); PrintToConsole($"AssemblyNameRegexPattern = {AssemblyNameRegexPattern}"); } if (rtArgHash.ContainsKey(RESOLVE_TOKEN_ID_CMD)) { var tokenCmd = rtArgHash[RESOLVE_TOKEN_ID_CMD]; if (string.IsNullOrWhiteSpace(tokenCmd?.ToString())) { return; } var tokenCmdStr = tokenCmd.ToString().Trim(); if (!Regex.IsMatch(tokenCmdStr, @"^[0-9]\.([0-9]+|0x[0-9a-fA-F]+)$")) { return; } var asmIdxStr = tokenCmdStr.Split('.')[0]; var tokenIdStr = tokenCmdStr.Split('.')[1]; int tokenId; int asmIdx; if (!int.TryParse(asmIdxStr, out asmIdx)) { return; } if (Regex.IsMatch(tokenIdStr, "0x[0-9a-fA-F]+")) { tokenIdStr = tokenIdStr.Substring(2); if (!int.TryParse(tokenIdStr, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out tokenId)) { return; } } else { if (!int.TryParse(tokenIdStr, out tokenId)) { return; } } var mdt = new MetadataTokenId { Id = tokenId, RslvAsmIdx = asmIdx }; MetadataTokenName tokenName; if (!_utilityMethods.ResolveSingleTokenName(mdt, out tokenName)) { PrintToConsole($"could not resolve name {ut}"); return; } PrintToConsole(tokenName.Name); if (!tokenName.IsMethodName()) { return; } var resolveDepth = 0; var st = new Stack <MetadataTokenId>(); var msg = new StringBuilder(); var tTokensIds = new GetTokenIds(this); tTokensIds.ResolveCallOfCall(mdt, ref resolveDepth, st, msg); if (mdt.Items == null || mdt.Items.Length <= 0) { PrintToConsole("ResolveCallOfCall returned nothing"); PrintToConsole(msg.ToString(), false); return; } Console.WriteLine(); PrintToConsole(MetadataTokenId.Print(mdt), false); } } catch (Exception ex) { PrintToConsole("console entry error"); PrintToConsole(ex); } }