bytedeco / javacpp-presets

The missing Java distribution of native C++ libraries
Other
2.65k stars 738 forks source link

CPython: PyString_Check,PyFloat_Check ... is not supported in cpython? #753

Open penetest opened 5 years ago

saudet commented 5 years ago

It doesn't seem to be part of the C API of Python 3, no.

saudet commented 5 years ago

You'll need to use PyUnicode_Check() instead of PyString_Check(): https://py3c.readthedocs.io/en/latest/reference.html But those are macros that are not currently mapped. Their definitions are pretty simple though: https://github.com/bytedeco/javacpp-presets/blob/master/cpython/src/gen/java/org/bytedeco/cpython/global/python.java#L5390 https://github.com/bytedeco/javacpp-presets/blob/master/cpython/src/gen/java/org/bytedeco/cpython/global/python.java#L8205

penetest commented 5 years ago

@saudet Hi,I try to using ‘PyUnicode_Check’,but not find this method. I hope your help.Thanks!

penetest commented 5 years ago

@saudet ,Hi,can I join you to fixed it, and I how to do it?

saudet commented 5 years ago

Yes, that would be great. This is what we need to do: https://github.com/bytedeco/javacpp/wiki/Mapping-Recipes#mapping-macros-to-fields-or-methods Let me know if you have any questions! Thanks

penetest commented 5 years ago

@saudet Hi,According to what you said,I try to do some revisions in cpython : add some codes:

 .put(new Info("Py_TYPE").cppTypes("PyTypeObject","PyObject"))
                .put(new Info("PyObject_TypeCheck").cppTypes("int","PyObject","PyTypeObject"))
                .put(new Info("PyFloat_Check").cppTypes("int","PyObject"))
                .put(new Info("PyFloat_CheckExact").cppTypes("int","PyObject"))

but show some errors when building :

In file included from /data/javacpp-presets/cpython/cppbuild/linux-x86_64/include/python3.7m/pytime.h:6:0,
                 from /data/javacpp-presets/cpython/cppbuild/linux-x86_64/include/python3.7m/Python.h:87,
                 from /data/javacpp-presets/cpython/target/native/org/bytedeco/cpython/linux-x86_64/jnipython.cpp:92:
/data/javacpp-presets/cpython/target/native/org/bytedeco/cpython/linux-x86_64/jnipython.cpp: In function '_jobject* Java_org_bytedeco_cpython_global_python_Py_1TYPE(JNIEnv*, jclass, jobject)':
/data/javacpp-presets/cpython/cppbuild/linux-x86_64/include/python3.7m/object.h:118:49: error: invalid cast from type 'PyObject {aka _object}' to type 'PyObject* {aka _object*}'
 #define Py_TYPE(ob)             (((PyObject*)(ob))->ob_type)
                                                 ^
/data/javacpp-presets/cpython/target/native/org/bytedeco/cpython/linux-x86_64/jnipython.cpp:64820:29: note: in expansion of macro 'Py_TYPE'
     rptr = new PyTypeObject(Py_TYPE(*ptr0));
                             ^
/data/javacpp-presets/cpython/target/native/org/bytedeco/cpython/linux-x86_64/jnipython.cpp: In function 'jint Java_org_bytedeco_cpython_global_python_PyObject_1TypeCheck(JNIEnv*, jclass, jobject, jobject)':
/data/javacpp-presets/cpython/cppbuild/linux-x86_64/include/python3.7m/object.h:118:49: error: invalid cast from type 'PyObject {aka _object}' to type 'PyObject* {aka _object*}'
 #define Py_TYPE(ob)             (((PyObject*)(ob))->ob_type)
                                                 ^
/data/javacpp-presets/cpython/cppbuild/linux-x86_64/include/python3.7m/object.h:487:6: note: in expansion of macro 'Py_TYPE'
     (Py_TYPE(ob) == (tp) || PyType_IsSubtype(Py_TYPE(ob), (tp)))
      ^
