Changeset 35a0c12 in git


Ignore:
Timestamp:
Dec 6, 2012, 2:46:43 PM (11 years ago)
Author:
Alexander Dreyer <adreyer@…>
Branches:
(u'spielwiese', '8d54773d6c9e2f1d2593a28bc68b7eeab54ed529')
Children:
51f56350e07c1644b3a676e1ad934986088a0bd0
Parents:
8a8315c064275dd1bdd822cbc4e00072d5a3761e
git-author:
Alexander Dreyer <adreyer@gmx.de>2012-12-06 14:46:43+01:00
git-committer:
Alexander Dreyer <adreyer@gmx.de>2012-12-06 15:20:24+01:00
Message:
pyobject.so now autoloaded when needed
Location:
Singular
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • Singular/blackbox.h

    r8a8315c r35a0c12  
    7070/// return the name to the type given by t (r/o)
    7171const char *    getBlackboxName(const int t);
    72 /// used by scanner: returns ROOTDECL for known types (and the type number in t)
     72/// used by scanner: returns ROOT_DECL for known types
     73/// (and the type number in @c tok)
    7374int blackboxIsCmd(const char *n, int & tok);
    7475/// define a new type
  • Singular/iparith.cc

    r8a8315c r35a0c12  
    52065206  }
    52075207  return TRUE;
     5208}
     5209
     5210BOOLEAN jjLOADLIB(const char* libname, BOOLEAN autoexport)
     5211{
     5212  leftv v =  (leftv)omAlloc0Bin(sleftv_bin);
     5213  v->data = (char*)libname;
     5214  v->rtyp = STRING_CMD;
     5215  BOOLEAN res = jjLOAD(NULL, v, autoexport);
     5216  omFreeBin(v, sleftv_bin);
     5217
     5218  return res;
    52085219}
    52095220
  • Singular/pyobject.cc

    r8a8315c r35a0c12  
    6464  /// Initialize unique (singleton) python interpreter instance,
    6565  /// and set Singular type identifier
    66   static void init(id_type num ) { instance().m_id = num; }
     66  static void init(id_type num) { instance().m_id = num; }
    6767
    6868  /// Get Singular type identitfier
     
    702702
    703703
    704 // forward declaration
    705 //int iiAddCproc(char *libname, char *procname, BOOLEAN pstatic,
    706 //               BOOLEAN(*func)(leftv res, leftv v));
    707 
    708 #define ADD_C_PROC(name) iiAddCproc("", (char*)#name, FALSE, name);
     704
     705blackbox* pyobject_blackbox(int& tok) {
     706  if(blackboxIsCmd("pyobject", tok) != ROOT_DECL)
     707  {
     708    tok = setBlackboxStuff((blackbox*)omAlloc0(sizeof(blackbox)),
     709                           "pyobject");
     710  }
     711  return getBlackboxStuff(tok);
     712}
     713
    709714
    710715
    711716void pyobject_init()
    712717{
    713   blackbox *b = (blackbox*)omAlloc0(sizeof(blackbox));
    714   b->blackbox_destroy = pyobject_destroy;
    715   b->blackbox_String  = pyobject_String;
    716   b->blackbox_Init    = pyobject_Init;
    717   b->blackbox_Copy    = pyobject_Copy;
    718   b->blackbox_Assign  = pyobject_Assign;
    719   b->blackbox_Op1     = pyobject_Op1;
    720   b->blackbox_Op2     = pyobject_Op2;
    721   b->blackbox_Op3     = pyobject_Op3;
    722   b->blackbox_OpM     = pyobject_OpM;
    723   b->data             = omAlloc0(newstruct_desc_size());
    724 
    725   PythonInterpreter::init(setBlackboxStuff(b,"pyobject"));
    726 
    727   ADD_C_PROC(python_import);
    728   ADD_C_PROC(python_eval);
    729   ADD_C_PROC(python_run);
    730 }
    731 
    732 extern "C" { void mod_init() { pyobject_init(); } }
    733 
     718  int tok = -1;
     719  blackbox* bbx = pyobject_blackbox(tok);
     720  if (bbx->blackbox_Init != pyobject_Init)
     721  {
     722    bbx->blackbox_destroy = pyobject_destroy;
     723    bbx->blackbox_String  = pyobject_String;
     724    bbx->blackbox_Init    = pyobject_Init;
     725    bbx->blackbox_Copy    = pyobject_Copy;
     726    bbx->blackbox_Assign  = pyobject_Assign;
     727    bbx->blackbox_Op1     = pyobject_Op1;
     728    bbx->blackbox_Op2     = pyobject_Op2;
     729    bbx->blackbox_Op3     = pyobject_Op3;
     730    bbx->blackbox_OpM     = pyobject_OpM;
     731    bbx->data             = omAlloc0(newstruct_desc_size());
     732   
     733    PythonInterpreter::init(tok);
     734  }
     735}
     736
     737#define PYOBJECT_ADD_C_PROC(name) \
     738  psModulFunctions->iiAddCproc(currPack->libname, (char*)#name, FALSE, name);
     739
     740extern "C" {
     741  void mod_init(SModulFunctions* psModulFunctions)
     742  {
     743    pyobject_init();
     744
     745    PYOBJECT_ADD_C_PROC(python_import);
     746    PYOBJECT_ADD_C_PROC(python_eval);
     747    PYOBJECT_ADD_C_PROC(python_run);   
     748  }
     749}
     750#undef PYOBJECT_ADD_C_PROC
  • Singular/pyobject_setup.cc

    r8a8315c r35a0c12  
    1616#include <kernel/mod2.h>
    1717#include <kernel/febase.h>
     18#include <Singular/blackbox.h>
     19#include <Singular/ipshell.h>
    1820
    1921/* whether pyobject module is linked statically or dynamically */
     
    4042# elif defined(HAVE_DYNAMIC_PYOBJECT) // Case: pyobject is dynamic module (prefered variant)
    4143
    42 // forward declaration for Singular/iplib.cc
    43 void* binary_module_function(const char* lib, const char* func);
    44 void pyobject_setup()
     44
     45/// blackbox support - initialization via autoloading
     46void* pyobject_autoload(blackbox* bbx)
    4547{
    46   void* fktn = binary_module_function("pyobject", "mod_init");
    47   if (fktn) (* reinterpret_cast<void (*)()>(fktn) )();
    48   else Werror("python related functions are not available");
     48  BOOLEAN jjLOADLIB(const char* libname, BOOLEAN autoexport);
     49  if (jjLOADLIB("pyobject.so", TRUE)) return NULL;
     50
     51  return bbx->blackbox_Init(bbx);
    4952}
    5053
     54void pyobject_default_destroy(blackbox  *b, void *d)
     55{
     56  Werror("Python-based functionality not available!");
     57}
     58
     59// Setting up an empty blackbox type, which can be filled with pyobject
     60void pyobject_setup()
     61{
     62  blackbox *bbx = (blackbox*)omAlloc0(sizeof(blackbox));
     63  bbx->blackbox_Init = pyobject_autoload;
     64  bbx->blackbox_destroy = pyobject_default_destroy;
     65  setBlackboxStuff(bbx, "pyobject");
     66}
     67 
    5168#else                // Case: no python
    5269void pyobject_setup() { }
Note: See TracChangeset for help on using the changeset viewer.