Esempio n. 1
0
        public void DynLink_ProcedureByName_NoModule()
        {
            var proj = new Project
            {
                MetadataFiles =
                {
                    new MetadataFile
                    {
                        ModuleName = "foo"
                    }
                },
                Programs =
                {
                    program
                }
            };

            var barSig = new FunctionType(
                new Identifier(
                    "res",
                    PrimitiveType.Word16,
                    new RegisterStorage("ax", 0, 0, PrimitiveType.Word16)
                    ),
                new[] {
                new Identifier(
                    "a",
                    PrimitiveType.Word16,
                    new RegisterStorage("cx", 0, 0, PrimitiveType.Word16)
                    ),
                new Identifier(
                    "b",
                    PrimitiveType.Word16,
                    new RegisterStorage("dx", 0, 0, PrimitiveType.Word16)
                    )
            }
                );

            program.EnvironmentMetadata.Modules.Add("foo", new ModuleDescriptor("foo")
            {
                ServicesByName =
                {
                    { "bar", new SystemService {
                          Name      = "bar",
                          Signature = barSig
                      } }
                }
            });

            var impres = new DynamicLinker(proj, program, new FakeDecompilerEventListener());
            var ep     = impres.ResolveProcedure("foo", "bar", platform.Object);

            Assert.AreEqual("bar", ep.Name);

            var sigExp =
                @"Register word16 bar(Register word16 a, Register word16 b)
// stackDelta: 0; fpuStackDelta: 0; fpuMaxParam: -1
";

            Assert.AreEqual(sigExp, ep.Signature.ToString("bar", FunctionType.EmitFlags.AllDetails));
        }
Esempio n. 2
0
        public void DynLink_MangledProcedureCharacteristics()
        {
            var chr = new ProcedureCharacteristics
            {
                VarargsParserClass = "FakeParser",
            };

            program.EnvironmentMetadata.Characteristics.Add("foo@mangled", chr);
            platform.Setup(p => p.SignatureFromName(
                               It.Is <string>(n => n == "foo@mangled")))
            .Returns(new Procedure_v1
            {
                Name      = "foo",
                Signature = new SerializedSignature(),
            });

            var eventListener = new FakeDecompilerEventListener();
            var proj          = new Project();
            var impres        = new DynamicLinker(proj, program, eventListener);
            var ep            = impres.ResolveProcedure("", "foo@mangled", platform.Object);

            var expected = @"
void foo()
VarargsParserClass: FakeParser";

            AssertExternalProcedure(expected, ep);
        }
Esempio n. 3
0
        public void DynLink_ProcedureByOrdinal()
        {
            var proj = new Project
            {
                MetadataFiles =
                {
                    new MetadataFile
                    {
                        ModuleName = "foo"
                    }
                },
                Programs =
                {
                    program
                }
            };

            var module = new ModuleDescriptor("foo")
            {
                ServicesByOrdinal =
                {
                    {
                        9,
                        new SystemService
                        {
                            Name      = "bar",
                            Signature = new FunctionType()
                        }
                    }
                }
            };

            program.EnvironmentMetadata.Modules.Add(module.ModuleName, module);

            var impres = new DynamicLinker(proj, program, new FakeDecompilerEventListener());
            var ep     = impres.ResolveProcedure("foo", 9, platform.Object);

            Assert.AreEqual("bar", ep.Name);
        }