Cython 3.3.0a1__cp315-cp315-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (335) hide show
  1. Cython/Build/BuildExecutable.py +156 -0
  2. Cython/Build/Cache.py +199 -0
  3. Cython/Build/Cythonize.py +349 -0
  4. Cython/Build/Dependencies.py +1276 -0
  5. Cython/Build/Distutils.py +1 -0
  6. Cython/Build/Inline.py +467 -0
  7. Cython/Build/IpythonMagic.py +559 -0
  8. Cython/Build/SharedModule.py +84 -0
  9. Cython/Build/Tests/TestCyCache.py +195 -0
  10. Cython/Build/Tests/TestCythonizeArgsParser.py +480 -0
  11. Cython/Build/Tests/TestDependencies.py +133 -0
  12. Cython/Build/Tests/TestInline.py +177 -0
  13. Cython/Build/Tests/TestIpythonMagic.py +303 -0
  14. Cython/Build/Tests/TestRecythonize.py +212 -0
  15. Cython/Build/Tests/TestStripLiterals.py +155 -0
  16. Cython/Build/Tests/__init__.py +1 -0
  17. Cython/Build/__init__.py +11 -0
  18. Cython/CodeWriter.py +815 -0
  19. Cython/Compiler/AnalysedTreeTransforms.py +97 -0
  20. Cython/Compiler/Annotate.py +328 -0
  21. Cython/Compiler/AutoDocTransforms.py +320 -0
  22. Cython/Compiler/Buffer.py +680 -0
  23. Cython/Compiler/Builtin.py +997 -0
  24. Cython/Compiler/CmdLine.py +263 -0
  25. Cython/Compiler/Code.cp315-win_amd64.pyd +0 -0
  26. Cython/Compiler/Code.pxd +152 -0
  27. Cython/Compiler/Code.py +3907 -0
  28. Cython/Compiler/CodeGeneration.py +33 -0
  29. Cython/Compiler/CythonScope.py +194 -0
  30. Cython/Compiler/Dataclass.py +890 -0
  31. Cython/Compiler/DebugFlags.py +24 -0
  32. Cython/Compiler/Errors.py +310 -0
  33. Cython/Compiler/ExprNodes.py +15983 -0
  34. Cython/Compiler/FlowControl.cp315-win_amd64.pyd +0 -0
  35. Cython/Compiler/FlowControl.pxd +99 -0
  36. Cython/Compiler/FlowControl.py +1571 -0
  37. Cython/Compiler/FusedNode.cp315-win_amd64.pyd +0 -0
  38. Cython/Compiler/FusedNode.py +976 -0
  39. Cython/Compiler/Future.py +16 -0
  40. Cython/Compiler/Interpreter.py +57 -0
  41. Cython/Compiler/Lexicon.py +422 -0
  42. Cython/Compiler/LineTable.cp315-win_amd64.pyd +0 -0
  43. Cython/Compiler/LineTable.py +114 -0
  44. Cython/Compiler/Main.py +856 -0
  45. Cython/Compiler/MatchCaseNodes.py +2197 -0
  46. Cython/Compiler/MemoryView.py +930 -0
  47. Cython/Compiler/ModuleNode.py +4517 -0
  48. Cython/Compiler/Naming.py +367 -0
  49. Cython/Compiler/Nodes.py +10941 -0
  50. Cython/Compiler/Optimize.py +5455 -0
  51. Cython/Compiler/Options.py +838 -0
  52. Cython/Compiler/ParseTreeTransforms.pxd +79 -0
  53. Cython/Compiler/ParseTreeTransforms.py +4744 -0
  54. Cython/Compiler/Parsing.cp315-win_amd64.pyd +0 -0
  55. Cython/Compiler/Parsing.pxd +9 -0
  56. Cython/Compiler/Parsing.py +4792 -0
  57. Cython/Compiler/Pipeline.py +439 -0
  58. Cython/Compiler/PyrexTypes.py +6111 -0
  59. Cython/Compiler/Pythran.py +232 -0
  60. Cython/Compiler/Scanning.cp315-win_amd64.pyd +0 -0
  61. Cython/Compiler/Scanning.pxd +70 -0
  62. Cython/Compiler/Scanning.py +720 -0
  63. Cython/Compiler/StringEncoding.py +297 -0
  64. Cython/Compiler/Symtab.py +3092 -0
  65. Cython/Compiler/Tests/TestBuffer.py +105 -0
  66. Cython/Compiler/Tests/TestBuiltin.py +117 -0
  67. Cython/Compiler/Tests/TestCmdLine.py +587 -0
  68. Cython/Compiler/Tests/TestCode.py +145 -0
  69. Cython/Compiler/Tests/TestFlowControl.py +65 -0
  70. Cython/Compiler/Tests/TestGrammar.py +202 -0
  71. Cython/Compiler/Tests/TestMemView.py +71 -0
  72. Cython/Compiler/Tests/TestParseTreeTransforms.py +285 -0
  73. Cython/Compiler/Tests/TestScanning.py +132 -0
  74. Cython/Compiler/Tests/TestSignatureMatching.py +73 -0
  75. Cython/Compiler/Tests/TestStringEncoding.py +20 -0
  76. Cython/Compiler/Tests/TestTreeFragment.py +63 -0
  77. Cython/Compiler/Tests/TestTreePath.py +103 -0
  78. Cython/Compiler/Tests/TestTypes.py +118 -0
  79. Cython/Compiler/Tests/TestUtilityLoad.py +112 -0
  80. Cython/Compiler/Tests/TestVisitor.py +61 -0
  81. Cython/Compiler/Tests/Utils.py +36 -0
  82. Cython/Compiler/Tests/__init__.py +1 -0
  83. Cython/Compiler/TreeFragment.py +278 -0
  84. Cython/Compiler/TreePath.py +303 -0
  85. Cython/Compiler/TypeInference.py +611 -0
  86. Cython/Compiler/TypeSlots.py +1329 -0
  87. Cython/Compiler/UFuncs.py +311 -0
  88. Cython/Compiler/UtilNodes.py +413 -0
  89. Cython/Compiler/UtilityCode.py +348 -0
  90. Cython/Compiler/Version.py +8 -0
  91. Cython/Compiler/Visitor.cp315-win_amd64.pyd +0 -0
  92. Cython/Compiler/Visitor.pxd +53 -0
  93. Cython/Compiler/Visitor.py +864 -0
  94. Cython/Compiler/__init__.py +1 -0
  95. Cython/Coverage.py +448 -0
  96. Cython/Debugger/Cygdb.py +177 -0
  97. Cython/Debugger/DebugWriter.py +82 -0
  98. Cython/Debugger/Tests/TestLibCython.py +280 -0
  99. Cython/Debugger/Tests/__init__.py +1 -0
  100. Cython/Debugger/Tests/cfuncs.c +8 -0
  101. Cython/Debugger/Tests/codefile +49 -0
  102. Cython/Debugger/Tests/test_libcython_in_gdb.py +580 -0
  103. Cython/Debugger/Tests/test_libpython_in_gdb.py +90 -0
  104. Cython/Debugger/__init__.py +1 -0
  105. Cython/Debugger/libcython.py +1548 -0
  106. Cython/Debugger/libpython.py +2821 -0
  107. Cython/Debugging.py +20 -0
  108. Cython/Distutils/__init__.py +2 -0
  109. Cython/Distutils/build_ext.py +139 -0
  110. Cython/Distutils/extension.py +96 -0
  111. Cython/Distutils/old_build_ext.py +351 -0
  112. Cython/Includes/cpython/__init__.pxd +173 -0
  113. Cython/Includes/cpython/array.pxd +152 -0
  114. Cython/Includes/cpython/bool.pxd +37 -0
  115. Cython/Includes/cpython/buffer.pxd +112 -0
  116. Cython/Includes/cpython/bytearray.pxd +33 -0
  117. Cython/Includes/cpython/bytes.pxd +200 -0
  118. Cython/Includes/cpython/cellobject.pxd +35 -0
  119. Cython/Includes/cpython/ceval.pxd +8 -0
  120. Cython/Includes/cpython/codecs.pxd +121 -0
  121. Cython/Includes/cpython/complex.pxd +60 -0
  122. Cython/Includes/cpython/contextvars.pxd +145 -0
  123. Cython/Includes/cpython/conversion.pxd +36 -0
  124. Cython/Includes/cpython/datetime.pxd +395 -0
  125. Cython/Includes/cpython/descr.pxd +26 -0
  126. Cython/Includes/cpython/dict.pxd +268 -0
  127. Cython/Includes/cpython/exc.pxd +263 -0
  128. Cython/Includes/cpython/fileobject.pxd +57 -0
  129. Cython/Includes/cpython/float.pxd +56 -0
  130. Cython/Includes/cpython/frozendict.pxd +37 -0
  131. Cython/Includes/cpython/function.pxd +65 -0
  132. Cython/Includes/cpython/genobject.pxd +25 -0
  133. Cython/Includes/cpython/getargs.pxd +12 -0
  134. Cython/Includes/cpython/instance.pxd +25 -0
  135. Cython/Includes/cpython/iterator.pxd +36 -0
  136. Cython/Includes/cpython/iterobject.pxd +24 -0
  137. Cython/Includes/cpython/list.pxd +144 -0
  138. Cython/Includes/cpython/long.pxd +180 -0
  139. Cython/Includes/cpython/longintrepr.pxd +14 -0
  140. Cython/Includes/cpython/mapping.pxd +63 -0
  141. Cython/Includes/cpython/marshal.pxd +66 -0
  142. Cython/Includes/cpython/mem.pxd +120 -0
  143. Cython/Includes/cpython/memoryview.pxd +50 -0
  144. Cython/Includes/cpython/method.pxd +49 -0
  145. Cython/Includes/cpython/module.pxd +208 -0
  146. Cython/Includes/cpython/number.pxd +258 -0
  147. Cython/Includes/cpython/object.pxd +430 -0
  148. Cython/Includes/cpython/pycapsule.pxd +143 -0
  149. Cython/Includes/cpython/pylifecycle.pxd +68 -0
  150. Cython/Includes/cpython/pyport.pxd +8 -0
  151. Cython/Includes/cpython/pystate.pxd +95 -0
  152. Cython/Includes/cpython/pythread.pxd +53 -0
  153. Cython/Includes/cpython/ref.pxd +141 -0
  154. Cython/Includes/cpython/sentinel.pxd +17 -0
  155. Cython/Includes/cpython/sequence.pxd +134 -0
  156. Cython/Includes/cpython/set.pxd +119 -0
  157. Cython/Includes/cpython/slice.pxd +70 -0
  158. Cython/Includes/cpython/time.pxd +129 -0
  159. Cython/Includes/cpython/tuple.pxd +72 -0
  160. Cython/Includes/cpython/type.pxd +146 -0
  161. Cython/Includes/cpython/unicode.pxd +639 -0
  162. Cython/Includes/cpython/version.pxd +32 -0
  163. Cython/Includes/cpython/weakref.pxd +78 -0
  164. Cython/Includes/libc/__init__.pxd +1 -0
  165. Cython/Includes/libc/complex.pxd +35 -0
  166. Cython/Includes/libc/errno.pxd +127 -0
  167. Cython/Includes/libc/float.pxd +43 -0
  168. Cython/Includes/libc/limits.pxd +28 -0
  169. Cython/Includes/libc/locale.pxd +46 -0
  170. Cython/Includes/libc/math.pxd +209 -0
  171. Cython/Includes/libc/setjmp.pxd +10 -0
  172. Cython/Includes/libc/signal.pxd +64 -0
  173. Cython/Includes/libc/stddef.pxd +9 -0
  174. Cython/Includes/libc/stdint.pxd +105 -0
  175. Cython/Includes/libc/stdio.pxd +80 -0
  176. Cython/Includes/libc/stdlib.pxd +72 -0
  177. Cython/Includes/libc/string.pxd +50 -0
  178. Cython/Includes/libc/threads.pxd +234 -0
  179. Cython/Includes/libc/time.pxd +52 -0
  180. Cython/Includes/libcpp/__init__.pxd +4 -0
  181. Cython/Includes/libcpp/algorithm.pxd +320 -0
  182. Cython/Includes/libcpp/any.pxd +16 -0
  183. Cython/Includes/libcpp/atomic.pxd +59 -0
  184. Cython/Includes/libcpp/barrier.pxd +22 -0
  185. Cython/Includes/libcpp/bit.pxd +29 -0
  186. Cython/Includes/libcpp/cast.pxd +12 -0
  187. Cython/Includes/libcpp/cmath.pxd +518 -0
  188. Cython/Includes/libcpp/complex.pxd +106 -0
  189. Cython/Includes/libcpp/condition_variable.pxd +322 -0
  190. Cython/Includes/libcpp/deque.pxd +165 -0
  191. Cython/Includes/libcpp/exception.pxd +216 -0
  192. Cython/Includes/libcpp/execution.pxd +15 -0
  193. Cython/Includes/libcpp/forward_list.pxd +63 -0
  194. Cython/Includes/libcpp/functional.pxd +26 -0
  195. Cython/Includes/libcpp/future.pxd +103 -0
  196. Cython/Includes/libcpp/iterator.pxd +34 -0
  197. Cython/Includes/libcpp/latch.pxd +17 -0
  198. Cython/Includes/libcpp/limits.pxd +61 -0
  199. Cython/Includes/libcpp/list.pxd +117 -0
  200. Cython/Includes/libcpp/map.pxd +252 -0
  201. Cython/Includes/libcpp/memory.pxd +115 -0
  202. Cython/Includes/libcpp/mutex.pxd +387 -0
  203. Cython/Includes/libcpp/numbers.pxd +15 -0
  204. Cython/Includes/libcpp/numeric.pxd +131 -0
  205. Cython/Includes/libcpp/optional.pxd +34 -0
  206. Cython/Includes/libcpp/pair.pxd +1 -0
  207. Cython/Includes/libcpp/queue.pxd +25 -0
  208. Cython/Includes/libcpp/random.pxd +166 -0
  209. Cython/Includes/libcpp/semaphore.pxd +43 -0
  210. Cython/Includes/libcpp/set.pxd +228 -0
  211. Cython/Includes/libcpp/shared_mutex.pxd +96 -0
  212. Cython/Includes/libcpp/span.pxd +87 -0
  213. Cython/Includes/libcpp/stack.pxd +11 -0
  214. Cython/Includes/libcpp/stop_token.pxd +117 -0
  215. Cython/Includes/libcpp/string.pxd +355 -0
  216. Cython/Includes/libcpp/string_view.pxd +183 -0
  217. Cython/Includes/libcpp/typeindex.pxd +15 -0
  218. Cython/Includes/libcpp/typeinfo.pxd +10 -0
  219. Cython/Includes/libcpp/unordered_map.pxd +193 -0
  220. Cython/Includes/libcpp/unordered_set.pxd +152 -0
  221. Cython/Includes/libcpp/utility.pxd +30 -0
  222. Cython/Includes/libcpp/vector.pxd +186 -0
  223. Cython/Includes/numpy/math.pxd +150 -0
  224. Cython/Includes/openmp.pxd +50 -0
  225. Cython/Includes/posix/__init__.pxd +1 -0
  226. Cython/Includes/posix/dlfcn.pxd +14 -0
  227. Cython/Includes/posix/fcntl.pxd +86 -0
  228. Cython/Includes/posix/ioctl.pxd +4 -0
  229. Cython/Includes/posix/mman.pxd +101 -0
  230. Cython/Includes/posix/resource.pxd +57 -0
  231. Cython/Includes/posix/select.pxd +21 -0
  232. Cython/Includes/posix/signal.pxd +73 -0
  233. Cython/Includes/posix/stat.pxd +98 -0
  234. Cython/Includes/posix/stdio.pxd +37 -0
  235. Cython/Includes/posix/stdlib.pxd +29 -0
  236. Cython/Includes/posix/strings.pxd +9 -0
  237. Cython/Includes/posix/time.pxd +71 -0
  238. Cython/Includes/posix/types.pxd +30 -0
  239. Cython/Includes/posix/uio.pxd +26 -0
  240. Cython/Includes/posix/unistd.pxd +271 -0
  241. Cython/Includes/posix/wait.pxd +38 -0
  242. Cython/LZSS.py +170 -0
  243. Cython/Plex/Actions.cp315-win_amd64.pyd +0 -0
  244. Cython/Plex/Actions.pxd +24 -0
  245. Cython/Plex/Actions.py +119 -0
  246. Cython/Plex/DFA.cp315-win_amd64.pyd +0 -0
  247. Cython/Plex/DFA.pxd +14 -0
  248. Cython/Plex/DFA.py +164 -0
  249. Cython/Plex/Errors.py +48 -0
  250. Cython/Plex/Lexicons.py +178 -0
  251. Cython/Plex/Machines.cp315-win_amd64.pyd +0 -0
  252. Cython/Plex/Machines.pxd +36 -0
  253. Cython/Plex/Machines.py +238 -0
  254. Cython/Plex/Regexps.py +535 -0
  255. Cython/Plex/Scanners.cp315-win_amd64.pyd +0 -0
  256. Cython/Plex/Scanners.pxd +45 -0
  257. Cython/Plex/Scanners.py +328 -0
  258. Cython/Plex/Transitions.cp315-win_amd64.pyd +0 -0
  259. Cython/Plex/Transitions.pxd +14 -0
  260. Cython/Plex/Transitions.py +239 -0
  261. Cython/Plex/__init__.py +34 -0
  262. Cython/Runtime/__init__.py +1 -0
  263. Cython/Runtime/refnanny.cp315-win_amd64.pyd +0 -0
  264. Cython/Runtime/refnanny.pyx +237 -0
  265. Cython/Shadow.py +1167 -0
  266. Cython/StringIOTree.cp315-win_amd64.pyd +0 -0
  267. Cython/StringIOTree.py +169 -0
  268. Cython/Tempita/__init__.py +4 -0
  269. Cython/Tempita/_looper.py +154 -0
  270. Cython/Tempita/_tempita.cp315-win_amd64.pyd +0 -0
  271. Cython/Tempita/_tempita.py +1087 -0
  272. Cython/TestUtils.py +464 -0
  273. Cython/Tests/TestCodeWriter.py +128 -0
  274. Cython/Tests/TestCythonUtils.py +202 -0
  275. Cython/Tests/TestJediTyper.py +223 -0
  276. Cython/Tests/TestShadow.py +110 -0
  277. Cython/Tests/TestStringIOTree.py +68 -0
  278. Cython/Tests/TestTestUtils.py +89 -0
  279. Cython/Tests/__init__.py +1 -0
  280. Cython/Tests/xmlrunner.py +390 -0
  281. Cython/Utility/AsyncGen.c +1073 -0
  282. Cython/Utility/Buffer.c +866 -0
  283. Cython/Utility/BufferFormatFromTypeInfo.pxd +2 -0
  284. Cython/Utility/Builtins.c +933 -0
  285. Cython/Utility/CConvert.pyx +149 -0
  286. Cython/Utility/CMath.c +104 -0
  287. Cython/Utility/CommonStructures.c +244 -0
  288. Cython/Utility/Complex.c +378 -0
  289. Cython/Utility/Coroutine.c +2337 -0
  290. Cython/Utility/CpdefEnums.pyx +107 -0
  291. Cython/Utility/CppConvert.pyx +282 -0
  292. Cython/Utility/CppSupport.cpp +151 -0
  293. Cython/Utility/CythonFunction.c +2072 -0
  294. Cython/Utility/Dataclasses.c +101 -0
  295. Cython/Utility/Embed.c +129 -0
  296. Cython/Utility/Exceptions.c +1038 -0
  297. Cython/Utility/ExtensionTypes.c +1158 -0
  298. Cython/Utility/FunctionArguments.c +1045 -0
  299. Cython/Utility/FusedFunction.pyx +44 -0
  300. Cython/Utility/ImportExport.c +930 -0
  301. Cython/Utility/MatchCase.c +979 -0
  302. Cython/Utility/MatchCase_Cy.pyx +12 -0
  303. Cython/Utility/MemoryView.pxd +108 -0
  304. Cython/Utility/MemoryView.pyx +1499 -0
  305. Cython/Utility/MemoryView_C.c +1056 -0
  306. Cython/Utility/ModuleSetupCode.c +3352 -0
  307. Cython/Utility/NumpyImportArray.c +46 -0
  308. Cython/Utility/ObjectHandling.c +3372 -0
  309. Cython/Utility/Optimize.c +2563 -0
  310. Cython/Utility/Overflow.c +378 -0
  311. Cython/Utility/Profile.c +736 -0
  312. Cython/Utility/StringTools.c +1414 -0
  313. Cython/Utility/Synchronization.c +438 -0
  314. Cython/Utility/TString.c +369 -0
  315. Cython/Utility/TestCyUtilityLoader.pyx +8 -0
  316. Cython/Utility/TestCythonScope.pyx +75 -0
  317. Cython/Utility/TestUtilityLoader.c +12 -0
  318. Cython/Utility/TypeConversion.c +1556 -0
  319. Cython/Utility/UFuncs.pyx +50 -0
  320. Cython/Utility/UFuncs_C.c +89 -0
  321. Cython/Utility/__init__.py +28 -0
  322. Cython/Utility/arrayarray.h +172 -0
  323. Cython/Utils.cp315-win_amd64.pyd +0 -0
  324. Cython/Utils.py +677 -0
  325. Cython/__init__.py +12 -0
  326. Cython/py.typed +0 -0
  327. cython-3.3.0a1.dist-info/METADATA +394 -0
  328. cython-3.3.0a1.dist-info/RECORD +335 -0
  329. cython-3.3.0a1.dist-info/WHEEL +5 -0
  330. cython-3.3.0a1.dist-info/entry_points.txt +4 -0
  331. cython-3.3.0a1.dist-info/top_level.txt +3 -0
  332. cython.py +29 -0
  333. pyximport/__init__.py +4 -0
  334. pyximport/pyxbuild.py +160 -0
  335. pyximport/pyximport.py +482 -0
