Ejemplo n.º 1
0
    def setUp(self):
        from ParserContext import ParserContext
        s = (
            '.method private hidebysig static int32  Main(string[] args) cil managed\n'
            '{\n'
            '  .entrypoint\n'
            '  .maxstack  1\n'
            '  .locals init ([0] int32 CS$1$0000)\n'
            '  .try\n'
            '  {\n'
            '    IL_0008:  leave.s    IL_0010\n'
            '  }  // end .try\n'
            '  catch [mscorlib]System.Object \n'
            '  {\n'
            '    IL_000e:  leave.s    IL_0010\n'
            '  }  // end handler\n'
            '  IL_0010:  nop\n'
            '  IL_0011:  ldloc.0\n'
            '  IL_0012:  ret\n'
            '} // end of method Program::Main')

        parser = ParserContext()
        parser.parse(s)

        self.method = parser.methods[0]
Ejemplo n.º 2
0
    def test_parse_single_method_with_parameters(self):
        from ParserContext import ParserContext
        s = """.method public hidebysig instance void 
              SetCount(int32 c) cil managed
              {
                // Code size       9 (0x9)
                .maxstack  8
                IL_0000:  nop
              } // end of method foo::SetCount"""

        p = ParserContext()
        p.parse(s)
        self.assertEqual(len(p.methods[0].parameters), 1)
        self.assertEqual(p.methods[0].parameters[0].name, 'c')
        self.assertEqual(p.methods[0].parameters[0].type, Types.Int32)
Ejemplo n.º 3
0
 def test_parse_single_method_with_parameters(self):
     from ParserContext import ParserContext
     s = """.method public hidebysig instance void 
           SetCount(int32 c) cil managed
           {
             // Code size       9 (0x9)
             .maxstack  8
             IL_0000:  nop
           } // end of method foo::SetCount"""
 
     p = ParserContext()
     p.parse(s)
     self.assertEqual(len(p.methods[0].parameters), 1)
     self.assertEqual(p.methods[0].parameters[0].name, 'c')
     self.assertEqual(p.methods[0].parameters[0].type, Types.Int32)
Ejemplo n.º 4
0
    def test_parse_empty_class(self):
        from ParserContext import ParserContext
        s = (
            '.class private auto ansi beforefieldinit ConsoleApplication1.foo\n'
            '   extends [mscorlib]System.Object\n'
            '{\n'
            '.method public hidebysig specialname rtspecialname\n'
            '        instance void  .ctor() cil managed\n'
            '{\n'
            '  // Code size       7 (0x7)\n'
            '  .maxstack  8\n'
            '  IL_0000:  ldarg.0\n'
            '  IL_0001:  call       instance void [mscorlib]System.Object::.ctor()\n'
            '  IL_0006:  ret\n'
            '} // end of method foo::.ctor\n'
            '} // end of class ConsoleApplication1.foo\n')

        p = ParserContext(s)
        cp = ClassParser()
        c = cp.parse(p)

        self.assertEquals(c.name, 'foo')
        self.assertEqual(c.namespace, 'ConsoleApplication1')
        self.assertEquals(len(c.methods), 1)
        self.assertEqual(len(c.flags), 4)
Ejemplo n.º 5
0
    def test_parse_class_with_class_field(self):
        from ParserContext import ParserContext
        s = '''
            .class private auto ansi beforefieldinit ConsoleApplication1.bar
                   extends [mscorlib]System.Object
            {
              .field public class ConsoleApplication1.foo f
              .method public hidebysig specialname rtspecialname 
                      instance void  .ctor() cil managed
              {
                // Code size       7 (0x7)
                .maxstack  8
                IL_0000:  ldarg.0
                IL_0001:  call       instance void [mscorlib]System.Object::.ctor()
                IL_0006:  ret
              } // end of method bar::.ctor
            
            } // end of class ConsoleApplication1.bar'''

        p = ParserContext(s)
        cp = ClassParser()
        c = cp.parse(p)

        self.assertEqual(c.methods[0].name, 'ctor')
        self.assertEqual(c.methods[0].namespace, 'ConsoleApplication1.bar')
        self.assertEquals(len(c.fieldDefinitions), 1)
        f = c.fieldDefinitions[0]
        self.assertEqual(f.name, 'f')
        self.assertEqual(f.type, Types.resolve_type('ConsoleApplication1.foo'))
Ejemplo n.º 6
0
    def test_parse_multiple_methods_no_parameters(self):
        from ParserContext import ParserContext
        s = ('.method public void A.B.main() {\n '
             'IL_0001:    ret\n'
             ' }\n'
             '\n'
             '.method public void N.S.main2() {\n '
             'IL_0001:    ret\n'
             ' }\n')

        p = ParserContext()
        p.parse(s)

        self.assertEqual(2, len(p.methods))
        self.assertEqual('main', p.methods[0].name)
        self.assertEqual('A.B', p.methods[0].namespace)
        self.assertEqual('main2', p.methods[1].name)
        self.assertEqual('N.S', p.methods[1].namespace)
