ParseFunctionDeclaration() public method

public ParseFunctionDeclaration ( string fnDecl ) : ProcedureBase_v1
fnDecl string
return Reko.Core.Serialization.ProcedureBase_v1
        public void Usb_ParseFunctionDeclaration()
        {
            Given_Procedure(0x1000);

            var usb = new UserSignatureBuilder(program);
            var sProc = usb.ParseFunctionDeclaration("int foo(char *)", proc.Frame);

            Assert.AreEqual(
                "fn(arg(prim(SignedInt,4)),(arg(ptr(prim(Character,1))))",
                sProc.Signature.ToString());
        }
        public void Usb_ParseFunctionDeclaration_PlatfromTypes()
        {
            var platformTypes = new Dictionary<string, DataType>()
            {
                { "BYTE", PrimitiveType.Create(PrimitiveType.Byte.Domain, 1) },
            };
            mockFactory.Given_PlatformTypes(platformTypes);
            Given_Procedure(0x1000);

            var usb = new UserSignatureBuilder(program);
            var sProc = usb.ParseFunctionDeclaration("BYTE foo(BYTE a, BYTE b)", proc.Frame);

            Assert.AreEqual(
                "fn(arg(BYTE),(arg(a,BYTE)arg(b,BYTE))",
                sProc.Signature.ToString());
        }
Ejemplo n.º 3
0
        public void Usb_ParseFunctionDeclaration_PlatfromTypes()
        {
            program.EnvironmentMetadata.Types.Add(
                "BYTE",
                PrimitiveType.Create(PrimitiveType.Byte.Domain, 1));
            Given_Procedure(0x1000);

            var usb = new UserSignatureBuilder(program);
            var sProc = usb.ParseFunctionDeclaration("BYTE foo(BYTE a, BYTE b)");

            Assert.AreEqual(
                "fn(arg(BYTE),(arg(a,BYTE),arg(b,BYTE))",
                sProc.Signature.ToString());
        }
        public void Usb_ParseFunctionDeclaration_UserDefinedTypes()
        {
            var platformTypes = new Dictionary<string, DataType>()
            {
                { "BYTE", PrimitiveType.Create(PrimitiveType.Byte.Domain, 1) },
            };
            var userDefinedTypes1 = new Dictionary<string, DataType>()
            {
                { "USRDEF1", PrimitiveType.Create( PrimitiveType.Int16.Domain, 2 ) },
            };
            var userDefinedTypes2 = new Dictionary<string, DataType>()
            {
                { "USRDEF2", PrimitiveType.Create( PrimitiveType.Int16.Domain, 2 ) },
            };
            mockFactory.Given_PlatformTypes(platformTypes);
            Given_Procedure(0x1000);

            var usb = new UserSignatureBuilder(program);

            //should accept user defined type USRDEF1
            mockFactory.Given_UserDefinedMetafile("mod1", userDefinedTypes1, null, null);

            var sProc = usb.ParseFunctionDeclaration("BYTE foo(USRDEF1 a, BYTE b)", proc.Frame);

            Assert.AreEqual(
                "fn(arg(BYTE),(arg(a,USRDEF1)arg(b,BYTE))",
                sProc.Signature.ToString());

            //should not accept undefined type USRDEF2
            sProc = usb.ParseFunctionDeclaration("BYTE foo(USRDEF1 a, USRDEF2 b)", proc.Frame);

            Assert.AreEqual(null, sProc);

            //define USRDEF2 so parser should accept it
            mockFactory.Given_UserDefinedMetafile("mod2", userDefinedTypes2, null, null);

            sProc = usb.ParseFunctionDeclaration("BYTE foo(USRDEF1 a, USRDEF2 b)", proc.Frame);

            Assert.AreEqual(
                "fn(arg(BYTE),(arg(a,USRDEF1)arg(b,USRDEF2))",
                sProc.Signature.ToString());
        }
