@@ -129,6 +129,15 @@ static void __attribute((unused)) dump_token(JSParseState *s,
129
129
}
130
130
}
131
131
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
+
132
141
int __attribute__((format (printf , 2 , 3 ))) js_parse_error (JSParseState * s , const char * fmt , ...)
133
142
{
134
143
JSContext * ctx = s -> ctx ;
@@ -142,7 +151,7 @@ int __attribute__((format(printf, 2, 3))) js_parse_error(JSParseState *s, const
142
151
if (s -> cur_func && s -> cur_func -> backtrace_barrier )
143
152
backtrace_flags = JS_BACKTRACE_FLAG_SINGLE_LEVEL ;
144
153
145
- int column_num = s -> column_last_ptr - s -> column_ptr ;
154
+ int column_num = calc_column_position ( s ) ;
146
155
build_backtrace (ctx , ctx -> rt -> current_exception ,
147
156
s -> filename , s -> line_num ,
148
157
column_num < 0 ? -1 : column_num ,
@@ -183,7 +192,7 @@ static __exception int js_parse_template_part(JSParseState *s, const uint8_t *p)
183
192
{
184
193
uint32_t c ;
185
194
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 ) ;
187
196
188
197
/* p points to the first byte of the template part */
189
198
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)
216
225
}
217
226
if (c == '\n' ) {
218
227
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 ;
221
230
} else if (c >= 0x80 ) {
222
231
const uint8_t * p_next ;
223
232
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,
251
260
int ret ;
252
261
uint32_t c ;
253
262
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 ) ;
255
264
256
265
/* string */
257
266
if (string_buffer_init (s -> ctx , b , 32 ))
@@ -309,8 +318,8 @@ static __exception int js_parse_string(JSParseState *s, int sep,
309
318
p ++ ;
310
319
if (sep != '`' ) {
311
320
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 ;
314
323
}
315
324
continue ;
316
325
default :
@@ -567,7 +576,6 @@ static JSAtom parse_ident(JSParseState *s, const uint8_t **pp,
567
576
return atom ;
568
577
}
569
578
570
-
571
579
static __exception int next_token (JSParseState * s )
572
580
{
573
581
const uint8_t * p ;
@@ -619,6 +627,7 @@ static __exception int next_token(JSParseState *s)
619
627
s -> got_lf = TRUE;
620
628
s -> line_num ++ ;
621
629
s -> column_ptr = p ;
630
+ s -> column_num_count = 0 ;
622
631
goto redo ;
623
632
case '\f' :
624
633
case '\v' :
@@ -643,6 +652,7 @@ static __exception int next_token(JSParseState *s)
643
652
s -> line_num ++ ;
644
653
s -> got_lf = TRUE; /* considered as LF for ASI */
645
654
s -> column_ptr = ++ p ;
655
+ s -> column_num_count = 0 ;
646
656
} else if (* p == '\r' ) {
647
657
s -> got_lf = TRUE; /* considered as LF for ASI */
648
658
p ++ ;
@@ -1077,8 +1087,8 @@ static __exception int next_token(JSParseState *s)
1077
1087
}
1078
1088
1079
1089
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 ) ;
1082
1092
}
1083
1093
1084
1094
// dump_token(s, &s->token);
@@ -1170,6 +1180,7 @@ __exception int json_next_token(JSParseState *s)
1170
1180
p ++ ;
1171
1181
s -> line_num ++ ;
1172
1182
s -> column_ptr = p ;
1183
+ s -> column_num_count = 0 ;
1173
1184
goto redo ;
1174
1185
case '\f' :
1175
1186
case '\v' :
@@ -1202,6 +1213,7 @@ __exception int json_next_token(JSParseState *s)
1202
1213
if (* p == '\n' ) {
1203
1214
s -> line_num ++ ;
1204
1215
s -> column_ptr = ++ p ;
1216
+ s -> column_num_count = 0 ;
1205
1217
} else if (* p == '\r' ) {
1206
1218
p ++ ;
1207
1219
} else if (* p >= 0x80 ) {
@@ -1312,8 +1324,8 @@ __exception int json_next_token(JSParseState *s)
1312
1324
}
1313
1325
1314
1326
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 ) ;
1317
1329
}
1318
1330
1319
1331
// dump_token(s, &s->token);
@@ -2354,16 +2366,20 @@ static int __exception js_parse_property_name(JSParseState *s,
2354
2366
typedef struct JSParsePos {
2355
2367
int last_line_num ;
2356
2368
int line_num ;
2357
- int column_num ;
2358
2369
BOOL got_lf ;
2359
2370
const uint8_t * ptr ;
2371
+ const uint8_t * column_ptr ;
2372
+ const uint8_t * column_last_ptr ;
2373
+ int column_num_count ;
2360
2374
} JSParsePos ;
2361
2375
2362
2376
static int js_parse_get_pos (JSParseState * s , JSParsePos * sp )
2363
2377
{
2364
2378
sp -> last_line_num = s -> last_line_num ;
2365
2379
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 ;
2367
2383
sp -> ptr = s -> token .ptr ;
2368
2384
sp -> got_lf = s -> got_lf ;
2369
2385
return 0 ;
@@ -2373,7 +2389,9 @@ static __exception int js_parse_seek_token(JSParseState *s, const JSParsePos *sp
2373
2389
{
2374
2390
s -> token .line_num = sp -> last_line_num ;
2375
2391
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 ;
2377
2395
s -> buf_ptr = sp -> ptr ;
2378
2396
s -> got_lf = sp -> got_lf ;
2379
2397
return next_token (s );
@@ -9543,16 +9561,6 @@ static __exception int resolve_variables(JSContext *ctx, JSFunctionDef *s)
9543
9561
9544
9562
case OP_column_num :
9545
9563
column_num = get_u32 (bc_buf + pos + 1 );
9546
- while (
9547
- bc_buf [pos_next ] == OP_column_num
9548
- && column_num == get_u32 (bc_buf + pos_next + 1 )
9549
- ) {
9550
- pos = pos_next ;
9551
- op = bc_buf [pos ];
9552
- len = opcode_info [op ].size ;
9553
- pos_next = pos + len ;
9554
- }
9555
-
9556
9564
s -> column_number_size ++ ;
9557
9565
goto no_change ;
9558
9566
case OP_eval : /* convert scope index to adjusted variable index */
@@ -9861,11 +9869,13 @@ static void add_pc2col_info(JSFunctionDef *s, uint32_t pc, int column_num)
9861
9869
{
9862
9870
if (s -> column_number_slots != NULL
9863
9871
&& s -> column_number_count < s -> column_number_size
9864
- && pc >= s -> column_number_last_pc ) {
9872
+ && pc >= s -> column_number_last_pc
9873
+ && column_num != s -> column_number_last ) {
9865
9874
s -> column_number_slots [s -> column_number_count ].pc = pc ;
9866
9875
s -> column_number_slots [s -> column_number_count ].column_num = column_num ;
9867
9876
s -> column_number_count ++ ;
9868
9877
s -> column_number_last_pc = pc ;
9878
+ s -> column_number_last = column_num ;
9869
9879
}
9870
9880
}
9871
9881
@@ -10149,6 +10159,7 @@ static __exception int resolve_labels(JSContext *ctx, JSFunctionDef *s)
10149
10159
s -> column_number_slots = js_mallocz (s -> ctx , sizeof (* s -> column_number_slots ) * s -> column_number_size );
10150
10160
if (s -> column_number_slots == NULL )
10151
10161
return -1 ;
10162
+ s -> column_number_last = s -> column_num ;
10152
10163
s -> column_number_last_pc = 0 ;
10153
10164
}
10154
10165
@@ -12266,6 +12277,8 @@ void js_parse_init(JSContext *ctx, JSParseState *s,
12266
12277
s -> filename = filename ;
12267
12278
s -> line_num = 1 ;
12268
12279
s -> column_ptr = (const uint8_t * )input ;
12280
+ s -> column_last_ptr = s -> column_ptr ;
12281
+ s -> column_num_count = 0 ;
12269
12282
s -> buf_ptr = (const uint8_t * )input ;
12270
12283
s -> buf_end = s -> buf_ptr + input_len ;
12271
12284
s -> token .val = ' ' ;
0 commit comments