From 3979e943ed1554c7ef57b476982a7d839a0485dc Mon Sep 17 00:00:00 2001 From: Robert Bradshaw Date: Sat, 27 Sep 2008 14:35:03 -0700 Subject: [PATCH] Implement locals() --- Cython/Compiler/Builtin.py | 1 + Cython/Compiler/Main.py | 3 ++- Cython/Compiler/ParseTreeTransforms.py | 29 ++++++++++++++++++++++++++ tests/run/locals.pyx | 9 ++++++++ 4 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 tests/run/locals.pyx diff --git a/Cython/Compiler/Builtin.py b/Cython/Compiler/Builtin.py index d1f54162..b7d3f1bf 100644 --- a/Cython/Compiler/Builtin.py +++ b/Cython/Compiler/Builtin.py @@ -30,6 +30,7 @@ builtin_function_table = [ ('issubclass', "OO", "b", "PyObject_IsSubclass"), ('iter', "O", "O", "PyObject_GetIter"), ('len', "O", "Z", "PyObject_Length"), + ('locals', "", "O", "__pyx_locals"), #('map', "", "", ""), #('max', "", "", ""), #('min', "", "", ""), diff --git a/Cython/Compiler/Main.py b/Cython/Compiler/Main.py index 6ed7fac6..970fc697 100644 --- a/Cython/Compiler/Main.py +++ b/Cython/Compiler/Main.py @@ -79,7 +79,7 @@ class Context: from ParseTreeTransforms import WithTransform, NormalizeTree, PostParse, PxdPostParse from ParseTreeTransforms import AnalyseDeclarationsTransform, AnalyseExpressionsTransform from ParseTreeTransforms import CreateClosureClasses, MarkClosureVisitor, DecoratorTransform - from ParseTreeTransforms import InterpretCompilerDirectives + from ParseTreeTransforms import InterpretCompilerDirectives, TransformBuiltinMethods from AutoDocTransforms import EmbedSignature from Optimize import FlattenInListTransform, SwitchTransform, FinalOptimizePhase from Buffer import IntroduceBufferAuxiliaryVars @@ -102,6 +102,7 @@ class Context: WithTransform(self), DecoratorTransform(self), AnalyseDeclarationsTransform(self), + TransformBuiltinMethods(self), IntroduceBufferAuxiliaryVars(self), _check_c_classes, AnalyseExpressionsTransform(self), diff --git a/Cython/Compiler/ParseTreeTransforms.py b/Cython/Compiler/ParseTreeTransforms.py index 4d05361f..825265d5 100644 --- a/Cython/Compiler/ParseTreeTransforms.py +++ b/Cython/Compiler/ParseTreeTransforms.py @@ -534,6 +534,7 @@ property NAME: return property class AnalyseExpressionsTransform(CythonTransform): + def visit_ModuleNode(self, node): node.body.analyse_expressions(node.scope) self.visitchildren(node) @@ -591,3 +592,31 @@ class CreateClosureClasses(CythonTransform): return node +class EnvTransform(CythonTransform): + """ + This transformation keeps a stack of the environments. + """ + def __call__(self, root): + self.env_stack = [root.scope] + return super(EnvTransform, self).__call__(root) + + def visit_FuncDefNode(self, node): + self.env_stack.append(node.local_scope) + self.visitchildren(node) + self.env_stack.pop() + return node + + +class TransformBuiltinMethods(EnvTransform): + + def visit_SimpleCallNode(self, node): + self.visitchildren(node) + if isinstance(node.function, ExprNodes.NameNode): + if node.function.name == 'locals': + pos = node.pos + lenv = self.env_stack[-1] + items = [ExprNodes.DictItemNode(pos, + key=ExprNodes.IdentifierStringNode(pos, value=var), + value=ExprNodes.NameNode(pos, name=var)) for var in lenv.entries] + return ExprNodes.DictNode(pos, key_value_pairs=items) + return node diff --git a/tests/run/locals.pyx b/tests/run/locals.pyx new file mode 100644 index 00000000..c25480ac --- /dev/null +++ b/tests/run/locals.pyx @@ -0,0 +1,9 @@ +__doc__ = """ +sage: get_locals(1,2,3) +{'args': (2, 3), 'kwds': {}, 'x': 1, 'y': 'hi', 'z': 5} +""" + +def get_locals(x, *args, **kwds): + y = "hi" + cdef int z = 5 + return locals() -- 2.26.2