1
0
mirror of https://github.com/vlang/v.git synced 2023-08-10 21:13:21 +03:00

cgen.prepend_to_statement()

This commit is contained in:
Alexander Medvednikov 2019-12-11 20:43:13 +03:00
parent 47f9c02331
commit 6ffed854cc
3 changed files with 28 additions and 15 deletions

2
v.v
View File

@ -44,7 +44,7 @@ fn main() {
return
}
else if 'translate' in commands {
println('Translating C to V will be available in V 0.3')
println('Translating C to V will be available in V 0.3 (January)')
return
}
else if 'search' in commands || 'install' in commands || 'update' in commands || 'remove' in commands {

View File

@ -77,6 +77,16 @@ fn (g mut CGen) genln(s string) {
}
}
// same as `set_placeholder(0, s)`, but faster
fn (g mut CGen) prepend_to_statement(s string) {
if g.is_tmp {
g.tmp_line = s + g.tmp_line
return
}
g.lines << s
g.prev_line = g.cur_line
}
fn (g mut CGen) gen(s string) {
if g.nogen || g.pass != .main {
return
@ -160,6 +170,10 @@ fn (g mut CGen) set_placeholder(pos int, val string) {
if g.nogen || g.pass != .main {
return
}
//if pos == 0 {
//g.prepend_to_statement(val)
//return
//}
// g.lines.set(pos, val)
if g.is_tmp {
left := g.tmp_line[..pos]

View File

@ -1,3 +1,7 @@
// Copyright (c) 2019 Alexander Medvednikov. All rights reserved.
// Use of this source code is governed by an MIT license
// that can be found in the LICENSE file.
module compiler
import strings
@ -6,26 +10,18 @@ const (
dot_ptr = '->'
)
/*
fn (p mut Parser) gen_or_else(pos int) string {
}
*/
// returns the type of the new variable
fn (p mut Parser) gen_var_decl(name string, is_static bool) string {
// Generate expression to tmp because we need its type first
// `[typ] [name] = bool_expression();`
pos := p.cgen.add_placeholder()
p.is_var_decl = true
mut typ := p.bool_expression()
//mut typ, expr := p.tmp_expr()
p.is_var_decl = false
if typ.starts_with('...') { typ = typ[3..] }
//p.gen('/*after expr*/')
// Option check ? or {
or_else := p.tok == .key_orelse
if or_else {
return p.gen_handle_option_or_else(typ, name, pos)
return p.gen_handle_option_or_else(typ, name, 0)
}
gen_name := p.table.var_cgen_name(name)
mut nt_gen := p.table.cgen_name_type_pair(gen_name, typ)
@ -35,7 +31,7 @@ fn (p mut Parser) gen_var_decl(name string, is_static bool) string {
} else if typ.starts_with('[') && typ[ typ.len-1 ] != `*` {
// a fixed_array initializer, like `v := [1.1, 2.2]!!`
// ... should translate to the following in C `f32 v[2] = {1.1, 2.2};`
initializer := p.cgen.cur_line[pos..]
initializer := p.cgen.cur_line
if initializer.len > 0 {
p.cgen.resetln(' = {' + initializer.all_after('{') )
} else if initializer.len == 0 {
@ -46,7 +42,10 @@ fn (p mut Parser) gen_var_decl(name string, is_static bool) string {
if is_static {
nt_gen = 'static $nt_gen'
}
p.cgen.set_placeholder(pos, nt_gen)
// Now that we know the type, prepend it
// `[typ] [name] = bool_expression();`
//p.cgen.prepend_to_statement(nt_gen)
p.cgen.set_placeholder(0, nt_gen)
return typ
}