diff --git a/graalpython/com.oracle.graal.python.c_embed/.gitignore b/graalpython/com.oracle.graal.python.c_embed/.gitignore new file mode 100644 index 0000000000..07ed7069a2 --- /dev/null +++ b/graalpython/com.oracle.graal.python.c_embed/.gitignore @@ -0,0 +1 @@ +build/* \ No newline at end of file diff --git a/graalpython/com.oracle.graal.python.c_embed/CMakeLists.txt b/graalpython/com.oracle.graal.python.c_embed/CMakeLists.txt new file mode 100644 index 0000000000..375fbc6eef --- /dev/null +++ b/graalpython/com.oracle.graal.python.c_embed/CMakeLists.txt @@ -0,0 +1,55 @@ +cmake_minimum_required(VERSION 3.22) +project(com.oracle.graal.python.c_embed LANGUAGES C DESCRIPTION "GraalPython C Embedding API") + +set(CMAKE_C_STANDARD 11) +set(LIB_NAME "graalpython-embed") + +# don't install into the system but into the MX project's output dir +set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR}) + +function(require_var var) + if (NOT DEFINED ${var}) + message(FATAL_ERROR "${var} needs to be set") + endif() +endfunction() + +require_var(CEXT_H_INC) +# +# The statically linked graal native library for graalpy +# e.g. libpythonvm.dylib +# and the header files for graal_isolate etc. +require_var(RUNTIME_LIB_DIR) + +# +# e.g. libpython-native.dylib +# should be statically linked too to expose static symbols +require_var(PYTHON_NATIVE_LIB) + +message("Using graalpython runtime lib dir: ${RUNTIME_LIB_DIR}") +message("Using graalpython native lib: ${PYTHON_NATIVE_LIB}") + +add_library(pythonvm STATIC IMPORTED) +set_target_properties(pythonvm PROPERTIES IMPORTED_LOCATION "${RUNTIME_LIB_DIR}/libpythonvm.dylib") + +# +# depend on libpython-native +add_library(python-native STATIC IMPORTED) +set_target_properties(python-native PROPERTIES IMPORTED_LOCATION "${PYTHON_NATIVE_LIB}") + +set(SRC_FILES src/graalpython-embed.c) + +add_library(${LIB_NAME} SHARED ${SRC_FILES}) + +target_include_directories(${LIB_NAME} PUBLIC include) +target_include_directories(${LIB_NAME} PRIVATE "${RUNTIME_LIB_DIR}") + +target_link_libraries(${LIB_NAME} pythonvm) +target_link_libraries(${LIB_NAME} python-native) + +# +# for pyport.h and exports.h +target_include_directories(${LIB_NAME} PRIVATE "${CEXT_H_INC}") + +install(TARGETS ${LIB_NAME} DESTINATION bin) + +message("Created lib in: ${CMAKE_INSTALL_PREFIX}") \ No newline at end of file diff --git a/graalpython/com.oracle.graal.python.c_embed/README.md b/graalpython/com.oracle.graal.python.c_embed/README.md new file mode 100644 index 0000000000..f1f84ecf7a --- /dev/null +++ b/graalpython/com.oracle.graal.python.c_embed/README.md @@ -0,0 +1,19 @@ +C-Python compatible bindings for graalpython + + + +## Manual building + +1. build graalpy stuff: `mx python-jvm` +2. regen code: `mx python-capi-forwards` +3. (if changed) rebuild graalpy native lib: `mx python-svm` +4. build c lib: `mx build --dependencies com.oracle.graal.python.c_embed` + +## Test exported symbols (from graalpython dir) +`nm -gU mxbuild/darwin-aarch64/com.oracle.graal.python.c_embed/aarch64/libgraalpython-embed.dylib | grep -i "T _Py"` + + +# TODOs + +- check if static linking is working +- make RUNTIME_LIB_DIR dynamic in mx suite \ No newline at end of file diff --git a/graalpython/com.oracle.graal.python.c_embed/include/graalpython-embed.h b/graalpython/com.oracle.graal.python.c_embed/include/graalpython-embed.h new file mode 100644 index 0000000000..99407ae9c7 --- /dev/null +++ b/graalpython/com.oracle.graal.python.c_embed/include/graalpython-embed.h @@ -0,0 +1,474 @@ +#include +#include "Python.h" +// fix missing symbol PyExc_BaseException +#include "pyerrors.h" +#ifndef GRAALPYTHON_EMBED_H +#define GRAALPYTHON_EMBED_H + + + + + +// {{start CAPI_BUILTINS}} +// GENERATED CODE - see CApiCodeGen +// This can be re-generated using the 'mx python-capi-forwards' command or +// by executing the main class CApiCodeGen + +#define CAPI_BUILTINS \ + BUILTIN(PyByteArray_Resize, int, PyObject*, Py_ssize_t) \ + BUILTIN(PyBytes_AsString, char*, PyObject*) \ + BUILTIN(PyBytes_FromObject, PyObject*, PyObject*) \ + BUILTIN(PyBytes_Size, Py_ssize_t, PyObject*) \ + BUILTIN(PyCallIter_New, PyObject*, PyObject*, PyObject*) \ + BUILTIN(PyCallable_Check, int, PyObject*) \ + BUILTIN(PyCapsule_GetContext, void*, PyObject*) \ + BUILTIN(PyCapsule_GetDestructor, PyCapsule_Destructor, PyObject*) \ + BUILTIN(PyCapsule_GetName, const char*, PyObject*) \ + BUILTIN(PyCapsule_GetPointer, void*, PyObject*, const char*) \ + BUILTIN(PyCapsule_Import, void*, const char*, int) \ + BUILTIN(PyCapsule_IsValid, int, PyObject*, const char*) \ + BUILTIN(PyCapsule_New, PyObject*, void*, const char*, PyCapsule_Destructor) \ + BUILTIN(PyCapsule_SetContext, int, PyObject*, void*) \ + BUILTIN(PyCapsule_SetDestructor, int, PyObject*, PyCapsule_Destructor) \ + BUILTIN(PyCapsule_SetName, int, PyObject*, const char*) \ + BUILTIN(PyCapsule_SetPointer, int, PyObject*, void*) \ + BUILTIN(PyClassMethod_New, PyObject*, PyObject*) \ + BUILTIN(PyCode_Addr2Line, int, PyCodeObject*, int) \ + BUILTIN(PyCode_GetFileName, PyObject*, PyCodeObject*) \ + BUILTIN(PyCode_GetName, PyObject*, PyCodeObject*) \ + BUILTIN(PyCode_New, PyCodeObject*, int, int, int, int, int, PyObject*, PyObject*, PyObject*, PyObject*, PyObject*, PyObject*, PyObject*, PyObject*, int, PyObject*) \ + BUILTIN(PyCode_NewEmpty, PyCodeObject*, const char*, const char*, int) \ + BUILTIN(PyCode_NewWithPosOnlyArgs, PyCodeObject*, int, int, int, int, int, int, PyObject*, PyObject*, PyObject*, PyObject*, PyObject*, PyObject*, PyObject*, PyObject*, int, PyObject*) \ + BUILTIN(PyCodec_Decoder, PyObject*, const char*) \ + BUILTIN(PyCodec_Encoder, PyObject*, const char*) \ + BUILTIN(PyComplex_FromDoubles, PyObject*, double, double) \ + BUILTIN(PyComplex_ImagAsDouble, double, PyObject*) \ + BUILTIN(PyComplex_RealAsDouble, double, PyObject*) \ + BUILTIN(PyContextVar_New, PyObject*, const char*, PyObject*) \ + BUILTIN(PyContextVar_Set, PyObject*, PyObject*, PyObject*) \ + BUILTIN(PyDictProxy_New, PyObject*, PyObject*) \ + BUILTIN(PyDict_Clear, void, PyObject*) \ + BUILTIN(PyDict_Contains, int, PyObject*, PyObject*) \ + BUILTIN(PyDict_Copy, PyObject*, PyObject*) \ + BUILTIN(PyDict_DelItem, int, PyObject*, PyObject*) \ + BUILTIN(PyDict_GetItem, PyObject*, PyObject*, PyObject*) \ + BUILTIN(PyDict_GetItemWithError, PyObject*, PyObject*, PyObject*) \ + BUILTIN(PyDict_Items, PyObject*, PyObject*) \ + BUILTIN(PyDict_Keys, PyObject*, PyObject*) \ + BUILTIN(PyDict_Merge, int, PyObject*, PyObject*, int) \ + BUILTIN(PyDict_New, PyObject*) \ + BUILTIN(PyDict_SetDefault, PyObject*, PyObject*, PyObject*, PyObject*) \ + BUILTIN(PyDict_SetItem, int, PyObject*, PyObject*, PyObject*) \ + BUILTIN(PyDict_Size, Py_ssize_t, PyObject*) \ + BUILTIN(PyDict_Update, int, PyObject*, PyObject*) \ + BUILTIN(PyDict_Values, PyObject*, PyObject*) \ + BUILTIN(PyErr_Display, void, PyObject*, PyObject*, PyObject*) \ + BUILTIN(PyErr_GivenExceptionMatches, int, PyObject*, PyObject*) \ + BUILTIN(PyErr_NewException, PyObject*, const char*, PyObject*, PyObject*) \ + BUILTIN(PyErr_NewExceptionWithDoc, PyObject*, const char*, const char*, PyObject*, PyObject*) \ + BUILTIN(PyErr_Occurred, PyObject*) \ + BUILTIN(PyErr_PrintEx, void, int) \ + BUILTIN(PyErr_Restore, void, PyObject*, PyObject*, PyObject*) \ + BUILTIN(PyErr_SetExcInfo, void, PyObject*, PyObject*, PyObject*) \ + BUILTIN(PyEval_GetBuiltins, PyObject*) \ + BUILTIN(PyEval_GetFrame, PyFrameObject*) \ + BUILTIN(PyEval_RestoreThread, void, PyThreadState*) \ + BUILTIN(PyEval_SaveThread, PyThreadState*) \ + BUILTIN(PyException_GetCause, PyObject*, PyObject*) \ + BUILTIN(PyException_GetContext, PyObject*, PyObject*) \ + BUILTIN(PyException_GetTraceback, PyObject*, PyObject*) \ + BUILTIN(PyException_SetCause, void, PyObject*, PyObject*) \ + BUILTIN(PyException_SetContext, void, PyObject*, PyObject*) \ + BUILTIN(PyException_SetTraceback, int, PyObject*, PyObject*) \ + BUILTIN(PyFile_WriteObject, int, PyObject*, PyObject*, int) \ + BUILTIN(PyFloat_FromDouble, PyObject*, double) \ + BUILTIN(PyFloat_FromString, PyObject*, PyObject*) \ + BUILTIN(PyFrame_GetBack, PyFrameObject*, PyFrameObject*) \ + BUILTIN(PyFrame_GetBuiltins, PyObject*, PyFrameObject*) \ + BUILTIN(PyFrame_GetCode, PyCodeObject*, PyFrameObject*) \ + BUILTIN(PyFrame_GetGlobals, PyObject*, PyFrameObject*) \ + BUILTIN(PyFrame_GetLasti, int, PyFrameObject*) \ + BUILTIN(PyFrame_GetLineNumber, int, PyFrameObject*) \ + BUILTIN(PyFrame_GetLocals, PyObject*, PyFrameObject*) \ + BUILTIN(PyFrame_New, PyFrameObject*, PyThreadState*, PyCodeObject*, PyObject*, PyObject*) \ + BUILTIN(PyFrozenSet_New, PyObject*, PyObject*) \ + BUILTIN(PyGILState_Check, int) \ + BUILTIN(PyImport_GetModuleDict, PyObject*) \ + BUILTIN(PyImport_Import, PyObject*, PyObject*) \ + BUILTIN(PyImport_ImportModule, PyObject*, const char*) \ + BUILTIN(PyImport_ImportModuleLevelObject, PyObject*, PyObject*, PyObject*, PyObject*, PyObject*, int) \ + BUILTIN(PyImport_ImportModuleNoBlock, PyObject*, const char*) \ + BUILTIN(PyIndex_Check, int, PyObject*) \ + BUILTIN(PyInstanceMethod_New, PyObject*, PyObject*) \ + BUILTIN(PyIter_Check, int, PyObject*) \ + BUILTIN(PyIter_Next, PyObject*, PyObject*) \ + BUILTIN(PyList_Append, int, PyObject*, PyObject*) \ + BUILTIN(PyList_AsTuple, PyObject*, PyObject*) \ + BUILTIN(PyList_GetItem, PyObject*, PyObject*, Py_ssize_t) \ + BUILTIN(PyList_GetSlice, PyObject*, PyObject*, Py_ssize_t, Py_ssize_t) \ + BUILTIN(PyList_Insert, int, PyObject*, Py_ssize_t, PyObject*) \ + BUILTIN(PyList_New, PyObject*, Py_ssize_t) \ + BUILTIN(PyList_Reverse, int, PyObject*) \ + BUILTIN(PyList_SetItem, int, PyObject*, Py_ssize_t, PyObject*) \ + BUILTIN(PyList_SetSlice, int, PyObject*, Py_ssize_t, Py_ssize_t, PyObject*) \ + BUILTIN(PyList_Size, Py_ssize_t, PyObject*) \ + BUILTIN(PyList_Sort, int, PyObject*) \ + BUILTIN(PyLong_AsVoidPtr, void*, PyObject*) \ + BUILTIN(PyLong_FromDouble, PyObject*, double) \ + BUILTIN(PyLong_FromLong, PyObject*, long) \ + BUILTIN(PyLong_FromLongLong, PyObject*, long long) \ + BUILTIN(PyLong_FromSize_t, PyObject*, size_t) \ + BUILTIN(PyLong_FromSsize_t, PyObject*, Py_ssize_t) \ + BUILTIN(PyLong_FromUnicodeObject, PyObject*, PyObject*, int) \ + BUILTIN(PyLong_FromUnsignedLong, PyObject*, unsigned long) \ + BUILTIN(PyLong_FromUnsignedLongLong, PyObject*, unsigned long long) \ + BUILTIN(PyMapping_Check, int, PyObject*) \ + BUILTIN(PyMapping_Items, PyObject*, PyObject*) \ + BUILTIN(PyMapping_Keys, PyObject*, PyObject*) \ + BUILTIN(PyMapping_Size, Py_ssize_t, PyObject*) \ + BUILTIN(PyMapping_Values, PyObject*, PyObject*) \ + BUILTIN(PyMemoryView_FromObject, PyObject*, PyObject*) \ + BUILTIN(PyMemoryView_GetContiguous, PyObject*, PyObject*, int, char) \ + BUILTIN(PyMethod_New, PyObject*, PyObject*, PyObject*) \ + BUILTIN(PyModule_AddIntConstant, int, PyObject*, const char*, long) \ + BUILTIN(PyModule_AddObjectRef, int, PyObject*, const char*, PyObject*) \ + BUILTIN(PyModule_GetNameObject, PyObject*, PyObject*) \ + BUILTIN(PyModule_New, PyObject*, const char*) \ + BUILTIN(PyModule_NewObject, PyObject*, PyObject*) \ + BUILTIN(PyModule_SetDocString, int, PyObject*, const char*) \ + BUILTIN(PyNumber_Absolute, PyObject*, PyObject*) \ + BUILTIN(PyNumber_Check, int, PyObject*) \ + BUILTIN(PyNumber_Divmod, PyObject*, PyObject*, PyObject*) \ + BUILTIN(PyNumber_Float, PyObject*, PyObject*) \ + BUILTIN(PyNumber_InPlacePower, PyObject*, PyObject*, PyObject*, PyObject*) \ + BUILTIN(PyNumber_Index, PyObject*, PyObject*) \ + BUILTIN(PyNumber_Long, PyObject*, PyObject*) \ + BUILTIN(PyNumber_Power, PyObject*, PyObject*, PyObject*, PyObject*) \ + BUILTIN(PyNumber_ToBase, PyObject*, PyObject*, int) \ + BUILTIN(PyOS_FSPath, PyObject*, PyObject*) \ + BUILTIN(PyObject_ASCII, PyObject*, PyObject*) \ + BUILTIN(PyObject_AsFileDescriptor, int, PyObject*) \ + BUILTIN(PyObject_Bytes, PyObject*, PyObject*) \ + BUILTIN(PyObject_ClearWeakRefs, void, PyObject*) \ + BUILTIN(PyObject_DelItem, int, PyObject*, PyObject*) \ + BUILTIN(PyObject_Dir, PyObject*, PyObject*) \ + BUILTIN(PyObject_Format, PyObject*, PyObject*, PyObject*) \ + BUILTIN(PyObject_GetDoc, const char*, PyObject*) \ + BUILTIN(PyObject_GetItem, PyObject*, PyObject*, PyObject*) \ + BUILTIN(PyObject_GetIter, PyObject*, PyObject*) \ + BUILTIN(PyObject_HasAttr, int, PyObject*, PyObject*) \ + BUILTIN(PyObject_HasAttrString, int, PyObject*, const char*) \ + BUILTIN(PyObject_Hash, Py_hash_t, PyObject*) \ + BUILTIN(PyObject_HashNotImplemented, Py_hash_t, PyObject*) \ + BUILTIN(PyObject_IsInstance, int, PyObject*, PyObject*) \ + BUILTIN(PyObject_IsSubclass, int, PyObject*, PyObject*) \ + BUILTIN(PyObject_IsTrue, int, PyObject*) \ + BUILTIN(PyObject_LengthHint, Py_ssize_t, PyObject*, Py_ssize_t) \ + BUILTIN(PyObject_Repr, PyObject*, PyObject*) \ + BUILTIN(PyObject_RichCompare, PyObject*, PyObject*, PyObject*, int) \ + BUILTIN(PyObject_SetDoc, int, PyObject*, const char*) \ + BUILTIN(PyObject_SetItem, int, PyObject*, PyObject*, PyObject*) \ + BUILTIN(PyObject_Size, Py_ssize_t, PyObject*) \ + BUILTIN(PyObject_Str, PyObject*, PyObject*) \ + BUILTIN(PyObject_Type, PyObject*, PyObject*) \ + BUILTIN(PyRun_StringFlags, PyObject*, const char*, int, PyObject*, PyObject*, PyCompilerFlags*) \ + BUILTIN(PySeqIter_New, PyObject*, PyObject*) \ + BUILTIN(PySequence_Check, int, PyObject*) \ + BUILTIN(PySequence_Concat, PyObject*, PyObject*, PyObject*) \ + BUILTIN(PySequence_Contains, int, PyObject*, PyObject*) \ + BUILTIN(PySequence_Count, Py_ssize_t, PyObject*, PyObject*) \ + BUILTIN(PySequence_DelItem, int, PyObject*, Py_ssize_t) \ + BUILTIN(PySequence_DelSlice, int, PyObject*, Py_ssize_t, Py_ssize_t) \ + BUILTIN(PySequence_GetItem, PyObject*, PyObject*, Py_ssize_t) \ + BUILTIN(PySequence_GetSlice, PyObject*, PyObject*, Py_ssize_t, Py_ssize_t) \ + BUILTIN(PySequence_InPlaceConcat, PyObject*, PyObject*, PyObject*) \ + BUILTIN(PySequence_InPlaceRepeat, PyObject*, PyObject*, Py_ssize_t) \ + BUILTIN(PySequence_Index, Py_ssize_t, PyObject*, PyObject*) \ + BUILTIN(PySequence_Length, Py_ssize_t, PyObject*) \ + BUILTIN(PySequence_List, PyObject*, PyObject*) \ + BUILTIN(PySequence_Repeat, PyObject*, PyObject*, Py_ssize_t) \ + BUILTIN(PySequence_SetItem, int, PyObject*, Py_ssize_t, PyObject*) \ + BUILTIN(PySequence_SetSlice, int, PyObject*, Py_ssize_t, Py_ssize_t, PyObject*) \ + BUILTIN(PySequence_Size, Py_ssize_t, PyObject*) \ + BUILTIN(PySequence_Tuple, PyObject*, PyObject*) \ + BUILTIN(PySet_Add, int, PyObject*, PyObject*) \ + BUILTIN(PySet_Clear, int, PyObject*) \ + BUILTIN(PySet_Contains, int, PyObject*, PyObject*) \ + BUILTIN(PySet_Discard, int, PyObject*, PyObject*) \ + BUILTIN(PySet_New, PyObject*, PyObject*) \ + BUILTIN(PySet_Pop, PyObject*, PyObject*) \ + BUILTIN(PySet_Size, Py_ssize_t, PyObject*) \ + BUILTIN(PySlice_New, PyObject*, PyObject*, PyObject*, PyObject*) \ + BUILTIN(PyStaticMethod_New, PyObject*, PyObject*) \ + BUILTIN(PyStructSequence_New, PyObject*, PyTypeObject*) \ + BUILTIN(PySys_GetObject, PyObject*, const char*) \ + BUILTIN(PyThreadState_Get, PyThreadState*) \ + BUILTIN(PyThreadState_GetDict, PyObject*) \ + BUILTIN(PyThread_acquire_lock, int, PyThread_type_lock, int) \ + BUILTIN(PyThread_allocate_lock, PyThread_type_lock) \ + BUILTIN(PyThread_get_thread_ident, unsigned long) \ + BUILTIN(PyThread_release_lock, void, PyThread_type_lock) \ + BUILTIN(PyTraceBack_Here, int, PyFrameObject*) \ + BUILTIN(PyTraceMalloc_Track, int, unsigned int, uintptr_t, size_t) \ + BUILTIN(PyTraceMalloc_Untrack, int, unsigned int, uintptr_t) \ + BUILTIN(PyTruffleByteArray_FromStringAndSize, PyObject*, const char*, Py_ssize_t) \ + BUILTIN(PyTruffleBytes_Concat, PyObject*, PyObject*, PyObject*) \ + BUILTIN(PyTruffleBytes_FromFormat, PyObject*, const char*, PyObject*) \ + BUILTIN(PyTruffleBytes_FromStringAndSize, PyObject*, const char*, Py_ssize_t) \ + BUILTIN(PyTruffleCMethod_NewEx, PyObject*, PyMethodDef*, const char*, void*, int, int, PyObject*, PyObject*, PyTypeObject*, const char*) \ + BUILTIN(PyTruffleComplex_AsCComplex, PyObject*, PyObject*) \ + BUILTIN(PyTruffleContextVar_Get, PyObject*, PyObject*, PyObject*, void*) \ + BUILTIN(PyTruffleDateTimeCAPI_DateTime_FromDateAndTime, PyObject*, int, int, int, int, int, int, int, PyObject*, PyTypeObject*) \ + BUILTIN(PyTruffleDateTimeCAPI_DateTime_FromDateAndTimeAndFold, PyObject*, int, int, int, int, int, int, int, PyObject*, int, PyTypeObject*) \ + BUILTIN(PyTruffleDateTimeCAPI_DateTime_FromTimestamp, PyObject*, PyObject*, PyObject*, PyObject*) \ + BUILTIN(PyTruffleDateTimeCAPI_Date_FromDate, PyObject*, int, int, int, PyTypeObject*) \ + BUILTIN(PyTruffleDateTimeCAPI_Date_FromTimestamp, PyObject*, PyObject*, PyObject*) \ + BUILTIN(PyTruffleDateTimeCAPI_Delta_FromDelta, PyObject*, int, int, int, int, PyTypeObject*) \ + BUILTIN(PyTruffleDateTimeCAPI_TimeZone_FromTimeZone, PyObject*, PyObject*, PyObject*) \ + BUILTIN(PyTruffleDateTimeCAPI_Time_FromTime, PyObject*, int, int, int, int, PyObject*, PyTypeObject*) \ + BUILTIN(PyTruffleDateTimeCAPI_Time_FromTimeAndFold, PyObject*, int, int, int, int, PyObject*, int, PyTypeObject*) \ + BUILTIN(PyTruffleDescr_NewClassMethod, PyObject*, void*, const char*, const char*, int, int, void*, PyTypeObject*) \ + BUILTIN(PyTruffleDescr_NewGetSet, PyObject*, const char*, PyTypeObject*, void*, void*, const char*, void*) \ + BUILTIN(PyTruffleDict_Next, PyObject*, PyObject*, Py_ssize_t) \ + BUILTIN(PyTruffleErr_Fetch, PyObject*) \ + BUILTIN(PyTruffleErr_GetExcInfo, PyObject*) \ + BUILTIN(PyTruffleErr_WarnExplicit, PyObject*, PyObject*, PyObject*, PyObject*, int, PyObject*, PyObject*) \ + BUILTIN(PyTruffleFloat_AsDouble, double, PyObject*) \ + BUILTIN(PyTruffleGILState_Ensure, int) \ + BUILTIN(PyTruffleGILState_Release, void) \ + BUILTIN(PyTruffleHash_InitSecret, void, int8_t*) \ + BUILTIN(PyTruffleLong_AsPrimitive, long, PyObject*, int, long) \ + BUILTIN(PyTruffleLong_FromString, PyObject*, PyObject*, int, int) \ + BUILTIN(PyTruffleLong_One, PyObject*) \ + BUILTIN(PyTruffleLong_Zero, PyObject*) \ + BUILTIN(PyTruffleModule_AddFunctionToModule, int, void*, PyObject*, const char*, void*, int, int, const char*) \ + BUILTIN(PyTruffleNumber_BinOp, PyObject*, PyObject*, PyObject*, int) \ + BUILTIN(PyTruffleNumber_InPlaceBinOp, PyObject*, PyObject*, PyObject*, int) \ + BUILTIN(PyTruffleNumber_UnaryOp, PyObject*, PyObject*, int) \ + BUILTIN(PyTruffleObject_CallFunctionObjArgs, PyObject*, PyObject*, va_list*) \ + BUILTIN(PyTruffleObject_CallMethodObjArgs, PyObject*, PyObject*, PyObject*, va_list*) \ + BUILTIN(PyTruffleObject_GC_Track, void, void*) \ + BUILTIN(PyTruffleObject_GC_UnTrack, void, void*) \ + BUILTIN(PyTruffleObject_GenericGetAttr, PyObject*, PyObject*, PyObject*) \ + BUILTIN(PyTruffleObject_GenericSetAttr, int, PyObject*, PyObject*, PyObject*) \ + BUILTIN(PyTruffleObject_GetItemString, PyObject*, PyObject*, const char*) \ + BUILTIN(PyTruffleState_FindModule, PyObject*, Py_ssize_t) \ + BUILTIN(PyTruffleStructSequence_InitType2, int, PyTypeObject*, void*, int) \ + BUILTIN(PyTruffleStructSequence_NewType, PyTypeObject*, const char*, const char*, void*, int) \ + BUILTIN(PyTruffleType_AddFunctionToType, int, void*, PyTypeObject*, PyObject*, const char*, void*, int, int, const char*) \ + BUILTIN(PyTruffleType_AddGetSet, int, PyTypeObject*, PyObject*, const char*, void*, void*, const char*, void*) \ + BUILTIN(PyTruffleType_AddMember, int, PyTypeObject*, PyObject*, const char*, int, Py_ssize_t, int, const char*) \ + BUILTIN(PyTruffleType_AddSlot, int, PyTypeObject*, PyObject*, const char*, void*, int, int, const char*) \ + BUILTIN(PyTruffleUnicode_Decode, PyObject*, PyObject*, const char*, const char*) \ + BUILTIN(PyTruffleUnicode_DecodeUTF16Stateful, PyObject*, void*, Py_ssize_t, const char*, int, int) \ + BUILTIN(PyTruffleUnicode_DecodeUTF32Stateful, PyObject*, void*, Py_ssize_t, const char*, int, int) \ + BUILTIN(PyTruffleUnicode_DecodeUTF8Stateful, PyObject*, void*, Py_ssize_t, const char*, int) \ + BUILTIN(PyTruffleUnicode_FromUCS, PyObject*, void*, Py_ssize_t, int) \ + BUILTIN(PyTruffleUnicode_FromUTF, PyObject*, void*, Py_ssize_t, int) \ + BUILTIN(PyTruffleUnicode_LookupAndIntern, PyObject*, PyObject*) \ + BUILTIN(PyTruffleUnicode_New, PyObject*, void*, Py_ssize_t, Py_ssize_t, Py_UCS4) \ + BUILTIN(PyTruffle_AddInheritedSlots, void, PyTypeObject*) \ + BUILTIN(PyTruffle_Arg_ParseArrayAndKeywords, int, void*, Py_ssize_t, PyObject*, const char*, void*, void*) \ + BUILTIN(PyTruffle_Arg_ParseTupleAndKeywords, int, PyObject*, PyObject*, const char*, void*, void*) \ + BUILTIN(PyTruffle_Array_getbuffer, int, PyObject*, Py_buffer*, int) \ + BUILTIN(PyTruffle_Array_releasebuffer, void, PyObject*, Py_buffer*) \ + BUILTIN(PyTruffle_BulkNotifyRefCount, void, void*, int) \ + BUILTIN(PyTruffle_ByteArray_EmptyWithCapacity, PyObject*, Py_ssize_t) \ + BUILTIN(PyTruffle_Bytes_CheckEmbeddedNull, int, PyObject*) \ + BUILTIN(PyTruffle_Bytes_EmptyWithCapacity, PyObject*, long) \ + BUILTIN(PyTruffle_Compute_Mro, PyObject*, PyTypeObject*, const char*) \ + BUILTIN(PyTruffle_Debug, int, void*) \ + BUILTIN(PyTruffle_DebugTrace, void) \ + BUILTIN(PyTruffle_Ellipsis, PyObject*) \ + BUILTIN(PyTruffle_False, PyObject*) \ + BUILTIN(PyTruffle_FatalErrorFunc, void, const char*, const char*, int) \ + BUILTIN(PyTruffle_FileSystemDefaultEncoding, PyObject*) \ + BUILTIN(PyTruffle_GetInitialNativeMemory, size_t) \ + BUILTIN(PyTruffle_GetMMapData, char*, PyObject*) \ + BUILTIN(PyTruffle_GetMaxNativeMemory, size_t) \ + BUILTIN(PyTruffle_HashConstant, long, int) \ + BUILTIN(PyTruffle_InitBuiltinTypesAndStructs, void, void*) \ + BUILTIN(PyTruffle_LogString, void, int, const char*) \ + BUILTIN(PyTruffle_MemoryViewFromBuffer, PyObject*, void*, PyObject*, Py_ssize_t, int, Py_ssize_t, const char*, int, void*, void*, void*, void*) \ + BUILTIN(PyTruffle_Native_Options, int) \ + BUILTIN(PyTruffle_NewTypeDict, PyObject*, PyTypeObject*) \ + BUILTIN(PyTruffle_NoValue, PyObject*) \ + BUILTIN(PyTruffle_None, PyObject*) \ + BUILTIN(PyTruffle_NotImplemented, PyObject*) \ + BUILTIN(PyTruffle_NotifyRefCount, void, PyObject*, Py_ssize_t) \ + BUILTIN(PyTruffle_Object_Free, void, void*) \ + BUILTIN(PyTruffle_PyDateTime_GET_TZINFO, PyObject*, PyObject*) \ + BUILTIN(PyTruffle_PyUnicode_Find, Py_ssize_t, PyObject*, PyObject*, Py_ssize_t, Py_ssize_t, int) \ + BUILTIN(PyTruffle_Register_NULL, void, void*) \ + BUILTIN(PyTruffle_Set_Native_Slots, int, PyTypeObject*, void*, void*) \ + BUILTIN(PyTruffle_ToNative, int, void*) \ + BUILTIN(PyTruffle_Trace_Type, int, void*, void*) \ + BUILTIN(PyTruffle_TriggerGC, void, size_t) \ + BUILTIN(PyTruffle_True, PyObject*) \ + BUILTIN(PyTruffle_Type, PyTypeObject*, const char*) \ + BUILTIN(PyTruffle_Type_Modified, int, PyTypeObject*, const char*, PyObject*) \ + BUILTIN(PyTruffle_Unicode_AsUTF8AndSize_CharPtr, const char*, PyObject*) \ + BUILTIN(PyTruffle_Unicode_AsUTF8AndSize_Size, Py_ssize_t, PyObject*) \ + BUILTIN(PyTruffle_Unicode_AsUnicodeAndSize_CharPtr, Py_UNICODE*, PyObject*) \ + BUILTIN(PyTruffle_Unicode_AsUnicodeAndSize_Size, Py_ssize_t, PyObject*) \ + BUILTIN(PyTruffle_Unicode_AsWideChar, PyObject*, PyObject*, int) \ + BUILTIN(PyTruffle_Unicode_FromFormat, PyObject*, const char*, va_list*) \ + BUILTIN(PyTruffle_tss_create, long) \ + BUILTIN(PyTruffle_tss_delete, void, long) \ + BUILTIN(PyTruffle_tss_get, void*, long) \ + BUILTIN(PyTruffle_tss_set, int, long, void*) \ + BUILTIN(PyTuple_GetItem, PyObject*, PyObject*, Py_ssize_t) \ + BUILTIN(PyTuple_GetSlice, PyObject*, PyObject*, Py_ssize_t, Py_ssize_t) \ + BUILTIN(PyTuple_New, PyObject*, Py_ssize_t) \ + BUILTIN(PyTuple_SetItem, int, PyObject*, Py_ssize_t, PyObject*) \ + BUILTIN(PyTuple_Size, Py_ssize_t, PyObject*) \ + BUILTIN(PyType_IsSubtype, int, PyTypeObject*, PyTypeObject*) \ + BUILTIN(PyUnicodeDecodeError_Create, PyObject*, const char*, const char*, Py_ssize_t, Py_ssize_t, Py_ssize_t, const char*) \ + BUILTIN(PyUnicode_AsEncodedString, PyObject*, PyObject*, const char*, const char*) \ + BUILTIN(PyUnicode_AsUnicodeEscapeString, PyObject*, PyObject*) \ + BUILTIN(PyUnicode_Compare, int, PyObject*, PyObject*) \ + BUILTIN(PyUnicode_Concat, PyObject*, PyObject*, PyObject*) \ + BUILTIN(PyUnicode_Contains, int, PyObject*, PyObject*) \ + BUILTIN(PyUnicode_Count, Py_ssize_t, PyObject*, PyObject*, Py_ssize_t, Py_ssize_t) \ + BUILTIN(PyUnicode_DecodeFSDefault, PyObject*, const char*) \ + BUILTIN(PyUnicode_EncodeFSDefault, PyObject*, PyObject*) \ + BUILTIN(PyUnicode_FindChar, Py_ssize_t, PyObject*, Py_UCS4, Py_ssize_t, Py_ssize_t, int) \ + BUILTIN(PyUnicode_Format, PyObject*, PyObject*, PyObject*) \ + BUILTIN(PyUnicode_FromEncodedObject, PyObject*, PyObject*, const char*, const char*) \ + BUILTIN(PyUnicode_FromObject, PyObject*, PyObject*) \ + BUILTIN(PyUnicode_FromOrdinal, PyObject*, int) \ + BUILTIN(PyUnicode_FromString, PyObject*, const char*) \ + BUILTIN(PyUnicode_FromWideChar, PyObject*, const wchar_t*, Py_ssize_t) \ + BUILTIN(PyUnicode_Join, PyObject*, PyObject*, PyObject*) \ + BUILTIN(PyUnicode_ReadChar, Py_UCS4, PyObject*, Py_ssize_t) \ + BUILTIN(PyUnicode_Replace, PyObject*, PyObject*, PyObject*, PyObject*, Py_ssize_t) \ + BUILTIN(PyUnicode_Split, PyObject*, PyObject*, PyObject*, Py_ssize_t) \ + BUILTIN(PyUnicode_Substring, PyObject*, PyObject*, Py_ssize_t, Py_ssize_t) \ + BUILTIN(PyUnicode_Tailmatch, Py_ssize_t, PyObject*, PyObject*, Py_ssize_t, Py_ssize_t, int) \ + BUILTIN(PyWeakref_GetObject, PyObject*, PyObject*) \ + BUILTIN(PyWeakref_NewRef, PyObject*, PyObject*, PyObject*) \ + BUILTIN(Py_AtExit, int, void (*)(void)) \ + BUILTIN(Py_CompileString, PyObject*, const char*, const char*, int) \ + BUILTIN(Py_CompileStringExFlags, PyObject*, const char*, const char*, int, PyCompilerFlags*, int) \ + BUILTIN(Py_CompileStringObject, PyObject*, const char*, PyObject*, int, PyCompilerFlags*, int) \ + BUILTIN(Py_EnterRecursiveCall, int, const char*) \ + BUILTIN(Py_GenericAlias, PyObject*, PyObject*, PyObject*) \ + BUILTIN(Py_LeaveRecursiveCall, void) \ + BUILTIN(Py_get_PyASCIIObject_length, Py_ssize_t, PyASCIIObject*) \ + BUILTIN(Py_get_PyASCIIObject_state_ascii, unsigned int, PyASCIIObject*) \ + BUILTIN(Py_get_PyASCIIObject_state_compact, unsigned int, PyASCIIObject*) \ + BUILTIN(Py_get_PyASCIIObject_state_kind, unsigned int, PyASCIIObject*) \ + BUILTIN(Py_get_PyASCIIObject_state_ready, unsigned int, PyASCIIObject*) \ + BUILTIN(Py_get_PyASCIIObject_wstr, wchar_t*, PyASCIIObject*) \ + BUILTIN(Py_get_PyByteArrayObject_ob_exports, Py_ssize_t, PyByteArrayObject*) \ + BUILTIN(Py_get_PyByteArrayObject_ob_start, void*, PyByteArrayObject*) \ + BUILTIN(Py_get_PyCFunctionObject_m_ml, PyMethodDef*, PyCFunctionObject*) \ + BUILTIN(Py_get_PyCFunctionObject_m_module, PyObject*, PyCFunctionObject*) \ + BUILTIN(Py_get_PyCFunctionObject_m_self, PyObject*, PyCFunctionObject*) \ + BUILTIN(Py_get_PyCFunctionObject_m_weakreflist, PyObject*, PyCFunctionObject*) \ + BUILTIN(Py_get_PyCFunctionObject_vectorcall, vectorcallfunc, PyCFunctionObject*) \ + BUILTIN(Py_get_PyCMethodObject_mm_class, PyTypeObject*, PyCMethodObject*) \ + BUILTIN(Py_get_PyCompactUnicodeObject_wstr_length, Py_ssize_t, PyCompactUnicodeObject*) \ + BUILTIN(Py_get_PyDescrObject_d_name, PyObject*, PyDescrObject*) \ + BUILTIN(Py_get_PyDescrObject_d_type, PyTypeObject*, PyDescrObject*) \ + BUILTIN(Py_get_PyFrameObject_f_lineno, int, PyFrameObject*) \ + BUILTIN(Py_get_PyGetSetDef_closure, void*, PyGetSetDef*) \ + BUILTIN(Py_get_PyGetSetDef_doc, const char*, PyGetSetDef*) \ + BUILTIN(Py_get_PyGetSetDef_get, getter, PyGetSetDef*) \ + BUILTIN(Py_get_PyGetSetDef_name, const char*, PyGetSetDef*) \ + BUILTIN(Py_get_PyGetSetDef_set, setter, PyGetSetDef*) \ + BUILTIN(Py_get_PyInstanceMethodObject_func, PyObject*, PyInstanceMethodObject*) \ + BUILTIN(Py_get_PyListObject_ob_item, PyObject**, PyListObject*) \ + BUILTIN(Py_get_PyMethodDef_ml_doc, void*, PyMethodDef*) \ + BUILTIN(Py_get_PyMethodDef_ml_flags, int, PyMethodDef*) \ + BUILTIN(Py_get_PyMethodDef_ml_meth, PyCFunction, PyMethodDef*) \ + BUILTIN(Py_get_PyMethodDef_ml_name, void*, PyMethodDef*) \ + BUILTIN(Py_get_PyMethodDescrObject_d_method, PyMethodDef*, PyMethodDescrObject*) \ + BUILTIN(Py_get_PyMethodObject_im_func, PyObject*, PyMethodObject*) \ + BUILTIN(Py_get_PyMethodObject_im_self, PyObject*, PyMethodObject*) \ + BUILTIN(Py_get_PyModuleDef_m_doc, const char*, PyModuleDef*) \ + BUILTIN(Py_get_PyModuleDef_m_methods, PyMethodDef*, PyModuleDef*) \ + BUILTIN(Py_get_PyModuleDef_m_name, const char*, PyModuleDef*) \ + BUILTIN(Py_get_PyModuleDef_m_size, Py_ssize_t, PyModuleDef*) \ + BUILTIN(Py_get_PyModuleObject_md_def, PyModuleDef*, PyModuleObject*) \ + BUILTIN(Py_get_PyModuleObject_md_dict, PyObject*, PyModuleObject*) \ + BUILTIN(Py_get_PyModuleObject_md_state, void*, PyModuleObject*) \ + BUILTIN(Py_get_PyObject_ob_refcnt, Py_ssize_t, PyObject*) \ + BUILTIN(Py_get_PyObject_ob_type, PyTypeObject*, PyObject*) \ + BUILTIN(Py_get_PySetObject_used, Py_ssize_t, PySetObject*) \ + BUILTIN(Py_get_PySliceObject_start, PyObject*, PySliceObject*) \ + BUILTIN(Py_get_PySliceObject_step, PyObject*, PySliceObject*) \ + BUILTIN(Py_get_PySliceObject_stop, PyObject*, PySliceObject*) \ + BUILTIN(Py_get_PyTupleObject_ob_item, PyObject**, PyTupleObject*) \ + BUILTIN(Py_get_PyUnicodeObject_data, void*, PyUnicodeObject*) \ + BUILTIN(Py_get_PyVarObject_ob_size, Py_ssize_t, PyVarObject*) \ + BUILTIN(Py_get_dummy, void*, void*) \ + BUILTIN(Py_set_PyByteArrayObject_ob_exports, void, PyByteArrayObject*, int) \ + BUILTIN(Py_set_PyFrameObject_f_lineno, void, PyFrameObject*, int) \ + BUILTIN(Py_set_PyModuleObject_md_def, void, PyModuleObject*, PyModuleDef*) \ + BUILTIN(Py_set_PyModuleObject_md_state, void, PyModuleObject*, void*) \ + BUILTIN(Py_set_PyObject_ob_refcnt, void, PyObject*, Py_ssize_t) \ + BUILTIN(Py_set_PyTypeObject_tp_as_buffer, void, PyTypeObject*, PyBufferProcs*) \ + BUILTIN(Py_set_PyTypeObject_tp_base, void, PyTypeObject*, PyTypeObject*) \ + BUILTIN(Py_set_PyTypeObject_tp_bases, void, PyTypeObject*, PyObject*) \ + BUILTIN(Py_set_PyTypeObject_tp_clear, void, PyTypeObject*, inquiry) \ + BUILTIN(Py_set_PyTypeObject_tp_dict, void, PyTypeObject*, PyObject*) \ + BUILTIN(Py_set_PyTypeObject_tp_dictoffset, void, PyTypeObject*, Py_ssize_t) \ + BUILTIN(Py_set_PyTypeObject_tp_finalize, void, PyTypeObject*, destructor) \ + BUILTIN(Py_set_PyTypeObject_tp_getattr, void, PyTypeObject*, getattrfunc) \ + BUILTIN(Py_set_PyTypeObject_tp_getattro, void, PyTypeObject*, getattrofunc) \ + BUILTIN(Py_set_PyTypeObject_tp_iter, void, PyTypeObject*, getiterfunc) \ + BUILTIN(Py_set_PyTypeObject_tp_iternext, void, PyTypeObject*, iternextfunc) \ + BUILTIN(Py_set_PyTypeObject_tp_mro, void, PyTypeObject*, PyObject*) \ + BUILTIN(Py_set_PyTypeObject_tp_new, void, PyTypeObject*, newfunc) \ + BUILTIN(Py_set_PyTypeObject_tp_setattr, void, PyTypeObject*, setattrfunc) \ + BUILTIN(Py_set_PyTypeObject_tp_setattro, void, PyTypeObject*, setattrofunc) \ + BUILTIN(Py_set_PyTypeObject_tp_subclasses, void, PyTypeObject*, PyObject*) \ + BUILTIN(Py_set_PyTypeObject_tp_traverse, void, PyTypeObject*, traverseproc) \ + BUILTIN(Py_set_PyTypeObject_tp_weaklistoffset, void, PyTypeObject*, Py_ssize_t) \ + BUILTIN(Py_set_PyVarObject_ob_size, void, PyVarObject*, Py_ssize_t) \ + BUILTIN(_PyArray_Data, char*, PyObject*) \ + BUILTIN(_PyArray_Resize, int, PyObject*, Py_ssize_t) \ + BUILTIN(_PyBytes_Join, PyObject*, PyObject*, PyObject*) \ + BUILTIN(_PyDict_Pop, PyObject*, PyObject*, PyObject*, PyObject*) \ + BUILTIN(_PyDict_SetItem_KnownHash, int, PyObject*, PyObject*, PyObject*, Py_hash_t) \ + BUILTIN(_PyErr_BadInternalCall, void, const char*, int) \ + BUILTIN(_PyErr_ChainExceptions, void, PyObject*, PyObject*, PyObject*) \ + BUILTIN(_PyErr_Occurred, PyObject*, PyThreadState*) \ + BUILTIN(_PyErr_WriteUnraisableMsg, void, const char*, PyObject*) \ + BUILTIN(_PyList_Extend, PyObject*, PyListObject*, PyObject*) \ + BUILTIN(_PyList_SET_ITEM, void, PyObject*, Py_ssize_t, PyObject*) \ + BUILTIN(_PyLong_AsByteArray, int, PyLongObject*, unsigned char*, size_t, int, int) \ + BUILTIN(_PyLong_Sign, int, PyObject*) \ + BUILTIN(_PyNamespace_New, PyObject*, PyObject*) \ + BUILTIN(_PyNumber_Index, PyObject*, PyObject*) \ + BUILTIN(_PyObject_Dump, void, PyObject*) \ + BUILTIN(_PyObject_MakeTpCall, PyObject*, PyThreadState*, PyObject*, PyObject*const*, Py_ssize_t, PyObject*) \ + BUILTIN(_PyTraceMalloc_NewReference, int, PyObject*) \ + BUILTIN(_PyTraceback_Add, void, const char*, const char*, int) \ + BUILTIN(_PyTruffleBytes_Resize, int, PyObject*, Py_ssize_t) \ + BUILTIN(_PyTruffleErr_CreateAndSetException, void, PyObject*, PyObject*) \ + BUILTIN(_PyTruffleErr_Warn, PyObject*, PyObject*, PyObject*, Py_ssize_t, PyObject*) \ + BUILTIN(_PyTruffleEval_EvalCodeEx, PyObject*, PyObject*, PyObject*, PyObject*, PyObject*const*, int, PyObject*const*, int, PyObject*const*, int, PyObject*, PyObject*) \ + BUILTIN(_PyTruffleModule_CreateInitialized_PyModule_New, PyModuleObject*, const char*) \ + BUILTIN(_PyTruffleModule_GetAndIncMaxModuleNumber, Py_ssize_t) \ + BUILTIN(_PyTruffleObject_Call1, PyObject*, PyObject*, PyObject*, PyObject*, int) \ + BUILTIN(_PyTruffleObject_CallMethod1, PyObject*, PyObject*, const char*, PyObject*, int) \ + BUILTIN(_PyTruffleSet_NextEntry, PyObject*, PyObject*, Py_ssize_t) \ + BUILTIN(_PyTuple_SET_ITEM, int, PyObject*, Py_ssize_t, PyObject*) \ + BUILTIN(_PyType_Lookup, PyObject*, PyTypeObject*, PyObject*) \ + BUILTIN(_PyUnicode_AsASCIIString, PyObject*, PyObject*, const char*) \ + BUILTIN(_PyUnicode_AsLatin1String, PyObject*, PyObject*, const char*) \ + BUILTIN(_PyUnicode_AsUTF8String, PyObject*, PyObject*, const char*) \ + BUILTIN(_PyUnicode_EqualToASCIIString, int, PyObject*, const char*) \ + BUILTIN(_Py_GetErrorHandler, _Py_error_handler, const char*) \ + BUILTIN(_Py_HashBytes, Py_hash_t, const void*, Py_ssize_t) \ + BUILTIN(_Py_HashDouble, Py_hash_t, PyObject*, double) \ + +// {{end CAPI_BUILTINS}} + +#define STUB(NAME, RET, ...) extern RET NAME(__VA_ARGS__); +STUB_DEFS +#undef STUB + +#endif //GRAALPYTHON_EMBED_H diff --git a/graalpython/com.oracle.graal.python.c_embed/src/graalpython-embed.c b/graalpython/com.oracle.graal.python.c_embed/src/graalpython-embed.c new file mode 100644 index 0000000000..72607874b2 --- /dev/null +++ b/graalpython/com.oracle.graal.python.c_embed/src/graalpython-embed.c @@ -0,0 +1,294 @@ +#include +#include +#include /* For offsetof */ +#include "Python.h" +#include "exports.h" +#include "pyport.h" +#include "object.h" +#include "datetime.h" +#include "structmember.h" +#include +#include + + +static graal_isolatethread_t* graal_thread = NULL; + +PyAPI_FUNC(int) Py_IsInitialized() { + return graal_thread != NULL; +} + +PyAPI_FUNC(void) Py_InitializeEx(int initsigs) { + assert(graal_thread == NULL); + if(graal_create_isolate(NULL, NULL, &graal_thread) != 0) { + fprintf(stderr, "graal_create_isolate failed\n"); + return; + } + fprintf(stderr, "graal_create_isolate succeeded\n"); + + graalpy_init_embed(graal_thread); + + fprintf(stderr, "graalpy_init_embed succeeded, acquire GIL\n"); + // accuire GIL + PyGILState_STATE gstate; + gstate = PyGILState_Ensure(); + + fprintf(stderr, "got GIL\n"); +} + +static void unimplemented(const char* name) { + printf("Function not implemented in graalpython-embed: %s\n", name); +} + +#define FUNC_NOT_IMPLEMENTED unimplemented(__func__); exit(-1); + + +// {{start CAPI_BUILTINS}} +// GENERATED CODE - see CApiCodeGen +// This can be re-generated using the 'mx python-capi-forwards' command or +// by executing the main class CApiCodeGen + +PyAPI_FUNC(int64_t*) PyTruffle_constants() { + static int64_t constants[] = { + (int64_t) PYLONG_BITS_IN_DIGIT, + (int64_t) READONLY, + (int64_t) CHAR_MIN, + 0xdead1111 // marker value + }; + return constants; +} +PyAPI_FUNC(Py_ssize_t*) PyTruffle_struct_offsets() { + static Py_ssize_t offsets[] = { + offsetof(PyObject, ob_refcnt), + offsetof(PyObject, ob_type), + offsetof(PyVarObject, ob_size), + offsetof(PyModuleDef, m_name), + offsetof(PyModuleDef, m_doc), + offsetof(PyModuleDef, m_size), + offsetof(PyModuleDef, m_methods), + offsetof(PyModuleDef, m_slots), + offsetof(PyModuleDef, m_traverse), + offsetof(PyModuleDef, m_clear), + offsetof(PyModuleDef, m_free), + offsetof(PyModuleDef_Slot, slot), + offsetof(PyModuleDef_Slot, value), + offsetof(PyMethodDef, ml_name), + offsetof(PyMethodDef, ml_meth), + offsetof(PyMethodDef, ml_flags), + offsetof(PyMethodDef, ml_doc), + offsetof(PyMemoryViewObject, hash), + offsetof(PyMemoryViewObject, flags), + offsetof(PyMemoryViewObject, exports), + offsetof(PyMemoryViewObject, view), + offsetof(PyMemoryViewObject, ob_array), + offsetof(Py_buffer, buf), + offsetof(Py_buffer, obj), + offsetof(Py_buffer, len), + offsetof(Py_buffer, itemsize), + offsetof(Py_buffer, readonly), + offsetof(Py_buffer, ndim), + offsetof(Py_buffer, format), + offsetof(Py_buffer, shape), + offsetof(Py_buffer, strides), + offsetof(Py_buffer, suboffsets), + offsetof(Py_buffer, internal), + offsetof(PyDateTime_CAPI, DateType), + offsetof(PyDateTime_CAPI, DateTimeType), + offsetof(PyDateTime_CAPI, TimeType), + offsetof(PyDateTime_CAPI, DeltaType), + offsetof(PyDateTime_CAPI, TZInfoType), + offsetof(PyDateTime_CAPI, TimeZone_UTC), + offsetof(PyDateTime_CAPI, Date_FromDate), + offsetof(PyDateTime_CAPI, DateTime_FromDateAndTime), + offsetof(PyDateTime_CAPI, Time_FromTime), + offsetof(PyDateTime_CAPI, Delta_FromDelta), + offsetof(PyDateTime_CAPI, TimeZone_FromTimeZone), + offsetof(PyDateTime_CAPI, DateTime_FromTimestamp), + offsetof(PyDateTime_CAPI, Date_FromTimestamp), + offsetof(PyDateTime_CAPI, DateTime_FromDateAndTimeAndFold), + offsetof(PyDateTime_CAPI, Time_FromTimeAndFold), + offsetof(PyNumberMethods, nb_add), + offsetof(PyNumberMethods, nb_subtract), + offsetof(PyNumberMethods, nb_multiply), + offsetof(PyNumberMethods, nb_remainder), + offsetof(PyNumberMethods, nb_divmod), + offsetof(PyNumberMethods, nb_power), + offsetof(PyNumberMethods, nb_negative), + offsetof(PyNumberMethods, nb_positive), + offsetof(PyNumberMethods, nb_absolute), + offsetof(PyNumberMethods, nb_bool), + offsetof(PyNumberMethods, nb_invert), + offsetof(PyNumberMethods, nb_lshift), + offsetof(PyNumberMethods, nb_rshift), + offsetof(PyNumberMethods, nb_and), + offsetof(PyNumberMethods, nb_xor), + offsetof(PyNumberMethods, nb_or), + offsetof(PyNumberMethods, nb_int), + offsetof(PyNumberMethods, nb_reserved), + offsetof(PyNumberMethods, nb_float), + offsetof(PyNumberMethods, nb_inplace_add), + offsetof(PyNumberMethods, nb_inplace_subtract), + offsetof(PyNumberMethods, nb_inplace_multiply), + offsetof(PyNumberMethods, nb_inplace_remainder), + offsetof(PyNumberMethods, nb_inplace_power), + offsetof(PyNumberMethods, nb_inplace_lshift), + offsetof(PyNumberMethods, nb_inplace_rshift), + offsetof(PyNumberMethods, nb_inplace_and), + offsetof(PyNumberMethods, nb_inplace_xor), + offsetof(PyNumberMethods, nb_inplace_or), + offsetof(PyNumberMethods, nb_floor_divide), + offsetof(PyNumberMethods, nb_true_divide), + offsetof(PyNumberMethods, nb_inplace_floor_divide), + offsetof(PyNumberMethods, nb_inplace_true_divide), + offsetof(PyNumberMethods, nb_index), + offsetof(PyNumberMethods, nb_matrix_multiply), + offsetof(PyNumberMethods, nb_inplace_matrix_multiply), + offsetof(PySequenceMethods, sq_length), + offsetof(PySequenceMethods, sq_concat), + offsetof(PySequenceMethods, sq_repeat), + offsetof(PySequenceMethods, sq_item), + offsetof(PySequenceMethods, was_sq_slice), + offsetof(PySequenceMethods, sq_ass_item), + offsetof(PySequenceMethods, was_sq_ass_slice), + offsetof(PySequenceMethods, sq_contains), + offsetof(PySequenceMethods, sq_inplace_concat), + offsetof(PySequenceMethods, sq_inplace_repeat), + offsetof(PyMappingMethods, mp_length), + offsetof(PyMappingMethods, mp_subscript), + offsetof(PyMappingMethods, mp_ass_subscript), + offsetof(PyAsyncMethods, am_await), + offsetof(PyAsyncMethods, am_aiter), + offsetof(PyAsyncMethods, am_anext), + offsetof(PyAsyncMethods, am_send), + offsetof(PyBufferProcs, bf_getbuffer), + offsetof(PyBufferProcs, bf_releasebuffer), + offsetof(PyTypeObject, tp_name), + offsetof(PyTypeObject, tp_basicsize), + offsetof(PyTypeObject, tp_itemsize), + offsetof(PyTypeObject, tp_dealloc), + offsetof(PyTypeObject, tp_vectorcall_offset), + offsetof(PyTypeObject, tp_getattr), + offsetof(PyTypeObject, tp_setattr), + offsetof(PyTypeObject, tp_as_async), + offsetof(PyTypeObject, tp_repr), + offsetof(PyTypeObject, tp_as_number), + offsetof(PyTypeObject, tp_as_sequence), + offsetof(PyTypeObject, tp_as_mapping), + offsetof(PyTypeObject, tp_hash), + offsetof(PyTypeObject, tp_call), + offsetof(PyTypeObject, tp_str), + offsetof(PyTypeObject, tp_getattro), + offsetof(PyTypeObject, tp_setattro), + offsetof(PyTypeObject, tp_as_buffer), + offsetof(PyTypeObject, tp_flags), + offsetof(PyTypeObject, tp_doc), + offsetof(PyTypeObject, tp_traverse), + offsetof(PyTypeObject, tp_clear), + offsetof(PyTypeObject, tp_richcompare), + offsetof(PyTypeObject, tp_weaklistoffset), + offsetof(PyTypeObject, tp_iter), + offsetof(PyTypeObject, tp_iternext), + offsetof(PyTypeObject, tp_methods), + offsetof(PyTypeObject, tp_members), + offsetof(PyTypeObject, tp_getset), + offsetof(PyTypeObject, tp_base), + offsetof(PyTypeObject, tp_dict), + offsetof(PyTypeObject, tp_descr_get), + offsetof(PyTypeObject, tp_descr_set), + offsetof(PyTypeObject, tp_dictoffset), + offsetof(PyTypeObject, tp_init), + offsetof(PyTypeObject, tp_alloc), + offsetof(PyTypeObject, tp_new), + offsetof(PyTypeObject, tp_free), + offsetof(PyTypeObject, tp_is_gc), + offsetof(PyTypeObject, tp_bases), + offsetof(PyTypeObject, tp_mro), + offsetof(PyTypeObject, tp_cache), + offsetof(PyTypeObject, tp_subclasses), + offsetof(PyTypeObject, tp_weaklist), + offsetof(PyTypeObject, tp_del), + offsetof(PyTypeObject, tp_version_tag), + offsetof(PyTypeObject, tp_finalize), + offsetof(PyTypeObject, tp_vectorcall), + offsetof(PyBytesObject, ob_shash), + offsetof(PyBytesObject, ob_sval), + offsetof(PyListObject, ob_item), + offsetof(PyListObject, allocated), + offsetof(PyTupleObject, ob_item), + offsetof(PyFloatObject, ob_fval), + offsetof(PyModuleDef_Base, m_index), + offsetof(PyComplexObject, cval.real), + offsetof(PyComplexObject, cval.imag), + offsetof(PyASCIIObject, length), + offsetof(PyASCIIObject, hash), + offsetof(PyASCIIObject, state), + offsetof(PyASCIIObject, wstr), + offsetof(PyCompactUnicodeObject, utf8_length), + offsetof(PyCompactUnicodeObject, utf8), + offsetof(PyCompactUnicodeObject, wstr_length), + offsetof(PyUnicodeObject, data), + offsetof(PyGetSetDef, name), + offsetof(PyGetSetDef, get), + offsetof(PyGetSetDef, set), + offsetof(PyGetSetDef, doc), + offsetof(PyGetSetDef, closure), + offsetof(PyMemberDef, name), + offsetof(PyMemberDef, type), + offsetof(PyMemberDef, offset), + offsetof(PyMemberDef, flags), + offsetof(PyMemberDef, doc), + offsetof(PyThreadState, interp), + offsetof(PyThreadState, dict), + offsetof(PyBaseExceptionObject, dict), + offsetof(PyBaseExceptionObject, args), + offsetof(PyBaseExceptionObject, traceback), + offsetof(PyBaseExceptionObject, context), + offsetof(PyBaseExceptionObject, cause), + offsetof(PyBaseExceptionObject, suppress_context), + 0xdead2222 // marker value + }; + return offsets; +} +PyAPI_FUNC(Py_ssize_t*) PyTruffle_struct_sizes() { + static Py_ssize_t sizes[] = { + sizeof(PyModuleDef), + sizeof(PyModuleDef_Slot), + sizeof(PyMethodDef), + sizeof(PyObject), + sizeof(PyBytesObject), + sizeof(PyListObject), + sizeof(PyVarObject), + sizeof(PyMemoryViewObject), + sizeof(Py_buffer), + sizeof(PyDateTime_CAPI), + sizeof(PyNumberMethods), + sizeof(PySequenceMethods), + sizeof(PyMappingMethods), + sizeof(PyAsyncMethods), + sizeof(PyBufferProcs), + sizeof(PyTypeObject), + sizeof(PyTupleObject), + sizeof(PyFloatObject), + sizeof(PyLongObject), + sizeof(PyModuleDef_Base), + sizeof(PyComplexObject), + sizeof(PyDateTime_Date), + sizeof(PyDateTime_Time), + sizeof(PyDateTime_DateTime), + sizeof(PyDateTime_Delta), + sizeof(PyASCIIObject), + sizeof(PyCompactUnicodeObject), + sizeof(PyBaseExceptionObject), + sizeof(PyUnicodeObject), + sizeof(Py_UNICODE), + sizeof(PyGetSetDef), + sizeof(PyMemberDef), + sizeof(PyThreadState), + sizeof(wchar_t), + sizeof(long long), + sizeof(Py_ssize_t), + 0xdead3333 // marker value + }; + return sizes; +} +// {{end CAPI_BUILTINS}} + diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/PythonLanguage.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/PythonLanguage.java index 8da1528028..d504c8f37f 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/PythonLanguage.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/PythonLanguage.java @@ -940,6 +940,7 @@ protected void initializeMultiThreading(PythonContext context) { @Override protected void initializeThread(PythonContext context, Thread thread) { + LOGGER.info("PythonLanguage.initializeThread"); context.attachThread(thread, threadState); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextCEvalBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextCEvalBuiltins.java index d834c1eef1..4e21c62719 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextCEvalBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextCEvalBuiltins.java @@ -103,7 +103,9 @@ abstract static class PyEval_SaveThread extends CApiNullaryBuiltinNode { @Specialization static Object save(@Cached GilNode gil) { + // LOGGER.info("PyEval_SaveThread gil defined: " + (gil != null)); PythonContext context = PythonContext.get(gil); + LOGGER.info(() -> "PyEval_SaveThread context defined: " + (context != null)); Object threadState = PThreadState.getThreadState(PythonLanguage.get(gil), context); LOGGER.fine("C extension releases GIL"); gil.release(context, true); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/CApiCodeGen.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/CApiCodeGen.java index 86bbf009e3..baeb5b0cc8 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/CApiCodeGen.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/CApiCodeGen.java @@ -142,7 +142,7 @@ private static Path resolvePath(Path path) { * * @return true if the file was modified, false if there were no changes */ - private static boolean writeGenerated(Path path, List contents) throws IOException { + static boolean writeGenerated(Path path, List contents) throws IOException { Path capi = CApiCodeGen.resolvePath(path); List lines = Files.readAllLines(capi); int start = -1; @@ -440,6 +440,8 @@ public static void main(String[] args) throws IOException { changed |= generateCApiHeader(javaBuiltins); changed |= generateBuiltinRegistry(javaBuiltins); changed |= checkImports(allBuiltins); + changed |= CEmbedCodeGen.generateCPyEmbedHeader(javaBuiltins); + changed |= CEmbedCodeGen.generateCPyEmbedSource(javaBuiltins); if (changed) { System.exit(-1); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/CApiContext.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/CApiContext.java index 95d83ecdc2..12e211637a 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/CApiContext.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/CApiContext.java @@ -530,21 +530,26 @@ public int getId() { @TruffleBoundary public static CApiContext ensureCapiWasLoaded() { try { + System.out.println("ensureCapiWasLoaded called python context: " + PythonContext.get(null)); return CApiContext.ensureCapiWasLoaded(null, PythonContext.get(null), T_EMPTY_STRING, T_EMPTY_STRING); } catch (Exception e) { + System.err.println("Error loading CAPI: " + e.getMessage()); throw CompilerDirectives.shouldNotReachHere(e); } } @TruffleBoundary public static CApiContext ensureCapiWasLoaded(Node node, PythonContext context, TruffleString name, TruffleString path) throws IOException, ImportException, ApiInitException { + System.err.println("ensureCapiWasLoaded called with context " + context + " and name " + name + " and path " + path + " and node " + node); if (!context.hasCApiContext()) { + System.err.println("Loading CAPI"); Env env = context.getEnv(); InteropLibrary U = InteropLibrary.getUncached(); TruffleFile homePath = env.getInternalTruffleFile(context.getCAPIHome().toJavaStringUncached()); // e.g. "libpython-native.so" String libName = context.getLLVMSupportExt("python"); + System.err.println("Loading CAPI from " + libName); TruffleFile capiFile = homePath.resolve(libName).getCanonicalFile(LinkOption.NOFOLLOW_LINKS); try { SourceBuilder capiSrcBuilder; @@ -555,11 +560,12 @@ public static CApiContext ensureCapiWasLoaded(Node node, PythonContext context, LOGGER.warning("GraalPy option 'NativeModules' is set to true, " + "but only one context in the process can use native modules, " + "second and other contexts fallback to NativeModules=false and " + - "will use LLVM bitcode execution via GraalVM LLVM."); + "will use LLVM bitcode executxion via GraalVM LLVM."); } } else { useNative = false; } + LOGGER.info(() -> "Loading CAPI from " + capiFile + " as " + (useNative ? "native" : "bitcode")); if (useNative) { context.ensureNFILanguage(node, "NativeModules", "true"); capiSrcBuilder = Source.newBuilder(J_NFI_LANGUAGE, "load(RTLD_GLOBAL) \"" + capiFile.getPath() + "\"", ""); @@ -570,26 +576,32 @@ public static CApiContext ensureCapiWasLoaded(Node node, PythonContext context, if (!context.getLanguage().getEngineOption(PythonOptions.ExposeInternalSources)) { capiSrcBuilder.internal(true); } - LOGGER.config(() -> "loading CAPI from " + capiFile + " as " + (useNative ? "native" : "bitcode")); + LOGGER.info(() -> "loading CAPI from " + capiFile + " as " + (useNative ? "native" : "bitcode")); CallTarget capiLibraryCallTarget = context.getEnv().parseInternal(capiSrcBuilder.build()); Object capiLibrary = capiLibraryCallTarget.call(); + LOGGER.info(() -> "Checking init function"); Object initFunction = U.readMember(capiLibrary, "initialize_graal_capi"); CApiContext cApiContext = new CApiContext(context, capiLibrary, useNative); context.setCApiContext(cApiContext); if (!U.isExecutable(initFunction)) { Object signature = env.parseInternal(Source.newBuilder(J_NFI_LANGUAGE, "(ENV,(SINT32):POINTER):VOID", "exec").build()).call(); initFunction = SignatureLibrary.getUncached().bind(signature, initFunction); + LOGGER.info(() -> "Bound & calling init function"); U.execute(initFunction, new GetBuiltin()); } else { + LOGGER.info(() -> "Executing init function"); U.execute(initFunction, NativePointer.createNull(), new GetBuiltin()); } - + LOGGER.info(() -> "Checking builtins"); assert CApiCodeGen.assertBuiltins(capiLibrary); + LOGGER.info(() -> "initWrapper"); cApiContext.pyDateTimeCAPICapsule = PyDateTimeCAPIWrapper.initWrapper(context, cApiContext); + LOGGER.info(() -> "runCApiHooks"); context.runCApiHooks(); if (useNative) { + LOGGER.info(() -> "registering native finalizer"); /* * C++ libraries sometimes declare global objects that have destructors that * call Py_DECREF. Those destructors are then called during native shutdown, @@ -609,7 +621,7 @@ public static CApiContext ensureCapiWasLoaded(Node node, PythonContext context, LOGGER.warning(() -> "didn't register a native finalizer due to: " + e.getMessage()); } } - + LOGGER.info(() -> "loaded CAPI from " + capiFile + " as " + (useNative ? "native" : "bitcode") + " successfully"); return cApiContext; } catch (PException e) { /* diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/CEmbedBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/CEmbedBuiltins.java new file mode 100644 index 0000000000..df39e281da --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/CEmbedBuiltins.java @@ -0,0 +1,28 @@ +package com.oracle.graal.python.builtins.objects.cext.capi; + +import com.oracle.graal.python.runtime.GilNode; +import com.oracle.graal.python.runtime.PythonContext; +import org.graalvm.nativeimage.IsolateThread; +import org.graalvm.nativeimage.c.function.CEntryPoint; +import org.graalvm.polyglot.Context; + +public class CEmbedBuiltins { + + static Context pyContext; + + @CEntryPoint(name = "graalpy_init_embed") + public static void GraalPyInitEmbed(IsolateThread thread) { + System.out.println("GraalPyInitEmbed from thread " + thread.rawValue()); + pyContext = Context.newBuilder("python") + .allowAllAccess(true) + .option("python.PythonHome", "/Users/mkind/Dev/Uni/RE23/graal/sdk/mxbuild/darwin-aarch64/PYTHON_NATIVE_STANDALONE_SVM_JAVA21/graalpy-community-24.0.0-dev-macos-aarch64") + .build(); + pyContext.initialize("python"); + pyContext.enter(); + GilNode.getUncached().acquire(); + CApiContext ctx = CApiContext.ensureCapiWasLoaded(); + System.out.println("GraalPyInitEmbed from thread " + thread.rawValue() + " done, got ctx " + ctx.toString()); + // get GIL + + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/CEmbedCodeGen.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/CEmbedCodeGen.java new file mode 100644 index 0000000000..68f4361e34 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/CEmbedCodeGen.java @@ -0,0 +1,129 @@ +package com.oracle.graal.python.builtins.objects.cext.capi; + +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor; +import com.oracle.graal.python.builtins.objects.cext.structs.CConstants; +import com.oracle.graal.python.builtins.objects.cext.structs.CFields; +import com.oracle.graal.python.builtins.objects.cext.structs.CStructs; + +import java.io.IOException; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; + +import static com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiCallPath.Direct; +import static com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiCallPath.NotImplemented; + +public final class CEmbedCodeGen { + + /** + * Generates the c-python compatible header file cpy_embed.h + * to allow embedding GraalPython in other projects that assume + * the CPython C API. + */ + static boolean generateCPyEmbedHeader(List javaBuiltins) throws IOException { + System.out.println("Generating cpy_embed.h"); + List lines = new ArrayList<>(); + lines.add("#define CAPI_BUILTINS \\"); + int id = 0; + for (var entry : javaBuiltins) { + assert (id++) == entry.id; + String line = " BUILTIN(" + entry.name + ", " + entry.returnType.cSignature; + for (var arg : entry.arguments) { + line += ", " + arg.cSignature; + } + line += ") \\"; + lines.add(line); + } + lines.add(""); + + return CApiCodeGen.writeGenerated(Path.of("com.oracle.graal.python.c_embed", "include", "graalpython-embed.h"), lines); + } + + /** + * Generates the c-python compatible source file cpy_embed.c + * to allow embedding GraalPython in other projects that assume + * the CPython C API. + */ + static boolean generateCPyEmbedSource(List javaBuiltins) throws IOException { + System.out.println("Generating graalpython-embed.c"); + List lines = new ArrayList<>(); + for (var entry : javaBuiltins) { + String name = entry.name; + CApiCodeGen.CApiBuiltinDesc value = entry; + if (value.call == NotImplemented) { + lines.add("#undef " + name); + String line = "PyAPI_FUNC(" + value.returnType.cSignature + ") " + name + "("; + for (int i = 0; i < value.arguments.length; i++) { + line += (i == 0 ? "" : ", ") + CApiCodeGen.CApiBuiltinDesc.getArgSignatureWithName(value.arguments[i], i); + } + line += ") {"; + lines.add(line); + System.out.println("Generating " + name + " with call type " + value.call); + if (value.call == Direct) { // DISABLED + line = " " + (value.returnType == ArgDescriptor.Void ? "" : "return ") + "Graal" + name + "("; + for (int i = 0; i < value.arguments.length; i++) { + line += (i == 0 ? "" : ", "); + line += argName(i); + } + line += ");"; + } else { + line = " FUNC_NOT_IMPLEMENTED"; + } + //line = " FUNC_NOT_IMPLEMENTED"; + lines.add(line); + lines.add("}"); + } + } + + lines.add("PyAPI_FUNC(int64_t*) PyTruffle_constants() {"); + lines.add(" static int64_t constants[] = {"); + for (CConstants constant : CConstants.VALUES) { + lines.add(" (int64_t) " + constant.name() + ","); + } + lines.add(" 0xdead1111 // marker value"); + lines.add(" };"); + lines.add(" return constants;"); + lines.add("}"); + lines.add("PyAPI_FUNC(Py_ssize_t*) PyTruffle_struct_offsets() {"); + lines.add(" static Py_ssize_t offsets[] = {"); + for (CFields field : CFields.VALUES) { + int delim = field.name().indexOf("__"); + assert delim != -1; + String struct = field.name().substring(0, delim); + String name = field.name().substring(delim + 2); + name = name.replace("__", "."); // to allow inlined structs + lines.add(" offsetof(" + struct + ", " + name + "),"); + } + lines.add(" 0xdead2222 // marker value"); + lines.add(" };"); + lines.add(" return offsets;"); + lines.add("}"); + lines.add("PyAPI_FUNC(Py_ssize_t*) PyTruffle_struct_sizes() {"); + lines.add(" static Py_ssize_t sizes[] = {"); + for (CStructs struct : CStructs.VALUES) { + lines.add(" sizeof(" + struct.name().replace("__", " ") + "),"); + } + lines.add(" 0xdead3333 // marker value"); + lines.add(" };"); + lines.add(" return sizes;"); + lines.add("}"); + + return CApiCodeGen.writeGenerated(Path.of("com.oracle.graal.python.c_embed", "src", "graalpython-embed.c"), lines); + } + + private static String argName(int i) { + return "" + (char) ('a' + i); + } + + public static void main(String[] args) throws IOException { + List builtins = CApiFunction.getJavaBuiltinDefinitions(); + List javaBuiltins = new ArrayList<>(); + for (CApiCodeGen.CApiBuiltinDesc builtin : builtins) { + if (builtin.id != -1) { + javaBuiltins.add(builtin); + } + } + generateCPyEmbedHeader(javaBuiltins); + generateCPyEmbedSource(javaBuiltins); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PythonContext.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PythonContext.java index dbda35cc2f..b3bb1f2983 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PythonContext.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PythonContext.java @@ -1150,6 +1150,7 @@ public PythonContext(PythonLanguage language, TruffleLanguage.Env env) { private static final ContextReference REFERENCE = ContextReference.create(PythonLanguage.class); public static PythonContext get(Node node) { + // System.out.println("PythonContext.get " + REFERENCE.get(node)); return REFERENCE.get(node); } diff --git a/mx.graalpython/mx_graalpython.py b/mx.graalpython/mx_graalpython.py index 9dd45d043c..832657ad68 100644 --- a/mx.graalpython/mx_graalpython.py +++ b/mx.graalpython/mx_graalpython.py @@ -2274,7 +2274,7 @@ def as_license_regex(name): jar_distributions=['graalpython:GRAALPYTHON-LAUNCHER', 'sdk:MAVEN_DOWNLOADER'], main_class=GRAALPYTHON_MAIN_CLASS, build_args=[ - '-H:+DetectUserDirectoriesInImageHeap', + '-H:-DetectUserDirectoriesInImageHeap', '-H:-CopyLanguageResources', '-Dpolyglot.python.PosixModuleBackend=native', '-Dpolyglot.python.Sha3ModuleBackend=native', diff --git a/mx.graalpython/suite.py b/mx.graalpython/suite.py index 73a3ba4e23..194eb5abc5 100644 --- a/mx.graalpython/suite.py +++ b/mx.graalpython/suite.py @@ -651,6 +651,31 @@ ], }, + "com.oracle.graal.python.c_embed": { + "subDir": "graalpython", + "class": "CMakeNinjaProject", + "toolchain": "sulong:SULONG_BOOTSTRAP_TOOLCHAIN", + "max_jobs": "8", + "vpath": True, + "ninja_targets": ["all"], + "ninja_install_targets": ["install"], + "os_arch": { + "": { + "": { + "cmakeConfig": { + "CEXT_H_INC": "/include", + # TODO make dynamic + "RUNTIME_LIB_DIR": "/Users/mkind/Dev/Uni/RE23/graal/sdk/mxbuild/darwin-aarch64/libpythonvm.dylib.image", + "PYTHON_NATIVE_LIB": "/Users/mkind/Dev/Uni/RE23/graalpython/mxbuild/darwin-aarch64/com.oracle.graal.python.cext/aarch64/bin/libpython-native.dylib" + }, + "results": [ + # "bin/" + # TODO + ], + }, + }, + } + }, "com.oracle.graal.python.cext": { "subDir": "graalpython", "class": "CMakeNinjaProject", pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy