|  | @@ -27,6 +27,7 @@
 | 
	
		
			
				|  |  |  # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
	
		
			
				|  |  |  # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +from libc.stdint cimport intptr_t
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  class ConnectivityState:
 | 
	
		
			
				|  |  |    idle = GRPC_CHANNEL_IDLE
 | 
	
	
		
			
				|  | @@ -303,20 +304,49 @@ cdef class SslPemKeyCertPair:
 | 
	
		
			
				|  |  |      self.c_pair.certificate_chain = self.certificate_chain
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +cdef void* copy_ptr(void* ptr):
 | 
	
		
			
				|  |  | +  return ptr
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +cdef void destroy_ptr(void* ptr):
 | 
	
		
			
				|  |  | +  pass
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +cdef int compare_ptr(void* ptr1, void* ptr2):
 | 
	
		
			
				|  |  | +  if ptr1 < ptr2:
 | 
	
		
			
				|  |  | +    return -1
 | 
	
		
			
				|  |  | +  elif ptr1 > ptr2:
 | 
	
		
			
				|  |  | +    return 1
 | 
	
		
			
				|  |  | +  else:
 | 
	
		
			
				|  |  | +    return 0
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  cdef class ChannelArg:
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    def __cinit__(self, bytes key, value):
 | 
	
		
			
				|  |  |      self.key = key
 | 
	
		
			
				|  |  | +    self.value = value
 | 
	
		
			
				|  |  |      self.c_arg.key = self.key
 | 
	
		
			
				|  |  |      if isinstance(value, int):
 | 
	
		
			
				|  |  | -      self.value = value
 | 
	
		
			
				|  |  |        self.c_arg.type = GRPC_ARG_INTEGER
 | 
	
		
			
				|  |  |        self.c_arg.value.integer = self.value
 | 
	
		
			
				|  |  |      elif isinstance(value, bytes):
 | 
	
		
			
				|  |  | -      self.value = value
 | 
	
		
			
				|  |  |        self.c_arg.type = GRPC_ARG_STRING
 | 
	
		
			
				|  |  |        self.c_arg.value.string = self.value
 | 
	
		
			
				|  |  | +    elif hasattr(value, '__int__'):
 | 
	
		
			
				|  |  | +      # Pointer objects must override __int__() to return
 | 
	
		
			
				|  |  | +      # the underlying C address (Python ints are word size).  The
 | 
	
		
			
				|  |  | +      # lifecycle of the pointer is fixed to the lifecycle of the 
 | 
	
		
			
				|  |  | +      # python object wrapping it.
 | 
	
		
			
				|  |  | +      self.ptr_vtable.copy = ©_ptr
 | 
	
		
			
				|  |  | +      self.ptr_vtable.destroy = &destroy_ptr
 | 
	
		
			
				|  |  | +      self.ptr_vtable.cmp = &compare_ptr
 | 
	
		
			
				|  |  | +      self.c_arg.type = GRPC_ARG_POINTER
 | 
	
		
			
				|  |  | +      self.c_arg.value.pointer.vtable = &self.ptr_vtable
 | 
	
		
			
				|  |  | +      self.c_arg.value.pointer.address = <void*>(<intptr_t>int(self.value))
 | 
	
		
			
				|  |  |      else:
 | 
	
		
			
				|  |  | +      # TODO Add supported pointer types to this message
 | 
	
		
			
				|  |  |        raise TypeError('Expected int or bytes, got {}'.format(type(value)))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 |