From 73cc00e57ec6cb4395f0e3245111b106a40a7bcb Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Thu, 7 Nov 2024 22:03:00 +0100 Subject: [PATCH] Improve line:column tracking (#660) Emit source locations manually for more precise tracking. Don't infer them from emitted bytecode opcodes because that leads to inaccurate and sometimes surprising results. Speeds up code generation (although infinitesimally) as a bonus. Fixes: https://github.com/quickjs-ng/quickjs/issues/236 --- gen/function_source.c | Bin 2896 -> 2749 bytes gen/hello.c | Bin 1429 -> 1416 bytes gen/hello_module.c | Bin 4027 -> 3818 bytes gen/repl.c | Bin 143326 -> 143185 bytes gen/test_fib.c | Bin 2844 -> 2697 bytes quickjs.c | 30 +++++++++++++++--------------- tests/test_builtin.js | 12 ++++++------ 7 files changed, 21 insertions(+), 21 deletions(-) diff --git a/gen/function_source.c b/gen/function_source.c index f66527b1ec945d0ffcee99794541158784fe4e4b..05d432ee0a9d5ffa0dd1586165bc817477205e24 100644 GIT binary patch delta 597 zcmZ8eJxc>Y5XJLu&n$wVoVhef1VIQ3?(JPJ36_F|m0)dgUjY#jG=+_5DzWpN#=^qC zpw>3_qQAi3U}NvjY%WTgVfMYZZ{F;FuD*J=*H#dfHygS>JwMLZq-e|YAQ8O$S%-Uj zagKv$b>PEhy4$fjcMfZCEm0)whc7h9a4jgrw}*52LUK6&|CIJJHOp<|IX delta 839 zcmZuvJ5Iwu5S1L_L~cMrIF5t@NJvn)*pIz-s5k%x7obRt)6>yKG$0xTnwBD00BXb) zxCt#4V&{z=f}k0XcjkR&cV4&NGYAVx(R)DHZmieV32Ahjzv*n6e&2&$l#;iC}dmX zoIb)hc5N?v6fd(hqBKl~Kguimw)EArrrMG&vEF+`cTydnvv(`lmLa0IFd1-vd*bs9 z9&AaAV6gqqP`GYyG@`v;vcD9Y%vhktOR6b`_3r$UjCR-0 zTvb>HgSVW@vRLM8yuz^oo%VOMESQ3uGyoc2o5zMTjcd@dhz1H4_of8~Ry~IqSs-Du l1tc<2l`cpap#@-7&U3RTjaG{he@XmN$Ys}|@KW@zgKuRo#-jiL diff --git a/gen/hello.c b/gen/hello.c index 2cff0d762b81805872a706bd9798be8651693424..db733132028bcb8d0a1438b4991905d36e871244 100644 GIT binary patch delta 37 qcmbQr-N8Mfj?s8xy&R+Q#(5b`d`3D71{Ee2AkrXJXR{)62@?R%tO_## delta 50 ucmeC+p2|I;j?r{ty&R+I#(5b`(k40z1{DT|2-46T%r?^D+AP9c!UOJC^K?U>Xw7k& zDoQ4lWK3l>H2l=dxmuD%f`u7a0S`Dq73A)(lz6RRwp@6)HEyDm;rNkJKgR z-)^!<_)krW1ZFaDjmGPd?1y-55z|q_t&B;Z4|swDlst&0L&?kpnGcZ&)aVL!#R_QA zg?AY`3id<LZ@ZS4$vBctSYp}j Utl%yAiRQx$JB(({f5NBMFHJjlwg3PC delta 674 zcmY+CJ5Iwu5Qde+ticKpA%S=*4@?1C#I7If1R5#|I*#A~Y2W~K2q^~uO^rkcElP<* zL%|8?scAR@?EYg5(~P|{`+xJ=uZ@@X?M)-r$=$f?KF?1d_3KE_wWm3WlcIB1u|4X*+{u!bg0s~%_ zN_uUCbRo9qxb7U$Y)JE>M+e@_tZRUW5cMUUc%gu2U@wfOWAqfe+wEoNH>t~EkUNX< zpOW@g7=upCxum11uoh5D?9hWJXkP?$EV>Jv$zfvcq~P{imI-tTr9gyM)1p1EX?2TW zXBfU?UkbT18j6iD1=|twKot!n{fH2p;Rr)gl9V52?v6q&h22_e6Vz&l985Nw@AY4R=bdl> diff --git a/gen/repl.c b/gen/repl.c index 7c051216d87bdfd7320f1238d57e235172f40059..c448eb4e64c0e417518dbec34a2b8154b6f0b41e 100644 GIT binary patch delta 22019 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 delta 22372 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 diff --git a/gen/test_fib.c b/gen/test_fib.c index d5d440ab85169e455a29b2ad8bc53adbd65dbee9..e8182d2aef802333bbea281aae8db96b6e017621 100644 GIT binary patch delta 117 zcmbOu)+sunUe(Cbz?zFIIX|zsM4>b@uf!t0M4>RNI61x~wYVfcEi)+^sAA)i^=$SA xi8=}f6$S=6TtLdi6wI*zk!Hyt(%1|{nkIooj6ft%DUdWu1Zyzbtjh772>?q-A)NpK delta 265 zcmeAaog+4(Ue(yp#F~pMIX|zsM4>b@uf!t0M4>RNI61x~wYVfcEi)+^sAA)i^=$P< zMmh=x6$XYnTo4LG8i0jNz@!C;G)x7NMu}iHL?j8K0n9N-0ZAAqfu+HuK{AMKU=Ak1 z1{s+mYk)`tC4yn948fL~7=v^efu*53AQC_h$UuluU}Md|7MVeu57C?gw!(PxB=+x2 E0Ar#=RsaA1 diff --git a/quickjs.c b/quickjs.c index b842957..dc38297 100644 --- a/quickjs.c +++ b/quickjs.c @@ -18711,8 +18711,6 @@ typedef struct JSFunctionDef { DynBuf byte_code; int last_opcode_pos; /* -1 if no last opcode */ - int last_opcode_line_num; - int last_opcode_col_num; BOOL use_short_opcodes; /* true if short opcodes are used in byte_code */ LabelSlot *label_slots; @@ -19558,6 +19556,7 @@ static __exception int next_token(JSParseState *s) case '_': case '$': /* identifier */ + s->mark = p; p++; ident_has_escape = FALSE; has_ident: @@ -19873,7 +19872,7 @@ static __exception int next_token(JSParseState *s) p++; break; } - s->token.col_num = s->mark - s->eol; + s->token.col_num = max_int(1, s->mark - s->eol); s->buf_ptr = p; // dump_token(s, &s->token); @@ -20338,22 +20337,21 @@ static void emit_u32(JSParseState *s, uint32_t val) dbuf_put_u32(&s->cur_func->byte_code, val); } +static void emit_source_loc(JSParseState *s) +{ + JSFunctionDef *fd = s->cur_func; + DynBuf *bc = &fd->byte_code; + + dbuf_putc(bc, OP_source_loc); + dbuf_put_u32(bc, s->last_line_num); + dbuf_put_u32(bc, s->last_col_num); +} + static void emit_op(JSParseState *s, uint8_t val) { JSFunctionDef *fd = s->cur_func; DynBuf *bc = &fd->byte_code; - /* Use the line and column number of the last token used, - not the next token, nor the current offset in the source file. - */ - if (unlikely(fd->last_opcode_line_num != s->last_line_num || - fd->last_opcode_col_num != s->last_col_num)) { - dbuf_putc(bc, OP_source_loc); - dbuf_put_u32(bc, s->last_line_num); - dbuf_put_u32(bc, s->last_col_num); - fd->last_opcode_line_num = s->last_line_num; - fd->last_opcode_col_num = s->last_col_num; - } fd->last_opcode_pos = bc->size; dbuf_putc(bc, val); } @@ -23481,6 +23479,7 @@ static __exception int js_parse_postfix_expr(JSParseState *s, int parse_flags) emit_atom(s, JS_ATOM_new_target); emit_u16(s, 0); } else { + emit_source_loc(s); if (js_parse_postfix_expr(s, 0)) return -1; accept_lparen = TRUE; @@ -23580,6 +23579,7 @@ static __exception int js_parse_postfix_expr(JSParseState *s, int parse_flags) if (call_type == FUNC_CALL_NORMAL) { parse_func_call2: + emit_source_loc(s); switch(opcode = get_prev_opcode(fd)) { case OP_get_field: /* keep the object on the stack */ @@ -26035,6 +26035,7 @@ static __exception int js_parse_statement_or_decl(JSParseState *s, default: hasexpr: + emit_source_loc(s); if (js_parse_expr(s)) goto fail; if (s->cur_func->eval_ret_idx >= 0) { @@ -28329,7 +28330,6 @@ static JSFunctionDef *js_new_function_def(JSContext *ctx, js_dbuf_init(ctx, &fd->pc2line); //fd->pc2line_last_line_num = line_num; //fd->pc2line_last_pc = 0; - fd->last_opcode_line_num = line_num; fd->ic = init_ic(ctx); return fd; diff --git a/tests/test_builtin.js b/tests/test_builtin.js index 4c29503..9cbef7c 100644 --- a/tests/test_builtin.js +++ b/tests/test_builtin.js @@ -7,12 +7,12 @@ function test_exception_source_pos() var e; try { - throw new Error(""); // line 10, column 19 + throw new Error(""); // line 10, column 15 } catch(_e) { e = _e; } - assert(e.stack.includes("test_builtin.js:10:19")); + assert(e.stack.includes("test_builtin.js:10:15")); } // Keep this at the top; it tests source positions. @@ -36,7 +36,7 @@ function test_exception_prepare_stack() }; try { - throw new Error(""); // line 39, column 19 + throw new Error(""); // line 39, column 15 } catch(_e) { e = _e; } @@ -48,7 +48,7 @@ function test_exception_prepare_stack() assert(f.getFunctionName(), 'test_exception_prepare_stack'); assert(f.getFileName().endsWith('test_builtin.js')); assert(f.getLineNumber(), 39); - assert(f.getColumnNumber(), 19); + assert(f.getColumnNumber(), 15); assert(!f.isNative()); } @@ -64,7 +64,7 @@ function test_exception_stack_size_limit() }; try { - throw new Error(""); // line 67, column 19 + throw new Error(""); // line 67, column 15 } catch(_e) { e = _e; } @@ -77,7 +77,7 @@ function test_exception_stack_size_limit() assert(f.getFunctionName(), 'test_exception_stack_size_limit'); assert(f.getFileName().endsWith('test_builtin.js')); assert(f.getLineNumber(), 67); - assert(f.getColumnNumber(), 19); + assert(f.getColumnNumber(), 15); assert(!f.isNative()); }