interactive debugging

pull/1321/head
Emily Hudson 2019-07-26 15:45:16 +01:00 committed by Alexander Medvednikov
parent 8b195ba32a
commit 90bb48db5d
4 changed files with 27 additions and 14 deletions

View File

@ -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 = ''

View File

@ -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')

View File

@ -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
}
}
}
}

View File

@ -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++
}