Skip to content

Commit

Permalink
Fix indexing N-Dimension arrays in python.
Browse files Browse the repository at this point in the history
Added ability to get length of an array if the size is not already known.
  • Loading branch information
Brandon-T committed Dec 23, 2023
1 parent 190745b commit 2b772fd
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 3 deletions.
12 changes: 12 additions & 0 deletions RemoteInput/Plugin/ControlCenter.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -671,6 +671,18 @@ void ControlCenter::send_array_response_index_length(Stream &stream, jarray arra
break;

case ReflectionType::OBJECT:
{
std::vector<jobject> objects(length);
JNIEnv* env = main_reflector->getEnv();
for (std::size_t i = 0; i < length; ++i)
{
jobject result = env->GetObjectArrayElement(static_cast<jobjectArray>(array), index + i);
objects[i] = result ? env->NewGlobalRef(result) : nullptr;
}
stream.write(&objects[0], objects.size() * sizeof(jobject));
}
break;

case ReflectionType::ARRAY:
{
std::vector<jobject> objects(length);
Expand Down
41 changes: 38 additions & 3 deletions RemoteInput/Plugin/Python/PythonJavaArray.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ PyGetSetDef PyJavaArray_PropertyMembers[] = {
};

PyMethodDef PyJavaArray_Methods[] = {
{(char*)"get_length", PYTHON_FASTCALL(Python_JavaArray_GetLength), METH_FASTCALL, (char*)""},
{(char*)"get_1d", PYTHON_FASTCALL(Python_JavaArray_Get1D), METH_FASTCALL | METH_KEYWORDS, (char*)""},
{(char*)"get_2d", PYTHON_FASTCALL(Python_JavaArray_Get2D), METH_FASTCALL | METH_KEYWORDS, (char*)""},
{(char*)"get_3d", PYTHON_FASTCALL(Python_JavaArray_Get3D), METH_FASTCALL | METH_KEYWORDS, (char*)""},
Expand Down Expand Up @@ -178,6 +179,14 @@ std::vector<PyObject*> python_parse_arguments(const char* (&keywords)[keywords_s
return result;
}

PyObject* Python_JavaArray_GetLength(PyJavaArray* self, PyObject* args[], Py_ssize_t args_length) noexcept
{
EIOS* eios = python_get_eios(self);
jarray array = from_python_object<jarray>(self);
std::size_t length = eios->control_center->reflect_array_size(array);
return to_python_object(length);
}

PyObject* Python_JavaArray_Get1D(PyJavaArray* self, PyObject* args[], Py_ssize_t args_length, PyObject* kwnames) noexcept
{
static const char* kwlist[] = {"type", "indices", "index", "length", nullptr};
Expand Down Expand Up @@ -254,7 +263,7 @@ PyObject* Python_JavaArray_Get2D(PyJavaArray* self, PyObject* args[], Py_ssize_t
std::size_t y = from_python_object<std::size_t>(y_object);

Stream &stream = eios->control_center->reflect_array(array, type, 1, x, y)->data_stream();
return read_array_type(stream, self, type, 2);
return read_array_type(stream, self, type, 0);
}

// Array[][]
Expand Down Expand Up @@ -288,7 +297,7 @@ PyObject* Python_JavaArray_Get3D(PyJavaArray* self, PyObject* args[], Py_ssize_t
std::size_t z = from_python_object<std::size_t>(z_object);

Stream &stream = eios->control_center->reflect_array(array, type, 1, x, y, z)->data_stream();
return read_array_type(stream, self, type, 3);
return read_array_type(stream, self, type, 0);
}

// Array[][][]
Expand Down Expand Up @@ -324,7 +333,7 @@ PyObject* Python_JavaArray_Get4D(PyJavaArray* self, PyObject* args[], Py_ssize_t
std::size_t w = from_python_object<std::size_t>(z_object);

Stream &stream = eios->control_center->reflect_array(array, type, 1, x, y, z, w)->data_stream();
return read_array_type(stream, self, type, 4);
return read_array_type(stream, self, type, 0);
}

// Array[][][][]
Expand Down Expand Up @@ -407,6 +416,32 @@ PyObject* read_array_type(Stream &stream, PyJavaArray* object)

PyObject* read_array_type(Stream &stream, PyJavaArray* object, ReflectionType type, std::size_t dimensions)
{
if (dimensions == 0)
{
std::size_t size = stream.read<std::size_t>();
if (size == 0)
{
(python->Py_INCREF)(python->Py_GetNone_Object());
return python->Py_GetNone_Object();
}

switch(type)
{
case ReflectionType::CHAR: return to_python_object(stream.read<char>());
case ReflectionType::BYTE: return to_python_object(stream.read<std::uint8_t>());
case ReflectionType::BOOL: return to_python_object(stream.read<bool>());
case ReflectionType::SHORT: return to_python_object(stream.read<std::int16_t>());
case ReflectionType::INT: return to_python_object(stream.read<std::int32_t>());
case ReflectionType::LONG: return to_python_object(stream.read<std::int64_t>());
case ReflectionType::FLOAT: return to_python_object(stream.read<float>());
case ReflectionType::DOUBLE: return to_python_object(stream.read<double>());
case ReflectionType::STRING: return to_python_object(stream.read<std::string>());
case ReflectionType::OBJECT: return python_create_object(object, stream.read<jobject>());
case ReflectionType::ARRAY: return python_create_array(object, stream.read<jarray>(), 0);
default: (python->Py_INCREF)(python->Py_GetNone_Object()); return python->Py_GetNone_Object();
}
}

if (dimensions == 1)
{
switch(type)
Expand Down
1 change: 1 addition & 0 deletions RemoteInput/Plugin/Python/PythonJavaArray.hxx
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ extern "C"
{
#endif

PyObject* Python_JavaArray_GetLength(PyJavaArray* self, PyObject* args[], Py_ssize_t args_length) noexcept;
PyObject* Python_JavaArray_Get1D(PyJavaArray* self, PyObject* args[], Py_ssize_t args_length, PyObject* kwnames) noexcept;
PyObject* Python_JavaArray_Get2D(PyJavaArray* self, PyObject* args[], Py_ssize_t args_length, PyObject* kwnames) noexcept;
PyObject* Python_JavaArray_Get3D(PyJavaArray* self, PyObject* args[], Py_ssize_t args_length, PyObject* kwnames) noexcept;
Expand Down

0 comments on commit 2b772fd

Please sign in to comment.