PyObject * PyGccStringOrNone(const char *str_or_null) { if (str_or_null) { return PyGccString_FromString(str_or_null); } else { Py_RETURN_NONE; } }
PyObject * PyGccRtl_str(struct PyGccRtl * self) { /* We use print_rtl_single() which takes a FILE*, so we need an fmemopen buffer to write to: */ char buf[2048]; /* FIXME */ FILE *f; buf[0] = '\0'; f = fmemopen(buf, sizeof(buf), "w"); if (!f) { return PyErr_SetFromErrno(PyExc_IOError); } print_rtl_single (f, self->insn.inner); fclose(f); return PyGccString_FromString(buf); }
PyObject* PyGccPrettyPrinter_as_string(PyObject *obj) { struct PyGccPrettyPrinter *ppobj; int len; /* FIXME: */ assert(Py_TYPE(obj) == &PyGccPrettyPrinter_TypeObj); ppobj = (struct PyGccPrettyPrinter *)obj; /* Flush the pp first. This forcibly adds a trailing newline: */ pp_flush(&ppobj->pp); /* Convert to a python string, leaving off the trailing newline: */ len = strlen(ppobj->buf); assert(len > 0); if ('\n' == ppobj->buf[len - 1]) { return PyGccString_FromString_and_size(ppobj->buf, len - 1); } else { return PyGccString_FromString(ppobj->buf); } }
int setup_sys(struct plugin_name_args *plugin_info) { /* * Sets up "sys.plugin_full_name" as plugin_info->full_name. This is the path to the plugin (as specified with -fplugin=) * Sets up "sys.plugin_base_name" as plugin_info->base_name. This is the short name, of the plugin (filename without .so suffix) * Add the directory containing the plugin to "sys.path", so that it can find modules relative to itself without needing PYTHONPATH to be set up. (sys.path has already been initialized by the call to Py_Initialize) * If PLUGIN_PYTHONPATH is defined, add it to "sys.path" */ int result = 0; /* failure */ PyObject *full_name = NULL; PyObject *base_name = NULL; const char *program = "import sys;\n" "import os;\n" "sys.path.append(os.path.abspath(os.path.dirname(sys.plugin_full_name)))\n"; /* Setup "sys.plugin_full_name" */ full_name = PyGccString_FromString(plugin_info->full_name); if (!full_name) { goto error; } if (-1 == PySys_SetObject((char*)"plugin_full_name", full_name)) { goto error; } /* Setup "sys.plugin_base_name" */ base_name = PyGccString_FromString(plugin_info->base_name); if (!base_name) { goto error; } if (-1 == PySys_SetObject((char*)"plugin_base_name", base_name)) { goto error; } /* Add the plugin's path to sys.path */ if (-1 == PyRun_SimpleString(program)) { goto error; } #ifdef PLUGIN_PYTHONPATH { /* Support having multiple builds of the plugin installed independently of each other, by supporting each having a directory for support files e.g. gccutils, libcpychecker, etc We do this by seeing if PLUGIN_PYTHONPATH was defined in the compile, and if so, adding it to sys.path: */ const char *program2 = "import sys;\n" "import os;\n" "sys.path.append('" PLUGIN_PYTHONPATH "')\n"; if (-1 == PyRun_SimpleString(program2)) { goto error; } } #endif /* Success: */ result = 1; error: Py_XDECREF(full_name); Py_XDECREF(base_name); return result; }
static int PyGcc_init_gcc_module(struct plugin_name_args *plugin_info) { int i; if (!PyGcc_globals.module) { return 0; } /* Set up int constants for each of the enum plugin_event values: */ #define DEFEVENT(NAME) \ PyModule_AddIntMacro(PyGcc_globals.module, NAME); # include "plugin.def" # undef DEFEVENT PyGcc_globals.argument_dict = PyDict_New(); if (!PyGcc_globals.argument_dict) { return 0; } PyGcc_globals.argument_tuple = PyTuple_New(plugin_info->argc); if (!PyGcc_globals.argument_tuple) { return 0; } /* PySys_SetArgvEx(plugin_info->argc, plugin_info->argv, 0); */ for (i=0; i<plugin_info->argc; i++) { struct plugin_argument *arg = &plugin_info->argv[i]; PyObject *key; PyObject *value; PyObject *pair; key = PyGccString_FromString(arg->key); if (arg->value) { value = PyGccString_FromString(plugin_info->argv[i].value); } else { value = Py_None; } PyDict_SetItem(PyGcc_globals.argument_dict, key, value); // FIXME: ref counts? pair = Py_BuildValue("(s, s)", arg->key, arg->value); if (!pair) { return 1; } PyTuple_SetItem(PyGcc_globals.argument_tuple, i, pair); } PyModule_AddObject(PyGcc_globals.module, "argument_dict", PyGcc_globals.argument_dict); PyModule_AddObject(PyGcc_globals.module, "argument_tuple", PyGcc_globals.argument_tuple); /* Pass properties: */ PyModule_AddIntMacro(PyGcc_globals.module, PROP_gimple_any); PyModule_AddIntMacro(PyGcc_globals.module, PROP_gimple_lcf); PyModule_AddIntMacro(PyGcc_globals.module, PROP_gimple_leh); PyModule_AddIntMacro(PyGcc_globals.module, PROP_cfg); #if (GCC_VERSION >= 4008) /* PROP_referenced_vars went away in GCC 4.8 (in r190067) */ #else PyModule_AddIntMacro(PyGcc_globals.module, PROP_referenced_vars); #endif PyModule_AddIntMacro(PyGcc_globals.module, PROP_ssa); PyModule_AddIntMacro(PyGcc_globals.module, PROP_no_crit_edges); PyModule_AddIntMacro(PyGcc_globals.module, PROP_rtl); PyModule_AddIntMacro(PyGcc_globals.module, PROP_gimple_lomp); PyModule_AddIntMacro(PyGcc_globals.module, PROP_cfglayout); PyModule_AddIntMacro(PyGcc_globals.module, PROP_gimple_lcx); PyModule_AddIntMacro(PyGcc_globals.module, GCC_VERSION); /* Success: */ return 1; }