Search code examples
pythoncpythonemscripten

Strange import error in Emscripten cross-compiled CPython


I am porting CPython to Emscripten, and it builds successfully. However, when I try to run the python.asm.js through Node.js, I get a very strange error inside the Py_InitializeEx(0) call:

Traceback (most recent call last):
  File "/lib/python2.7/site.py", line 62, in <module>
    import os
  File "/lib/python2.7/os.py", line 44, in <module>
    from posix import *
TypeError: 'NotImplementedType' object does not support indexing

The error is generated from PySequence_GetItem in Objects/abstract.c, but I don't understand how the execution gets there. If I do import posix before the line that causes the error, the import posix statement finish successfully, and I can call functions in the posix module. Thus, the error is related to from <module> import * line. How is PySequence_GetItem related to from <module> import * statement, and what could be the reasons for the error?

If you want to reproduce the problem, I released the code on GitHub


Solution

  • While investigating what is going wrong, I switched off the optimization (compiled and linked with -O0). The resulting JS executable also failed, but with a different error:

    Invalid function pointer '495' called with signature 'iii'. Perhaps this is
    an invalid value (e.g. caused by calling a virtual method on a NULL pointer)?
    Or calling a function with an incorrect type, which will fail? (it is worth
    building your source files with -Werror (warnings are errors), as warnings can
    indicate undefined behavior which can cause this)
    This pointer might make sense in another type signature:
      ii: _dict_keys  iiii: 0  i: undefined  iiiii: 0  viii: 0  vii: 0  vi: 0  v: 0
    495
    495
    

    I looked through Emscripten's settings.js for options related to function pointers, and found EMULATE_FUNCTION_POINTER_CASTS which fixed the problem.