Ejemplo n.º 7
0
 def test_parse_multiple_methods_with_parameters(self):
     from ParserContext import ParserContext
     s = ('.method public void main(int args) {\n '
          'IL_0001:    ret\n'
          ' }\n'
          '\n'
          '.method public void main2(int args) {\n '
          'IL_0001:    ret\n'
          ' }\n')
     
     p = ParserContext()
     p.parse(s)
     
     self.assertEqual(2, len(p.methods))
     self.assertEqual('main', p.methods[0].name)
     self.assertEqual(1, len(p.methods[0].parameters))
     self.assertEqual('main2', p.methods[1].name)
     self.assertEqual(1, len(p.methods[1].parameters))
Ejemplo n.º 8
0
 def test_parse_multiple_methods_no_parameters(self):
     from ParserContext import ParserContext
     s = ('.method public void A.B.main() {\n '
          'IL_0001:    ret\n'
          ' }\n'
          '\n'
          '.method public void N.S.main2() {\n '
          'IL_0001:    ret\n'
          ' }\n')
     
     p = ParserContext()
     p.parse(s)
     
     self.assertEqual(2, len(p.methods))
     self.assertEqual('main', p.methods[0].name)
     self.assertEqual('A.B', p.methods[0].namespace)
     self.assertEqual('main2', p.methods[1].name)
     self.assertEqual('N.S', p.methods[1].namespace)
Ejemplo n.º 9
0
    def test_parse_multiple_methods_with_parameters(self):
        from ParserContext import ParserContext
        s = ('.method public void main(int args) {\n '
             'IL_0001:    ret\n'
             ' }\n'
             '\n'
             '.method public void main2(int args) {\n '
             'IL_0001:    ret\n'
             ' }\n')

        p = ParserContext()
        p.parse(s)

        self.assertEqual(2, len(p.methods))
        self.assertEqual('main', p.methods[0].name)
        self.assertEqual(1, len(p.methods[0].parameters))
        self.assertEqual('main2', p.methods[1].name)
        self.assertEqual(1, len(p.methods[1].parameters))
Ejemplo n.º 10
0
    def test_parse_method_with_labels(self):
        from ParserContext import ParserContext
        s = ('.method public void main() {\n ' 'IL_0001:    ret\n' ' }')

        p = ParserContext(s)
        mp = MethodParser()
        m = mp.parse(p)

        self.assertEqual(len(m.instructions), 1)
        self.assertEqual('ret', m.instructions[0].name)
        self.assertEqual('IL_0001', m.instructions[0].label)
Ejemplo n.º 11
0
    def test_parse_single_local_with_no_alias(self):
        from ParserContext import ParserContext
        s = 'init (int32 j)'
        p = ParserContext(s)
        mp = MethodParser()

        locals = mp.parse_locals(p)
        self.assertEqual(len(locals), 1)
        self.assertEqual(locals[0].name, 'j')
        self.assertEqual(locals[0].alias, None)
        self.assertEqual(locals[0].type, Types.Int32)
Ejemplo n.º 12
0
 def setUp(self):
     from ParserContext import ParserContext
     s = ('.method private hidebysig static int32  Main(string[] args) cil managed\n'
         '{\n'
         '  .entrypoint\n'
         '  .maxstack  1\n'
         '  .locals init ([0] int32 CS$1$0000)\n'
         '  .try\n'
         '  {\n'
         '    IL_0008:  leave.s    IL_0010\n'
         '  }  // end .try\n'
         '  catch [mscorlib]System.Object \n'
         '  {\n'
         '    IL_000e:  leave.s    IL_0010\n'
         '  }  // end handler\n'
         '  IL_0010:  nop\n'
         '  IL_0011:  ldloc.0\n'
         '  IL_0012:  ret\n'
         '} // end of method Program::Main')
     
     parser = ParserContext()
     parser.parse(s)
     
     self.method = parser.methods[0]
Ejemplo n.º 13
0
    def test_parse_multiple_local_with_no_alias(self):
        from ParserContext import ParserContext
        s = ('init (int32 first,' 'int32 second,' 'int32 result)')
        p = ParserContext(s)
        mp = MethodParser()

        locals = mp.parse_locals(p)
        self.assertEqual(len(locals), 3)
        self.assertEqual(locals[0].name, 'first')
        self.assertEqual(locals[0].alias, None)
        self.assertEqual(locals[0].type, Types.Int32)
        self.assertEqual(locals[1].name, 'second')
        self.assertEqual(locals[1].alias, None)
        self.assertEqual(locals[1].type, Types.Int32)
        self.assertEqual(locals[2].name, 'result')
        self.assertEqual(locals[2].alias, None)
        self.assertEqual(locals[2].type, Types.Int32)
