mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
cgen: cleanup interface/sumtype casts (#9221)
This commit is contained in:
parent
0a39c2b9ea
commit
eefdad21c7
@ -20,7 +20,7 @@ fn (mut g Gen) array_init(node ast.ArrayInit) {
|
|||||||
shared_styp = g.typ(shared_typ)
|
shared_styp = g.typ(shared_typ)
|
||||||
g.writeln('($shared_styp*)__dup_shared_array(&($shared_styp){.val = ')
|
g.writeln('($shared_styp*)__dup_shared_array(&($shared_styp){.val = ')
|
||||||
} else if is_amp {
|
} else if is_amp {
|
||||||
g.write('($styp*)memdup(ADDR($styp, ')
|
g.write('HEAP($styp, ')
|
||||||
}
|
}
|
||||||
if type_sym.kind == .array_fixed {
|
if type_sym.kind == .array_fixed {
|
||||||
g.write('{')
|
g.write('{')
|
||||||
@ -95,7 +95,7 @@ fn (mut g Gen) array_init(node ast.ArrayInit) {
|
|||||||
if g.is_shared {
|
if g.is_shared {
|
||||||
g.write('}, sizeof($shared_styp))')
|
g.write('}, sizeof($shared_styp))')
|
||||||
} else if is_amp {
|
} else if is_amp {
|
||||||
g.write('), sizeof($styp))')
|
g.write(')')
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -1599,16 +1599,18 @@ fn (mut g Gen) expr_with_cast(expr ast.Expr, got_type_raw table.Type, expected_t
|
|||||||
&& !expected_type.has_flag(.optional) {
|
&& !expected_type.has_flag(.optional) {
|
||||||
got_styp := g.cc_type(got_type, true)
|
got_styp := g.cc_type(got_type, true)
|
||||||
exp_styp := g.cc_type(expected_type, true)
|
exp_styp := g.cc_type(expected_type, true)
|
||||||
g.write('I_${got_styp}_to_Interface_$exp_styp')
|
if expected_is_ptr {
|
||||||
if expected_type.is_ptr() {
|
g.write('HEAP($exp_styp, ')
|
||||||
g.write('_ptr')
|
|
||||||
}
|
}
|
||||||
g.write('(')
|
g.write('I_${got_styp}_to_Interface_${exp_styp}(')
|
||||||
if !got_type.is_ptr() {
|
if !got_is_ptr {
|
||||||
g.write('&')
|
g.write('&')
|
||||||
}
|
}
|
||||||
g.expr(expr)
|
g.expr(expr)
|
||||||
g.write(')')
|
g.write(')')
|
||||||
|
if expected_is_ptr {
|
||||||
|
g.write(')')
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// cast to sum type
|
// cast to sum type
|
||||||
@ -1638,19 +1640,19 @@ fn (mut g Gen) expr_with_cast(expr ast.Expr, got_type_raw table.Type, expected_t
|
|||||||
} else {
|
} else {
|
||||||
g.write_sumtype_casting_fn(got_type, expected_type)
|
g.write_sumtype_casting_fn(got_type, expected_type)
|
||||||
if expected_is_ptr {
|
if expected_is_ptr {
|
||||||
g.write('memdup(&($exp_sym.cname[]){')
|
g.write('HEAP($exp_sym.cname, ')
|
||||||
}
|
}
|
||||||
g.write('${got_sym.cname}_to_sumtype_${exp_sym.cname}(')
|
g.write('${got_sym.cname}_to_sumtype_${exp_sym.cname}(')
|
||||||
if !got_is_ptr {
|
if !got_is_ptr {
|
||||||
g.write('(&(($got_styp[]){')
|
g.write('ADDR($got_styp, (')
|
||||||
g.expr(expr)
|
g.expr(expr)
|
||||||
g.write('}[0])))')
|
g.write(')))')
|
||||||
} else {
|
} else {
|
||||||
g.expr(expr)
|
g.expr(expr)
|
||||||
g.write(')')
|
g.write(')')
|
||||||
}
|
}
|
||||||
if expected_is_ptr {
|
if expected_is_ptr {
|
||||||
g.write('}, sizeof($exp_sym.cname))')
|
g.write(')')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
@ -5846,7 +5848,6 @@ fn (mut g Gen) interface_table() string {
|
|||||||
current_iinidx++
|
current_iinidx++
|
||||||
// eprintln('>>> current_iinidx: ${current_iinidx-iinidx_minimum_base} | interface_index_name: $interface_index_name')
|
// eprintln('>>> current_iinidx: ${current_iinidx-iinidx_minimum_base} | interface_index_name: $interface_index_name')
|
||||||
sb.writeln('$staticprefix $interface_name I_${cctype}_to_Interface_${interface_name}($cctype* x);')
|
sb.writeln('$staticprefix $interface_name I_${cctype}_to_Interface_${interface_name}($cctype* x);')
|
||||||
sb.writeln('$staticprefix $interface_name* I_${cctype}_to_Interface_${interface_name}_ptr($cctype* x);')
|
|
||||||
mut cast_struct := strings.new_builder(100)
|
mut cast_struct := strings.new_builder(100)
|
||||||
cast_struct.writeln('($interface_name) {')
|
cast_struct.writeln('($interface_name) {')
|
||||||
cast_struct.writeln('\t\t._object = (void*) (x),')
|
cast_struct.writeln('\t\t._object = (void*) (x),')
|
||||||
@ -5876,11 +5877,6 @@ fn (mut g Gen) interface_table() string {
|
|||||||
// Casting functions for converting "$cctype" to interface "$interface_name"
|
// Casting functions for converting "$cctype" to interface "$interface_name"
|
||||||
$staticprefix inline $interface_name I_${cctype}_to_Interface_${interface_name}($cctype* x) {
|
$staticprefix inline $interface_name I_${cctype}_to_Interface_${interface_name}($cctype* x) {
|
||||||
return $cast_struct_str;
|
return $cast_struct_str;
|
||||||
}
|
|
||||||
|
|
||||||
$staticprefix $interface_name* I_${cctype}_to_Interface_${interface_name}_ptr($cctype* x) {
|
|
||||||
// TODO Remove memdup
|
|
||||||
return ($interface_name*) memdup(&$cast_struct_str, sizeof($interface_name));
|
|
||||||
}')
|
}')
|
||||||
|
|
||||||
if g.pref.build_mode != .build_module {
|
if g.pref.build_mode != .build_module {
|
||||||
|
@ -295,6 +295,8 @@ static void* g_live_info = NULL;
|
|||||||
#define _SLIT(s) ((string){.str=(byteptr)("" s), .len=(sizeof(s)-1), .is_lit=1})
|
#define _SLIT(s) ((string){.str=(byteptr)("" s), .len=(sizeof(s)-1), .is_lit=1})
|
||||||
// take the address of an rvalue
|
// take the address of an rvalue
|
||||||
#define ADDR(type, expr) (&((type[]){expr}[0]))
|
#define ADDR(type, expr) (&((type[]){expr}[0]))
|
||||||
|
// copy something to the heap
|
||||||
|
#define HEAP(type, expr) ((type*)memdup((void*)&((type[]){expr}[0]), sizeof(type)))
|
||||||
#define _PUSH_MANY(arr, val, tmp, tmp_typ) {tmp_typ tmp = (val); array_push_many(arr, tmp.data, tmp.len);}
|
#define _PUSH_MANY(arr, val, tmp, tmp_typ) {tmp_typ tmp = (val); array_push_many(arr, tmp.data, tmp.len);}
|
||||||
#define _IN_MAP(val, m) map_exists_1(m, val)
|
#define _IN_MAP(val, m) map_exists_1(m, val)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user