def test_string_contains_lone_surrogates(self): self.assertFalse( StringEncoding.string_contains_lone_surrogates(u"abc")) self.assertFalse( StringEncoding.string_contains_lone_surrogates(u"\uABCD")) self.assertFalse( StringEncoding.string_contains_lone_surrogates(u"\N{SNOWMAN}")) # This behaves differently in Py2 when freshly parsed and read from a .pyc file, # but it seems to be a marshalling bug in Py2, which doesn't hurt us in Cython. if sys.version_info[0] != 2: self.assertTrue( StringEncoding.string_contains_lone_surrogates( u"\uD800\uDFFF")) # In Py2 with 16bit Unicode, the following is indistinguishable from the 32bit character. obfuscated_surrogate_pair = (u"\uDFFF" + "\uD800")[::-1] if sys.version_info[0] == 2 and sys.maxunicode == 65565: self.assertFalse( StringEncoding.string_contains_lone_surrogates( obfuscated_surrogate_pair)) else: self.assertTrue( StringEncoding.string_contains_lone_surrogates( obfuscated_surrogate_pair)) self.assertTrue( StringEncoding.string_contains_lone_surrogates(u"\uD800")) self.assertTrue( StringEncoding.string_contains_lone_surrogates(u"\uDFFF")) self.assertTrue( StringEncoding.string_contains_lone_surrogates(u"\uDFFF\uD800")) self.assertTrue( StringEncoding.string_contains_lone_surrogates(u"\uD800x\uDFFF"))
def synthesize_defnodes(self): """ Create the __signatures__ dict of PyCFunctionNode specializations. """ if isinstance(self.nodes[0], CFuncDefNode): nodes = [node.py_func for node in self.nodes] else: nodes = self.nodes signatures = [ StringEncoding.EncodedString(node.specialized_signature_string) for node in nodes ] keys = [ ExprNodes.StringNode(node.pos, value=sig) for node, sig in zip(nodes, signatures) ] values = [ ExprNodes.PyCFunctionNode.from_defnode(node, True) for node in nodes ] self.__signatures__ = ExprNodes.DictNode.from_pairs( self.pos, zip(keys, values)) self.specialized_pycfuncs = values for pycfuncnode in values: pycfuncnode.is_specialization = True
def visit_Constant(self, node): if isinstance(node.value, int): return IntNode(self.loc(node), value=str(node.value)) if isinstance(node.value, float): # We won't have c float, we map floating types to double return FloatNode(self.loc(node), value=str(node.value)) if isinstance(node.value, str): if node.kind == "u": return UnicodeNode(self.loc(node), value=node.value, bytes_value=None) else: return StringNode( self.loc(node), value=node.value, unicode_value=StringEncoding.EncodedString(node.value), ) if ( isinstance(Ellipsis, type) and isinstance(node.value, Ellipsis) or isinstance(node.value, type(Ellipsis)) ): return EllipsisNode(self.loc(node)) if isinstance(node.value, bytes): return BytesNode(self.loc(node), value=node.s) if node.value is None: return NoneNode(self.loc(node)) raise NotImplementedError("Unknown constant value: %s" % node)
def test_string_contains_surrogates(self): self.assertFalse(StringEncoding.string_contains_surrogates(u"abc")) self.assertFalse(StringEncoding.string_contains_surrogates(u"\uABCD")) self.assertFalse( StringEncoding.string_contains_surrogates(u"\N{SNOWMAN}")) self.assertTrue(StringEncoding.string_contains_surrogates(u"\uD800")) self.assertTrue(StringEncoding.string_contains_surrogates(u"\uDFFF")) self.assertTrue( StringEncoding.string_contains_surrogates(u"\uD800\uDFFF")) self.assertTrue( StringEncoding.string_contains_surrogates(u"\uDFFF\uD800")) self.assertTrue( StringEncoding.string_contains_surrogates(u"\uD800x\uDFFF"))
def visit_CallNode(self, node): if isinstance(node.function, ExprNodes.NameNode) and \ node.function.name == u"DAAPObject": # Make sure we only convert DAAPObject(x, y) calls, nothing more. if len(node.args) == 2: code = daap_data.dmap_names[node.args[0].value] itype = daap_data.dmap_code_types[code][1] node.function.name = self.context.intern_ustring( u"SpeedyDAAPObject") node.args[0] = ExprNodes.StringNode( node.pos, value=StringEncoding.BytesLiteral(code)) node.args.insert(1, ExprNodes.IntNode( node.pos, value=str(itype))) # Visit method body. self.visitchildren(node) return node
def visit_Str(self, node): return StringNode( self.loc(node), value=node.s, unicode_value=StringEncoding.EncodedString(node.s), )