Skip to content

Commit

Permalink
pyobject.so now autoloaded when needed
Browse files Browse the repository at this point in the history
  • Loading branch information
alexanderdreyer committed Dec 6, 2012
1 parent 8a8315c commit 35a0c12
Show file tree
Hide file tree
Showing 4 changed files with 76 additions and 30 deletions.
3 changes: 2 additions & 1 deletion Singular/blackbox.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,8 @@ void blackbox_default_Print(blackbox *b,void *d);
blackbox* getBlackboxStuff(const int t);
/// return the name to the type given by t (r/o)
const char * getBlackboxName(const int t);
/// used by scanner: returns ROOTDECL for known types (and the type number in t)
/// used by scanner: returns ROOT_DECL for known types
/// (and the type number in @c tok)
int blackboxIsCmd(const char *n, int & tok);
/// define a new type
int setBlackboxStuff(blackbox *bb,const char *name);
Expand Down
11 changes: 11 additions & 0 deletions Singular/iparith.cc
Original file line number Diff line number Diff line change
Expand Up @@ -5207,6 +5207,17 @@ static BOOLEAN jjLOAD(leftv, leftv v, BOOLEAN autoexport)
return TRUE;
}

BOOLEAN jjLOADLIB(const char* libname, BOOLEAN autoexport)
{
leftv v = (leftv)omAlloc0Bin(sleftv_bin);
v->data = (char*)libname;
v->rtyp = STRING_CMD;
BOOLEAN res = jjLOAD(NULL, v, autoexport);
omFreeBin(v, sleftv_bin);

return res;
}

#ifdef INIT_BUG
#define XS(A) -((short)A)
#define jjstrlen (proc1)1
Expand Down
63 changes: 40 additions & 23 deletions Singular/pyobject.cc
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ class PythonInterpreter {

/// Initialize unique (singleton) python interpreter instance,
/// and set Singular type identifier
static void init(id_type num ) { instance().m_id = num; }
static void init(id_type num) { instance().m_id = num; }

/// Get Singular type identitfier
static id_type id() { return instance().m_id; }
Expand Down Expand Up @@ -701,33 +701,50 @@ void sync_contexts()
}


// forward declaration
//int iiAddCproc(char *libname, char *procname, BOOLEAN pstatic,
// BOOLEAN(*func)(leftv res, leftv v));

#define ADD_C_PROC(name) iiAddCproc("", (char*)#name, FALSE, name);
blackbox* pyobject_blackbox(int& tok) {
if(blackboxIsCmd("pyobject", tok) != ROOT_DECL)
{
tok = setBlackboxStuff((blackbox*)omAlloc0(sizeof(blackbox)),
"pyobject");
}
return getBlackboxStuff(tok);
}



void pyobject_init()
{
blackbox *b = (blackbox*)omAlloc0(sizeof(blackbox));
b->blackbox_destroy = pyobject_destroy;
b->blackbox_String = pyobject_String;
b->blackbox_Init = pyobject_Init;
b->blackbox_Copy = pyobject_Copy;
b->blackbox_Assign = pyobject_Assign;
b->blackbox_Op1 = pyobject_Op1;
b->blackbox_Op2 = pyobject_Op2;
b->blackbox_Op3 = pyobject_Op3;
b->blackbox_OpM = pyobject_OpM;
b->data = omAlloc0(newstruct_desc_size());

PythonInterpreter::init(setBlackboxStuff(b,"pyobject"));

ADD_C_PROC(python_import);
ADD_C_PROC(python_eval);
ADD_C_PROC(python_run);
int tok = -1;
blackbox* bbx = pyobject_blackbox(tok);
if (bbx->blackbox_Init != pyobject_Init)
{
bbx->blackbox_destroy = pyobject_destroy;
bbx->blackbox_String = pyobject_String;
bbx->blackbox_Init = pyobject_Init;
bbx->blackbox_Copy = pyobject_Copy;
bbx->blackbox_Assign = pyobject_Assign;
bbx->blackbox_Op1 = pyobject_Op1;
bbx->blackbox_Op2 = pyobject_Op2;
bbx->blackbox_Op3 = pyobject_Op3;
bbx->blackbox_OpM = pyobject_OpM;
bbx->data = omAlloc0(newstruct_desc_size());
PythonInterpreter::init(tok);
}
}

extern "C" { void mod_init() { pyobject_init(); } }
#define PYOBJECT_ADD_C_PROC(name) \
psModulFunctions->iiAddCproc(currPack->libname, (char*)#name, FALSE, name);

extern "C" {
void mod_init(SModulFunctions* psModulFunctions)
{
pyobject_init();

PYOBJECT_ADD_C_PROC(python_import);
PYOBJECT_ADD_C_PROC(python_eval);
PYOBJECT_ADD_C_PROC(python_run);
}
}
#undef PYOBJECT_ADD_C_PROC
29 changes: 23 additions & 6 deletions Singular/pyobject_setup.cc
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
#include "config.h"
#include <kernel/mod2.h>
#include <kernel/febase.h>
#include <Singular/blackbox.h>
#include <Singular/ipshell.h>

/* whether pyobject module is linked statically or dynamically */
#ifdef HAVE_PYTHON
Expand All @@ -39,15 +41,30 @@ void pyobject_setup() { pyobject_init(); }

# elif defined(HAVE_DYNAMIC_PYOBJECT) // Case: pyobject is dynamic module (prefered variant)

// forward declaration for Singular/iplib.cc
void* binary_module_function(const char* lib, const char* func);
void pyobject_setup()

/// blackbox support - initialization via autoloading
void* pyobject_autoload(blackbox* bbx)
{
void* fktn = binary_module_function("pyobject", "mod_init");
if (fktn) (* reinterpret_cast<void (*)()>(fktn) )();
else Werror("python related functions are not available");
BOOLEAN jjLOADLIB(const char* libname, BOOLEAN autoexport);
if (jjLOADLIB("pyobject.so", TRUE)) return NULL;

return bbx->blackbox_Init(bbx);
}

void pyobject_default_destroy(blackbox *b, void *d)
{
Werror("Python-based functionality not available!");
}

// Setting up an empty blackbox type, which can be filled with pyobject
void pyobject_setup()
{
blackbox *bbx = (blackbox*)omAlloc0(sizeof(blackbox));
bbx->blackbox_Init = pyobject_autoload;
bbx->blackbox_destroy = pyobject_default_destroy;
setBlackboxStuff(bbx, "pyobject");
}

#else // Case: no python
void pyobject_setup() { }

Expand Down

0 comments on commit 35a0c12

Please sign in to comment.