[fidl][go] Fix an empty response from a protocol method

Currently, both these two protocol method definitions generate
Dispatch() that returns nil as a response:

1. Foo()        // no response.
2. Foo() -> ()  // the response is empty.

And the current Go bindings always thinks the nil response means
(1). Calling the method defined as (2) would get stuck because
there is no response coming back.

To fix (2), we replace Dispatch() with DispatchImpl() that returns
an extra boolean flag that tells if a response is required or
not. If the response is nil but the flag is true, Go bindings
can tell it is (2).

Bug: 8098
Change-Id: I5d814d164dc43c0e0c4b8a025b8925d455a38480
diff --git a/src/syscall/zx/fidl/bindings.go b/src/syscall/zx/fidl/bindings.go
index ea16421..b51a157 100644
--- a/src/syscall/zx/fidl/bindings.go
+++ b/src/syscall/zx/fidl/bindings.go
@@ -150,7 +150,7 @@
 	if err != nil {
 		return false, err
 	}
-	p, err := b.Stub.Dispatch(header.Ordinal, msg[hnb:], handles)
+	p, shouldRespond, err := b.Stub.DispatchImpl(header.Ordinal, msg[hnb:], handles)
 	switch {
 	case err == ErrUnknownOrdinal:
 		// If we couldn't determine the ordinal, we still own the
@@ -162,8 +162,8 @@
 	case err != nil:
 		return false, err
 	}
-	// Message has no response.
-	if p == nil {
+	// Method has no response.
+	if !shouldRespond {
 		return false, nil
 	}
 	cnb, cnh, err := MarshalHeaderThenMessage(&header, p, respb, resph)
diff --git a/src/syscall/zx/fidl/bindingstest/impl.go b/src/syscall/zx/fidl/bindingstest/impl.go
index 7197d36..7ee163f 100644
--- a/src/syscall/zx/fidl/bindingstest/impl.go
+++ b/src/syscall/zx/fidl/bindingstest/impl.go
@@ -891,8 +891,10 @@
 }
 
 const (
-	Test1EchoGenOrdinal     uint64 = 0x4a4939ff00000000
-	Test1SurpriseGenOrdinal uint64 = 0x4bd66e7200000000
+	Test1EchoGenOrdinal          uint64 = 0x4a4939ff00000000
+	Test1NoResponseGenOrdinal    uint64 = 0x7e0c050500000000
+	Test1EmptyResponseGenOrdinal uint64 = 0x648de0d00000000
+	Test1SurpriseGenOrdinal      uint64 = 0x4bd66e7200000000
 )
 
 type test1EchoRequest struct {
@@ -939,6 +941,19 @@
 	return resp_.Out, err
 }
 
+func (p *Test1Interface) NoResponse() error {
+	var req_ _bindings.Message
+	err := ((*_bindings.ChannelProxy)(p)).Send(Test1NoResponseGenOrdinal, req_)
+	return err
+}
+
+func (p *Test1Interface) EmptyResponse() error {
+	var req_ _bindings.Message
+	var resp_ _bindings.Message
+	err := ((*_bindings.ChannelProxy)(p)).Call(Test1EmptyResponseGenOrdinal, req_, resp_)
+	return err
+}
+
 func (p *Test1Interface) ExpectSurprise() (string, error) {
 	resp_ := &test1SurpriseResponse{}
 	err := ((*_bindings.ChannelProxy)(p)).Recv(Test1SurpriseGenOrdinal, resp_)
@@ -947,6 +962,8 @@
 
 type Test1 interface {
 	Echo(in *string) (*string, error)
+	NoResponse() error
+	EmptyResponse() error
 }
 
 type Test1TransitionalBase struct{}
@@ -962,19 +979,25 @@
 	Impl Test1
 }
 
-func (s_ *Test1Stub) Dispatch(ordinal_ uint64, data_ []byte, handles_ []_zx.Handle) (_bindings.Message, error) {
+func (s_ *Test1Stub) DispatchImpl(ordinal_ uint64, data_ []byte, handles_ []_zx.Handle) (_bindings.Message, bool, error) {
 	switch ordinal_ {
 	case Test1EchoGenOrdinal:
 		in_ := test1EchoRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
+			return nil, false, err_
 		}
 		out, err_ := s_.Impl.Echo(in_.In)
 		out_ := test1EchoResponse{}
 		out_.Out = out
-		return &out_, err_
+		return &out_, true, err_
+	case Test1NoResponseGenOrdinal:
+		err_ := s_.Impl.NoResponse()
+		return nil, false, err_
+	case Test1EmptyResponseGenOrdinal:
+		err_ := s_.Impl.EmptyResponse()
+		return nil, true, err_
 	}
-	return nil, _bindings.ErrUnknownOrdinal
+	return nil, false, _bindings.ErrUnknownOrdinal
 }
 
 type Test1Service struct {
@@ -1017,10 +1040,10 @@
 	Impl EthernetDevice
 }
 
