mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
fix
This commit is contained in:
parent
3211a653c3
commit
7d84ddfa65
@ -113,6 +113,7 @@ pub enum TypeFlag {
|
|||||||
generic
|
generic
|
||||||
shared_f
|
shared_f
|
||||||
atomic_f
|
atomic_f
|
||||||
|
option_mut_param_t
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -610,10 +610,16 @@ fn (mut g Gen) assign_stmt(node_ ast.AssignStmt) {
|
|||||||
if op_overloaded {
|
if op_overloaded {
|
||||||
g.op_arg(left, op_expected_left, var_type)
|
g.op_arg(left, op_expected_left, var_type)
|
||||||
} else {
|
} else {
|
||||||
if !is_decl && left.is_auto_deref_var() {
|
if !is_decl && left.is_auto_deref_var() && !var_type.has_flag(.option) {
|
||||||
g.write('*')
|
g.write('*')
|
||||||
}
|
}
|
||||||
g.expr(left)
|
if var_type.has_flag(.option_mut_param_t) {
|
||||||
|
g.write('memcpy(&')
|
||||||
|
g.expr(left)
|
||||||
|
g.write('->data, &')
|
||||||
|
} else {
|
||||||
|
g.expr(left)
|
||||||
|
}
|
||||||
if !is_decl && var_type.has_flag(.shared_f) {
|
if !is_decl && var_type.has_flag(.shared_f) {
|
||||||
g.write('->val') // don't reset the mutex, just change the value
|
g.write('->val') // don't reset the mutex, just change the value
|
||||||
}
|
}
|
||||||
@ -630,7 +636,7 @@ fn (mut g Gen) assign_stmt(node_ ast.AssignStmt) {
|
|||||||
if is_decl {
|
if is_decl {
|
||||||
g.writeln(';')
|
g.writeln(';')
|
||||||
}
|
}
|
||||||
} else if !g.is_arraymap_set && !str_add && !op_overloaded {
|
} else if !var_type.has_flag(.option_mut_param_t) && !g.is_arraymap_set && !str_add && !op_overloaded {
|
||||||
g.write(' ${op} ')
|
g.write(' ${op} ')
|
||||||
} else if str_add || op_overloaded {
|
} else if str_add || op_overloaded {
|
||||||
g.write(', ')
|
g.write(', ')
|
||||||
@ -739,6 +745,9 @@ fn (mut g Gen) assign_stmt(node_ ast.AssignStmt) {
|
|||||||
if str_add || op_overloaded {
|
if str_add || op_overloaded {
|
||||||
g.write(')')
|
g.write(')')
|
||||||
}
|
}
|
||||||
|
if var_type.has_flag(.option_mut_param_t) {
|
||||||
|
g.write('.data, sizeof(${g.base_type(val_type)}))')
|
||||||
|
}
|
||||||
if g.is_arraymap_set {
|
if g.is_arraymap_set {
|
||||||
g.write(' })')
|
g.write(' })')
|
||||||
g.is_arraymap_set = false
|
g.is_arraymap_set = false
|
||||||
|
@ -112,7 +112,8 @@ fn (mut g Gen) final_gen_str(typ StrType) {
|
|||||||
}
|
}
|
||||||
g.str_fn_names << str_fn_name
|
g.str_fn_names << str_fn_name
|
||||||
if typ.typ.has_flag(.option) {
|
if typ.typ.has_flag(.option) {
|
||||||
g.gen_str_for_option(typ.typ, styp, str_fn_name)
|
opt_typ := if typ.typ.has_flag(.option_mut_param_t) { styp.replace('*', '') } else { styp }
|
||||||
|
g.gen_str_for_option(typ.typ, opt_typ, str_fn_name)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if typ.typ.has_flag(.result) {
|
if typ.typ.has_flag(.result) {
|
||||||
@ -185,7 +186,7 @@ fn (mut g Gen) gen_str_for_option(typ ast.Type, styp string, str_fn_name string)
|
|||||||
g.auto_str_funcs.writeln('string indent_${str_fn_name}(${styp} it, int indent_count) {')
|
g.auto_str_funcs.writeln('string indent_${str_fn_name}(${styp} it, int indent_count) {')
|
||||||
g.auto_str_funcs.writeln('\tstring res;')
|
g.auto_str_funcs.writeln('\tstring res;')
|
||||||
g.auto_str_funcs.writeln('\tif (it.state == 0) {')
|
g.auto_str_funcs.writeln('\tif (it.state == 0) {')
|
||||||
deref := if typ.is_ptr() { '**(${sym.cname}**)&' } else { '*(${sym.cname}*)' }
|
deref := if typ.is_ptr() && !typ.has_flag(.option_mut_param_t) { '**(${sym.cname}**)&' } else { '*(${sym.cname}*)' }
|
||||||
if sym.kind == .string {
|
if sym.kind == .string {
|
||||||
if typ.nr_muls() > 1 {
|
if typ.nr_muls() > 1 {
|
||||||
g.auto_str_funcs.writeln('\t\tres = ptr_str(*(${sym.cname}**)&it.data);')
|
g.auto_str_funcs.writeln('\t\tres = ptr_str(*(${sym.cname}**)&it.data);')
|
||||||
|
@ -1076,7 +1076,7 @@ fn (mut g Gen) option_type_name(t ast.Type) (string, string) {
|
|||||||
} else {
|
} else {
|
||||||
styp = '${c.option_name}_${base}'
|
styp = '${c.option_name}_${base}'
|
||||||
}
|
}
|
||||||
if t.is_ptr() {
|
if t.is_ptr() && !t.has_flag(.option_mut_param_t) {
|
||||||
styp = styp.replace('*', '_ptr')
|
styp = styp.replace('*', '_ptr')
|
||||||
}
|
}
|
||||||
return styp, base
|
return styp, base
|
||||||
@ -1160,7 +1160,7 @@ fn (mut g Gen) write_options() {
|
|||||||
done = g.done_options.clone()
|
done = g.done_options.clone()
|
||||||
}
|
}
|
||||||
for base, styp in g.options {
|
for base, styp in g.options {
|
||||||
if base in done {
|
if base in done || styp.ends_with('*') {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
done << base
|
done << base
|
||||||
@ -1947,7 +1947,12 @@ fn (mut g Gen) expr_with_tmp_var(expr ast.Expr, expr_typ ast.Type, ret_typ ast.T
|
|||||||
ret_styp := g.typ(g.unwrap_generic(ret_typ)).replace('*', '_ptr')
|
ret_styp := g.typ(g.unwrap_generic(ret_typ)).replace('*', '_ptr')
|
||||||
g.writeln('${ret_styp} ${tmp_var};')
|
g.writeln('${ret_styp} ${tmp_var};')
|
||||||
} else {
|
} else {
|
||||||
g.writeln('${g.typ(ret_typ)} ${tmp_var};')
|
if ret_typ.has_flag(.option_mut_param_t) {
|
||||||
|
styp = styp.replace('*', '')
|
||||||
|
g.writeln('${g.typ(ret_typ).replace('*', '')} ${tmp_var};')
|
||||||
|
} else {
|
||||||
|
g.writeln('${g.typ(ret_typ)} ${tmp_var};')
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if ret_typ.has_flag(.option) {
|
if ret_typ.has_flag(.option) {
|
||||||
if expr_typ.has_flag(.option) && expr in [ast.StructInit, ast.ArrayInit, ast.MapInit] {
|
if expr_typ.has_flag(.option) && expr in [ast.StructInit, ast.ArrayInit, ast.MapInit] {
|
||||||
@ -1969,7 +1974,7 @@ fn (mut g Gen) expr_with_tmp_var(expr ast.Expr, expr_typ ast.Type, ret_typ ast.T
|
|||||||
} else {
|
} else {
|
||||||
g.write('_option_ok(&(${styp}[]) { ')
|
g.write('_option_ok(&(${styp}[]) { ')
|
||||||
}
|
}
|
||||||
if !expr_typ.is_ptr() && ret_typ.is_ptr() {
|
if !expr_typ.is_ptr() && ret_typ.is_ptr() && !ret_typ.has_flag(.option_mut_param_t) {
|
||||||
g.write('&/*ref*/')
|
g.write('&/*ref*/')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -71,6 +71,9 @@ fn (mut g Gen) dump_expr(node ast.DumpExpr) {
|
|||||||
} else {
|
} else {
|
||||||
old_inside_opt_or_res := g.inside_opt_or_res
|
old_inside_opt_or_res := g.inside_opt_or_res
|
||||||
g.inside_opt_or_res = true
|
g.inside_opt_or_res = true
|
||||||
|
if expr_type.has_flag(.option_mut_param_t) {
|
||||||
|
g.write('*')
|
||||||
|
}
|
||||||
g.expr(node.expr)
|
g.expr(node.expr)
|
||||||
g.inside_opt_or_res = old_inside_opt_or_res
|
g.inside_opt_or_res = old_inside_opt_or_res
|
||||||
}
|
}
|
||||||
@ -106,7 +109,11 @@ fn (mut g Gen) dump_expr_definitions() {
|
|||||||
} else {
|
} else {
|
||||||
if typ.has_flag(.option) {
|
if typ.has_flag(.option) {
|
||||||
str_dumparg_type += '_option_'
|
str_dumparg_type += '_option_'
|
||||||
ptr_asterisk = ptr_asterisk.replace('*', '_ptr')
|
if typ.has_flag(.option_mut_param_t) {
|
||||||
|
ptr_asterisk = ptr_asterisk.replace('*', '')
|
||||||
|
} else {
|
||||||
|
ptr_asterisk = ptr_asterisk.replace('*', '_ptr')
|
||||||
|
}
|
||||||
}
|
}
|
||||||
str_dumparg_type += g.cc_type(dump_type, true) + ptr_asterisk
|
str_dumparg_type += g.cc_type(dump_type, true) + ptr_asterisk
|
||||||
}
|
}
|
||||||
|
@ -2210,6 +2210,9 @@ fn (mut g Gen) ref_or_deref_arg(arg ast.CallArg, expected_type ast.Type, lang as
|
|||||||
&& lang != .c {
|
&& lang != .c {
|
||||||
if arg.expr.is_lvalue() {
|
if arg.expr.is_lvalue() {
|
||||||
if expected_type.has_flag(.option) {
|
if expected_type.has_flag(.option) {
|
||||||
|
if expected_type.has_flag(.option_mut_param_t) {
|
||||||
|
g.write('&/*opt-mut*/')
|
||||||
|
}
|
||||||
g.expr_with_opt(arg.expr, arg_typ, expected_type)
|
g.expr_with_opt(arg.expr, arg_typ, expected_type)
|
||||||
return
|
return
|
||||||
} else {
|
} else {
|
||||||
@ -2250,6 +2253,9 @@ fn (mut g Gen) ref_or_deref_arg(arg ast.CallArg, expected_type ast.Type, lang as
|
|||||||
g.write('->val')
|
g.write('->val')
|
||||||
return
|
return
|
||||||
} else if expected_type.has_flag(.option) {
|
} else if expected_type.has_flag(.option) {
|
||||||
|
if expected_type.has_flag(.option_mut_param_t) {
|
||||||
|
g.write('&/*opt-mut*/')
|
||||||
|
}
|
||||||
g.expr_with_opt(arg.expr, arg_typ, expected_type)
|
g.expr_with_opt(arg.expr, arg_typ, expected_type)
|
||||||
return
|
return
|
||||||
} else if arg.expr is ast.ArrayInit {
|
} else if arg.expr is ast.ArrayInit {
|
||||||
|
@ -127,7 +127,11 @@ fn (mut g Gen) gen_expr_to_string(expr ast.Expr, etype ast.Type) {
|
|||||||
if str_method_expects_ptr && !is_ptr {
|
if str_method_expects_ptr && !is_ptr {
|
||||||
g.write('&')
|
g.write('&')
|
||||||
} else if is_ptr && typ.has_flag(.option) {
|
} else if is_ptr && typ.has_flag(.option) {
|
||||||
g.write('*(${g.typ(typ)}*)&')
|
if typ.has_flag(.option_mut_param_t) {
|
||||||
|
g.write('*')
|
||||||
|
} else {
|
||||||
|
g.write('*(${g.typ(typ)}*)&')
|
||||||
|
}
|
||||||
} else if !str_method_expects_ptr && !is_shared && (is_ptr || is_var_mut) {
|
} else if !str_method_expects_ptr && !is_shared && (is_ptr || is_var_mut) {
|
||||||
g.write('*'.repeat(typ.nr_muls()))
|
g.write('*'.repeat(typ.nr_muls()))
|
||||||
}
|
}
|
||||||
|
@ -913,6 +913,9 @@ fn (mut p Parser) fn_params() ([]ast.Param, bool, bool) {
|
|||||||
// p.error('cannot mut')
|
// p.error('cannot mut')
|
||||||
// }
|
// }
|
||||||
// arg_type = arg_type.ref()
|
// arg_type = arg_type.ref()
|
||||||
|
if param_type.has_flag(.option) && param_type.nr_muls() == 0 {
|
||||||
|
param_type = param_type.set_flag(.option_mut_param_t)
|
||||||
|
}
|
||||||
param_type = param_type.set_nr_muls(1)
|
param_type = param_type.set_nr_muls(1)
|
||||||
if is_shared {
|
if is_shared {
|
||||||
param_type = param_type.set_flag(.shared_f)
|
param_type = param_type.set_flag(.shared_f)
|
||||||
@ -1025,6 +1028,9 @@ fn (mut p Parser) fn_params() ([]ast.Param, bool, bool) {
|
|||||||
pos)
|
pos)
|
||||||
return []ast.Param{}, false, false
|
return []ast.Param{}, false, false
|
||||||
}
|
}
|
||||||
|
if typ.has_flag(.option) && typ.nr_muls() == 0 {
|
||||||
|
typ = typ.set_flag(.option_mut_param_t)
|
||||||
|
}
|
||||||
typ = typ.set_nr_muls(1)
|
typ = typ.set_nr_muls(1)
|
||||||
if is_shared {
|
if is_shared {
|
||||||
typ = typ.set_flag(.shared_f)
|
typ = typ.set_flag(.shared_f)
|
||||||
|
Loading…
Reference in New Issue
Block a user