示例#1
0
        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));
            }
        }
示例#2
0
        /// <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);
            }
        }
示例#3
0
        /// <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);
            }
        }