diff --git a/python_libs/lib/imhex.py b/python_libs/lib/imhex.py new file mode 100644 index 000000000..438396caa --- /dev/null +++ b/python_libs/lib/imhex.py @@ -0,0 +1,2 @@ +from _imhex import * +import imhex_python.types as types \ No newline at end of file diff --git a/python_libs/lib/imhex_python/__pycache__/types.cpython-38.pyc b/python_libs/lib/imhex_python/__pycache__/types.cpython-38.pyc new file mode 100644 index 000000000..97f84d295 Binary files /dev/null and b/python_libs/lib/imhex_python/__pycache__/types.cpython-38.pyc differ diff --git a/python_libs/lib/imhex_python/types.py b/python_libs/lib/imhex_python/types.py new file mode 100644 index 000000000..327976930 --- /dev/null +++ b/python_libs/lib/imhex_python/types.py @@ -0,0 +1,44 @@ +class ImHexTypeMeta(type): + def __new__(cls, name, bases, dct): + return super().__new__(cls, name, bases, dct) + + def __getitem__(self, value): + return array(self, value) + +class ImHexType(metaclass=ImHexTypeMeta): + pass + +class u8(ImHexType): + pass +class u16(ImHexType): + pass +class u32(ImHexType): + pass +class u64(ImHexType): + pass +class u128(ImHexType): + pass + +class s8(ImHexType): + pass +class s16(ImHexType): + pass +class s32(ImHexType): + pass +class s64(ImHexType): + pass +class s128(ImHexType): + pass + +class float(ImHexType): + pass +class double(ImHexType): + pass + +class array(ImHexType): + def __init__(self, array_type, size): + self.array_type = array_type() + self.size = size + + array_type : type + size : int \ No newline at end of file diff --git a/source/helpers/loader_script_handler.cpp b/source/helpers/loader_script_handler.cpp index 69c51e7cb..10507cd21 100644 --- a/source/helpers/loader_script_handler.cpp +++ b/source/helpers/loader_script_handler.cpp @@ -119,17 +119,48 @@ namespace hex { PyErr_SetString(PyExc_TypeError, "member needs to have a annotation extending from ImHexType"); return nullptr; } - auto memberTypeInstance = PyObject_CallObject(memberType, nullptr); - if (memberTypeInstance == nullptr || memberTypeInstance->ob_type->tp_base == nullptr || memberTypeInstance->ob_type->tp_base->tp_name != "ImHexType"s) { - PyErr_SetString(PyExc_TypeError, "member needs to have a annotation extending from ImHexType"); + + // Array already is an object + if (memberType->ob_type->tp_name == "array"s) { + + auto arrayType = PyObject_GetAttrString(memberType, "array_type"); + if (arrayType == nullptr) { + PyErr_BadArgument(); + return nullptr; + } + + code += " "s + arrayType->ob_type->tp_name + " " + memberName; + + auto arraySize = PyObject_GetAttrString(memberType, "size"); + if (arraySize == nullptr) { + PyErr_BadArgument(); + return nullptr; + } + + if (PyUnicode_Check(arraySize)) + code += "["s + PyUnicode_AsUTF8(arraySize) + "];\n"; + else if (PyLong_Check(arraySize)) + code += "["s + std::to_string(PyLong_AsLong(arraySize)) + "];\n"; + else { + PyErr_SetString(PyExc_TypeError, "invalid array size type. Expected string or int"); + return nullptr; + } + + + } else { + auto memberTypeInstance = PyObject_CallObject(memberType, nullptr); + if (memberTypeInstance == nullptr || memberTypeInstance->ob_type->tp_base == nullptr || memberTypeInstance->ob_type->tp_base->tp_name != "ImHexType"s) { + PyErr_SetString(PyExc_TypeError, "member needs to have a annotation extending from ImHexType"); + if (memberTypeInstance != nullptr) + Py_DECREF(memberTypeInstance); + + return nullptr; + } + + code += " "s + memberTypeInstance->ob_type->tp_name + " "s + memberName + ";\n"; + Py_DECREF(memberTypeInstance); - - return nullptr; } - - code += " "s + memberTypeInstance->ob_type->tp_name + " "s + memberName + ";\n"; - - Py_DECREF(memberTypeInstance); } code += "};\n";