mirror of
https://github.com/python/cpython.git
synced 2025-08-30 13:38:43 +00:00
bpo-47162: Add call trampoline to mitigate bad fpcasts on Emscripten (GH-32189)
This commit is contained in:
parent
795c00b91c
commit
581c4434de
8 changed files with 99 additions and 18 deletions
|
@ -527,7 +527,7 @@ import_find_extension(PyThreadState *tstate, PyObject *name,
|
|||
else {
|
||||
if (def->m_base.m_init == NULL)
|
||||
return NULL;
|
||||
mod = def->m_base.m_init();
|
||||
mod = _PyImport_InitFunc_TrampolineCall(def->m_base.m_init);
|
||||
if (mod == NULL)
|
||||
return NULL;
|
||||
if (PyObject_SetItem(modules, name, mod) == -1) {
|
||||
|
@ -958,6 +958,13 @@ PyImport_GetImporter(PyObject *path)
|
|||
return get_path_importer(tstate, path_importer_cache, path_hooks, path);
|
||||
}
|
||||
|
||||
#if defined(__EMSCRIPTEN__) && defined(PY_CALL_TRAMPOLINE)
|
||||
#include <emscripten.h>
|
||||
EM_JS(PyObject*, _PyImport_InitFunc_TrampolineCall, (PyModInitFunction func), {
|
||||
return wasmTable.get(func)();
|
||||
});
|
||||
#endif // __EMSCRIPTEN__ && PY_CALL_TRAMPOLINE
|
||||
|
||||
static PyObject*
|
||||
create_builtin(PyThreadState *tstate, PyObject *name, PyObject *spec)
|
||||
{
|
||||
|
@ -973,8 +980,7 @@ create_builtin(PyThreadState *tstate, PyObject *name, PyObject *spec)
|
|||
/* Cannot re-init internal module ("sys" or "builtins") */
|
||||
return PyImport_AddModuleObject(name);
|
||||
}
|
||||
|
||||
mod = (*p->initfunc)();
|
||||
mod = _PyImport_InitFunc_TrampolineCall(*p->initfunc);
|
||||
if (mod == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
@ -102,7 +102,7 @@ _PyImport_LoadDynamicModuleWithSpec(PyObject *spec, FILE *fp)
|
|||
const char *oldcontext;
|
||||
dl_funcptr exportfunc;
|
||||
PyModuleDef *def;
|
||||
PyObject *(*p0)(void);
|
||||
PyModInitFunction p0;
|
||||
|
||||
name_unicode = PyObject_GetAttrString(spec, "name");
|
||||
if (name_unicode == NULL) {
|
||||
|
@ -157,7 +157,7 @@ _PyImport_LoadDynamicModuleWithSpec(PyObject *spec, FILE *fp)
|
|||
goto error;
|
||||
}
|
||||
|
||||
p0 = (PyObject *(*)(void))exportfunc;
|
||||
p0 = (PyModInitFunction)exportfunc;
|
||||
|
||||
/* Package context is needed for single-phase init */
|
||||
oldcontext = _Py_PackageContext;
|
||||
|
@ -166,7 +166,7 @@ _PyImport_LoadDynamicModuleWithSpec(PyObject *spec, FILE *fp)
|
|||
_Py_PackageContext = oldcontext;
|
||||
goto error;
|
||||
}
|
||||
m = p0();
|
||||
m = _PyImport_InitFunc_TrampolineCall(p0);
|
||||
_Py_PackageContext = oldcontext;
|
||||
|
||||
if (m == NULL) {
|
||||
|
|
|
@ -10,6 +10,14 @@ extern const char *_PyImport_DynLoadFiletab[];
|
|||
|
||||
extern PyObject *_PyImport_LoadDynamicModuleWithSpec(PyObject *spec, FILE *);
|
||||
|
||||
typedef PyObject *(*PyModInitFunction)(void);
|
||||
|
||||
#if defined(__EMSCRIPTEN__) && defined(PY_CALL_TRAMPOLINE)
|
||||
extern PyObject *_PyImport_InitFunc_TrampolineCall(PyModInitFunction func);
|
||||
#else
|
||||
#define _PyImport_InitFunc_TrampolineCall(func) (func)()
|
||||
#endif
|
||||
|
||||
/* Max length of module suffix searched for -- accommodates "module.slb" */
|
||||
#define MAXSUFFIXSIZE 12
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue