Make numerous improvements

- Python static hello world now 1.8mb
- Python static fully loaded now 10mb
- Python HTTPS client now uses MbedTLS
- Python REPL now completes import stmts
- Increase stack size for Python for now
- Begin synthesizing posixpath and ntpath
- Restore Python \N{UNICODE NAME} support
- Restore Python NFKD symbol normalization
- Add optimized code path for Intel SHA-NI
- Get more Python unit tests passing faster
- Get Python help() pagination working on NT
- Python hashlib now supports MbedTLS PBKDF2
- Make memcpy/memmove/memcmp/bcmp/etc. faster
- Add Mersenne Twister and Vigna to LIBC_RAND
- Provide privileged __printf() for error code
- Fix zipos opendir() so that it reports ENOTDIR
- Add basic chmod() implementation for Windows NT
- Add Cosmo's best functions to Python cosmo module
- Pin function trace indent depth to that of caller
- Show memory diagram on invalid access in MODE=dbg
- Differentiate stack overflow on crash in MODE=dbg
- Add stb_truetype and tools for analyzing font files
- Upgrade to UNICODE 13 and reduce its binary footprint
- COMPILE.COM now logs resource usage of build commands
- Start implementing basic poll() support on bare metal
- Set getauxval(AT_EXECFN) to GetModuleFileName() on NT
- Add descriptions to strerror() in non-TINY build modes
- Add COUNTBRANCH() macro to help with micro-optimizations
- Make error / backtrace / asan / memory code more unbreakable
- Add fast perfect C implementation of μ-Law and a-Law audio codecs
- Make strtol() functions consistent with other libc implementations
- Improve Linenoise implementation (see also github.com/jart/bestline)
- COMPILE.COM now suppresses stdout/stderr of successful build commands
This commit is contained in:
Justine Tunney 2021-09-27 22:58:51 -07:00
parent fa7b4f5bd1
commit 39bf41f4eb
806 changed files with 77494 additions and 63859 deletions

View file

@ -14,7 +14,6 @@ PyObject *PyObject_Call(PyObject *callable_object, PyObject *args,
#ifndef Py_LIMITED_API
PyObject *_PyStack_AsTuple(PyObject **stack, Py_ssize_t nargs);
PyObject *_PyStack_AsDict(PyObject **values, PyObject *kwnames);
int _PyStack_UnpackDict(PyObject **args, Py_ssize_t nargs, PyObject *kwargs,

View file

@ -124,6 +124,7 @@ const char * PyEval_GetFuncDesc(PyObject *);
PyObject * PyEval_GetCallStats(PyObject *);
PyObject * PyEval_EvalFrame(struct _frame *);
PyObject * PyEval_EvalFrameEx(struct _frame *f, int exc);
#define PyEval_EvalFrameEx(fr,st) PyThreadState_GET()->interp->eval_frame(fr,st)
#ifndef Py_LIMITED_API
PyObject * _PyEval_EvalFrameDefault(struct _frame *f, int exc);
#endif

29
third_party/python/Include/ezprint.h vendored Normal file
View file

@ -0,0 +1,29 @@
#ifndef COSMOPOLITAN_THIRD_PARTY_PYTHON_INCLUDE_EZPRINT_H_
#define COSMOPOLITAN_THIRD_PARTY_PYTHON_INCLUDE_EZPRINT_H_
#include "libc/calls/calls.h"
#include "third_party/python/Include/bytesobject.h"
#include "third_party/python/Include/pyerrors.h"
#include "third_party/python/Include/unicodeobject.h"
#if !(__ASSEMBLER__ + __LINKER__ + 0)
COSMOPOLITAN_C_START_
static void EzPrint(PyObject *x, const char *s) {
PyObject *u;
if (!s) {
dprintf(2, "%s = NULL\n", s);
} else if (PyBytes_Check(x)) {
dprintf(2, "%s = b%`'.*s\n", s, PyBytes_GET_SIZE(x), PyBytes_AS_STRING(x));
} else if ((u = PyUnicode_AsUTF8String(x))) {
dprintf(2, "%s = u%`'.*s\n", s, PyBytes_GET_SIZE(u), PyBytes_AS_STRING(u));
Py_DECREF(u);
} else {
PyErr_Clear();
dprintf(2, "%s = !!!\n", s);
}
}
#define EZPRINT(x) EzPrint(x, #x)
COSMOPOLITAN_C_END_
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
#endif /* COSMOPOLITAN_THIRD_PARTY_PYTHON_INCLUDE_EZPRINT_H_ */

View file

@ -61,6 +61,7 @@ typedef long stwodigits; /* signed variant of twodigits */
#else
#error "PYLONG_BITS_IN_DIGIT should be 15 or 30"
#endif
#define PyLong_BASE ((digit)1 << PyLong_SHIFT)
#define PyLong_MASK ((digit)(PyLong_BASE - 1))

View file

@ -790,7 +790,7 @@ void _Py_Dealloc(PyObject *);
do { \
PyObject *_py_decref_tmp = (PyObject *)(op); \
if (_Py_DEC_REFTOTAL _Py_REF_DEBUG_COMMA \
--(_py_decref_tmp)->ob_refcnt != 0) \
--(_py_decref_tmp)->ob_refcnt != 0) \
_Py_CHECK_REFCNT(_py_decref_tmp) \
else \
_Py_Dealloc(_py_decref_tmp); \

View file

@ -9,12 +9,12 @@
COSMOPOLITAN_C_START_
/* clang-format off */
void * PyObject_Malloc(size_t size);
void * PyObject_Malloc(size_t);
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000
void * PyObject_Calloc(size_t nelem, size_t elsize);
void * PyObject_Calloc(size_t, size_t);
#endif
void * PyObject_Realloc(void *ptr, size_t new_size);
void PyObject_Free(void *ptr);
void * PyObject_Realloc(void *, size_t);
void PyObject_Free(void *);
#ifndef Py_LIMITED_API
/* This function returns the number of allocated memory blocks, regardless of size */
@ -24,7 +24,7 @@ Py_ssize_t _Py_GetAllocatedBlocks(void);
/* Macros */
#ifdef WITH_PYMALLOC
#ifndef Py_LIMITED_API
void _PyObject_DebugMallocStats(FILE *out);
void _PyObject_DebugMallocStats(FILE *);
#endif /* #ifndef Py_LIMITED_API */
#endif
@ -43,8 +43,7 @@ void _PyObject_DebugMallocStats(FILE *out);
/* Functions */
PyObject * PyObject_Init(PyObject *, PyTypeObject *);
PyVarObject * PyObject_InitVar(PyVarObject *,
PyTypeObject *, Py_ssize_t);
PyVarObject * PyObject_InitVar(PyVarObject *, PyTypeObject *, Py_ssize_t);
PyObject * _PyObject_New(PyTypeObject *);
PyVarObject * _PyObject_NewVar(PyTypeObject *, Py_ssize_t);
@ -243,8 +242,11 @@ extern PyGC_Head *_PyGC_generation0;
#endif /* Py_LIMITED_API */
#ifndef Py_LIMITED_API
PyObject * _PyObject_GC_Malloc(size_t size);
PyObject * _PyObject_GC_Calloc(size_t size);
PyObject * _PyObject_GC_Alloc(int, size_t);
PyObject * _PyObject_GC_Malloc(size_t);
PyObject * _PyObject_GC_Calloc(size_t);
#define _PyObject_GC_Malloc(sz) _PyObject_GC_Alloc(0, sz)
#define _PyObject_GC_Callac(sz) _PyObject_GC_Alloc(1, sz)
#endif /* !Py_LIMITED_API */
PyObject * _PyObject_GC_New(PyTypeObject *);
PyVarObject * _PyObject_GC_NewVar(PyTypeObject *, Py_ssize_t);
@ -257,6 +259,12 @@ void PyObject_GC_Del(void *);
#define PyObject_GC_NewVar(type, typeobj, n) \
( (type *) _PyObject_GC_NewVar((typeobj), (n)) )
#define PyObject_GC_UnTrack(ARG) do { \
void *opArg = (ARG); \
if (_PyGC_REFS(opArg) != _PyGC_REFS_UNTRACKED) { \
_PyObject_GC_UNTRACK(opArg); \
} \
} while (0)
/* Utility macro to help write tp_traverse functions.
* To use this macro, the tp_traverse function must name its arguments

View file

@ -1,6 +1,5 @@
#ifndef Py_ATOMIC_H
#define Py_ATOMIC_H
#ifdef Py_BUILD_CORE
#include "libc/assert.h"
#include "third_party/python/Include/dynamic_annotations.h"
#include "third_party/python/pyconfig.h"
@ -242,5 +241,4 @@ _Py_ANNOTATE_MEMORY_ORDER(const volatile void *address, _Py_memory_order order)
#define _Py_atomic_load_relaxed(ATOMIC_VAL) \
_Py_atomic_load_explicit(ATOMIC_VAL, _Py_memory_order_relaxed)
#endif /* Py_BUILD_CORE */
#endif /* Py_ATOMIC_H */

View file

@ -101,7 +101,7 @@ void PyErr_SetExcInfo(PyObject *, PyObject *, PyObject *);
#endif
/* Defined in Python/pylifecycle.c */
void Py_FatalError(const char *message) _Py_NO_RETURN;
void Py_FatalError(const char *message) relegated _Py_NO_RETURN;
#if defined(Py_DEBUG) || defined(Py_LIMITED_API)
#define _PyErr_OCCURRED() PyErr_Occurred()
@ -247,7 +247,7 @@ PyObject * PyErr_SetFromErrnoWithFilename(
PyObject *exc,
const char *filename /* decoded from the filesystem encoding */
);
#if defined(MS_WINDOWS) && !defined(Py_LIMITED_API)
#if !defined(Py_LIMITED_API)
PyObject * PyErr_SetFromErrnoWithUnicodeFilename(
PyObject *, const Py_UNICODE *);
#endif /* MS_WINDOWS */
@ -349,7 +349,6 @@ PyObject * _PyErr_TrySetFromCause(
);
#endif
/* In sigcheck.c or signalmodule.c */
int PyErr_CheckSignals(void);
void PyErr_SetInterrupt(void);
@ -477,20 +476,6 @@ int PyUnicodeTranslateError_SetReason(
const char *reason /* UTF-8 encoded string */
);
/* These APIs aren't really part of the error implementation, but
often needed to format error messages; the native C lib APIs are
not available on all platforms, which is why we provide emulations
for those platforms in Python/mysnprintf.c,
WARNING: The return value of snprintf varies across platforms; do
not rely on any particular behavior; eventually the C99 defn may
be reliable.
*/
#if defined(MS_WIN32) && !defined(HAVE_SNPRINTF)
# define HAVE_SNPRINTF
# define snprintf _snprintf
# define vsnprintf _vsnprintf
#endif
int PyOS_snprintf(char *str, size_t size, const char *format, ...)
Py_GCC_ATTRIBUTE((format(printf, 3, 4)));
int PyOS_vsnprintf(char *str, size_t size, const char *format, va_list va)

View file

@ -206,6 +206,9 @@ PyThreadState * PyThreadState_Get(void);
/* Similar to PyThreadState_Get(), but don't issue a fatal error
* if it is NULL. */
PyThreadState * _PyThreadState_UncheckedGet(void);
#define _PyThreadState_UncheckedGet() \
((PyThreadState *)_Py_atomic_load_relaxed(&_PyThreadState_Current))
#endif /* !Py_LIMITED_API */
PyThreadState * PyThreadState_Swap(PyThreadState *);

View file

@ -37,7 +37,7 @@ extern PyTypeObject PyTupleIter_Type;
PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_TUPLE_SUBCLASS)
#define PyTuple_CheckExact(op) (Py_TYPE(op) == &PyTuple_Type)
PyObject * PyTuple_New(Py_ssize_t size);
PyObject * PyTuple_New(Py_ssize_t);
Py_ssize_t PyTuple_Size(PyObject *);
PyObject * PyTuple_GetItem(PyObject *, Py_ssize_t);
int PyTuple_SetItem(PyObject *, Py_ssize_t, PyObject *);
@ -45,7 +45,7 @@ PyObject * PyTuple_GetSlice(PyObject *, Py_ssize_t, Py_ssize_t);
#ifndef Py_LIMITED_API
int _PyTuple_Resize(PyObject **, Py_ssize_t);
#endif
PyObject * PyTuple_Pack(Py_ssize_t, ...);
PyObject *PyTuple_Pack(Py_ssize_t, ...);
#ifndef Py_LIMITED_API
void _PyTuple_MaybeUntrack(PyObject *);
#endif

View file

@ -118,7 +118,7 @@ typedef uint8_t Py_UCS1;
#define Py_UNICODE_MATCH(string, offset, substring) \
((*((string)->wstr + (offset)) == *((substring)->wstr)) && \
((*((string)->wstr + (offset) + (substring)->wstr_length-1) == *((substring)->wstr + (substring)->wstr_length-1))) && \
!memcmp((string)->wstr + (offset), (substring)->wstr, (substring)->wstr_length*sizeof(Py_UNICODE)))
!bcmp((string)->wstr + (offset), (substring)->wstr, (substring)->wstr_length*sizeof(Py_UNICODE)))
#endif /* Py_LIMITED_API */