-func (s_ *EthernetDeviceStub) Dispatch(ordinal_ uint64, data_ []byte, handles_ []_zx.Handle) (_bindings.Message, error) {
+func (s_ *EthernetDeviceStub) DispatchImpl(ordinal_ uint64, data_ []byte, handles_ []_zx.Handle) (_bindings.Message, bool, error) {
 	switch ordinal_ {
 	}
-	return nil, _bindings.ErrUnknownOrdinal
+	return nil, false, _bindings.ErrUnknownOrdinal
 }
 
 type EthernetDeviceService struct {
diff --git a/src/syscall/zx/fidl/bindingstest/test.test.fidl b/src/syscall/zx/fidl/bindingstest/test.test.fidl
index 7c9e9a6..9583b60 100644
--- a/src/syscall/zx/fidl/bindingstest/test.test.fidl
+++ b/src/syscall/zx/fidl/bindingstest/test.test.fidl
@@ -187,6 +187,8 @@
 
 protocol Test1 {
     Echo(string? in) -> (string? out);
+    NoResponse();
+    EmptyResponse() -> ();
     -> Surprise(string foo);
 };
 
diff --git a/src/syscall/zx/fidl/conformance/impl.go b/src/syscall/zx/fidl/conformance/impl.go
index 75f4fcb..bdedd2e 100644
--- a/src/syscall/zx/fidl/conformance/impl.go
+++ b/src/syscall/zx/fidl/conformance/impl.go
@@ -785,10 +785,10 @@
 	Impl EthernetDevice
 }
 
-func (s_ *EthernetDeviceStub) Dispatch(ordinal_ uint64, data_ []byte, handles_ []_zx.Handle) (_bindings.Message, error) {
+func (s_ *EthernetDeviceStub) DispatchImpl(ordinal_ uint64, data_ []byte, handles_ []_zx.Handle) (_bindings.Message, bool, error) {
 	switch ordinal_ {
 	}
-	return nil, _bindings.ErrUnknownOrdinal
+	return nil, false, _bindings.ErrUnknownOrdinal
 }
 
 type EthernetDeviceService struct {
diff --git a/src/syscall/zx/fidl/fidl_test/bindings_test.go b/src/syscall/zx/fidl/fidl_test/bindings_test.go
index 8ae7883..bd0cae6 100644
--- a/src/syscall/zx/fidl/fidl_test/bindings_test.go
+++ b/src/syscall/zx/fidl/fidl_test/bindings_test.go
@@ -25,6 +25,14 @@
 	return s, nil
 }
 
+func (t *Test1Impl) NoResponse() error {
+	return nil
+}
+
+func (t *Test1Impl) EmptyResponse() error {
+	return nil
+}
+
 func TestBindingSize(t *testing.T) {
 	clientEnd, serverEnd, err := zx.NewChannel(0)
 	if err != nil {
@@ -123,6 +131,20 @@
 		}
 	})
 
+	t.Run("NoResponse", func(t *testing.T) {
+		err := client.NoResponse()
+		if err != nil {
+			t.Fatal(err)
+		}
+	})
+
+	t.Run("EmptyResponse", func(t *testing.T) {
+		err := client.EmptyResponse()
+		if err != nil {
+			t.Fatal(err)
+		}
+	})
+
 	t.Run("Event", func(t *testing.T) {
 		str := "Surprise!"
 		done := make(chan struct{})
diff --git a/src/syscall/zx/fidl/interface.go b/src/syscall/zx/fidl/interface.go
index 03802f4..359cf8a 100644
--- a/src/syscall/zx/fidl/interface.go
+++ b/src/syscall/zx/fidl/interface.go
@@ -55,13 +55,13 @@
 // It contains logic which is able to dispatch into the correct implementation given
 // the incoming message ordinal and its data.
 type Stub interface {
-	// Dispatch dispatches into the appropriate method implementation for a FIDL
+	// DispatchImpl dispatches into the appropriate method implementation for a FIDL
 	// interface by using the ordinal.
 	//
 	// It also takes the data as bytes and transforms it into arguments usable by
 	// the method implementation. It then optionally returns a response if the
-	// method has a response.
-	Dispatch(ordinal uint64, bytes []byte, handles []zx.Handle) (Message, error)
+	// method has a response, in which case, the boolean return value is true.
+	DispatchImpl(ordinal uint64, bytes []byte, handles []zx.Handle) (Message, bool, error)
 }
 
 // ChannelProxy a Proxy that is backed by a channel.
diff --git a/src/syscall/zx/io/impl.go b/src/syscall/zx/io/impl.go
index c3685b9..3651b91 100644
--- a/src/syscall/zx/io/impl.go
+++ b/src/syscall/zx/io/impl.go
@@ -749,58 +749,58 @@
 	Impl Node
 }
 
-func (s_ *NodeStub) Dispatch(ordinal_ uint64, data_ []byte, handles_ []_zx.Handle) (_bindings.Message, error) {
+func (s_ *NodeStub) DispatchImpl(ordinal_ uint64, data_ []byte, handles_ []_zx.Handle) (_bindings.Message, bool, error) {
 	switch ordinal_ {
 	case NodeCloneGenOrdinal:
 		in_ := nodeCloneRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
+			return nil, false, err_
 		}
 		err_ := s_.Impl.Clone(in_.Flags, in_.Object)
-		return nil, err_
+		return nil, false, err_
 	case NodeCloseGenOrdinal:
 		s, err_ := s_.Impl.Close()
 		out_ := nodeCloseResponse{}
 		out_.S = s
-		return &out_, err_
+		return &out_, true, err_
 	case NodeDescribeGenOrdinal:
 		info, err_ := s_.Impl.Describe()
 		out_ := nodeDescribeResponse{}
 		out_.Info = info
-		return &out_, err_
+		return &out_, true, err_
 	case NodeSyncGenOrdinal:
 		s, err_ := s_.Impl.Sync()
 		out_ := nodeSyncResponse{}
 		out_.S = s
-		return &out_, err_
+		return &out_, true, err_
 	case NodeGetAttrGenOrdinal:
 		s, attributes, err_ := s_.Impl.GetAttr()
 		out_ := nodeGetAttrResponse{}
 		out_.S = s
 		out_.Attributes = attributes
-		return &out_, err_
+		return &out_, true, err_
 	case NodeSetAttrGenOrdinal:
 		in_ := nodeSetAttrRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
+			return nil, false, err_
 		}
 		s, err_ := s_.Impl.SetAttr(in_.Flags, in_.Attributes)
 		out_ := nodeSetAttrResponse{}
 		out_.S = s
-		return &out_, err_
+		return &out_, true, err_
 	case NodeIoctlGenOrdinal:
 		in_ := nodeIoctlRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
+			return nil, false, err_
 		}
 		s, handles, out, err_ := s_.Impl.Ioctl(in_.Opcode, in_.MaxOut, in_.Handles, in_.In)
 		out_ := nodeIoctlResponse{}
 		out_.S = s
 		out_.Handles = handles
 		out_.Out = out
-		return &out_, err_
+		return &out_, true, err_
 	}
-	return nil, _bindings.ErrUnknownOrdinal
+	return nil, false, _bindings.ErrUnknownOrdinal
 }
 
 type NodeService struct {
@@ -1500,142 +1500,142 @@
 	Impl File
 }
 
