| from Cython.Compiler.ModuleNode import ModuleNode |
| from Cython.Compiler.Symtab import ModuleScope |
| from Cython.TestUtils import TransformTest |
| from Cython.Compiler.Visitor import MethodDispatcherTransform |
| from Cython.Compiler.ParseTreeTransforms import ( |
| NormalizeTree, AnalyseDeclarationsTransform, |
| AnalyseExpressionsTransform, InterpretCompilerDirectives) |
| |
| |
| class TestMethodDispatcherTransform(TransformTest): |
| _tree = None |
| |
| def _build_tree(self): |
| if self._tree is None: |
| context = None |
| |
| def fake_module(node): |
| scope = ModuleScope('test', None, None) |
| return ModuleNode(node.pos, doc=None, body=node, |
| scope=scope, full_module_name='test', |
| directive_comments={}) |
| pipeline = [ |
| fake_module, |
| NormalizeTree(context), |
| InterpretCompilerDirectives(context, {}), |
| AnalyseDeclarationsTransform(context), |
| AnalyseExpressionsTransform(context), |
| ] |
| self._tree = self.run_pipeline(pipeline, u""" |
| cdef bytes s = b'asdfg' |
| cdef dict d = {1:2} |
| x = s * 3 |
| d.get('test') |
| """) |
| return self._tree |
| |
| def test_builtin_method(self): |
| calls = [0] |
| class Test(MethodDispatcherTransform): |
| def _handle_simple_method_dict_get(self, node, func, args, unbound): |
| calls[0] += 1 |
| return node |
| |
| tree = self._build_tree() |
| Test(None)(tree) |
| self.assertEqual(1, calls[0]) |
| |
| def test_binop_method(self): |
| calls = {'bytes': 0, 'object': 0} |
| class Test(MethodDispatcherTransform): |
| def _handle_simple_method_bytes___mul__(self, node, func, args, unbound): |
| calls['bytes'] += 1 |
| return node |
| def _handle_simple_method_object___mul__(self, node, func, args, unbound): |
| calls['object'] += 1 |
| return node |
| |
| tree = self._build_tree() |
| Test(None)(tree) |
| self.assertEqual(1, calls['bytes']) |
| self.assertEqual(0, calls['object']) |