Mercurial > hg
view mercurial/bitmanipulation.h @ 51891:ad83e4f9b40e
typing: correct pytype mistakes in `mercurial/vfs.py`
With the previous changes in this series (prior to merging the *.pyi file), this
wasn't too bad- the only definitively wrong things were the `data` argument to
`writelines()`, and the return type on `backgroundclosing()` (both of these
errors were dropped in the previous commit; for some reason pytype doesn't like
`contextlib._GeneratorContextManager`, even though that's what it determined it
is):
File "/mnt/c/Users/Matt/hg/mercurial/vfs.py", line 411, in abstractvfs:
Bad return type 'contextlib._GeneratorContextManager' for generator function abstractvfs.backgroundclosing [bad-yield-annotation]
Expected Generator, Iterable or Iterator
PyCharm thinks this is `Generator[backgroundfilecloser], Any, None]`, which can
be reduced to `Iterator[backgroundfilecloser]`, but pytype flagged the line that
calls `yield` without an argument unless it's also `Optional`. PyCharm is happy
either way. For some reason, `Iterable` didn't work for pytype:
File "/mnt/c/Users/Matt/hg/mercurial/vfs.py", line 390, in abstractvfs:
Function contextlib.contextmanager was called with the wrong arguments [wrong-arg-types]
Expected: (func: Callable[[Any], Iterator])
Actually passed: (func: Callable[[Any, Any, Any], Iterable[Optional[Any]]])
Attributes of protocol Iterator[_T_co] are not implemented on Iterable[Optional[Any]]: __next__
author | Matt Harbison <matt_harbison@yahoo.com> |
---|---|
date | Fri, 20 Sep 2024 16:36:28 -0400 |
parents | d86908050375 |
children |
line wrap: on
line source
#ifndef HG_BITMANIPULATION_H #define HG_BITMANIPULATION_H #include <string.h> #include "compat.h" /* Reads a 64 bit integer from big-endian bytes. Assumes that the data is long enough */ static inline uint64_t getbe64(const char *c) { const unsigned char *d = (const unsigned char *)c; return ((((uint64_t)d[0]) << 56) | (((uint64_t)d[1]) << 48) | (((uint64_t)d[2]) << 40) | (((uint64_t)d[3]) << 32) | (((uint64_t)d[4]) << 24) | (((uint64_t)d[5]) << 16) | (((uint64_t)d[6]) << 8) | (d[7])); } static inline uint32_t getbe32(const char *c) { const unsigned char *d = (const unsigned char *)c; return ((((uint32_t)d[0]) << 24) | (((uint32_t)d[1]) << 16) | (((uint32_t)d[2]) << 8) | (d[3])); } static inline int16_t getbeint16(const char *c) { const unsigned char *d = (const unsigned char *)c; return ((d[0] << 8) | (d[1])); } static inline uint16_t getbeuint16(const char *c) { const unsigned char *d = (const unsigned char *)c; return ((d[0] << 8) | (d[1])); } /* Writes a 64 bit integer to bytes in a big-endian format. Assumes that the buffer is long enough */ static inline void putbe64(uint64_t x, char *c) { c[0] = (x >> 56) & 0xff; c[1] = (x >> 48) & 0xff; c[2] = (x >> 40) & 0xff; c[3] = (x >> 32) & 0xff; c[4] = (x >> 24) & 0xff; c[5] = (x >> 16) & 0xff; c[6] = (x >> 8) & 0xff; c[7] = (x)&0xff; } static inline void putbe32(uint32_t x, char *c) { c[0] = (x >> 24) & 0xff; c[1] = (x >> 16) & 0xff; c[2] = (x >> 8) & 0xff; c[3] = (x)&0xff; } static inline double getbefloat64(const char *c) { const unsigned char *d = (const unsigned char *)c; double ret; int i; uint64_t t = 0; for (i = 0; i < 8; i++) { t = (t << 8) + d[i]; } memcpy(&ret, &t, sizeof(t)); return ret; } #endif