From 90bb48db5dabf990118a7fd262f26ec29a2b6483 Mon Sep 17 00:00:00 2001 From: Emily Hudson Date: Fri, 26 Jul 2019 15:45:16 +0100 Subject: [PATCH] interactive debugging --- compiler/cgen.v | 24 +++++++++++++++--------- compiler/main.v | 4 +++- compiler/parser.v | 11 ++++++++--- compiler/scanner.v | 2 +- 4 files changed, 27 insertions(+), 14 deletions(-) diff --git a/compiler/cgen.v b/compiler/cgen.v index 90330bf248..689d01843a 100644 --- a/compiler/cgen.v +++ b/compiler/cgen.v @@ -24,14 +24,17 @@ struct CGen { //buf strings.Builder is_user bool mut: - run Pass - nogen bool - tmp_line string - cur_line string - prev_line string - is_tmp bool - fn_main string - stash string + run Pass + nogen bool + tmp_line string + cur_line string + prev_line string + is_tmp bool + fn_main string + stash string + file string + line int + line_directives bool } fn new_cgen(out_name_c string) *CGen { @@ -44,7 +47,7 @@ fn new_cgen(out_name_c string) *CGen { out_path: path out: out //buf: strings.new_builder(10000) - lines: _make(0, 1000, sizeof(string)) + lines: _make(0, 1000, sizeof(string)) } return gen } @@ -59,6 +62,9 @@ fn (g mut CGen) genln(s string) { } g.cur_line = '$g.cur_line $s' if g.cur_line != '' { + if g.line_directives && g.cur_line.trim_space() != '' { + g.lines << '#line $g.line "$g.file"' + } g.lines << g.cur_line g.prev_line = g.cur_line g.cur_line = '' diff --git a/compiler/main.v b/compiler/main.v index 76e13cd6db..bbc0029ea8 100644 --- a/compiler/main.v +++ b/compiler/main.v @@ -90,6 +90,7 @@ mut: is_run bool show_c_cmd bool // `v -show_c_cmd` prints the C command to build program.v.c sanitize bool // use Clang's new "-fsanitize" option + is_debuggable bool is_debug bool // keep compiled C files no_auto_free bool // `v -nofree` disable automatic `free()` insertion for better performance in some applications (e.g. compilers) cflags string // Additional options which will be passed to the C compiler. @@ -1158,7 +1159,8 @@ fn new_v(args[]string) *V { is_play: args.contains('play') is_prod: args.contains('-prod') is_verbose: args.contains('-verbose') - is_debug: args.contains('-debug') + is_debuggable: args.contains('-g') // -debuggable implys debug + is_debug: args.contains('-debug') || args.contains('-g') obfuscate: obfuscate is_prof: args.contains('-prof') is_live: args.contains('-live') diff --git a/compiler/parser.v b/compiler/parser.v index 146c28d58a..fb6ddca11d 100644 --- a/compiler/parser.v +++ b/compiler/parser.v @@ -104,6 +104,10 @@ fn (c mut V) new_parser(path string, run Pass) Parser { path.contains('v/vlib')) } + + c.cgen.line_directives = c.pref.is_debuggable + c.cgen.file = path + p.next() // p.scanner.debug_tokens() return p @@ -1243,7 +1247,7 @@ fn (p mut Parser) var_decl() { // User user = *(User*)tmp.data; // p.assigned_var = '' p.cgen.set_placeholder(pos, '$typ $tmp = ') - p.gen(';') + p.genln(';') typ = typ.replace('Option_', '') p.next() p.check(.lcbr) @@ -3317,7 +3321,7 @@ fn (p mut Parser) return_st() { p.cgen.resetln('return $ret') } else { tmp := p.get_tmp() - p.cgen.resetln('$expr_type $tmp = $ret;') + p.cgen.resetln('$expr_type $tmp = $ret;\n') p.genln(p.cur_fn.defer_text) p.genln('return $tmp;') } @@ -3525,10 +3529,11 @@ fn (p mut Parser) fgenln(s string) { fn (p mut Parser) peek() Token { for { + p.cgen.line = p.scanner.line_nr + 1 tok := p.scanner.peek() if tok != .nl { return tok - } + } } } diff --git a/compiler/scanner.v b/compiler/scanner.v index 840610a4c5..0e1670a716 100644 --- a/compiler/scanner.v +++ b/compiler/scanner.v @@ -210,7 +210,7 @@ fn (s mut Scanner) skip_whitespace() { for s.pos < s.text.len && s.text[s.pos].is_white() { // Count \r\n as one line if is_nl(s.text[s.pos]) && !s.expect('\r\n', s.pos-1) { - s.line_nr++ + s.line_nr++ } s.pos++ }