mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
cgen: fix memleak for [][]T{len: x}, or []Struct{len: x} (#18763)
This commit is contained in:
parent
2e9f8e6633
commit
9bf2449a7b
@ -316,8 +316,8 @@ pub fn malloc(n isize) &u8 {
|
|||||||
C.fprintf(C.stderr, c'_v_malloc %6d total %10d\n', n, total_m)
|
C.fprintf(C.stderr, c'_v_malloc %6d total %10d\n', n, total_m)
|
||||||
// print_backtrace()
|
// print_backtrace()
|
||||||
}
|
}
|
||||||
if n <= 0 {
|
if n < 0 {
|
||||||
panic('malloc(${n} <= 0)')
|
panic('malloc(${n} < 0)')
|
||||||
}
|
}
|
||||||
$if vplayground ? {
|
$if vplayground ? {
|
||||||
if n > 10000 {
|
if n > 10000 {
|
||||||
@ -359,8 +359,8 @@ pub fn malloc_noscan(n isize) &u8 {
|
|||||||
C.fprintf(C.stderr, c'malloc_noscan %6d total %10d\n', n, total_m)
|
C.fprintf(C.stderr, c'malloc_noscan %6d total %10d\n', n, total_m)
|
||||||
// print_backtrace()
|
// print_backtrace()
|
||||||
}
|
}
|
||||||
if n <= 0 {
|
if n < 0 {
|
||||||
panic('malloc_noscan(${n} <= 0)')
|
panic('malloc_noscan(${n} < 0)')
|
||||||
}
|
}
|
||||||
$if vplayground ? {
|
$if vplayground ? {
|
||||||
if n > 10000 {
|
if n > 10000 {
|
||||||
@ -418,8 +418,8 @@ pub fn malloc_uncollectable(n isize) &u8 {
|
|||||||
C.fprintf(C.stderr, c'malloc_uncollectable %6d total %10d\n', n, total_m)
|
C.fprintf(C.stderr, c'malloc_uncollectable %6d total %10d\n', n, total_m)
|
||||||
// print_backtrace()
|
// print_backtrace()
|
||||||
}
|
}
|
||||||
if n <= 0 {
|
if n < 0 {
|
||||||
panic('malloc_uncollectable(${n} <= 0)')
|
panic('malloc_uncollectable(${n} < 0)')
|
||||||
}
|
}
|
||||||
$if vplayground ? {
|
$if vplayground ? {
|
||||||
if n > 10000 {
|
if n > 10000 {
|
||||||
|
@ -388,7 +388,7 @@ fn (mut g Gen) array_init_with_fields(node ast.ArrayInit, elem_type Type, is_amp
|
|||||||
tmp := g.new_tmp_var()
|
tmp := g.new_tmp_var()
|
||||||
line := g.go_before_stmt(0).trim_space()
|
line := g.go_before_stmt(0).trim_space()
|
||||||
g.empty_line = true
|
g.empty_line = true
|
||||||
g.write('${elem_styp}* ${tmp} = malloc((')
|
g.write('${elem_styp}* ${tmp} = (${elem_styp}*) _v_malloc((')
|
||||||
g.expr(node.len_expr)
|
g.expr(node.len_expr)
|
||||||
g.writeln(') * sizeof(${elem_styp}));')
|
g.writeln(') * sizeof(${elem_styp}));')
|
||||||
ind := g.new_tmp_var()
|
ind := g.new_tmp_var()
|
||||||
|
@ -79,7 +79,7 @@ fn (mut g Gen) spawn_and_go_expr(node ast.SpawnExpr, mode SpawnGoMode) {
|
|||||||
wrapper_fn_name := name + '_thread_wrapper'
|
wrapper_fn_name := name + '_thread_wrapper'
|
||||||
arg_tmp_var := 'arg_' + tmp
|
arg_tmp_var := 'arg_' + tmp
|
||||||
if is_spawn {
|
if is_spawn {
|
||||||
g.writeln('${wrapper_struct_name} *${arg_tmp_var} = malloc(sizeof(thread_arg_${name}));')
|
g.writeln('${wrapper_struct_name} *${arg_tmp_var} = (${wrapper_struct_name} *) _v_malloc(sizeof(thread_arg_${name}));')
|
||||||
} else if is_go {
|
} else if is_go {
|
||||||
g.writeln('${wrapper_struct_name} ${arg_tmp_var};')
|
g.writeln('${wrapper_struct_name} ${arg_tmp_var};')
|
||||||
}
|
}
|
||||||
@ -106,7 +106,7 @@ fn (mut g Gen) spawn_and_go_expr(node ast.SpawnExpr, mode SpawnGoMode) {
|
|||||||
}
|
}
|
||||||
s_ret_typ := g.typ(node.call_expr.return_type)
|
s_ret_typ := g.typ(node.call_expr.return_type)
|
||||||
if g.pref.os == .windows && node.call_expr.return_type != ast.void_type {
|
if g.pref.os == .windows && node.call_expr.return_type != ast.void_type {
|
||||||
g.writeln('${arg_tmp_var}->ret_ptr = malloc(sizeof(${s_ret_typ}));')
|
g.writeln('${arg_tmp_var}->ret_ptr = (void *) _v_malloc(sizeof(${s_ret_typ}));')
|
||||||
}
|
}
|
||||||
is_opt := node.call_expr.return_type.has_flag(.option)
|
is_opt := node.call_expr.return_type.has_flag(.option)
|
||||||
is_res := node.call_expr.return_type.has_flag(.result)
|
is_res := node.call_expr.return_type.has_flag(.result)
|
||||||
@ -201,7 +201,7 @@ fn (mut g Gen) spawn_and_go_expr(node ast.SpawnExpr, mode SpawnGoMode) {
|
|||||||
}
|
}
|
||||||
if node.call_expr.return_type != ast.void_type {
|
if node.call_expr.return_type != ast.void_type {
|
||||||
g.gowrappers.writeln('\t${s_ret_typ} ret = *ret_ptr;')
|
g.gowrappers.writeln('\t${s_ret_typ} ret = *ret_ptr;')
|
||||||
g.gowrappers.writeln('\tfree(ret_ptr);')
|
g.gowrappers.writeln('\t_v_free(ret_ptr);')
|
||||||
g.gowrappers.writeln('\treturn ret;')
|
g.gowrappers.writeln('\treturn ret;')
|
||||||
}
|
}
|
||||||
g.gowrappers.writeln('}')
|
g.gowrappers.writeln('}')
|
||||||
@ -278,7 +278,7 @@ fn (mut g Gen) spawn_and_go_expr(node ast.SpawnExpr, mode SpawnGoMode) {
|
|||||||
if g.pref.os == .windows {
|
if g.pref.os == .windows {
|
||||||
g.gowrappers.write_string('\t*((${s_ret_typ}*)(arg->ret_ptr)) = ')
|
g.gowrappers.write_string('\t*((${s_ret_typ}*)(arg->ret_ptr)) = ')
|
||||||
} else {
|
} else {
|
||||||
g.gowrappers.writeln('\t${s_ret_typ}* ret_ptr = malloc(sizeof(${s_ret_typ}));')
|
g.gowrappers.writeln('\t${s_ret_typ}* ret_ptr = (${s_ret_typ}*) _v_malloc(sizeof(${s_ret_typ}));')
|
||||||
g.gowrappers.write_string('\t*ret_ptr = ')
|
g.gowrappers.write_string('\t*ret_ptr = ')
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -359,7 +359,7 @@ fn (mut g Gen) spawn_and_go_expr(node ast.SpawnExpr, mode SpawnGoMode) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
g.gowrappers.writeln(');')
|
g.gowrappers.writeln(');')
|
||||||
g.gowrappers.writeln('\tfree(arg);')
|
g.gowrappers.writeln('\t_v_free(arg);')
|
||||||
if g.pref.os != .windows && node.call_expr.return_type != ast.void_type {
|
if g.pref.os != .windows && node.call_expr.return_type != ast.void_type {
|
||||||
g.gowrappers.writeln('\treturn ret_ptr;')
|
g.gowrappers.writeln('\treturn ret_ptr;')
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
Reference in New Issue
Block a user