parent
b9720f5d9e
commit
e5fb4e4845
|
@ -153,12 +153,17 @@ fn (mut g Gen) gen_array_map(node ast.CallExpr) {
|
||||||
verror('map() requires an array')
|
verror('map() requires an array')
|
||||||
}
|
}
|
||||||
g.empty_line = true
|
g.empty_line = true
|
||||||
|
g.writeln('$ret_typ $tmp;')
|
||||||
|
if g.infix_left_var_name.len > 0 {
|
||||||
|
g.writeln('if ($g.infix_left_var_name) {')
|
||||||
|
g.indent++
|
||||||
|
}
|
||||||
g.write('${g.typ(node.left_type)} ${tmp}_orig = ')
|
g.write('${g.typ(node.left_type)} ${tmp}_orig = ')
|
||||||
g.expr(node.left)
|
g.expr(node.left)
|
||||||
g.writeln(';')
|
g.writeln(';')
|
||||||
g.writeln('int ${tmp}_len = ${tmp}_orig.len;')
|
g.writeln('int ${tmp}_len = ${tmp}_orig.len;')
|
||||||
noscan := g.check_noscan(ret_info.elem_type)
|
noscan := g.check_noscan(ret_info.elem_type)
|
||||||
g.writeln('$ret_typ $tmp = __new_array${noscan}(0, ${tmp}_len, sizeof($ret_elem_type));\n')
|
g.writeln('$tmp = __new_array${noscan}(0, ${tmp}_len, sizeof($ret_elem_type));\n')
|
||||||
i := g.new_tmp_var()
|
i := g.new_tmp_var()
|
||||||
g.writeln('for (int $i = 0; $i < ${tmp}_len; ++$i) {')
|
g.writeln('for (int $i = 0; $i < ${tmp}_len; ++$i) {')
|
||||||
g.writeln('\t$inp_elem_type it = (($inp_elem_type*) ${tmp}_orig.data)[$i];')
|
g.writeln('\t$inp_elem_type it = (($inp_elem_type*) ${tmp}_orig.data)[$i];')
|
||||||
|
@ -206,6 +211,10 @@ fn (mut g Gen) gen_array_map(node ast.CallExpr) {
|
||||||
g.stmt_path_pos << g.out.len
|
g.stmt_path_pos << g.out.len
|
||||||
}
|
}
|
||||||
g.write('\n')
|
g.write('\n')
|
||||||
|
if g.infix_left_var_name.len > 0 {
|
||||||
|
g.indent--
|
||||||
|
g.writeln('}')
|
||||||
|
}
|
||||||
g.write(s)
|
g.write(s)
|
||||||
g.write(tmp)
|
g.write(tmp)
|
||||||
g.inside_lambda = false
|
g.inside_lambda = false
|
||||||
|
@ -327,12 +336,17 @@ fn (mut g Gen) gen_array_filter(node ast.CallExpr) {
|
||||||
styp := g.typ(node.return_type)
|
styp := g.typ(node.return_type)
|
||||||
elem_type_str := g.typ(info.elem_type)
|
elem_type_str := g.typ(info.elem_type)
|
||||||
g.empty_line = true
|
g.empty_line = true
|
||||||
|
g.writeln('$styp $tmp;')
|
||||||
|
if g.infix_left_var_name.len > 0 {
|
||||||
|
g.writeln('if ($g.infix_left_var_name) {')
|
||||||
|
g.indent++
|
||||||
|
}
|
||||||
g.write('${g.typ(node.left_type)} ${tmp}_orig = ')
|
g.write('${g.typ(node.left_type)} ${tmp}_orig = ')
|
||||||
g.expr(node.left)
|
g.expr(node.left)
|
||||||
g.writeln(';')
|
g.writeln(';')
|
||||||
g.writeln('int ${tmp}_len = ${tmp}_orig.len;')
|
g.writeln('int ${tmp}_len = ${tmp}_orig.len;')
|
||||||
noscan := g.check_noscan(info.elem_type)
|
noscan := g.check_noscan(info.elem_type)
|
||||||
g.writeln('$styp $tmp = __new_array${noscan}(0, ${tmp}_len, sizeof($elem_type_str));\n')
|
g.writeln('$tmp = __new_array${noscan}(0, ${tmp}_len, sizeof($elem_type_str));\n')
|
||||||
i := g.new_tmp_var()
|
i := g.new_tmp_var()
|
||||||
g.writeln('for (int $i = 0; $i < ${tmp}_len; ++$i) {')
|
g.writeln('for (int $i = 0; $i < ${tmp}_len; ++$i) {')
|
||||||
g.writeln('\t$elem_type_str it = (($elem_type_str*) ${tmp}_orig.data)[$i];')
|
g.writeln('\t$elem_type_str it = (($elem_type_str*) ${tmp}_orig.data)[$i];')
|
||||||
|
@ -380,6 +394,10 @@ fn (mut g Gen) gen_array_filter(node ast.CallExpr) {
|
||||||
g.stmt_path_pos << g.out.len
|
g.stmt_path_pos << g.out.len
|
||||||
}
|
}
|
||||||
g.write('\n')
|
g.write('\n')
|
||||||
|
if g.infix_left_var_name.len > 0 {
|
||||||
|
g.indent--
|
||||||
|
g.writeln('}')
|
||||||
|
}
|
||||||
g.write(s)
|
g.write(s)
|
||||||
g.write(tmp)
|
g.write(tmp)
|
||||||
}
|
}
|
||||||
|
|
|
@ -608,6 +608,41 @@ fn (mut g Gen) infix_expr_left_shift_op(node ast.InfixExpr) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn (mut g Gen) need_tmp_var_in_array_call(node ast.Expr) bool {
|
||||||
|
match node {
|
||||||
|
ast.CallExpr {
|
||||||
|
if node.left_type != 0 && g.table.get_type_symbol(node.left_type).kind == .array
|
||||||
|
&& node.name in ['all', 'any', 'filter', 'map'] {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ast.IndexExpr {
|
||||||
|
return g.need_tmp_var_in_array_call(node.left)
|
||||||
|
}
|
||||||
|
ast.InfixExpr {
|
||||||
|
return g.need_tmp_var_in_array_call(node.left)
|
||||||
|
|| g.need_tmp_var_in_array_call(node.right)
|
||||||
|
}
|
||||||
|
ast.ParExpr {
|
||||||
|
return g.need_tmp_var_in_array_call(node.expr)
|
||||||
|
}
|
||||||
|
ast.PostfixExpr {
|
||||||
|
return g.need_tmp_var_in_array_call(node.expr)
|
||||||
|
}
|
||||||
|
ast.PrefixExpr {
|
||||||
|
return g.need_tmp_var_in_array_call(node.right)
|
||||||
|
}
|
||||||
|
ast.RangeExpr {
|
||||||
|
return g.need_tmp_var_in_array_call(node.low) || g.need_tmp_var_in_array_call(node.high)
|
||||||
|
}
|
||||||
|
ast.SelectorExpr {
|
||||||
|
return g.need_tmp_var_in_array_call(node.expr)
|
||||||
|
}
|
||||||
|
else {}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
// infix_expr_and_or_op generates code for `&&` and `||`
|
// infix_expr_and_or_op generates code for `&&` and `||`
|
||||||
fn (mut g Gen) infix_expr_and_or_op(node ast.InfixExpr) {
|
fn (mut g Gen) infix_expr_and_or_op(node ast.InfixExpr) {
|
||||||
if node.right is ast.IfExpr {
|
if node.right is ast.IfExpr {
|
||||||
|
@ -630,24 +665,20 @@ fn (mut g Gen) infix_expr_and_or_op(node ast.InfixExpr) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
g.inside_ternary = prev_inside_ternary
|
g.inside_ternary = prev_inside_ternary
|
||||||
} else if node.right is ast.CallExpr {
|
} else if g.need_tmp_var_in_array_call(node.right) {
|
||||||
if node.right.left_type != 0 {
|
// if a == 0 || arr.any(it.is_letter())
|
||||||
sym := g.table.get_type_symbol(node.right.left_type)
|
tmp := g.new_tmp_var()
|
||||||
if sym.kind == .array && node.right.name in ['map', 'filter', 'all', 'any'] {
|
cur_line := g.go_before_stmt(0).trim_space()
|
||||||
tmp := g.new_tmp_var()
|
g.empty_line = true
|
||||||
cur_line := g.go_before_stmt(0).trim_space()
|
g.write('bool $tmp = (')
|
||||||
g.empty_line = true
|
g.expr(node.left)
|
||||||
g.write('bool $tmp = (')
|
g.writeln(');')
|
||||||
g.expr(node.left)
|
g.stmt_path_pos << g.out.len
|
||||||
g.writeln(');')
|
g.write('$cur_line $tmp $node.op.str() ')
|
||||||
g.stmt_path_pos << g.out.len
|
g.infix_left_var_name = if node.op == .and { tmp } else { '!$tmp' }
|
||||||
g.write('$cur_line $tmp $node.op.str() ')
|
g.expr(node.right)
|
||||||
g.infix_left_var_name = if node.op == .and { tmp } else { '!$tmp' }
|
g.infix_left_var_name = ''
|
||||||
g.expr(node.right)
|
return
|
||||||
g.infix_left_var_name = ''
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
g.gen_plain_infix_expr(node)
|
g.gen_plain_infix_expr(node)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
fn test_if_expr_with_array_all_any() {
|
fn test_if_expr_with_array_call() {
|
||||||
arr := ['']
|
arr := ['']
|
||||||
|
|
||||||
for i in arr {
|
for i in arr {
|
||||||
|
@ -8,10 +8,46 @@ fn test_if_expr_with_array_all_any() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for i in arr {
|
||||||
|
if i.len == 0 || (i[1..].bytes().all(it.is_letter())) {
|
||||||
|
println('empty or all char from second is letter!')
|
||||||
|
assert true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for i in arr {
|
for i in arr {
|
||||||
if i.len == 0 || i[1..].bytes().any(it.is_letter()) {
|
if i.len == 0 || i[1..].bytes().any(it.is_letter()) {
|
||||||
println('empty or all char from second is letter!')
|
println('empty or all char from second is letter!')
|
||||||
assert true
|
assert true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for i in arr {
|
||||||
|
if i.len == 0 || (i[1..].bytes().any(it.is_letter())) {
|
||||||
|
println('empty or all char from second is letter!')
|
||||||
|
assert true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
arr2 := ['abc']
|
||||||
|
|
||||||
|
if arr2.len == 1 || arr2[1].bytes().map(it.is_letter())[0] {
|
||||||
|
println('yes')
|
||||||
|
assert true
|
||||||
|
}
|
||||||
|
|
||||||
|
if arr2.len == 1 || (arr2[1].bytes().map(it.is_letter())[0]) {
|
||||||
|
println('yes')
|
||||||
|
assert true
|
||||||
|
}
|
||||||
|
|
||||||
|
if arr2.len == 1 || arr2[1].bytes().filter(it.is_letter()).len == 0 {
|
||||||
|
println('yes')
|
||||||
|
assert true
|
||||||
|
}
|
||||||
|
|
||||||
|
if arr2.len == 1 || (arr2[1].bytes().filter(it.is_letter()).len == 0) {
|
||||||
|
println('yes')
|
||||||
|
assert true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue