js: change codegen for match statement, speedup string.split_into_lines (#12157)
parent
cfc56b24fb
commit
22962dd2d2
|
@ -755,18 +755,11 @@ pub fn (s string) split_into_lines() []string {
|
||||||
if s.len == 0 {
|
if s.len == 0 {
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
mut start := 0
|
#res.arr.arr = s.str.split("\n")
|
||||||
mut end := 0
|
#if (res.arr.arr[res.arr.arr.length-1] == "") res.arr.arr.pop();
|
||||||
for i := 0; i < s.len; i++ {
|
#res.arr.len = new int(res.arr.arr.length);
|
||||||
if s[i] == 10 {
|
#res.arr.cap = new int(res.arr.arr.length);
|
||||||
end = if i > 0 && s[i - 1] == 13 { i - 1 } else { i }
|
|
||||||
res << if start == end { '' } else { s[start..end] }
|
|
||||||
start = i + 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if start < s.len {
|
|
||||||
res << s[start..]
|
|
||||||
}
|
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@ import strings
|
||||||
|
|
||||||
type MyInt = int
|
type MyInt = int
|
||||||
|
|
||||||
const maxn = 1000
|
const maxn = 100000
|
||||||
|
|
||||||
fn test_sb() {
|
fn test_sb() {
|
||||||
mut sb := strings.new_builder(100)
|
mut sb := strings.new_builder(100)
|
||||||
|
|
|
@ -1995,42 +1995,79 @@ fn (mut g JsGen) match_expr_classic(node ast.MatchExpr, is_expr bool, cond_var M
|
||||||
}
|
}
|
||||||
match type_sym.kind {
|
match type_sym.kind {
|
||||||
.array {
|
.array {
|
||||||
g.write('vEq(')
|
ptr_typ := g.gen_array_equality_fn(node.cond_type)
|
||||||
|
|
||||||
|
g.write('${ptr_typ}_arr_eq(')
|
||||||
g.match_cond(cond_var)
|
g.match_cond(cond_var)
|
||||||
g.write(',')
|
g.write(',')
|
||||||
g.expr(expr)
|
g.expr(expr)
|
||||||
g.write(')')
|
g.write(').val')
|
||||||
}
|
}
|
||||||
.array_fixed {
|
.array_fixed {
|
||||||
g.write('vEq(')
|
ptr_typ := g.gen_fixed_array_equality_fn(node.cond_type)
|
||||||
|
|
||||||
|
g.write('${ptr_typ}_arr_eq(')
|
||||||
g.match_cond(cond_var)
|
g.match_cond(cond_var)
|
||||||
g.write(',')
|
g.write(',')
|
||||||
g.expr(expr)
|
g.expr(expr)
|
||||||
g.write(')')
|
g.write(').val')
|
||||||
}
|
}
|
||||||
.map {
|
.map {
|
||||||
g.write('vEq(')
|
ptr_typ := g.gen_map_equality_fn(node.cond_type)
|
||||||
|
|
||||||
|
g.write('${ptr_typ}_map_eq(')
|
||||||
g.match_cond(cond_var)
|
g.match_cond(cond_var)
|
||||||
g.write(',')
|
g.write(',')
|
||||||
g.expr(expr)
|
g.expr(expr)
|
||||||
g.write(')')
|
g.write(').val')
|
||||||
}
|
}
|
||||||
.string {
|
.string {
|
||||||
g.write('vEq(')
|
|
||||||
g.match_cond(cond_var)
|
g.match_cond(cond_var)
|
||||||
g.write(',')
|
g.write('.str === ')
|
||||||
g.expr(expr)
|
g.expr(expr)
|
||||||
g.write(')')
|
g.write('.str')
|
||||||
}
|
}
|
||||||
.struct_ {
|
.struct_ {
|
||||||
g.write('vEq(')
|
ptr_typ := g.gen_struct_equality_fn(node.cond_type)
|
||||||
|
|
||||||
|
g.write('${ptr_typ}_struct_eq(')
|
||||||
g.match_cond(cond_var)
|
g.match_cond(cond_var)
|
||||||
g.write(',')
|
g.write(',')
|
||||||
g.expr(expr)
|
g.expr(expr)
|
||||||
g.write(')')
|
g.write(').val')
|
||||||
|
}
|
||||||
|
.sum_type {
|
||||||
|
ptr_typ := g.gen_sumtype_equality_fn(node.cond_type)
|
||||||
|
|
||||||
|
g.write('${ptr_typ}_sumtype_eq(')
|
||||||
|
g.match_cond(cond_var)
|
||||||
|
g.write(',')
|
||||||
|
g.expr(expr)
|
||||||
|
g.write(').val')
|
||||||
|
}
|
||||||
|
.alias {
|
||||||
|
ptr_typ := g.gen_alias_equality_fn(node.cond_type)
|
||||||
|
|
||||||
|
g.write('${ptr_typ}_alias_eq(')
|
||||||
|
g.match_cond(cond_var)
|
||||||
|
g.write(',')
|
||||||
|
g.expr(expr)
|
||||||
|
g.write(').val')
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if expr is ast.RangeExpr {
|
has_operator_overloading := g.table.type_has_method(type_sym,
|
||||||
|
'==')
|
||||||
|
if has_operator_overloading {
|
||||||
|
left := g.unwrap(node.cond_type)
|
||||||
|
g.write(g.typ(left.unaliased.set_nr_muls(0)))
|
||||||
|
g.write('__eq(')
|
||||||
|
g.match_cond(cond_var)
|
||||||
|
g.gen_deref_ptr(node.cond_type)
|
||||||
|
g.write(',')
|
||||||
|
g.expr(expr)
|
||||||
|
g.write(')')
|
||||||
|
g.write('.valueOf()')
|
||||||
|
} else if expr is ast.RangeExpr {
|
||||||
// if type is unsigned and low is 0, check is unneeded
|
// if type is unsigned and low is 0, check is unneeded
|
||||||
mut skip_low := false
|
mut skip_low := false
|
||||||
if expr.low is ast.IntegerLiteral {
|
if expr.low is ast.IntegerLiteral {
|
||||||
|
@ -2144,6 +2181,7 @@ fn (mut g JsGen) stmts_with_tmp_var(stmts []ast.Stmt, tmp_var string) {
|
||||||
if g.inside_ternary {
|
if g.inside_ternary {
|
||||||
g.write('(')
|
g.write('(')
|
||||||
}
|
}
|
||||||
|
prev := g.inside_ternary
|
||||||
for i, stmt in stmts {
|
for i, stmt in stmts {
|
||||||
if i == stmts.len - 1 && tmp_var != '' {
|
if i == stmts.len - 1 && tmp_var != '' {
|
||||||
if g.inside_if_optional {
|
if g.inside_if_optional {
|
||||||
|
@ -2175,6 +2213,7 @@ fn (mut g JsGen) stmts_with_tmp_var(stmts []ast.Stmt, tmp_var string) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
g.dec_indent()
|
g.dec_indent()
|
||||||
|
g.inside_ternary = prev
|
||||||
if g.inside_ternary {
|
if g.inside_ternary {
|
||||||
g.write(')')
|
g.write(')')
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue