compiler: let methods return voidptr without a segfault

pull/2218/head
Delyan Angelov 2019-10-03 01:28:24 +03:00 committed by Alexander Medvednikov
parent 7d763e0776
commit fce4199412
2 changed files with 30 additions and 3 deletions

View File

@ -238,9 +238,13 @@ fn (p mut Parser) gen_method_call(receiver_type, ftyp string, cgen_name string,
// Method returns (void*) => cast it to int, string, user etc
// number := *(int*)numbers.first()
if ftyp == 'void*' {
if receiver_type.starts_with('array_') {
// array_int => int
cast = receiver_type.all_after('_')
cast = '*($cast*) '
}else{
cast = '(voidptr) '
}
}
p.cgen.set_placeholder(method_ph, '$cast $method_call')
//return method_call

View File

@ -0,0 +1,23 @@
struct Zest { val int }
fn (t Zest) get_a_finger_to_the_moon() voidptr {
return voidptr(0)
}
fn get_the_dao_way() voidptr {
return voidptr(0)
}
fn test_returning_a_void_pointer_from_a_method() {
t := &Zest{ val: 123 }
z := voidptr(0)
assert z == t.get_a_finger_to_the_moon()
assert t.get_a_finger_to_the_moon() == 0
}
fn test_returning_a_void_pointer_from_a_function() {
z := voidptr(0)
assert z == get_the_dao_way()
assert get_the_dao_way() == 0
}