My Project
Data Structures | Public Types | Public Member Functions | Protected Member Functions | Private Types | Private Member Functions | Private Attributes
PythonObject Class Reference

This class defines an interface for calling PyObject from Singular. More...

Data Structures

struct  sequence_tag
 

Public Types

typedef PyObject * ptr_type
 

Public Member Functions

 PythonObject ()
 
 PythonObject (ptr_type ptr)
 
ptr_type check_context (ptr_type ptr) const
 
self operator() (int op) const
 Unary operations. More...
 
self operator() (int op, const self &arg) const
 Binary and n-ary operations. More...
 
self operator() (int op, const self &arg1, const self &arg2) const
 Ternary operations. More...
 
self operator[] (const self &idx) const
 Get item. More...
 
self operator[] (long idx) const
 
 operator const ptr_type () const
 Get actual PyObject*. More...
 
char * repr () const
 Get representative as C-style string. More...
 
char * str () const
 Extract C-style string. More...
 
Py_ssize_t size () const
 
BOOLEAN assign_to (leftv result)
 
void import_as (const char *name) const
 
int compare (int op, const self &arg) const
 
self attr (const self &arg) const
 
self del_attr (const self &arg) const
 

Protected Member Functions

self args2list (const self &args) const
 
BOOLEAN handle_exception () const
 
void append_iter (self iterator)
 
int py_opid (int op) const
 

Private Types

typedef PythonObject self
 

Private Member Functions

BOOLEAN none_to (leftv result) const
 
BOOLEAN python_to (leftv result) const
 

Private Attributes

ptr_type m_ptr
 The actual pointer. More...
 

Detailed Description

This class defines an interface for calling PyObject from Singular.

Note
This class does not take care of the memory mangement, this is done in the blackbox routines.

Definition at line 107 of file pyobject.cc.


Data Structure Documentation

◆ PythonObject::sequence_tag

struct PythonObject::sequence_tag

Definition at line 113 of file pyobject.cc.

Member Typedef Documentation

◆ ptr_type

typedef PyObject* PythonObject::ptr_type

Definition at line 112 of file pyobject.cc.

◆ self

Definition at line 109 of file pyobject.cc.

Constructor & Destructor Documentation

◆ PythonObject() [1/2]

PythonObject::PythonObject ( )
inline

Definition at line 115 of file pyobject.cc.

115 : m_ptr(Py_None) { }
ptr_type m_ptr
The actual pointer.
Definition: pyobject.cc:291

◆ PythonObject() [2/2]

PythonObject::PythonObject ( ptr_type  ptr)
inline

Definition at line 116 of file pyobject.cc.

116  : m_ptr(ptr) {
117  if (!ptr && handle_exception()) m_ptr = Py_None;
118  }
BOOLEAN handle_exception() const
Definition: pyobject.cc:234

Member Function Documentation

◆ append_iter()

void PythonObject::append_iter ( self  iterator)
inlineprotected

Definition at line 252 of file pyobject.cc.

252  {
253  ptr_type item;
254  while ((item = PyIter_Next(iterator))) {
255  PyList_Append(*this, item);
256  Py_DECREF(item);
257  }
258  }
PyObject * ptr_type
Definition: pyobject.cc:112

◆ args2list()

self PythonObject::args2list ( const self args) const
inlineprotected

Definition at line 224 of file pyobject.cc.

225  {
226  self pylist(PyList_New(0));
227  PyList_Append(pylist, *this);
228  if(PyTuple_Check(args)) pylist.append_iter(PyObject_GetIter(args));
229  else PyList_Append(pylist, args);
230 
231  return pylist;
232  }

◆ assign_to()

BOOLEAN PythonObject::assign_to ( leftv  result)
inline

Definition at line 189 of file pyobject.cc.

190  {
191  return (m_ptr? (m_ptr == Py_None? none_to(result): python_to(result)): TRUE);
192  }
#define TRUE
Definition: auxiliary.h:100
BOOLEAN none_to(leftv result) const
Definition: pyobject.cc:274
BOOLEAN python_to(leftv result) const
Definition: pyobject.cc:282
return result
Definition: facAbsBiFact.cc:75

◆ attr()

self PythonObject::attr ( const self arg) const
inline

