mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-01-31 11:37:35 +00:00
39bf41f4eb
- 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
134 lines
4.6 KiB
C
134 lines
4.6 KiB
C
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:4;tab-width:8;coding:utf-8 -*-│
|
|
│vi: set net ft=c ts=4 sts=4 sw=4 fenc=utf-8 :vi│
|
|
╞══════════════════════════════════════════════════════════════════════════════╡
|
|
│ Python 3 │
|
|
│ https://docs.python.org/3/license.html │
|
|
╚─────────────────────────────────────────────────────────────────────────────*/
|
|
#include "libc/calls/calls.h"
|
|
#include "libc/dce.h"
|
|
#include "libc/log/log.h"
|
|
#include "libc/runtime/runtime.h"
|
|
#include "libc/testlib/testlib.h"
|
|
#include "libc/x/x.h"
|
|
#include "third_party/python/Include/abstract.h"
|
|
#include "third_party/python/Include/bytesobject.h"
|
|
#include "third_party/python/Include/ceval.h"
|
|
#include "third_party/python/Include/codecs.h"
|
|
#include "third_party/python/Include/dictobject.h"
|
|
#include "third_party/python/Include/fileobject.h"
|
|
#include "third_party/python/Include/frameobject.h"
|
|
#include "third_party/python/Include/grammar.h"
|
|
#include "third_party/python/Include/import.h"
|
|
#include "third_party/python/Include/modsupport.h"
|
|
#include "third_party/python/Include/object.h"
|
|
#include "third_party/python/Include/objimpl.h"
|
|
#include "third_party/python/Include/pydebug.h"
|
|
#include "third_party/python/Include/pylifecycle.h"
|
|
#include "third_party/python/Include/pymem.h"
|
|
#include "third_party/python/Include/pystate.h"
|
|
#include "third_party/python/Include/pythonrun.h"
|
|
#include "third_party/python/Include/pytime.h"
|
|
#include "third_party/python/Include/sysmodule.h"
|
|
#include "third_party/python/Include/unicodeobject.h"
|
|
#include "third_party/python/Include/warnings.h"
|
|
#include "third_party/python/Include/yoink.h"
|
|
/* clang-format off */
|
|
|
|
#define USE_COSMO_CRASH MODE_DBG + 0
|
|
|
|
STATIC_YOINK("zip_uri_support");
|
|
PYTHON_YOINK("_bootlocale");
|
|
PYTHON_YOINK("_locale");
|
|
PYTHON_YOINK("encodings.aliases");
|
|
PYTHON_YOINK("encodings.latin_1");
|
|
PYTHON_YOINK("encodings.utf_8");
|
|
PYTHON_YOINK("launchpy");
|
|
|
|
extern char kLaunchPythonModuleName[]; /* generated by pyobj.com */
|
|
const struct _frozen *PyImport_FrozenModules = _PyImport_FrozenModules;
|
|
struct _inittab *PyImport_Inittab = _PyImport_Inittab;
|
|
|
|
int
|
|
LaunchPythonModule(const char *name)
|
|
{
|
|
PyObject *mod, *runpy, *runmodule, *runargs, *result;
|
|
if (!(runpy = PyImport_ImportModule("launchpy"))) {
|
|
PyErr_Print();
|
|
return 123;
|
|
}
|
|
if (!(runmodule = PyObject_GetAttrString(runpy, "run_module_as_main"))) {
|
|
PyErr_Print();
|
|
Py_DECREF(runpy);
|
|
return 122;
|
|
}
|
|
if (!(mod = PyUnicode_DecodeUTF8(name, strlen(name), 0))) {
|
|
PyErr_Print();
|
|
Py_DECREF(runpy);
|
|
Py_DECREF(runmodule);
|
|
return 121;
|
|
}
|
|
if (!(runargs = Py_BuildValue("(O)", mod))) {
|
|
PyErr_Print();
|
|
Py_DECREF(runpy);
|
|
Py_DECREF(runmodule);
|
|
Py_DECREF(mod);
|
|
return 119;
|
|
}
|
|
if (!(result = PyObject_Call(runmodule, runargs, NULL))) {
|
|
PyErr_Print();
|
|
}
|
|
Py_DECREF(runpy);
|
|
Py_DECREF(runmodule);
|
|
Py_DECREF(mod);
|
|
Py_DECREF(runargs);
|
|
if (!result) return 118;
|
|
Py_DECREF(result);
|
|
return 0;
|
|
}
|
|
|
|
#if USE_COSMO_CRASH
|
|
void
|
|
ShowCrashReportHook(int err, int fd, int sig,
|
|
struct siginfo *si, ucontext_t *ctx)
|
|
{
|
|
PyObject *str;
|
|
PyFrameObject *frame;
|
|
dprintf(2, "\nCalamity Occurred w/ Python\n");
|
|
for (frame = PyEval_GetFrame(); frame; frame = frame->f_back) {
|
|
str = PyUnicode_AsUTF8String(frame->f_code->co_filename);
|
|
dprintf(2, "%s:%d\n", PyBytes_AS_STRING(str), frame->f_code->co_firstlineno/* frame->f_lineno */);
|
|
Py_DECREF(str);
|
|
}
|
|
}
|
|
#endif
|
|
|
|
int
|
|
main(int argc, char *argv[])
|
|
{
|
|
size_t n;
|
|
int i, sts;
|
|
wchar_t *w;
|
|
PyObject *a, *s;
|
|
#if USE_COSMO_CRASH
|
|
ShowCrashReports();
|
|
#endif
|
|
Py_FrozenFlag++;
|
|
Py_NoSiteFlag++;
|
|
/* Py_VerboseFlag++; */
|
|
Py_NoUserSiteDirectory++;
|
|
Py_IgnoreEnvironmentFlag++;
|
|
Py_DontWriteBytecodeFlag++;
|
|
Py_Initialize();
|
|
Py_LimitedPath();
|
|
if (!(a = PyList_New(argc))) return 127;
|
|
for (i = 0; i < argc; ++i) {
|
|
if (!(w = utf8toutf32(argv[i], -1, &n))) return 126;
|
|
if (!(s = PyUnicode_FromWideChar(w, n))) return 125;
|
|
PyList_SetItem(a, i, s);
|
|
free(w);
|
|
}
|
|
if (PySys_SetObject("argv", a)) return 124;
|
|
sts = LaunchPythonModule(kLaunchPythonModuleName);
|
|
Py_Finalize();
|
|
return sts;
|
|
}
|