-func (s_ *FileStub) Dispatch(ordinal_ uint64, data_ []byte, handles_ []_zx.Handle) (_bindings.Message, error) {
+func (s_ *FileStub) DispatchImpl(ordinal_ uint64, data_ []byte, handles_ []_zx.Handle) (_bindings.Message, bool, error) {
 	switch ordinal_ {
 	case FileCloneGenOrdinal:
 		in_ := fileCloneRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
+			return nil, false, err_
 		}
 		err_ := s_.Impl.Clone(in_.Flags, in_.Object)
-		return nil, err_
+		return nil, false, err_
 	case FileCloseGenOrdinal:
 		s, err_ := s_.Impl.Close()
 		out_ := fileCloseResponse{}
 		out_.S = s
-		return &out_, err_
+		return &out_, true, err_
 	case FileDescribeGenOrdinal:
 		info, err_ := s_.Impl.Describe()
 		out_ := fileDescribeResponse{}
 		out_.Info = info
-		return &out_, err_
+		return &out_, true, err_
 	case FileSyncGenOrdinal:
 		s, err_ := s_.Impl.Sync()
 		out_ := fileSyncResponse{}
 		out_.S = s
-		return &out_, err_
+		return &out_, true, err_
 	case FileGetAttrGenOrdinal:
 		s, attributes, err_ := s_.Impl.GetAttr()
 		out_ := fileGetAttrResponse{}
 		out_.S = s
 		out_.Attributes = attributes
-		return &out_, err_
+		return &out_, true, err_
 	case FileSetAttrGenOrdinal:
 		in_ := fileSetAttrRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
+			return nil, false, err_
 		}
 		s, err_ := s_.Impl.SetAttr(in_.Flags, in_.Attributes)
 		out_ := fileSetAttrResponse{}
 		out_.S = s
-		return &out_, err_
+		return &out_, true, err_
 	case FileIoctlGenOrdinal:
 		in_ := fileIoctlRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
+			return nil, false, err_
 		}
 		s, handles, out, err_ := s_.Impl.Ioctl(in_.Opcode, in_.MaxOut, in_.Handles, in_.In)
 		out_ := fileIoctlResponse{}
 		out_.S = s
 		out_.Handles = handles
 		out_.Out = out
