parser: optimize cross assign using expr.str() (#5604)
							parent
							
								
									013a4fc0f6
								
							
						
					
					
						commit
						2f614ad79f
					
				| 
						 | 
					@ -410,7 +410,6 @@ pub:
 | 
				
			||||||
pub struct IndexExpr {
 | 
					pub struct IndexExpr {
 | 
				
			||||||
pub:
 | 
					pub:
 | 
				
			||||||
	pos       token.Position
 | 
						pos       token.Position
 | 
				
			||||||
	expr      string // a[0] m['a'] etc
 | 
					 | 
				
			||||||
	left      Expr
 | 
						left      Expr
 | 
				
			||||||
	index     Expr // [0], [start..end] etc
 | 
						index     Expr // [0], [start..end] etc
 | 
				
			||||||
pub mut:
 | 
					pub mut:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1308,15 +1308,12 @@ fn (mut g Gen) gen_cross_tmp_variable(left []ast.Expr, val ast.Expr) {
 | 
				
			||||||
		ast.IndexExpr {
 | 
							ast.IndexExpr {
 | 
				
			||||||
			mut has_var := false
 | 
								mut has_var := false
 | 
				
			||||||
			for lx in left {
 | 
								for lx in left {
 | 
				
			||||||
				if lx is ast.IndexExpr {
 | 
									if val_.str() == lx.str() {
 | 
				
			||||||
					inx := lx as ast.IndexExpr
 | 
										g.write('_var_${lx.position().pos}')
 | 
				
			||||||
					if val.expr == inx.expr {
 | 
					 | 
				
			||||||
						g.write('_var_$inx.pos.pos')
 | 
					 | 
				
			||||||
					has_var = true
 | 
										has_var = true
 | 
				
			||||||
					break
 | 
										break
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if !has_var {
 | 
								if !has_var {
 | 
				
			||||||
				g.expr(val_)
 | 
									g.expr(val_)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -44,12 +44,13 @@ fn (mut p Parser) check_undefined_variables(exprs []ast.Expr, val ast.Expr) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn (mut p Parser) check_cross_variables(exprs []ast.Expr, val ast.Expr) bool {
 | 
					fn (mut p Parser) check_cross_variables(exprs []ast.Expr, val ast.Expr) bool {
 | 
				
			||||||
	match val {
 | 
						val_ := val
 | 
				
			||||||
 | 
						match val_ {
 | 
				
			||||||
		ast.Ident {
 | 
							ast.Ident {
 | 
				
			||||||
			for expr in exprs {
 | 
								for expr in exprs {
 | 
				
			||||||
				if expr is ast.Ident {
 | 
									if expr is ast.Ident {
 | 
				
			||||||
					ident := expr as ast.Ident
 | 
										ident := expr as ast.Ident
 | 
				
			||||||
					if ident.name == val.name {
 | 
										if ident.name == val_.name {
 | 
				
			||||||
						return true
 | 
											return true
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
| 
						 | 
					@ -57,17 +58,14 @@ fn (mut p Parser) check_cross_variables(exprs []ast.Expr, val ast.Expr) bool {
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		ast.IndexExpr {
 | 
							ast.IndexExpr {
 | 
				
			||||||
			for expr in exprs {
 | 
								for expr in exprs {
 | 
				
			||||||
				if expr is ast.IndexExpr {
 | 
									if expr.str() == val.str() {
 | 
				
			||||||
					idx := expr as ast.IndexExpr
 | 
					 | 
				
			||||||
					if idx.expr == val.expr {
 | 
					 | 
				
			||||||
					return true
 | 
										return true
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		}
 | 
							ast.InfixExpr { return p.check_cross_variables(exprs, val_.left) || p.check_cross_variables(exprs, val_.right) }
 | 
				
			||||||
		ast.InfixExpr { return p.check_cross_variables(exprs, val.left) || p.check_cross_variables(exprs, val.right) }
 | 
							ast.PrefixExpr { return p.check_cross_variables(exprs, val_.right) }
 | 
				
			||||||
		ast.PrefixExpr { return p.check_cross_variables(exprs, val.right) }
 | 
							ast.PostfixExpr { return p.check_cross_variables(exprs, val_.expr) }
 | 
				
			||||||
		ast.PostfixExpr { return p.check_cross_variables(exprs, val.expr) }
 | 
					 | 
				
			||||||
		else {}
 | 
							else {}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return false
 | 
						return false
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -985,12 +985,10 @@ fn (mut p Parser) index_expr(left ast.Expr) ast.IndexExpr {
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	// [expr]
 | 
						// [expr]
 | 
				
			||||||
	end := p.tok.position()
 | 
					 | 
				
			||||||
	p.check(.rsbr)
 | 
						p.check(.rsbr)
 | 
				
			||||||
	return ast.IndexExpr{
 | 
						return ast.IndexExpr{
 | 
				
			||||||
		left: left
 | 
							left: left
 | 
				
			||||||
		index: expr
 | 
							index: expr
 | 
				
			||||||
		expr: p.scanner.expr_string(left.position(), end).replace(' ', '')
 | 
					 | 
				
			||||||
		pos: p.tok.position()
 | 
							pos: p.tok.position()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1379,7 +1379,3 @@ pub fn (mut s Scanner) codegen(newtext string) {
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
pub fn (s Scanner) expr_string(start, end token.Position) string {
 | 
					 | 
				
			||||||
	return s.text[start.pos..end.pos].trim_space()
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue