2021-11-21 23:59:44 +00:00
|
|
|
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
2021-04-03 09:10:35 +01:00
|
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
2020-02-21 23:08:37 +00:00
|
|
|
|
|
|
|
#include "drgnpy.h"
|
2022-02-16 20:43:36 +00:00
|
|
|
#include "../array.h"
|
2020-02-21 23:08:37 +00:00
|
|
|
#include "../language.h"
|
|
|
|
|
|
|
|
static PyObject *Language_repr(Language *self)
|
|
|
|
{
|
|
|
|
return PyUnicode_FromFormat("Language.%s", self->attr_name);
|
|
|
|
}
|
|
|
|
|
|
|
|
static PyObject *Language_get_name(Language *self, void *arg)
|
|
|
|
{
|
|
|
|
return PyUnicode_FromString(self->language->name);
|
|
|
|
}
|
|
|
|
|
|
|
|
static PyGetSetDef Language_getset[] = {
|
|
|
|
{"name", (getter)Language_get_name, NULL, drgn_Language_name_DOC, NULL},
|
|
|
|
{},
|
|
|
|
};
|
|
|
|
|
|
|
|
PyTypeObject Language_type = {
|
|
|
|
PyVarObject_HEAD_INIT(NULL, 0)
|
|
|
|
.tp_name = "_drgn.Language",
|
|
|
|
.tp_basicsize = sizeof(Language),
|
|
|
|
.tp_repr = (reprfunc)Language_repr,
|
|
|
|
.tp_flags = Py_TPFLAGS_DEFAULT,
|
|
|
|
.tp_doc = drgn_Language_DOC,
|
|
|
|
.tp_getset = Language_getset,
|
|
|
|
};
|
|
|
|
|
|
|
|
static PyObject *languages_py[DRGN_NUM_LANGUAGES];
|
|
|
|
|
|
|
|
PyObject *Language_wrap(const struct drgn_language *language)
|
|
|
|
{
|
2022-02-16 20:43:36 +00:00
|
|
|
PyObject *obj = languages_py[language->number];
|
2020-02-21 23:08:37 +00:00
|
|
|
Py_INCREF(obj);
|
|
|
|
return obj;
|
|
|
|
}
|
|
|
|
|
2020-02-26 21:22:51 +00:00
|
|
|
int language_converter(PyObject *o, void *p)
|
|
|
|
{
|
|
|
|
const struct drgn_language **ret = p;
|
|
|
|
|
|
|
|
if (o == Py_None) {
|
|
|
|
*ret = NULL;
|
|
|
|
return 1;
|
|
|
|
} else if (PyObject_TypeCheck(o, &Language_type)) {
|
|
|
|
*ret = ((Language *)o)->language;
|
|
|
|
return 1;
|
|
|
|
} else {
|
|
|
|
PyErr_Format(PyExc_TypeError,
|
|
|
|
"expected Language, not %s",
|
|
|
|
Py_TYPE(o)->tp_name);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-02-21 23:08:37 +00:00
|
|
|
int add_languages(void)
|
|
|
|
{
|
2022-02-16 20:43:36 +00:00
|
|
|
static const char * const attr_names[] = {
|
2020-02-21 23:08:37 +00:00
|
|
|
[DRGN_LANGUAGE_C] = "C",
|
2020-03-03 00:01:38 +00:00
|
|
|
[DRGN_LANGUAGE_CPP] = "CPP",
|
2020-02-21 23:08:37 +00:00
|
|
|
};
|
2022-02-16 20:43:36 +00:00
|
|
|
static_assert(array_size(attr_names) == DRGN_NUM_LANGUAGES,
|
|
|
|
"missing language in attr_names");
|
|
|
|
for (size_t i = 0; i < DRGN_NUM_LANGUAGES; i++) {
|
2022-08-29 21:37:30 +01:00
|
|
|
Language *language_obj = call_tp_alloc(Language);
|
2020-02-21 23:08:37 +00:00
|
|
|
if (!language_obj)
|
|
|
|
return -1;
|
|
|
|
language_obj->attr_name = attr_names[i];
|
2022-02-16 20:43:36 +00:00
|
|
|
language_obj->language = drgn_languages[i];
|
2020-02-21 23:08:37 +00:00
|
|
|
languages_py[i] = (PyObject *)language_obj;
|
2022-02-16 20:43:36 +00:00
|
|
|
int ret = PyDict_SetItemString(Language_type.tp_dict,
|
|
|
|
attr_names[i],
|
|
|
|
(PyObject *)language_obj);
|
2020-02-21 23:08:37 +00:00
|
|
|
if (ret)
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|