summaryrefslogtreecommitdiff
path: root/scripts/Python
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/Python')
-rw-r--r--scripts/Python/Makefile15
-rw-r--r--scripts/Python/finishSwigPythonLLDB.py63
-rw-r--r--scripts/Python/modules/Makefile20
-rw-r--r--scripts/Python/modules/readline/Makefile100
-rw-r--r--scripts/Python/modules/readline/readline.cpp34
-rw-r--r--scripts/Python/prepare_binding_Python.py4
-rw-r--r--scripts/Python/python-extensions.swig80
-rw-r--r--scripts/Python/python-typemaps.swig225
-rw-r--r--scripts/Python/python-wrapper.swig2
-rw-r--r--scripts/Python/use_lldb_suite.py9
10 files changed, 271 insertions, 281 deletions
diff --git a/scripts/Python/Makefile b/scripts/Python/Makefile
deleted file mode 100644
index ad6c0af442b4d..0000000000000
--- a/scripts/Python/Makefile
+++ /dev/null
@@ -1,15 +0,0 @@
-##===- scripts/Python/Makefile------------------------------*- Makefile -*-===##
-#
-# The LLVM Compiler Infrastructure
-#
-# This file is distributed under the University of Illinois Open Source
-# License. See LICENSE.TXT for details.
-#
-##===----------------------------------------------------------------------===##
-
-LLDB_LEVEL := ../..
-include $(LLDB_LEVEL)/../../Makefile.config
-
-DIRS := modules
-
-include $(LLDB_LEVEL)/Makefile
diff --git a/scripts/Python/finishSwigPythonLLDB.py b/scripts/Python/finishSwigPythonLLDB.py
index 435cb88c20f04..4d733a1643612 100644
--- a/scripts/Python/finishSwigPythonLLDB.py
+++ b/scripts/Python/finishSwigPythonLLDB.py
@@ -229,6 +229,23 @@ def make_symlink_windows(vstrSrcPath, vstrTargetPath):
dbg = utilsDebug.CDebugFnVerbose("Python script make_symlink_windows()")
bOk = True
strErrMsg = ""
+ # If the src file doesn't exist, this is an error and we should throw.
+ src_stat = os.stat(vstrSrcPath)
+
+ try:
+ target_stat = os.stat(vstrTargetPath)
+ # If the target file exists but refers to a different file, delete it so that we can
+ # re-create the link. This can happen if you run this script once (creating a link)
+ # and then delete the source file (so that a brand new file gets created the next time
+ # you compile and link), and then re-run this script, so that both the target hardlink
+ # and the source file exist, but the target refers to an old copy of the source.
+ if (target_stat.st_ino == src_stat.st_ino) and (target_stat.st_dev == src_stat.st_dev):
+ return (bOk, strErrMsg)
+
+ os.remove(vstrTargetPath)
+ except:
+ # If the target file don't exist, ignore this exception, we will link it shortly.
+ pass
try:
csl = ctypes.windll.kernel32.CreateHardLinkW
@@ -280,10 +297,6 @@ def make_symlink_native(vDictArgs, strSrc, strTarget):
bOk = False
strErrMsg = strErrMsgOsTypeUnknown
elif eOSType == utilsOsType.EnumOsType.Windows:
- if os.path.isfile(strTarget):
- if bDbg:
- print((strMsgSymlinkExists % target_filename))
- return (bOk, strErrMsg)
if bDbg:
print((strMsgSymlinkMk % (target_filename, strSrc, strTarget)))
bOk, strErrMsg = make_symlink_windows(strSrc,
@@ -345,11 +358,12 @@ def make_symlink(vDictArgs, vstrFrameworkPythonDir, vstrSrcFile, vstrTargetFile)
# Args: vDictArgs - (R) Program input parameters.
# vstrFrameworkPythonDir - (R) Python framework directory.
# vstrLiblldbName - (R) File name for _lldb library.
+# vstrLiblldbDir - (R) liblldb directory.
# Returns: Bool - True = function success, False = failure.
# Str - Error description on task failure.
# Throws: None.
#--
-def make_symlink_liblldb(vDictArgs, vstrFrameworkPythonDir, vstrLiblldbFileName):
+def make_symlink_liblldb(vDictArgs, vstrFrameworkPythonDir, vstrLiblldbFileName, vstrLldbLibDir):
dbg = utilsDebug.CDebugFnVerbose("Python script make_symlink_liblldb()")
bOk = True
strErrMsg = ""
@@ -369,7 +383,7 @@ def make_symlink_liblldb(vDictArgs, vstrFrameworkPythonDir, vstrLiblldbFileName)
bMakeFileCalled = "-m" in vDictArgs
if not bMakeFileCalled:
- strSrc = os.path.join("lib", "LLDB")
+ strSrc = os.path.join(vstrLldbLibDir, "LLDB")
else:
strLibFileExtn = ""
if eOSType == utilsOsType.EnumOsType.Windows:
@@ -379,7 +393,7 @@ def make_symlink_liblldb(vDictArgs, vstrFrameworkPythonDir, vstrLiblldbFileName)
strLibFileExtn = ".dylib"
else:
strLibFileExtn = ".so"
- strSrc = os.path.join("lib", "liblldb" + strLibFileExtn)
+ strSrc = os.path.join(vstrLldbLibDir, "liblldb" + strLibFileExtn)
bOk, strErrMsg = make_symlink(vDictArgs, vstrFrameworkPythonDir, strSrc, strTarget)
@@ -449,11 +463,12 @@ def make_symlink_lldb_argdumper(vDictArgs, vstrFrameworkPythonDir, vstrArgdumper
# the Python framework directory.
# Args: vDictArgs - (R) Program input parameters.
# vstrFrameworkPythonDir - (R) Python framework directory.
+# vstrLldbLibDir - (R) liblldb directory.
# Returns: Bool - True = function success, False = failure.
# strErrMsg - Error description on task failure.
# Throws: None.
#--
-def create_symlinks(vDictArgs, vstrFrameworkPythonDir):
+def create_symlinks(vDictArgs, vstrFrameworkPythonDir, vstrLldbLibDir):
dbg = utilsDebug.CDebugFnVerbose("Python script create_symlinks()")
bOk = True
strErrMsg = ""
@@ -464,7 +479,8 @@ def create_symlinks(vDictArgs, vstrFrameworkPythonDir):
if bOk:
bOk, strErrMsg = make_symlink_liblldb(vDictArgs,
vstrFrameworkPythonDir,
- strLibLldbFileName)
+ strLibLldbFileName,
+ vstrLldbLibDir)
# Make symlink for darwin-debug on Darwin
strDarwinDebugFileName = "darwin-debug"
@@ -659,6 +675,28 @@ def get_framework_python_dir(vDictArgs):
return (bOk, strWkDir, strErrMsg)
+#++---------------------------------------------------------------------------
+# Details: Retrieve the liblldb directory path, if it exists and is valid.
+# Args: vDictArgs - (R) Program input parameters.
+# Returns: Bool - True = function success, False = failure.
+# Str - liblldb directory path.
+# strErrMsg - Error description on task failure.
+# Throws: None.
+#--
+def get_liblldb_dir(vDictArgs):
+ dbg = utilsDebug.CDebugFnVerbose("Python script get_liblldb_dir()")
+ bOk = True
+ strErrMsg = ""
+
+ strLldbLibDir = ""
+ bHaveLldbLibDir = "--lldbLibDir" in vDictArgs
+ if bHaveLldbLibDir:
+ strLldbLibDir = vDictArgs["--lldbLibDir"]
+ if (bHaveLldbLibDir == False) or (strLldbLibDir.__len__() == 0):
+ strLldbLibDir = "lib"
+
+ return (bOk, strLldbLibDir, strErrMsg)
+
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
@@ -684,6 +722,8 @@ def get_framework_python_dir(vDictArgs):
be installed. Where non-Darwin systems want to put
the .py and .so files so that Python can find them
automatically. Python install directory.
+ --lldbLibDir The name of the directory containing liblldb.so.
+ (optional) "lib" by default.
Results: 0 Success
-100+ Error from this script to the caller script.
-100 Error program failure with optional message.
@@ -714,10 +754,13 @@ def main(vDictArgs):
print((strMsgConfigBuildDir % strCfgBldDir))
if bOk:
+ bOk, strLldbLibDir, strMsg = get_liblldb_dir(vDictArgs)
+
+ if bOk:
bOk, strMsg = find_or_create_python_dir(vDictArgs, strFrameworkPythonDir)
if bOk:
- bOk, strMsg = create_symlinks(vDictArgs, strFrameworkPythonDir)
+ bOk, strMsg = create_symlinks(vDictArgs, strFrameworkPythonDir, strLldbLibDir)
if bOk:
bOk, strMsg = copy_six(vDictArgs, strFrameworkPythonDir)
diff --git a/scripts/Python/modules/Makefile b/scripts/Python/modules/Makefile
deleted file mode 100644
index b6989889858db..0000000000000
--- a/scripts/Python/modules/Makefile
+++ /dev/null
@@ -1,20 +0,0 @@
-##===- scripts/Python/modules/Makefile ---------------------*- Makefile -*-===##
-#
-# The LLVM Compiler Infrastructure
-#
-# This file is distributed under the University of Illinois Open Source
-# License. See LICENSE.TXT for details.
-#
-##===----------------------------------------------------------------------===##
-
-LLDB_LEVEL := ../../..
-include $(LLDB_LEVEL)/../../Makefile.config
-
-DIRS:=
-
-# only build the readline suppression module on Linux, Kfreebsd & Hurd
-ifeq ($(HOST_OS), $(filter $(HOST_OS), Linux GNU GNU/kFreeBSD))
-DIRS += readline
-endif
-
-include $(LLDB_LEVEL)/Makefile
diff --git a/scripts/Python/modules/readline/Makefile b/scripts/Python/modules/readline/Makefile
deleted file mode 100644
index dc0d757bc1752..0000000000000
--- a/scripts/Python/modules/readline/Makefile
+++ /dev/null
@@ -1,100 +0,0 @@
-##===- scripts/Python/modules/readline/Makefile ------------*- Makefile -*-===##
-#
-# The LLVM Compiler Infrastructure
-#
-# This file is distributed under the University of Illinois Open Source
-# License. See LICENSE.TXT for details.
-#
-##===----------------------------------------------------------------------===##
-
-# Skip this entire Makefile if python is disabled.
-ifeq (,$(findstring -DLLDB_DISABLE_PYTHON,$(CXXFLAGS)))
-
-LEVEL := ../../../../../..
-LLDB_LEVEL := ../../../..
-
-LIBRARYNAME = readline
-
-NO_BUILD_ARCHIVE = 1
-LINK_LIBS_IN_SHARED = 1
-SHARED_LIBRARY = 1
-LOADABLE_MODULE = 1
-
-PYTHON_CONFIG?= python-config
-PYTHON_INC_DIR = $(shell $(PYTHON_CONFIG) --includes)
-
-# Include all archives in the shared lib
-USEDLIBS :=
-
-include $(LLDB_LEVEL)/../../Makefile.config
-
-LINK_COMPONENTS :=
-
-include $(LEVEL)/Makefile.common
-
-# include python headers
-CPP.Flags += $(PYTHON_INC_DIR)
-
-ifeq ($(HOST_OS),Darwin)
- LLVMLibsOptions += -Wl,-all_load
- # set dylib internal version number to llvmCore submission number
- ifdef LLDB_SUBMIT_VERSION
- LLVMLibsOptions += -Wl,-current_version \
- -Wl,$(LLDB_SUBMIT_VERSION).$(LLDB_SUBMIT_SUBVERSION) \
- -Wl,-compatibility_version -Wl,1
- endif
- # extra options to override libtool defaults
- LVMLibsOptions += -F/System/Library/Frameworks -F/System/Library/PrivateFrameworks
- LLVMLibsOptions += -framework Foundation -framework CoreFoundation
- LLVMLibsOptions += -framework CoreServices -framework Carbon -framework Security
- LLVMLibsOptions += -framework DebugSymbols $(PYTHON_BUILD_FLAGS) -lobjc
- # Mac OS X 10.4 and earlier tools do not allow a second -install_name on command line
- DARWIN_VERS := $(shell echo $(TARGET_TRIPLE) | sed 's/.*darwin\([0-9]*\).*/\1/')
- ifneq ($(DARWIN_VERS),8)
- LLVMLibsOptions += -Wl,-install_name \
- -Wl,"@executable_path/../lib/$(LIBRARYNAME)$(SHLIBEXT)"
- endif
-endif
-
-ifeq ($(HOST_OS), $(filter $(HOST_OS), Linux GNU GNU/kFreeBSD))
- # Include everything from the .a's into the shared library.
- ProjLibsOptions := -Wl,--whole-archive $(ProjLibsOptions) \
- -Wl,--no-whole-archive
- # Link in libedit
- # LLVMLibsOptions += -ledit
- LLVMLibsOptions += -Wl,--soname,$(LIBRARYNAME)$(SHLIBEXT)
-endif
-
-ifeq ($(HOST_OS),FreeBSD)
- # Include everything from the .a's into the shared library.
- ProjLibsOptions := -Wl,--whole-archive $(ProjLibsOptions) \
- -Wl,--no-whole-archive
- # Allow unresolved symbols.
- LLVMLibsOptions += -Wl,--allow-shlib-undefined
- # Link in libedit
- # LLVMLibsOptions += -L/usr/local/lib -ledit
-endif
-
-# FIXME: dynamically construct the version from `python -V`
-PYTHON_VERSION:=2.7
-LLDB_PYTHON_MODULE_REL_DIR:=python$(PYTHON_VERSION)/site-packages
-LLDB_PYTHON_MODULE_DIR:=$(LibDir)/$(LLDB_PYTHON_MODULE_REL_DIR)
-
-# Target to move readline module from shared lib build location to
-# local python module directory.
-all-local:: $(LLDB_PYTHON_MODULE_DIR)/$(LIBRARYNAME)$(SHLIBEXT)
-
-$(LLDB_PYTHON_MODULE_DIR)/$(LIBRARYNAME)$(SHLIBEXT): $(SharedLibDir)/$(LIBRARYNAME)$(SHLIBEXT)
- $(Echo) Staging $(BuildMode) $(LIBRARYNAME)$(SHLIBEXT) to $(LLDB_PYTHON_MODULE_DIR)
- $(Verb) $(MKDIR) "$(LLDB_PYTHON_MODULE_DIR)"
- $(Verb) $(ProgInstall) $(SharedLibDir)/$(LIBRARYNAME)$(SHLIBEXT) $(LLDB_PYTHON_MODULE_DIR)
-
-# Target to move the shared library from the build python lib dir to
-# the install python lib dir.
-install-local:: $(LLDB_PYTHON_MODULE_DIR)/$(LIBRARYNAME)$(SHLIBEXT)
- $(Echo) Installing $(BuildMode) $(LLDB_PYTHON_MODULE_DIR)/$(LIBRARYNAME)$(SHLIBEXT) to $(DESTDIR)$(prefix)/lib/$(LLDB_PYTHON_MODULE_REL_DIR)
- $(Verb) $(MKDIR) "$(DESTDIR)$(prefix)/lib/$(LLDB_PYTHON_MODULE_REL_DIR)"
- $(Verb) $(ProgInstall) "$(LLDB_PYTHON_MODULE_DIR)/$(LIBRARYNAME)$(SHLIBEXT)" "$(DESTDIR)$(prefix)/lib/$(LLDB_PYTHON_MODULE_REL_DIR)"
- $(Verb) $(RM) "$(DESTDIR)$(prefix)/lib/$(LIBRARYNAME)$(SHLIBEXT)"
-
-endif # if !defined(LLDB_DISABLE_PYTHON)
diff --git a/scripts/Python/modules/readline/readline.cpp b/scripts/Python/modules/readline/readline.cpp
index d66ccf4b6b7dc..d4b4962cc313f 100644
--- a/scripts/Python/modules/readline/readline.cpp
+++ b/scripts/Python/modules/readline/readline.cpp
@@ -20,11 +20,6 @@
// work around LLVM pr18841 to avoid seg faults in the stock Python
// readline.so linked against GNU readline.
-static struct PyMethodDef moduleMethods[] =
-{
- {nullptr, nullptr, 0, nullptr}
-};
-
#ifndef LLDB_DISABLE_LIBEDIT
PyDoc_STRVAR(
moduleDocumentation,
@@ -35,9 +30,33 @@ PyDoc_STRVAR(
"Stub module meant to avoid linking GNU readline.");
#endif
+#if PY_MAJOR_VERSION >= 3
+static struct PyModuleDef readline_module =
+{
+ PyModuleDef_HEAD_INIT, // m_base
+ "readline", // m_name
+ moduleDocumentation, // m_doc
+ -1, // m_size
+ nullptr, // m_methods
+ nullptr, // m_reload
+ nullptr, // m_traverse
+ nullptr, // m_clear
+ nullptr, // m_free
+};
+#else
+static struct PyMethodDef moduleMethods[] =
+{
+ {nullptr, nullptr, 0, nullptr}
+};
+#endif
+
#ifndef LLDB_DISABLE_LIBEDIT
static char*
+#if PY_MAJOR_VERSION >= 3
+simple_readline(FILE *stdin, FILE *stdout, const char *prompt)
+#else
simple_readline(FILE *stdin, FILE *stdout, char *prompt)
+#endif
{
rl_instream = stdin;
rl_outstream = stdout;
@@ -67,10 +86,15 @@ initreadline(void)
#ifndef LLDB_DISABLE_LIBEDIT
PyOS_ReadlineFunctionPointer = simple_readline;
#endif
+
+#if PY_MAJOR_VERSION >= 3
+ return PyModule_Create(&readline_module);
+#else
Py_InitModule4(
"readline",
moduleMethods,
moduleDocumentation,
static_cast<PyObject *>(NULL),
PYTHON_API_VERSION);
+#endif
}
diff --git a/scripts/Python/prepare_binding_Python.py b/scripts/Python/prepare_binding_Python.py
index 1996841baf18e..28fc3e5bc7fc9 100644
--- a/scripts/Python/prepare_binding_Python.py
+++ b/scripts/Python/prepare_binding_Python.py
@@ -16,7 +16,7 @@ import re
import shutil
import subprocess
import sys
-
+import platform
class SwigSettings(object):
"""Provides a single object to represent swig files and settings."""
@@ -205,6 +205,8 @@ def do_swig_rebuild(options, dependency_file, config_build_dir, settings):
"-I\"%s\"" % os.path.normcase("./."),
"-D__STDC_LIMIT_MACROS",
"-D__STDC_CONSTANT_MACROS"]
+ if options.target_platform == "Darwin":
+ command.append("-D__APPLE__")
if options.generate_dependency_file:
command.append("-MMD -MF \"%s\"" % temp_dep_file_path)
command.extend([
diff --git a/scripts/Python/python-extensions.swig b/scripts/Python/python-extensions.swig
index fae7f401bf134..693b06b9aab39 100644
--- a/scripts/Python/python-extensions.swig
+++ b/scripts/Python/python-extensions.swig
@@ -325,6 +325,22 @@
return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs)
%}
}
+
+%extend lldb::SBMemoryRegionInfo {
+ PyObject *lldb::SBMemoryRegionInfo::__str__ (){
+ lldb::SBStream description;
+ $self->GetDescription (description);
+ const char *desc = description.GetData();
+ size_t desc_len = description.GetSize();
+ if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
+ --desc_len;
+ if (desc_len > 0)
+ return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release();
+ else
+ return lldb_private::PythonString("").release();
+ }
+}
+
%extend lldb::SBModule {
PyObject *lldb::SBModule::__str__ (){
lldb::SBStream description;
@@ -810,6 +826,7 @@
def command(*args, **kwargs):
import lldb
+ import inspect
"""A decorator function that registers an LLDB command line
command that is bound to the function it is attached to."""
class obj(object):
@@ -821,11 +838,15 @@ def command(*args, **kwargs):
command = "command script add -f %s.%s %s" % (function.__module__, function.__name__, command_name)
lldb.debugger.HandleCommand(command)
self.function = function
- def __call__(self, *args, **kwargs):
- self.function(*args, **kwargs)
+ def __call__(self, debugger, command, exe_ctx, result, dict):
+ if len(inspect.getargspec(self.function).args) == 5:
+ self.function(debugger, command, exe_ctx, result, dict)
+ else:
+ self.function(debugger, command, result, dict)
def callable(function):
"""Creates a callable object that gets used."""
- return obj(function, *args, **kwargs)
+ f = obj(function, *args, **kwargs)
+ return f.__call__
return callable
class declaration(object):
@@ -1024,11 +1045,13 @@ class value(object):
return complex (int(self))
def __int__(self):
+ is_num,is_sign = is_numeric_type(self.sbvalue.GetType().GetCanonicalType().GetBasicType())
+ if is_num and not is_sign: return self.sbvalue.GetValueAsUnsigned()
return self.sbvalue.GetValueAsSigned()
-
+
def __long__(self):
- return self.sbvalue.GetValueAsSigned()
-
+ return self.__int__()
+
def __float__(self):
return float (self.sbvalue.GetValueAsSigned())
@@ -1084,4 +1107,47 @@ class SBSyntheticValueProvider(object):
return False
-%} \ No newline at end of file
+%}
+
+%pythoncode %{
+
+# given an lldb.SBBasicType it returns a tuple
+# (is_numeric, is_signed)
+# the value of is_signed is undefined if is_numeric == false
+def is_numeric_type(basic_type):
+ if basic_type == eBasicTypeInvalid: return (False,False)
+ if basic_type == eBasicTypeVoid: return (False,False)
+ if basic_type == eBasicTypeChar: return (True,False)
+ if basic_type == eBasicTypeSignedChar: return (True,True)
+ if basic_type == eBasicTypeUnsignedChar: return (True,False)
+ if basic_type == eBasicTypeWChar: return (True,False)
+ if basic_type == eBasicTypeSignedWChar: return (True,True)
+ if basic_type == eBasicTypeUnsignedWChar: return (True,False)
+ if basic_type == eBasicTypeChar16: return (True,False)
+ if basic_type == eBasicTypeChar32: return (True,False)
+ if basic_type == eBasicTypeShort: return (True,True)
+ if basic_type == eBasicTypeUnsignedShort: return (True,False)
+ if basic_type == eBasicTypeInt: return (True,True)
+ if basic_type == eBasicTypeUnsignedInt: return (True,False)
+ if basic_type == eBasicTypeLong: return (True,True)
+ if basic_type == eBasicTypeUnsignedLong: return (True,False)
+ if basic_type == eBasicTypeLongLong: return (True,True)
+ if basic_type == eBasicTypeUnsignedLongLong: return (True,False)
+ if basic_type == eBasicTypeInt128: return (True,True)
+ if basic_type == eBasicTypeUnsignedInt128: return (True,False)
+ if basic_type == eBasicTypeBool: return (False,False)
+ if basic_type == eBasicTypeHalf: return (True,True)
+ if basic_type == eBasicTypeFloat: return (True,True)
+ if basic_type == eBasicTypeDouble: return (True,True)
+ if basic_type == eBasicTypeLongDouble: return (True,True)
+ if basic_type == eBasicTypeFloatComplex: return (True,True)
+ if basic_type == eBasicTypeDoubleComplex: return (True,True)
+ if basic_type == eBasicTypeLongDoubleComplex: return (True,True)
+ if basic_type == eBasicTypeObjCID: return (False,False)
+ if basic_type == eBasicTypeObjCClass: return (False,False)
+ if basic_type == eBasicTypeObjCSel: return (False,False)
+ if basic_type == eBasicTypeNullPtr: return (False,False)
+ #if basic_type == eBasicTypeOther:
+ return (False,False)
+
+%}
diff --git a/scripts/Python/python-typemaps.swig b/scripts/Python/python-typemaps.swig
index 9c4e5cecb3639..df16a6d27b3b9 100644
--- a/scripts/Python/python-typemaps.swig
+++ b/scripts/Python/python-typemaps.swig
@@ -1,20 +1,22 @@
/* Typemap definitions, to allow SWIG to properly handle 'char**' data types. */
%typemap(in) char ** {
+ using namespace lldb_private;
/* Check if is a list */
- if (PyList_Check($input)) {
- int size = PyList_Size($input);
+ if (PythonList::Check($input)) {
+ PythonList list(PyRefType::Borrowed, $input);
+ int size = list.GetSize();
int i = 0;
- $1 = (char **) malloc((size+1) * sizeof(char*));
+ $1 = (char**)malloc((size+1)*sizeof(char*));
for (i = 0; i < size; i++) {
- PyObject *o = PyList_GetItem($input,i);
- if (PyString_Check(o))
- $1[i] = PyString_AsString(o);
- else {
+ PythonString py_str = list.GetItemAtIndex(i).AsType<PythonString>();
+ if (!py_str.IsAllocated()) {
PyErr_SetString(PyExc_TypeError,"list must contain strings");
free($1);
- return NULL;
+ return nullptr;
}
+
+ $1[i] = const_cast<char*>(py_str.GetString().data());
}
$1[i] = 0;
} else if ($input == Py_None) {
@@ -25,29 +27,17 @@
}
}
-%typemap(in) lldb::tid_t {
- using namespace lldb_private;
- if (PythonInteger::Check($input))
- {
- PythonInteger py_int(PyRefType::Borrowed, $input);
- $1 = static_cast<lldb::tid_t>(py_int.GetInteger());
- }
- else
- {
- PyErr_SetString(PyExc_ValueError, "Expecting an integer");
- return nullptr;
- }
-}
-
%typemap(typecheck) char ** {
/* Check if is a list */
$1 = 1;
- if (PyList_Check($input)) {
- int size = PyList_Size($input);
+ using namespace lldb_private;
+ if (PythonList::Check($input)) {
+ PythonList list(PyRefType::Borrowed, $input);
+ int size = list.GetSize();
int i = 0;
for (i = 0; i < size; i++) {
- PyObject *o = PyList_GetItem($input,i);
- if (!PyString_Check(o)) { $1 = 0; }
+ PythonString s = list.GetItemAtIndex(i).AsType<PythonString>();
+ if (!s.IsAllocated()) { $1 = 0; }
}
}
else
@@ -72,63 +62,18 @@
$result = list.release();
}
-%typemap(in) char const ** {
- /* Check if is a list */
- using namespace lldb_private;
- if (PythonList::Check($input)) {
- PythonList py_list(PyRefType::Borrowed, $input);
- int size = py_list.GetSize();
- $1 = (char**)malloc((size+1)*sizeof(char*));
- for (int i = 0; i < size; i++) {
- PythonObject o = py_list.GetItemAtIndex(i);
- if (!PythonString::Check(o.get())) {
- PyErr_SetString(PyExc_TypeError,"list must contain strings");
- free($1);
- return nullptr;
- }
- auto py_str = o.AsType<PythonString>();
- $1[i] = const_cast<char*>(py_str.GetString().data());
- }
-
- $1[size] = 0;
- } else if ($input == Py_None) {
- $1 = nullptr;
- } else {
- PyErr_SetString(PyExc_TypeError,"not a list");
- return nullptr;
- }
-}
-
-%typemap(typecheck) char const ** {
- /* Check if is a list */
- $1 = 1;
- if (PyList_Check($input)) {
- int size = PyList_Size($input);
- int i = 0;
- for (i = 0; i < size; i++) {
- PyObject *o = PyList_GetItem($input,i);
- if (!PyString_Check(o)) { $1 = 0; }
- }
+%typemap(in) lldb::tid_t {
+ using namespace lldb_private;
+ if (PythonInteger::Check($input))
+ {
+ PythonInteger py_int(PyRefType::Borrowed, $input);
+ $1 = static_cast<lldb::tid_t>(py_int.GetInteger());
}
else
{
- $1 = ( ($input == Py_None) ? 1 : 0);
- }
-}
-
-%typemap(freearg) char const ** {
- free((char *) $1);
-}
-
-%typemap(out) char const ** {
- int len;
- int i;
- len = 0;
- while ($1[len]) len++;
- $result = PyList_New(len);
- for (i = 0; i < len; i++) {
- PyList_SetItem($result, i, PyString_FromString($1[i]));
+ PyErr_SetString(PyExc_ValueError, "Expecting an integer");
+ return nullptr;
}
}
@@ -148,6 +93,9 @@
}
$1 = (char *) malloc($2);
}
+// SBProcess::ReadCStringFromMemory() uses a void*, but needs to be treated
+// as char data instead of byte data.
+%typemap(in) (void *char_buf, size_t size) = (char *dst, size_t dst_len);
// Return the char buffer. Discarding any previous return result
// See also SBThread::GetStopDescription.
@@ -163,18 +111,29 @@
}
free($1);
}
+// SBProcess::ReadCStringFromMemory() uses a void*, but needs to be treated
+// as char data instead of byte data.
+%typemap(argout) (void *char_buf, size_t size) = (char *dst, size_t dst_len);
// typemap for an outgoing buffer
// See also SBEvent::SBEvent(uint32_t event, const char *cstr, uint32_t cstr_len).
%typemap(in) (const char *cstr, uint32_t cstr_len) {
- if (PyString_Check($input)) {
- $1 = (char *) PyString_AsString($input);
- $2 = PyString_Size($input);
+ using namespace lldb_private;
+ if (PythonString::Check($input)) {
+ PythonString str(PyRefType::Borrowed, $input);
+ $1 = (char*)str.GetString().data();
+ $2 = str.GetSize();
+ }
+ else if(PythonByteArray::Check($input)) {
+ PythonByteArray bytearray(PyRefType::Borrowed, $input);
+ $1 = (char*)bytearray.GetBytes().data();
+ $2 = bytearray.GetSize();
}
- else if(PyByteArray_Check($input)) {
- $1 = (char *) PyByteArray_AsString($input);
- $2 = PyByteArray_Size($input);
+ else if (PythonBytes::Check($input)) {
+ PythonBytes bytes(PyRefType::Borrowed, $input);
+ $1 = (char*)bytes.GetBytes().data();
+ $2 = bytes.GetSize();
}
else {
PyErr_SetString(PyExc_ValueError, "Expecting a string");
@@ -183,13 +142,21 @@
}
// Ditto for SBProcess::PutSTDIN(const char *src, size_t src_len).
%typemap(in) (const char *src, size_t src_len) {
- if (PyString_Check($input)) {
- $1 = (char *) PyString_AsString($input);
- $2 = PyString_Size($input);
+ using namespace lldb_private;
+ if (PythonString::Check($input)) {
+ PythonString str(PyRefType::Borrowed, $input);
+ $1 = (char*)str.GetString().data();
+ $2 = str.GetSize();
}
- else if(PyByteArray_Check($input)) {
- $1 = (char *) PyByteArray_AsString($input);
- $2 = PyByteArray_Size($input);
+ else if(PythonByteArray::Check($input)) {
+ PythonByteArray bytearray(PyRefType::Borrowed, $input);
+ $1 = (char*)bytearray.GetBytes().data();
+ $2 = bytearray.GetSize();
+ }
+ else if (PythonBytes::Check($input)) {
+ PythonBytes bytes(PyRefType::Borrowed, $input);
+ $1 = (char*)bytes.GetBytes().data();
+ $2 = bytes.GetSize();
}
else {
PyErr_SetString(PyExc_ValueError, "Expecting a string");
@@ -198,32 +165,48 @@
}
// And SBProcess::WriteMemory.
%typemap(in) (const void *buf, size_t size) {
- if (PyString_Check($input)) {
- $1 = (void *) PyString_AsString($input);
- $2 = PyString_Size($input);
+ using namespace lldb_private;
+ if (PythonString::Check($input)) {
+ PythonString str(PyRefType::Borrowed, $input);
+ $1 = (void*)str.GetString().data();
+ $2 = str.GetSize();
}
- else if(PyByteArray_Check($input)) {
- $1 = (void *) PyByteArray_AsString($input);
- $2 = PyByteArray_Size($input);
+ else if(PythonByteArray::Check($input)) {
+ PythonByteArray bytearray(PyRefType::Borrowed, $input);
+ $1 = (void*)bytearray.GetBytes().data();
+ $2 = bytearray.GetSize();
+ }
+ else if (PythonBytes::Check($input)) {
+ PythonBytes bytes(PyRefType::Borrowed, $input);
+ $1 = (void*)bytes.GetBytes().data();
+ $2 = bytes.GetSize();
}
else {
- PyErr_SetString(PyExc_ValueError, "Expecting a string");
+ PyErr_SetString(PyExc_ValueError, "Expecting a buffer");
return NULL;
}
}
// For SBDebugger::DispatchInput
%typemap(in) (const void *data, size_t data_len) {
- if (PyString_Check($input)) {
- $1 = static_cast<void *>(PyString_AsString($input));
- $2 = PyString_Size($input);
+ using namespace lldb_private;
+ if (PythonString::Check($input)) {
+ PythonString str(PyRefType::Borrowed, $input);
+ $1 = (void*)str.GetString().data();
+ $2 = str.GetSize();
}
- else if(PyByteArray_Check($input)) {
- $1 = static_cast<void *>(PyByteArray_AsString($input));
- $2 = PyByteArray_Size($input);
+ else if(PythonByteArray::Check($input)) {
+ PythonByteArray bytearray(PyRefType::Borrowed, $input);
+ $1 = (void*)bytearray.GetBytes().data();
+ $2 = bytearray.GetSize();
+ }
+ else if (PythonBytes::Check($input)) {
+ PythonBytes bytes(PyRefType::Borrowed, $input);
+ $1 = (void*)bytes.GetBytes().data();
+ $2 = bytes.GetSize();
}
else {
- PyErr_SetString(PyExc_ValueError, "Expecting a string or byte array");
+ PyErr_SetString(PyExc_ValueError, "Expecting a buffer");
return NULL;
}
}
@@ -254,9 +237,8 @@
$result = Py_None;
Py_INCREF($result);
} else {
- llvm::StringRef ref(static_cast<const char*>($1), result);
- lldb_private::PythonString string(ref);
- $result = string.release();
+ lldb_private::PythonBytes bytes(static_cast<const uint8_t*>($1), result);
+ $result = bytes.release();
}
free($1);
}
@@ -545,22 +527,27 @@
return nullptr;
$1 = file.GetStream();
- }
+ if ($1)
+ file.Clear();
+ }
}
%typemap(out) FILE * {
char mode[4] = {0};
-#ifdef __MACOSX__
+%#ifdef __APPLE__
int i = 0;
- short flags = $1->_flags;
-
- if (flags & __SRD)
- mode[i++] = 'r';
- else if (flags & __SWR)
- mode[i++] = 'w';
- else // if (flags & __SRW)
- mode[i++] = 'a';
-#endif
+ if ($1)
+ {
+ short flags = $1->_flags;
+
+ if (flags & __SRD)
+ mode[i++] = 'r';
+ else if (flags & __SWR)
+ mode[i++] = 'w';
+ else // if (flags & __SRW)
+ mode[i++] = 'a';
+ }
+%#endif
using namespace lldb_private;
File file($1, false);
PythonFile py_file(file, mode);
diff --git a/scripts/Python/python-wrapper.swig b/scripts/Python/python-wrapper.swig
index 5d7bfaa89439b..a92102e328388 100644
--- a/scripts/Python/python-wrapper.swig
+++ b/scripts/Python/python-wrapper.swig
@@ -610,7 +610,7 @@ LLDBSwigPythonCallCommand
PythonObject exe_ctx_arg(PyRefType::Owned, SBTypeToSWIGWrapper(exe_ctx_sb));
PythonObject cmd_retobj_arg(PyRefType::Owned, SBTypeToSWIGWrapper(&cmd_retobj_sb));
- if (argc.count == 5 || argc.has_varargs)
+ if (argc.count == 5 || argc.is_bound_method || argc.has_varargs)
pfunc(debugger_arg, PythonString(args), exe_ctx_arg, cmd_retobj_arg, dict);
else
pfunc(debugger_arg, PythonString(args), cmd_retobj_arg, dict);
diff --git a/scripts/Python/use_lldb_suite.py b/scripts/Python/use_lldb_suite.py
index 63a098cea220f..f3e358af143bf 100644
--- a/scripts/Python/use_lldb_suite.py
+++ b/scripts/Python/use_lldb_suite.py
@@ -17,6 +17,9 @@ def find_lldb_root():
lldb_root = find_lldb_root()
if lldb_root is not None:
import imp
- module = imp.find_module("use_lldb_suite_root", [lldb_root])
- if module is not None:
- imp.load_module("use_lldb_suite_root", *module)
+ fp, pathname, desc = imp.find_module("use_lldb_suite_root", [lldb_root])
+ try:
+ imp.load_module("use_lldb_suite_root", fp, pathname, desc)
+ finally:
+ if fp:
+ fp.close()