Definition at line 211 of file pyobject.cc.

211 { return PyObject_GetAttr(*this, arg); }

◆ check_context()

ptr_type PythonObject::check_context ( ptr_type  ptr) const
inline

Definition at line 120 of file pyobject.cc.

120  {
121  if(ptr) sync_contexts();
122  return ptr;
123  }
void sync_contexts()
getting stuff from python to Singular namespace
Definition: pyobject.cc:662

◆ compare()

int PythonObject::compare ( int  op,
const self arg 
) const
inline

Definition at line 207 of file pyobject.cc.

208  { return PyObject_RichCompareBool(*this, arg, py_opid(op)); }
int py_opid(int op) const
Definition: pyobject.cc:260

◆ del_attr()

self PythonObject::del_attr ( const self arg) const
inline

Definition at line 213 of file pyobject.cc.

214  {
215  if (!PyObject_HasAttr(*this, arg))
216  Werror("Cannot delete attribute %s.", arg.repr());
217  else
218  PyObject_DelAttr(*this, arg);
219 
220  return self();
221  }
void Werror(const char *fmt,...)
Definition: reporter.cc:189

◆ handle_exception()

BOOLEAN PythonObject::handle_exception ( ) const
inlineprotected

Definition at line 234 of file pyobject.cc.

234  {
235 
236  if(!PyErr_Occurred()) return FALSE;
237 
238  PyObject *pType, *pMessage, *pTraceback;
239  PyErr_Fetch(&pType, &pMessage, &pTraceback);
240 
241  WerrorS("pyobject error occurred");
242  WerrorS(PyString_AsString(pMessage));
243 
244  Py_XDECREF(pType);
245  Py_XDECREF(pMessage);
246  Py_XDECREF(pTraceback);
247 
248  PyErr_Clear();
249  return TRUE;
250  }
#define FALSE
Definition: auxiliary.h:96
void WerrorS(const char *s)
Definition: feFopen.cc:24

◆ import_as()

void PythonObject::import_as ( const char *  name) const
inline

Definition at line 194 of file pyobject.cc.

194  {
195  idhdl handle = enterid(name, 0, DEF_CMD,
196  &IDROOT, FALSE);
197 
198  if (handle)
199  {
200  IDDATA(handle) = (char*)m_ptr;
201  Py_XINCREF(m_ptr);
202  IDTYP(handle) = PythonInterpreter::id();
203  }
204  else { WerrorS("Importing pyobject to Singular failed"); }
205  }
static id_type id()
Get Singular type identitfier.
Definition: pyobject.cc:56
Definition: idrec.h:35
char name(const Variable &v)
Definition: factory.h:196
idhdl enterid(const char *s, int lev, int t, idhdl *root, BOOLEAN init, BOOLEAN search)
Definition: ipid.cc:278
#define IDDATA(a)
Definition: ipid.h:126
#define IDROOT
Definition: ipid.h:19
#define IDTYP(a)
Definition: ipid.h:119
@ DEF_CMD
Definition: tok.h:58

◆ none_to()

BOOLEAN PythonObject::none_to ( leftv  result) const
inlineprivate

Definition at line 274 of file pyobject.cc.

275  {
276  Py_XDECREF(m_ptr);
277  result->data = NULL;
278  result->rtyp = NONE;
279  return FALSE;
280  }
#define NULL
Definition: omList.c:12
#define NONE
Definition: tok.h:221

◆ operator const ptr_type()

PythonObject::operator const ptr_type ( ) const
inline

Get actual PyObject*.

Definition at line 176 of file pyobject.cc.

176 { return m_ptr; }

◆ operator()() [1/3]

self PythonObject::operator() ( int  op) const
inline

Unary operations.

Definition at line 125 of file pyobject.cc.

126  {
127  switch(op)
128  {
129  case '(': return check_context(PyObject_CallObject(*this, NULL));
130  case ATTRIB_CMD: return PyObject_Dir(*this);
131  case PROC_CMD: return *this;
132  }
133 
134  if (op == PythonInterpreter::id())
135  return *this;
136 
137  return self(NULL);
138  }
ptr_type check_context(ptr_type ptr) const
Definition: pyobject.cc:120
@ PROC_CMD
Definition: grammar.cc:280
@ ATTRIB_CMD
Definition: tok.h:36