@@ -0,0 +1,720 @@
1
+ # cython: infer_types=True
2
+ #
3
+ # Cython Scanner
4
+ #
5
+
6
+
7
+ import cython
8
+
9
+ cython.declare(make_lexicon=object, lexicon=object,
10
+ print_function=object, error=object, warning=object,
11
+ os=object, platform=object, Path=object)
12
+
13
+ import os
14
+ import platform
15
+ from contextlib import contextmanager
16
+ from pathlib import Path
17
+ from unicodedata import normalize
18
+
19
+ from .. import Utils
20
+ from ..Plex.Errors import UnrecognizedInput
21
+ from ..Plex.Scanners import Scanner
22
+ from .Errors import error, warning, hold_errors, release_errors, CompileError
23
+ from .Lexicon import any_string_prefix, ft_string_prefixes, make_lexicon, IDENT
24
+ from .Future import print_function
25
+ from .Lexicon import IDENT, any_string_prefix, make_lexicon
26
+
27
+ debug_scanner = 0
28
+ trace_scanner = 0
29
+ scanner_debug_flags = 0
30
+ scanner_dump_file = None
31
+
32
+ lexicon = None
33
+
34
+
35
+ def get_lexicon():
36
+ global lexicon
37
+ if not lexicon:
38
+ lexicon = make_lexicon()
39
+ return lexicon
40
+
41
+
42
+ #------------------------------------------------------------------
43
+
44
+ py_reserved_words = [
45
+ "global", "nonlocal", "def", "class", "print", "del", "pass", "break",
46
+ "continue", "return", "raise", "import", "exec", "try",
47
+ "except", "finally", "while", "if", "elif", "else", "for",
48
+ "in", "assert", "and", "or", "not", "is", "lambda",
49
+ "from", "yield", "with",
50
+ ]
51
+
52
+ pyx_reserved_words = py_reserved_words + [
53
+ "include", "ctypedef", "cdef", "cpdef",
54
+ "cimport", "DEF", "IF", "ELIF", "ELSE"
55
+ ]
56
+
57
+
58
+ #------------------------------------------------------------------
59
+
60
+ class CompileTimeScope:
61
+
62
+ def __init__(self, outer=None):
63
+ self.entries = {}
64
+ self.outer = outer
65
+
66
+ def declare(self, name, value):
67
+ self.entries[name] = value
68
+
69
+ def update(self, other):
70
+ self.entries.update(other)
71
+
72
+ def lookup_here(self, name):
73
+ return self.entries[name]
74
+
75
+ def __contains__(self, name):
76
+ return name in self.entries
77
+
78
+ def lookup(self, name):
79
+ try:
80
+ return self.lookup_here(name)
81
+ except KeyError:
82
+ outer = self.outer
83
+ if outer:
84
+ return outer.lookup(name)
85
+ else:
86
+ raise
87
+
88
+
89
+ def initial_compile_time_env():
90
+ benv = CompileTimeScope()
91
+ names = ('UNAME_SYSNAME', 'UNAME_NODENAME', 'UNAME_RELEASE', 'UNAME_VERSION', 'UNAME_MACHINE')
92
+ for name, value in zip(names, platform.uname()):
93
+ benv.declare(name, value)
94
+ import builtins
95
+
96
+ names = (
97
+ 'False', 'True',
98
+ 'abs', 'all', 'any', 'ascii', 'bin', 'bool', 'bytearray', 'bytes',
99
+ 'chr', 'complex', 'dict', 'divmod', 'enumerate', 'filter',
100
+ 'float', 'format', 'frozenset', 'hash', 'hex', 'int', 'len',
101
+ 'list', 'map', 'max', 'min', 'next', 'oct', 'ord', 'pow', 'range',
102
+ 'repr', 'reversed', 'round', 'set', 'slice', 'sorted', 'str',
103
+ 'sum', 'tuple', 'zip',
104
+ ### defined below in a platform independent way
105
+ # 'long', 'unicode', 'reduce', 'xrange'
106
+ )
107
+
108
+ for name in names:
109
+ benv.declare(name, getattr(builtins, name))
110
+
111
+ # legacy Py2 names
112
+ from functools import reduce
113
+ benv.declare('reduce', reduce)
114
+ benv.declare('unicode', str)
115
+ benv.declare('long', int)
116
+ benv.declare('xrange', range)
117
+
118
+ denv = CompileTimeScope(benv)
119
+ return denv
120
+
121
+
122
+ #------------------------------------------------------------------
123
+
124
+ class SourceDescriptor:
125
+ """
126
+ A SourceDescriptor should be considered immutable.
127
+ """
128
+ filename = None
129
+ in_utility_code = False
130
+
131
+ _file_type = 'pyx'
132
+
133
+ _escaped_description = None
134
+ _cmp_name = ''
135
+ def __str__(self):
136
+ assert False # To catch all places where a descriptor is used directly as a filename
137
+
138
+ def set_file_type_from_name(self, filename):
139
+ name, ext = os.path.splitext(filename)
140
+ self._file_type = ext in ('.pyx', '.pxd', '.py') and ext[1:] or 'pyx'
141
+
142
+ def is_cython_file(self):
143
+ return self._file_type in ('pyx', 'pxd')
144
+
145
+ def is_python_file(self):
146
+ return self._file_type == 'py'
147
+
148
+ def get_escaped_description(self):
149
+ if self._escaped_description is None:
150
+ # Use forward slashes on Windows since these paths
151
+ # will be used in the #line directives in the C/C++ files.
152
+ self._escaped_description = self.get_description().replace('\\', '/')
153
+ return self._escaped_description
154
+
155
+ def __gt__(self, other):
156
+ # this is only used to provide some sort of order
157
+ try:
158
+ return self._cmp_name > other._cmp_name
159
+ except AttributeError:
160
+ return False
161
+
162
+ def __lt__(self, other):
163
+ # this is only used to provide some sort of order
164
+ try:
165
+ return self._cmp_name < other._cmp_name
166
+ except AttributeError:
167
+ return False
168
+
169
+ def __le__(self, other):
170
+ # this is only used to provide some sort of order
171
+ try:
172
+ return self._cmp_name <= other._cmp_name
173
+ except AttributeError:
174
+ return False
175
+
176
+ def __copy__(self):
177
+ return self # immutable, no need to copy
178
+
179
+ def __deepcopy__(self, memo):
180
+ return self # immutable, no need to copy
181
+
182
+
183
+ class FileSourceDescriptor(SourceDescriptor):
184
+ """
185
+ Represents a code source. A code source is a more generic abstraction
186
+ for a "filename" (as sometimes the code doesn't come from a file).
187
+ Instances of code sources are passed to Scanner.__init__ as the
188
+ optional name argument and will be passed back when asking for
189
+ the position()-tuple.
190
+ """
191
+ def __init__(self, filename, path_description=None):
192
+ filename = Utils.decode_filename(filename)
193
+ self.filename = filename
194
+ self.path_description = path_description or filename
195
+ try:
196
+ self._short_path_description = os.path.relpath(self.path_description)
197
+ except ValueError:
198
+ # path not under current directory => use complete file path
199
+ self._short_path_description = self.path_description
200
+ # Prefer relative paths to current directory (which is most likely the project root) over absolute paths.
201
+ workdir = os.path.abspath('.') + os.sep
202
+ self.file_path = filename[len(workdir):] if filename.startswith(workdir) else filename
203
+ self.set_file_type_from_name(filename)
204
+ self._cmp_name = filename
205
+ self._lines = {}
206
+
207
+ def get_lines(self, encoding=None, error_handling=None):
208
+ # we cache the lines only the second time this is called, in
209
+ # order to save memory when they are only used once
210
+ key = (encoding, error_handling)
211
+ lines = self._lines.get(key)
212
+ if lines is not None:
213
+ return lines
214
+
215
+ with self.get_file_object(encoding=encoding, error_handling=error_handling) as f:
216
+ lines = [line.rstrip() for line in f.readlines()]
217
+
218
+ # Do not cache the first access, but add the key to remember that we already read it once.
219
+ self._lines[key] = lines if key in self._lines else None
220
+ return lines
221
+
222
+ def get_file_object(self, encoding=None, error_handling=None):
223
+ return Utils.open_source_file(self.filename, encoding, error_handling)
224
+
225
+ def get_description(self):
226
+ return self._short_path_description
227
+
228
+ def get_relative_path(self) -> Path:
229
+ file_path = Path(self.file_path)
230
+ if file_path.is_absolute():
231
+ return Path(self.get_description())
232
+ else:
233
+ return file_path
234
+
235
+ def get_error_description(self):
236
+ path = self.filename
237
+ cwd = Utils.decode_filename(os.getcwd() + os.path.sep)
238
+ if path.startswith(cwd):
239
+ return path[len(cwd):]
240
+ return path
241
+
242
+ def get_filenametable_entry(self):
243
+ return self.file_path
244
+
245
+ def __eq__(self, other):
246
+ return isinstance(other, FileSourceDescriptor) and self.filename == other.filename
247
+
248
+ def __hash__(self):
249
+ return hash(self.filename)
250
+
251
+ def __repr__(self):
252
+ return "<FileSourceDescriptor:%s>" % self.filename
253
+
254
+
255
+ class StringSourceDescriptor(SourceDescriptor):
256
+ """
257
+ Instances of this class can be used instead of a filenames if the
258
+ code originates from a string object.
259
+ """
260
+ def __init__(self, name, code):
261
+ self.name = name
262
+ #self.set_file_type_from_name(name)
263
+ self.codelines = [line.rstrip() for line in code.splitlines()]
264
+ self._cmp_name = name
265
+
266
+ def get_lines(self, encoding=None, error_handling=None):
267
+ if not encoding:
268
+ return self.codelines
269
+ else:
270
+ return [line.encode(encoding, error_handling).decode(encoding)
271
+ for line in self.codelines]
272
+
273
+ def get_description(self):
274
+ return self.name
275
+
276
+ def get_relative_path(self):
277
+ return Path(self.get_description())
278
+
279
+ get_error_description = get_description
280
+
281
+ def get_filenametable_entry(self):
282
+ return "<stringsource>"
283
+
284
+ def __hash__(self):
285
+ return id(self)
286
+ # Do not hash on the name, an identical string source should be the
287
+ # same object (name is often defaulted in other places)
288
+ # return hash(self.name)
289
+
290
+ def __eq__(self, other):
291
+ return isinstance(other, StringSourceDescriptor) and self.name == other.name
292
+
293
+ def __repr__(self):
294
+ return "<StringSourceDescriptor:%s>" % self.name
295
+
296
+
297
+ class SharedUtilitySourceDescriptor(FileSourceDescriptor):
298
+ """
299
+ A specialized source descriptor for shared utility code only. Not part of public API.
300
+ """
301
+
302
+ def get_file_object(self, encoding=None, error_handling=None):
303
+ from io import StringIO
304
+ return StringIO('')
305
+
306
+ #------------------------------------------------------------------
307
+
308
+ class PyrexScanner(Scanner):
309
+ # context Context Compilation context
310
+ # included_files [string] Files included with 'include' statement
311
+ # compile_time_env dict Environment for conditional compilation
312
+ # compile_time_eval boolean In a true conditional compilation context
313
+ # compile_time_expr boolean In a compile-time expression context
314
+ # put_back_on_failure list or None If set, this records states so the tentatively_scan
315
+ # contextmanager can restore it
316
+
317
+ def __init__(self, file, filename, parent_scanner=None,
318
+ scope=None, context=None, source_encoding=None, parse_comments=True, initial_pos=None):
319
+ Scanner.__init__(self, get_lexicon(), file, filename, initial_pos)
320
+
321
+ if filename.is_python_file():
322
+ self.in_python_file = True
323
+ keywords = py_reserved_words
324
+ else:
325
+ self.in_python_file = False
326
+ keywords = pyx_reserved_words
327
+ self.keywords = {keyword: keyword for keyword in keywords}
328
+
329
+ self.async_enabled = 0
330
+
331
+ if parent_scanner:
332
+ self.context = parent_scanner.context
333
+ self.included_files = parent_scanner.included_files
334
+ self.compile_time_env = parent_scanner.compile_time_env
335
+ self.compile_time_eval = parent_scanner.compile_time_eval
336
+ self.compile_time_expr = parent_scanner.compile_time_expr
337
+
338
+ if parent_scanner.async_enabled:
339
+ self.enter_async()
340
+ else:
341
+ self.context = context
342
+ self.included_files = scope.included_files
343
+ self.compile_time_env = initial_compile_time_env()
344
+ self.compile_time_eval = 1
345
+ self.compile_time_expr = 0
346
+ if getattr(context.options, 'compile_time_env', None):
347
+ self.compile_time_env.update(context.options.compile_time_env)
348
+ self.parse_comments = parse_comments
349
+ self.source_encoding = source_encoding
350
+ self.trace = trace_scanner
351
+ self.indentation_stack = [0]
352
+ self.indentation_char = '\0'
353
+ self.bracket_nesting_level = 0
354
+ # fstrings/tstrings
355
+ self.ft_string_state_stack = []
356
+ self.in_ft_string_expr_prescan = 0
357
+
358
+ self.put_back_on_failure = None
359
+
360
+ self.begin('INDENT')
361
+ self.sy = ''
362
+ self.next()
363
+
364
+ def normalize_ident(self, text):
365
+ if not text.isascii():
366
+ text = normalize('NFKC', text)
367
+ self.produce(IDENT, text)
368
+
369
+ def commentline(self, text):
370
+ if self.parse_comments:
371
+ self.produce('commentline', text)
372
+
373
+ def strip_underscores(self, text, symbol):
374
+ self.produce(symbol, text.replace('_', ''))
375
+
376
+ def current_level(self):
377
+ return self.indentation_stack[-1]
378
+
379
+ def open_bracket_action(self, text):
380
+ self.bracket_nesting_level += 1
381
+ return text
382
+
383
+ def close_bracket_action(self, text):
384
+ self.bracket_nesting_level -= 1
385
+ if (self.ft_string_state_stack and
386
+ self.ft_string_state_stack[-1].bracket_nesting_level() > self.bracket_nesting_level):
387
+ self.error_at_scanpos(f"Unmatched '{text}'")
388
+ return text
389
+
390
+ def open_brace_action(self, text):
391
+ return self.open_bracket_action(text)
392
+
393
+ def close_brace_action(self, text):
394
+ assert text == '}'
395
+ if (self.ft_string_state_stack and
396
+ self.ft_string_state_stack[-1].bracket_nesting_level() == self.bracket_nesting_level):
397
+ if not self.ft_string_state_stack[-1].in_format_specifier():
398
+ self.in_ft_string_expr_prescan -= 1
399
+ if self.in_ft_string_expr_prescan == 0:
400
+ self.produce("END_FT_STRING_EXPR")
401
+ self.begin(self.ft_string_state_stack[-1].scanner_state)
402
+ self.ft_string_state_stack[-1].pop_bracket_state()
403
+ self.bracket_nesting_level -= 1
404
+ return text
405
+
406
+ def colon_action(self, text):
407
+ if (self.ft_string_state_stack and
408
+ self.ft_string_state_stack[-1].bracket_nesting_level() == self.bracket_nesting_level):
409
+ self.in_ft_string_expr_prescan -= 1
410
+ if self.in_ft_string_expr_prescan == 0:
411
+ self.produce("END_FT_STRING_EXPR")
412
+ self.begin(self.ft_string_state_stack[-1].scanner_state)
413
+ self.ft_string_state_stack[-1].set_in_format_specifier()
414
+ return text
415
+
416
+ def newline_action(self, text):
417
+ if self.bracket_nesting_level == 0:
418
+ self.begin('INDENT')
419
+ self.produce('NEWLINE', '')
420
+
421
+ string_states = {
422
+ "'": 'SQ_STRING',
423
+ '"': 'DQ_STRING',
424
+ "'''": 'TSQ_STRING',
425
+ '"""': 'TDQ_STRING'
426
+ }
427
+
428
+ def begin_string_action(self, text: str):
429
+ while text and text[0] in any_string_prefix:
430
+ text = text[1:]
431
+ self.begin(self.string_states[text])
432
+ self.produce('BEGIN_STRING')
433
+
434
+ def end_string_action(self, text):
435
+ self.begin('FT_STRING_EXPR_PRESCAN' if self.in_ft_string_expr_prescan else '')
436
+ self.produce('END_STRING')
437
+
438
+ def begin_ft_string_action(self, text):
439
+ is_raw = 'r' in text or 'R' in text
440
+ while text and (text[0] in any_string_prefix or text[0] in ft_string_prefixes):
441
+ text = text[1:]
442
+ ft_string_state = f'{self.string_states[text]}_FT{"R" if is_raw else ""}'
443
+ self.ft_string_state_stack.append(
444
+ FTStringState(ft_string_state)
445
+ )
446
+ self.begin(ft_string_state)
447
+ self.produce('BEGIN_FT_STRING')
448
+
449
+ def end_ft_string_action(self, text):
450
+ self.ft_string_state_stack.pop()
451
+ self.begin('FT_STRING_EXPR_PRESCAN' if self.in_ft_string_expr_prescan else '')
452
+ self.produce('END_FT_STRING')
453
+
454
+ def _handle_open_single_ft_string_brace(self, started_ft_string_expr):
455
+ self.bracket_nesting_level += 1
456
+ if not started_ft_string_expr:
457
+ self.ft_string_state_stack[-1].push_bracket_state(self.bracket_nesting_level)
458
+ self.begin('FT_STRING_EXPR_PRESCAN')
459
+ self.in_ft_string_expr_prescan += 1
460
+ self.produce('{')
461
+
462
+ def open_ft_string_brace_action(self, text):
463
+ len_text = len(text)
464
+ started_ft_string_expr = False
465
+ if self.ft_string_state_stack[-1].in_format_specifier():
466
+ self._handle_open_single_ft_string_brace(started_ft_string_expr)
467
+ len_text -= 1
468
+ started_ft_string_expr = True
469
+ assert not self.ft_string_state_stack[-1].in_format_specifier()
470
+
471
+ double_braces = len_text // 2
472
+ for _ in range(double_braces):
473
+ self.produce('CHARS', '{')
474
+ len_text -= (double_braces*2)
475
+
476
+ if len_text:
477
+ assert len_text == 1
478
+ self._handle_open_single_ft_string_brace(started_ft_string_expr)
479
+
480
+ def _handle_close_single_ft_string_brace(self):
481
+ ft_string_bracket_level = self.ft_string_state_stack[-1].bracket_nesting_level()
482
+ if ft_string_bracket_level is None or self.bracket_nesting_level < ft_string_bracket_level:
483
+ # To help try to parse a little further, don't reduce the bracket
484
+ # nesting level more.
485
+ self.error(
486
+ # Unfortunately the scanner doesn't know which
487
+ "f-string or t-string: single '}' is not allowed",
488
+ pos=self.get_current_scan_pos(),
489
+ fatal=False)
490
+ self.produce('}', '}')
491
+ else:
492
+ self.produce(self.close_brace_action('}'), '}')
493
+
494
+ def close_ft_string_brace_action(self, text):
495
+ len_text = len(text)
496
+ while len_text and self.ft_string_state_stack[-1].in_format_specifier():
497
+ self._handle_close_single_ft_string_brace()
498
+ len_text -= 1
499
+
500
+ double_braces = len_text // 2
501
+ for _ in range(double_braces):
502
+ self.produce('CHARS', '}')
503
+ len_text -= double_braces*2
504
+
505
+ if len_text:
506
+ self._handle_close_single_ft_string_brace()
507
+
508
+ def unclosed_string_action(self, text):
509
+ self.end_string_action(text)
510
+ self.error_at_scanpos("Unclosed string literal")
511
+
512
+ def indentation_action(self, text: str):
513
+ self.begin('')
514
+ # Indentation within brackets should be ignored.
515
+ #if self.bracket_nesting_level > 0:
516
+ # return
517
+ # Check that tabs and spaces are being used consistently.
518
+ if text:
519
+ c = text[0]
520
+ #print "Scanner.indentation_action: indent with", repr(c) ###
521
+ if self.indentation_char == '\0':
522
+ self.indentation_char = c
523
+ #print "Scanner.indentation_action: setting indent_char to", repr(c)
524
+ else:
525
+ if self.indentation_char != c:
526
+ self.error_at_scanpos("Mixed use of tabs and spaces")
527
+ if text.replace(c, "") != "":
528
+ self.error_at_scanpos("Mixed use of tabs and spaces")
529
+ # Figure out how many indents/dedents to do
530
+ current_level: cython.Py_ssize_t = self.current_level()
531
+ new_level: cython.Py_ssize_t = len(text)
532
+ #print "Changing indent level from", current_level, "to", new_level ###
533
+ if new_level == current_level:
534
+ return
535
+ elif new_level > current_level:
536
+ #print "...pushing level", new_level ###
537
+ self.indentation_stack.append(new_level)
538
+ self.produce('INDENT', '')
539
+ else:
540
+ while new_level < self.current_level():
541
+ #print "...popping level", self.indentation_stack[-1] ###
542
+ self.indentation_stack.pop()
543
+ self.produce('DEDENT', '')
544
+ #print "...current level now", self.current_level() ###
545
+ if new_level != self.current_level():
546
+ self.error_at_scanpos("Inconsistent indentation")
547
+
548
+ def eof_action(self, text):
549
+ while len(self.indentation_stack) > 1:
550
+ self.produce('DEDENT', '')
551
+ self.indentation_stack.pop()
552
+ self.produce('EOF', '')
553
+
554
+ def next(self):
555
+ try:
556
+ sy, systring = self.read()
557
+ except UnrecognizedInput:
558
+ self.error_at_scanpos("Unrecognized character")
559
+ return -1 # just a marker, error() always raises
560
+ if sy == IDENT:
561
+ if systring in self.keywords:
562
+ if systring == 'print' and print_function in self.context.future_directives:
563
+ self.keywords.pop('print', None)
564
+ elif systring == 'exec' and self.context.language_level >= 3:
565
+ self.keywords.pop('exec', None)
566
+ else:
567
+ sy = self.keywords[systring] # intern
568
+ systring = self.context.intern_ustring(systring)
569
+ if self.put_back_on_failure is not None:
570
+ self.put_back_on_failure.append((sy, systring, self.position()))
571
+ self.sy = sy
572
+ self.systring = systring
573
+ if False: # debug_scanner:
574
+ _, line, col = self.position()
575
+ if not self.systring or self.sy == self.systring:
576
+ t = self.sy
577
+ else:
578
+ t = "%s %s" % (self.sy, self.systring)
579
+ print("--- %3d %2d %s" % (line, col, t))
580
+
581
+ def peek(self):
582
+ saved = self.sy, self.systring
583
+ saved_pos = self.position()
584
+ self.next()
585
+ next = self.sy, self.systring
586
+ self.unread(self.sy, self.systring, self.position())
587
+ self.sy, self.systring = saved
588
+ self.last_token_position_tuple = saved_pos
589
+ return next
590
+
591
+ def put_back(self, sy, systring, pos):
592
+ self.unread(self.sy, self.systring, self.last_token_position_tuple)
593
+ self.sy = sy
594
+ self.systring = systring
595
+ self.last_token_position_tuple = pos
596
+
597
+ def error(self, message, pos=None, fatal=True):
598
+ if pos is None:
599
+ pos = self.position()
600
+ if self.sy == 'INDENT':
601
+ error(pos, "Possible inconsistent indentation")
602
+ err = error(pos, message)
603
+ if fatal: raise err
604
+
605
+ def error_at_scanpos(self, message):
606
+ # Like error(fatal=True), but gets the current scanning position rather than
607
+ # the position of the last token read.
608
+ pos = self.get_current_scan_pos()
609
+ self.error(message, pos, True)
610
+
611
+ def expect(self, what, message=None):
612
+ if self.sy == what:
613
+ self.next()
614
+ else:
615
+ self.expected(what, message)
616
+
617
+ def expect_keyword(self, what, message=None):
618
+ if self.sy == IDENT and self.systring == what:
619
+ self.next()
620
+ else:
621
+ self.expected(what, message)
622
+
623
+ def expected(self, what, message=None):
624
+ if message:
625
+ self.error(message)
626
+ else:
627
+ if self.sy == IDENT:
628
+ found = self.systring
629
+ else:
630
+ found = self.sy
631
+ self.error("Expected '%s', found '%s'" % (what, found))
632
+
633
+ def expect_indent(self):
634
+ self.expect('INDENT', "Expected an increase in indentation level")
635
+
636
+ def expect_dedent(self):
637
+ self.expect('DEDENT', "Expected a decrease in indentation level")
638
+
639
+ def expect_newline(self, message="Expected a newline", ignore_semicolon=False):
640
+ # Expect either a newline or end of file
641
+ useless_trailing_semicolon = None
642
+ if ignore_semicolon and self.sy == ';':
643
+ useless_trailing_semicolon = self.position()
644
+ self.next()
645
+ if self.sy != 'EOF':
646
+ self.expect('NEWLINE', message)
647
+ if useless_trailing_semicolon is not None:
648
+ warning(useless_trailing_semicolon, "useless trailing semicolon")
649
+
650
+ def enter_async(self):
651
+ self.async_enabled += 1
652
+ if self.async_enabled == 1:
653
+ self.keywords['async'] = 'async'
654
+ self.keywords['await'] = 'await'
655
+
656
+ def exit_async(self):
657
+ assert self.async_enabled > 0
658
+ self.async_enabled -= 1
659
+ if not self.async_enabled:
660
+ del self.keywords['await']
661
+ del self.keywords['async']
662
+ if self.sy in ('async', 'await'):
663
+ self.sy, self.systring = IDENT, self.context.intern_ustring(self.sy)
664
+
665
+ @contextmanager
666
+ def tentatively_scan(scanner: PyrexScanner):
667
+ errors = hold_errors()
668
+ try:
669
+ put_back_on_failure = scanner.put_back_on_failure
670
+ scanner.put_back_on_failure = []
671
+ initial_state = (scanner.sy, scanner.systring, scanner.position())
672
+ try:
673
+ yield errors
674
+ except CompileError:
675
+ pass
676
+ finally:
677
+ if errors:
678
+ if scanner.put_back_on_failure:
679
+ for put_back in reversed(scanner.put_back_on_failure[:-1]):
680
+ scanner.put_back(*put_back)
681
+ # we need to restore the initial state too
682
+ scanner.put_back(*initial_state)
683
+ elif put_back_on_failure is not None:
684
+ # the outer "tentatively_scan" block that we're in might still
685
+ # want to undo this block
686
+ put_back_on_failure.extend(scanner.put_back_on_failure)
687
+ scanner.put_back_on_failure = put_back_on_failure
688
+ finally:
689
+ release_errors(ignore=True)
690
+
691
+
692
+ class FTStringState:
693
+ def __init__(self, scanner_state):
694
+ self.scanner_state = scanner_state
695
+ self.bracket_states = []
696
+
697
+ def bracket_nesting_level(self):
698
+ if not self.bracket_states:
699
+ return None
700
+ return self.bracket_states[-1].bracket_nesting_level
701
+
702
+ def in_format_specifier(self):
703
+ if not self.bracket_states:
704
+ return False
705
+ return self.bracket_states[-1].in_format_specifier
706
+
707
+ def set_in_format_specifier(self):
708
+ self.bracket_states[-1].in_format_specifier = True
709
+
710
+ def push_bracket_state(self, bracket_nesting_level: cython.Py_ssize_t):
711
+ self.bracket_states.append(FTStringBracketState(bracket_nesting_level))
712
+
713
+ def pop_bracket_state(self):
714
+ self.bracket_states.pop()
715
+
716
+
717
+ class FTStringBracketState:
718
+ def __init__(self, bracket_nesting_level: cython.Py_ssize_t):
719
+ self.bracket_nesting_level = bracket_nesting_level
720
+ self.in_format_specifier = False