-		return &out_, err_
+		return &out_, true, err_
 	case FileReadGenOrdinal:
 		in_ := fileReadRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
+			return nil, false, err_
 		}
 		s, data, err_ := s_.Impl.Read(in_.Count)
 		out_ := fileReadResponse{}
 		out_.S = s
 		out_.Data = data
-		return &out_, err_
+		return &out_, true, err_
 	case FileReadAtGenOrdinal:
 		in_ := fileReadAtRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
+			return nil, false, err_
 		}
 		s, data, err_ := s_.Impl.ReadAt(in_.Count, in_.Offset)
 		out_ := fileReadAtResponse{}
 		out_.S = s
 		out_.Data = data
-		return &out_, err_
+		return &out_, true, err_
 	case FileWriteGenOrdinal:
 		in_ := fileWriteRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
+			return nil, false, err_
 		}
 		s, actual, err_ := s_.Impl.Write(in_.Data)
 		out_ := fileWriteResponse{}
 		out_.S = s
 		out_.Actual = actual
-		return &out_, err_
+		return &out_, true, err_
 	case FileWriteAtGenOrdinal:
 		in_ := fileWriteAtRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
+			return nil, false, err_
 		}
 		s, actual, err_ := s_.Impl.WriteAt(in_.Data, in_.Offset)
 		out_ := fileWriteAtResponse{}
 		out_.S = s
 		out_.Actual = actual
-		return &out_, err_
+		return &out_, true, err_
 	case FileSeekGenOrdinal:
 		in_ := fileSeekRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
+			return nil, false, err_
 		}
 		s, offset, err_ := s_.Impl.Seek(in_.Offset, in_.Start)
 		out_ := fileSeekResponse{}
 		out_.S = s
 		out_.Offset = offset
-		return &out_, err_
+		return &out_, true, err_
 	case FileTruncateGenOrdinal:
 		in_ := fileTruncateRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
+			return nil, false, err_
 		}
 		s, err_ := s_.Impl.Truncate(in_.Length)
 		out_ := fileTruncateResponse{}
 		out_.S = s
-		return &out_, err_
+		return &out_, true, err_
 	case FileGetFlagsGenOrdinal:
 		s, flags, err_ := s_.Impl.GetFlags()
 		out_ := fileGetFlagsResponse{}
 		out_.S = s
 		out_.Flags = flags
-		return &out_, err_
+		return &out_, true, err_
 	case FileSetFlagsGenOrdinal:
 		in_ := fileSetFlagsRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
+			return nil, false, err_
 		}
 		s, err_ := s_.Impl.SetFlags(in_.Flags)
 		out_ := fileSetFlagsResponse{}
 		out_.S = s
-		return &out_, err_
+		return &out_, true, err_
 	case FileGetBufferGenOrdinal:
 		in_ := fileGetBufferRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
+			return nil, false, err_
 		}
 		s, buffer, err_ := s_.Impl.GetBuffer(in_.Flags)
 		out_ := fileGetBufferResponse{}
 		out_.S = s
 		out_.Buffer = buffer
-		return &out_, err_
+		return &out_, true, err_
 	}
-	return nil, _bindings.ErrUnknownOrdinal
+	return nil, false, _bindings.ErrUnknownOrdinal
 }
 
 type FileService struct {
@@ -1707,17 +1707,17 @@
 	Impl DirectoryWatcher
 }
 
-func (s_ *DirectoryWatcherStub) Dispatch(ordinal_ uint64, data_ []byte, handles_ []_zx.Handle) (_bindings.Message, error) {
+func (s_ *DirectoryWatcherStub) DispatchImpl(ordinal_ uint64, data_ []byte, handles_ []_zx.Handle) (_bindings.Message, bool, error) {
 	switch ordinal_ {
 	case DirectoryWatcherOnEventGenOrdinal:
 		in_ := directoryWatcherOnEventRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
+			return nil, false, err_
 		}
 		err_ := s_.Impl.OnEvent(in_.Events)
-		return nil, err_
+		return nil, false, err_
 	}
-	return nil, _bindings.ErrUnknownOrdinal
+	return nil, false, _bindings.ErrUnknownOrdinal
 }
 
 type DirectoryWatcherService struct {
@@ -2502,122 +2502,122 @@
 	Impl Directory
 }
 