◆ operator()() [2/3]

self PythonObject::operator() ( int  op,
const self arg 
) const
inline

Binary and n-ary operations.

Definition at line 141 of file pyobject.cc.

141  {
142 
143  switch(op)
144  {
145  case '+': return PyNumber_Add(*this, arg);
146  case '-': return PyNumber_Subtract(*this, arg);
147  case '*': return PyNumber_Multiply(*this, arg);
148  case '/': return PyNumber_Divide(*this, arg);
149  case '^': return PyNumber_Power(*this, arg, Py_None);
150  case '(': return check_context(PyObject_CallObject(*this, arg));
151  case '[': return operator[](arg);
152  case KILLATTR_CMD: return del_attr(arg);
153  case LIST_CMD: return args2list(arg);
154  case '.': case COLONCOLON: case ATTRIB_CMD: return attr(arg);
155  }
156  return self(NULL);
157  }
self attr(const self &arg) const
Definition: pyobject.cc:211
self args2list(const self &args) const
Definition: pyobject.cc:224
self del_attr(const self &arg) const
Definition: pyobject.cc:213
self operator[](const self &idx) const
Get item.
Definition: pyobject.cc:172
@ COLONCOLON
Definition: grammar.cc:275
@ LIST_CMD
Definition: tok.h:118
@ KILLATTR_CMD
Definition: tok.h:108

◆ operator()() [3/3]

self PythonObject::operator() ( int  op,
const self arg1,
const self arg2 
) const
inline

Ternary operations.

Definition at line 160 of file pyobject.cc.

161  {
162  switch(op)
163  {
164  case ATTRIB_CMD:
165  if(PyObject_SetAttr(*this, arg1, arg2) == -1) handle_exception();
166  return self();
167  }
168  return self(NULL);
169  }

◆ operator[]() [1/2]

self PythonObject::operator[] ( const self idx) const
inline

Get item.

Definition at line 172 of file pyobject.cc.

172 { return PyObject_GetItem(*this, idx); }

◆ operator[]() [2/2]

self PythonObject::operator[] ( long  idx) const
inline

Definition at line 173 of file pyobject.cc.

173 { return operator[](PyInt_FromLong(idx)); }

◆ py_opid()

int PythonObject::py_opid ( int  op) const
inlineprotected

Definition at line 260 of file pyobject.cc.

260  {
261  switch(op)
262  {
263  case '<': return Py_LT;
264  case '>': return Py_GT;
265  case EQUAL_EQUAL: return Py_EQ;
266  case NOTEQUAL: return Py_NE;
267  case GE: return Py_GE;
268  case LE: return Py_LE;
269  }
270  return -1;
271  }
@ GE
Definition: grammar.cc:269
@ EQUAL_EQUAL
Definition: grammar.cc:268
@ LE
Definition: grammar.cc:270
@ NOTEQUAL
Definition: grammar.cc:273

◆ python_to()

BOOLEAN PythonObject::python_to ( leftv  result) const
inlineprivate

Definition at line 282 of file pyobject.cc.

283  {
284  result->data = m_ptr;
285  Py_XINCREF(m_ptr);
286  result->rtyp = PythonInterpreter::id();
287  return !m_ptr;
288  }

◆ repr()

char* PythonObject::repr ( ) const
inline

Get representative as C-style string.

Definition at line 179 of file pyobject.cc.

180  {
181  return omStrDup(PyString_AsString(PyObject_Repr(*this)));
182  }
#define omStrDup(s)
Definition: omAllocDecl.h:263

◆ size()

Py_ssize_t PythonObject::size ( ) const
inline

Definition at line 187 of file pyobject.cc.

187 { return PyObject_Size(m_ptr); }

◆ str()

char* PythonObject::str ( ) const
inline

Extract C-style string.

Definition at line 185 of file pyobject.cc.

185 { return omStrDup(PyString_AsString(*this)); }

Field Documentation

◆ m_ptr

ptr_type PythonObject::m_ptr
private

The actual pointer.

Definition at line 291 of file pyobject.cc.


The documentation for this class was generated from the following file: