@@ -129,6 +129,15 @@ static void __attribute((unused)) dump_token(JSParseState *s,
129129 }
130130}
131131
132+ static int calc_column_position (JSParseState * s ) {
133+ if (s -> column_last_ptr > s -> column_ptr ) {
134+ s -> column_num_count += utf8_str_len (s -> column_ptr , s -> column_last_ptr );
135+ s -> column_ptr = s -> column_last_ptr ;
136+ }
137+
138+ return s -> column_num_count ;
139+ }
140+
132141int __attribute__((format (printf , 2 , 3 ))) js_parse_error (JSParseState * s , const char * fmt , ...)
133142{
134143 JSContext * ctx = s -> ctx ;
@@ -142,7 +151,7 @@ int __attribute__((format(printf, 2, 3))) js_parse_error(JSParseState *s, const
142151 if (s -> cur_func && s -> cur_func -> backtrace_barrier )
143152 backtrace_flags = JS_BACKTRACE_FLAG_SINGLE_LEVEL ;
144153
145- int column_num = s -> column_last_ptr - s -> column_ptr ;
154+ int column_num = calc_column_position ( s ) ;
146155 build_backtrace (ctx , ctx -> rt -> current_exception ,
147156 s -> filename , s -> line_num ,
148157 column_num < 0 ? -1 : column_num ,
@@ -183,7 +192,7 @@ static __exception int js_parse_template_part(JSParseState *s, const uint8_t *p)
183192{
184193 uint32_t c ;
185194 StringBuffer b_s , * b = & b_s ;
186- s -> token .column_num = s -> column_last_ptr - s -> column_ptr ;
195+ s -> token .column_num = calc_column_position ( s ) ;
187196
188197 /* p points to the first byte of the template part */
189198 if (string_buffer_init (s -> ctx , b , 32 ))
@@ -216,8 +225,8 @@ static __exception int js_parse_template_part(JSParseState *s, const uint8_t *p)
216225 }
217226 if (c == '\n' ) {
218227 s -> line_num ++ ;
219- s -> column_last_ptr = p ;
220- s -> column_ptr = p ;
228+ s -> column_ptr = s -> column_last_ptr = p ;
229+ s -> column_num_count = 0 ;
221230 } else if (c >= 0x80 ) {
222231 const uint8_t * p_next ;
223232 c = unicode_from_utf8 (p - 1 , UTF8_CHAR_LEN_MAX , & p_next );
@@ -251,7 +260,7 @@ static __exception int js_parse_string(JSParseState *s, int sep,
251260 int ret ;
252261 uint32_t c ;
253262 StringBuffer b_s , * b = & b_s ;
254- s -> token .column_num = s -> column_last_ptr - s -> column_ptr ;
263+ s -> token .column_num = calc_column_position ( s ) ;
255264
256265 /* string */
257266 if (string_buffer_init (s -> ctx , b , 32 ))
@@ -309,8 +318,8 @@ static __exception int js_parse_string(JSParseState *s, int sep,
309318 p ++ ;
310319 if (sep != '`' ) {
311320 s -> line_num ++ ;
312- s -> column_last_ptr = p ;
313- s -> column_ptr = p ;
321+ s -> column_ptr = s -> column_last_ptr = p ;
322+ s -> column_num_count = 0 ;
314323 }
315324 continue ;
316325 default :
@@ -567,7 +576,6 @@ static JSAtom parse_ident(JSParseState *s, const uint8_t **pp,
567576 return atom ;
568577}
569578
570-
571579static __exception int next_token (JSParseState * s )
572580{
573581 const uint8_t * p ;
@@ -619,6 +627,7 @@ static __exception int next_token(JSParseState *s)
619627 s -> got_lf = TRUE;
620628 s -> line_num ++ ;
621629 s -> column_ptr = p ;
630+ s -> column_num_count = 0 ;
622631 goto redo ;
623632 case '\f' :
624633 case '\v' :
@@ -643,6 +652,7 @@ static __exception int next_token(JSParseState *s)
643652 s -> line_num ++ ;
644653 s -> got_lf = TRUE; /* considered as LF for ASI */
645654 s -> column_ptr = ++ p ;
655+ s -> column_num_count = 0 ;
646656 } else if (* p == '\r' ) {
647657 s -> got_lf = TRUE; /* considered as LF for ASI */
648658 p ++ ;
@@ -1077,8 +1087,8 @@ static __exception int next_token(JSParseState *s)
10771087 }
10781088
10791089 s -> buf_ptr = p ;
1080- if (!s -> token .column_num && s -> column_last_ptr > s -> column_ptr ) {
1081- s -> token .column_num = s -> column_last_ptr - s -> column_ptr ;
1090+ if (!s -> token .column_num ) {
1091+ s -> token .column_num = calc_column_position ( s ) ;
10821092 }
10831093
10841094 // dump_token(s, &s->token);
@@ -1170,6 +1180,7 @@ __exception int json_next_token(JSParseState *s)
11701180 p ++ ;
11711181 s -> line_num ++ ;
11721182 s -> column_ptr = p ;
1183+ s -> column_num_count = 0 ;
11731184 goto redo ;
11741185 case '\f' :
11751186 case '\v' :
@@ -1202,6 +1213,7 @@ __exception int json_next_token(JSParseState *s)
12021213 if (* p == '\n' ) {
12031214 s -> line_num ++ ;
12041215 s -> column_ptr = ++ p ;
1216+ s -> column_num_count = 0 ;
12051217 } else if (* p == '\r' ) {
12061218 p ++ ;
12071219 } else if (* p >= 0x80 ) {
@@ -1312,8 +1324,8 @@ __exception int json_next_token(JSParseState *s)
13121324 }
13131325
13141326 s -> buf_ptr = p ;
1315- if (!s -> token .column_num && s -> column_last_ptr > s -> column_ptr ) {
1316- s -> token .column_num = s -> column_last_ptr - s -> column_ptr ;
1327+ if (!s -> token .column_num ) {
1328+ s -> token .column_num = calc_column_position ( s ) ;
13171329 }
13181330
13191331 // dump_token(s, &s->token);
@@ -2354,16 +2366,20 @@ static int __exception js_parse_property_name(JSParseState *s,
23542366typedef struct JSParsePos {
23552367 int last_line_num ;
23562368 int line_num ;
2357- int column_num ;
23582369 BOOL got_lf ;
23592370 const uint8_t * ptr ;
2371+ const uint8_t * column_ptr ;
2372+ const uint8_t * column_last_ptr ;
2373+ int column_num_count ;
23602374} JSParsePos ;
23612375
23622376static int js_parse_get_pos (JSParseState * s , JSParsePos * sp )
23632377{
23642378 sp -> last_line_num = s -> last_line_num ;
23652379 sp -> line_num = s -> token .line_num ;
2366- sp -> column_num = s -> token .column_num ;
2380+ sp -> column_ptr = s -> column_ptr ;
2381+ sp -> column_last_ptr = s -> column_last_ptr ;
2382+ sp -> column_num_count = s -> column_num_count ;
23672383 sp -> ptr = s -> token .ptr ;
23682384 sp -> got_lf = s -> got_lf ;
23692385 return 0 ;
@@ -2373,7 +2389,9 @@ static __exception int js_parse_seek_token(JSParseState *s, const JSParsePos *sp
23732389{
23742390 s -> token .line_num = sp -> last_line_num ;
23752391 s -> line_num = sp -> line_num ;
2376- s -> column_last_ptr = sp -> ptr ;
2392+ s -> column_ptr = sp -> column_ptr ;
2393+ s -> column_last_ptr = sp -> column_last_ptr ;
2394+ s -> column_num_count = sp -> column_num_count ;
23772395 s -> buf_ptr = sp -> ptr ;
23782396 s -> got_lf = sp -> got_lf ;
23792397 return next_token (s );
@@ -12259,6 +12277,8 @@ void js_parse_init(JSContext *ctx, JSParseState *s,
1225912277 s -> filename = filename ;
1226012278 s -> line_num = 1 ;
1226112279 s -> column_ptr = (const uint8_t * )input ;
12280+ s -> column_last_ptr = s -> column_ptr ;
12281+ s -> column_num_count = 0 ;
1226212282 s -> buf_ptr = (const uint8_t * )input ;
1226312283 s -> buf_end = s -> buf_ptr + input_len ;
1226412284 s -> token .val = ' ' ;
0 commit comments