[Lldb-commits] [lldb] r252788 - Convert python-wrapper.swig to use PythonDataObjects.
Zachary Turner via lldb-commits
lldb-commits at lists.llvm.org
Wed Nov 11 11:42:36 PST 2015
Author: zturner
Date: Wed Nov 11 13:42:35 2015
New Revision: 252788
URL: http://llvm.org/viewvc/llvm-project?rev=252788&view=rev
Log:
Convert python-wrapper.swig to use PythonDataObjects.
This only begins to port python-wrapper.swig over. Since this
code can be pretty hairy, I plan to do this incrementally over a
series of patches, each time removing or converting more code
over to the PythonDataObjects code.
Modified:
lldb/trunk/scripts/Python/python-wrapper.swig
Modified: lldb/trunk/scripts/Python/python-wrapper.swig
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/Python/python-wrapper.swig?rev=252788&r1=252787&r2=252788&view=diff
==============================================================================
--- lldb/trunk/scripts/Python/python-wrapper.swig (original)
+++ lldb/trunk/scripts/Python/python-wrapper.swig Wed Nov 11 13:42:35 2015
@@ -26,77 +26,11 @@ private:
bool m_print;
};
-// TODO(zturner): This should be part of a `PythonModule` class in
-// PythonDataObjects.hm and it should return a `PythonObject`
static PyObject*
-ResolvePythonName(const char* name,
- PyObject* pmodule)
+FindSessionDictionary(const char *dict_name)
{
using namespace lldb_private;
- if (!name)
- return pmodule;
-
- PyErr_Cleaner pyerr_cleanup(true); // show Python errors
-
- PythonDictionary main_dict(PyInitialValue::Invalid);
-
- if (!pmodule)
- {
- pmodule = PyImport_AddModule ("__main__");
- if (!pmodule)
- return nullptr;
- }
-
- if (PyType_Check(pmodule))
- main_dict.Reset(PyRefType::Borrowed, ((PyTypeObject*)pmodule)->tp_dict);
- else if (PythonDictionary::Check(pmodule))
- main_dict.Reset(PyRefType::Borrowed, pmodule);
- else
- main_dict.Reset(PyRefType::Borrowed, PyModule_GetDict (pmodule));
- if (!main_dict.IsValid())
- return nullptr;
-
- const char* dot_pos = ::strchr(name, '.');
-
- PythonObject dest_object;
- Py_ssize_t pos = 0;
-
- if (!dot_pos)
- {
- PyObject *py_key;
- PyObject *py_value;
- // TODO(zturner): This should be conveniently wrapped by `PythonDictionary`.
- while (PyDict_Next(main_dict.get(), &pos, &py_key, &py_value))
- {
- PythonObject key(PyRefType::Borrowed, py_key);
- auto key_string = key.AsType<PythonString>();
- if (!key_string.IsAllocated())
- continue;
-
- std::string str(key_string.GetString().str());
- if (strcmp(str.c_str(), name) == 0)
- {
- dest_object.Reset(PyRefType::Borrowed, py_value);
- break;
- }
- }
- return dest_object.release();
- }
- else
- {
- size_t len = dot_pos - name;
- std::string piece(name,len);
- PyObject *resolved_object = ResolvePythonName(piece.c_str(), main_dict.get());
- if (!resolved_object || resolved_object == Py_None)
- return nullptr;
- return ResolvePythonName(dot_pos+1,resolved_object); // tail recursion.. should be optimized by the compiler
- }
-}
-
-static PyObject*
-FindSessionDictionary(const char *session_dictionary_name)
-{
- return ResolvePythonName(session_dictionary_name, NULL);
+ return PythonModule::MainModule().ResolveName(dict_name).release();
}
// TODO(zturner): This entire class should be moved to PythonDataObjects.h
@@ -191,18 +125,25 @@ public:
return PyCallable();
if ( (python_function_name[0] == 0) || (session_dictionary_name[0] == 0) )
return PyCallable();
- return FindWithFunctionName(python_function_name,FindSessionDictionary (session_dictionary_name));
+
+ using namespace lldb_private;
+ auto dict = PythonModule::MainModule().ResolveName(session_dictionary_name).AsType<PythonDictionary>();
+ return FindWithFunctionName(python_function_name, dict.get());
}
static PyCallable
FindWithFunctionName (const char *python_function_name,
- PyObject *session_dict)
+ PyObject *py_session_dict)
{
- if (!python_function_name || !session_dict)
+ if (!python_function_name || !py_session_dict)
return PyCallable();
if ( (python_function_name[0] == 0))
return PyCallable();
- return PyCallable(ResolvePythonName (python_function_name, session_dict));
+
+ using namespace lldb_private;
+ PythonDictionary session_dict(PyRefType::Borrowed, py_session_dict);
+ PythonCallable result = PythonObject::ResolveNameWithDictionary(python_function_name, session_dict).AsType<PythonCallable>();
+ return PyCallable(result.release());
}
static PyCallable
@@ -213,6 +154,7 @@ public:
return PyCallable();
if (!python_function_name || (python_function_name[0] == 0))
return PyCallable();
+
return PyCallable(PyObject_GetAttrString(self, python_function_name));
}
@@ -355,6 +297,7 @@ LLDBSwigPythonCallTypeScript
std::string& retval
)
{
+ using namespace lldb_private;
lldb::SBValue sb_value (valobj_sp);
lldb::SBTypeSummaryOptions sb_options(options_sp.get());
@@ -363,7 +306,7 @@ LLDBSwigPythonCallTypeScript
if (!python_function_name || !session_dictionary)
return false;
- PyObject *session_dict = (PyObject*)session_dictionary, *pfunc_impl = NULL, *pvalue = NULL;
+ PyObject *pfunc_impl = NULL, *pvalue = NULL;
if (pyfunct_wrapper && *pyfunct_wrapper && PyFunction_Check (*pyfunct_wrapper))
{
@@ -375,40 +318,41 @@ LLDBSwigPythonCallTypeScript
}
}
- if (PyDict_Check(session_dict))
- {
- PyErr_Cleaner pyerr_cleanup(true); // show Python errors
+ PyObject *py_dict = (PyObject*)session_dictionary;
+ if (!PythonDictionary::Check(py_dict))
+ return true;
- if (!pfunc_impl)
- {
- pfunc_impl = ResolvePythonName (python_function_name, session_dict);
- if (!pfunc_impl || !PyCallable_Check (pfunc_impl))
- return false;
- else
- {
- if (pyfunct_wrapper)
- *pyfunct_wrapper = pfunc_impl;
- }
- }
+ PythonDictionary dict(PyRefType::Borrowed, py_dict);
- PyCallable pfunc = PyCallable::FindWithPythonObject(pfunc_impl);
+ PyErr_Cleaner pyerr_cleanup(true); // show Python errors
- if (!pfunc)
+ if (!pfunc_impl)
+ {
+ pfunc_impl = PythonObject::ResolveNameWithDictionary(python_function_name, dict).release();
+ if (!pfunc_impl || !PyCallable_Check (pfunc_impl))
return false;
-
- // if the third argument is supported, or varargs are allowed
- PyCallable::argc argc = pfunc.GetNumArguments();
- if (argc.num_args == 3 || argc.varargs == true)
- pvalue = pfunc(sb_value,session_dict,sb_options);
else
- pvalue = pfunc(sb_value,session_dict);
+ {
+ if (pyfunct_wrapper)
+ *pyfunct_wrapper = pfunc_impl;
+ }
+ }
- Py_INCREF (session_dict);
+ PyCallable pfunc = PyCallable::FindWithPythonObject(pfunc_impl);
- PyObjectToString(pvalue,retval);
+ if (!pfunc)
+ return false;
- Py_XDECREF (pvalue);
- }
+ // if the third argument is supported, or varargs are allowed
+ PyCallable::argc argc = pfunc.GetNumArguments();
+ if (argc.num_args == 3 || argc.varargs == true)
+ pvalue = pfunc(sb_value,dict.get(),sb_options);
+ else
+ pvalue = pfunc(sb_value,dict.get());
+
+ PyObjectToString(pvalue,retval);
+
+ Py_XDECREF (pvalue);
return true;
}
More information about the lldb-commits
mailing list