PageRenderTime 56ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/DLR_Main/Languages/IronPython/Tests/test_missing.py

https://bitbucket.org/mdavid/dlr
Python | 248 lines | 191 code | 39 blank | 18 comment | 33 complexity | 22a39a7a68b218d3c571f7680bcb1762 MD5 | raw file
  1. #####################################################################################
  2. #
  3. # Copyright (c) Microsoft Corporation. All rights reserved.
  4. #
  5. # This source code is subject to terms and conditions of the Apache License, Version 2.0. A
  6. # copy of the license can be found in the License.html file at the root of this distribution. If
  7. # you cannot locate the Apache License, Version 2.0, please send an email to
  8. # ironpy@microsoft.com. By using this source code in any fashion, you are agreeing to be bound
  9. # by the terms of the Apache License, Version 2.0.
  10. #
  11. # You must not remove this notice, or any other, from this software.
  12. #
  13. #
  14. #####################################################################################
  15. from iptest.assert_util import *
  16. skiptest("silverlight")
  17. skiptest("win32")
  18. # set this flag to True to have the test trace progress
  19. trace = False
  20. skipTypes = [
  21. 'System.Void',
  22. 'System.ArgIterator',
  23. 'System.RuntimeArgumentHandle',
  24. 'System.TypedReference'
  25. ]
  26. counter = 1
  27. import clr
  28. import System
  29. import System.IO as IO
  30. import System.Reflection as Reflection
  31. import System.Reflection.Emit as Emit
  32. import System.Runtime.InteropServices as Interop
  33. import System.Diagnostics as Diagnostics
  34. from System.Reflection.Emit import OpCodes
  35. def MakeArray(type, *values):
  36. a = System.Array.CreateInstance(clr.GetClrType(type), len(values))
  37. for i in range(len(values)):
  38. a[i] = values[i]
  39. return a
  40. class AssemblyGenerator:
  41. def __init__(self, fileName, ab, mb, sdw):
  42. self.fileName = fileName
  43. self.ab = ab
  44. self.mb = mb
  45. self.sdw = sdw
  46. def DefineType(self, name):
  47. return TypeGenerator(self, self.mb.DefineType(name, Reflection.TypeAttributes.Public))
  48. def Save(self):
  49. self.ab.Save(self.fileName, Reflection.PortableExecutableKinds.ILOnly, Reflection.ImageFileMachine.I386);
  50. def CreateAssemblyGenerator(path, name):
  51. dir = IO.Path.GetDirectoryName(path)
  52. file = IO.Path.GetFileName(path)
  53. aname = Reflection.AssemblyName(name)
  54. domain = System.AppDomain.CurrentDomain
  55. ab = domain.DefineDynamicAssembly(aname, Emit.AssemblyBuilderAccess.RunAndSave, dir, None)
  56. mb = ab.DefineDynamicModule(file, file, True);
  57. ab.DefineVersionInfoResource()
  58. constructor = clr.GetClrType(Diagnostics.DebuggableAttribute).GetConstructor(MakeArray(System.Type, clr.GetClrType(Diagnostics.DebuggableAttribute.DebuggingModes)))
  59. attributeValue = MakeArray(System.Object,
  60. Diagnostics.DebuggableAttribute.DebuggingModes.Default |
  61. Diagnostics.DebuggableAttribute.DebuggingModes.DisableOptimizations |
  62. Diagnostics.DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints
  63. )
  64. cab = Emit.CustomAttributeBuilder(constructor, attributeValue)
  65. ab.SetCustomAttribute(cab)
  66. mb.SetCustomAttribute(cab)
  67. return AssemblyGenerator(file, ab, mb, None)
  68. class TypeGenerator:
  69. def __init__(self, ag, tb):
  70. self.tb = tb
  71. self.ag = ag
  72. def DefineMethod(self, name, attributes, returnType, parameterTypes):
  73. params = MakeArray(System.Type, parameterTypes)
  74. mb = self.tb.DefineMethod(name, attributes, returnType, params)
  75. ilg = mb.GetILGenerator()
  76. return CodeGenerator(self, mb, ilg)
  77. def CreateType(self):
  78. return self.tb.CreateType()
  79. class CodeGenerator:
  80. def __init__(self, tg, mb, ilg):
  81. self.tg = tg
  82. self.mb = mb
  83. self.ilg = ilg
  84. self.sdw = tg.ag.sdw
  85. def EmitArg(cg, arg):
  86. cg.ilg.Emit(OpCodes.Ldarg_0)
  87. TypeCode = System.TypeCode
  88. if arg.IsByRef:
  89. base = arg.GetElementType()
  90. if not base.IsValueType:
  91. cg.ilg.Emit(OpCodes.Ldind_Ref)
  92. else:
  93. tc = System.Type.GetTypeCode(base)
  94. if tc == TypeCode.Int32:
  95. cg.ilg.Emit(OpCodes.Ldind_I4)
  96. elif tc == TypeCode.Object:
  97. cg.ilg.Emit(OpCodes.Ldobj, base)
  98. elif tc == TypeCode.Boolean:
  99. cg.ilg.Emit(OpCodes.Ldind_I1)
  100. elif tc == TypeCode.Byte:
  101. cg.ilg.Emit(OpCodes.Ldind_U1)
  102. elif tc == TypeCode.Char:
  103. cg.ilg.Emit(OpCodes.Ldind_I2)
  104. elif tc == TypeCode.DateTime:
  105. cg.ilg.Emit(OpCodes.Ldobj, base)
  106. elif tc == TypeCode.DBNull: pass
  107. elif tc == TypeCode.Decimal:
  108. cg.ilg.Emit(OpCodes.Ldobj, base)
  109. elif tc == TypeCode.Double:
  110. cg.ilg.Emit(OpCodes.Ldind_R8)
  111. #elif tc == TypeCode.Empty: pass
  112. elif tc == TypeCode.Int16:
  113. cg.ilg.Emit(OpCodes.Ldind_I2)
  114. elif tc == TypeCode.Int64:
  115. cg.ilg.Emit(OpCodes.Ldind_I8)
  116. elif tc == TypeCode.SByte:
  117. cg.ilg.Emit(OpCodes.Ldind_I1)
  118. elif tc == TypeCode.Single:
  119. cg.ilg.Emit(OpCodes.Ldind_R4)
  120. #elif tc == TypeCode.String: pass
  121. elif tc == TypeCode.UInt16:
  122. cg.ilg.Emit(OpCodes.Ldind_U2)
  123. elif tc == TypeCode.UInt32:
  124. cg.ilg.Emit(OpCodes.Ldind_U4)
  125. elif tc == TypeCode.UInt64:
  126. cg.ilg.Emit(OpCodes.Ldind_I8)
  127. else:
  128. raise AssertionError("Unknown type", arg, base, tc)
  129. def EmitTestMethod(tg, name, argType):
  130. cg = tg.DefineMethod(name, Reflection.MethodAttributes.Public | Reflection.MethodAttributes.Static, str, argType)
  131. pb = cg.mb.DefineParameter(1, Reflection.ParameterAttributes.In | Reflection.ParameterAttributes.Optional, "o");
  132. tostring = cg.ilg.DeclareLocal(str)
  133. baseType = argType
  134. if baseType.IsByRef:
  135. baseType = baseType.GetElementType()
  136. if not baseType.IsValueType:
  137. is_null = cg.ilg.DefineLabel()
  138. end = cg.ilg.DefineLabel()
  139. EmitArg(cg, argType)
  140. cg.ilg.Emit(OpCodes.Brfalse_S, is_null)
  141. cg.ilg.BeginExceptionBlock()
  142. EmitArg(cg, argType)
  143. cg.ilg.EmitCall(OpCodes.Callvirt, clr.GetClrType(object).GetMethod("ToString"), None)
  144. cg.ilg.Emit(OpCodes.Stloc, tostring)
  145. cg.ilg.BeginCatchBlock(clr.GetClrType(System.Exception))
  146. cg.ilg.Emit(OpCodes.Callvirt, clr.GetClrType(System.Exception).GetMethod("get_Message"))
  147. cg.ilg.Emit(OpCodes.Stloc, tostring)
  148. cg.ilg.Emit(OpCodes.Ldstr, "#EXCEPTION#")
  149. cg.ilg.Emit(OpCodes.Ldloc, tostring)
  150. cg.ilg.EmitCall(OpCodes.Call, clr.GetClrType(str).GetMethod("Concat", MakeArray(System.Type, clr.GetClrType(System.String), clr.GetClrType(System.String))), None)
  151. cg.ilg.Emit(OpCodes.Stloc, tostring)
  152. cg.ilg.EndExceptionBlock()
  153. cg.ilg.Emit(OpCodes.Br_S, end);
  154. cg.ilg.MarkLabel(is_null)
  155. cg.ilg.Emit(OpCodes.Ldstr, "(null)")
  156. cg.ilg.Emit(OpCodes.Stloc, tostring)
  157. cg.ilg.MarkLabel(end)
  158. else:
  159. cg.ilg.BeginExceptionBlock()
  160. EmitArg(cg, argType)
  161. cg.ilg.Emit(OpCodes.Box, baseType);
  162. cg.ilg.EmitCall(OpCodes.Callvirt, clr.GetClrType(object).GetMethod("ToString"), None)
  163. cg.ilg.Emit(OpCodes.Stloc, tostring)
  164. cg.ilg.BeginCatchBlock(clr.GetClrType(System.Exception))
  165. cg.ilg.Emit(OpCodes.Callvirt, clr.GetClrType(System.Exception).GetMethod("get_Message"))
  166. cg.ilg.Emit(OpCodes.Stloc, tostring)
  167. cg.ilg.Emit(OpCodes.Ldstr, "#EXCEPTION#")
  168. cg.ilg.Emit(OpCodes.Ldloc, tostring)
  169. cg.ilg.EmitCall(OpCodes.Call, clr.GetClrType(System.String).GetMethod("Concat", MakeArray(System.Type, clr.GetClrType(System.String), clr.GetClrType(System.String))), None)
  170. cg.ilg.Emit(OpCodes.Stloc, tostring)
  171. cg.ilg.EndExceptionBlock()
  172. cg.ilg.Emit(OpCodes.Ldstr, name + "$" + argType.FullName + "$")
  173. cg.ilg.Emit(OpCodes.Ldloc, tostring)
  174. cg.ilg.EmitCall(OpCodes.Call, clr.GetClrType(System.String).GetMethod("Concat", MakeArray(System.Type, clr.GetClrType(System.String), clr.GetClrType(System.String))), None)
  175. if trace:
  176. cg.ilg.Emit(OpCodes.Dup)
  177. cg.ilg.EmitCall(OpCodes.Call, clr.GetClrType(System.Console).GetMethod("WriteLine", MakeArray(System.Type, clr.GetClrType(System.String))), None)
  178. cg.ilg.Emit(OpCodes.Ret)
  179. def GenerateMethods(ag):
  180. global counter
  181. tg = ag.DefineType("Abomination")
  182. system_assembly = clr.LoadAssemblyByName('System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089')
  183. mscorlib_assembly = clr.LoadAssemblyByName('mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089')
  184. for ref in (system_assembly, mscorlib_assembly):
  185. for t in ref.GetExportedTypes():
  186. if t.ContainsGenericParameters or t.FullName in skipTypes: continue
  187. if trace: print counter, t.FullName
  188. EmitTestMethod(tg, "Test_%d" % counter, t)
  189. EmitTestMethod(tg, "TestRef_%d" % counter, t.MakeByRefType())
  190. counter += 1
  191. return tg.CreateType()
  192. def TestCalls(t):
  193. t = clr.GetPythonType(t)
  194. for i in range(1, counter):
  195. n = "Test_%d" % i
  196. r = getattr(t, n)()
  197. if trace: print r
  198. n = "TestRef_%d" % i
  199. r = getattr(t, n)()
  200. if trace: print r
  201. # disabled the test for Orcas CLR bug (DDB#66718)
  202. @skip("orcas")
  203. def test_main():
  204. path = IO.Path.GetTempPath()
  205. ag = CreateAssemblyGenerator(IO.Path.Combine(path, "MissingTest.dll"), "MissingTest")
  206. t = GenerateMethods(ag)
  207. TestCalls(t)
  208. ag.Save()
  209. run_test(__name__)