-func (s_ *DirectoryStub) Dispatch(ordinal_ uint64, data_ []byte, handles_ []_zx.Handle) (_bindings.Message, error) {
+func (s_ *DirectoryStub) DispatchImpl(ordinal_ uint64, data_ []byte, handles_ []_zx.Handle) (_bindings.Message, bool, error) {
 	switch ordinal_ {
 	case DirectoryCloneGenOrdinal:
 		in_ := directoryCloneRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
+			return nil, false, err_
 		}
 		err_ := s_.Impl.Clone(in_.Flags, in_.Object)
-		return nil, err_
+		return nil, false, err_
 	case DirectoryCloseGenOrdinal:
 		s, err_ := s_.Impl.Close()
 		out_ := directoryCloseResponse{}
 		out_.S = s
-		return &out_, err_
+		return &out_, true, err_
 	case DirectoryDescribeGenOrdinal:
 		info, err_ := s_.Impl.Describe()
 		out_ := directoryDescribeResponse{}
 		out_.Info = info
-		return &out_, err_
+		return &out_, true, err_
 	case DirectorySyncGenOrdinal:
 		s, err_ := s_.Impl.Sync()
 		out_ := directorySyncResponse{}
 		out_.S = s
-		return &out_, err_
+		return &out_, true, err_
 	case DirectoryGetAttrGenOrdinal:
 		s, attributes, err_ := s_.Impl.GetAttr()
 		out_ := directoryGetAttrResponse{}
 		out_.S = s
 		out_.Attributes = attributes
-		return &out_, err_
+		return &out_, true, err_
 	case DirectorySetAttrGenOrdinal:
 		in_ := directorySetAttrRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
+			return nil, false, err_
 		}
 		s, err_ := s_.Impl.SetAttr(in_.Flags, in_.Attributes)
 		out_ := directorySetAttrResponse{}
 		out_.S = s
-		return &out_, err_
+		return &out_, true, err_
 	case DirectoryIoctlGenOrdinal:
 		in_ := directoryIoctlRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
+			return nil, false, err_
 		}
 		s, handles, out, err_ := s_.Impl.Ioctl(in_.Opcode, in_.MaxOut, in_.Handles, in_.In)
 		out_ := directoryIoctlResponse{}
 		out_.S = s
 		out_.Handles = handles
 		out_.Out = out
-		return &out_, err_
+		return &out_, true, err_
 	case DirectoryOpenGenOrdinal:
 		in_ := directoryOpenRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
+			return nil, false, err_
 		}
 		err_ := s_.Impl.Open(in_.Flags, in_.Mode, in_.Path, in_.Object)
-		return nil, err_
+		return nil, false, err_
 	case DirectoryUnlinkGenOrdinal:
 		in_ := directoryUnlinkRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
+			return nil, false, err_
 		}
 		s, err_ := s_.Impl.Unlink(in_.Path)
 		out_ := directoryUnlinkResponse{}
 		out_.S = s
-		return &out_, err_
+		return &out_, true, err_
 	case DirectoryReadDirentsGenOrdinal:
 		in_ := directoryReadDirentsRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
+			return nil, false, err_
 		}
 		s, dirents, err_ := s_.Impl.ReadDirents(in_.MaxBytes)
 		out_ := directoryReadDirentsResponse{}
 		out_.S = s
 		out_.Dirents = dirents
-		return &out_, err_
+		return &out_, true, err_
 	case DirectoryRewindGenOrdinal:
 		s, err_ := s_.Impl.Rewind()
 		out_ := directoryRewindResponse{}
 		out_.S = s
-		return &out_, err_
+		return &out_, true, err_
 	case DirectoryGetTokenGenOrdinal:
 		s, token, err_ := s_.Impl.GetToken()
 		out_ := directoryGetTokenResponse{}
 		out_.S = s
 		out_.Token = token
-		return &out_, err_
+		return &out_, true, err_
 	case DirectoryRenameGenOrdinal:
 		in_ := directoryRenameRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
+			return nil, false, err_
 		}
 		s, err_ := s_.Impl.Rename(in_.Src, in_.DstParentToken, in_.Dst)
 		out_ := directoryRenameResponse{}
 		out_.S = s
-		return &out_, err_
+		return &out_, true, err_
 	case DirectoryLinkGenOrdinal:
 		in_ := directoryLinkRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
+			return nil, false, err_
 		}
 		s, err_ := s_.Impl.Link(in_.Src, in_.DstParentToken, in_.Dst)
 		out_ := directoryLinkResponse{}
 		out_.S = s
-		return &out_, err_
+		return &out_, true, err_
 	case DirectoryWatchGenOrdinal:
 		in_ := directoryWatchRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
+			return nil, false, err_
 		}
 		s, err_ := s_.Impl.Watch(in_.Mask, in_.Options, in_.Watcher)
 		out_ := directoryWatchResponse{}
 		out_.S = s
-		return &out_, err_
+		return &out_, true, err_
 	}
-	return nil, _bindings.ErrUnknownOrdinal
+	return nil, false, _bindings.ErrUnknownOrdinal
 }
 
 type DirectoryService struct {
@@ -3588,163 +3588,163 @@
 	Impl DirectoryAdmin
 }
 
