# HG changeset patch # User Franz Glasner # Date 1741964968 -3600 # Node ID e18b5861868b2a35cfb954ae74c5da2ecd4cd1c1 # Parent 13e07e75c1110c9c5c1b07a3fc2cb9d83bffea6a Compilation of all current FLAVORS of pypy3 works for 7.3.19. BUGS: Not yet tested. diff -r 13e07e75c111 -r e18b5861868b uwsginl-plugin-lang-pypy3/Makefile --- a/uwsginl-plugin-lang-pypy3/Makefile Fri Mar 14 14:45:38 2025 +0100 +++ b/uwsginl-plugin-lang-pypy3/Makefile Fri Mar 14 16:09:28 2025 +0100 @@ -19,7 +19,7 @@ LICENSE_FILE= ${WRKSRC}/LICENSE LICENSE_PERMS= dist-mirror dist-sell pkg-mirror pkg-sell auto-accept -FLAVORS= pypy3 pypy39 pypy310 +FLAVORS= pypy3 pypy310 pypy311 FLAVOR?= pypy3 BUILD_DEPENDS+= ${UWSGI_NAME}==${PORTVERSION}:www/uwsginl @@ -42,18 +42,18 @@ PYPY_EXECUTABLE= pypy3.10 PYPY_LDLIBRARY= libpypy3.10-c.so PYPY_LIBDIR= lib/pypy3.10 -.elif ${FLAVOR} == pypy39 -PLUGIN_NAME= pypy39 -PYPY_PACKAGE= pypy39 -PYPY_EXECUTABLE= pypy3.9 -PYPY_LDLIBRARY= libpypy3.9-c.so -PYPY_LIBDIR= lib/pypy3.9 .elif ${FLAVOR} == pypy310 PLUGIN_NAME= pypy310 PYPY_PACKAGE= pypy310 PYPY_EXECUTABLE= pypy3.10 PYPY_LDLIBRARY= libpypy3.10-c.so PYPY_LIBDIR= lib/pypy3.10 +.elif ${FLAVOR} == pypy311 +PLUGIN_NAME= pypy311 +PYPY_PACKAGE= pypy311 +PYPY_EXECUTABLE= pypy3.11 +PYPY_LDLIBRARY= libpypy3.11-c.so +PYPY_LIBDIR= lib/pypy3.11 .endif CFLAGS+= -DPYPY_LDLIBRARY="${PYPY_LDLIBRARY}" -DPYPY_LIBDIR="${PYPY_LIBDIR}" -DPYPY_PLUGIN_NAME="${PLUGIN_NAME}" diff -r 13e07e75c111 -r e18b5861868b uwsginl-plugin-lang-pypy3/files/extra/patch-plugins_pypy_pypy__plugin.c --- a/uwsginl-plugin-lang-pypy3/files/extra/patch-plugins_pypy_pypy__plugin.c Fri Mar 14 14:45:38 2025 +0100 +++ b/uwsginl-plugin-lang-pypy3/files/extra/patch-plugins_pypy_pypy__plugin.c Fri Mar 14 16:09:28 2025 +0100 @@ -1,4 +1,4 @@ ---- plugins/pypy/pypy_plugin.c.orig 2022-09-21 14:46:45 UTC +--- plugins/pypy/pypy_plugin.c.orig 2024-10-26 09:39:02 UTC +++ plugins/pypy/pypy_plugin.c @@ -9,6 +9,24 @@ @@ -25,7 +25,7 @@ struct uwsgi_pypy { void *handler; char *lib; -@@ -42,9 +60,10 @@ void (*uwsgi_pypy_hook_paste_loader)(char *); +@@ -42,9 +60,10 @@ void (*uwsgi_pypy_post_fork_hook)(void); void (*uwsgi_pypy_hook_pythonpath)(char *); void (*uwsgi_pypy_hook_request)(void *, int); void (*uwsgi_pypy_post_fork_hook)(void); diff -r 13e07e75c111 -r e18b5861868b uwsginl-plugin-lang-pypy3/files/extra/patch-plugins_pypy_pypy__setup.py --- a/uwsginl-plugin-lang-pypy3/files/extra/patch-plugins_pypy_pypy__setup.py Fri Mar 14 14:45:38 2025 +0100 +++ b/uwsginl-plugin-lang-pypy3/files/extra/patch-plugins_pypy_pypy__setup.py Fri Mar 14 16:09:28 2025 +0100 @@ -1,36 +1,19 @@ ---- plugins/pypy/pypy_setup.py.orig 2022-09-21 14:46:45 UTC +--- plugins/pypy/pypy_setup.py.orig 2024-10-26 09:39:02 UTC +++ plugins/pypy/pypy_setup.py -@@ -31,8 +31,15 @@ extern void (*uwsgi_pypy_hook_paste_loader)(char *); +@@ -31,6 +31,7 @@ extern void (*uwsgi_pypy_post_fork_hook)(void); extern void (*uwsgi_pypy_hook_pythonpath)(char *); extern void (*uwsgi_pypy_hook_request)(struct wsgi_request *); extern void (*uwsgi_pypy_post_fork_hook)(void); +extern void (*uwsgi_pypy_hook_atexit)(void); ''' -+ -+# Convert a byte string to a native string using the default encoding -+def n(b): -+ return b.decode() -+ -+ # here we load CFLAGS and uwsgi.h from the binary - defines0 = ''' - char *uwsgi_get_cflags(); -@@ -46,7 +53,7 @@ lib0 = ffi.verify(defines0) - # basically it build a list of #define from binary CFLAGS - uwsgi_cdef = [] - uwsgi_defines = [] --uwsgi_cflags = ffi.string(lib0.uwsgi_get_cflags()).split() -+uwsgi_cflags = n(ffi.string(lib0.uwsgi_get_cflags())).split() - for cflag in uwsgi_cflags: - if cflag.startswith('-D'): - line = cflag[2:] -@@ -57,8 +64,14 @@ for cflag in uwsgi_cflags: +@@ -57,8 +58,14 @@ for cflag in uwsgi_cflags: else: uwsgi_cdef.append('#define %s ...' % line) uwsgi_defines.append('#define %s 1' % line) -uwsgi_dot_h = ffi.string(lib0.uwsgi_get_dot_h()) -+uwsgi_dot_h = n(ffi.string(lib0.uwsgi_get_dot_h())) ++uwsgi_dot_h = ffi.string(lib0.uwsgi_get_dot_h()).decode() +# +# Replace #include on FreeBSD because it is found on a non-standard @@ -41,7 +24,7 @@ # uwsgi definitions cdefines = ''' %s -@@ -110,6 +123,8 @@ struct uwsgi_worker { +@@ -110,6 +117,8 @@ struct uwsgi_worker { uint64_t running_time; uint64_t avg_response_time; uint64_t tx; @@ -50,7 +33,7 @@ ...; }; -@@ -164,11 +179,14 @@ struct uwsgi_server { +@@ -164,11 +173,14 @@ struct uwsgi_server { struct wsgi_request *wsgi_req; struct uwsgi_plugin *p[]; @@ -59,60 +42,27 @@ + ...; }; - struct uwsgi_server uwsgi; + extern struct uwsgi_server uwsgi; --struct uwsgi_plugin pypy_plugin; -+struct uwsgi_plugin pypy3_plugin; +-extern struct uwsgi_plugin pypy_plugin; ++extern struct uwsgi_plugin pypy3_plugin; - const char *uwsgi_pypy_version; + extern const char *uwsgi_pypy_version; -@@ -269,7 +287,7 @@ const char *uwsgi_pypy_version = UWSGI_VERSION; +@@ -269,9 +281,9 @@ extern struct uwsgi_server uwsgi; %s extern struct uwsgi_server uwsgi; -extern struct uwsgi_plugin pypy_plugin; +extern struct uwsgi_plugin pypy3_plugin; %s - ''' % ('\n'.join(uwsgi_defines), uwsgi_dot_h, hooks) - -@@ -286,7 +304,7 @@ wsgi_application = None - - # fix argv if needed - if len(sys.argv) == 0: -- sys.argv.insert(0, ffi.string(lib.uwsgi_binary_path())) -+ sys.argv.insert(0, n(ffi.string(lib.uwsgi_binary_path()))) - +-''' % ('\n'.join(uwsgi_defines), uwsgi_dot_h.decode(), hooks) ++''' % ('\n'.join(uwsgi_defines), uwsgi_dot_h, hooks) - @ffi.callback("void(char *)") -@@ -305,7 +323,7 @@ def uwsgi_pypy_loader(module): - load a wsgi module - """ - global wsgi_application -- m = ffi.string(module) -+ m = n(ffi.string(module)) - c = 'application' - if ':' in m: - m, c = m.split(':') -@@ -322,7 +340,7 @@ def uwsgi_pypy_file_loader(filename): - load a mod_wsgi compliant .wsgi file - """ - global wsgi_application -- w = ffi.string(filename) -+ w = n(ffi.string(filename)) - c = 'application' - mod = imp.load_source('uwsgi_file_wsgi', w) - wsgi_application = getattr(mod, c) -@@ -334,7 +352,7 @@ def uwsgi_pypy_paste_loader(config): - load a .ini paste app - """ - global wsgi_application -- c = ffi.string(config) -+ c = n(ffi.string(config)) - if c.startswith('config:'): - c = c[7:] - if c[0] != '/': -@@ -358,12 +376,47 @@ def uwsgi_pypy_post_fork_hook(): - uwsgi.post_fork_hook() + ffi.cdef(cdefines) + lib = ffi.verify(cverify) +@@ -368,6 +380,41 @@ def uwsgi_pypy_pythonpath(item): + print("added %s to pythonpath" % path) +@ffi.callback("void()") @@ -150,23 +100,18 @@ + print("!!! atexit._run_exitfuncs() not found !!!") + + - @ffi.callback("void(char *)") - def uwsgi_pypy_pythonpath(item): - """ - add an item to the pythonpath + class WSGIfilewrapper(object): """ -- path = ffi.string(item) -+ path = n(ffi.string(item)) - sys.path.append(path) - print("added %s to pythonpath" % path) - -@@ -470,15 +523,17 @@ def uwsgi_pypy_wsgi_handler(wsgi_req): + class implementing wsgi.file_wrapper +@@ -470,17 +517,17 @@ def uwsgi_pypy_wsgi_handler(wsgi_req): def start_response(status, headers, exc_info=None): if exc_info: traceback.print_exception(*exc_info) +- status = status.encode() + status = status.encode("latin1") lib.uwsgi_response_prepare_headers(wsgi_req, ffi.new("char[]", status), len(status)) for hh in headers: +- hh = (hh[0].encode(), hh[1].encode()) + hh = (hh[0].encode("latin1"), hh[1].encode("latin1")) lib.uwsgi_response_add_header(wsgi_req, ffi.new("char[]", hh[0]), len(hh[0]), ffi.new("char[]", hh[1]), len(hh[1])) return writer @@ -174,12 +119,12 @@ environ = {} iov = wsgi_req.hvec for i in range(0, wsgi_req.var_cnt, 2): -- environ[ffi.string(ffi.cast("char*", iov[i].iov_base), iov[i].iov_len)] = ffi.string(ffi.cast("char*", iov[i+1].iov_base), iov[i+1].iov_len) +- environ[ffi.string(ffi.cast("char*", iov[i].iov_base), iov[i].iov_len).decode()] = ffi.string(ffi.cast("char*", iov[i+1].iov_base), iov[i+1].iov_len).decode() + environ[ffi.string(ffi.cast("char*", iov[i].iov_base), iov[i].iov_len).decode("latin1")] = ffi.string(ffi.cast("char*", iov[i+1].iov_base), iov[i+1].iov_len).decode("latin1") environ['wsgi.version'] = (1, 0) scheme = 'http' -@@ -523,6 +578,7 @@ lib.uwsgi_pypy_hook_paste_loader = uwsgi_pypy_paste_lo +@@ -525,6 +572,7 @@ lib.uwsgi_pypy_post_fork_hook = uwsgi_pypy_post_fork_h lib.uwsgi_pypy_hook_pythonpath = uwsgi_pypy_pythonpath lib.uwsgi_pypy_hook_request = uwsgi_pypy_wsgi_handler lib.uwsgi_pypy_post_fork_hook = uwsgi_pypy_post_fork_hook @@ -187,7 +132,7 @@ """ Here we define the "uwsgi" virtual module -@@ -537,7 +593,7 @@ uwsgi.hostname = ffi.string(lib.uwsgi.hostname) +@@ -539,7 +587,7 @@ def uwsgi_pypy_uwsgi_register_signal(signum, kind, han def uwsgi_pypy_uwsgi_register_signal(signum, kind, handler): cb = ffi.callback('void(int)', handler) uwsgi_gc.append(cb) @@ -196,7 +141,7 @@ raise Exception("unable to register signal %d" % signum) uwsgi.register_signal = uwsgi_pypy_uwsgi_register_signal -@@ -562,7 +618,7 @@ def uwsgi_pypy_uwsgi_register_rpc(name, func, argc=0): +@@ -564,7 +612,7 @@ def uwsgi_pypy_uwsgi_register_rpc(name, func, argc=0): rpc_func = uwsgi_pypy_RPC(func) cb = ffi.callback("int(int, char*[], int[], char**)", rpc_func) uwsgi_gc.append(cb) @@ -205,22 +150,11 @@ raise Exception("unable to register rpc func %s" % name) uwsgi.register_rpc = uwsgi_pypy_uwsgi_register_rpc -@@ -598,8 +654,8 @@ uwsgi.rpc = uwsgi_pypy_rpc - - def uwsgi_pypy_call(func, *args): - node = None -- if '@' in func: -- (func, node) = func.split('@') -+ if b'@' in func: -+ (func, node) = func.split(b'@') - return uwsgi_pypy_rpc(node, func, *args) - uwsgi.call = uwsgi_pypy_call - -@@ -1067,7 +1123,7 @@ def uwsgi_pypy_continulet_switch(wsgi_req): +@@ -1069,7 +1117,7 @@ def uwsgi_pypy_setup_continulets(): def uwsgi_pypy_setup_continulets(): -- if lib.uwsgi.async < 1: +- if lib.uwsgi["async"] < 1: + if getattr(lib.uwsgi, "async") < 1: raise Exception("pypy continulets require async mode !!!") lib.uwsgi.schedule_to_main = uwsgi_pypy_continulet_switch