PageRenderTime 26ms CodeModel.GetById 33ms RepoModel.GetById 0ms app.codeStats 0ms

/DLR_Main/Languages/IronPython/Tests/compat/sbs_exceptions/shared.py

https://bitbucket.org/mdavid/dlr
Python | 372 lines | 355 code | 3 blank | 14 comment | 0 complexity | a9d12ec6b11f69da4e2aee7d63447099 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 common import runtests, printwith
  16. import sys
  17. import nt
  18. class CodeHolder(object):
  19. def __init__(self):
  20. self.text = ''
  21. self.depth = 0
  22. def Add(self, text):
  23. self.text += text
  24. class try_finally_generator(object):
  25. def __init__(self, codeHolder, tryBody, finallyBody):
  26. self.code = codeHolder
  27. self.tryBody = tryBody
  28. self.finallyBody = finallyBody
  29. def generate(self, indent=1):
  30. self.code.Add(' '*indent); self.code.Add('try:\n')
  31. self.code.Add(' '*(indent+1));self.code.Add('log+="try"\n')
  32. self.tryBody.generate(indent+1)
  33. self.code.Add(' '*indent); self.code.Add('finally:\n')
  34. self.code.Add(' '*(indent+1));self.code.Add('log+="finally"\n')
  35. self.code.Add(' '*(indent+1));self.code.Add('log+=dump_exc_info()\n')
  36. self.finallyBody.generate(indent+1)
  37. class try_except_generator(object):
  38. def __init__(self, codeHolder, tryBody, exceptBody):
  39. self.code = codeHolder
  40. self.tryBody = tryBody
  41. self.exceptBody = exceptBody
  42. def generate(self, indent=1):
  43. self.code.Add(' '*indent); self.code.Add('try:\n')
  44. self.code.Add(' '*(indent+1));self.code.Add('log+="try"\n')
  45. self.tryBody.generate(indent+1)
  46. self.code.Add(' '*indent); self.code.Add('except:\n')
  47. self.code.Add(' '*(indent+1));self.code.Add('log+="except"\n')
  48. self.code.Add(' '*(indent+1));self.code.Add('log+=dump_exc_info()\n')
  49. self.exceptBody.generate(indent+1)
  50. class try_except_else_generator(object):
  51. def __init__(self, codeHolder, tryBody, exceptBody, elseBody):
  52. self.code = codeHolder
  53. self.tryBody = tryBody
  54. self.exceptBody = exceptBody
  55. self.elseBody = elseBody
  56. def generate(self, indent=1):
  57. self.code.Add(' '*indent); self.code.Add('try:\n')
  58. self.code.Add(' '*(indent+1));self.code.Add('log+="try"\n')
  59. self.tryBody.generate(indent+1)
  60. self.code.Add(' '*indent); self.code.Add('except:\n')
  61. self.code.Add(' '*(indent+1));self.code.Add('log+="except"\n')
  62. self.code.Add(' '*(indent+1));self.code.Add('log+=dump_exc_info()\n')
  63. self.exceptBody.generate(indent+1)
  64. self.code.Add(' '*indent); self.code.Add('else:\n')
  65. self.code.Add(' '*(indent+1));self.code.Add('log+="else"\n')
  66. self.code.Add(' '*(indent+1));self.code.Add('log+=dump_exc_info()\n')
  67. self.elseBody.generate(indent+1)
  68. class for_loop_generator(object):
  69. def __init__(self, codeHolder, var, items, body):
  70. self.code = codeHolder
  71. self.var = var
  72. self.items = items
  73. self.body = body
  74. def generate(self, indent=1):
  75. self.code.Add(' '*indent);self.code.Add('log+="preloop"\n')
  76. self.code.Add(' '*indent);self.code.Add('for %s in %s:\n' % (self.var+str(indent), self.items))
  77. self.code.Add(' '*(indent+1));self.code.Add('log+="inloop"\n')
  78. self.body.generate(indent+1)
  79. class while_loop_generator(object):
  80. def __init__(self, codeHolder, body):
  81. self.code = codeHolder
  82. self.body = body
  83. def generate(self, indent=1):
  84. global uniqueCount
  85. self.code.Add(' '*indent);self.code.Add('log+="preloop"\n')
  86. self.code.Add(' '*indent);self.code.Add('whilevar%d_%d = 0\n' % (indent, uniqueCount))
  87. self.code.Add(' '*indent);self.code.Add('while whilevar%d_%d < 3:\n' % (indent, uniqueCount))
  88. self.code.Add(' '*(indent+1));self.code.Add('whilevar%d_%d += 1\n' % (indent, uniqueCount))
  89. self.code.Add(' '*(indent+1));self.code.Add('log+="inloop"\n')
  90. uniqueCount += 1
  91. self.body.generate(indent+1)
  92. class pass_generator(object):
  93. def __init__(self, codeHolder):
  94. self.code = codeHolder
  95. def generate(self, indent=1):
  96. self.code.Add(' '*indent);self.code.Add('log+="pass"\n')
  97. self.code.Add(' '*indent);self.code.Add('pass\n')
  98. class break_generator(object):
  99. def __init__(self, codeHolder):
  100. self.code = codeHolder
  101. def generate(self, indent=1):
  102. self.code.Add(' '*indent);self.code.Add('log+="break"\n')
  103. self.code.Add(' '*indent);self.code.Add('break\n')
  104. class continue_generator(object):
  105. def __init__(self, codeHolder):
  106. self.code = codeHolder
  107. def generate(self, indent=1):
  108. self.code.Add(' '*indent);self.code.Add('log+="continue"\n')
  109. self.code.Add(' '*indent);self.code.Add('continue\n')
  110. class return_generator(object):
  111. def __init__(self, codeHolder, state):
  112. self.code = codeHolder
  113. self.state = state
  114. def generate(self, indent=1):
  115. self.code.Add(' '*indent);self.code.Add('log+="return"\n')
  116. self.code.Add(' '*indent);self.code.Add('return %s\n' % self.state)
  117. class if_false_generator(object):
  118. def __init__(self, codeHolder, body):
  119. self.code = codeHolder
  120. self.body = body
  121. def generate(self, indent=1):
  122. self.code.Add(' '*indent);self.code.Add('log+="preif"\n')
  123. self.code.Add(' '*indent);self.code.Add('if False:\n')
  124. self.code.Add(' '*(indent+1));self.code.Add('log+="huh?"\n')
  125. self.body.generate(indent+1)
  126. class if_true_generator(object):
  127. def __init__(self, codeHolder, body):
  128. self.code = codeHolder
  129. self.body = body
  130. def generate(self, indent=1):
  131. self.code.Add(' '*indent);self.code.Add('log+="preif"\n')
  132. self.code.Add(' '*indent);self.code.Add('if True:\n')
  133. self.code.Add(' '*(indent+1));self.code.Add('log+="true!"\n')
  134. self.body.generate(indent+1)
  135. class yield_generator(object):
  136. def __init__(self, codeHolder, state):
  137. self.code = codeHolder
  138. self.state = state
  139. def generate(self, indent=1):
  140. self.code.Add(' '*indent);self.code.Add('log+="yield"\n')
  141. self.code.Add(' '*indent);self.code.Add('yield %s\n' % self.state)
  142. class raise_generator(object):
  143. def __init__(self, codeHolder, state):
  144. self.code = codeHolder
  145. self.state = state
  146. def generate(self, indent=1):
  147. self.code.Add(' '*indent);self.code.Add('raise Exception("%s")\n' % self.state)
  148. class define_generator(object):
  149. def __init__(self, codeHolder, body):
  150. self.code = codeHolder
  151. self.body = body
  152. def generate(self, indent=1):
  153. global uniqueCount
  154. saved = uniqueCount
  155. uniqueCount += 1
  156. self.code.Add(' '*indent);self.code.Add('log+="predefine"\n')
  157. self.code.Add(' '*indent);self.code.Add('def func%d_%d():\n' % (indent, saved))
  158. self.code.Add(' '*(indent+1));self.code.Add('global log\n')
  159. self.body.generate(indent+1)
  160. self.code.Add(' '*indent);self.code.Add('func%d_%d()\n' % (indent, saved))
  161. ch = CodeHolder()
  162. def for_loop_maker(ch, body):
  163. return for_loop_generator(ch, 'x', 'range(3)', body)
  164. def while_loop_maker(ch, body):
  165. return while_loop_generator(ch, body)
  166. def try_except_maker1(ch, body):
  167. return try_except_generator(ch, pass_generator(ch), body)
  168. def try_except_maker2(ch, body):
  169. return try_except_generator(ch, body, pass_generator(ch))
  170. def try_except_maker3(ch, body):
  171. return try_except_generator(ch, body, body)
  172. def try_finally_maker1(ch, body):
  173. return try_finally_generator(ch, pass_generator(ch), body)
  174. def try_finally_maker2(ch, body):
  175. return try_finally_generator(ch, body, pass_generator(ch))
  176. def try_finally_maker3(ch, body):
  177. return try_finally_generator(ch, body, body)
  178. def try_else_maker1(ch, body):
  179. return try_except_else_generator(ch, pass_generator(ch), body, body)
  180. def pass_maker(ch, body):
  181. return pass_generator(ch)
  182. def break_maker(ch, body):
  183. return break_generator(ch)
  184. def continue_maker(ch, body):
  185. return continue_generator(ch)
  186. def define_maker(ch, body):
  187. return define_generator(ch, body)
  188. def generator(): yield 2
  189. generator_type = type(generator())
  190. loopCnt = 0
  191. generatorDepth = 0
  192. yieldState = 0
  193. finallyCnt = 0
  194. tryOrCatchCount = 0
  195. uniqueCount = 0
  196. def dump_exc_info():
  197. tb = sys.exc_info()[2]
  198. tb_list = []
  199. while tb is not None :
  200. f = tb.tb_frame
  201. co = f.f_code
  202. filename = co.co_filename
  203. #Shrink the filename a bit
  204. if filename.count("\\"):
  205. filename = filename.rsplit("\\", 1)[1]
  206. name = co.co_name
  207. tb_list.append((tb.tb_lineno, filename, name))
  208. tb = tb.tb_next
  209. return str(tb_list)
  210. #------------------------------------------------------------------------------
  211. allGenerators = []
  212. def setGenerator(generator):
  213. global allGenerators
  214. allGenerators = [ generator ]
  215. knownFailures = []
  216. def setKnownFailures(failures):
  217. global knownFailures
  218. knownFailures = failures
  219. class test_exceptions(object):
  220. def test_exceptions(self):
  221. if len(allGenerators)==0:
  222. raise Exception("Need at least one generator from test_exceptions")
  223. stateful = [raise_generator, return_generator]
  224. ch = CodeHolder()
  225. curTest = 0 # a counter so that trace backs have unique method names and we check left over info properly
  226. for depth in xrange(3):
  227. def do_generate(test):
  228. global loopCnt, yieldState, finallyCnt, tryOrCatchCount, uniqueCount
  229. yieldState += 1
  230. if test in (for_loop_maker, while_loop_maker):
  231. loopCnt += 1
  232. if test in (try_finally_maker1, try_finally_maker2, try_finally_maker3):
  233. finallyCnt += 1
  234. if test in (try_except_maker1, try_except_maker2, try_except_maker3, try_else_maker1):
  235. tryOrCatchCount += 1
  236. genSet = [ for_loop_maker, while_loop_maker,
  237. try_except_maker1, try_except_maker2, try_except_maker3,
  238. try_finally_maker1, try_finally_maker2, try_finally_maker3,
  239. try_else_maker1,
  240. if_false_generator, if_true_generator,
  241. define_maker,
  242. ]
  243. if loopCnt > 0:
  244. if finallyCnt > 0: genSet = genSet + [break_maker]
  245. else: genSet = genSet + [break_maker, continue_maker]
  246. if ch.depth > depth:
  247. yield test(ch, pass_generator(ch))
  248. else:
  249. for testCase in genSet:
  250. ch.depth += 1
  251. x = do_generate(testCase)
  252. for body in x:
  253. yield test(ch, body)
  254. ch.depth -= 1
  255. for statefulGuy in stateful:
  256. yield test(ch, statefulGuy(ch, yieldState))
  257. if finallyCnt == 0:
  258. yield test(ch, yield_generator(ch, yieldState))
  259. if test in (for_loop_maker, while_loop_maker):
  260. loopCnt -= 1
  261. if test in (try_finally_maker1, try_finally_maker2, try_finally_maker3):
  262. finallyCnt -= 1
  263. if test in (try_except_maker1, try_except_maker2, try_except_maker3, try_else_maker1):
  264. tryOrCatchCount -= 1
  265. for testCase in allGenerators:
  266. x = do_generate(testCase)
  267. for y in x:
  268. curTest += 1
  269. if curTest in knownFailures:
  270. continue
  271. if 'IRONPYTHON_RUNSLOWTESTS' in nt.environ:
  272. uniqueCount = 0
  273. # run without a function
  274. y.code.text = ''
  275. y.generate(0)
  276. y.code.text += 'print log'
  277. d = {'log': '', 'dump_exc_info': dump_exc_info}
  278. try:
  279. #printwith(y.code.text)
  280. exec y.code.text in d, d
  281. except Exception, e:
  282. printwith('same', sys.exc_type)
  283. uniqueCount = 0
  284. # run within a function
  285. y.code.text = 'def test' + str(curTest) + '():\n'
  286. y.code.text += ' global log\n'
  287. y.generate()
  288. d = {'log' : '', 'dump_exc_info': dump_exc_info}
  289. try:
  290. printwith(y.code.text)
  291. exec y.code.text in d, d
  292. except SyntaxError:
  293. printwith("same", sys.exc_type)
  294. continue
  295. retval = None
  296. try:
  297. retval = d['test' + str(curTest)]()
  298. if isinstance(retval, generator_type):
  299. for it in retval: printwith('same', it)
  300. else:
  301. printwith('same', retval)
  302. except:
  303. printwith("same", sys.exc_type)
  304. if isinstance(retval, generator_type):
  305. retval.close()
  306. printwith('same', d['log'])