Ejemplo n.º 5
0
        public void Usb_ParseFunctionDeclaration_UserDefinedTypes()
        {
            program.EnvironmentMetadata.Types.Add(
                "BYTE", PrimitiveType.Create(PrimitiveType.Byte.Domain, 1));
         
            Given_Procedure(0x1000);

            var usb = new UserSignatureBuilder(program);

            //should accept user defined type USRDEF1
            program.EnvironmentMetadata.Types.Add(
                "USRDEF1", PrimitiveType.Create(PrimitiveType.Int16.Domain, 2));

            var sProc = usb.ParseFunctionDeclaration("BYTE foo(USRDEF1 a, BYTE b)");

            Assert.AreEqual(
                "fn(arg(BYTE),(arg(a,USRDEF1),arg(b,BYTE))",
                sProc.Signature.ToString());

            //should not accept undefined type USRDEF2
            sProc = usb.ParseFunctionDeclaration("BYTE foo(USRDEF1 a, USRDEF2 b)");
            Assert.AreEqual(null, sProc);

            //define USRDEF2 so parser should accept it

            program.EnvironmentMetadata.Types.Add(
               "USRDEF2", PrimitiveType.Create(PrimitiveType.Int16.Domain, 2));

            sProc = usb.ParseFunctionDeclaration("BYTE foo(USRDEF1 a, USRDEF2 b)");

            Assert.AreEqual(
                "fn(arg(BYTE),(arg(a,USRDEF1),arg(b,USRDEF2))",
                sProc.Signature.ToString());
        }
Ejemplo n.º 6
0
 private bool TryGetNoDecompiledParsedProcedure(Address addr, out Procedure_v1 parsedProc)
 {
     Procedure_v1 sProc;
     if (!TryGetNoDecompiledProcedure(addr, out sProc))
     {
         parsedProc = null;
         return false;
     }
     if (noDecompiledProcs.TryGetValue(addr, out parsedProc))
         return true;
     parsedProc = new Procedure_v1()
     {
         Name = sProc.Name,
     };
     noDecompiledProcs[addr] = parsedProc;
     if (string.IsNullOrEmpty(sProc.CSignature))
     {
         Warn(addr, "The user-defined procedure at address {0} did not have a signature.", addr);
         return true;
     }
     var usb = new UserSignatureBuilder(program);
     var procDecl = usb.ParseFunctionDeclaration(sProc.CSignature);
     if (procDecl == null)
     {
         Warn(addr, "The user-defined procedure signature at address {0} could not be parsed.", addr);
         return true;
     }
     parsedProc.Signature = procDecl.Signature;
     return true;
 }
Ejemplo n.º 7
0
        private bool TryParseSignature(string txtSignature, out ProcedureBase_v1 sProc)
        {
            sProc = null;
            if (program == null || program.Platform == null)
            {
                return false;
            }

            // Attempt to parse the signature.
            var usb = new UserSignatureBuilder(program);
            sProc = usb.ParseFunctionDeclaration(txtSignature);
            return sProc != null;
        }
Ejemplo n.º 8
0
 protected void Signature_TextChanged(object sender, EventArgs e)
 {
     // Attempt to parse the signature.
     var CSignature = dlg.Signature.Text.Trim();
     ProcedureBase_v1 sProc = null;
     bool isValid;
     if (!string.IsNullOrEmpty(CSignature))
     {
         var usb = new UserSignatureBuilder(program);
         sProc = usb.ParseFunctionDeclaration(CSignature);
         isValid = (sProc != null);
     } else
     {
         CSignature = null;
         isValid = true;
     }
     EnableControls(isValid);
     if (isValid)
     {
         if (sProc != null)
             dlg.ProcedureName.Text = sProc.Name;
         EnableProcedureName();
     }
 }
Ejemplo n.º 9
0
        private bool TryGetNoDecompiledProcedure(Address addr, out ExternalProcedure ep)
        {
            Procedure_v1 sProc;
            if (!program.User.Procedures.TryGetValue(addr, out sProc) ||
                sProc.Decompile)
            {
                ep = null;
                return false;
            }

            FunctionType sig = null;
            if (!string.IsNullOrEmpty(sProc.CSignature))
            {
                var usb = new UserSignatureBuilder(program);
                var procDecl = usb.ParseFunctionDeclaration(sProc.CSignature);
                if (procDecl != null)
                {
                    var ser = program.CreateProcedureSerializer();
                    sig = ser.Deserialize(
                        procDecl.Signature,
                        program.Architecture.CreateFrame());
                }
            }
            else
            {
                Warn(addr, "The user-defined procedure at address {0} did not have a signature.", addr); 
            }

            ep = new ExternalProcedure(sProc.Name, sig);
            return true;
        }