/data/javacpp-presets/cpython/target/native/org/bytedeco/cpython/linux-x86_64/jnipython.cpp:64848:16: note: in expansion of macro 'PyObject_TypeCheck'
     int rval = PyObject_TypeCheck(*ptr0, *ptr1);
                ^
/data/javacpp-presets/cpython/cppbuild/linux-x86_64/include/python3.7m/object.h:118:49: error: invalid cast from type 'PyObject {aka _object}' to type 'PyObject* {aka _object*}'
 #define Py_TYPE(ob)             (((PyObject*)(ob))->ob_type)
                                                 ^
/data/javacpp-presets/cpython/cppbuild/linux-x86_64/include/python3.7m/object.h:487:46: note: in expansion of macro 'Py_TYPE'
     (Py_TYPE(ob) == (tp) || PyType_IsSubtype(Py_TYPE(ob), (tp)))
                                              ^
/data/javacpp-presets/cpython/target/native/org/bytedeco/cpython/linux-x86_64/jnipython.cpp:64848:16: note: in expansion of macro 'PyObject_TypeCheck'
     int rval = PyObject_TypeCheck(*ptr0, *ptr1);
                ^
/data/javacpp-presets/cpython/target/native/org/bytedeco/cpython/linux-x86_64/jnipython.cpp: In function 'jint Java_org_bytedeco_cpython_global_python_PyFloat_1Check(JNIEnv*, jclass, jobject)':
/data/javacpp-presets/cpython/cppbuild/linux-x86_64/include/python3.7m/object.h:118:49: error: invalid cast from type 'PyObject {aka _object}' to type 'PyObject* {aka _object*}'
 #define Py_TYPE(ob)             (((PyObject*)(ob))->ob_type)
                                                 ^
/data/javacpp-presets/cpython/cppbuild/linux-x86_64/include/python3.7m/object.h:487:6: note: in expansion of macro 'Py_TYPE'
     (Py_TYPE(ob) == (tp) || PyType_IsSubtype(Py_TYPE(ob), (tp)))
      ^
/data/javacpp-presets/cpython/cppbuild/linux-x86_64/include/python3.7m/floatobject.h:23:27: note: in expansion of macro 'PyObject_TypeCheck'
 #define PyFloat_Check(op) PyObject_TypeCheck(op, &PyFloat_Type)
                           ^
/data/javacpp-presets/cpython/target/native/org/bytedeco/cpython/linux-x86_64/jnipython.cpp:64861:16: note: in expansion of macro 'PyFloat_Check'
     int rval = PyFloat_Check(*ptr0);
                ^
/data/javacpp-presets/cpython/cppbuild/linux-x86_64/include/python3.7m/object.h:118:49: error: invalid cast from type 'PyObject {aka _object}' to type 'PyObject* {aka _object*}'
 #define Py_TYPE(ob)             (((PyObject*)(ob))->ob_type)
                                                 ^
/data/javacpp-presets/cpython/cppbuild/linux-x86_64/include/python3.7m/object.h:487:46: note: in expansion of macro 'Py_TYPE'
     (Py_TYPE(ob) == (tp) || PyType_IsSubtype(Py_TYPE(ob), (tp)))
                                              ^
/data/javacpp-presets/cpython/cppbuild/linux-x86_64/include/python3.7m/floatobject.h:23:27: note: in expansion of macro 'PyObject_TypeCheck'
 #define PyFloat_Check(op) PyObject_TypeCheck(op, &PyFloat_Type)
                           ^
/data/javacpp-presets/cpython/target/native/org/bytedeco/cpython/linux-x86_64/jnipython.cpp:64861:16: note: in expansion of macro 'PyFloat_Check'
     int rval = PyFloat_Check(*ptr0);
                ^
