4
4
namespace VOS { namespace Python { namespace internal {
6
// hack: vos_datatype_sizes should be in libvos, but for some reason it's
7
// private there. Until I can get that sorted out, copy it here.
8
const int vos_datatype_sizes[VOS_DATATYPE_LAST_STATIC_TYPE] = {
10
sizeof(int8_t), sizeof(uint8_t),
11
sizeof(int16_t), sizeof(uint16_t),
12
sizeof(int32_t), sizeof(uint32_t),
13
sizeof(int64_t), sizeof(uint64_t),
14
sizeof(float), sizeof(double),
15
sizeof(vos_string_t*), sizeof(vos_vobject_t),
16
sizeof(vos_datatype_t), sizeof(bool)
6
19
static PyObject* vobject_new(PyTypeObject* type, PyObject* args, PyObject* kwds);
7
20
static PyObject* vobject_repr(vobjectWrapper* self);
8
21
static PyObject* vobject_getid(vobjectWrapper* self);
185
198
method_call(methodWrapper* self, PyObject* args, PyObject* kwds) {
186
std::cerr << "calling method " << self->method->name << "\n";
188
vosNewStackMessage(msg, self->self, self->method->name, 0, 0);
190
vosNewStackReply(result, msg, 1, (0));
199
vosNewStackMessage(msg, self->self, self->method->name,
200
self->method->params.size(), 0);
202
vos_msgfield_t* field;
204
Py_ssize_t args_pos = 0;
206
for(int i = 0; i < self->method->params.size(); i++) {
207
field = &msg->fields[i];
208
field->key = self->method->params[i].name.get();
209
std::string key(*self->method->params[i].name);
210
field->valueType = self->method->params[i].datatype;
211
// XXX: we don't support count!=1 yet
212
if(self->method->params[i].count != 1) {
213
PY_RAISE(PyExc_NotImplementedError,
214
"Method uses parameter with multiple count");
216
field->valueLength = vos_datatype_sizes[field->valueType];
217
PyObject* pyarg = PyDict_GetItemString(kwds, key.c_str());
219
pyarg = PyTuple_GetItem(args, args_pos++);
222
PY_RAISE(PyExc_ValueError,
223
("Insufficient arguments: expected value for " +
227
unwrapValue(value, field);
230
unsigned int fields = self->method->returnParams.size(), reply_size = 0;
231
for(int i = 0; i < fields; i++)
232
reply_size += vos_datatype_sizes[self->method->returnParams[i].datatype];
233
vosNewStackReply(result, msg, fields, (reply_size));
192
235
vosCall(msg, &result);
193
236
if (result->type != VOS_MSGTYPE_REPLY ||
194
237
result->method != self->method->name) {
195
238
PY_RAISE(PyExc_RuntimeError, "Did not get the expected reply.");
241
// XXX: not handling returns with count != 1, must fix kernel.cc
243
PyObject* res = NULL;
246
} else if(fields == 1) {
247
value = wrapValue(&result->fields[0]);
249
value = PyTuple_New(fields);
250
for(int i = 0; i < fields; i++)
251
PyTuple_SET_ITEM(value, i, wrapValue(&result->fields[i]));
198
254
vosFreeMessage(result);