diff --git a/cmd/tools/repeat.v b/cmd/tools/repeat.v index c5a19e9c98..0df1a4d197 100644 --- a/cmd/tools/repeat.v +++ b/cmd/tools/repeat.v @@ -62,10 +62,13 @@ fn new_aints(ovals []int, extreme_mins int, extreme_maxs int) Aints { mut imin := math.max_i32 mut imax := -math.max_i32 // discard the extremes: - mut vals := ovals.clone() + mut vals := []int{} + for x in ovals { + vals << x + } vals.sort() 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 { vals = [] } @@ -152,7 +155,10 @@ fn (mut context Context) parse_options() { exit(1) } 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 { context.cline = '\n' context.cgoback = '\n' @@ -170,7 +176,8 @@ fn (mut context Context) expand_all_commands(commands []string) []string { mut all_commands := []string{} for cmd in commands { 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 paramv in paramlist { mut new_substituted_commands := []string{} @@ -178,10 +185,14 @@ fn (mut context Context) expand_all_commands(commands []string) []string { scmd := cscmd.replace(paramk, paramv) 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{} for x in all_commands { @@ -228,8 +239,10 @@ fn (mut context Context) run() { eprintln('${i:10} non 0 exit code for cmd: $cmd') continue } - context.results[icmd].outputs << res.output.trim_right('\r\n').replace('\r\n', - '\n').split('\n') + trimed_output := res.output.trim_right('\r\n') + trimed_normalized := trimed_output.replace('\r\n', '\n') + lines := trimed_normalized.split('\n') + context.results[icmd].outputs << lines context.results[icmd].timings << duration sum += duration 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:') base := context.results[0].atiming.average mut first_cmd_percentage := f64(100.0) + mut first_marker := '' for i, r in context.results { + first_marker = ' ' cpercent := (r.atiming.average / base) * 100 - 100 - first_marker := if r.icmd == 0 { util.bold('>') } else { ' ' } if r.icmd == 0 { + first_marker = util.bold('>') first_cmd_percentage = cpercent } println(' $first_marker${(i + 1):3} | ${cpercent:5.1f}% slower | ${r.cmd:-57s} | $r.atiming') diff --git a/vlib/v/gen/c/cgen.v b/vlib/v/gen/c/cgen.v index 45c771ea4d..bdc860d612 100644 --- a/vlib/v/gen/c/cgen.v +++ b/vlib/v/gen/c/cgen.v @@ -5715,7 +5715,7 @@ fn (mut g Gen) type_default(typ_ table.Type) string { } */ match sym.name { - 'string' { return '(string){.str=(byteptr)""}' } + 'string' { return '(string){.str=(byteptr)"", .is_lit=1}' } 'rune' { return '0' } else {} } diff --git a/vlib/v/gen/c/fn.v b/vlib/v/gen/c/fn.v index e82abcac46..0d8cb78409 100644 --- a/vlib/v/gen/c/fn.v +++ b/vlib/v/gen/c/fn.v @@ -478,9 +478,10 @@ fn (mut g Gen) method_call(node ast.CallExpr) { if node.receiver_type == 0 { 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)) - mut receiver_type_name := util.no_dots(g.cc_type(g.unwrap_generic(node.receiver_type), - false)) + unwrapped_rec_type := g.unwrap_generic(node.receiver_type) + typ_sym := g.table.get_type_symbol(unwrapped_rec_type) + 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) { // Speaker_name_table[s._interface_idx].speak(s._object) $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') { // `array_byte_clone` => `array_clone` 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'] { return_type_str := g.typ(node.return_type) has_cast = true