cgen: fix `v -usecache examples/news_fetcher.v` on macos (.sort() compare_ functions duplication)
parent
537760edcd
commit
ca5154747e
|
@ -382,7 +382,7 @@ fn (mut g Gen) gen_array_sort(node ast.CallExpr) {
|
|||
// `users.sort(a.age > b.age)`
|
||||
// Generate a comparison function for a custom type
|
||||
elem_stype := g.typ(info.elem_type)
|
||||
mut compare_fn := 'compare_${elem_stype.replace('*', '_ptr')}'
|
||||
mut compare_fn := 'compare_${g.unique_file_path_hash}_${elem_stype.replace('*', '_ptr')}'
|
||||
mut comparison_type := g.unwrap(ast.void_type)
|
||||
mut left_expr, mut right_expr := '', ''
|
||||
// the only argument can only be an infix expression like `a < b` or `b.field > a.field`
|
||||
|
@ -443,7 +443,7 @@ fn (mut g Gen) gen_array_sort(node ast.CallExpr) {
|
|||
}
|
||||
|
||||
stype_arg := g.typ(info.elem_type)
|
||||
g.definitions.writeln('int ${compare_fn}($stype_arg* a, $stype_arg* b) {')
|
||||
g.definitions.writeln('VV_LOCAL_SYMBOL int ${compare_fn}($stype_arg* a, $stype_arg* b) {')
|
||||
c_condition := if comparison_type.sym.has_method('<') {
|
||||
'${g.typ(comparison_type.typ)}__lt($left_expr, $right_expr)'
|
||||
} else if comparison_type.unaliased_sym.has_method('<') {
|
||||
|
|
|
@ -5,6 +5,7 @@ module c
|
|||
|
||||
import os
|
||||
import strings
|
||||
import hash.fnv1a
|
||||
import v.ast
|
||||
import v.pref
|
||||
import v.token
|
||||
|
@ -72,6 +73,7 @@ mut:
|
|||
json_forward_decls strings.Builder // json type forward decls
|
||||
sql_buf strings.Builder // for writing exprs to args via `sqlite3_bind_int()` etc
|
||||
file &ast.File
|
||||
unique_file_path_hash u64 // a hash of file.path, used for making auxilary fn generation unique (like `compare_xyz`)
|
||||
fn_decl &ast.FnDecl // pointer to the FnDecl we are currently inside otherwise 0
|
||||
last_fn_c_name string
|
||||
tmp_count int // counter for unique tmp vars (_tmp1, _tmp2 etc); resets at the start of each fn.
|
||||
|
@ -579,7 +581,7 @@ pub fn (mut g Gen) free_builders() {
|
|||
|
||||
pub fn (mut g Gen) gen_file() {
|
||||
g.timers.start('cgen_file $g.file.path')
|
||||
|
||||
g.unique_file_path_hash = fnv1a.sum64_string(g.file.path)
|
||||
if g.pref.is_vlines {
|
||||
g.vlines_path = util.vlines_escape_path(g.file.path, g.pref.ccompiler)
|
||||
g.is_vlines_enabled = true
|
||||
|
|
Loading…
Reference in New Issue