cgen: -autofree fixes for []string{} having literals, comming from defailt string stuct field values

pull/9439/head
Delyan Angelov 2021-03-23 18:54:37 +02:00
parent 7101d53d74
commit 8abfe2f5a2
No known key found for this signature in database
GPG Key ID: 66886C0F12D595ED
3 changed files with 33 additions and 13 deletions

View File

@ -62,10 +62,13 @@ fn new_aints(ovals []int, extreme_mins int, extreme_maxs int) Aints {
mut imin := math.max_i32 mut imin := math.max_i32
mut imax := -math.max_i32 mut imax := -math.max_i32
// discard the extremes: // discard the extremes:
mut vals := ovals.clone() mut vals := []int{}
for x in ovals {
vals << x
}
vals.sort() vals.sort()
if vals.len > extreme_mins + extreme_maxs { if vals.len > extreme_mins + extreme_maxs {
vals = vals[extreme_mins..vals.len - extreme_maxs] vals = vals[extreme_mins..vals.len - extreme_maxs].clone()
} else { } else {
vals = [] vals = []
} }
@ -152,7 +155,10 @@ fn (mut context Context) parse_options() {
exit(1) exit(1)
} }
context.commands = context.expand_all_commands(commands) context.commands = context.expand_all_commands(commands)
context.results = []CmdResult{len: context.commands.len, init: CmdResult{}} context.results = []CmdResult{len: context.commands.len, cap: 100, init: CmdResult{
outputs: []string{cap: 1000}
timings: []int{cap: 1000}
}}
if context.use_newline { if context.use_newline {
context.cline = '\n' context.cline = '\n'
context.cgoback = '\n' context.cgoback = '\n'
@ -170,7 +176,8 @@ fn (mut context Context) expand_all_commands(commands []string) []string {
mut all_commands := []string{} mut all_commands := []string{}
for cmd in commands { for cmd in commands {
maincmd := context.cmd_template.replace('{T}', cmd) maincmd := context.cmd_template.replace('{T}', cmd)
mut substituted_commands := [maincmd] mut substituted_commands := []string{}
substituted_commands << maincmd
for paramk, paramlist in context.cmd_params { for paramk, paramlist in context.cmd_params {
for paramv in paramlist { for paramv in paramlist {
mut new_substituted_commands := []string{} mut new_substituted_commands := []string{}
@ -178,10 +185,14 @@ fn (mut context Context) expand_all_commands(commands []string) []string {
scmd := cscmd.replace(paramk, paramv) scmd := cscmd.replace(paramk, paramv)
new_substituted_commands << scmd new_substituted_commands << scmd
} }
substituted_commands << new_substituted_commands for sc in new_substituted_commands {
substituted_commands << sc
}
} }
} }
all_commands << substituted_commands for sc in substituted_commands {
all_commands << sc
}
} }
mut unique := map[string]int{} mut unique := map[string]int{}
for x in all_commands { for x in all_commands {
@ -228,8 +239,10 @@ fn (mut context Context) run() {
eprintln('${i:10} non 0 exit code for cmd: $cmd') eprintln('${i:10} non 0 exit code for cmd: $cmd')
continue continue
} }
context.results[icmd].outputs << res.output.trim_right('\r\n').replace('\r\n', trimed_output := res.output.trim_right('\r\n')
'\n').split('\n') trimed_normalized := trimed_output.replace('\r\n', '\n')
lines := trimed_normalized.split('\n')
context.results[icmd].outputs << lines
context.results[icmd].timings << duration context.results[icmd].timings << duration
sum += duration sum += duration
runs++ runs++
@ -296,10 +309,12 @@ fn (mut context Context) show_diff_summary() {
println('Summary (commands are ordered by ascending mean time), after $context.series series of $context.count repetitions:') println('Summary (commands are ordered by ascending mean time), after $context.series series of $context.count repetitions:')
base := context.results[0].atiming.average base := context.results[0].atiming.average
mut first_cmd_percentage := f64(100.0) mut first_cmd_percentage := f64(100.0)
mut first_marker := ''
for i, r in context.results { for i, r in context.results {
first_marker = ' '
cpercent := (r.atiming.average / base) * 100 - 100 cpercent := (r.atiming.average / base) * 100 - 100
first_marker := if r.icmd == 0 { util.bold('>') } else { ' ' }
if r.icmd == 0 { if r.icmd == 0 {
first_marker = util.bold('>')
first_cmd_percentage = cpercent first_cmd_percentage = cpercent
} }
println(' $first_marker${(i + 1):3} | ${cpercent:5.1f}% slower | ${r.cmd:-57s} | $r.atiming') println(' $first_marker${(i + 1):3} | ${cpercent:5.1f}% slower | ${r.cmd:-57s} | $r.atiming')

View File

@ -5715,7 +5715,7 @@ fn (mut g Gen) type_default(typ_ table.Type) string {
} }
*/ */
match sym.name { match sym.name {
'string' { return '(string){.str=(byteptr)""}' } 'string' { return '(string){.str=(byteptr)"", .is_lit=1}' }
'rune' { return '0' } 'rune' { return '0' }
else {} else {}
} }

View File

@ -478,9 +478,10 @@ fn (mut g Gen) method_call(node ast.CallExpr) {
if node.receiver_type == 0 { if node.receiver_type == 0 {
g.checker_bug('CallExpr.receiver_type is 0 in method_call', node.pos) g.checker_bug('CallExpr.receiver_type is 0 in method_call', node.pos)
} }
typ_sym := g.table.get_type_symbol(g.unwrap_generic(node.receiver_type)) unwrapped_rec_type := g.unwrap_generic(node.receiver_type)
mut receiver_type_name := util.no_dots(g.cc_type(g.unwrap_generic(node.receiver_type), typ_sym := g.table.get_type_symbol(unwrapped_rec_type)
false)) rec_cc_type := g.cc_type(unwrapped_rec_type, false)
mut receiver_type_name := util.no_dots(rec_cc_type)
if typ_sym.kind == .interface_ && (typ_sym.info as table.Interface).defines_method(node.name) { if typ_sym.kind == .interface_ && (typ_sym.info as table.Interface).defines_method(node.name) {
// Speaker_name_table[s._interface_idx].speak(s._object) // Speaker_name_table[s._interface_idx].speak(s._object)
$if debug_interface_method_call ? { $if debug_interface_method_call ? {
@ -578,6 +579,10 @@ fn (mut g Gen) method_call(node ast.CallExpr) {
// && rec_sym.name == 'array' && receiver_name.starts_with('array') { // && rec_sym.name == 'array' && receiver_name.starts_with('array') {
// `array_byte_clone` => `array_clone` // `array_byte_clone` => `array_clone`
receiver_type_name = 'array' receiver_type_name = 'array'
if false && node.name == 'free' && typ_sym.has_method(node.name) {
// TODO: allow for more specific overrides of array .free() like `pub fn (x []string) free() {`
receiver_type_name = g.typ(unwrapped_rec_type).trim('*')
}
if node.name in ['last', 'first', 'pop'] { if node.name in ['last', 'first', 'pop'] {
return_type_str := g.typ(node.return_type) return_type_str := g.typ(node.return_type)
has_cast = true has_cast = true