diff --git a/bind/gengo.go b/bind/gengo.go index c56d3e3..1d0ff9f 100644 --- a/bind/gengo.go +++ b/bind/gengo.go @@ -413,8 +413,10 @@ func (g *goGen) genRead(toVar, fromVar string, typ types.Type, mode varMode) { return } g.Printf("// Must be a Go object\n") - g.Printf("%s_ref := _seq.FromRefNum(int32(%s))\n", toVar, fromVar) - g.Printf("%s := %s_ref.Get().(*%s%s)\n", toVar, toVar, g.pkgName(oPkg), o.Name()) + g.Printf("var %s *%s%s\n", toVar, g.pkgName(oPkg), o.Name()) + g.Printf("if %s_ref := _seq.FromRefNum(int32(%s)); %s_ref != nil {\n", toVar, fromVar, toVar) + g.Printf(" %s = %s_ref.Get().(*%s%s)\n", toVar, toVar, g.pkgName(oPkg), o.Name()) + g.Printf("}\n") default: g.errorf("unsupported pointer type %s", t) } diff --git a/bind/java/SeqTest.java b/bind/java/SeqTest.java index 2439c51..36f3169 100644 --- a/bind/java/SeqTest.java +++ b/bind/java/SeqTest.java @@ -448,8 +448,11 @@ public class SeqTest extends InstrumentationTestCase { return null; } })); - assertEquals("Go nil interface is null", null, Testpkg.newNullInterface()); - assertEquals("Go nil struct pointer is null", null, Testpkg.newNullStruct()); + assertEquals("Go nil interface is null", null, Testpkg.newNullInterface()); + assertEquals("Go nil struct pointer is null", null, Testpkg.newNullStruct()); + + Issue20330 nullArger = new Issue20330(); + assertTrue(nullArger.callWithNull(null)); } public void testPassByteArray() { diff --git a/bind/objc/SeqTest.m b/bind/objc/SeqTest.m index e6d0fe7..139a9f9 100644 --- a/bind/objc/SeqTest.m +++ b/bind/objc/SeqTest.m @@ -395,6 +395,8 @@ static int numI = 0; XCTAssertNil(i, @"NewNullInterface() returned %p; expected nil", i); TestpkgS *s = TestpkgNewNullStruct(); XCTAssertNil(s, @"NewNullStruct() returned %p; expected nil", s); + TestpkgIssue20330 *nullArger = TestpkgNewIssue20330(); + XCTAssertTrue([nullArger callWithNull:nil], @"Issue20330.CallWithNull failed"); } - (void)testReturnsError { diff --git a/bind/testdata/issue10788.go.golden b/bind/testdata/issue10788.go.golden index a6ef182..f8d1145 100644 --- a/bind/testdata/issue10788.go.golden +++ b/bind/testdata/issue10788.go.golden @@ -46,8 +46,10 @@ func proxyissue10788_TestInterface_DoSomeWork(refnum C.int32_t, param_s C.int32_ ref := _seq.FromRefNum(int32(refnum)) v := ref.Get().(issue10788.TestInterface) // Must be a Go object - _param_s_ref := _seq.FromRefNum(int32(param_s)) - _param_s := _param_s_ref.Get().(*issue10788.TestStruct) + var _param_s *issue10788.TestStruct + if _param_s_ref := _seq.FromRefNum(int32(param_s)); _param_s_ref != nil { + _param_s = _param_s_ref.Get().(*issue10788.TestStruct) + } v.DoSomeWork(_param_s) } diff --git a/bind/testdata/structs.go.golden b/bind/testdata/structs.go.golden index f989e4e..49e366f 100644 --- a/bind/testdata/structs.go.golden +++ b/bind/testdata/structs.go.golden @@ -120,8 +120,10 @@ func (p *proxystructs_I) M() { //export proxystructs__Identity func proxystructs__Identity(param_s C.int32_t) C.int32_t { // Must be a Go object - _param_s_ref := _seq.FromRefNum(int32(param_s)) - _param_s := _param_s_ref.Get().(*structs.S) + var _param_s *structs.S + if _param_s_ref := _seq.FromRefNum(int32(param_s)); _param_s_ref != nil { + _param_s = _param_s_ref.Get().(*structs.S) + } res_0 := structs.Identity(_param_s) var _res_0 C.int32_t = _seq.NullRefNum if res_0 != nil { @@ -133,8 +135,10 @@ func proxystructs__Identity(param_s C.int32_t) C.int32_t { //export proxystructs__IdentityWithError func proxystructs__IdentityWithError(param_s C.int32_t) (C.int32_t, C.int32_t) { // Must be a Go object - _param_s_ref := _seq.FromRefNum(int32(param_s)) - _param_s := _param_s_ref.Get().(*structs.S) + var _param_s *structs.S + if _param_s_ref := _seq.FromRefNum(int32(param_s)); _param_s_ref != nil { + _param_s = _param_s_ref.Get().(*structs.S) + } res_0, res_1 := structs.IdentityWithError(_param_s) var _res_0 C.int32_t = _seq.NullRefNum if res_0 != nil { diff --git a/bind/testdata/vars.go.golden b/bind/testdata/vars.go.golden index f3a1132..6158e20 100644 --- a/bind/testdata/vars.go.golden +++ b/bind/testdata/vars.go.golden @@ -101,8 +101,10 @@ func var_getvars_AString() C.nstring { //export var_setvars_AStructPtr func var_setvars_AStructPtr(v C.int32_t) { // Must be a Go object - _v_ref := _seq.FromRefNum(int32(v)) - _v := _v_ref.Get().(*vars.S) + var _v *vars.S + if _v_ref := _seq.FromRefNum(int32(v)); _v_ref != nil { + _v = _v_ref.Get().(*vars.S) + } vars.AStructPtr = _v } diff --git a/bind/testpkg/testpkg.go b/bind/testpkg/testpkg.go index 2e825c7..f0cda07 100644 --- a/bind/testpkg/testpkg.go +++ b/bind/testpkg/testpkg.go @@ -266,6 +266,16 @@ func CallWithNull(_null NullTest, nuller NullTest) bool { return _null == nil && nuller.Null() == nil } +type Issue20330 struct{} + +func NewIssue20330() *Issue20330 { + return new(Issue20330) +} + +func (i *Issue20330) CallWithNull(_null *Issue20330) bool { + return _null == nil +} + type Issue14168 interface { F(seq int32) }