Package: asyncpg Version: 0.12.0-1 Severity: normal Tags: patch User: ubuntu-de...@lists.ubuntu.com Usertags: origin-ubuntu artful ubuntu-patch
Hi Piotr, The new upstream release of asyncpg fails to build on armhf in Ubuntu, because it assumes unaligned 32-bit reads are allowed. This is not a portable assumption; specifically, on armhf this may raise a SIGBUS depending on the CPU and the kernel configuration. The Ubuntu infrastructure does raise SIGBUS, so I've uploaded the attached patch to Ubuntu to fix the failure. Please consider applying this in Debian as well, where it make affect some number of users even if it doesn't trigger on Debian infrastructure. Thanks, -- Steve Langasek Give me a lever long enough and a Free OS Debian Developer to set it on, and I can move the world. Ubuntu Developer http://www.debian.org/ slanga...@ubuntu.com vor...@debian.org
diff -Nru asyncpg-0.12.0/debian/patches/series asyncpg-0.12.0/debian/patches/series --- asyncpg-0.12.0/debian/patches/series 1969-12-31 16:00:00.000000000 -0800 +++ asyncpg-0.12.0/debian/patches/series 2017-08-14 13:36:56.000000000 -0700 @@ -0,0 +1 @@ +unaligned-access.patch diff -Nru asyncpg-0.12.0/debian/patches/unaligned-access.patch asyncpg-0.12.0/debian/patches/unaligned-access.patch --- asyncpg-0.12.0/debian/patches/unaligned-access.patch 1969-12-31 16:00:00.000000000 -0800 +++ asyncpg-0.12.0/debian/patches/unaligned-access.patch 2017-08-17 00:06:58.000000000 -0700 @@ -0,0 +1,446 @@ +Description: use alignment-safe unpacking of buffers + Casting a char* to an int32* is not universally safe due to alignment + constraints on reads on some platforms. So skip using ntohl(), just + unpack this ourselves. +Author: Steve Langasek <steve.langa...@ubuntu.com> + +Index: asyncpg-0.12.0/asyncpg/protocol/hton.pxd +=================================================================== +--- asyncpg-0.12.0.orig/asyncpg/protocol/hton.pxd ++++ asyncpg-0.12.0/asyncpg/protocol/hton.pxd +@@ -5,7 +5,7 @@ + # the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +-from libc.stdint cimport int16_t, int32_t, uint16_t, uint32_t, int64_t, uint64_t ++from libc.stdint cimport uint8_t, int16_t, int32_t, uint16_t, uint32_t, int64_t, uint64_t + + + IF UNAME_SYSNAME == "Windows": +@@ -35,7 +35,10 @@ + + + cdef inline int32_t unpack_int32(const char* buf): +- return <int32_t>ntohl((<uint32_t*>buf)[0]) ++ cdef uint32_t hh = (<uint8_t *>buf)[0] ++ hh = (hh << 8) | (<uint8_t *>buf)[1] ++ hh = (hh << 8) | (<uint8_t *>buf)[2] ++ return <int32_t>((hh << 8) | (<uint8_t *>buf)[3]) + + + cdef inline void pack_int64(char* buf, int64_t x): +Index: asyncpg-0.12.0/asyncpg/protocol/protocol.c +=================================================================== +--- asyncpg-0.12.0.orig/asyncpg/protocol/protocol.c ++++ asyncpg-0.12.0/asyncpg/protocol/protocol.c +@@ -709,7 +709,7 @@ + union __pyx_t_7asyncpg_8protocol_4hton__floatconv; + union __pyx_t_7asyncpg_8protocol_4hton__doubleconv; + +-/* "hton.pxd":53 ++/* "hton.pxd":56 + * + * + * cdef union _floatconv: # <<<<<<<<<<<<<< +@@ -721,7 +721,7 @@ + float f; + }; + +-/* "hton.pxd":70 ++/* "hton.pxd":73 + * + * + * cdef union _doubleconv: # <<<<<<<<<<<<<< +@@ -3545,6 +3545,7 @@ + static const char __pyx_k_ConnectionDoesNotExistError[] = "ConnectionDoesNotExistError"; + static const char __pyx_k_BaseProtocol_close_statement[] = "BaseProtocol.close_statement"; + static const char __pyx_k_decode_row_statement_is_None[] = "_decode_row: statement is None"; ++static const char __pyx_k_asyncpg_protocol_protocol_pyx[] = "asyncpg/protocol/protocol.pyx"; + static const char __pyx_k_missing_array_dimension_value[] = "missing array dimension value"; + static const char __pyx_k_not_enough_data_to_read_bytes[] = "not enough data to read {} bytes"; + static const char __pyx_k_BaseProtocol_bind_execute_many[] = "BaseProtocol.bind_execute_many"; +@@ -3559,7 +3560,6 @@ + static const char __pyx_k_end_message_buffer_is_too_small[] = "end_message: buffer is too small"; + static const char __pyx_k_feed_data_bytes_object_expected[] = "feed_data: bytes object expected"; + static const char __pyx_k_got_result_for_unknown_protocol[] = "got result for unknown protocol state {}"; +-static const char __pyx_k_home_travis_build_MagicStack_as[] = "/home/travis/build/MagicStack/asyncpg/asyncpg/protocol/protocol.pyx"; + static const char __pyx_k_invalid_address_family_in_value[] = "invalid address family in \"{}\" value"; + static const char __pyx_k_list_or_tuple_expected_got_type[] = "list or tuple expected (got type {})"; + static const char __pyx_k_on_result__prepare_statement_is[] = "_on_result__prepare: statement is None"; +@@ -3751,6 +3751,7 @@ + static PyObject *__pyx_n_s_asyncpg; + static PyObject *__pyx_n_s_asyncpg_exceptions; + static PyObject *__pyx_n_s_asyncpg_protocol_protocol; ++static PyObject *__pyx_kp_s_asyncpg_protocol_protocol_pyx; + static PyObject *__pyx_n_s_asyncpg_types; + static PyObject *__pyx_n_u_attrnames; + static PyObject *__pyx_n_u_attrtypoids; +@@ -3918,7 +3919,6 @@ + static PyObject *__pyx_n_s_hashlib; + static PyObject *__pyx_n_s_hashlib_md5; + static PyObject *__pyx_n_s_hexdigest; +-static PyObject *__pyx_kp_s_home_travis_build_MagicStack_as; + static PyObject *__pyx_n_s_hour; + static PyObject *__pyx_kp_u_hstore_value_is_too_large; + static PyObject *__pyx_n_s_i; +@@ -79645,11 +79645,12 @@ + * + * + * cdef inline int32_t unpack_int32(const char* buf): # <<<<<<<<<<<<<< +- * return <int32_t>ntohl((<uint32_t*>buf)[0]) +- * ++ * cdef uint32_t hh = (<uint8_t *>buf)[0] ++ * hh = (hh << 8) | (<uint8_t *>buf)[1] + */ + + static CYTHON_INLINE int32_t __pyx_f_7asyncpg_8protocol_4hton_unpack_int32(char const *__pyx_v_buf) { ++ uint32_t __pyx_v_hh; + int32_t __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("unpack_int32", 0); +@@ -79657,19 +79658,46 @@ + /* "hton.pxd":38 + * + * cdef inline int32_t unpack_int32(const char* buf): +- * return <int32_t>ntohl((<uint32_t*>buf)[0]) # <<<<<<<<<<<<<< ++ * cdef uint32_t hh = (<uint8_t *>buf)[0] # <<<<<<<<<<<<<< ++ * hh = (hh << 8) | (<uint8_t *>buf)[1] ++ * hh = (hh << 8) | (<uint8_t *>buf)[2] ++ */ ++ __pyx_v_hh = (((uint8_t *)__pyx_v_buf)[0]); ++ ++ /* "hton.pxd":39 ++ * cdef inline int32_t unpack_int32(const char* buf): ++ * cdef uint32_t hh = (<uint8_t *>buf)[0] ++ * hh = (hh << 8) | (<uint8_t *>buf)[1] # <<<<<<<<<<<<<< ++ * hh = (hh << 8) | (<uint8_t *>buf)[2] ++ * return <int32_t>((hh << 8) | (<uint8_t *>buf)[3]) ++ */ ++ __pyx_v_hh = ((__pyx_v_hh << 8) | (((uint8_t *)__pyx_v_buf)[1])); ++ ++ /* "hton.pxd":40 ++ * cdef uint32_t hh = (<uint8_t *>buf)[0] ++ * hh = (hh << 8) | (<uint8_t *>buf)[1] ++ * hh = (hh << 8) | (<uint8_t *>buf)[2] # <<<<<<<<<<<<<< ++ * return <int32_t>((hh << 8) | (<uint8_t *>buf)[3]) ++ * ++ */ ++ __pyx_v_hh = ((__pyx_v_hh << 8) | (((uint8_t *)__pyx_v_buf)[2])); ++ ++ /* "hton.pxd":41 ++ * hh = (hh << 8) | (<uint8_t *>buf)[1] ++ * hh = (hh << 8) | (<uint8_t *>buf)[2] ++ * return <int32_t>((hh << 8) | (<uint8_t *>buf)[3]) # <<<<<<<<<<<<<< + * + * + */ +- __pyx_r = ((int32_t)ntohl((((uint32_t *)__pyx_v_buf)[0]))); ++ __pyx_r = ((int32_t)((__pyx_v_hh << 8) | (((uint8_t *)__pyx_v_buf)[3]))); + goto __pyx_L0; + + /* "hton.pxd":37 + * + * + * cdef inline int32_t unpack_int32(const char* buf): # <<<<<<<<<<<<<< +- * return <int32_t>ntohl((<uint32_t*>buf)[0]) +- * ++ * cdef uint32_t hh = (<uint8_t *>buf)[0] ++ * hh = (hh << 8) | (<uint8_t *>buf)[1] + */ + + /* function exit code */ +@@ -79678,7 +79706,7 @@ + return __pyx_r; + } + +-/* "hton.pxd":41 ++/* "hton.pxd":44 + * + * + * cdef inline void pack_int64(char* buf, int64_t x): # <<<<<<<<<<<<<< +@@ -79690,7 +79718,7 @@ + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("pack_int64", 0); + +- /* "hton.pxd":42 ++ /* "hton.pxd":45 + * + * cdef inline void pack_int64(char* buf, int64_t x): + * (<uint32_t*>buf)[0] = htonl(<uint32_t>(<uint64_t>(x) >> 32)) # <<<<<<<<<<<<<< +@@ -79699,7 +79727,7 @@ + */ + (((uint32_t *)__pyx_v_buf)[0]) = htonl(((uint32_t)(((uint64_t)__pyx_v_x) >> 32))); + +- /* "hton.pxd":43 ++ /* "hton.pxd":46 + * cdef inline void pack_int64(char* buf, int64_t x): + * (<uint32_t*>buf)[0] = htonl(<uint32_t>(<uint64_t>(x) >> 32)) + * (<uint32_t*>&buf[4])[0] = htonl(<uint32_t>(x)) # <<<<<<<<<<<<<< +@@ -79708,7 +79736,7 @@ + */ + (((uint32_t *)(&(__pyx_v_buf[4])))[0]) = htonl(((uint32_t)__pyx_v_x)); + +- /* "hton.pxd":41 ++ /* "hton.pxd":44 + * + * + * cdef inline void pack_int64(char* buf, int64_t x): # <<<<<<<<<<<<<< +@@ -79720,7 +79748,7 @@ + __Pyx_RefNannyFinishContext(); + } + +-/* "hton.pxd":46 ++/* "hton.pxd":49 + * + * + * cdef inline int64_t unpack_int64(const char* buf): # <<<<<<<<<<<<<< +@@ -79735,7 +79763,7 @@ + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("unpack_int64", 0); + +- /* "hton.pxd":47 ++ /* "hton.pxd":50 + * + * cdef inline int64_t unpack_int64(const char* buf): + * cdef int64_t hh = unpack_int32(buf) # <<<<<<<<<<<<<< +@@ -79744,7 +79772,7 @@ + */ + __pyx_v_hh = __pyx_f_7asyncpg_8protocol_4hton_unpack_int32(__pyx_v_buf); + +- /* "hton.pxd":48 ++ /* "hton.pxd":51 + * cdef inline int64_t unpack_int64(const char* buf): + * cdef int64_t hh = unpack_int32(buf) + * cdef uint32_t hl = <uint32_t>unpack_int32(&buf[4]) # <<<<<<<<<<<<<< +@@ -79753,7 +79781,7 @@ + */ + __pyx_v_hl = ((uint32_t)__pyx_f_7asyncpg_8protocol_4hton_unpack_int32((&(__pyx_v_buf[4])))); + +- /* "hton.pxd":50 ++ /* "hton.pxd":53 + * cdef uint32_t hl = <uint32_t>unpack_int32(&buf[4]) + * + * return (hh << 32) | hl # <<<<<<<<<<<<<< +@@ -79763,7 +79791,7 @@ + __pyx_r = ((__pyx_v_hh << 32) | __pyx_v_hl); + goto __pyx_L0; + +- /* "hton.pxd":46 ++ /* "hton.pxd":49 + * + * + * cdef inline int64_t unpack_int64(const char* buf): # <<<<<<<<<<<<<< +@@ -79777,7 +79805,7 @@ + return __pyx_r; + } + +-/* "hton.pxd":58 ++/* "hton.pxd":61 + * + * + * cdef inline int32_t pack_float(char* buf, float f): # <<<<<<<<<<<<<< +@@ -79791,7 +79819,7 @@ + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("pack_float", 0); + +- /* "hton.pxd":60 ++ /* "hton.pxd":63 + * cdef inline int32_t pack_float(char* buf, float f): + * cdef _floatconv v + * v.f = f # <<<<<<<<<<<<<< +@@ -79800,7 +79828,7 @@ + */ + __pyx_v_v.f = __pyx_v_f; + +- /* "hton.pxd":61 ++ /* "hton.pxd":64 + * cdef _floatconv v + * v.f = f + * pack_int32(buf, <int32_t>v.i) # <<<<<<<<<<<<<< +@@ -79809,7 +79837,7 @@ + */ + __pyx_f_7asyncpg_8protocol_4hton_pack_int32(__pyx_v_buf, ((int32_t)__pyx_v_v.i)); + +- /* "hton.pxd":58 ++ /* "hton.pxd":61 + * + * + * cdef inline int32_t pack_float(char* buf, float f): # <<<<<<<<<<<<<< +@@ -79823,7 +79851,7 @@ + return __pyx_r; + } + +-/* "hton.pxd":64 ++/* "hton.pxd":67 + * + * + * cdef inline float unpack_float(const char* buf): # <<<<<<<<<<<<<< +@@ -79837,7 +79865,7 @@ + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("unpack_float", 0); + +- /* "hton.pxd":66 ++ /* "hton.pxd":69 + * cdef inline float unpack_float(const char* buf): + * cdef _floatconv v + * v.i = <uint32_t>unpack_int32(buf) # <<<<<<<<<<<<<< +@@ -79846,7 +79874,7 @@ + */ + __pyx_v_v.i = ((uint32_t)__pyx_f_7asyncpg_8protocol_4hton_unpack_int32(__pyx_v_buf)); + +- /* "hton.pxd":67 ++ /* "hton.pxd":70 + * cdef _floatconv v + * v.i = <uint32_t>unpack_int32(buf) + * return v.f # <<<<<<<<<<<<<< +@@ -79856,7 +79884,7 @@ + __pyx_r = __pyx_v_v.f; + goto __pyx_L0; + +- /* "hton.pxd":64 ++ /* "hton.pxd":67 + * + * + * cdef inline float unpack_float(const char* buf): # <<<<<<<<<<<<<< +@@ -79870,7 +79898,7 @@ + return __pyx_r; + } + +-/* "hton.pxd":75 ++/* "hton.pxd":78 + * + * + * cdef inline int64_t pack_double(char* buf, double f): # <<<<<<<<<<<<<< +@@ -79884,7 +79912,7 @@ + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("pack_double", 0); + +- /* "hton.pxd":77 ++ /* "hton.pxd":80 + * cdef inline int64_t pack_double(char* buf, double f): + * cdef _doubleconv v + * v.f = f # <<<<<<<<<<<<<< +@@ -79893,7 +79921,7 @@ + */ + __pyx_v_v.f = __pyx_v_f; + +- /* "hton.pxd":78 ++ /* "hton.pxd":81 + * cdef _doubleconv v + * v.f = f + * pack_int64(buf, <int64_t>v.i) # <<<<<<<<<<<<<< +@@ -79902,7 +79930,7 @@ + */ + __pyx_f_7asyncpg_8protocol_4hton_pack_int64(__pyx_v_buf, ((int64_t)__pyx_v_v.i)); + +- /* "hton.pxd":75 ++ /* "hton.pxd":78 + * + * + * cdef inline int64_t pack_double(char* buf, double f): # <<<<<<<<<<<<<< +@@ -79916,7 +79944,7 @@ + return __pyx_r; + } + +-/* "hton.pxd":81 ++/* "hton.pxd":84 + * + * + * cdef inline double unpack_double(const char* buf): # <<<<<<<<<<<<<< +@@ -79930,7 +79958,7 @@ + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("unpack_double", 0); + +- /* "hton.pxd":83 ++ /* "hton.pxd":86 + * cdef inline double unpack_double(const char* buf): + * cdef _doubleconv v + * v.i = <uint64_t>unpack_int64(buf) # <<<<<<<<<<<<<< +@@ -79938,7 +79966,7 @@ + */ + __pyx_v_v.i = ((uint64_t)__pyx_f_7asyncpg_8protocol_4hton_unpack_int64(__pyx_v_buf)); + +- /* "hton.pxd":84 ++ /* "hton.pxd":87 + * cdef _doubleconv v + * v.i = <uint64_t>unpack_int64(buf) + * return v.f # <<<<<<<<<<<<<< +@@ -79946,7 +79974,7 @@ + __pyx_r = __pyx_v_v.f; + goto __pyx_L0; + +- /* "hton.pxd":81 ++ /* "hton.pxd":84 + * + * + * cdef inline double unpack_double(const char* buf): # <<<<<<<<<<<<<< +@@ -83173,6 +83201,7 @@ + {&__pyx_n_s_asyncpg, __pyx_k_asyncpg, sizeof(__pyx_k_asyncpg), 0, 0, 1, 1}, + {&__pyx_n_s_asyncpg_exceptions, __pyx_k_asyncpg_exceptions, sizeof(__pyx_k_asyncpg_exceptions), 0, 0, 1, 1}, + {&__pyx_n_s_asyncpg_protocol_protocol, __pyx_k_asyncpg_protocol_protocol, sizeof(__pyx_k_asyncpg_protocol_protocol), 0, 0, 1, 1}, ++ {&__pyx_kp_s_asyncpg_protocol_protocol_pyx, __pyx_k_asyncpg_protocol_protocol_pyx, sizeof(__pyx_k_asyncpg_protocol_protocol_pyx), 0, 0, 1, 0}, + {&__pyx_n_s_asyncpg_types, __pyx_k_asyncpg_types, sizeof(__pyx_k_asyncpg_types), 0, 0, 1, 1}, + {&__pyx_n_u_attrnames, __pyx_k_attrnames, sizeof(__pyx_k_attrnames), 0, 1, 0, 1}, + {&__pyx_n_u_attrtypoids, __pyx_k_attrtypoids, sizeof(__pyx_k_attrtypoids), 0, 1, 0, 1}, +@@ -83340,7 +83369,6 @@ + {&__pyx_n_s_hashlib, __pyx_k_hashlib, sizeof(__pyx_k_hashlib), 0, 0, 1, 1}, + {&__pyx_n_s_hashlib_md5, __pyx_k_hashlib_md5, sizeof(__pyx_k_hashlib_md5), 0, 0, 1, 1}, + {&__pyx_n_s_hexdigest, __pyx_k_hexdigest, sizeof(__pyx_k_hexdigest), 0, 0, 1, 1}, +- {&__pyx_kp_s_home_travis_build_MagicStack_as, __pyx_k_home_travis_build_MagicStack_as, sizeof(__pyx_k_home_travis_build_MagicStack_as), 0, 0, 1, 0}, + {&__pyx_n_s_hour, __pyx_k_hour, sizeof(__pyx_k_hour), 0, 0, 1, 1}, + {&__pyx_kp_u_hstore_value_is_too_large, __pyx_k_hstore_value_is_too_large, sizeof(__pyx_k_hstore_value_is_too_large), 0, 1, 0, 0}, + {&__pyx_n_s_i, __pyx_k_i, sizeof(__pyx_k_i), 0, 0, 1, 1}, +@@ -84734,7 +84762,7 @@ + __pyx_tuple__107 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_budget); if (unlikely(!__pyx_tuple__107)) __PYX_ERR(0, 765, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__107); + __Pyx_GIVEREF(__pyx_tuple__107); +- __pyx_codeobj__108 = (PyObject*)__Pyx_PyCode_New(2, 0, 2, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__107, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_travis_build_MagicStack_as, __pyx_n_s_init, 765, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__108)) __PYX_ERR(0, 765, __pyx_L1_error) ++ __pyx_codeobj__108 = (PyObject*)__Pyx_PyCode_New(2, 0, 2, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__107, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_asyncpg_protocol_protocol_pyx, __pyx_n_s_init, 765, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__108)) __PYX_ERR(0, 765, __pyx_L1_error) + + /* "asyncpg/protocol/protocol.pyx":769 + * self._started = 0 +@@ -84746,7 +84774,7 @@ + __pyx_tuple__109 = PyTuple_Pack(1, __pyx_n_s_self); if (unlikely(!__pyx_tuple__109)) __PYX_ERR(0, 769, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__109); + __Pyx_GIVEREF(__pyx_tuple__109); +- __pyx_codeobj__110 = (PyObject*)__Pyx_PyCode_New(1, 0, 1, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__109, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_travis_build_MagicStack_as, __pyx_n_s_enter, 769, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__110)) __PYX_ERR(0, 769, __pyx_L1_error) ++ __pyx_codeobj__110 = (PyObject*)__Pyx_PyCode_New(1, 0, 1, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__109, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_asyncpg_protocol_protocol_pyx, __pyx_n_s_enter, 769, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__110)) __PYX_ERR(0, 769, __pyx_L1_error) + + /* "asyncpg/protocol/protocol.pyx":773 + * self._started = time.monotonic() +@@ -84758,7 +84786,7 @@ + __pyx_tuple__111 = PyTuple_Pack(4, __pyx_n_s_self, __pyx_n_s_et, __pyx_n_s_e, __pyx_n_s_tb); if (unlikely(!__pyx_tuple__111)) __PYX_ERR(0, 773, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__111); + __Pyx_GIVEREF(__pyx_tuple__111); +- __pyx_codeobj__112 = (PyObject*)__Pyx_PyCode_New(4, 0, 4, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__111, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_travis_build_MagicStack_as, __pyx_n_s_exit, 773, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__112)) __PYX_ERR(0, 773, __pyx_L1_error) ++ __pyx_codeobj__112 = (PyObject*)__Pyx_PyCode_New(4, 0, 4, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__111, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_asyncpg_protocol_protocol_pyx, __pyx_n_s_exit, 773, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__112)) __PYX_ERR(0, 773, __pyx_L1_error) + + /* "asyncpg/protocol/protocol.pyx":777 + * self._budget -= time.monotonic() - self._started +@@ -84770,7 +84798,7 @@ + __pyx_tuple__113 = PyTuple_Pack(1, __pyx_n_s_self); if (unlikely(!__pyx_tuple__113)) __PYX_ERR(0, 777, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__113); + __Pyx_GIVEREF(__pyx_tuple__113); +- __pyx_codeobj__114 = (PyObject*)__Pyx_PyCode_New(1, 0, 1, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__113, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_travis_build_MagicStack_as, __pyx_n_s_get_remaining_budget, 777, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__114)) __PYX_ERR(0, 777, __pyx_L1_error) ++ __pyx_codeobj__114 = (PyObject*)__Pyx_PyCode_New(1, 0, 1, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__113, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_asyncpg_protocol_protocol_pyx, __pyx_n_s_get_remaining_budget, 777, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__114)) __PYX_ERR(0, 777, __pyx_L1_error) + + /* "asyncpg/protocol/protocol.pyx":785 + * +@@ -84782,7 +84810,7 @@ + __pyx_tuple__115 = PyTuple_Pack(6, __pyx_n_s_mapping, __pyx_n_s_elems, __pyx_n_s_rec, __pyx_n_s_i, __pyx_n_s_desc, __pyx_n_s_elem); if (unlikely(!__pyx_tuple__115)) __PYX_ERR(0, 785, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__115); + __Pyx_GIVEREF(__pyx_tuple__115); +- __pyx_codeobj__116 = (PyObject*)__Pyx_PyCode_New(2, 0, 6, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__115, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_travis_build_MagicStack_as, __pyx_n_s_create_record, 785, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__116)) __PYX_ERR(0, 785, __pyx_L1_error) ++ __pyx_codeobj__116 = (PyObject*)__Pyx_PyCode_New(2, 0, 6, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__115, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_asyncpg_protocol_protocol_pyx, __pyx_n_s_create_record, 785, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__116)) __PYX_ERR(0, 785, __pyx_L1_error) + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; +@@ -87076,7 +87104,7 @@ + if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_3) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + +- /* "hton.pxd":81 ++ /* "hton.pxd":84 + * + * + * cdef inline double unpack_double(const char* buf): # <<<<<<<<<<<<<<