@@ -116,13 +116,56 @@ set_fstring_expr(struct tok_state* tok, struct token *token, char c) {
116116 if (!tok_mode -> f_string_debug || token -> metadata ) {
117117 return 0 ;
118118 }
119+ PyObject * res = NULL ;
119120
120- PyObject * res = PyUnicode_DecodeUTF8 (
121- tok_mode -> last_expr_buffer ,
122- tok_mode -> last_expr_size - tok_mode -> last_expr_end ,
123- NULL
124- );
125- if (!res ) {
121+ // Check if there is a # character in the expression
122+ int hash_detected = 0 ;
123+ for (Py_ssize_t i = 0 ; i < tok_mode -> last_expr_size - tok_mode -> last_expr_end ; i ++ ) {
124+ if (tok_mode -> last_expr_buffer [i ] == '#' ) {
125+ hash_detected = 1 ;
126+ break ;
127+ }
128+ }
129+
130+ if (hash_detected ) {
131+ Py_ssize_t input_length = tok_mode -> last_expr_size - tok_mode -> last_expr_end ;
132+ char * result = (char * )PyObject_Malloc ((input_length + 1 ) * sizeof (char ));
133+ if (!result ) {
134+ return -1 ;
135+ }
136+
137+ Py_ssize_t i = 0 ;
138+ Py_ssize_t j = 0 ;
139+
140+ for (i = 0 , j = 0 ; i < input_length ; i ++ ) {
141+ if (tok_mode -> last_expr_buffer [i ] == '#' ) {
142+ // Skip characters until newline or end of string
143+ while (tok_mode -> last_expr_buffer [i ] != '\0' && i < input_length ) {
144+ if (tok_mode -> last_expr_buffer [i ] == '\n' ) {
145+ result [j ++ ] = tok_mode -> last_expr_buffer [i ];
146+ break ;
147+ }
148+ i ++ ;
149+ }
150+ } else {
151+ result [j ++ ] = tok_mode -> last_expr_buffer [i ];
152+ }
153+ }
154+
155+ result [j ] = '\0' ; // Null-terminate the result string
156+ res = PyUnicode_DecodeUTF8 (result , j , NULL );
157+ PyObject_Free (result );
158+ } else {
159+ res = PyUnicode_DecodeUTF8 (
160+ tok_mode -> last_expr_buffer ,
161+ tok_mode -> last_expr_size - tok_mode -> last_expr_end ,
162+ NULL
163+ );
164+
165+ }
166+
167+
168+ if (!res ) {
126169 return -1 ;
127170 }
128171 token -> metadata = res ;
0 commit comments