@@ -49,13 +49,24 @@ def resolve_split(self, dict, args, kws):
4949 assert len (args ) == 1
5050 return signature (types .List (string_type ), * args )
5151
52+ @infer
53+ class GetItemString (AbstractTemplate ):
54+ key = "getitem"
55+
56+ def generic (self , args , kws ):
57+ assert not kws
58+ if (len (args ) == 2 and isinstance (args [0 ], StringType )
59+ and isinstance (args [1 ], types .Integer )):
60+ return signature (args [0 ], * args )
61+
5262import hstr_ext
5363ll .add_symbol ('init_string' , hstr_ext .init_string )
5464ll .add_symbol ('init_string_const' , hstr_ext .init_string_const )
5565ll .add_symbol ('get_c_str' , hstr_ext .get_c_str )
5666ll .add_symbol ('str_concat' , hstr_ext .str_concat )
5767ll .add_symbol ('str_equal' , hstr_ext .str_equal )
5868ll .add_symbol ('str_split' , hstr_ext .str_split )
69+ ll .add_symbol ('str_substr_int' , hstr_ext .str_substr_int )
5970
6071@unbox (StringType )
6172def unbox_string (typ , obj , c ):
@@ -131,3 +142,12 @@ def string_split_impl(context, builder, sig, args):
131142 value = builder .load (cgutils .gep_inbounds (builder , ptr , loop .index ))
132143 _list .setitem (loop .index , value )
133144 return impl_ret_new_ref (context , builder , sig .return_type , _list .value )
145+
146+ @lower_builtin ('getitem' , StringType , types .Integer )
147+ def getitem_string (context , builder , sig , args ):
148+ fnty = lir .FunctionType (lir .IntType (8 ).as_pointer (),
149+ [lir .IntType (8 ).as_pointer (), lir .IntType (64 )])
150+ fn = builder .module .get_or_insert_function (fnty , name = "str_substr_int" )
151+ # TODO: handle reference counting
152+ #return impl_ret_new_ref(builder.call(fn, args))
153+ return (builder .call (fn , args ))
0 commit comments