-func (s_ *DirectoryAdminStub) Dispatch(ordinal_ uint64, data_ []byte, handles_ []_zx.Handle) (_bindings.Message, error) {
+func (s_ *DirectoryAdminStub) DispatchImpl(ordinal_ uint64, data_ []byte, handles_ []_zx.Handle) (_bindings.Message, bool, error) {
 	switch ordinal_ {
 	case DirectoryAdminCloneGenOrdinal:
 		in_ := directoryAdminCloneRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
+			return nil, false, err_
 		}
 		err_ := s_.Impl.Clone(in_.Flags, in_.Object)
-		return nil, err_
+		return nil, false, err_
 	case DirectoryAdminCloseGenOrdinal:
 		s, err_ := s_.Impl.Close()
 		out_ := directoryAdminCloseResponse{}
 		out_.S = s
-		return &out_, err_
+		return &out_, true, err_
 	case DirectoryAdminDescribeGenOrdinal:
 		info, err_ := s_.Impl.Describe()
 		out_ := directoryAdminDescribeResponse{}
 		out_.Info = info
-		return &out_, err_
+		return &out_, true, err_
 	case DirectoryAdminSyncGenOrdinal:
 		s, err_ := s_.Impl.Sync()
 		out_ := directoryAdminSyncResponse{}
 		out_.S = s
-		return &out_, err_
+		return &out_, true, err_
 	case DirectoryAdminGetAttrGenOrdinal:
 		s, attributes, err_ := s_.Impl.GetAttr()
 		out_ := directoryAdminGetAttrResponse{}
 		out_.S = s
 		out_.Attributes = attributes
-		return &out_, err_
+		return &out_, true, err_
 	case DirectoryAdminSetAttrGenOrdinal:
 		in_ := directoryAdminSetAttrRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
+			return nil, false, err_
 		}
 		s, err_ := s_.Impl.SetAttr(in_.Flags, in_.Attributes)
 		out_ := directoryAdminSetAttrResponse{}
 		out_.S = s
-		return &out_, err_
+		return &out_, true, err_
 	case DirectoryAdminIoctlGenOrdinal:
 		in_ := directoryAdminIoctlRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
+			return nil, false, err_
 		}
 		s, handles, out, err_ := s_.Impl.Ioctl(in_.Opcode, in_.MaxOut, in_.Handles, in_.In)
 		out_ := directoryAdminIoctlResponse{}
 		out_.S = s
 		out_.Handles = handles
 		out_.Out = out
-		return &out_, err_
+		return &out_, true, err_
 	case DirectoryAdminOpenGenOrdinal:
 		in_ := directoryAdminOpenRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
+			return nil, false, err_
 		}
 		err_ := s_.Impl.Open(in_.Flags, in_.Mode, in_.Path, in_.Object)
-		return nil, err_
+		return nil, false, err_
 	case DirectoryAdminUnlinkGenOrdinal:
 		in_ := directoryAdminUnlinkRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
+			return nil, false, err_
 		}
 		s, err_ := s_.Impl.Unlink(in_.Path)
 		out_ := directoryAdminUnlinkResponse{}
 		out_.S = s
-		return &out_, err_
+		return &out_, true, err_
 	case DirectoryAdminReadDirentsGenOrdinal:
 		in_ := directoryAdminReadDirentsRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
+			return nil, false, err_
 		}
 		s, dirents, err_ := s_.Impl.ReadDirents(in_.MaxBytes)
 		out_ := directoryAdminReadDirentsResponse{}
 		out_.S = s
 		out_.Dirents = dirents
-		return &out_, err_
+		return &out_, true, err_
 	case DirectoryAdminRewindGenOrdinal:
 		s, err_ := s_.Impl.Rewind()
 		out_ := directoryAdminRewindResponse{}
 		out_.S = s
-		return &out_, err_
+		return &out_, true, err_
 	case DirectoryAdminGetTokenGenOrdinal:
 		s, token, err_ := s_.Impl.GetToken()
 		out_ := directoryAdminGetTokenResponse{}
 		out_.S = s
 		out_.Token = token
-		return &out_, err_
+		return &out_, true, err_
 	case DirectoryAdminRenameGenOrdinal:
 		in_ := directoryAdminRenameRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
+			return nil, false, err_
 		}
 		s, err_ := s_.Impl.Rename(in_.Src, in_.DstParentToken, in_.Dst)
 		out_ := directoryAdminRenameResponse{}
 		out_.S = s
-		return &out_, err_
+		return &out_, true, err_
 	case DirectoryAdminLinkGenOrdinal:
 		in_ := directoryAdminLinkRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
