File: language.c

package info (click to toggle)
drgn 0.0.33-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 6,892 kB
  • sloc: python: 59,081; ansic: 51,400; awk: 423; makefile: 339; sh: 113
file content (83 lines) | stat: -rw-r--r-- 2,072 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
// Copyright (c) Meta Platforms, Inc. and affiliates.
// SPDX-License-Identifier: LGPL-2.1-or-later

#include "drgnpy.h"
#include "../array.h"
#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,
	// Doesn't reference any objects, no GC needed.
	.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)
{
	PyObject *obj = languages_py[language->number];
	Py_INCREF(obj);
	return obj;
}

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;
	}
}

int add_languages(void)
{
	static const char * const attr_names[] = {
		[DRGN_LANGUAGE_C] = "C",
		[DRGN_LANGUAGE_CPP] = "CPP",
	};
	static_assert(array_size(attr_names) == DRGN_NUM_LANGUAGES,
		      "missing language in attr_names");
	for (size_t i = 0; i < DRGN_NUM_LANGUAGES; i++) {
		Language *language_obj = call_tp_alloc(Language);
		if (!language_obj)
			return -1;
		language_obj->attr_name = attr_names[i];
		language_obj->language = drgn_languages[i];
		languages_py[i] = (PyObject *)language_obj;
		int ret = PyDict_SetItemString(Language_type.tp_dict,
					       attr_names[i],
					       (PyObject *)language_obj);
		if (ret)
			return ret;
	}
	return 0;
}