/data/javacpp-presets/cpython/target/native/org/bytedeco/cpython/linux-x86_64/jnipython.cpp: In function 'jint Java_org_bytedeco_cpython_global_python_PyFloat_1CheckExact(JNIEnv*, jclass, jobject)':
/data/javacpp-presets/cpython/cppbuild/linux-x86_64/include/python3.7m/object.h:118:49: error: invalid cast from type 'PyObject {aka _object}' to type 'PyObject* {aka _object*}'
 #define Py_TYPE(ob)             (((PyObject*)(ob))->ob_type)
                                                 ^
/data/javacpp-presets/cpython/cppbuild/linux-x86_64/include/python3.7m/floatobject.h:24:33: note: in expansion of macro 'Py_TYPE'
 #define PyFloat_CheckExact(op) (Py_TYPE(op) == &PyFloat_Type)
                                 ^
/data/javacpp-presets/cpython/target/native/org/bytedeco/cpython/linux-x86_64/jnipython.cpp:64874:16: note: in expansion of macro 'PyFloat_CheckExact'
     int rval = PyFloat_CheckExact(*ptr0);
                ^
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  01:18 min
[INFO] Finished at: 2019-07-19T01:29:06Z
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.bytedeco:javacpp:1.5.1:build (javacpp-compiler) on project cpython: Execution javacpp-compiler of goal org.bytedeco:javacpp:1.5.1:build failed: Process exited with an error: 1 -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/PluginExecutionException
saudet commented 5 years ago

/data/javacpp-presets/cpython/cppbuild/linux-x86_64/include/python3.7m/object.h:118:49: error: invalid cast from type 'PyObject {aka _object}' to type 'PyObject {aka _object}'

That means we'll need to add PyObject* instead of PyObject to the Info.cppTypes() .

penetest commented 5 years ago

@saudet ,I have a try:

.put(new Info("Py_TYPE").cppTypes("PyTypeObject","PyObject"))
                .put(new Info("PyObject_TypeCheck").cppTypes("int","PyObject","PyTypeObject"))
                .put(new Info("PyFloat_Check").cppTypes("int","PyObject"))
                .put(new Info("PyFloat_CheckExact").cppTypes("int","PyObject"))

change to:

.put(new Info("Py_TYPE").cppTypes("PyTypeObject","PyObject*"))
                .put(new Info("PyObject_TypeCheck").cppTypes("int","PyObject","PyTypeObject"))
                .put(new Info("PyFloat_Check").cppTypes("int","PyObject"))
                .put(new Info("PyFloat_CheckExact").cppTypes("int","PyObject"))

but also show some errors:

/data/javacpp-presets/cpython/target/native/org/bytedeco/cpython/linux-x86_64/jnipython.cpp: In function '_jobject* Java_org_bytedeco_cpython_global_python_Py_1TYPE(JNIEnv*, jclass, jobject)':
/data/javacpp-presets/cpython/target/native/org/bytedeco/cpython/linux-x86_64/jnipython.cpp:64816:42: error: no matching function for call to '_typeobject::_typeobject(_typeobject*&)'
     rptr = new PyTypeObject(Py_TYPE(ptr0));
                                          ^
/data/javacpp-presets/cpython/target/native/org/bytedeco/cpython/linux-x86_64/jnipython.cpp:64816:42: note: candidates are:
In file included from /data/javacpp-presets/cpython/cppbuild/linux-x86_64/include/python3.7m/pytime.h:6:0,
                 from /data/javacpp-presets/cpython/cppbuild/linux-x86_64/include/python3.7m/Python.h:87,
                 from /data/javacpp-presets/cpython/target/native/org/bytedeco/cpython/linux-x86_64/jnipython.cpp:92:
