mirror of
https://github.com/janet-lang/janet
synced 2024-12-01 04:19:55 +00:00
Source mapping v4 (line and column instead of byte offsets).
This commit is contained in:
parent
f93c84c21f
commit
28cf753fa2
@ -709,8 +709,8 @@ static DstAssembleResult dst_asm1(DstAssembler *parent, Dst source, int flags) {
|
|||||||
if (!dst_checktype(tup[1], DST_INTEGER)) {
|
if (!dst_checktype(tup[1], DST_INTEGER)) {
|
||||||
dst_asm_error(&a, "expected integer");
|
dst_asm_error(&a, "expected integer");
|
||||||
}
|
}
|
||||||
mapping.start = dst_unwrap_integer(tup[0]);
|
mapping.line = dst_unwrap_integer(tup[0]);
|
||||||
mapping.end = dst_unwrap_integer(tup[1]);
|
mapping.column = dst_unwrap_integer(tup[1]);
|
||||||
def->sourcemap[i] = mapping;
|
def->sourcemap[i] = mapping;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -868,8 +868,8 @@ Dst dst_disasm(DstFuncDef *def) {
|
|||||||
for (i = 0; i < def->bytecode_length; i++) {
|
for (i = 0; i < def->bytecode_length; i++) {
|
||||||
Dst *t = dst_tuple_begin(2);
|
Dst *t = dst_tuple_begin(2);
|
||||||
DstSourceMapping mapping = def->sourcemap[i];
|
DstSourceMapping mapping = def->sourcemap[i];
|
||||||
t[0] = dst_wrap_integer(mapping.start);
|
t[0] = dst_wrap_integer(mapping.line);
|
||||||
t[1] = dst_wrap_integer(mapping.end);
|
t[1] = dst_wrap_integer(mapping.column);
|
||||||
sourcemap->data[i] = dst_wrap_tuple(dst_tuple_end(t));
|
sourcemap->data[i] = dst_wrap_tuple(dst_tuple_end(t));
|
||||||
}
|
}
|
||||||
sourcemap->count = def->bytecode_length;
|
sourcemap->count = def->bytecode_length;
|
||||||
|
@ -958,7 +958,9 @@ onvalue."
|
|||||||
(while going
|
(while going
|
||||||
(switch (parser.status p)
|
(switch (parser.status p)
|
||||||
:full (yield (parser.produce p))
|
:full (yield (parser.produce p))
|
||||||
:error (onerr where "parse" (string (parser.error p) " at byte index " byteindex))
|
:error (do
|
||||||
|
(def (line col) (parser.where p))
|
||||||
|
(onerr where "parse" (string (parser.error p) " on line " line ", column " col)))
|
||||||
(switch (fiber.status chars)
|
(switch (fiber.status chars)
|
||||||
:new (parser.byte p (resume chars))
|
:new (parser.byte p (resume chars))
|
||||||
:pending (parser.byte p (resume chars))
|
:pending (parser.byte p (resume chars))
|
||||||
@ -975,10 +977,10 @@ onvalue."
|
|||||||
(res)
|
(res)
|
||||||
(do
|
(do
|
||||||
(:= good false)
|
(:= good false)
|
||||||
(def {:error err :error-start errs :error-end erre} res)
|
(def {:error err :error-line errl :error-column errc} res)
|
||||||
(onerr where "compile"
|
(onerr where "compile"
|
||||||
(if (<= 0 errs)
|
(if (< 0 errl)
|
||||||
(string err " at (" errs ":" erre ")")
|
(string err " on line " errl ", column " errc)
|
||||||
err)))))
|
err)))))
|
||||||
:a))
|
:a))
|
||||||
(def res (resume f))
|
(def res (resume f))
|
||||||
@ -1013,8 +1015,8 @@ onvalue."
|
|||||||
:c c
|
:c c
|
||||||
:name name
|
:name name
|
||||||
:source source
|
:source source
|
||||||
:source-start source-start
|
:source-line source-line
|
||||||
:source-end source-end
|
:source-column source-col
|
||||||
} :in st]
|
} :in st]
|
||||||
(file.write stdout " in")
|
(file.write stdout " in")
|
||||||
(when c (file.write stdout " cfunction"))
|
(when c (file.write stdout " cfunction"))
|
||||||
@ -1024,8 +1026,8 @@ onvalue."
|
|||||||
(if source
|
(if source
|
||||||
(do
|
(do
|
||||||
(file.write stdout " [" source "]")
|
(file.write stdout " [" source "]")
|
||||||
(if source-start (file.write stdout " at byte range ("
|
(if source-line (file.write stdout " on line "
|
||||||
(string source-start) ":" (string source-end) ")")))
|
(string source-line) ", column " (string source-col))))
|
||||||
(if pc (file.write stdout " at (pc=" (string pc) ")")))
|
(if pc (file.write stdout " at (pc=" (string pc) ")")))
|
||||||
(when tail (file.write stdout " (tailcall)"))
|
(when tail (file.write stdout " (tailcall)"))
|
||||||
(file.write stdout "\n"))))
|
(file.write stdout "\n"))))
|
||||||
|
@ -35,11 +35,11 @@ static void dstc_ast_push(DstCompiler *c, const Dst *tup) {
|
|||||||
if (c->result.status == DST_COMPILE_ERROR) {
|
if (c->result.status == DST_COMPILE_ERROR) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
mapping.start = dst_tuple_sm_start(tup);
|
mapping.line = dst_tuple_sm_line(tup);
|
||||||
mapping.end = dst_tuple_sm_end(tup);
|
mapping.column = dst_tuple_sm_col(tup);
|
||||||
if (mapping.start < 0 || mapping.end < 0) {
|
if (!mapping.line) {
|
||||||
/* Reuse previous mapping */
|
/* Reuse previous mapping */
|
||||||
mapping = dst_v_last(c->ast_stack);
|
mapping = c->current_mapping;
|
||||||
}
|
}
|
||||||
dst_v_push(c->ast_stack, mapping);
|
dst_v_push(c->ast_stack, mapping);
|
||||||
c->current_mapping = mapping;
|
c->current_mapping = mapping;
|
||||||
@ -53,8 +53,8 @@ static void dstc_ast_pop(DstCompiler *c) {
|
|||||||
if (dst_v_count(c->ast_stack)) {
|
if (dst_v_count(c->ast_stack)) {
|
||||||
c->current_mapping = dst_v_last(c->ast_stack);
|
c->current_mapping = dst_v_last(c->ast_stack);
|
||||||
} else {
|
} else {
|
||||||
c->current_mapping.start = -1;
|
c->current_mapping.line = 0;
|
||||||
c->current_mapping.end = -1;
|
c->current_mapping.column = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -964,14 +964,14 @@ static void dstc_init(DstCompiler *c, DstTable *env, const uint8_t *where) {
|
|||||||
c->env = env;
|
c->env = env;
|
||||||
c->source = where;
|
c->source = where;
|
||||||
c->ast_stack = NULL;
|
c->ast_stack = NULL;
|
||||||
c->current_mapping.start = -1;
|
c->current_mapping.line = 0;
|
||||||
c->current_mapping.end = -1;
|
c->current_mapping.column = 0;
|
||||||
/* Init result */
|
/* Init result */
|
||||||
c->result.error = NULL;
|
c->result.error = NULL;
|
||||||
c->result.status = DST_COMPILE_OK;
|
c->result.status = DST_COMPILE_OK;
|
||||||
c->result.funcdef = NULL;
|
c->result.funcdef = NULL;
|
||||||
c->result.error_mapping.start = -1;
|
c->result.error_mapping.line = 0;
|
||||||
c->result.error_mapping.end = -1;
|
c->result.error_mapping.column = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Deinitialize a compiler struct */
|
/* Deinitialize a compiler struct */
|
||||||
@ -1033,8 +1033,8 @@ int dst_compile_cfun(DstArgs args) {
|
|||||||
} else {
|
} else {
|
||||||
t = dst_table(2);
|
t = dst_table(2);
|
||||||
dst_table_put(t, dst_csymbolv(":error"), dst_wrap_string(res.error));
|
dst_table_put(t, dst_csymbolv(":error"), dst_wrap_string(res.error));
|
||||||
dst_table_put(t, dst_csymbolv(":error-start"), dst_wrap_integer(res.error_mapping.start));
|
dst_table_put(t, dst_csymbolv(":error-line"), dst_wrap_integer(res.error_mapping.line));
|
||||||
dst_table_put(t, dst_csymbolv(":error-end"), dst_wrap_integer(res.error_mapping.end));
|
dst_table_put(t, dst_csymbolv(":error-column"), dst_wrap_integer(res.error_mapping.column));
|
||||||
DST_RETURN_TABLE(args, t);
|
DST_RETURN_TABLE(args, t);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -365,8 +365,8 @@ static Dst doframe(DstStackFrame *frame) {
|
|||||||
dst_table_put(t, dst_csymbolv(":pc"), dst_wrap_integer(off));
|
dst_table_put(t, dst_csymbolv(":pc"), dst_wrap_integer(off));
|
||||||
if (def->sourcemap) {
|
if (def->sourcemap) {
|
||||||
DstSourceMapping mapping = def->sourcemap[off];
|
DstSourceMapping mapping = def->sourcemap[off];
|
||||||
dst_table_put(t, dst_csymbolv(":source-start"), dst_wrap_integer(mapping.start));
|
dst_table_put(t, dst_csymbolv(":source-line"), dst_wrap_integer(mapping.line));
|
||||||
dst_table_put(t, dst_csymbolv(":source-end"), dst_wrap_integer(mapping.end));
|
dst_table_put(t, dst_csymbolv(":source-column"), dst_wrap_integer(mapping.column));
|
||||||
}
|
}
|
||||||
if (def->source) {
|
if (def->source) {
|
||||||
dst_table_put(t, dst_csymbolv(":source"), dst_wrap_string(def->source));
|
dst_table_put(t, dst_csymbolv(":source"), dst_wrap_string(def->source));
|
||||||
|
@ -112,7 +112,8 @@ struct DstParseState {
|
|||||||
int32_t qcount;
|
int32_t qcount;
|
||||||
int32_t argn;
|
int32_t argn;
|
||||||
int flags;
|
int flags;
|
||||||
size_t start;
|
size_t start_line;
|
||||||
|
size_t start_col;
|
||||||
Consumer consumer;
|
Consumer consumer;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -155,7 +156,8 @@ static void pushstate(DstParser *p, Consumer consumer, int flags) {
|
|||||||
s.argn = 0;
|
s.argn = 0;
|
||||||
s.flags = flags;
|
s.flags = flags;
|
||||||
s.consumer = consumer;
|
s.consumer = consumer;
|
||||||
s.start = p->index;
|
s.start_line = p->line;
|
||||||
|
s.start_col = p->col;
|
||||||
_pushstate(p, s);
|
_pushstate(p, s);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -168,8 +170,8 @@ static void popstate(DstParser *p, Dst val) {
|
|||||||
/* Quote the returned value qcount times */
|
/* Quote the returned value qcount times */
|
||||||
for (i = 0; i < len; i++) {
|
for (i = 0; i < len; i++) {
|
||||||
if (dst_checktype(val, DST_TUPLE)) {
|
if (dst_checktype(val, DST_TUPLE)) {
|
||||||
dst_tuple_sm_start(dst_unwrap_tuple(val)) = (int32_t) top.start;
|
dst_tuple_sm_line(dst_unwrap_tuple(val)) = (int32_t) top.start_line;
|
||||||
dst_tuple_sm_end(dst_unwrap_tuple(val)) = (int32_t) p->index;
|
dst_tuple_sm_col(dst_unwrap_tuple(val)) = (int32_t) top.start_col;
|
||||||
}
|
}
|
||||||
val = quote(val);
|
val = quote(val);
|
||||||
}
|
}
|
||||||
@ -177,8 +179,8 @@ static void popstate(DstParser *p, Dst val) {
|
|||||||
|
|
||||||
/* Ast wrap */
|
/* Ast wrap */
|
||||||
if (dst_checktype(val, DST_TUPLE)) {
|
if (dst_checktype(val, DST_TUPLE)) {
|
||||||
dst_tuple_sm_start(dst_unwrap_tuple(val)) = (int32_t) top.start;
|
dst_tuple_sm_line(dst_unwrap_tuple(val)) = (int32_t) top.start_line;
|
||||||
dst_tuple_sm_end(dst_unwrap_tuple(val)) = (int32_t) p->index;
|
dst_tuple_sm_col(dst_unwrap_tuple(val)) = (int32_t) top.start_col;
|
||||||
}
|
}
|
||||||
|
|
||||||
newtop->argn++;
|
newtop->argn++;
|
||||||
@ -518,7 +520,12 @@ static int root(DstParser *p, DstParseState *state, uint8_t c) {
|
|||||||
int dst_parser_consume(DstParser *parser, uint8_t c) {
|
int dst_parser_consume(DstParser *parser, uint8_t c) {
|
||||||
int consumed = 0;
|
int consumed = 0;
|
||||||
if (parser->error) return 0;
|
if (parser->error) return 0;
|
||||||
parser->index++;
|
if (c == '\n') {
|
||||||
|
parser->line++;
|
||||||
|
parser->col = 0;
|
||||||
|
} else if (c != '\r') {
|
||||||
|
parser->col++;
|
||||||
|
}
|
||||||
while (!consumed && !parser->error) {
|
while (!consumed && !parser->error) {
|
||||||
DstParseState *state = parser->states + parser->statecount - 1;
|
DstParseState *state = parser->states + parser->statecount - 1;
|
||||||
consumed = state->consumer(parser, state, c);
|
consumed = state->consumer(parser, state, c);
|
||||||
@ -575,7 +582,8 @@ void dst_parser_init(DstParser *parser) {
|
|||||||
parser->statecount = 0;
|
parser->statecount = 0;
|
||||||
parser->statecap = 0;
|
parser->statecap = 0;
|
||||||
parser->error = NULL;
|
parser->error = NULL;
|
||||||
parser->index = 0;
|
parser->line = 1;
|
||||||
|
parser->col = 0;
|
||||||
parser->lookback = -1;
|
parser->lookback = -1;
|
||||||
|
|
||||||
pushstate(parser, root, PFLAG_CONTAINER);
|
pushstate(parser, root, PFLAG_CONTAINER);
|
||||||
@ -722,6 +730,17 @@ static int cfun_flush(DstArgs args) {
|
|||||||
DST_RETURN(args, args.v[0]);
|
DST_RETURN(args, args.v[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int cfun_where(DstArgs args) {
|
||||||
|
DstParser *p;
|
||||||
|
DST_FIXARITY(args, 1);
|
||||||
|
DST_CHECKABSTRACT(args, 0, &dst_parse_parsertype);
|
||||||
|
p = (DstParser *) dst_unwrap_abstract(args.v[0]);
|
||||||
|
Dst *tup = dst_tuple_begin(2);
|
||||||
|
tup[0] = dst_wrap_integer((int32_t)p->line);
|
||||||
|
tup[1] = dst_wrap_integer((int32_t)p->col);
|
||||||
|
DST_RETURN_TUPLE(args, dst_tuple_end(tup));
|
||||||
|
}
|
||||||
|
|
||||||
static int cfun_state(DstArgs args) {
|
static int cfun_state(DstArgs args) {
|
||||||
size_t i;
|
size_t i;
|
||||||
const uint8_t *str;
|
const uint8_t *str;
|
||||||
@ -762,6 +781,7 @@ static const DstReg cfuns[] = {
|
|||||||
{"parser.status", cfun_status},
|
{"parser.status", cfun_status},
|
||||||
{"parser.flush", cfun_flush},
|
{"parser.flush", cfun_flush},
|
||||||
{"parser.state", cfun_state},
|
{"parser.state", cfun_state},
|
||||||
|
{"parser.where", cfun_where},
|
||||||
{NULL, NULL}
|
{NULL, NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -33,8 +33,8 @@ Dst *dst_tuple_begin(int32_t length) {
|
|||||||
char *data = dst_gcalloc(DST_MEMORY_TUPLE, 4 * sizeof(int32_t) + length * sizeof(Dst));
|
char *data = dst_gcalloc(DST_MEMORY_TUPLE, 4 * sizeof(int32_t) + length * sizeof(Dst));
|
||||||
Dst *tuple = (Dst *)(data + (4 * sizeof(int32_t)));
|
Dst *tuple = (Dst *)(data + (4 * sizeof(int32_t)));
|
||||||
dst_tuple_length(tuple) = length;
|
dst_tuple_length(tuple) = length;
|
||||||
dst_tuple_sm_start(tuple) = -1;
|
dst_tuple_sm_line(tuple) = 0;
|
||||||
dst_tuple_sm_end(tuple) = -1;
|
dst_tuple_sm_col(tuple) = 0;
|
||||||
return tuple;
|
return tuple;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -80,8 +80,8 @@ int dst_buffer_push_u64(DstBuffer *buffer, uint64_t x);
|
|||||||
#define dst_tuple_raw(t) ((int32_t *)(t) - 4)
|
#define dst_tuple_raw(t) ((int32_t *)(t) - 4)
|
||||||
#define dst_tuple_length(t) (dst_tuple_raw(t)[0])
|
#define dst_tuple_length(t) (dst_tuple_raw(t)[0])
|
||||||
#define dst_tuple_hash(t) ((dst_tuple_raw(t)[1]))
|
#define dst_tuple_hash(t) ((dst_tuple_raw(t)[1]))
|
||||||
#define dst_tuple_sm_start(t) ((dst_tuple_raw(t)[2]))
|
#define dst_tuple_sm_line(t) ((dst_tuple_raw(t)[2]))
|
||||||
#define dst_tuple_sm_end(t) ((dst_tuple_raw(t)[3]))
|
#define dst_tuple_sm_col(t) ((dst_tuple_raw(t)[3]))
|
||||||
Dst *dst_tuple_begin(int32_t length);
|
Dst *dst_tuple_begin(int32_t length);
|
||||||
const Dst *dst_tuple_end(Dst *tuple);
|
const Dst *dst_tuple_end(Dst *tuple);
|
||||||
const Dst *dst_tuple_n(Dst *values, int32_t n);
|
const Dst *dst_tuple_n(Dst *values, int32_t n);
|
||||||
|
@ -462,9 +462,10 @@ struct DstKV {
|
|||||||
#define DST_FUNCDEF_FLAG_VARARG 1
|
#define DST_FUNCDEF_FLAG_VARARG 1
|
||||||
#define DST_FUNCDEF_FLAG_NEEDSENV 4
|
#define DST_FUNCDEF_FLAG_NEEDSENV 4
|
||||||
|
|
||||||
|
/* Source mapping structure for a bytecode instruction */
|
||||||
struct DstSourceMapping {
|
struct DstSourceMapping {
|
||||||
int32_t start;
|
int32_t line;
|
||||||
int32_t end;
|
int32_t column;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* A function definition. Contains information needed to instantiate closures. */
|
/* A function definition. Contains information needed to instantiate closures. */
|
||||||
@ -529,7 +530,8 @@ struct DstParser {
|
|||||||
size_t statecap;
|
size_t statecap;
|
||||||
size_t bufcount;
|
size_t bufcount;
|
||||||
size_t bufcap;
|
size_t bufcap;
|
||||||
size_t index;
|
size_t line;
|
||||||
|
size_t col;
|
||||||
int lookback;
|
int lookback;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user