mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
v2: cleanup old & unused code, add new simple tmp vars in cgen
This commit is contained in:
parent
2e1dbd9f5a
commit
ecb0af36b3
@ -13,6 +13,7 @@ struct Gen {
|
|||||||
table &table.Table
|
table &table.Table
|
||||||
mut:
|
mut:
|
||||||
fn_decl &ast.FnDecl // pointer to the FnDecl we are currently inside otherwise 0
|
fn_decl &ast.FnDecl // pointer to the FnDecl we are currently inside otherwise 0
|
||||||
|
tmp_count int
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn cgen(files []ast.File, table &table.Table) string {
|
pub fn cgen(files []ast.File, table &table.Table) string {
|
||||||
@ -39,6 +40,15 @@ pub fn (g mut Gen) writeln(s string) {
|
|||||||
g.out.writeln(s)
|
g.out.writeln(s)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn (g mut Gen) new_tmp_var() string {
|
||||||
|
g.tmp_count++
|
||||||
|
return 'tmp$g.tmp_count'
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn (g mut Gen) reset_tmp_count() {
|
||||||
|
g.tmp_count = 0
|
||||||
|
}
|
||||||
|
|
||||||
fn (g mut Gen) stmts(stmts []ast.Stmt) {
|
fn (g mut Gen) stmts(stmts []ast.Stmt) {
|
||||||
for stmt in stmts {
|
for stmt in stmts {
|
||||||
g.stmt(stmt)
|
g.stmt(stmt)
|
||||||
@ -60,6 +70,7 @@ fn (g mut Gen) stmt(node ast.Stmt) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
ast.FnDecl {
|
ast.FnDecl {
|
||||||
|
g.reset_tmp_count()
|
||||||
g.fn_decl = it // &it
|
g.fn_decl = it // &it
|
||||||
is_main := it.name == 'main'
|
is_main := it.name == 'main'
|
||||||
if is_main {
|
if is_main {
|
||||||
@ -286,11 +297,10 @@ fn (g mut Gen) expr(node ast.Expr) {
|
|||||||
ast.IfExpr {
|
ast.IfExpr {
|
||||||
// If expression? Assign the value to a temp var.
|
// If expression? Assign the value to a temp var.
|
||||||
// Previously ?: was used, but it's too unreliable.
|
// Previously ?: was used, but it's too unreliable.
|
||||||
// ti := g.table.refresh_ti(it.ti)
|
|
||||||
type_sym := g.table.get_type_symbol(it.typ)
|
type_sym := g.table.get_type_symbol(it.typ)
|
||||||
mut tmp := ''
|
mut tmp := ''
|
||||||
if type_sym.kind != .void {
|
if type_sym.kind != .void {
|
||||||
tmp = g.table.new_tmp_var()
|
tmp = g.new_tmp_var()
|
||||||
// g.writeln('$ti.name $tmp;')
|
// g.writeln('$ti.name $tmp;')
|
||||||
}
|
}
|
||||||
g.write('if (')
|
g.write('if (')
|
||||||
@ -317,7 +327,7 @@ fn (g mut Gen) expr(node ast.Expr) {
|
|||||||
type_sym := g.table.get_type_symbol(it.typ)
|
type_sym := g.table.get_type_symbol(it.typ)
|
||||||
mut tmp := ''
|
mut tmp := ''
|
||||||
if type_sym.kind != .void {
|
if type_sym.kind != .void {
|
||||||
tmp = g.table.new_tmp_var()
|
tmp = g.new_tmp_var()
|
||||||
}
|
}
|
||||||
g.write('$type_sym.name $tmp = ')
|
g.write('$type_sym.name $tmp = ')
|
||||||
g.expr(it.cond)
|
g.expr(it.cond)
|
||||||
|
@ -112,12 +112,12 @@ void println(string s) {
|
|||||||
|
|
||||||
void matches() {
|
void matches() {
|
||||||
int a = 100;
|
int a = 100;
|
||||||
int tmp3 = a;
|
int tmp1 = a;
|
||||||
if tmp3 == 10{
|
if tmp1 == 10{
|
||||||
println(tos3("10"));
|
println(tos3("10"));
|
||||||
|
|
||||||
}
|
}
|
||||||
if tmp3 == 20{
|
if tmp1 == 20{
|
||||||
int k = a + 1;
|
int k = a + 1;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -149,7 +149,6 @@ pub fn (p mut Parser) close_scope() {
|
|||||||
|
|
||||||
pub fn (p mut Parser) parse_block() []ast.Stmt {
|
pub fn (p mut Parser) parse_block() []ast.Stmt {
|
||||||
p.open_scope()
|
p.open_scope()
|
||||||
p.table.open_scope()
|
|
||||||
p.check(.lcbr)
|
p.check(.lcbr)
|
||||||
mut stmts := []ast.Stmt
|
mut stmts := []ast.Stmt
|
||||||
if p.tok.kind != .rcbr {
|
if p.tok.kind != .rcbr {
|
||||||
@ -164,7 +163,6 @@ pub fn (p mut Parser) parse_block() []ast.Stmt {
|
|||||||
p.check(.rcbr)
|
p.check(.rcbr)
|
||||||
println('parse block')
|
println('parse block')
|
||||||
p.close_scope()
|
p.close_scope()
|
||||||
p.table.close_scope()
|
|
||||||
// println('nr exprs in block = $exprs.len')
|
// println('nr exprs in block = $exprs.len')
|
||||||
return stmts
|
return stmts
|
||||||
}
|
}
|
||||||
@ -789,7 +787,6 @@ fn (p mut Parser) dot_expr(left ast.Expr, left_type table.Type) ast.Expr {
|
|||||||
field_name := p.check_name()
|
field_name := p.check_name()
|
||||||
if field_name == 'filter' {
|
if field_name == 'filter' {
|
||||||
p.open_scope()
|
p.open_scope()
|
||||||
p.table.open_scope()
|
|
||||||
p.filter(left_type)
|
p.filter(left_type)
|
||||||
}
|
}
|
||||||
// Method call
|
// Method call
|
||||||
@ -823,7 +820,6 @@ fn (p mut Parser) dot_expr(left ast.Expr, left_type table.Type) ast.Expr {
|
|||||||
node = sel_expr
|
node = sel_expr
|
||||||
if field_name == 'filter' {
|
if field_name == 'filter' {
|
||||||
p.close_scope()
|
p.close_scope()
|
||||||
p.table.close_scope()
|
|
||||||
}
|
}
|
||||||
return node
|
return node
|
||||||
}
|
}
|
||||||
@ -872,13 +868,11 @@ fn (p mut Parser) enum_val() (ast.Expr,table.Type) {
|
|||||||
fn (p mut Parser) for_statement() ast.Stmt {
|
fn (p mut Parser) for_statement() ast.Stmt {
|
||||||
p.check(.key_for)
|
p.check(.key_for)
|
||||||
p.open_scope()
|
p.open_scope()
|
||||||
p.table.open_scope()
|
// defer { p.close_scope() }
|
||||||
// defer { p.table.close_scope() }
|
|
||||||
// Infinite loop
|
// Infinite loop
|
||||||
if p.tok.kind == .lcbr {
|
if p.tok.kind == .lcbr {
|
||||||
stmts := p.parse_block()
|
stmts := p.parse_block()
|
||||||
p.close_scope()
|
p.close_scope()
|
||||||
p.table.close_scope()
|
|
||||||
return ast.ForStmt{
|
return ast.ForStmt{
|
||||||
stmts: stmts
|
stmts: stmts
|
||||||
pos: p.tok.position()
|
pos: p.tok.position()
|
||||||
@ -917,7 +911,6 @@ fn (p mut Parser) for_statement() ast.Stmt {
|
|||||||
}
|
}
|
||||||
stmts := p.parse_block()
|
stmts := p.parse_block()
|
||||||
p.close_scope()
|
p.close_scope()
|
||||||
p.table.close_scope()
|
|
||||||
return ast.ForCStmt{
|
return ast.ForCStmt{
|
||||||
stmts: stmts
|
stmts: stmts
|
||||||
init: init
|
init: init
|
||||||
@ -981,7 +974,6 @@ fn (p mut Parser) for_statement() ast.Stmt {
|
|||||||
stmts := p.parse_block()
|
stmts := p.parse_block()
|
||||||
// println('nr stmts=$stmts.len')
|
// println('nr stmts=$stmts.len')
|
||||||
p.close_scope()
|
p.close_scope()
|
||||||
p.table.close_scope()
|
|
||||||
return ast.ForStmt{
|
return ast.ForStmt{
|
||||||
stmts: stmts
|
stmts: stmts
|
||||||
pos: p.tok.position()
|
pos: p.tok.position()
|
||||||
@ -991,7 +983,6 @@ fn (p mut Parser) for_statement() ast.Stmt {
|
|||||||
cond,_ := p.expr(0)
|
cond,_ := p.expr(0)
|
||||||
stmts := p.parse_block()
|
stmts := p.parse_block()
|
||||||
p.close_scope()
|
p.close_scope()
|
||||||
p.table.close_scope()
|
|
||||||
return ast.ForStmt{
|
return ast.ForStmt{
|
||||||
cond: cond
|
cond: cond
|
||||||
stmts: stmts
|
stmts: stmts
|
||||||
|
@ -11,13 +11,9 @@ pub mut:
|
|||||||
types []TypeSymbol
|
types []TypeSymbol
|
||||||
// type_idxs Hashmap
|
// type_idxs Hashmap
|
||||||
type_idxs map[string]int
|
type_idxs map[string]int
|
||||||
local_vars []Var
|
|
||||||
scope_level int
|
|
||||||
var_idx int
|
|
||||||
// fns Hashmap
|
// fns Hashmap
|
||||||
fns map[string]Fn
|
fns map[string]Fn
|
||||||
consts map[string]Var
|
consts map[string]Var
|
||||||
tmp_cnt int
|
|
||||||
imports []string // List of all imports
|
imports []string // List of all imports
|
||||||
modules []string // List of all modules registered by the application
|
modules []string // List of all modules registered by the application
|
||||||
}
|
}
|
||||||
@ -51,33 +47,6 @@ pub fn new_table() &Table {
|
|||||||
return t
|
return t
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn (t &Table) find_var_idx(name string) int {
|
|
||||||
for i, var in t.local_vars {
|
|
||||||
if var.name == name {
|
|
||||||
return i
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return -1
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn (t &Table) find_var(name string) ?Var {
|
|
||||||
for i in 0 .. t.var_idx {
|
|
||||||
if t.local_vars[i].name == name {
|
|
||||||
return t.local_vars[i]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
// println(t.names)
|
|
||||||
for var in t.local_vars {
|
|
||||||
if var.name == name {
|
|
||||||
return var
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
return none
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn (t mut Table) register_const(v Var) {
|
pub fn (t mut Table) register_const(v Var) {
|
||||||
t.consts[v.name] = v
|
t.consts[v.name] = v
|
||||||
}
|
}
|
||||||
@ -91,86 +60,9 @@ pub fn (t mut Table) register_global(name string, typ Type) {
|
|||||||
// mod: p.mod
|
// mod: p.mod
|
||||||
// is_mut: true
|
// is_mut: true
|
||||||
// idx: -1
|
// idx: -1
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn (t mut Table) register_var(v Var) {
|
|
||||||
typ_sym := t.get_type_symbol(v.typ)
|
|
||||||
println('register_var: $v.name - $typ_sym.name')
|
|
||||||
new_var := {
|
|
||||||
v |
|
|
||||||
idx:t.var_idx,
|
|
||||||
scope_level:t.scope_level
|
|
||||||
}
|
|
||||||
// t.local_vars << v
|
|
||||||
/*
|
|
||||||
if v.line_nr == 0 {
|
|
||||||
new_var.token_idx = p.cur_tok_index()
|
|
||||||
new_var.line_nr = p.cur_tok().line_nr
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
// Expand the array
|
|
||||||
if t.var_idx >= t.local_vars.len {
|
|
||||||
t.local_vars << new_var
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
t.local_vars[t.var_idx] = new_var
|
|
||||||
}
|
|
||||||
t.var_idx++
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn (t mut Table) open_scope() {
|
|
||||||
t.scope_level++
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn (t mut Table) close_scope() {
|
|
||||||
// println('close_scope level=$f.scope_level var_idx=$f.var_idx')
|
|
||||||
// Move back `var_idx` (pointer to the end of the array) till we reach
|
|
||||||
// the previous scope level. This effectivly deletes (closes) current
|
|
||||||
// scope.
|
|
||||||
mut i := t.var_idx - 1
|
|
||||||
for ; i >= 0; i-- {
|
|
||||||
var := t.local_vars[i]
|
|
||||||
/*
|
|
||||||
if p.pref.autofree && (v.is_alloc || (v.is_arg && v.typ == 'string')) {
|
|
||||||
// && !p.pref.is_test {
|
|
||||||
p.free_var(v)
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
// if p.fileis('mem.v') {
|
|
||||||
// println(v.name + ' $v.is_arg scope=$v.scope_level cur=$p.cur_fn.scope_level')}
|
|
||||||
if var.scope_level != t.scope_level {
|
|
||||||
// && !v.is_arg {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
if p.cur_fn.defer_text.last() != '' {
|
|
||||||
p.genln(p.cur_fn.defer_text.last())
|
|
||||||
// p.cur_fn.defer_text[f] = ''
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
t.scope_level--
|
|
||||||
// p.cur_fn.defer_text = p.cur_fn.defer_text[..p.cur_fn.scope_level + 1]
|
|
||||||
t.var_idx = i + 1
|
|
||||||
// println('close_scope new var_idx=$f.var_idx\n')
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn (p mut Table) clear_vars() {
|
|
||||||
// shared a := [1, 2, 3]
|
|
||||||
p.var_idx = 0
|
|
||||||
if p.local_vars.len > 0 {
|
|
||||||
// ///if p.pref.autofree {
|
|
||||||
// p.local_vars.free()
|
|
||||||
// ///}
|
|
||||||
p.local_vars = []
|
|
||||||
}
|
|
||||||
p.tmp_cnt = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn (t &Table) find_fn(name string) ?Fn {
|
pub fn (t &Table) find_fn(name string) ?Fn {
|
||||||
f := t.fns[name]
|
f := t.fns[name]
|
||||||
if f.name.str != 0 {
|
if f.name.str != 0 {
|
||||||
@ -204,11 +96,6 @@ pub fn (t &Table) register_method(typ &TypeSymbol, new_fn Fn) bool {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn (t mut Table) new_tmp_var() string {
|
|
||||||
t.tmp_cnt++
|
|
||||||
return 'tmp$t.tmp_cnt'
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn (t &TypeSymbol) has_method(name string) bool {
|
pub fn (t &TypeSymbol) has_method(name string) bool {
|
||||||
t.find_method(name) or {
|
t.find_method(name) or {
|
||||||
return false
|
return false
|
||||||
@ -500,86 +387,6 @@ pub fn (t &Table) check(got, expected Type) bool {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
[inline]
|
|
||||||
pub fn (t &Table) get_expr_typ(expr ast.Expr) TypeSymbol {
|
|
||||||
match expr {
|
|
||||||
ast.ArrayInit {
|
|
||||||
return it.typ
|
|
||||||
}
|
|
||||||
ast.IndexExpr {
|
|
||||||
return t.get_expr_typ(it.left)
|
|
||||||
}
|
|
||||||
ast.CallExpr {
|
|
||||||
func := t.find_fn(it.name) or {
|
|
||||||
return void_typ
|
|
||||||
}
|
|
||||||
return func.return_typ
|
|
||||||
}
|
|
||||||
ast.MethodCallExpr {
|
|
||||||
ti := t.get_expr_typ(it.expr)
|
|
||||||
func := t.find_method(typ.idx, it.name) or {
|
|
||||||
return void_type
|
|
||||||
}
|
|
||||||
return func.return_typ
|
|
||||||
}
|
|
||||||
ast.Ident {
|
|
||||||
if it.kind == .variable {
|
|
||||||
info := it.info as ast.IdentVar
|
|
||||||
if info.typ.kind != .unresolved {
|
|
||||||
return info.ti
|
|
||||||
}
|
|
||||||
return t.get_expr_typ(info.expr)
|
|
||||||
}
|
|
||||||
return types.void_typ
|
|
||||||
}
|
|
||||||
ast.StructInit {
|
|
||||||
return it.ti
|
|
||||||
}
|
|
||||||
ast.StringLiteral {
|
|
||||||
return types.string_typ
|
|
||||||
}
|
|
||||||
ast.IntegerLiteral {
|
|
||||||
return types.int_typ
|
|
||||||
}
|
|
||||||
ast.SelectorExpr {
|
|
||||||
ti := t.get_expr_typ(it.expr)
|
|
||||||
kind := t.types[typ.idx].kind
|
|
||||||
if typ.kind == .placeholder {
|
|
||||||
println(' ##### PH $typ.name')
|
|
||||||
}
|
|
||||||
if !(kind in [.placeholder, .struct_]) {
|
|
||||||
return types.void_typ
|
|
||||||
}
|
|
||||||
struct_ := t.types[typ.idx]
|
|
||||||
struct_info := struct_.info as types.Struct
|
|
||||||
for field in struct_info.fields {
|
|
||||||
if field.name == it.field {
|
|
||||||
return field.ti
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if struct_.parent_idx != 0 {
|
|
||||||
parent := t.types[struct_.parent_idx]
|
|
||||||
parent_info := parent.info as types.Struct
|
|
||||||
for field in parent_info.fields {
|
|
||||||
if field.name == it.field {
|
|
||||||
return field.ti
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return types.void_typ
|
|
||||||
}
|
|
||||||
ast.InfixExpr {
|
|
||||||
return t.get_expr_typ(it.left)
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return types.void_typ
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
pub fn (t &Table) known_import(name string) bool {
|
pub fn (t &Table) known_import(name string) bool {
|
||||||
for i in t.imports {
|
for i in t.imports {
|
||||||
if i.all_after('.') == name {
|
if i.all_after('.') == name {
|
||||||
|
Loading…
Reference in New Issue
Block a user