Hi,

2015-05-13 4:42 GMT+02:00 Yicong Huang <hengha....@gmail.com>:

> However, the code is quite slow for reasons:
> 1. Pypy treats the same function call for a new function every time. It
> took time to do parsing, analysing and such a lot of work.
> 2. JIT could not give any benifits for the single function call.
>

As said in the docs, the trick is to call pypy_execute_source once, and
make it return a set of C function pointers.

Here is how I would do it:

- in a file "interface.py"

    import cffi

    ffi = cffi.FFI()
    ffi.cdef('''
    struct API {
        double (*add_numbers)(double x, double y);
    };
    ''')

    # Better define callbacks at module scope, it's important to keep this
object alive.
    @ffi.callback("double (double, double)")
    def add_numbers(x, y):
        return x + y

    def fill_api(ptr):
        api = ffi.cast("struct API*", ptr)
        api.add_numbers = add_numbers


- From C code:

    struct API {
        double (*add_numbers)(double x, double y);
    };

    API api;
    const char source[] = "import interface;
interface.fill_api(c_argument)";
    res = pypy_execute_source_ptr(source, &api);

    // Now call this in a loop:
    api.add_numbers(12, 13);


-- 
Amaury Forgeot d'Arc
_______________________________________________
pypy-dev mailing list
pypy-dev@python.org
https://mail.python.org/mailman/listinfo/pypy-dev

Reply via email to