Ejemplo n.º 14
0
    def test_parse_class_local_with_alias(self):
        from ParserContext import ParserContext
        s = 'init ([0] class NS.C f)'

        p = ParserContext(s)
        mp = MethodParser()

        c = ClassDefinition()
        c.name = 'C'
        c.namespace = 'NS'
        Types.register_custom_type(c)

        locals = mp.parse_locals(p)
        self.assertEqual(len(locals), 1)
        self.assertTrue(isinstance(locals[0], ReferenceType))
        self.assertEqual(locals[0].name, 'f')
        self.assertEqual(locals[0].alias, '0')
        self.assertEqual(locals[0].type.name, 'C')
        self.assertEqual(locals[0].type.namespace, 'NS')
Ejemplo n.º 15
0
    def test_parse_extern_assembly(self):
        from ParserContext import ParserContext
        s = (
            '// Metadata version: v2.0.50727\n'
            '.assembly extern mscorlib\n'
            '{\n'
            '.publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..\n'
            '.hash algorithm 0x00008004\n'
            '.ver 2:0:0:0\n'
            '}\n')

        ap = AssemblyParser()
        p = ParserContext(s)
        a = ap.parse(p)

        self.assertEqual(a.name, 'mscorlib')
        self.assertEqual(a.extern, True)
        self.assertEqual(a.version, '2:0:0:0')
        self.assertEqual(a.extern, True)
        self.assertEqual(a.hashAlgorithm, 0x8004)
Ejemplo n.º 16
0
    def test_parse_class_with_field(self):
        from ParserContext import ParserContext
        s = (
            '.class private auto ansi beforefieldinit ConsoleApplication1.foo\n'
            '   extends [mscorlib]System.Object\n'
            '{\n'
            '  .field public int32 z\n'
            '} // end of class ConsoleApplication1.foo\n')

        p = ParserContext(s)
        cp = ClassParser()
        c = cp.parse(p)

        self.assertEquals(c.name, 'foo')
        self.assertEqual(c.namespace, 'ConsoleApplication1')

        self.assertEquals(len(c.fieldDefinitions), 1)
        f = c.fieldDefinitions[0]
        self.assertEqual(f.name, 'z')
        self.assertEqual(f.type, Types.Int32)
Ejemplo n.º 17
0
    def test_parse_class_registers_type(self):
        from ParserContext import ParserContext
        s = (
            '.class private auto ansi beforefieldinit ConsoleApplication1.bar\n'
            '   extends [mscorlib]System.Object\n'
            '{\n'
            '.method public hidebysig specialname rtspecialname\n'
            '        instance void  .ctor() cil managed\n'
            '{\n'
            '  // Code size       7 (0x7)\n'
            '  .maxstack  8\n'
            '  IL_0000:  ldarg.0\n'
            '  IL_0001:  call       instance void [mscorlib]System.Object::.ctor()\n'
            '  IL_0006:  ret\n'
            '} // end of method foo::.ctor\n'
            '} // end of class ConsoleApplication1.bar\n')

        p = ParserContext(s)
        cp = ClassParser()
        c = cp.parse(p)

        self.assertEqual(
            Types.resolve_type('ConsoleApplication1.bar').classRef, c)
Ejemplo n.º 18
0
    def test_method_in_class_gets_class_namespace(self):
        from ParserContext import ParserContext
        s = '''.class private auto ansi beforefieldinit ConsoleApplication1.foo
        extends [mscorlib]System.Object
        {
          .field public int32 z
          .method public hidebysig specialname rtspecialname 
                  instance void  .ctor() cil managed
          {
            // Code size       7 (0x7)
            .maxstack  8
            IL_0000:  ldarg.0
            IL_0001:  call       instance void [mscorlib]System.Object::.ctor()
            IL_0006:  ret
          } // end of method foo::.ctor
       } // end of class ConsoleApplication1.foo'''

        p = ParserContext(s)
        cp = ClassParser()
        c = cp.parse(p)

        self.assertEqual(c.methods[0].name, 'ctor')
        self.assertEqual(c.methods[0].namespace, 'ConsoleApplication1.foo')
Ejemplo n.º 19
0
    def test_parse_custom_attributes(self):
        from ParserContext import ParserContext
        s = (
            '.assembly ConsoleApplication1\n'
            '{\n'
            '.custom instance void [mscorlib]System.Reflection.AssemblyTitleAttribute::.ctor(string) = ( 01 00 13 43 6F 6E 73 6F 6C 65 41 70 70 6C 69 63   // ...ConsoleApplic\n'
            '                                                                                             61 74 69 6F 6E 31 00 00 )\n'
            '.custom instance void [mscorlib]System.Reflection.AssemblyDescriptionAttribute::.ctor(string) = ( 01 00 00 00 00 ) \n'
            '}')

        ap = AssemblyParser()
        p = ParserContext(s)
        a = ap.parse(p)

        self.assertEqual(a.name, "ConsoleApplication1")
        self.assertEqual(len(a.customAttributes), 2)
        self.assertEqual(
            a.customAttributes[0].name,
            '[mscorlib]System.Reflection.AssemblyTitleAttribute::.ctor(string)'
        )
        self.assertEqual(
            a.customAttributes[1].name,
            '[mscorlib]System.Reflection.AssemblyDescriptionAttribute::.ctor(string)'
        )