+			return nil, false, err_
 		}
 		s, err_ := s_.Impl.Link(in_.Src, in_.DstParentToken, in_.Dst)
 		out_ := directoryAdminLinkResponse{}
 		out_.S = s
-		return &out_, err_
+		return &out_, true, err_
 	case DirectoryAdminWatchGenOrdinal:
 		in_ := directoryAdminWatchRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
+			return nil, false, err_
 		}
 		s, err_ := s_.Impl.Watch(in_.Mask, in_.Options, in_.Watcher)
 		out_ := directoryAdminWatchResponse{}
 		out_.S = s
-		return &out_, err_
+		return &out_, true, err_
 	case DirectoryAdminMountGenOrdinal:
 		in_ := directoryAdminMountRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
+			return nil, false, err_
 		}
 		s, err_ := s_.Impl.Mount(in_.Remote)
 		out_ := directoryAdminMountResponse{}
 		out_.S = s
-		return &out_, err_
+		return &out_, true, err_
 	case DirectoryAdminMountAndCreateGenOrdinal:
 		in_ := directoryAdminMountAndCreateRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
+			return nil, false, err_
 		}
 		s, err_ := s_.Impl.MountAndCreate(in_.Remote, in_.Name, in_.Flags)
 		out_ := directoryAdminMountAndCreateResponse{}
 		out_.S = s
-		return &out_, err_
+		return &out_, true, err_
 	case DirectoryAdminUnmountGenOrdinal:
 		s, err_ := s_.Impl.Unmount()
 		out_ := directoryAdminUnmountResponse{}
 		out_.S = s
-		return &out_, err_
+		return &out_, true, err_
 	case DirectoryAdminUnmountNodeGenOrdinal:
 		s, remote, err_ := s_.Impl.UnmountNode()
 		out_ := directoryAdminUnmountNodeResponse{}
 		out_.S = s
 		out_.Remote = remote
-		return &out_, err_
+		return &out_, true, err_
 	case DirectoryAdminQueryFilesystemGenOrdinal:
 		s, info, err_ := s_.Impl.QueryFilesystem()
 		out_ := directoryAdminQueryFilesystemResponse{}
 		out_.S = s
 		out_.Info = info
-		return &out_, err_
+		return &out_, true, err_
 	case DirectoryAdminGetDevicePathGenOrdinal:
 		s, path, err_ := s_.Impl.GetDevicePath()
 		out_ := directoryAdminGetDevicePathResponse{}
 		out_.S = s
 		out_.Path = path
-		return &out_, err_
+		return &out_, true, err_
 	}
-	return nil, _bindings.ErrUnknownOrdinal
+	return nil, false, _bindings.ErrUnknownOrdinal
 }
 
 type DirectoryAdminService struct {
diff --git a/src/syscall/zx/net/impl.go b/src/syscall/zx/net/impl.go
index b37d74b..9050b09 100644
--- a/src/syscall/zx/net/impl.go
+++ b/src/syscall/zx/net/impl.go
@@ -622,136 +622,136 @@
 	Impl Control
 }
 
-func (s_ *ControlStub) Dispatch(ordinal_ uint64, data_ []byte, handles_ []_zx.Handle) (_bindings.Message, error) {
+func (s_ *ControlStub) DispatchImpl(ordinal_ uint64, data_ []byte, handles_ []_zx.Handle) (_bindings.Message, bool, error) {
 	switch ordinal_ {
 	case ControlCloneGenOrdinal:
 		in_ := controlCloneRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
+			return nil, false, err_
 		}
 		err_ := s_.Impl.Clone(in_.Flags, in_.Object)
-		return nil, err_
+		return nil, false, err_
 	case ControlCloseGenOrdinal:
 		s, err_ := s_.Impl.Close()
 		out_ := controlCloseResponse{}
 		out_.S = s
-		return &out_, err_
+		return &out_, true, err_
 	case ControlDescribeGenOrdinal:
 		info, err_ := s_.Impl.Describe()
 		out_ := controlDescribeResponse{}
 		out_.Info = info
-		return &out_, err_
+		return &out_, true, err_
 	case ControlSyncGenOrdinal:
 		s, err_ := s_.Impl.Sync()
 		out_ := controlSyncResponse{}
 		out_.S = s
-		return &out_, err_
+		return &out_, true, err_
 	case ControlGetAttrGenOrdinal:
 		s, attributes, err_ := s_.Impl.GetAttr()
 		out_ := controlGetAttrResponse{}
 		out_.S = s
 		out_.Attributes = attributes
-		return &out_, err_
+		return &out_, true, err_
 	case ControlSetAttrGenOrdinal:
 		in_ := controlSetAttrRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
+			return nil, false, err_
 		}
 		s, err_ := s_.Impl.SetAttr(in_.Flags, in_.Attributes)
 		out_ := controlSetAttrResponse{}
 		out_.S = s
-		return &out_, err_
+		return &out_, true, err_
 	case ControlIoctlGenOrdinal:
 		in_ := controlIoctlRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
+			return nil, false, err_
 		}
 		s, handles, out, err_ := s_.Impl.Ioctl(in_.Opcode, in_.MaxOut, in_.Handles, in_.In)
 		out_ := controlIoctlResponse{}
 		out_.S = s
 		out_.Handles = handles
 		out_.Out = out
