def _malloc_string(typingctx, kind, char_bytes, length): """make empty string with data buffer of size alloc_bytes. Must set length and kind values for string after it is returned """ def details(context, builder, signature, args): [kind_val, char_bytes_val, length_val] = args # fill the struct uni_str_ctor = cgutils.create_struct_proxy(types.unicode_type) uni_str = uni_str_ctor(context, builder) # add null padding character nbytes_val = builder.mul(char_bytes_val, builder.add(length_val, Constant(length_val.type, 1))) uni_str.meminfo = context.nrt.meminfo_alloc(builder, nbytes_val) uni_str.kind = kind_val uni_str.length = length_val # empty string has hash value -1 to indicate "need to compute hash" uni_str.hash = context.get_constant(_Py_hash_t, -1) uni_str.data = context.nrt.meminfo_data(builder, uni_str.meminfo) # Set parent to NULL uni_str.parent = cgutils.get_null_value(uni_str.parent.type) return uni_str._getvalue() sig = types.unicode_type(types.int32, types.intp, types.intp) return sig, details
def _malloc_string(typingctx, kind, char_bytes, length): """make empty string with data buffer of size alloc_bytes. Must set length and kind values for string after it is returned """ def details(context, builder, signature, args): [kind_val, char_bytes_val, length_val] = args # fill the struct uni_str_ctor = cgutils.create_struct_proxy(types.unicode_type) uni_str = uni_str_ctor(context, builder) # add null padding character nbytes_val = builder.mul(char_bytes_val, builder.add(length_val, Constant(length_val.type, 1))) uni_str.meminfo = context.nrt.meminfo_alloc(builder, nbytes_val) uni_str.kind = kind_val uni_str.length = length_val uni_str.data = context.nrt.meminfo_data(builder, uni_str.meminfo) # Set parent to NULL uni_str.parent = cgutils.get_null_value(uni_str.parent.type) return uni_str._getvalue() sig = types.unicode_type(types.int32, types.intp, types.intp) return sig, details
def _get_str_slice_view(typingctx, src_t, start_t, length_t): """Create a slice of a unicode string using a view of its data to avoid extra allocation. """ assert src_t == types.unicode_type def codegen(context, builder, sig, args): src, start, length = args in_str = cgutils.create_struct_proxy( types.unicode_type)(context, builder, value=src) view_str = cgutils.create_struct_proxy( types.unicode_type)(context, builder) view_str.meminfo = in_str.meminfo view_str.kind = in_str.kind view_str.is_ascii = in_str.is_ascii view_str.length = length # hash value -1 to indicate "need to compute hash" view_str.hash = context.get_constant(_Py_hash_t, -1) # get a pointer to start of slice data bw_typ = context.typing_context.resolve_value_type(_kind_to_byte_width) bw_sig = bw_typ.get_call_type( context.typing_context, (types.int32,), {}) bw_impl = context.get_function(bw_typ, bw_sig) byte_width = bw_impl(builder, (in_str.kind,)) offset = builder.mul(start, byte_width) view_str.data = builder.gep(in_str.data, [offset]) # Set parent pyobject to NULL view_str.parent = cgutils.get_null_value(view_str.parent.type) # incref original string if context.enable_nrt: context.nrt.incref(builder, sig.args[0], src) return view_str._getvalue() sig = types.unicode_type(types.unicode_type, types.intp, types.intp) return sig, codegen
def _get_str_slice_view(typingctx, src_t, start_t, length_t): """Create a slice of a unicode string using a view of its data to avoid extra allocation. """ assert src_t == types.unicode_type def codegen(context, builder, sig, args): src, start, length = args in_str = cgutils.create_struct_proxy( types.unicode_type)(context, builder, value=src) view_str = cgutils.create_struct_proxy( types.unicode_type)(context, builder) view_str.meminfo = in_str.meminfo view_str.kind = in_str.kind view_str.is_ascii = in_str.is_ascii view_str.length = length # hash value -1 to indicate "need to compute hash" view_str.hash = context.get_constant(_Py_hash_t, -1) # get a pointer to start of slice data bw_typ = context.typing_context.resolve_value_type(_kind_to_byte_width) bw_sig = bw_typ.get_call_type( context.typing_context, (types.int32,), {}) bw_impl = context.get_function(bw_typ, bw_sig) byte_width = bw_impl(builder, (in_str.kind,)) offset = builder.mul(start, byte_width) view_str.data = builder.gep(in_str.data, [offset]) # Set parent pyobject to NULL view_str.parent = cgutils.get_null_value(view_str.parent.type) # incref original string if context.enable_nrt: context.nrt.incref(builder, sig.args[0], src) return view_str._getvalue() sig = types.unicode_type(types.unicode_type, types.intp, types.intp) return sig, codegen
def test_strip(self): STRIP_CASES = [('ass cii', 'ai'), ('ass cii', None), ('asscii', 'ai '), ('asscii ', 'ai '), (' asscii ', 'ai '), (' asscii ', 'asci '), (' asscii ', 's'), (' ', ' '), ('', ' '), ('', ''), (' asscii ', 'ai '), (' asscii ', ''), (' asscii ', None), ('tú quién te crees?', 'étú? '), (' tú quién te crees? ', 'étú? '), (' tú qrees? ', ''), (' tú quién te crees? ', None), ('大处 着眼,小处着手。大大大处', '大处'), (' 大处大处 ', ''), (' 大处大处 ', None)] # form with no parameter for pyfunc, case_name in [(strip_usecase, 'strip'), (lstrip_usecase, 'lstrip'), (rstrip_usecase, 'rstrip')]: cfunc = njit(pyfunc) for string, chars in STRIP_CASES: self.assertEqual(pyfunc(string), cfunc(string), "'%s'.%s()?" % (string, case_name)) # parametrized form for pyfunc, case_name in [(strip_usecase_chars, 'strip'), (lstrip_usecase_chars, 'lstrip'), (rstrip_usecase_chars, 'rstrip')]: cfunc = njit(pyfunc) sig1 = types.unicode_type(types.unicode_type, types.Optional(types.unicode_type)) cfunc_optional = njit([sig1])(pyfunc) def try_compile_bad_optional(*args): bad = types.unicode_type(types.unicode_type, types.Optional(types.float64)) njit([bad])(pyfunc) for fn in cfunc, try_compile_bad_optional: with self.assertRaises(TypingError) as raises: fn('tú quis?', 1.1) self.assertIn('The arg must be a UnicodeType or None', str(raises.exception)) for fn in cfunc, cfunc_optional: for string, chars in STRIP_CASES: self.assertEqual( pyfunc(string, chars), fn(string, chars), "'%s'.%s('%s')?" % (string, case_name, chars))
def try_compile_bad_optional(*args): bad = types.unicode_type(types.unicode_type, types.Optional(types.float64)) njit([bad])(pyfunc)
def try_compile_bad_optional(*args): bad = types.unicode_type(types.unicode_type, types.Optional(types.float64)) njit([bad])(pyfunc)
def test_strip(self): STRIP_CASES = [ ('ass cii', 'ai'), ('ass cii', None), ('asscii', 'ai '), ('asscii ', 'ai '), (' asscii ', 'ai '), (' asscii ', 'asci '), (' asscii ', 's'), (' ', ' '), ('', ' '), ('', ''), (' asscii ', 'ai '), (' asscii ', ''), (' asscii ', None), ('tú quién te crees?', 'étú? '), (' tú quién te crees? ', 'étú? '), (' tú qrees? ', ''), (' tú quién te crees? ', None), ('大处 着眼,小处着手。大大大处', '大处'), (' 大处大处 ', ''), (' 大处大处 ', None) ] # form with no parameter for pyfunc, case_name in [(strip_usecase, 'strip'), (lstrip_usecase, 'lstrip'), (rstrip_usecase, 'rstrip')]: cfunc = njit(pyfunc) for string, chars in STRIP_CASES: self.assertEqual(pyfunc(string), cfunc(string), "'%s'.%s()?" % (string, case_name)) # parametrized form for pyfunc, case_name in [(strip_usecase_chars, 'strip'), (lstrip_usecase_chars, 'lstrip'), (rstrip_usecase_chars, 'rstrip')]: cfunc = njit(pyfunc) sig1 = types.unicode_type(types.unicode_type, types.Optional(types.unicode_type)) cfunc_optional = njit([sig1])(pyfunc) def try_compile_bad_optional(*args): bad = types.unicode_type(types.unicode_type, types.Optional(types.float64)) njit([bad])(pyfunc) for fn in cfunc, try_compile_bad_optional: with self.assertRaises(TypingError) as raises: fn('tú quis?', 1.1) self.assertIn('The arg must be a UnicodeType or None', str(raises.exception)) for fn in cfunc, cfunc_optional: for string, chars in STRIP_CASES: self.assertEqual(pyfunc(string, chars), fn(string, chars), "'%s'.%s('%s')?" % (string, case_name, chars))