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]
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)
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)
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'))
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)
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))
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)
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)
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]
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)
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')
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)
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)
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)
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')
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)' )