-		return &out_, err_
+		return &out_, true, err_
 	case ControlBindGenOrdinal:
 		in_ := controlBindRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
+			return nil, false, err_
 		}
 		code, err_ := s_.Impl.Bind(in_.Addr)
 		out_ := controlBindResponse{}
 		out_.Code = code
-		return &out_, err_
+		return &out_, true, err_
 	case ControlConnectGenOrdinal:
 		in_ := controlConnectRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
+			return nil, false, err_
 		}
 		code, err_ := s_.Impl.Connect(in_.Addr)
 		out_ := controlConnectResponse{}
 		out_.Code = code
-		return &out_, err_
+		return &out_, true, err_
 	case ControlListenGenOrdinal:
 		in_ := controlListenRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
+			return nil, false, err_
 		}
 		code, err_ := s_.Impl.Listen(in_.Backlog)
 		out_ := controlListenResponse{}
 		out_.Code = code
-		return &out_, err_
+		return &out_, true, err_
 	case ControlAcceptGenOrdinal:
 		in_ := controlAcceptRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
+			return nil, false, err_
 		}
 		code, s, err_ := s_.Impl.Accept(in_.Flags)
 		out_ := controlAcceptResponse{}
 		out_.Code = code
 		out_.S = s
-		return &out_, err_
+		return &out_, true, err_
 	case ControlGetSockNameGenOrdinal:
 		code, addr, err_ := s_.Impl.GetSockName()
 		out_ := controlGetSockNameResponse{}
 		out_.Code = code
 		out_.Addr = addr
-		return &out_, err_
+		return &out_, true, err_
 	case ControlGetPeerNameGenOrdinal:
 		code, addr, err_ := s_.Impl.GetPeerName()
 		out_ := controlGetPeerNameResponse{}
 		out_.Code = code
 		out_.Addr = addr
-		return &out_, err_
+		return &out_, true, err_
 	case ControlSetSockOptGenOrdinal:
 		in_ := controlSetSockOptRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
+			return nil, false, err_
 		}
 		code, err_ := s_.Impl.SetSockOpt(in_.Level, in_.Optname, in_.Optval)
 		out_ := controlSetSockOptResponse{}
 		out_.Code = code
-		return &out_, err_
+		return &out_, true, err_
 	case ControlGetSockOptGenOrdinal:
 		in_ := controlGetSockOptRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
+			return nil, false, err_
 		}
 		code, optval, err_ := s_.Impl.GetSockOpt(in_.Level, in_.Optname)
 		out_ := controlGetSockOptResponse{}
 		out_.Code = code
 		out_.Optval = optval
-		return &out_, err_
+		return &out_, true, err_
 	case ControlIoctlPosixGenOrdinal:
 		in_ := controlIoctlPosixRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
+			return nil, false, err_
 		}
 		code, out, err_ := s_.Impl.IoctlPosix(in_.Req, in_.In)
 		out_ := controlIoctlPosixResponse{}
 		out_.Code = code
 		out_.Out = out
-		return &out_, err_
+		return &out_, true, err_
 	}
-	return nil, _bindings.ErrUnknownOrdinal
+	return nil, false, _bindings.ErrUnknownOrdinal
 }
 
 type ControlService struct {
@@ -851,20 +851,20 @@
 	Impl Provider
 }
 
-func (s_ *ProviderStub) Dispatch(ordinal_ uint64, data_ []byte, handles_ []_zx.Handle) (_bindings.Message, error) {
+func (s_ *ProviderStub) DispatchImpl(ordinal_ uint64, data_ []byte, handles_ []_zx.Handle) (_bindings.Message, bool, error) {
 	switch ordinal_ {
 	case ProviderSocketGenOrdinal:
 		in_ := providerSocketRequest{}
 		if _, _, err_ := _bindings.Unmarshal(data_, handles_, &in_); err_ != nil {
-			return nil, err_
+			return nil, false, err_
 		}
 		code, s, err_ := s_.Impl.Socket(in_.Domain, in_.Type, in_.Protocol)
 		out_ := providerSocketResponse{}
 		out_.Code = code
 		out_.S = s
-		return &out_, err_
+		return &out_, true, err_
 	}
-	return nil, _bindings.ErrUnknownOrdinal
+	return nil, false, _bindings.ErrUnknownOrdinal
 }
 
 type ProviderService struct {