static PyObject * PyGcc_get_global_namespace(PyObject *self, PyObject *args) { /* (global_namespace will be NULL outside the C++ frontend, giving a result of None) */ return PyGccTree_New(gcc_private_make_tree(global_namespace)); }
static PyObject * PyGcc_maybe_get_identifier(PyObject *self, PyObject *args) { const char *str; tree t; if (!PyArg_ParseTuple(args, "s:maybe_get_identifier", &str)) { return NULL; } t = maybe_get_identifier(str); return PyGccTree_New(gcc_private_make_tree(t)); }
/* Helper function when a custom attribute is encountered, for generating the arguments to the Python callback. The args to the function call will be the node, plus the args of the attribute: (node, arg0, arg1, ...) */ PyObject * make_args_for_attribute_callback(tree node, tree args) { PyObject *list_args = NULL; PyObject *py_args = NULL; PyObject *py_node = NULL; Py_ssize_t i; /* Walk "args" (a tree_list), converting to a python list of wrappers */ list_args = PyGcc_TreeMakeListFromTreeList(args); if (!list_args) { goto error; } py_args = PyTuple_New(1 + PyList_Size(list_args)); if (!py_args) { goto error; } py_node = PyGccTree_New(gcc_private_make_tree(node)); if (!py_node) { goto error; } PyTuple_SET_ITEM(py_args, 0, py_node); for (i = 0; i < PyList_Size(list_args); i++) { PyObject *arg = PyList_GetItem(list_args, i); Py_INCREF(arg); PyTuple_SET_ITEM(py_args, i + 1, arg); } Py_DECREF(list_args); return py_args; error: Py_XDECREF(list_args); Py_XDECREF(py_args); Py_XDECREF(py_node); return NULL; }
PyObject * get_operand_as_object(const_rtx in_rtx, int idx, char fmt) { const char *str; /* The operand types are described in gcc/rtl.c */ switch (fmt) { case 'T': /* pointer to a string, with special meaning */ str = XTMPL (in_rtx, idx); goto string; case 'S': /* optional pointer to a string */ case 's': /* a pointer to a string */ str = XSTR (in_rtx, idx); string: return PyGccStringOrNone(str); case '0': /* unused, or used in a phase-dependent manner */ Py_RETURN_NONE; /* for now */ case 'e': /* pointer to an rtl expression */ /* Nested expression: */ return PyGccRtl_New( gcc_private_make_rtl_insn(XEXP (in_rtx, idx))); case 'E': case 'V': /* Nested list of expressions */ { PyObject *list = PyList_New(XVECLEN (in_rtx, idx)); int j; if (!list) { return NULL; } for (j = 0; j < XVECLEN (in_rtx, idx); j++) { PyObject *item = PyGccRtl_New( gcc_private_make_rtl_insn(XVECEXP (in_rtx, idx, j))); if (!item) { Py_DECREF(list); return NULL; } if (-1 == PyList_Append(list, item)) { Py_DECREF(item); Py_DECREF(list); return NULL; } Py_DECREF(item); } return list; } case 'w': return PyGccInt_FromLong(XWINT (in_rtx, idx)); case 'i': return PyGccInt_FromLong(XINT (in_rtx, idx)); case 'n': /* Return NOTE_INSN names rather than integer codes. */ return PyGccStringOrNone(GET_NOTE_INSN_NAME (XINT (in_rtx, idx))); case 'u': /* a pointer to another insn */ Py_RETURN_NONE; /* for now */ case 't': return PyGccTree_New(gcc_private_make_tree(XTREE (in_rtx, idx))); case '*': Py_RETURN_NONE; /* for now */ case 'B': return PyGccBasicBlock_New( gcc_private_make_cfg_block(XBBDEF (in_rtx, idx))); default: gcc_unreachable (); } }
static PyObject *PyGcc_make_translation_unit_decl(gcc_translation_unit_decl decl) { gcc_tree tree = gcc_translation_unit_decl_as_gcc_tree(decl); return PyGccTree_New(tree); }