diff --git a/Pythonnet.Runtime/runtime.cs b/Pythonnet.Runtime/runtime.cs index 5e8c0a799e..3c516092dd 100644 --- a/Pythonnet.Runtime/runtime.cs +++ b/Pythonnet.Runtime/runtime.cs @@ -17,20 +17,20 @@ using Mono.Unix; namespace Python.Runtime { - [SuppressUnmanagedCodeSecurityAttribute()] + [SuppressUnmanagedCodeSecurityAttribute()] - public class Runtime { + public class Runtime { - /// - /// Encapsulates the low-level Python C API. Note that it is - /// the responsibility of the caller to have acquired the GIL - /// before calling any of these methods. - /// + /// + /// Encapsulates the low-level Python C API. Note that it is + /// the responsibility of the caller to have acquired the GIL + /// before calling any of these methods. + /// #if (UCS4) public const int UCS = 4; #endif #if (UCS2) - public const int UCS = 2; + public const int UCS = 2; #endif #if ! (UCS2 || UCS4) #error You must define either UCS2 or UCS4! @@ -57,99 +57,99 @@ namespace Python.Runtime { public const int pyversionnumber = 26; #endif #if (PYTHON27) - public const string dll = "python27"; - public const string pyversion = "2.7"; - public const int pyversionnumber = 27; + public const string dll = "python27"; + public const string pyversion = "2.7"; + public const int pyversionnumber = 27; #endif #if ! (PYTHON23 || PYTHON24 || PYTHON25 || PYTHON26 || PYTHON27) #error You must define one of PYTHON23 to PYTHON27 #endif - public static bool wrap_exceptions; - public static bool is32bit; + public static bool wrap_exceptions; + public static bool is32bit; - /// - /// Intitialize the runtime... - /// - public static void Initialize() { + /// + /// Intitialize the runtime... + /// + public static void Initialize() { - is32bit = IntPtr.Size == 4; + is32bit = IntPtr.Size == 4; - Runtime.Py_Initialize(); - Runtime.PyEval_InitThreads(); + Runtime.Py_Initialize(); + Runtime.PyEval_InitThreads(); - IntPtr dict = Runtime.PyImport_GetModuleDict(); - IntPtr op = Runtime.PyDict_GetItemString(dict, "__builtin__"); + IntPtr dict = Runtime.PyImport_GetModuleDict(); + IntPtr op = Runtime.PyDict_GetItemString(dict, "__builtin__"); - PyBaseObjectType = Runtime.PyObject_GetAttrString(op, "object"); + PyBaseObjectType = Runtime.PyObject_GetAttrString(op, "object"); - PyModuleType = Runtime.PyObject_Type(op); - PyNone = Runtime.PyObject_GetAttrString(op, "None"); - PyTrue = Runtime.PyObject_GetAttrString(op, "True"); - PyFalse = Runtime.PyObject_GetAttrString(op, "False"); + PyModuleType = Runtime.PyObject_Type(op); + PyNone = Runtime.PyObject_GetAttrString(op, "None"); + PyTrue = Runtime.PyObject_GetAttrString(op, "True"); + PyFalse = Runtime.PyObject_GetAttrString(op, "False"); - PyBoolType = Runtime.PyObject_Type(PyTrue);> Python.Runtime.Runtime.Initialize() C# + PyBoolType = Runtime.PyObject_Type(PyTrue); - PyNoneType = Runtime.PyObject_Type(PyNone); - PyTypeType = Runtime.PyObject_Type(PyNoneType); + PyNoneType = Runtime.PyObject_Type(PyNone); + PyTypeType = Runtime.PyObject_Type(PyNoneType); - op = Runtime.PyObject_GetAttrString(dict, "keys"); - PyMethodType = Runtime.PyObject_Type(op); - Runtime.Decref(op); + op = Runtime.PyObject_GetAttrString(dict, "keys"); + PyMethodType = Runtime.PyObject_Type(op); + Runtime.Decref(op); - op = Runtime.PyString_FromString("string"); - PyStringType = Runtime.PyObject_Type(op); - Runtime.Decref(op); + op = Runtime.PyString_FromString("string"); + PyStringType = Runtime.PyObject_Type(op); + Runtime.Decref(op); - op = Runtime.PyUnicode_FromString("unicode"); - PyUnicodeType = Runtime.PyObject_Type(op); - Runtime.Decref(op); + op = Runtime.PyUnicode_FromString("unicode"); + PyUnicodeType = Runtime.PyObject_Type(op); + Runtime.Decref(op); - op = Runtime.PyTuple_New(0); - PyTupleType = Runtime.PyObject_Type(op); - Runtime.Decref(op); + op = Runtime.PyTuple_New(0); + PyTupleType = Runtime.PyObject_Type(op); + Runtime.Decref(op); - op = Runtime.PyList_New(0); - PyListType = Runtime.PyObject_Type(op); - Runtime.Decref(op); + op = Runtime.PyList_New(0); + PyListType = Runtime.PyObject_Type(op); + Runtime.Decref(op); - op = Runtime.PyDict_New(); - PyDictType = Runtime.PyObject_Type(op); - Runtime.Decref(op); + op = Runtime.PyDict_New(); + PyDictType = Runtime.PyObject_Type(op); + Runtime.Decref(op); - op = Runtime.PyInt_FromInt32(0); - PyIntType = Runtime.PyObject_Type(op); - Runtime.Decref(op); + op = Runtime.PyInt_FromInt32(0); + PyIntType = Runtime.PyObject_Type(op); + Runtime.Decref(op); - op = Runtime.PyLong_FromLong(0); - PyLongType = Runtime.PyObject_Type(op); - Runtime.Decref(op); + op = Runtime.PyLong_FromLong(0); + PyLongType = Runtime.PyObject_Type(op); + Runtime.Decref(op); - op = Runtime.PyFloat_FromDouble(0); - PyFloatType = Runtime.PyObject_Type(op); - Runtime.Decref(op); + op = Runtime.PyFloat_FromDouble(0); + PyFloatType = Runtime.PyObject_Type(op); + Runtime.Decref(op); - IntPtr s = Runtime.PyString_FromString("_temp"); - IntPtr d = Runtime.PyDict_New(); - IntPtr c = Runtime.PyClass_New(IntPtr.Zero, d, s); - PyClassType = Runtime.PyObject_Type(c); + IntPtr s = Runtime.PyString_FromString("_temp"); + IntPtr d = Runtime.PyDict_New(); + IntPtr c = Runtime.PyClass_New(IntPtr.Zero, d, s); + PyClassType = Runtime.PyObject_Type(c); - IntPtr i = Runtime.PyInstance_New(c, IntPtr.Zero, IntPtr.Zero); - PyInstanceType = Runtime.PyObject_Type(i); + IntPtr i = Runtime.PyInstance_New(c, IntPtr.Zero, IntPtr.Zero); + PyInstanceType = Runtime.PyObject_Type(i); - Runtime.Decref(s); - Runtime.Decref(i); - Runtime.Decref(c); - Runtime.Decref(d); + Runtime.Decref(s); + Runtime.Decref(i); + Runtime.Decref(c); + Runtime.Decref(d); - Error = new IntPtr(-1); + Error = new IntPtr(-1); - // Determine whether we need to wrap exceptions for versions of - // of the Python runtime that do not allow new-style classes to - // be used as exceptions (Python versions 2.4 and lower). + // Determine whether we need to wrap exceptions for versions of + // of the Python runtime that do not allow new-style classes to + // be used as exceptions (Python versions 2.4 and lower). #if (PYTHON25 || PYTHON26 || PYTHON27) - wrap_exceptions = false; + wrap_exceptions = false; #else IntPtr m = PyImport_ImportModule("exceptions"); Exceptions.ErrorCheck(m); @@ -162,202 +162,202 @@ namespace Python.Runtime { Runtime.Decref(m); #endif - // Initialize modules that depend on the runtime class. - AssemblyManager.Initialize(); - PyCLRMetaType = MetaType.Initialize(); - Exceptions.Initialize(); - ImportHook.Initialize(); + // Initialize modules that depend on the runtime class. + AssemblyManager.Initialize(); + PyCLRMetaType = MetaType.Initialize(); + Exceptions.Initialize(); + ImportHook.Initialize(); - // Need to add the runtime directory to sys.path so that we - // can find built-in assemblies like System.Data, et. al. - string rtdir = RuntimeEnvironment.GetRuntimeDirectory(); - IntPtr path = Runtime.PySys_GetObject("path"); - IntPtr item = Runtime.PyString_FromString(rtdir); - Runtime.PyList_Append(path, item); - Runtime.Decref(item); - AssemblyManager.UpdatePath(); - } + // Need to add the runtime directory to sys.path so that we + // can find built-in assemblies like System.Data, et. al. + string rtdir = RuntimeEnvironment.GetRuntimeDirectory(); + IntPtr path = Runtime.PySys_GetObject("path"); + IntPtr item = Runtime.PyString_FromString(rtdir); + Runtime.PyList_Append(path, item); + Runtime.Decref(item); + AssemblyManager.UpdatePath(); + } - public static void Shutdown() { - AssemblyManager.Shutdown(); - Exceptions.Shutdown(); - ImportHook.Shutdown(); - Py_Finalize(); - } + public static void Shutdown() { + AssemblyManager.Shutdown(); + Exceptions.Shutdown(); + ImportHook.Shutdown(); + Py_Finalize(); + } - public static IntPtr Py_single_input = (IntPtr)256; - public static IntPtr Py_file_input = (IntPtr)257; - public static IntPtr Py_eval_input = (IntPtr)258; + public static IntPtr Py_single_input = (IntPtr)256; + public static IntPtr Py_file_input = (IntPtr)257; + public static IntPtr Py_eval_input = (IntPtr)258; - public static IntPtr PyBaseObjectType; - public static IntPtr PyModuleType; - public static IntPtr PyClassType; - public static IntPtr PyInstanceType; - public static IntPtr PyCLRMetaType; - public static IntPtr PyMethodType; + public static IntPtr PyBaseObjectType; + public static IntPtr PyModuleType; + public static IntPtr PyClassType; + public static IntPtr PyInstanceType; + public static IntPtr PyCLRMetaType; + public static IntPtr PyMethodType; - public static IntPtr PyUnicodeType; - public static IntPtr PyStringType; - public static IntPtr PyTupleType; - public static IntPtr PyListType; - public static IntPtr PyDictType; - public static IntPtr PyIntType; - public static IntPtr PyLongType; - public static IntPtr PyFloatType; - public static IntPtr PyBoolType; - public static IntPtr PyNoneType; - public static IntPtr PyTypeType; + public static IntPtr PyUnicodeType; + public static IntPtr PyStringType; + public static IntPtr PyTupleType; + public static IntPtr PyListType; + public static IntPtr PyDictType; + public static IntPtr PyIntType; + public static IntPtr PyLongType; + public static IntPtr PyFloatType; + public static IntPtr PyBoolType; + public static IntPtr PyNoneType; + public static IntPtr PyTypeType; - public static IntPtr PyTrue; - public static IntPtr PyFalse; - public static IntPtr PyNone; - public static IntPtr Error; + public static IntPtr PyTrue; + public static IntPtr PyFalse; + public static IntPtr PyNone; + public static IntPtr Error; - public static IntPtr GetBoundArgTuple(IntPtr obj, IntPtr args) { - if (Runtime.PyObject_TYPE(args) != Runtime.PyTupleType) { - Exceptions.SetError(Exceptions.TypeError, "tuple expected"); - return IntPtr.Zero; - } - int size = Runtime.PyTuple_Size(args); - IntPtr items = Runtime.PyTuple_New(size + 1); - Runtime.PyTuple_SetItem(items, 0, obj); - Runtime.Incref(obj); + public static IntPtr GetBoundArgTuple(IntPtr obj, IntPtr args) { + if (Runtime.PyObject_TYPE(args) != Runtime.PyTupleType) { + Exceptions.SetError(Exceptions.TypeError, "tuple expected"); + return IntPtr.Zero; + } + int size = Runtime.PyTuple_Size(args); + IntPtr items = Runtime.PyTuple_New(size + 1); + Runtime.PyTuple_SetItem(items, 0, obj); + Runtime.Incref(obj); - for (int i = 0; i < size; i++) { - IntPtr item = Runtime.PyTuple_GetItem(args, i); - Runtime.Incref(item); - Runtime.PyTuple_SetItem(items, i + 1, item); - } + for (int i = 0; i < size; i++) { + IntPtr item = Runtime.PyTuple_GetItem(args, i); + Runtime.Incref(item); + Runtime.PyTuple_SetItem(items, i + 1, item); + } - return items; - } + return items; + } - public static IntPtr ExtendTuple(IntPtr t, params IntPtr[] args) { - int size = Runtime.PyTuple_Size(t); - int add = args.Length; - IntPtr item; + public static IntPtr ExtendTuple(IntPtr t, params IntPtr[] args) { + int size = Runtime.PyTuple_Size(t); + int add = args.Length; + IntPtr item; - IntPtr items = Runtime.PyTuple_New(size + add); - for (int i = 0; i < size; i++) { - item = Runtime.PyTuple_GetItem(t, i); - Runtime.Incref(item); - Runtime.PyTuple_SetItem(items, i, item); - } + IntPtr items = Runtime.PyTuple_New(size + add); + for (int i = 0; i < size; i++) { + item = Runtime.PyTuple_GetItem(t, i); + Runtime.Incref(item); + Runtime.PyTuple_SetItem(items, i, item); + } - for (int n = 0; n < add; n++) { - item = args[n]; - Runtime.Incref(item); - Runtime.PyTuple_SetItem(items, size + n, item); - } + for (int n = 0; n < add; n++) { + item = args[n]; + Runtime.Incref(item); + Runtime.PyTuple_SetItem(items, size + n, item); + } - return items; - } + return items; + } - public static Type[] PythonArgsToTypeArray(IntPtr arg) { - return PythonArgsToTypeArray(arg, false); - } + public static Type[] PythonArgsToTypeArray(IntPtr arg) { + return PythonArgsToTypeArray(arg, false); + } - public static Type[] PythonArgsToTypeArray(IntPtr arg, bool mangleObjects) { - // Given a PyObject * that is either a single type object or a - // tuple of (managed or unmanaged) type objects, return a Type[] - // containing the CLR Type objects that map to those types. - IntPtr args = arg; - bool free = false; + public static Type[] PythonArgsToTypeArray(IntPtr arg, bool mangleObjects) { + // Given a PyObject * that is either a single type object or a + // tuple of (managed or unmanaged) type objects, return a Type[] + // containing the CLR Type objects that map to those types. + IntPtr args = arg; + bool free = false; - if (!Runtime.PyTuple_Check(arg)) { - args = Runtime.PyTuple_New(1); - Runtime.Incref(arg); - Runtime.PyTuple_SetItem(args, 0, arg); - free = true; - } + if (!Runtime.PyTuple_Check(arg)) { + args = Runtime.PyTuple_New(1); + Runtime.Incref(arg); + Runtime.PyTuple_SetItem(args, 0, arg); + free = true; + } - int n = Runtime.PyTuple_Size(args); - Type[] types = new Type[n]; - Type t = null; + int n = Runtime.PyTuple_Size(args); + Type[] types = new Type[n]; + Type t = null; - for (int i = 0; i < n; i++) { - IntPtr op = Runtime.PyTuple_GetItem(args, i); - if (mangleObjects && (!Runtime.PyType_Check(op))) { - op = Runtime.PyObject_TYPE(op); - } - ManagedType mt = ManagedType.GetManagedObject(op); + for (int i = 0; i < n; i++) { + IntPtr op = Runtime.PyTuple_GetItem(args, i); + if (mangleObjects && (!Runtime.PyType_Check(op))) { + op = Runtime.PyObject_TYPE(op); + } + ManagedType mt = ManagedType.GetManagedObject(op); - if (mt is ClassBase) { - t = ((ClassBase)mt).type; - } - else if (mt is CLRObject) { - object inst = ((CLRObject)mt).inst; - if (inst is Type) { - t = inst as Type; - } - } - else { - t = Converter.GetTypeByAlias(op); - } + if (mt is ClassBase) { + t = ((ClassBase)mt).type; + } + else if (mt is CLRObject) { + object inst = ((CLRObject)mt).inst; + if (inst is Type) { + t = inst as Type; + } + } + else { + t = Converter.GetTypeByAlias(op); + } - if (t == null) { - types = null; - break; - } - types[i] = t; - } - if (free) { - Runtime.Decref(args); - } - return types; - } + if (t == null) { + types = null; + break; + } + types[i] = t; + } + if (free) { + Runtime.Decref(args); + } + return types; + } - //=================================================================== - // Managed exports of the Python C API. Where appropriate, we do - // some optimization to avoid managed <--> unmanaged transitions - // (mostly for heavily used methods). - //=================================================================== + //=================================================================== + // Managed exports of the Python C API. Where appropriate, we do + // some optimization to avoid managed <--> unmanaged transitions + // (mostly for heavily used methods). + //=================================================================== - public unsafe static void Incref(IntPtr op) { + public unsafe static void Incref(IntPtr op) { #if (Py_DEBUG) Py_IncRef(op); return; #else - void *p = (void *)op; - if ((void *)0 != p) { - if (is32bit) { (*(int *)p)++; } - else { (*(long *)p)++; } - } + void* p = (void*)op; + if ((void*)0 != p) { + if (is32bit) { (*(int*)p)++; } + else { (*(long*)p)++; } + } #endif - } + } - public unsafe static void Decref(IntPtr op) { - if (op == IntPtr.Zero) { - DebugUtil.Print("Decref(NULL)"); - } + public unsafe static void Decref(IntPtr op) { + if (op == IntPtr.Zero) { + DebugUtil.Print("Decref(NULL)"); + } #if (Py_DEBUG) // Py_DecRef calls Python's Py_DECREF Py_DecRef(op); return; #else - void* p = (void*) op; - if ((void*) 0 != p) { - if (is32bit) { --(*(int*) p); } - else { --(*(long*) p); } - if ((*(int*) p) == 0) { - // PyObject_HEAD: struct _typeobject *ob_type - void* t = is32bit ? (void*) (*((uint*) p + 1)) : - (void*) (*((ulong*) p + 1)); - // PyTypeObject: destructor tp_dealloc - void* f = is32bit ? (void*) (*((uint*) t + 6)) : - (void*) (*((ulong*) t + 6)); - if ((void*) 0 == f) { - return; - } - NativeCall.Impl.Void_Call_1(new IntPtr(f), op); - return; - } - } + void* p = (void*)op; + if ((void*)0 != p) { + if (is32bit) { --(*(int*)p); } + else { --(*(long*)p); } + if ((*(int*)p) == 0) { + // PyObject_HEAD: struct _typeobject *ob_type + void* t = is32bit ? (void*)(*((uint*)p + 1)) : + (void*)(*((ulong*)p + 1)); + // PyTypeObject: destructor tp_dealloc + void* f = is32bit ? (void*)(*((uint*)t + 6)) : + (void*)(*((ulong*)t + 6)); + if ((void*)0 == f) { + return; + } + NativeCall.Impl.Void_Call_1(new IntPtr(f), op); + return; + } + } #endif - } + } #if (Py_DEBUG) // Py_IncRef and Py_DecRef are taking care of the extra payload @@ -373,730 +373,726 @@ namespace Python.Runtime { Py_DecRef(IntPtr ob); #endif - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern void - Py_Initialize(); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern void + Py_Initialize(); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - Py_IsInitialized(); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + Py_IsInitialized(); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern void - Py_Finalize(); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern void + Py_Finalize(); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - Py_NewInterpreter(); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + Py_NewInterpreter(); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern void - Py_EndInterpreter(IntPtr threadState); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern void + Py_EndInterpreter(IntPtr threadState); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyThreadState_New(IntPtr istate); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyThreadState_New(IntPtr istate); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyThreadState_Get(); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyThreadState_Get(); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyThread_get_key_value(IntPtr key); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyThread_get_key_value(IntPtr key); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - PyThread_get_thread_ident(); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + PyThread_get_thread_ident(); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - PyThread_set_key_value(IntPtr key, IntPtr value); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + PyThread_set_key_value(IntPtr key, IntPtr value); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyThreadState_Swap(IntPtr key); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyThreadState_Swap(IntPtr key); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyGILState_Ensure(); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyGILState_Ensure(); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern void - PyGILState_Release(IntPtr gs); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern void + PyGILState_Release(IntPtr gs); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyGILState_GetThisThreadState(); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyGILState_GetThisThreadState(); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - Py_Main(int argc, string[] argv); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + Py_Main(int argc, string[] argv); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern void - PyEval_InitThreads(); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern void + PyEval_InitThreads(); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern void - PyEval_AcquireLock(); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern void + PyEval_AcquireLock(); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern void - PyEval_ReleaseLock(); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern void + PyEval_ReleaseLock(); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern void - PyEval_AcquireThread(IntPtr tstate); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern void + PyEval_AcquireThread(IntPtr tstate); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern void - PyEval_ReleaseThread(IntPtr tstate); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern void + PyEval_ReleaseThread(IntPtr tstate); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyEval_SaveThread(); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyEval_SaveThread(); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern void - PyEval_RestoreThread(IntPtr tstate); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern void + PyEval_RestoreThread(IntPtr tstate); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyEval_GetBuiltins(); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyEval_GetBuiltins(); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyEval_GetGlobals(); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyEval_GetGlobals(); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyEval_GetLocals(); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyEval_GetLocals(); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern string - Py_GetProgramName(); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern string + Py_GetProgramName(); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern void - Py_SetProgramName(string name); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern void + Py_SetProgramName(string name); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern string - Py_GetPythonHome(); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern string + Py_GetPythonHome(); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern void - Py_SetPythonHome(string home); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern void + Py_SetPythonHome(string home); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern string - Py_GetVersion(); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern string + Py_GetVersion(); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern string - Py_GetPlatform(); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern string + Py_GetPlatform(); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern string - Py_GetCopyright(); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern string + Py_GetCopyright(); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern string - Py_GetCompiler(); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern string + Py_GetCompiler(); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern string - Py_GetBuildInfo(); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern string + Py_GetBuildInfo(); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - PyRun_SimpleString(string code); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + PyRun_SimpleString(string code); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyRun_String(string code, IntPtr st, IntPtr globals, IntPtr locals); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyRun_String(string code, IntPtr st, IntPtr globals, IntPtr locals); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - Py_CompileString(string code, string file, IntPtr tok); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + Py_CompileString(string code, string file, IntPtr tok); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyImport_ExecCodeModule(string name, IntPtr code); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyImport_ExecCodeModule(string name, IntPtr code); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyCFunction_New(IntPtr ml, IntPtr self); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyCFunction_New(IntPtr ml, IntPtr self); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyCFunction_NewEx(IntPtr ml, IntPtr self, IntPtr mod); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyCFunction_NewEx(IntPtr ml, IntPtr self, IntPtr mod); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyCFunction_Call(IntPtr func, IntPtr args, IntPtr kw); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyCFunction_Call(IntPtr func, IntPtr args, IntPtr kw); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyClass_New(IntPtr bases, IntPtr dict, IntPtr name); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyClass_New(IntPtr bases, IntPtr dict, IntPtr name); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyInstance_New(IntPtr cls, IntPtr args, IntPtr kw); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyInstance_New(IntPtr cls, IntPtr args, IntPtr kw); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyInstance_NewRaw(IntPtr cls, IntPtr dict); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyInstance_NewRaw(IntPtr cls, IntPtr dict); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyMethod_New(IntPtr func, IntPtr self, IntPtr cls); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyMethod_New(IntPtr func, IntPtr self, IntPtr cls); - //==================================================================== - // Python abstract object API - //==================================================================== + //==================================================================== + // Python abstract object API + //==================================================================== - // A macro-like method to get the type of a Python object. This is - // designed to be lean and mean in IL & avoid managed <-> unmanaged - // transitions. Note that this does not incref the type object. + // A macro-like method to get the type of a Python object. This is + // designed to be lean and mean in IL & avoid managed <-> unmanaged + // transitions. Note that this does not incref the type object. - public unsafe static IntPtr - PyObject_TYPE(IntPtr op) { - void* p = (void*)op; - if ((void*)0 == p) { - return IntPtr.Zero; - } + public unsafe static IntPtr + PyObject_TYPE(IntPtr op) { + void* p = (void*)op; + if ((void*)0 == p) { + return IntPtr.Zero; + } #if (Py_DEBUG) int n = 3; #else - int n = 1; + int n = 1; #endif - if (is32bit) { - return new IntPtr((void*)(*((uint*)p + n))); - } - else { - return new IntPtr((void*)(*((ulong*)p + n))); - } - } - - // Managed version of the standard Python C API PyObject_Type call. - // This version avoids a managed <-> unmanaged transition. This one - // does incref the returned type object. - - [CLSCompliant(false)] - public unsafe static IntPtr - PyObject_Type(IntPtr op) { - IntPtr tp = PyObject_TYPE(op); - Runtime.Incref(tp); - return tp; - } - - public static string PyObject_GetTypeName(IntPtr op) { - IntPtr pyType = Marshal.ReadIntPtr(op, ObjectOffset.ob_type); - IntPtr ppName = Marshal.ReadIntPtr(pyType, TypeOffset.tp_name); - return Marshal.PtrToStringAnsi(ppName); - } - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - PyObject_HasAttrString(IntPtr pointer, string name); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyObject_GetAttrString(IntPtr pointer, string name); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - PyObject_SetAttrString(IntPtr pointer, string name, IntPtr value); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - PyObject_HasAttr(IntPtr pointer, IntPtr name); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyObject_GetAttr(IntPtr pointer, IntPtr name); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - PyObject_SetAttr(IntPtr pointer, IntPtr name, IntPtr value); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyObject_GetItem(IntPtr pointer, IntPtr key); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - PyObject_SetItem(IntPtr pointer, IntPtr key, IntPtr value); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - PyObject_DelItem(IntPtr pointer, IntPtr key); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyObject_GetIter(IntPtr op); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyObject_Call(IntPtr pointer, IntPtr args, IntPtr kw); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyObject_CallObject(IntPtr pointer, IntPtr args); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - PyObject_Compare(IntPtr value1, IntPtr value2); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - PyObject_IsInstance(IntPtr ob, IntPtr type); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - PyObject_IsSubclass(IntPtr ob, IntPtr type); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - PyCallable_Check(IntPtr pointer); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - PyObject_IsTrue(IntPtr pointer); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - PyObject_Size(IntPtr pointer); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyObject_Hash(IntPtr op); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyObject_Repr(IntPtr pointer); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyObject_Str(IntPtr pointer); - - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] - public unsafe static extern IntPtr - PyObject_Unicode(IntPtr pointer); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyObject_Dir(IntPtr pointer); - - - //==================================================================== - // Python number API - //==================================================================== - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyNumber_Int(IntPtr ob); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyNumber_Long(IntPtr ob); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyNumber_Float(IntPtr ob); - - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern bool - PyNumber_Check(IntPtr ob); - - - public static bool PyInt_Check(IntPtr ob) { - return PyObject_TypeCheck(ob, Runtime.PyIntType); - } - - public static bool PyBool_Check(IntPtr ob) { - return PyObject_TypeCheck(ob, Runtime.PyBoolType); - } - - - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - private unsafe static extern IntPtr - PyInt_FromLong(IntPtr value); - - public static IntPtr PyInt_FromInt32(int value) { - IntPtr v = new IntPtr(value); - return PyInt_FromLong(v); - } - - public static IntPtr PyInt_FromInt64(long value) { - IntPtr v = new IntPtr(value); - return PyInt_FromLong(v); - } - - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - PyInt_AsLong(IntPtr value); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyInt_FromString(string value, IntPtr end, int radix); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - PyInt_GetMax(); - - - public static bool PyLong_Check(IntPtr ob) { - return PyObject_TYPE(ob) == Runtime.PyLongType; - } - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyLong_FromLong(long value); - - [CLSCompliant(false)] - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyLong_FromUnsignedLong(uint value); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyLong_FromDouble(double value); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyLong_FromLongLong(long value); - - [CLSCompliant(false)] - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyLong_FromUnsignedLongLong(ulong value); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyLong_FromString(string value, IntPtr end, int radix); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - PyLong_AsLong(IntPtr value); - - [CLSCompliant(false)] - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern uint - PyLong_AsUnsignedLong(IntPtr value); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern long - PyLong_AsLongLong(IntPtr value); - - [CLSCompliant(false)] - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern ulong - PyLong_AsUnsignedLongLong(IntPtr value); - - - public static bool PyFloat_Check(IntPtr ob) { - return PyObject_TYPE(ob) == Runtime.PyFloatType; - } - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyFloat_FromDouble(double value); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyFloat_FromString(IntPtr value, IntPtr junk); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern double - PyFloat_AsDouble(IntPtr ob); - - - //==================================================================== - // Python sequence API - //==================================================================== - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern bool - PySequence_Check(IntPtr pointer); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PySequence_GetItem(IntPtr pointer, int index); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - PySequence_SetItem(IntPtr pointer, int index, IntPtr value); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - PySequence_DelItem(IntPtr pointer, int index); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PySequence_GetSlice(IntPtr pointer, int i1, int i2); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - PySequence_SetSlice(IntPtr pointer, int i1, int i2, IntPtr v); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - PySequence_DelSlice(IntPtr pointer, int i1, int i2); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - PySequence_Size(IntPtr pointer); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - PySequence_Contains(IntPtr pointer, IntPtr item); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PySequence_Concat(IntPtr pointer, IntPtr other); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PySequence_Repeat(IntPtr pointer, int count); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - PySequence_Index(IntPtr pointer, IntPtr item); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - PySequence_Count(IntPtr pointer, IntPtr value); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PySequence_Tuple(IntPtr pointer); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PySequence_List(IntPtr pointer); - - - //==================================================================== - // Python string API - //==================================================================== - - public static bool IsStringType(IntPtr op) { - IntPtr t = PyObject_TYPE(op); - return (t == PyStringType) || (t == PyUnicodeType); - } - - public static bool PyString_Check(IntPtr ob) { - return PyObject_TYPE(ob) == Runtime.PyStringType; - } - - public static IntPtr PyString_FromString(string value) { - return PyString_FromStringAndSize(value, value.Length); - } - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyString_FromStringAndSize(string value, int size); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - EntryPoint="PyString_AsString", - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyString_AS_STRING(IntPtr op); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - PyString_Size(IntPtr pointer); - - public static bool PyUnicode_Check(IntPtr ob) { - return PyObject_TYPE(ob) == Runtime.PyUnicodeType; - } + if (is32bit) { + return new IntPtr((void*)(*((uint*)p + n))); + } + else { + return new IntPtr((void*)(*((ulong*)p + n))); + } + } + + // Managed version of the standard Python C API PyObject_Type call. + // This version avoids a managed <-> unmanaged transition. This one + // does incref the returned type object. + + [CLSCompliant(false)] + public unsafe static IntPtr + PyObject_Type(IntPtr op) { + IntPtr tp = PyObject_TYPE(op); + Runtime.Incref(tp); + return tp; + } + + public static string PyObject_GetTypeName(IntPtr op) { + IntPtr pyType = Marshal.ReadIntPtr(op, ObjectOffset.ob_type); + IntPtr ppName = Marshal.ReadIntPtr(pyType, TypeOffset.tp_name); + return Marshal.PtrToStringAnsi(ppName); + } + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + PyObject_HasAttrString(IntPtr pointer, string name); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyObject_GetAttrString(IntPtr pointer, string name); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + PyObject_SetAttrString(IntPtr pointer, string name, IntPtr value); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + PyObject_HasAttr(IntPtr pointer, IntPtr name); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyObject_GetAttr(IntPtr pointer, IntPtr name); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + PyObject_SetAttr(IntPtr pointer, IntPtr name, IntPtr value); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyObject_GetItem(IntPtr pointer, IntPtr key); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + PyObject_SetItem(IntPtr pointer, IntPtr key, IntPtr value); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + PyObject_DelItem(IntPtr pointer, IntPtr key); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyObject_GetIter(IntPtr op); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyObject_Call(IntPtr pointer, IntPtr args, IntPtr kw); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyObject_CallObject(IntPtr pointer, IntPtr args); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + PyObject_Compare(IntPtr value1, IntPtr value2); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + PyObject_IsInstance(IntPtr ob, IntPtr type); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + PyObject_IsSubclass(IntPtr ob, IntPtr type); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + PyCallable_Check(IntPtr pointer); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + PyObject_IsTrue(IntPtr pointer); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + PyObject_Size(IntPtr pointer); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyObject_Hash(IntPtr op); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyObject_Repr(IntPtr pointer); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyObject_Str(IntPtr pointer); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyObject_Unicode(IntPtr pointer); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyObject_Dir(IntPtr pointer); + + + //==================================================================== + // Python number API + //==================================================================== + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyNumber_Int(IntPtr ob); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyNumber_Long(IntPtr ob); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyNumber_Float(IntPtr ob); + + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern bool + PyNumber_Check(IntPtr ob); + + + public static bool PyInt_Check(IntPtr ob) { + return PyObject_TypeCheck(ob, Runtime.PyIntType); + } + + public static bool PyBool_Check(IntPtr ob) { + return PyObject_TypeCheck(ob, Runtime.PyBoolType); + } + + + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + private unsafe static extern IntPtr + PyInt_FromLong(IntPtr value); + + public static IntPtr PyInt_FromInt32(int value) { + IntPtr v = new IntPtr(value); + return PyInt_FromLong(v); + } + + public static IntPtr PyInt_FromInt64(long value) { + IntPtr v = new IntPtr(value); + return PyInt_FromLong(v); + } + + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + PyInt_AsLong(IntPtr value); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyInt_FromString(string value, IntPtr end, int radix); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + PyInt_GetMax(); + + + public static bool PyLong_Check(IntPtr ob) { + return PyObject_TYPE(ob) == Runtime.PyLongType; + } + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyLong_FromLong(long value); + + [CLSCompliant(false)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyLong_FromUnsignedLong(uint value); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyLong_FromDouble(double value); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyLong_FromLongLong(long value); + + [CLSCompliant(false)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyLong_FromUnsignedLongLong(ulong value); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyLong_FromString(string value, IntPtr end, int radix); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + PyLong_AsLong(IntPtr value); + + [CLSCompliant(false)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern uint + PyLong_AsUnsignedLong(IntPtr value); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern long + PyLong_AsLongLong(IntPtr value); + + [CLSCompliant(false)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern ulong + PyLong_AsUnsignedLongLong(IntPtr value); + + + public static bool PyFloat_Check(IntPtr ob) { + return PyObject_TYPE(ob) == Runtime.PyFloatType; + } + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyFloat_FromDouble(double value); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyFloat_FromString(IntPtr value, IntPtr junk); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern double + PyFloat_AsDouble(IntPtr ob); + + + //==================================================================== + // Python sequence API + //==================================================================== + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern bool + PySequence_Check(IntPtr pointer); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PySequence_GetItem(IntPtr pointer, int index); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + PySequence_SetItem(IntPtr pointer, int index, IntPtr value); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + PySequence_DelItem(IntPtr pointer, int index); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PySequence_GetSlice(IntPtr pointer, int i1, int i2); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + PySequence_SetSlice(IntPtr pointer, int i1, int i2, IntPtr v); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + PySequence_DelSlice(IntPtr pointer, int i1, int i2); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + PySequence_Size(IntPtr pointer); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + PySequence_Contains(IntPtr pointer, IntPtr item); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PySequence_Concat(IntPtr pointer, IntPtr other); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PySequence_Repeat(IntPtr pointer, int count); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + PySequence_Index(IntPtr pointer, IntPtr item); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + PySequence_Count(IntPtr pointer, IntPtr value); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PySequence_Tuple(IntPtr pointer); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PySequence_List(IntPtr pointer); + + + //==================================================================== + // Python string API + //==================================================================== + + public static bool IsStringType(IntPtr op) { + IntPtr t = PyObject_TYPE(op); + return (t == PyStringType) || (t == PyUnicodeType); + } + + public static bool PyString_Check(IntPtr ob) { + return PyObject_TYPE(ob) == Runtime.PyStringType; + } + + public static IntPtr PyString_FromString(string value) { + return PyString_FromStringAndSize(value, value.Length); + } + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyString_FromStringAndSize(string value, int size); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + EntryPoint = "PyString_AsString", + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyString_AS_STRING(IntPtr op); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + PyString_Size(IntPtr pointer); + + public static bool PyUnicode_Check(IntPtr ob) { + return PyObject_TYPE(ob) == Runtime.PyUnicodeType; + } #if (UCS2) - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - EntryPoint="PyUnicodeUCS2_FromObject", - ExactSpelling=true, CharSet=CharSet.Unicode)] - public unsafe static extern IntPtr - PyUnicode_FromObject(IntPtr ob); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + EntryPoint = "PyUnicodeUCS2_FromObject", + ExactSpelling = true, CharSet = CharSet.Unicode)] + public unsafe static extern IntPtr + PyUnicode_FromObject(IntPtr ob); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - EntryPoint="PyUnicodeUCS2_FromEncodedObject", - ExactSpelling=true, CharSet=CharSet.Unicode)] - public unsafe static extern IntPtr - PyUnicode_FromEncodedObject(IntPtr ob, IntPtr enc, IntPtr err); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + EntryPoint = "PyUnicodeUCS2_FromEncodedObject", + ExactSpelling = true, CharSet = CharSet.Unicode)] + public unsafe static extern IntPtr + PyUnicode_FromEncodedObject(IntPtr ob, IntPtr enc, IntPtr err); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - EntryPoint="PyUnicodeUCS2_FromUnicode", - ExactSpelling=true, CharSet=CharSet.Unicode)] - public unsafe static extern IntPtr - PyUnicode_FromUnicode(string s, int size); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + EntryPoint = "PyUnicodeUCS2_FromUnicode", + ExactSpelling = true, CharSet = CharSet.Unicode)] + public unsafe static extern IntPtr + PyUnicode_FromUnicode(string s, int size); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - EntryPoint="PyUnicodeUCS2_GetSize", - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - PyUnicode_GetSize(IntPtr ob); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + EntryPoint = "PyUnicodeUCS2_GetSize", + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + PyUnicode_GetSize(IntPtr ob); - [CLSCompliant(false)] - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - EntryPoint="PyUnicodeUCS2_AsUnicode", - ExactSpelling=true)] - public unsafe static extern char * - PyUnicode_AsUnicode(IntPtr ob); + [CLSCompliant(false)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + EntryPoint = "PyUnicodeUCS2_AsUnicode", + ExactSpelling = true)] + public unsafe static extern char* + PyUnicode_AsUnicode(IntPtr ob); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - EntryPoint="PyUnicodeUCS2_AsUnicode", - ExactSpelling=true, CharSet=CharSet.Unicode)] - public unsafe static extern IntPtr - PyUnicode_AS_UNICODE(IntPtr op); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + EntryPoint = "PyUnicodeUCS2_AsUnicode", + ExactSpelling = true, CharSet = CharSet.Unicode)] + public unsafe static extern IntPtr + PyUnicode_AS_UNICODE(IntPtr op); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - EntryPoint="PyUnicodeUCS2_FromOrdinal", - ExactSpelling=true, CharSet=CharSet.Unicode)] - public unsafe static extern IntPtr - PyUnicode_FromOrdinal(int c); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + EntryPoint = "PyUnicodeUCS2_FromOrdinal", + ExactSpelling = true, CharSet = CharSet.Unicode)] + public unsafe static extern IntPtr + PyUnicode_FromOrdinal(int c); - public static IntPtr PyUnicode_FromString(string s) - { - return PyUnicode_FromUnicode(s, (s.Length)); - } + public static IntPtr PyUnicode_FromString(string s) { + return PyUnicode_FromUnicode(s, (s.Length)); + } - public unsafe static string GetManagedString(IntPtr op) - { - IntPtr type = PyObject_TYPE(op); + public unsafe static string GetManagedString(IntPtr op) { + IntPtr type = PyObject_TYPE(op); - if (type == Runtime.PyStringType) - { - return Marshal.PtrToStringAnsi( - PyString_AS_STRING(op), - Runtime.PyString_Size(op) - ); - } + if (type == Runtime.PyStringType) { + return Marshal.PtrToStringAnsi( + PyString_AS_STRING(op), + Runtime.PyString_Size(op) + ); + } - if (type == Runtime.PyUnicodeType) - { - char* p = Runtime.PyUnicode_AsUnicode(op); - int size = Runtime.PyUnicode_GetSize(op); - return new String(p, 0, size); - } + if (type == Runtime.PyUnicodeType) { + char* p = Runtime.PyUnicode_AsUnicode(op); + int size = Runtime.PyUnicode_GetSize(op); + return new String(p, 0, size); + } - return null; - } + return null; + } #endif #if (UCS4) @@ -1172,439 +1168,439 @@ namespace Python.Runtime { } #endif - //==================================================================== - // Python dictionary API - //==================================================================== - - public static bool PyDict_Check(IntPtr ob) { - return PyObject_TYPE(ob) == Runtime.PyDictType; - } - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyDict_New(); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyDictProxy_New(IntPtr dict); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyDict_GetItem(IntPtr pointer, IntPtr key); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyDict_GetItemString(IntPtr pointer, string key); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - PyDict_SetItem(IntPtr pointer, IntPtr key, IntPtr value); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - PyDict_SetItemString(IntPtr pointer, string key, IntPtr value); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - PyDict_DelItem(IntPtr pointer, IntPtr key); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - PyMapping_HasKey(IntPtr pointer, IntPtr key); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyDict_Keys(IntPtr pointer); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyDict_Values(IntPtr pointer); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyDict_Items(IntPtr pointer); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyDict_Copy(IntPtr pointer); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - PyDict_Update(IntPtr pointer, IntPtr other); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern void - PyDict_Clear(IntPtr pointer); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - PyDict_Size(IntPtr pointer); - - - //==================================================================== - // Python list API - //==================================================================== - - public static bool PyList_Check(IntPtr ob) { - return PyObject_TYPE(ob) == Runtime.PyListType; - } - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyList_New(int size); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyList_AsTuple(IntPtr pointer); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyList_GetItem(IntPtr pointer, int index); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - PyList_SetItem(IntPtr pointer, int index, IntPtr value); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - PyList_Insert(IntPtr pointer, int index, IntPtr value); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - PyList_Append(IntPtr pointer, IntPtr value); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - PyList_Reverse(IntPtr pointer); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - PyList_Sort(IntPtr pointer); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyList_GetSlice(IntPtr pointer, int start, int end); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - PyList_SetSlice(IntPtr pointer, int start, int end, IntPtr value); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - PyList_Size(IntPtr pointer); - - - //==================================================================== - // Python tuple API - //==================================================================== - - public static bool PyTuple_Check(IntPtr ob) { - return PyObject_TYPE(ob) == Runtime.PyTupleType; - } - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyTuple_New(int size); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyTuple_GetItem(IntPtr pointer, int index); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - PyTuple_SetItem(IntPtr pointer, int index, IntPtr value); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyTuple_GetSlice(IntPtr pointer, int start, int end); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - PyTuple_Size(IntPtr pointer); - - - //==================================================================== - // Python iterator API - //==================================================================== - - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] - public unsafe static extern bool - PyIter_Check(IntPtr pointer); - - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] - public unsafe static extern IntPtr - PyIter_Next(IntPtr pointer); - - //==================================================================== - // Python module API - //==================================================================== - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern string - PyModule_GetName(IntPtr module); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyModule_GetDict(IntPtr module); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern string - PyModule_GetFilename(IntPtr module); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyImport_Import(IntPtr name); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyImport_ImportModule(string name); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyImport_ReloadModule(IntPtr module); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyImport_AddModule(string name); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyImport_GetModuleDict(); - - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern void - PySys_SetArgv(int argc, IntPtr argv); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PySys_GetObject(string name); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - PySys_SetObject(string name, IntPtr ob); - - - //==================================================================== - // Python type object API - //==================================================================== - - public static bool PyType_Check(IntPtr ob) { - return PyObject_TypeCheck(ob, Runtime.PyTypeType); - } - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern bool - PyType_IsSubtype(IntPtr t1, IntPtr t2); - - public static bool PyObject_TypeCheck(IntPtr ob, IntPtr tp) { - IntPtr t = PyObject_TYPE(ob); - return (t == tp) || PyType_IsSubtype(t, tp); - } - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyType_GenericNew(IntPtr type, IntPtr args, IntPtr kw); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyType_GenericAlloc(IntPtr type, int n); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - PyType_Ready(IntPtr type); - - [CLSCompliant(false)] - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - _PyType_Lookup(IntPtr type, IntPtr name); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyObject_GenericGetAttr(IntPtr obj, IntPtr name); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - PyObject_GenericSetAttr(IntPtr obj, IntPtr name, IntPtr value); - - [CLSCompliant(false)] - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - _PyObject_GetDictPtr(IntPtr obj); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyObject_GC_New(IntPtr tp); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern void - PyObject_GC_Del(IntPtr tp); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern void - PyObject_GC_Track(IntPtr tp); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern void - PyObject_GC_UnTrack(IntPtr tp); - - - //==================================================================== - // Python memory API - //==================================================================== - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyMem_Malloc(int size); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyMem_Realloc(IntPtr ptr, int size); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern void - PyMem_Free(IntPtr ptr); - - - //==================================================================== - // Python exception API - //==================================================================== - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern void - PyErr_SetString(IntPtr ob, string message); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern void - PyErr_SetObject(IntPtr ob, IntPtr message); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyErr_SetFromErrno(IntPtr ob); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern void - PyErr_SetNone(IntPtr ob); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - PyErr_ExceptionMatches(IntPtr exception); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - PyErr_GivenExceptionMatches(IntPtr ob, IntPtr val); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern void - PyErr_NormalizeException(IntPtr ob, IntPtr val, IntPtr tb); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - PyErr_Occurred(); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern void - PyErr_Fetch(ref IntPtr ob, ref IntPtr val, ref IntPtr tb); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern void - PyErr_Restore(IntPtr ob, IntPtr val, IntPtr tb); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern void - PyErr_Clear(); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern void - PyErr_Print(); - - - //==================================================================== - // Miscellaneous - //==================================================================== - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyMethod_Self(IntPtr ob); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern IntPtr - PyMethod_Function(IntPtr ob); - - } + //==================================================================== + // Python dictionary API + //==================================================================== + + public static bool PyDict_Check(IntPtr ob) { + return PyObject_TYPE(ob) == Runtime.PyDictType; + } + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyDict_New(); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyDictProxy_New(IntPtr dict); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyDict_GetItem(IntPtr pointer, IntPtr key); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyDict_GetItemString(IntPtr pointer, string key); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + PyDict_SetItem(IntPtr pointer, IntPtr key, IntPtr value); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + PyDict_SetItemString(IntPtr pointer, string key, IntPtr value); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + PyDict_DelItem(IntPtr pointer, IntPtr key); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + PyMapping_HasKey(IntPtr pointer, IntPtr key); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyDict_Keys(IntPtr pointer); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyDict_Values(IntPtr pointer); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyDict_Items(IntPtr pointer); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyDict_Copy(IntPtr pointer); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + PyDict_Update(IntPtr pointer, IntPtr other); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern void + PyDict_Clear(IntPtr pointer); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + PyDict_Size(IntPtr pointer); + + + //==================================================================== + // Python list API + //==================================================================== + + public static bool PyList_Check(IntPtr ob) { + return PyObject_TYPE(ob) == Runtime.PyListType; + } + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyList_New(int size); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyList_AsTuple(IntPtr pointer); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyList_GetItem(IntPtr pointer, int index); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + PyList_SetItem(IntPtr pointer, int index, IntPtr value); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + PyList_Insert(IntPtr pointer, int index, IntPtr value); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + PyList_Append(IntPtr pointer, IntPtr value); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + PyList_Reverse(IntPtr pointer); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + PyList_Sort(IntPtr pointer); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyList_GetSlice(IntPtr pointer, int start, int end); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + PyList_SetSlice(IntPtr pointer, int start, int end, IntPtr value); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + PyList_Size(IntPtr pointer); + + + //==================================================================== + // Python tuple API + //==================================================================== + + public static bool PyTuple_Check(IntPtr ob) { + return PyObject_TYPE(ob) == Runtime.PyTupleType; + } + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyTuple_New(int size); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyTuple_GetItem(IntPtr pointer, int index); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + PyTuple_SetItem(IntPtr pointer, int index, IntPtr value); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyTuple_GetSlice(IntPtr pointer, int start, int end); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + PyTuple_Size(IntPtr pointer); + + + //==================================================================== + // Python iterator API + //==================================================================== + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern bool + PyIter_Check(IntPtr pointer); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyIter_Next(IntPtr pointer); + + //==================================================================== + // Python module API + //==================================================================== + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern string + PyModule_GetName(IntPtr module); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyModule_GetDict(IntPtr module); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern string + PyModule_GetFilename(IntPtr module); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyImport_Import(IntPtr name); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyImport_ImportModule(string name); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyImport_ReloadModule(IntPtr module); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyImport_AddModule(string name); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyImport_GetModuleDict(); + + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern void + PySys_SetArgv(int argc, IntPtr argv); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PySys_GetObject(string name); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + PySys_SetObject(string name, IntPtr ob); + + + //==================================================================== + // Python type object API + //==================================================================== + + public static bool PyType_Check(IntPtr ob) { + return PyObject_TypeCheck(ob, Runtime.PyTypeType); + } + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern bool + PyType_IsSubtype(IntPtr t1, IntPtr t2); + + public static bool PyObject_TypeCheck(IntPtr ob, IntPtr tp) { + IntPtr t = PyObject_TYPE(ob); + return (t == tp) || PyType_IsSubtype(t, tp); + } + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyType_GenericNew(IntPtr type, IntPtr args, IntPtr kw); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyType_GenericAlloc(IntPtr type, int n); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + PyType_Ready(IntPtr type); + + [CLSCompliant(false)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + _PyType_Lookup(IntPtr type, IntPtr name); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyObject_GenericGetAttr(IntPtr obj, IntPtr name); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + PyObject_GenericSetAttr(IntPtr obj, IntPtr name, IntPtr value); + + [CLSCompliant(false)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + _PyObject_GetDictPtr(IntPtr obj); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyObject_GC_New(IntPtr tp); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern void + PyObject_GC_Del(IntPtr tp); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern void + PyObject_GC_Track(IntPtr tp); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern void + PyObject_GC_UnTrack(IntPtr tp); + + + //==================================================================== + // Python memory API + //==================================================================== + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyMem_Malloc(int size); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyMem_Realloc(IntPtr ptr, int size); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern void + PyMem_Free(IntPtr ptr); + + + //==================================================================== + // Python exception API + //==================================================================== + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern void + PyErr_SetString(IntPtr ob, string message); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern void + PyErr_SetObject(IntPtr ob, IntPtr message); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyErr_SetFromErrno(IntPtr ob); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern void + PyErr_SetNone(IntPtr ob); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + PyErr_ExceptionMatches(IntPtr exception); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + PyErr_GivenExceptionMatches(IntPtr ob, IntPtr val); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern void + PyErr_NormalizeException(IntPtr ob, IntPtr val, IntPtr tb); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + PyErr_Occurred(); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern void + PyErr_Fetch(ref IntPtr ob, ref IntPtr val, ref IntPtr tb); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern void + PyErr_Restore(IntPtr ob, IntPtr val, IntPtr tb); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern void + PyErr_Clear(); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern void + PyErr_Print(); + + + //==================================================================== + // Miscellaneous + //==================================================================== + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyMethod_Self(IntPtr ob); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern IntPtr + PyMethod_Function(IntPtr ob); + + } } diff --git a/Wox.Plugin.SystemPlugins/FileSystem/FileSystemPlugin.cs b/Wox.Plugin.SystemPlugins/FileSystem/FileSystemPlugin.cs index 0b4de30dc6..7fef245b5d 100644 --- a/Wox.Plugin.SystemPlugins/FileSystem/FileSystemPlugin.cs +++ b/Wox.Plugin.SystemPlugins/FileSystem/FileSystemPlugin.cs @@ -40,35 +40,28 @@ namespace Wox.Plugin.SystemPlugins.FileSystem { #endregion Misc protected override List QueryInternal(Query query) { - - #region 1 + var results = new List(); + var input = query.RawQuery.ToLower(); + var inputName = input.Split(new string[] { @"\" }, StringSplitOptions.None).First().ToLower(); + var link = UserSettingStorage.Instance.FolderLinks.FirstOrDefault(x => x.Nickname.Equals(inputName, StringComparison.OrdinalIgnoreCase)); + var currentPath = link == null ? input : link.Path + input.Remove(0, inputName.Length); + InitialDriverList(); //TODO: Consider always clearing the cache - List results = new List(); + //TODO: Prove the following was not ever actually used //if (string.IsNullOrEmpty(query.RawQuery)) { // // clear the cache // if (parentDirectories.Count > 0) parentDirectories.Clear(); // return results; //} - #endregion 1 - - var input = query.RawQuery.ToLower(); - var inputName = input.Split(new string[] { @"\" }, StringSplitOptions.None).First().ToLower(); - var link = UserSettingStorage.Instance.FolderLinks.FirstOrDefault(x => x.Nickname.Equals(inputName, StringComparison.OrdinalIgnoreCase)); - var currentPath = link == null ? input : link.Path + input.Remove(0, inputName.Length); - - InitialDriverList(); - foreach (var item in UserSettingStorage.Instance.FolderLinks.Where(x => x.Nickname.StartsWith(input, StringComparison.OrdinalIgnoreCase))) { - //if (item.Nickname.StartsWith(input, StringComparison.OrdinalIgnoreCase)) { //&& item.Nickname.Length != input.Length) { results.Add(new Result(item.Nickname, "Images/folder.png") { Action = (c) => { context.ChangeQuery(item.Nickname); return false; } }); - //} } if (link == null && !driverNames.Any(input.StartsWith)) @@ -77,46 +70,6 @@ namespace Wox.Plugin.SystemPlugins.FileSystem { QueryInternal_Directory_Exists(currentPath, input, results); return results; - - /* - // change to search in current directory - string parentDir = null; - try { - parentDir = Path.GetDirectoryName(input); - } - catch { } - - - - - return results; - if (!string.IsNullOrEmpty(parentDir) && results.Count == 0) { - parentDir = parentDir.TrimEnd('\\', '/'); - //TODO: Why are we doing the following check - - //FUCK THIS CODE o.O!!!!!!! - - if (parentDirectories.ContainsKey(parentDir)) { - var fuzzy = FuzzyMatcher.Create(Path.GetFileName(currentPath).ToLower()); - foreach (var dir in parentDirectories[parentDir]) { - if ((dir.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden) continue; - - var matchResult = fuzzy.Evaluate(dir.Name); - if (!matchResult.Success) continue; - - results.Add(new Result(dir.Name, "Images/folder.png") { - Score = matchResult.Score, - Action = (c) => { - context.ChangeQuery(dir.FullName); - return false; - } - }); - } - } - } - - return results; - */ } private void InitialDriverList() { @@ -157,30 +110,11 @@ namespace Wox.Plugin.SystemPlugins.FileSystem { results.Add(result); } - - //if (results.Count == 0) { - // results.Add(new Result("Open this directory", "Images/folder.png", "No files in this directory") { - // Action = (c) => { - // Process.Start(currentPath); - // return true; - // } - // }); - //} } else { - //results.Add(new Result("Open this directory", "Images/folder.png", string.Format("path: {0}", currentPath)) { - // Score = 50, - // Action = (c) => { - // Process.Start(currentPath); - // return true; - // } - //}); + //TODO: Make sure we do not need anything here } - - /**************************************************************/ - /**************************************************************/ - if (results.Count == 0) { results.Add(new Result("Open this directory", "Images/folder.png", "No files in this directory") { Action = (c) => { @@ -190,12 +124,6 @@ namespace Wox.Plugin.SystemPlugins.FileSystem { }); } - - - - /**************************************************************/ - /**************************************************************/ - var Folder = Path.GetDirectoryName(currentPath); if (Folder != null) { var dirInfo1 = new DirectoryInfo(Folder); diff --git a/Wox/Wox.csproj b/Wox/Wox.csproj index 0c81617d74..dd4c4e29d2 100644 --- a/Wox/Wox.csproj +++ b/Wox/Wox.csproj @@ -33,7 +33,7 @@ true - x86 + AnyCPU true full false