Mercurial > cpython-lru_cache-weakref
view Python/mysnprintf.c @ 20491:149a65fa427c legacy-trunk
Fix computation of stack depth for classdef and closures.
Also minor tweaks to internal routines.
Use PyCF_MASK instead of explicit list of flags.
For the MAKE_CLOSURE opcode, the number of items popped off the stack
depends on both the oparg and the number of free variables for the
code object. Fix the code so it accounts for the free variables.
In com_classdef(), record an extra pop to account for the STORE call
after the BUILD_CLASS.
Get rid of some commented out debugging code in com_push() and
com_pop().
Factor string resize logic into helper routine com_check_size().
In com_addbyte(), remove redudant if statement after assert. (They
test the same condition.)
In several routines, use string macros instead of string functions.
| author | Jeremy Hylton <jeremy@alum.mit.edu> |
|---|---|
| date | Wed, 17 Oct 2001 13:22:22 +0000 |
| parents | 2bc648932d44 |
| children | 6b6a9cae256e |
line wrap: on
line source
#include "Python.h" /* snprintf() emulation for platforms which don't have it (yet). Return value The number of characters printed (not including the trailing `\0' used to end output to strings) or a negative number in case of an error. PyOS_snprintf and PyOS_vsnprintf do not write more than size bytes (including the trailing '\0'). If the output would have been truncated, they return the number of characters (excluding the trailing '\0') which would have been written to the final string if enough space had been available. This is inline with the C99 standard. */ #include <ctype.h> #ifndef HAVE_SNPRINTF static int myvsnprintf(char *str, size_t size, const char *format, va_list va) { char *buffer = PyMem_Malloc(size + 512); int len; if (buffer == NULL) return -1; len = vsprintf(buffer, format, va); if (len < 0) { PyMem_Free(buffer); return len; } len++; assert(len >= 0); if ((size_t)len > size + 512) Py_FatalError("Buffer overflow in PyOS_snprintf/PyOS_vsnprintf"); if ((size_t)len > size) { PyMem_Free(buffer); return len - 1; } memcpy(str, buffer, len); PyMem_Free(buffer); return len - 1; } int PyOS_snprintf(char *str, size_t size, const char *format, ...) { int rc; va_list va; va_start(va, format); rc = myvsnprintf(str, size, format, va); va_end(va); return rc; } int PyOS_vsnprintf(char *str, size_t size, const char *format, va_list va) { return myvsnprintf(str, size, format, va); } #else /* Make sure that a C API is included in the lib */ #ifdef PyOS_snprintf # undef PyOS_snprintf #endif int PyOS_snprintf(char *str, size_t size, const char *format, ...) { int rc; va_list va; va_start(va, format); rc = vsnprintf(str, size, format, va); va_end(va); return rc; } #ifdef PyOS_vsnprintf # undef PyOS_vsnprintf #endif int PyOS_vsnprintf(char *str, size_t size, const char *format, va_list va) { return vsnprintf(str, size, format, va); } #endif
