Files
gnatcoll-bindings/python/gnatcoll-python.ads
Vadim Godunko 4b555a9c55 S306-049 Extend binding for PyFrameObject and PyCodeObject.
To be able to use them to process backtrace information.

Change-Id: I74f1e46338151267ffe632aa6520e7ff64df8cf2
2019-03-11 17:59:23 +03:00

1240 lines
51 KiB
Ada

------------------------------------------------------------------------------
-- G N A T C O L L --
-- --
-- Copyright (C) 2003-2019, AdaCore --
-- --
-- This library is free software; you can redistribute it and/or modify it --
-- under terms of the GNU General Public License as published by the Free --
-- Software Foundation; either version 3, or (at your option) any later --
-- version. This library is distributed in the hope that it will be useful, --
-- but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN- --
-- TABILITY or FITNESS FOR A PARTICULAR PURPOSE. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are granted --
-- additional permissions described in the GCC Runtime Library Exception, --
-- version 3.1, as published by the Free Software Foundation. --
-- --
-- You should have received a copy of the GNU General Public License and --
-- a copy of the GCC Runtime Library Exception along with this program; --
-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
-- <http://www.gnu.org/licenses/>. --
-- --
------------------------------------------------------------------------------
-- Standard interface to the python interpreter.
-- This requires at least python 2.3 to be installed on your system.
with Ada.Unchecked_Conversion;
with Interfaces.C.Strings;
with System;
package GNATCOLL.Python is
procedure Py_Initialize;
-- Initialize the python interpreter. You must call Py_SetProgramName first
procedure Py_Finalize;
-- Finalize the python interpreter
procedure Py_SetProgramName (Name : String);
-- Set the program name. This must be called before Py_Initialize
-- Python also uses the argument to locate its standard library:
-- 1- If PYTHONHOME environment variable is set then it points to the
-- library location prefix,
-- 2- Otherwise, set library prefix to a location relative to program
-- called Name.
-- 3- If the prefix cannot be found using the previous methods, use
-- the value of prefix set by configure during Python build.
-- Name should therefore point to the current executable so that if you
-- provide your own python installation it gets detected by default.
procedure Py_SetPythonHome (Home : String);
-- Set the default "home" directory, that is, the location of the standard
-- Python libraries. The libraries are searched in Home/lib/pythonversion.
-------------
-- Objects --
-------------
type Dummy is limited private;
type PyObject is access Dummy;
pragma Convention (C, PyObject);
type PyObject_Array is array (Natural range <>) of PyObject;
function Py_None return PyObject;
-- Return the python's variable Py_None, which should be returned by
-- procedures. Generally, one need to call Py_INCREF before returning this
-- value.
type PyCodeObject is new PyObject;
type PyFrameObject is new PyObject;
procedure Py_INCREF (Obj : PyObject);
procedure Py_DECREF (Obj : PyObject);
-- Increment or decrement the reference count for Obj. Obj mustn't be null
procedure Py_XINCREF (Obj : PyObject);
procedure Py_XDECREF (Obj : PyObject);
-- Same as above, but Obj can be null
procedure Print_Refcount (Obj : PyObject; Msg : String);
-- A debug procedure that prints the reference count of the object on
-- stdout.
function Get_Refcount (Obj : PyObject) return Integer;
-- Return the current reference counter for Obj. Used for debug only
function PyObject_Str (Obj : PyObject) return PyObject;
-- Compute the string representation of Obj. Returns the string
-- representation on success, NULL on failure. This is the equivalent of
-- the Python expression "str(obj)".
-- This is the equivalent of the python call str(obj), and is used by
-- python in print statements.
-- Returned value must be Py_DECREF
function PyObject_Repr (Obj : PyObject) return PyObject;
-- Similar to PyObject_Str, ie provides a displayable version of Obj. This
-- is the equivalent of the python call repr(obj), and is used by python
-- in backquotes.
-- Returned value must be Py_DECREF
function PyObject_CallMethod
(Object : PyObject; Name : String) return PyObject;
function PyObject_CallMethod
(Object : PyObject; Name : String; Arg1 : PyObject) return PyObject;
function PyObject_CallMethod
(Object : PyObject; Name : String; Arg1 : Integer) return PyObject;
-- A few examples of functions to call a method.
-- In C, the profile of this method is:
-- PyObject* PyObject_CallMethod
-- (PyObject* object, char* name, char* format, ...);
-- For instance, to call it with an object and a integer as a parameter,
-- you would use:
-- result = PyObject_CallMethod (object, "method", "(Oi)", other_obj, 1);
-- except that due to ABI differences, you need to use a C wrapper,
-- otherwise things will break on e.g. x86_64
--
-- format has the same form as in the calls to Py_BuildValue
function PyObject_Call
(Object : PyObject; Args : PyObject; Kw : PyObject) return PyObject;
-- Call a callable Python object, Object, with
-- arguments and keywords arguments. The 'args' argument can not be
-- NULL, but the 'kw' argument can be NULL.
-- The returned object must be DECREF
function PyObject_CallObject
(Object : PyObject; Args : PyObject) return PyObject;
pragma Import (C, PyObject_CallObject, "PyObject_CallObject");
-- Call a callable Python object, callable_object, with
-- arguments given by the tuple, args. If no arguments are
-- needed, then args may be NULL. Returns the result of the
-- call on success, or NULL on failure. This is the equivalent
-- of the Python expression: apply(o,args).
function PyObject_SetAttrString
(Object : PyObject;
Name : Interfaces.C.Strings.chars_ptr;
Attr : PyObject) return Integer;
pragma Import (C, PyObject_SetAttrString, "PyObject_SetAttrString");
-- Set the value of the attribute named Name, for Object, to the value
-- Attr. Returns -1 on failure. This is the equivalent of the Python
-- statement "Object.Name = Attr".
function PyObject_SetAttrString
(Obj : PyObject; Attr_Name : String; Value : PyObject) return Integer;
procedure PyObject_SetAttrString
(Obj : PyObject; Attr_Name : String; Value : PyObject);
-- Same as above
function PyObject_GenericSetAttr
(Object : PyObject;
Name : PyObject;
Attr : PyObject) return Integer;
pragma Import (C, PyObject_GenericSetAttr, "PyObject_GenericSetAttr");
-- Generic attribute setter that directly interface with the object's
-- __dict__, not with its __setattr__ method.
-- Name must be decref-ed by the caller.
function PyObject_GenericSetAttrString
(Object : PyObject;
Name : String;
Attr : PyObject) return Integer;
-- Same as above, but accepts a string as parameter
function PyObject_HasAttrString
(Obj : PyObject; Attr_Name : String) return Boolean;
-- Whether a specific attribute exists for the object
function PyObject_GetAttrString
(Object : PyObject;
Name : Interfaces.C.Strings.chars_ptr) return PyObject;
pragma Import (C, PyObject_GetAttrString, "PyObject_GetAttrString");
-- Lookup an attribute in the object's dictionnary.
-- The returned object *must* be DECREF.
function PyObject_GetAttrString
(Object : PyObject; Name : String) return PyObject;
-- Same as above.
-- The returned object must be DECREF.
function PyObject_Dir (Object : PyObject) return PyObject;
-- A list of strings for all entries in Object's dictionary..
-- The returned object must be DECREF.
function PyObject_IsTrue (Obj : PyObject) return Boolean;
-- Returns True if the object, Obj, is considered to be true, False if Obj
-- is considered to be false. This is equivalent to the Python expression:
-- "not not obj"
--------------
-- Integers --
--------------
-- Not bound: PyInt_FromString and PyInt_FromUnicode
function PyInt_FromLong (Value : Interfaces.C.long) return PyObject;
-- Create a new integer object from its value
function PyInt_FromSize_t (Value : Interfaces.C.size_t) return PyObject;
-- Create a new integer object from Value
function PyInt_AsLong (Int : PyObject) return Interfaces.C.long;
-- Return the value of Int.
-- Return -1 and set PyErr_Occurred if Int is not an integer object.
function PyInt_GetMax return Interfaces.C.long;
-- Return the maximum value an integer can have
function PyInt_Check (Obj : PyObject) return Boolean;
-- Returns true if the Obj is an integer object
------------
-- Floats --
------------
function PyFloat_AsDouble (Float : PyObject) return Interfaces.C.double;
-- Return the value of Float
function PyFloat_Check (Obj : PyObject) return Boolean;
-- Returns true if the Obj is a float object
function PyFloat_FromDouble (Value : Interfaces.C.double) return PyObject;
pragma Import (C, PyFloat_FromDouble, "PyFloat_FromDouble");
-- Creates a new float object
--------------
-- Booleans --
--------------
-- Support for the "bool" type. However, older versions of python do not
-- support this type, so you should also always check for PyInt_Check at
-- the same time
function PyBool_Check (Obj : PyObject) return Boolean;
-- Returns true if Obj is a boolean object
function PyBool_Is_True (Obj : PyObject) return Boolean;
-- Obj must return True for PyBool_Check. This function returns True if
-- obj is True.
function PyBool_FromBoolean (Value : Boolean) return PyObject;
-- Create a new boolean object
------------
-- Tuples --
------------
-- The following subprograms are in fact simple examples of importing the C
-- function in your C code, depending on your exact requirement. In C,
-- these are function with unknown number of parameters
--
-- The C function is:
-- int PyArg_ParseTuple(PyObject *arg, char *format, ...);
function PyArg_ParseTuple
(Arg : PyObject;
Format : String;
Value1 : System.Address) return Boolean;
function PyArg_ParseTuple
(Arg : PyObject;
Format : String;
Value1, Value2 : System.Address) return Boolean;
function PyArg_ParseTuple
(Arg : PyObject;
Format : String;
Value1, Value2, Value3 : System.Address) return Boolean;
function PyArg_ParseTuple
(Arg : PyObject;
Format : String;
Value1, Value2, Value3, Value4 : System.Address) return Boolean;
function PyArg_ParseTuple
(Arg : PyObject;
Format : String;
Value1, Value2, Value3, Value4, Value5 : System.Address) return Boolean;
-- Parses Format, and stores each of the tuple element in each of the
-- Values. The number of elements in Format must be the same as the number
-- of Value parameter
-- The exact description of the format should be found in the python
-- documentation.
-- Note: there is *no* type safety in these functions, but then neither is
-- there in C.
subtype PyTuple is PyObject;
function PyTuple_New (Size : Integer) return PyObject;
-- Create a new tuple that contains Size elements
function PyTuple_GetItem (Tuple : PyTuple; Index : Integer) return PyObject;
-- Get the item at a specific location in the tuple, starting at index 0.
-- Do not decref returned value.
-- See also PyObject_GetItem
procedure PyTuple_SetItem
(Tuple : PyTuple; Index : Integer; Value : PyObject);
-- Set an item in the tuple. The reference counting of Value is not
-- increased
-- See also PyObject_SetItem
function PyTuple_Size (Tuple : PyTuple) return Integer;
pragma Obsolescent (PyTuple_Size, "See PyObject_Size instead");
-- Return the size of the tuple
function Create_Tuple (Objects : PyObject_Array) return PyObject;
-- Return a new tuple made of Objects
function PyTuple_Check (Obj : PyObject) return Boolean;
-- Whether Object is a tuple
-----------
-- Lists --
-----------
function PyList_New (Size : Integer := 0) return PyObject;
-- Create a new empty list, with an initialize size
function PyList_Append (List : PyObject; Obj : PyObject) return Integer;
-- Append Obj at the end of List, and return the index of the newly
-- inserted item.
-- Increased Obj's refcount
function PyList_GetItem (List : PyObject; Index : Integer) return PyObject;
pragma Obsolescent (PyList_GetItem, "See PyObject_GetItem instead");
-- Get the item at a specific location in the list, starting at index 0.
-- Do not decref the returned value.
-- See also PyObject_GetItem.
function PyList_Size (List : PyObject) return Integer;
pragma Obsolescent (PyList_Size, "See PyObject_Size instead");
-- Return the number of items in the list
function PyList_Check (Obj : PyObject) return Boolean;
-- True if Obj is a python list
---------------
-- Iterators --
---------------
-- Iterators are an extension to list and tuples, and encapsulate both, in
-- addition to user-defined types that have a __iter__ method.
function PyIter_Check (Obj : PyObject) return Boolean;
-- True if object is an iterator (as returned by PyObject_GetIter)
function PyObject_GetIter (Obj : PyObject) return PyObject;
pragma Import (C, PyObject_GetIter, "PyObject_GetIter");
-- This is equivalent to the Python expression iter(o). It returns a new
-- iterator for the object argument, or the object itself if the object is
-- already an iterator. Raises TypeError and returns NULL if the object
-- cannot be iterated.
function PyObject_Size (Obj : PyObject) return Integer;
pragma Import (C, PyObject_Size, "PyObject_Size");
-- Return the length of object o. If the object o provides either the
-- sequence and mapping protocols, the sequence length is returned. On
-- error, -1 is returned. This is the equivalent to the Python expression
-- len(o).
function PyObject_GetItem (Obj, Key : PyObject) return PyObject;
pragma Import (C, PyObject_GetItem, "PyObject_GetItem");
-- Returns a new reference
-- Return element of o corresponding to the object key or NULL on failure.
-- This is the equivalent of the Python expression o[key].
function PyObject_GetItem (Obj : PyObject; Key : Integer) return PyObject;
-- A special case where the key is an integer
function PyObject_SetItem (Obj, Key, Value : PyObject) return Integer;
pragma Import (C, PyObject_SetItem, "PyObject_SetItem");
-- Map the object key to the value v. Returns -1 on failure. This is the
-- equivalent of the Python statement o[key] = v.
procedure PyObject_SetItem
(Obj : PyObject; Key : Integer; Value : PyObject);
-- A special case where the key is an integer
function PyIter_Next (Obj : PyObject) return PyObject;
pragma Import (C, PyIter_Next, "PyIter_Next");
-- Return the next value from the iteration o. If the object is an
-- iterator, this retrieves the next value from the iteration, and returns
-- NULL with no exception set if there are no remaining items. If the
-- object is not an iterator, TypeError is raised, or if there is an error
-- in retrieving the item, returns NULL and passes along the exception.
--
-- To write a loop which iterates over an iterator, the code should look
-- something like this:
--
-- Iterator : PyObject := PyObject_GetIter (Obj);
-- Item : PyObject;
--
-- if Iterator = null then
-- -- propagate error
-- else
-- loop
-- Item := PyIter_Next (Iterator);
-- exit when Item = null;
--
-- Py_DECREF (Item);
-- end loop;
--
-- Py_DECREF (Iterator);
-- end if;
-------------
-- Strings --
-------------
function PyBaseString_Check (Obj : PyObject) return Boolean;
-- Returns True if Obj is either a string or a unicode object
function PyString_Check (Obj : PyObject) return Boolean;
-- Returns true if the Obj is a string object
function PyString_AsString (Str : PyObject) return String;
-- Same as above, higher-level
function PyString_FromString (Str : String) return PyObject;
-- Return a python object representing Str
function PyUnicode_Check (Obj : PyObject) return Boolean;
function PyUnicode_FromString (Str : String) return PyObject;
-- A Unicode string, from a latin-1 encoded Ada string
function Unicode_AsString
(Str : PyObject; Encoding : String := "utf-8") return String;
-- Return an encoded version of Str.
-- This is not a function from python, but a wrapper around
-- PyUnicode_AsEncodedString and PyString_AsString.
-- In case of encoding error, characters are replaced with '?'
type Unicode_Error_Handling is (Strict, Ignore, Replace);
-- How encoding errors are treated for unicode objects
-- Strict: raise a ValueError
-- Ignore: ignore the wrong characters, which are skipped
-- Replace: replace illegal characters with '?'
function PyUnicode_AsEncodedString
(Unicode : PyObject; -- A unicode object
Encoding : String; -- The encoding
Errors : Unicode_Error_Handling := Strict) -- Error handling
return PyObject;
-- Encodes a Unicode object and returns the result as Python string object.
-- You can use PyString_AsString to get the corresponding Ada string.
-------------
-- Modules --
-------------
function PyImport_AddModule (Module_Name : String) return PyObject;
-- Return the module object corresponding to a module name. The name
-- argument may be of the form package.module. First check the modules
-- dictionary if there's one there, and if not, create a new one and insert
-- in in the modules dictionary. Because the former action is most common,
-- this does not return a new reference, and you do not own the returned
-- reference.
--
-- Warning: this function does not load or import the module; if the module
-- wasn't already loaded, you will get an empty module object. Use
-- PyImport_ImportModule() or one of its variants to import a module.
-- Return NULL with an exception set on failure.
function PyImport_ImportModule (Module_Name : String) return PyObject;
-- Import a new module in the interpreter
function PyImport_Import (Name : PyObject) return PyObject;
pragma Import (C, PyImport_Import, "PyImport_Import");
-- Higher-level import emulator which emulates the "import" statement
-- more accurately -- it invokes the __import__() function from the
-- builtins of the current globals. This means that the import is
-- done using whatever import hooks are installed in the current
-- environment, e.g. by "rexec".
-- A dummy list ["__doc__"] is passed as the 4th argument so that
-- e.g. PyImport_Import(PyString_FromString("win32com.client.gencache"))
-- will return <module "gencache"> instead of <module "win32com">. */
function PyModule_GetDict (Module : PyObject) return PyObject;
-- Return the dictionary object that implements module's namespace; this
-- object is the same as the __dict__ attribute of the module object. This
-- function never fails.
-- It is recommended that you use the other PyModule_* subprograms rather
-- than manipulate this dictionnary directly.
-- The returned dictionary is a borrow reference, so you shouldn't
-- Py_DECREF it.
function PyModule_New (Module_Name : String) return PyObject;
-- Create a new module.
-- Use the PyModule_GetDic function to add new objects to the module, or
-- better use PyModule_AddObject.
function PyModule_AddObject
(Module : PyObject;
Name : Interfaces.C.Strings.chars_ptr;
Object : PyObject) return Integer;
pragma Import (C, PyModule_AddObject, "PyModule_AddObject");
-- Add a new object to the module's directory. Object can be a subprogram,
-- integer, ... Do not Py_DECREF Object afterward, this is only a borrowed
-- reference.
-- Return 0 in case of success, -1 in case of error.
-- Name can be freed immediately by the caller
function PyModule_AddObject
(Module : PyObject; Name : String; Object : PyObject) return Integer;
-- Same as above
function PyModule_Getname (Module : PyObject) return String;
-- Return the name of the module
----------------------------------
-- Creating modules and methods --
----------------------------------
type Argument_Methods is mod 2 ** Integer'Size;
METH_VARGS : constant Argument_Methods := 16#0001#;
METH_KEYWORDS : constant Argument_Methods := 16#0002#;
METH_NOARGS : constant Argument_Methods := 16#0004#;
METH_CLASS : constant Argument_Methods := 16#0010#;
METH_STATIC : constant Argument_Methods := 16#0020#;
-- How arguments are passed to callbacks:
-- - METH_VARGS: only positional arguments in the form of a tuple are
-- accepted
-- - "METH_VARGS or METH_KEYWORDS": a function accepting keyword
-- arguments.
-- - METH_CLASS and METH_STATIC can only be used for class methods, not
-- for module methods. They both indicate that a method is a class-wide
-- method. They are callable from the class or an instance, but the
-- instance is ignored and not passed as a parameter.
type C_Method_Vargs is access function
(Self : PyObject; Args : PyObject) return PyObject;
pragma Convention (C, C_Method_Vargs);
-- A callback for a METH_VARGS method.
-- The first argument is the object on which the method is applied, or null
-- if this is a standard function.
-- The second argument is a tuple of the parameters. They can be extracted
-- through a call to PyArg_ParseTuple.
type C_Method_Keywords is access function
(Self : PyObject; Args : PyObject; Kwargs : PyObject) return PyObject;
pragma Convention (C, C_Method_Keywords);
-- A callback for a METH_KEYWORDS method.
-- The first argument is the object on which the method is applied, or null
-- if this is a standard function.
-- The second argument is a tuple of the positional parameters.
-- The third argument is a hash table of the named parameters.
-- Parameters can be extracted through a call to
-- PyArg_ParseTupleAndKeywords.
type C_Callback_Record is private;
type C_Callback is access C_Callback_Record;
pragma Convention (C, C_Callback);
-- The exact type doesn't matter, we only want to cover all possible cases
-- of callbacks (C_Method_Vargs, C_Method_Keywords)
function To_Callback is new Standard.Ada.Unchecked_Conversion
(C_Method_Vargs, C_Callback);
function To_Callback is new Standard.Ada.Unchecked_Conversion
(C_Method_Keywords, C_Callback);
type PyMethodDef is record
Name : Interfaces.C.Strings.chars_ptr;
Func : C_Callback;
Flags : Argument_Methods;
Doc : Interfaces.C.Strings.chars_ptr;
end record;
pragma Convention (C, PyMethodDef);
-- Definition for one of the methods of an object.
-- Name is the name used in the python interpreter to reference the method
-- (one would use the syntax self.Name (...))
-- Func is the callback in the Ada code that should be called when the
-- method is invoked.
-- Flags indicates how the arguments should be passed.
-- Doc is the optional documentation string for the method
No_MethodDef : constant PyMethodDef;
type PyMethodDef_Array is array (Natural range <>) of PyMethodDef;
pragma Convention (C, PyMethodDef_Array);
-- The full list of methods supported by a type.
-- You do not need to terminate this array by a null element, as is done in
-- C. This is automatically taken care of by Ada.
No_MethodDef_Array : constant PyMethodDef_Array;
procedure Free (Method : in out PyMethodDef);
procedure Free (Methods : in out PyMethodDef_Array);
-- Free the memory occupied by Method
function Py_InitModule
(Module_Name : String;
Methods : PyMethodDef_Array := No_MethodDef_Array;
Doc : String := "") return PyObject;
-- Create and initialize a new module, with a set of predefined methods.
-- Do not free Methods while the module is in use.
-- The module is not visible in the interpreter until you have done a
-- "import MODULE_NAME" in the interpreter.
--
-- The first parameter to the methods declared in Methods will be null.
procedure Add_Function
(Module : PyObject; Func : PyMethodDef; Self : PyObject := null);
-- Add a new function to Module.
-- Do not free Func while this function is registered.
-- The first parameter to Func will be Self (defaults to Module if Self is
-- null).
------------------
-- Dictionaries --
------------------
-- Dictionaries are hash tables, used internally by python to associate
-- functions with modules or methods with objects.
-- See PyModule_GetDict to see how to get the dictionary from a module.
subtype PyDictObject is PyObject;
function PyDict_Check (Obj : PyObject) return Boolean;
-- Return True if Obj is a dict object or an instance of a subtype of the
-- dict type.
function PyDict_New return PyDictObject;
-- Create a new empty dictionary
function PyDict_Contains
(Dict : PyDictObject; Key : PyObject) return Boolean;
-- Determine if dictionary contains key
function PyDict_SetItemString
(Dict : PyDictObject;
Key : Interfaces.C.Strings.chars_ptr;
Obj : PyObject) return Integer;
pragma Import (C, PyDict_SetItemString, "PyDict_SetItemString");
-- Store a new object in Dict. Obj should be Py_DECREF after the call.
-- Return 0 if all went well, -1 otherwise
-- Key should be deallocated.
procedure PyDict_SetItemString
(Dict : PyDictObject; Key : String; Obj : PyObject);
-- Same as above. Refcounting for Obj is automatically increased, you do
-- not need to do it yourself.
function PyDict_SetItem
(Dict : PyDictObject;
Key : PyObject;
Value : PyObject) return Integer;
-- Add a new item to the dictionary.
-- Key and Value should be Py_DECREF'ed after this call.
-- Return 0 if all went well, -1 otherwise
function PyDict_GetItemString
(Dict : PyDictObject;
Key : Interfaces.C.Strings.chars_ptr) return PyObject;
pragma Import (C, PyDict_GetItemString, "PyDict_GetItemString");
-- Get an object from a dictionary. Do not decref the returned value
function PyDict_GetItemString
(Dict : PyDictObject; Key : String) return PyObject;
-- Same as above
function PyDict_GetItem
(Dict : PyDictObject; Key : PyObject) return PyObject;
-- Same as above
procedure PyDict_Next
(Dict : PyObject;
Pos : in out Integer;
Key : out PyObject;
Value : out PyObject);
-- Starting with Pos = 0, this traverses all items in Dict.
-- When there are no more items, Pos is set to -1.
-- It isn't safe to use this in a loop that modifies Dict.
function PyDict_Size (Dict : PyObject) return Integer;
-- Return the number of elements in Dict
----------
-- Sets --
----------
-- A set object is an unordered collection of distinct hashable objects.
-- Common uses include membership testing, removing duplicates from a
-- sequence, and computing mathematical operations such as intersection,
-- union, difference, and symmetric difference.
function PyAnySet_Check (Obj : PyObject) return Boolean;
-- Return true if p is a set object, a frozenset object, or an instance of
-- a subtype.
---------------
-- Functions --
---------------
function PyFunction_Check (Func : PyObject) return Boolean;
-- Whether Func is a function object
function PyFunction_Get_Code (Func : PyObject) return PyCodeObject;
-- Return the code of the function (see PyEval_EvalCodeEx).
-- Refcount for the code is not increased.
function PyFunction_Get_Globals (Func : PyObject) return PyObject;
-- Return the globals dictionary the function belongs to
function PyFunction_Get_Defaults (Func : PyObject) return PyObject;
-- Return a tuple of the default values for all the parameters of Func
function PyFunction_Get_Closure (Func : PyObject) return PyObject;
-- ???
function PyCallable_Check (Func : PyObject) return Boolean;
-- Determine if the object o is callable. This function always succeeds
------------------
-- Object types --
------------------
type PyTypeObject_Record is private;
type PyTypeObject is access all PyTypeObject_Record;
-- The internal structure that describes a Python type (and all the default
-- primitive subprograms like __getattr__, __setattr__, ...
function GetTypeObject (Obj : PyObject) return PyTypeObject;
-- Return the type object that describes the class Obj belongs to
function Name (Obj : PyTypeObject) return String;
-- Name of type, useful for printing, in format "<module>.<name>"
function Type_New
(Name : String;
Bases : PyTuple;
Dict : PyObject;
Metatype : PyTypeObject := null) return PyObject;
-- Creates a so called new-style class in python.
-- Such classes have a metaclass (ie their type) that is "type" or one of
-- its ancestors. Their provide a number of advantages over older classes:
-- - it is possible to extend builtin types such as "list" or "tuple"
-- - support for the "super" function, to provide collaborative multiple
-- inheritance
-- - support for properties (ie fields manipulated through setters and
-- getters)
-- - better Method Resolution Order, more compatible with multiple
-- inheritance.
-- See the original paper at
-- http://www.python.org/download/releases/2.2.3/descrintro
--
-- This replaces the older PyClass_New.
-- This isn't a standard python function, but is specific to Ada. If the
-- Metatype is not specified, it will default to "type", although depending
-- on the list of base classes you provide, python might decide to use
-- another metaclass.
-- This function is similar to calling the "type()" function from within
-- python:
-- A = type ("Name", (list,), {});
-- which creates a new class Name deriving from "list".
--
-- Dict can contain any number of things (including for instance the list
-- of methods for the class, although you can add some later), just as if
-- you were defining the class in Python:
-- - "__slots__"
-- - "__module__" (although that is set automatically otherwise)
-- - "__doc__"
function PyObject_IsInstance
(Inst : PyObject; Cls : PyObject) return Boolean;
-- Return if the metaclass of Inst is Cls (ie Inst was created with
-- something like "Inst = Cls (...)"
----------------
-- Exceptions --
----------------
procedure PyErr_Print;
-- Print the current exception and its traceback to sys.stderr.
-- This also clears the error indicator.
-- Call this procedure only if the error indicator is set
procedure PyErr_SetInterrupt;
-- Interrupt the current command in the interpreter. This is the equivalent
-- of Control-C in a terminal executing python.
procedure PyErr_Fetch
(EType : out PyObject;
Occurrence : out PyObject;
Traceback : out PyObject);
-- Get the current exception information.
-- Occurrence is a tuple, made of the following information:
-- (msg, ('input_stream_name', line, column, input_text))
-- where msg is the exception's message, and the second tuple is the
-- location where the exception occurred.
-- EType is the type of the exception, like "exceptions.SyntaxError".
--
-- This calls clears the current exception. If you want to call PyErr_Print
-- later on, you will need to call PyErr_Restore with the same parameters
-- to restore the current exception.
procedure PyErr_NormalizeException
(EType : in out PyObject;
Occurrence : in out PyObject;
Traceback : in out PyObject);
-- Normalize a raised exception. This generally needs to be called after
-- PyErr_Fetch.
-- This ensure that if EType is an class, Occurrence is an instance.
procedure PyErr_Restore
(EType : PyObject;
Occurrence : PyObject;
Traceback : PyObject);
-- Set the current exception
procedure PyErr_Clear;
-- Clear the current exception. This must be called at the end of your
-- exception handlers, although it is called automatically by PyErr_Print
procedure PyErr_BadArgument;
-- Set the current exception as a "bad argument" exception. The function
-- should also return null to its caller.
function PyErr_Occurred return PyObject;
-- Return the current exception, or null if no exception was raised
function PyErr_NewException
(Name : String; Base : PyObject := null; Dict : PyObject := null)
return PyObject;
-- Create a new exception, which can then be raised by:
-- - calling PyErr_SetString (Except, "message");
-- - returning null from your subprogram
-- Name must be of the form "module.name"
procedure PyErr_SetString (Except : PyObject; Msg : String);
-- Raise Except, and associate it with a specific message
---------
-- Sys --
---------
procedure PySys_SetObject (Name : String; Object : PyObject);
-- Set one of the predefined objects in the python interpreter. See the
-- module "sys".
-- Among these objects are:
-- - "stdin", "stdout", "stderr": standard file objects
-- - "_stdin", _stdout", "_stderr": initial values for standard files
-- - "modules": dictionary of modules
-- - "path": module search path
-- - "ps1", "ps2": prompts
-- - "displayhook": ???
-- - "excepthook": ???
function PySys_GetObject (Name : String) return PyObject;
-- Return an object from the sys module,
-- Returned object must not be Py_DECREF by the caller.
-----------
-- Files --
-----------
function PyFile_WriteString (Text : String; File : PyObject) return Boolean;
-- Write a string to an instance of file. You can for instance get such an
-- instance by using
-- PySys_GetObject ("stdout")
-- Return False if the string couldn't be written
function PyFile_FromString (File_Name, Mode : String) return PyObject;
-- Create an instance of file.
-----------------
-- Class types --
-----------------
function Lookup_Object (Module : String; Name : String) return PyObject;
function Lookup_Object (Module : PyObject; Name : String) return PyObject;
-- Lookup an object in the module.
-- Typical use is
-- Obj := Lookup_Class_Object ("__builtin__", "file");
-- null is returned if the class is not found.
-- The second version is slightly faster and should be used when you
-- already have a handle to the module
procedure Add_Method
(Class : PyObject; Func : PyMethodDef; Self : PyObject := null;
Module : PyObject);
-- Add a new method to the class.
-- The method is an instance method.
-- When the method is called from the python interpreter, its Self argument
-- is set to the value of Self.
-- Its first argument will always be the instance itself. Therefore the
-- first character in the argument to PyArg_ParseTuple should be "O".
procedure Add_Static_Method
(Class : PyObject; Func : PyMethodDef; Self : PyObject := null;
Module : PyObject);
-- Return a static version of Method. This method doesn't receive an
-- instance or the class as its first parameter. This is similar to C++ or
-- Java's static methods.
-- If no documentation is set for the method, it will be set to the fully
-- qualified name of the method, since otherwise there is no way from the
-- GPS shell to get access to the class to which the method belongs.
procedure Add_Class_Method
(Class : PyObject; Func : PyMethodDef; Module : PyObject);
-- Return a class version of Method.
-- This is a method that receives the class as implicit first argument,
-- just like an instance method receives the instance.
-- It can be called either on the class or an instance. If a class method
-- is called for a derived class, the derived class object is passed as the
-- implied first argument.
-- If no documentation is set for the method, it will be set to the fully
-- qualified name of the method, since otherwise there is no way from the
-- GPS shell to get access to the class to which the method belongs.
function Py_IsSubclass (Class : PyObject; Base : PyObject) return Boolean;
-- True if Class is a subclass of Base (or Base itself)
function PyMethod_Check (Obj : PyObject) return Boolean;
-- Whether Obj is a method of a class
function PyMethod_Self (Obj : PyObject) return PyObject;
-- Return the instance with which the method is bound. This might be null
-- if we have an unbound class method (Class.method), or non-null if we
-- have a bound class method (the result of self.method)
-- Returns a borrowed reference, no need to Py_DECREF
function PyMethod_Function (Obj : PyObject) return PyObject;
-- Return the function object associated with the method. That is the code
-- that is actually executed when the method is called
-----------------
-- Descriptors --
-----------------
-- Descriptors are an advanced feature of python, used as the underlying
-- capability for bounded methods, properties,...
-- Basically, when a field in an instance is a descriptor, its value is
-- read from a Getter, instead of directly. Likewise it is set through a
-- Setter.
type C_Getter is access function
(Obj : PyObject; Closure : System.Address) return PyObject;
pragma Convention (C, C_Getter);
type C_Setter is access function
(Obj : PyObject;
Prop : PyObject;
Closure : System.Address) return Integer;
pragma Convention (C, C_Setter);
-- Closure is some custom data you have specified in the call to
-- Create_GetSetDef
function PyDescr_NewGetSet
(Typ : PyObject;
Name : String;
Setter : C_Setter := null;
Getter : C_Getter := null;
Doc : String := "";
Closure : System.Address := System.Null_Address) return Boolean;
-- Register a new property (accessed through setters and getters) in the
-- specified Typ. The property is immediately added to the dictionary.
-- False is returned if the property could not be added.
-- The Closure will be passed as is to Setter and Getter.
------------------------------------
-- Creating and declaring methods --
------------------------------------
function Create_Method_Def
(Name : String;
Func : C_Method_Vargs;
Doc : String := "")
return PyMethodDef;
-- Convenience function to create method definitions.
-- See the description of the parameters in the declaration of PyMethodDef
-- The flags are automatically set to METH_VARGS, which is the appropriate
-- type for callbacks of this form.
-- The returned value must be freed by the caller.
function Create_Method_Def
(Name : String;
Func : C_Method_Keywords;
Doc : String := "")
return PyMethodDef;
-- Same as above, for methods accepting keywords.
-- The returned value must be freed by the caller
------------------------
-- Executing commands --
------------------------
function PyRun_SimpleString (Cmd : String) return Boolean;
-- Executes Cmd in the __main__ module.
-- Return True on success, False if an exception occurred (it is your
-- responsibility to check the current exception)
type Interpreter_State is private;
Py_Single_Input : constant Interpreter_State;
Py_File_Input : constant Interpreter_State;
Py_Eval_Input : constant Interpreter_State;
-- The state of the interpreter when evaluating a string.
-- - Single_Input: evaluate any command in the interpreter. This will
-- print the result (but return None)
-- - Eval_Input: evaluate an expression. Evaluates an expression.
-- Equivalent to 'eval'.
-- - File_Input: evaluate a whole file, and return None.
-- Equivalent to 'exec'.
function PyRun_String
(Str : String;
Start : Interpreter_State;
Globals : PyObject;
Locals : PyObject) return PyObject;
-- Execute Python source code from str in the context specified by the
-- dictionaries globals and locals. The parameter start specifies the
-- start token that should be used to parse the source code.
--
-- Returns NULL if an exception occurred, None otherwise.
function Py_CompileString
(Cmd : String; Name : String; State : Interpreter_State)
return PyCodeObject;
-- Compile Cmd into a code object. Null is returned if Cmd couldn't be
-- compiled, either because of a syntax error or because Cmd is incomplete
function PyEval_GetGlobals return PyObject;
pragma Import (C, PyEval_GetGlobals, "PyEval_GetGlobals");
-- Return the dictionary for global variables
function PyEval_EvalCode
(Code : PyCodeObject;
Globals : PyObject;
Locals : PyObject) return PyObject;
-- Evaluate a precompiled code object
function PyEval_EvalCodeEx
(Code : PyCodeObject;
Globals : PyObject;
Locals : PyObject;
Args : PyTuple := null;
Kwds : PyDictObject := null;
Defaults : PyTuple := null;
Closure : PyObject := null) return PyObject;
-- Evaluate a precompiled code object. This is mostly used to execute a
-- function (get its code with PyFunction_Get_Code), specifying some of
-- the parameters
function Py_Main return Integer;
-- Run the python interpreter main program
--------------------------------------
-- Evaluating and Tracing execution --
--------------------------------------
-- Python will periodically call two functions that you can register: a
-- profile function, called every time a subprogram is called or returns,
-- and a trace function called for every instruction.
-- These can be used to trace the execution of your program, but also to
-- interrupt a parser embedded in your application:
-- - register a trace function, and every n calls, check for gtk events
-- and call PyErr_SetInterrupt if necessary
-- - a profile function would not be called for an infinite loop that
-- never calls another subprogram, so is not appropriate for for such
-- usage.
-- There is still a catch: you will not be able to interrupt a long sleep()
-- operation with this method, since the interpret itself is paused. The
-- best solution to handle this is to have your own Control-C handler,
-- although the user would have to type this in the terminal used to start
-- your application.
type Why_Trace_Func is private;
PyTrace_Call : constant Why_Trace_Func;
PyTrace_Exception : constant Why_Trace_Func;
PyTrace_Line : constant Why_Trace_Func;
PyTrace_Return : constant Why_Trace_Func;
PyTrace_C_Call : constant Why_Trace_Func;
PyTrace_C_Exception : constant Why_Trace_Func;
PyTrace_C_Return : constant Why_Trace_Func;
type Py_Trace_Func is access function
(User_Arg : PyObject;
Frame : PyFrameObject;
Why : Why_Trace_Func;
Object : PyObject) return Integer;
-- Return 0 in case of success, or -1 if an exception is raised.
-- Objects's value depends on the type of callback. For PyTrace_Return,
-- this is the returned value. For PyTrace_Exception, this is the
-- exception. PyTrace_Line is called for all instructions, but only for
-- the trace function, not the profile function.
procedure PyEval_SetProfile (Proc : Py_Trace_Func; User_Arg : PyObject);
-- Register a new profiling function
procedure PyEval_SetTrace (Proc : Py_Trace_Func; User_Arg : PyObject);
-- Register a new tracing function
function PyFrame_GetLineNumber (Frame : PyFrameObject) return Integer;
-- Return the line number that frame is currently executing.
function PyFrame_Get_Code (Frame : PyFrameObject) return PyCodeObject;
-- Return code object associated with the frame.
-- Returns a borrowed reference, no need to Py_DECREF
function PyCode_Get_Filename (Code : PyCodeObject) return PyObject;
-- Return file name of the code object.
-- Returns a borrowed reference, no need to Py_DECREF
function PyCode_Get_Name (Code : PyCodeObject) return PyObject;
-- Return function name of the code object.
-- Returns a borrowed reference, no need to Py_DECREF
function PyFrame_Get_Back (Frame : PyFrameObject) return PyFrameObject;
-- Return previous frame in stack.
-- Returns a borrowed reference, no need to Py_DECREF
-------------------------------------
-- Embedding Ada objects in python --
-------------------------------------
subtype PyCObject is PyObject;
-- This type represents an opaque value that contains any kind of data,
-- transparent for python.
function PyCObject_Check (Obj : PyObject) return Boolean;
-- Return True if Obj is a Py_CObject
type PyCObject_Destructor is access procedure (Obj : System.Address);
pragma Convention (C, PyCObject_Destructor);
type PyCObject_Destructor2 is access
procedure (Obj : System.Address; Desc : System.Address);
pragma Convention (C, PyCObject_Destructor2);
function PyCObject_FromVoidPtr
(Obj : System.Address;
Destr : PyCObject_Destructor := null)
return PyObject;
-- Create a new PyCObject that encapsulate Obj. Destr is called when the
-- object is reclaimed, unless it is null.
-- Returns a newly referenced object.
function PyCObject_FromVoidPtrAndDesc
(Obj : System.Address;
Desc : System.Address;
Destr : PyCObject_Destructor2 := null)
return PyObject;
-- Same as above, except Desc is also passed to Destr
function PyCObject_AsVoidPtr (Self : PyObject) return System.Address;
-- Return the Ada object embedded in Self
function PyCObject_GetDesc (Self : PyObject) return System.Address;
-- Return the Desc object that Self was created with, or null
private
type Dummy is null record;
type Interpreter_State is new Integer;
Py_Single_Input : constant Interpreter_State := 256;
Py_File_Input : constant Interpreter_State := 257;
Py_Eval_Input : constant Interpreter_State := 258;
-- Values are copied from Python.h, and must be synchronized. They will
-- probably never change, though, so this should be safe.
type Why_Trace_Func is new Integer;
PyTrace_Call : constant Why_Trace_Func := 0;
PyTrace_Exception : constant Why_Trace_Func := 1;
PyTrace_Line : constant Why_Trace_Func := 2;
PyTrace_Return : constant Why_Trace_Func := 3;
PyTrace_C_Call : constant Why_Trace_Func := 4;
PyTrace_C_Exception : constant Why_Trace_Func := 5;
PyTrace_C_Return : constant Why_Trace_Func := 6;
type C_Callback_Record is new Integer; -- whatever
No_MethodDef : constant PyMethodDef :=
(Interfaces.C.Strings.Null_Ptr, null, 0,
Interfaces.C.Strings.Null_Ptr);
No_MethodDef_Array : constant PyMethodDef_Array := (1 .. 0 => No_MethodDef);
type PyTypeObject_Record is new Integer; -- whatever
pragma Convention (C, PyTypeObject);
pragma Convention (C, Py_Trace_Func);
pragma Import (C, PyDict_New, "PyDict_New");
pragma Import (C, PyEval_SetProfile, "PyEval_SetProfile");
pragma Import (C, PyEval_SetTrace, "PyEval_SetTrace");
pragma Inline (PyImport_AddModule);
pragma Inline (PyRun_SimpleString);
pragma Inline (PyArg_ParseTuple);
pragma Inline (PyString_Check);
pragma Inline (PyUnicode_Check);
pragma Inline (PyInt_Check);
pragma Inline (PyFloat_Check);
pragma Import (C, Py_Initialize, "Py_Initialize");
pragma Import (C, Py_Finalize, "Py_Finalize");
pragma Import (C, PyModule_GetDict, "PyModule_GetDict");
pragma Import (C, Py_INCREF, "ada_py_incref");
pragma Import (C, Py_DECREF, "ada_py_decref");
pragma Import (C, Py_XINCREF, "ada_py_xincref");
pragma Import (C, Py_XDECREF, "ada_py_xdecref");
pragma Import (C, PyErr_Print, "PyErr_Print");
pragma Import (C, PyObject_Str, "PyObject_Str");
pragma Import (C, PyObject_Call, "PyObject_Call");
pragma Import (C, PyEval_EvalCode, "PyEval_EvalCode");
pragma Import (C, PyEval_EvalCodeEx, "ada_PyEval_EvalCodeEx");
pragma Import (C, PyErr_SetInterrupt, "PyErr_SetInterrupt");
pragma Import (C, PyTuple_New, "PyTuple_New");
pragma Import (C, PyTuple_GetItem, "PyTuple_GetItem");
pragma Import (C, PyTuple_SetItem, "PyTuple_SetItem");
pragma Import (C, Py_None, "ada_py_none");
pragma Import (C, PyErr_Clear, "PyErr_Clear");
pragma Import (C, PyErr_Fetch, "PyErr_Fetch");
pragma Import (C, PyTuple_Size, "PyTuple_Size");
pragma Import (C, PyInt_FromLong, "PyInt_FromLong");
pragma Import (C, PyInt_FromSize_t, "PyInt_FromSize_t");
pragma Import (C, PyInt_AsLong, "PyInt_AsLong");
pragma Import (C, PyFloat_AsDouble, "PyFloat_AsDouble");
pragma Import (C, PyInt_GetMax, "PyInt_GetMax");
pragma Import (C, PyErr_Occurred, "PyErr_Occurred");
pragma Import (C, PyList_New, "PyList_New");
pragma Import (C, PyList_Append, "PyList_Append");
pragma Import (C, PyErr_BadArgument, "PyErr_BadArgument");
pragma Import (C, PyErr_NormalizeException, "PyErr_NormalizeException");
pragma Import (C, PyObject_Dir, "PyObject_Dir");
pragma Import (C, PyObject_Repr, "PyObject_Repr");
pragma Import (C, PyErr_Restore, "PyErr_Restore");
pragma Import (C, PyDict_Size, "PyDict_Size");
pragma Import (C, PyList_GetItem, "PyList_GetItem");
pragma Import (C, PyList_Size, "PyList_Size");
pragma Import (C, PyDict_SetItem, "PyDict_SetItem");
pragma Import (C, PyDict_GetItem, "PyDict_GetItem");
pragma Import (C, Get_Refcount, "ada_pyget_refcount");
pragma Import (C, PyFunction_Get_Code, "ada_pyfunction_get_code");
pragma Import (C, PyFunction_Get_Globals, "ada_pyfunction_get_globals");
pragma Import (C, PyFunction_Get_Closure, "ada_pyfunction_get_closure");
pragma Import (C, PyFunction_Get_Defaults, "ada_pyfunction_get_defaults");
pragma Import (C, GetTypeObject, "ada_gettypeobject");
pragma Inline (PyCObject_Check);
pragma Import (C, PyCObject_FromVoidPtr, "PyCObject_FromVoidPtr");
pragma Import
(C, PyCObject_FromVoidPtrAndDesc, "PyCObject_FromVoidPtrAndDesc");
pragma Import (C, PyCObject_AsVoidPtr, "PyCObject_AsVoidPtr");
pragma Import (C, PyCObject_GetDesc, "PyCObject_GetDesc");
pragma Import (C, PyMethod_Function, "PyMethod_Function");
pragma Import (C, PyMethod_Self, "PyMethod_Self");
pragma Import (C, PyFrame_GetLineNumber, "PyFrame_GetLineNumber");
pragma Import (C, PyFrame_Get_Code, "ada_pyframe_get_code");
pragma Import (C, PyFrame_Get_Back, "ada_pyframe_get_back");
pragma Import (C, PyCode_Get_Filename, "ada_pycode_get_filename");
pragma Import (C, PyCode_Get_Name, "ada_pycode_get_name");
end GNATCOLL.Python;