/data/javacpp-presets/cpython/cppbuild/linux-x86_64/include/python3.7m/object.h:346:16: note: _typeobject::_typeobject()
 typedef struct _typeobject {
                ^
/data/javacpp-presets/cpython/cppbuild/linux-x86_64/include/python3.7m/object.h:346:16: note:   candidate expects 0 arguments, 1 provided
/data/javacpp-presets/cpython/cppbuild/linux-x86_64/include/python3.7m/object.h:346:16: note: _typeobject::_typeobject(const _typeobject&)
/data/javacpp-presets/cpython/cppbuild/linux-x86_64/include/python3.7m/object.h:346:16: note:   no known conversion for argument 1 from '_typeobject*' to 'const _typeobject&'
/data/javacpp-presets/cpython/target/native/org/bytedeco/cpython/linux-x86_64/jnipython.cpp: In function 'jint Java_org_bytedeco_cpython_global_python_PyObject_1TypeCheck(JNIEnv*, jclass, jobject, jobject)':
/data/javacpp-presets/cpython/cppbuild/linux-x86_64/include/python3.7m/object.h:118:49: error: invalid cast from type 'PyObject {aka _object}' to type 'PyObject* {aka _object*}'
 #define Py_TYPE(ob)             (((PyObject*)(ob))->ob_type)
                                                 ^
/data/javacpp-presets/cpython/cppbuild/linux-x86_64/include/python3.7m/object.h:487:6: note: in expansion of macro 'Py_TYPE'
     (Py_TYPE(ob) == (tp) || PyType_IsSubtype(Py_TYPE(ob), (tp)))
      ^
/data/javacpp-presets/cpython/target/native/org/bytedeco/cpython/linux-x86_64/jnipython.cpp:64844:16: note: in expansion of macro 'PyObject_TypeCheck'
     int rval = PyObject_TypeCheck(*ptr0, *ptr1);
                ^
/data/javacpp-presets/cpython/cppbuild/linux-x86_64/include/python3.7m/object.h:118:49: error: invalid cast from type 'PyObject {aka _object}' to type 'PyObject* {aka _object*}'
 #define Py_TYPE(ob)             (((PyObject*)(ob))->ob_type)
                                                 ^
/data/javacpp-presets/cpython/cppbuild/linux-x86_64/include/python3.7m/object.h:487:46: note: in expansion of macro 'Py_TYPE'
     (Py_TYPE(ob) == (tp) || PyType_IsSubtype(Py_TYPE(ob), (tp)))
                                              ^
/data/javacpp-presets/cpython/target/native/org/bytedeco/cpython/linux-x86_64/jnipython.cpp:64844:16: note: in expansion of macro 'PyObject_TypeCheck'
     int rval = PyObject_TypeCheck(*ptr0, *ptr1);
                ^
/data/javacpp-presets/cpython/target/native/org/bytedeco/cpython/linux-x86_64/jnipython.cpp: In function 'jint Java_org_bytedeco_cpython_global_python_PyFloat_1Check(JNIEnv*, jclass, jobject)':
/data/javacpp-presets/cpython/cppbuild/linux-x86_64/include/python3.7m/object.h:118:49: error: invalid cast from type 'PyObject {aka _object}' to type 'PyObject* {aka _object*}'
 #define Py_TYPE(ob)             (((PyObject*)(ob))->ob_type)
                                                 ^
/data/javacpp-presets/cpython/cppbuild/linux-x86_64/include/python3.7m/object.h:487:6: note: in expansion of macro 'Py_TYPE'
     (Py_TYPE(ob) == (tp) || PyType_IsSubtype(Py_TYPE(ob), (tp)))
      ^
/data/javacpp-presets/cpython/cppbuild/linux-x86_64/include/python3.7m/floatobject.h:23:27: note: in expansion of macro 'PyObject_TypeCheck'
 #define PyFloat_Check(op) PyObject_TypeCheck(op, &PyFloat_Type)
                           ^
/data/javacpp-presets/cpython/target/native/org/bytedeco/cpython/linux-x86_64/jnipython.cpp:64857:16: note: in expansion of macro 'PyFloat_Check'
     int rval = PyFloat_Check(*ptr0);
                ^
/data/javacpp-presets/cpython/cppbuild/linux-x86_64/include/python3.7m/object.h:118:49: error: invalid cast from type 'PyObject {aka _object}' to type 'PyObject* {aka _object*}'
 #define Py_TYPE(ob)             (((PyObject*)(ob))->ob_type)
                                                 ^
/data/javacpp-presets/cpython/cppbuild/linux-x86_64/include/python3.7m/object.h:487:46: note: in expansion of macro 'Py_TYPE'
     (Py_TYPE(ob) == (tp) || PyType_IsSubtype(Py_TYPE(ob), (tp)))
                                              ^
/data/javacpp-presets/cpython/cppbuild/linux-x86_64/include/python3.7m/floatobject.h:23:27: note: in expansion of macro 'PyObject_TypeCheck'
 #define PyFloat_Check(op) PyObject_TypeCheck(op, &PyFloat_Type)
                           ^
/data/javacpp-presets/cpython/target/native/org/bytedeco/cpython/linux-x86_64/jnipython.cpp:64857:16: note: in expansion of macro 'PyFloat_Check'
     int rval = PyFloat_Check(*ptr0);
                ^
/data/javacpp-presets/cpython/target/native/org/bytedeco/cpython/linux-x86_64/jnipython.cpp: In function 'jint Java_org_bytedeco_cpython_global_python_PyFloat_1CheckExact(JNIEnv*, jclass, jobject)':
/data/javacpp-presets/cpython/cppbuild/linux-x86_64/include/python3.7m/object.h:118:49: error: invalid cast from type 'PyObject {aka _object}' to type 'PyObject* {aka _object*}'
 #define Py_TYPE(ob)             (((PyObject*)(ob))->ob_type)
                                                 ^
/data/javacpp-presets/cpython/cppbuild/linux-x86_64/include/python3.7m/floatobject.h:24:33: note: in expansion of macro 'Py_TYPE'
 #define PyFloat_CheckExact(op) (Py_TYPE(op) == &PyFloat_Type)
                                 ^
/data/javacpp-presets/cpython/target/native/org/bytedeco/cpython/linux-x86_64/jnipython.cpp:64870:16: note: in expansion of macro 'PyFloat_CheckExact'
     int rval = PyFloat_CheckExact(*ptr0);
                ^
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  01:16 min
[INFO] Finished at: 2019-07-19T02:45:36Z
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.bytedeco:javacpp:1.5.1:build (javacpp-compiler) on project cpython: Execution javacpp-compiler of goal org.bytedeco:javacpp:1.5.1:build failed: Process exited with an error: 1 -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/PluginExecutionException
saudet commented 5 years ago

The other PyObject need to be changed to PyObject* as well...

penetest commented 5 years ago

Yes, It is OK,Thank your very much! codes as followings:

 .put(new Info("Py_TYPE").cppTypes("PyTypeObject*","PyObject*"))
                .put(new Info("PyObject_TypeCheck").cppTypes("int","PyObject*","PyTypeObject*"))
                .put(new Info("PyFloat_Check").cppTypes("int","PyObject*"))
                .put(new Info("PyFloat_CheckExact").cppTypes("int","PyObject*"))
saudet commented 5 years ago

Does it work? If so, please send a pull request so we can merge this! Thanks

penetest commented 5 years ago

Yes,Building is ok,but not tested yet.

penetest commented 5 years ago

@saudet Hi,Which branch can I push code to ?

penetest commented 5 years ago

I try to push codes to 'ci',but show some errors:

[root@a654f9dca294 javacpp-presets]# git push origin ci
Username for 'https://github.com': penetest
Password for 'https://penetest@github.com': 
remote: Permission to bytedeco/javacpp-presets.git denied to penetest.
fatal: unable to access 'https://github.com/bytedeco/javacpp-presets.git/': The requested URL returned error: 403
saudet commented 5 years ago

The master branch is fine. However, you'll need to create a fork as well as a pull request: https://help.github.com/en/articles/creating-a-pull-request-from-a-fork