Skip to content

Commit

Permalink
new: convert pyobject <-> intvec
Browse files Browse the repository at this point in the history
  • Loading branch information
Alexander Dreyer committed Aug 1, 2012
1 parent a04a05c commit 29fc843
Show file tree
Hide file tree
Showing 4 changed files with 111 additions and 53 deletions.
42 changes: 38 additions & 4 deletions Singular/pyobject.cc
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
#include <omalloc/omalloc.h>

#include <kernel/febase.h>
#include <kernel/intvec.h>

#include "subexpr.h"
#include "lists.h"
Expand Down Expand Up @@ -297,6 +298,7 @@ class PythonObject
template <class CastType = PythonObject::ptr_type>
class PythonCastStatic:
public PythonObject {
typedef PythonCastStatic self;
public:

PythonCastStatic(void* value):
Expand All @@ -308,12 +310,23 @@ class PythonCastStatic:
private:
ptr_type get(ptr_type value) { return value; }
ptr_type get(long value) { return PyInt_FromLong(value); }
ptr_type get(int value) { return PyInt_FromLong((long)value); }
ptr_type get(const char* value) { return PyString_FromString(value); }
ptr_type get(char* value) { return get(const_cast<const char*>(value)); }
ptr_type get(intvec* value); // inlined below
ptr_type get(lists value); // inlined after PythonObjectDynamic
};

template <class CastType>
inline PythonObject::ptr_type
PythonCastStatic<CastType>::get(intvec* value)
{
ptr_type pylist(PyList_New(0));
for (int idx = 0; idx < value->length(); ++idx)
PyList_Append(pylist, self::get((*value)[idx]));

return pylist;
}

/** @class PythonCastDynamic
* This class does conversion of Singular objects to python objects on runtime.
Expand All @@ -336,6 +349,7 @@ class PythonCastDynamic:
case INT_CMD: return PythonCastStatic<long>(value);
case STRING_CMD: return PythonCastStatic<const char*>(value);
case LIST_CMD: return PythonCastStatic<lists>(value);
case INTVEC_CMD: return PythonCastStatic<intvec*>(value);
}

sleftv tmp;
Expand Down Expand Up @@ -520,7 +534,7 @@ BOOLEAN pyobject_Op1(int op, leftv res, leftv head)
case TYPEOF_CMD:
res->data = (void*) omStrDup("pyobject");
res->rtyp = STRING_CMD;
return FALSE;
return FALSE;
}

if (!PythonCastStatic<>(head)(op).assign_to(res))
Expand Down Expand Up @@ -574,8 +588,6 @@ BOOLEAN pyobject_Op3(int op, leftv res, leftv arg1, leftv arg2, leftv arg3)
/// blackbox support - n-ary operations
BOOLEAN pyobject_OpM(int op, leftv res, leftv args)
{
typedef PythonCastStatic<PythonObject::sequence_tag> seq_type;

switch(op) // built-in return types first
{
case STRING_CMD:
Expand All @@ -585,8 +597,30 @@ BOOLEAN pyobject_OpM(int op, leftv res, leftv args)
res->rtyp = STRING_CMD;
return FALSE;
}
}

case INTVEC_CMD:
PythonObject obj = PythonCastStatic<>(args->Data());
unsigned long len = obj.size();

intvec* vec = new intvec(len);
for(unsigned long idx = 0; idx != len; ++idx) {
long value = PyInt_AsLong(obj[idx]);
(*vec)[idx] = static_cast<int>(value);

if ((value == -1) && PyErr_Occurred()) {
value = 0;
PyErr_Clear();
}
if (value != long((*vec)[idx])) {
delete vec;
Werror("'pyobject` cannot be converted to intvec");
return TRUE;
}
}
res->data = (void *)vec;
res->rtyp = op;
return FALSE;
}
typedef PythonCastStatic<PythonObject::sequence_tag> seq_type;
if (! PythonCastStatic<>(args)(op, seq_type(args->next)).assign_to(res))
return FALSE;
Expand Down
96 changes: 51 additions & 45 deletions Tst/Short/pyobject.res.gz.uu
Original file line number Diff line number Diff line change
@@ -1,48 +1,54 @@
begin 644 pyobject.res.gz
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
:$W\'AK_FVC;6TY#C0T!^T?L3+2R,J44;````
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
<+:*1_)B-WZNWK=/C#;#'^[NS?P/;IO'4#A\`````
`
end
8 changes: 4 additions & 4 deletions Tst/Short/pyobject.stat
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
1 >> tst_memory_0 :: 1295945736:3120- exported :3-1-2:ix86-Linux:mamawutz:185276
1 >> tst_memory_1 :: 1295945736:3120- exported :3-1-2:ix86-Linux:mamawutz:1466368
1 >> tst_memory_2 :: 1295945736:3120- exported :3-1-2:ix86-Linux:mamawutz:1466368
1 >> tst_timer_1 :: 1295945736:3120- exported :3-1-2:ix86-Linux:mamawutz:11
1 >> tst_memory_0 :: 1340802591:3144- exported :3-1-4:x86_64-Linux:lts035:220512
1 >> tst_memory_1 :: 1340802591:3144- exported :3-1-4:x86_64-Linux:lts035:3239936
1 >> tst_memory_2 :: 1340802591:3144- exported :3-1-4:x86_64-Linux:lts035:3239936
1 >> tst_timer_1 :: 1340802591:3144- exported :3-1-4:x86_64-Linux:lts035:9
18 changes: 18 additions & 0 deletions Tst/Short/pyobject.tst
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,24 @@ attrib(new_pyobj, "new_attr"); // -> error message
pyobject ll_empty = list();
ll_empty;

// converting to and from intvec
intvec v0;
v0;
pyobject obj0 = v0;
obj0;

intvec v=(1,2,3);
pyobject obj = v;
obj;
intvec(obj);

intvec(python_eval("[1,2,9999999999]")); // -> error
intvec(python_eval("[1,2,list()]")); // -> error

ring r=0,x,lp;
def rl = ringlist(r);

python_eval("tuple")(list(rl[1..3]));

tst_status(1);
$

0 comments on commit 29fc843

Please sign in to comment.