/* ----------------------------------------------------------------------------
 * This file was automatically generated by SWIG (http://www.swig.org).
 * Version 1.3.40
 * 
 * This file is not intended to be easily readable and contains a number of 
 * coding conventions designed to improve portability and efficiency. Do not make
 * changes to this file unless you know what you are doing--modify the SWIG 
 * interface file instead. 
 * ----------------------------------------------------------------------------- */

#define SWIGPYTHON
#define SWIG_PYTHON_THREADS
#define SWIG_PYTHON_DIRECTOR_NO_VTABLE


#ifdef __cplusplus
/* SwigValueWrapper is described in swig.swg */
template<typename T> class SwigValueWrapper {
  struct SwigMovePointer {
    T *ptr;
    SwigMovePointer(T *p) : ptr(p) { }
    ~SwigMovePointer() { delete ptr; }
    SwigMovePointer& operator=(SwigMovePointer& rhs) { T* oldptr = ptr; ptr = 0; delete oldptr; ptr = rhs.ptr; rhs.ptr = 0; return *this; }
  } pointer;
  SwigValueWrapper& operator=(const SwigValueWrapper<T>& rhs);
  SwigValueWrapper(const SwigValueWrapper<T>& rhs);
public:
  SwigValueWrapper() : pointer(0) { }
  SwigValueWrapper& operator=(const T& t) { SwigMovePointer tmp(new T(t)); pointer = tmp; return *this; }
  operator T&() const { return *pointer.ptr; }
  T *operator&() { return pointer.ptr; }
};

template <typename T> T SwigValueInit() {
  return T();
}
#endif

/* -----------------------------------------------------------------------------
 *  This section contains generic SWIG labels for method/variable
 *  declarations/attributes, and other compiler dependent labels.
 * ----------------------------------------------------------------------------- */

/* template workaround for compilers that cannot correctly implement the C++ standard */
#ifndef SWIGTEMPLATEDISAMBIGUATOR
# if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560)
#  define SWIGTEMPLATEDISAMBIGUATOR template
# elif defined(__HP_aCC)
/* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */
/* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */
#  define SWIGTEMPLATEDISAMBIGUATOR template
# else
#  define SWIGTEMPLATEDISAMBIGUATOR
# endif
#endif

/* inline attribute */
#ifndef SWIGINLINE
# if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__))
#   define SWIGINLINE inline
# else
#   define SWIGINLINE
# endif
#endif

/* attribute recognised by some compilers to avoid 'unused' warnings */
#ifndef SWIGUNUSED
# if defined(__GNUC__)
#   if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
#     define SWIGUNUSED __attribute__ ((__unused__)) 
#   else
#     define SWIGUNUSED
#   endif
# elif defined(__ICC)
#   define SWIGUNUSED __attribute__ ((__unused__)) 
# else
#   define SWIGUNUSED 
# endif
#endif

#ifndef SWIG_MSC_UNSUPPRESS_4505
# if defined(_MSC_VER)
#   pragma warning(disable : 4505) /* unreferenced local function has been removed */
# endif 
#endif

#ifndef SWIGUNUSEDPARM
# ifdef __cplusplus
#   define SWIGUNUSEDPARM(p)
# else
#   define SWIGUNUSEDPARM(p) p SWIGUNUSED 
# endif
#endif

/* internal SWIG method */
#ifndef SWIGINTERN
# define SWIGINTERN static SWIGUNUSED
#endif

/* internal inline SWIG method */
#ifndef SWIGINTERNINLINE
# define SWIGINTERNINLINE SWIGINTERN SWIGINLINE
#endif

/* exporting methods */
#if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
#  ifndef GCC_HASCLASSVISIBILITY
#    define GCC_HASCLASSVISIBILITY
#  endif
#endif

#ifndef SWIGEXPORT
# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)
#   if defined(STATIC_LINKED)
#     define SWIGEXPORT
#   else
#     define SWIGEXPORT __declspec(dllexport)
#   endif
# else
#   if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY)
#     define SWIGEXPORT __attribute__ ((visibility("default")))
#   else
#     define SWIGEXPORT
#   endif
# endif
#endif

/* calling conventions for Windows */
#ifndef SWIGSTDCALL
# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)
#   define SWIGSTDCALL __stdcall
# else
#   define SWIGSTDCALL
# endif 
#endif

/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
#if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE)
# define _CRT_SECURE_NO_DEPRECATE
#endif

/* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */
#if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE)
# define _SCL_SECURE_NO_DEPRECATE
#endif



/* Python.h has to appear first */
#include <Python.h>

/* -----------------------------------------------------------------------------
 * swigrun.swg
 *
 * This file contains generic C API SWIG runtime support for pointer
 * type checking.
 * ----------------------------------------------------------------------------- */

/* This should only be incremented when either the layout of swig_type_info changes,
   or for whatever reason, the runtime changes incompatibly */
#define SWIG_RUNTIME_VERSION "4"

/* define SWIG_TYPE_TABLE_NAME as "SWIG_TYPE_TABLE" */
#ifdef SWIG_TYPE_TABLE
# define SWIG_QUOTE_STRING(x) #x
# define SWIG_EXPAND_AND_QUOTE_STRING(x) SWIG_QUOTE_STRING(x)
# define SWIG_TYPE_TABLE_NAME SWIG_EXPAND_AND_QUOTE_STRING(SWIG_TYPE_TABLE)
#else
# define SWIG_TYPE_TABLE_NAME
#endif

/*
  You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for
  creating a static or dynamic library from the SWIG runtime code.
  In 99.9% of the cases, SWIG just needs to declare them as 'static'.
  
  But only do this if strictly necessary, ie, if you have problems
  with your compiler or suchlike.
*/

#ifndef SWIGRUNTIME
# define SWIGRUNTIME SWIGINTERN
#endif

#ifndef SWIGRUNTIMEINLINE
# define SWIGRUNTIMEINLINE SWIGRUNTIME SWIGINLINE
#endif

/*  Generic buffer size */
#ifndef SWIG_BUFFER_SIZE
# define SWIG_BUFFER_SIZE 1024
#endif

/* Flags for pointer conversions */
#define SWIG_POINTER_DISOWN        0x1
#define SWIG_CAST_NEW_MEMORY       0x2

/* Flags for new pointer objects */
#define SWIG_POINTER_OWN           0x1


/* 
   Flags/methods for returning states.
   
   The SWIG conversion methods, as ConvertPtr, return and integer 
   that tells if the conversion was successful or not. And if not,
   an error code can be returned (see swigerrors.swg for the codes).
   
   Use the following macros/flags to set or process the returning
   states.
   
   In old versions of SWIG, code such as the following was usually written:

     if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) {
       // success code
     } else {
       //fail code
     }

   Now you can be more explicit:

    int res = SWIG_ConvertPtr(obj,vptr,ty.flags);
    if (SWIG_IsOK(res)) {
      // success code
    } else {
      // fail code
    }

   which is the same really, but now you can also do

    Type *ptr;
    int res = SWIG_ConvertPtr(obj,(void **)(&ptr),ty.flags);
    if (SWIG_IsOK(res)) {
      // success code
      if (SWIG_IsNewObj(res) {
        ...
	delete *ptr;
      } else {
        ...
      }
    } else {
      // fail code
    }
    
   I.e., now SWIG_ConvertPtr can return new objects and you can
   identify the case and take care of the deallocation. Of course that
   also requires SWIG_ConvertPtr to return new result values, such as

      int SWIG_ConvertPtr(obj, ptr,...) {         
        if (<obj is ok>) {			       
          if (<need new object>) {		       
            *ptr = <ptr to new allocated object>; 
            return SWIG_NEWOBJ;		       
          } else {				       
            *ptr = <ptr to old object>;	       
            return SWIG_OLDOBJ;		       
          } 				       
        } else {				       
          return SWIG_BADOBJ;		       
        }					       
      }

   Of course, returning the plain '0(success)/-1(fail)' still works, but you can be
   more explicit by returning SWIG_BADOBJ, SWIG_ERROR or any of the
   SWIG errors code.

   Finally, if the SWIG_CASTRANK_MODE is enabled, the result code
   allows to return the 'cast rank', for example, if you have this

       int food(double)
       int fooi(int);

   and you call
 
      food(1)   // cast rank '1'  (1 -> 1.0)
      fooi(1)   // cast rank '0'

   just use the SWIG_AddCast()/SWIG_CheckState()
*/

#define SWIG_OK                    (0) 
#define SWIG_ERROR                 (-1)
#define SWIG_IsOK(r)               (r >= 0)
#define SWIG_ArgError(r)           ((r != SWIG_ERROR) ? r : SWIG_TypeError)  

/* The CastRankLimit says how many bits are used for the cast rank */
#define SWIG_CASTRANKLIMIT         (1 << 8)
/* The NewMask denotes the object was created (using new/malloc) */
#define SWIG_NEWOBJMASK            (SWIG_CASTRANKLIMIT  << 1)
/* The TmpMask is for in/out typemaps that use temporal objects */
#define SWIG_TMPOBJMASK            (SWIG_NEWOBJMASK << 1)
/* Simple returning values */
#define SWIG_BADOBJ                (SWIG_ERROR)
#define SWIG_OLDOBJ                (SWIG_OK)
#define SWIG_NEWOBJ                (SWIG_OK | SWIG_NEWOBJMASK)
#define SWIG_TMPOBJ                (SWIG_OK | SWIG_TMPOBJMASK)
/* Check, add and del mask methods */
#define SWIG_AddNewMask(r)         (SWIG_IsOK(r) ? (r | SWIG_NEWOBJMASK) : r)
#define SWIG_DelNewMask(r)         (SWIG_IsOK(r) ? (r & ~SWIG_NEWOBJMASK) : r)
#define SWIG_IsNewObj(r)           (SWIG_IsOK(r) && (r & SWIG_NEWOBJMASK))
#define SWIG_AddTmpMask(r)         (SWIG_IsOK(r) ? (r | SWIG_TMPOBJMASK) : r)
#define SWIG_DelTmpMask(r)         (SWIG_IsOK(r) ? (r & ~SWIG_TMPOBJMASK) : r)
#define SWIG_IsTmpObj(r)           (SWIG_IsOK(r) && (r & SWIG_TMPOBJMASK))

/* Cast-Rank Mode */
#if defined(SWIG_CASTRANK_MODE)
#  ifndef SWIG_TypeRank
#    define SWIG_TypeRank             unsigned long
#  endif
#  ifndef SWIG_MAXCASTRANK            /* Default cast allowed */
#    define SWIG_MAXCASTRANK          (2)
#  endif
#  define SWIG_CASTRANKMASK          ((SWIG_CASTRANKLIMIT) -1)
#  define SWIG_CastRank(r)           (r & SWIG_CASTRANKMASK)
SWIGINTERNINLINE int SWIG_AddCast(int r) { 
  return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r;
}
SWIGINTERNINLINE int SWIG_CheckState(int r) { 
  return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0; 
}
#else /* no cast-rank mode */
#  define SWIG_AddCast
#  define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0)
#endif


#include <string.h>

#ifdef __cplusplus
extern "C" {
#endif

typedef void *(*swig_converter_func)(void *, int *);
typedef struct swig_type_info *(*swig_dycast_func)(void **);

/* Structure to store information on one type */
typedef struct swig_type_info {
  const char             *name;			/* mangled name of this type */
  const char             *str;			/* human readable name of this type */
  swig_dycast_func        dcast;		/* dynamic cast function down a hierarchy */
  struct swig_cast_info  *cast;			/* linked list of types that can cast into this type */
  void                   *clientdata;		/* language specific type data */
  int                    owndata;		/* flag if the structure owns the clientdata */
} swig_type_info;

/* Structure to store a type and conversion function used for casting */
typedef struct swig_cast_info {
  swig_type_info         *type;			/* pointer to type that is equivalent to this type */
  swig_converter_func     converter;		/* function to cast the void pointers */
  struct swig_cast_info  *next;			/* pointer to next cast in linked list */
  struct swig_cast_info  *prev;			/* pointer to the previous cast */
} swig_cast_info;

/* Structure used to store module information
 * Each module generates one structure like this, and the runtime collects
 * all of these structures and stores them in a circularly linked list.*/
typedef struct swig_module_info {
  swig_type_info         **types;		/* Array of pointers to swig_type_info structures that are in this module */
  size_t                 size;		        /* Number of types in this module */
  struct swig_module_info *next;		/* Pointer to next element in circularly linked list */
  swig_type_info         **type_initial;	/* Array of initially generated type structures */
  swig_cast_info         **cast_initial;	/* Array of initially generated casting structures */
  void                    *clientdata;		/* Language specific module data */
} swig_module_info;

/* 
  Compare two type names skipping the space characters, therefore
  "char*" == "char *" and "Class<int>" == "Class<int >", etc.

  Return 0 when the two name types are equivalent, as in
  strncmp, but skipping ' '.
*/
SWIGRUNTIME int
SWIG_TypeNameComp(const char *f1, const char *l1,
		  const char *f2, const char *l2) {
  for (;(f1 != l1) && (f2 != l2); ++f1, ++f2) {
    while ((*f1 == ' ') && (f1 != l1)) ++f1;
    while ((*f2 == ' ') && (f2 != l2)) ++f2;
    if (*f1 != *f2) return (*f1 > *f2) ? 1 : -1;
  }
  return (int)((l1 - f1) - (l2 - f2));
}

/*
  Check type equivalence in a name list like <name1>|<name2>|...
  Return 0 if not equal, 1 if equal
*/
SWIGRUNTIME int
SWIG_TypeEquiv(const char *nb, const char *tb) {
  int equiv = 0;
  const char* te = tb + strlen(tb);
  const char* ne = nb;
  while (!equiv && *ne) {
    for (nb = ne; *ne; ++ne) {
      if (*ne == '|') break;
    }
    equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
    if (*ne) ++ne;
  }
  return equiv;
}

/*
  Check type equivalence in a name list like <name1>|<name2>|...
  Return 0 if equal, -1 if nb < tb, 1 if nb > tb
*/
SWIGRUNTIME int
SWIG_TypeCompare(const char *nb, const char *tb) {
  int equiv = 0;
  const char* te = tb + strlen(tb);
  const char* ne = nb;
  while (!equiv && *ne) {
    for (nb = ne; *ne; ++ne) {
      if (*ne == '|') break;
    }
    equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
    if (*ne) ++ne;
  }
  return equiv;
}


/*
  Check the typename
*/
SWIGRUNTIME swig_cast_info *
SWIG_TypeCheck(const char *c, swig_type_info *ty) {
  if (ty) {
    swig_cast_info *iter = ty->cast;
    while (iter) {
      if (strcmp(iter->type->name, c) == 0) {
        if (iter == ty->cast)
          return iter;
        /* Move iter to the top of the linked list */
        iter->prev->next = iter->next;
        if (iter->next)
          iter->next->prev = iter->prev;
        iter->next = ty->cast;
        iter->prev = 0;
        if (ty->cast) ty->cast->prev = iter;
        ty->cast = iter;
        return iter;
      }
      iter = iter->next;
    }
  }
  return 0;
}

/* 
  Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison
*/
SWIGRUNTIME swig_cast_info *
SWIG_TypeCheckStruct(swig_type_info *from, swig_type_info *ty) {
  if (ty) {
    swig_cast_info *iter = ty->cast;
    while (iter) {
      if (iter->type == from) {
        if (iter == ty->cast)
          return iter;
        /* Move iter to the top of the linked list */
        iter->prev->next = iter->next;
        if (iter->next)
          iter->next->prev = iter->prev;
        iter->next = ty->cast;
        iter->prev = 0;
        if (ty->cast) ty->cast->prev = iter;
        ty->cast = iter;
        return iter;
      }
      iter = iter->next;
    }
  }
  return 0;
}

/*
  Cast a pointer up an inheritance hierarchy
*/
SWIGRUNTIMEINLINE void *
SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) {
  return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory);
}

/* 
   Dynamic pointer casting. Down an inheritance hierarchy
*/
SWIGRUNTIME swig_type_info *
SWIG_TypeDynamicCast(swig_type_info *ty, void **ptr) {
  swig_type_info *lastty = ty;
  if (!ty || !ty->dcast) return ty;
  while (ty && (ty->dcast)) {
    ty = (*ty->dcast)(ptr);
    if (ty) lastty = ty;
  }
  return lastty;
}

/*
  Return the name associated with this type
*/
SWIGRUNTIMEINLINE const char *
SWIG_TypeName(const swig_type_info *ty) {
  return ty->name;
}

/*
  Return the pretty name associated with this type,
  that is an unmangled type name in a form presentable to the user.
*/
SWIGRUNTIME const char *
SWIG_TypePrettyName(const swig_type_info *type) {
  /* The "str" field contains the equivalent pretty names of the
     type, separated by vertical-bar characters.  We choose
     to print the last name, as it is often (?) the most
     specific. */
  if (!type) return NULL;
  if (type->str != NULL) {
    const char *last_name = type->str;
    const char *s;
    for (s = type->str; *s; s++)
      if (*s == '|') last_name = s+1;
    return last_name;
  }
  else
    return type->name;
}

/* 
   Set the clientdata field for a type
*/
SWIGRUNTIME void
SWIG_TypeClientData(swig_type_info *ti, void *clientdata) {
  swig_cast_info *cast = ti->cast;
  /* if (ti->clientdata == clientdata) return; */
  ti->clientdata = clientdata;
  
  while (cast) {
    if (!cast->converter) {
      swig_type_info *tc = cast->type;
      if (!tc->clientdata) {
	SWIG_TypeClientData(tc, clientdata);
      }
    }    
    cast = cast->next;
  }
}
SWIGRUNTIME void
SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) {
  SWIG_TypeClientData(ti, clientdata);
  ti->owndata = 1;
}
  
/*
  Search for a swig_type_info structure only by mangled name
  Search is a O(log #types)
  
  We start searching at module start, and finish searching when start == end.  
  Note: if start == end at the beginning of the function, we go all the way around
  the circular list.
*/
SWIGRUNTIME swig_type_info *
SWIG_MangledTypeQueryModule(swig_module_info *start, 
                            swig_module_info *end, 
		            const char *name) {
  swig_module_info *iter = start;
  do {
    if (iter->size) {
      register size_t l = 0;
      register size_t r = iter->size - 1;
      do {
	/* since l+r >= 0, we can (>> 1) instead (/ 2) */
	register size_t i = (l + r) >> 1; 
	const char *iname = iter->types[i]->name;
	if (iname) {
	  register int compare = strcmp(name, iname);
	  if (compare == 0) {	    
	    return iter->types[i];
	  } else if (compare < 0) {
	    if (i) {
	      r = i - 1;
	    } else {
	      break;
	    }
	  } else if (compare > 0) {
	    l = i + 1;
	  }
	} else {
	  break; /* should never happen */
	}
      } while (l <= r);
    }
    iter = iter->next;
  } while (iter != end);
  return 0;
}

/*
  Search for a swig_type_info structure for either a mangled name or a human readable name.
  It first searches the mangled names of the types, which is a O(log #types)
  If a type is not found it then searches the human readable names, which is O(#types).
  
  We start searching at module start, and finish searching when start == end.  
  Note: if start == end at the beginning of the function, we go all the way around
  the circular list.
*/
SWIGRUNTIME swig_type_info *
SWIG_TypeQueryModule(swig_module_info *start, 
                     swig_module_info *end, 
		     const char *name) {
  /* STEP 1: Search the name field using binary search */
  swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name);
  if (ret) {
    return ret;
  } else {
    /* STEP 2: If the type hasn't been found, do a complete search
       of the str field (the human readable name) */
    swig_module_info *iter = start;
    do {
      register size_t i = 0;
      for (; i < iter->size; ++i) {
	if (iter->types[i]->str && (SWIG_TypeEquiv(iter->types[i]->str, name)))
	  return iter->types[i];
      }
      iter = iter->next;
    } while (iter != end);
  }
  
  /* neither found a match */
  return 0;
}

/* 
   Pack binary data into a string
*/
SWIGRUNTIME char *
SWIG_PackData(char *c, void *ptr, size_t sz) {
  static const char hex[17] = "0123456789abcdef";
  register const unsigned char *u = (unsigned char *) ptr;
  register const unsigned char *eu =  u + sz;
  for (; u != eu; ++u) {
    register unsigned char uu = *u;
    *(c++) = hex[(uu & 0xf0) >> 4];
    *(c++) = hex[uu & 0xf];
  }
  return c;
}

/* 
   Unpack binary data from a string
*/
SWIGRUNTIME const char *
SWIG_UnpackData(const char *c, void *ptr, size_t sz) {
  register unsigned char *u = (unsigned char *) ptr;
  register const unsigned char *eu = u + sz;
  for (; u != eu; ++u) {
    register char d = *(c++);
    register unsigned char uu;
    if ((d >= '0') && (d <= '9'))
      uu = ((d - '0') << 4);
    else if ((d >= 'a') && (d <= 'f'))
      uu = ((d - ('a'-10)) << 4);
    else 
      return (char *) 0;
    d = *(c++);
    if ((d >= '0') && (d <= '9'))
      uu |= (d - '0');
    else if ((d >= 'a') && (d <= 'f'))
      uu |= (d - ('a'-10));
    else 
      return (char *) 0;
    *u = uu;
  }
  return c;
}

/* 
   Pack 'void *' into a string buffer.
*/
SWIGRUNTIME char *
SWIG_PackVoidPtr(char *buff, void *ptr, const char *name, size_t bsz) {
  char *r = buff;
  if ((2*sizeof(void *) + 2) > bsz) return 0;
  *(r++) = '_';
  r = SWIG_PackData(r,&ptr,sizeof(void *));
  if (strlen(name) + 1 > (bsz - (r - buff))) return 0;
  strcpy(r,name);
  return buff;
}

SWIGRUNTIME const char *
SWIG_UnpackVoidPtr(const char *c, void **ptr, const char *name) {
  if (*c != '_') {
    if (strcmp(c,"NULL") == 0) {
      *ptr = (void *) 0;
      return name;
    } else {
      return 0;
    }
  }
  return SWIG_UnpackData(++c,ptr,sizeof(void *));
}

SWIGRUNTIME char *
SWIG_PackDataName(char *buff, void *ptr, size_t sz, const char *name, size_t bsz) {
  char *r = buff;
  size_t lname = (name ? strlen(name) : 0);
  if ((2*sz + 2 + lname) > bsz) return 0;
  *(r++) = '_';
  r = SWIG_PackData(r,ptr,sz);
  if (lname) {
    strncpy(r,name,lname+1);
  } else {
    *r = 0;
  }
  return buff;
}

SWIGRUNTIME const char *
SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) {
  if (*c != '_') {
    if (strcmp(c,"NULL") == 0) {
      memset(ptr,0,sz);
      return name;
    } else {
      return 0;
    }
  }
  return SWIG_UnpackData(++c,ptr,sz);
}

#ifdef __cplusplus
}
#endif

/*  Errors in SWIG */
#define  SWIG_UnknownError    	   -1 
#define  SWIG_IOError        	   -2 
#define  SWIG_RuntimeError   	   -3 
#define  SWIG_IndexError     	   -4 
#define  SWIG_TypeError      	   -5 
#define  SWIG_DivisionByZero 	   -6 
#define  SWIG_OverflowError  	   -7 
#define  SWIG_SyntaxError    	   -8 
#define  SWIG_ValueError     	   -9 
#define  SWIG_SystemError    	   -10
#define  SWIG_AttributeError 	   -11
#define  SWIG_MemoryError    	   -12 
#define  SWIG_NullReferenceError   -13



/* Compatibility macros for Python 3 */
#if PY_VERSION_HEX >= 0x03000000

#define PyClass_Check(obj) PyObject_IsInstance(obj, (PyObject *)&PyType_Type)
#define PyInt_Check(x) PyLong_Check(x)
#define PyInt_AsLong(x) PyLong_AsLong(x)
#define PyInt_FromLong(x) PyLong_FromLong(x)
#define PyString_Format(fmt, args)  PyUnicode_Format(fmt, args)

#endif

#ifndef Py_TYPE
#  define Py_TYPE(op) ((op)->ob_type)
#endif

/* SWIG APIs for compatibility of both Python 2 & 3 */

#if PY_VERSION_HEX >= 0x03000000
#  define SWIG_Python_str_FromFormat PyUnicode_FromFormat
#else
#  define SWIG_Python_str_FromFormat PyString_FromFormat
#endif


/* Warning: This function will allocate a new string in Python 3,
 * so please call SWIG_Python_str_DelForPy3(x) to free the space.
 */
SWIGINTERN char*
SWIG_Python_str_AsChar(PyObject *str)
{
#if PY_VERSION_HEX >= 0x03000000
  char *cstr;
  char *newstr;
  Py_ssize_t len;
  str = PyUnicode_AsUTF8String(str);
  PyBytes_AsStringAndSize(str, &cstr, &len);
  newstr = (char *) malloc(len+1);
  memcpy(newstr, cstr, len+1);
  Py_XDECREF(str);
  return newstr;
#else
  return PyString_AsString(str);
#endif
}

#if PY_VERSION_HEX >= 0x03000000
#  define SWIG_Python_str_DelForPy3(x) free( (void*) (x) )
#else
#  define SWIG_Python_str_DelForPy3(x) 
#endif


SWIGINTERN PyObject*
SWIG_Python_str_FromChar(const char *c)
{
#if PY_VERSION_HEX >= 0x03000000
  return PyUnicode_FromString(c); 
#else
  return PyString_FromString(c);
#endif
}

/* Add PyOS_snprintf for old Pythons */
#if PY_VERSION_HEX < 0x02020000
# if defined(_MSC_VER) || defined(__BORLANDC__) || defined(_WATCOM)
#  define PyOS_snprintf _snprintf
# else
#  define PyOS_snprintf snprintf
# endif
#endif

/* A crude PyString_FromFormat implementation for old Pythons */
#if PY_VERSION_HEX < 0x02020000

#ifndef SWIG_PYBUFFER_SIZE
# define SWIG_PYBUFFER_SIZE 1024
#endif

static PyObject *
PyString_FromFormat(const char *fmt, ...) {
  va_list ap;
  char buf[SWIG_PYBUFFER_SIZE * 2];
  int res;
  va_start(ap, fmt);
  res = vsnprintf(buf, sizeof(buf), fmt, ap);
  va_end(ap);
  return (res < 0 || res >= (int)sizeof(buf)) ? 0 : PyString_FromString(buf);
}
#endif

/* Add PyObject_Del for old Pythons */
#if PY_VERSION_HEX < 0x01060000
# define PyObject_Del(op) PyMem_DEL((op))
#endif
#ifndef PyObject_DEL
# define PyObject_DEL PyObject_Del
#endif

/* A crude PyExc_StopIteration exception for old Pythons */
#if PY_VERSION_HEX < 0x02020000
# ifndef PyExc_StopIteration
#  define PyExc_StopIteration PyExc_RuntimeError
# endif
# ifndef PyObject_GenericGetAttr
#  define PyObject_GenericGetAttr 0
# endif
#endif

/* Py_NotImplemented is defined in 2.1 and up. */
#if PY_VERSION_HEX < 0x02010000
# ifndef Py_NotImplemented
#  define Py_NotImplemented PyExc_RuntimeError
# endif
#endif

/* A crude PyString_AsStringAndSize implementation for old Pythons */
#if PY_VERSION_HEX < 0x02010000
# ifndef PyString_AsStringAndSize
#  define PyString_AsStringAndSize(obj, s, len) {*s = PyString_AsString(obj); *len = *s ? strlen(*s) : 0;}
# endif
#endif

/* PySequence_Size for old Pythons */
#if PY_VERSION_HEX < 0x02000000
# ifndef PySequence_Size
#  define PySequence_Size PySequence_Length
# endif
#endif

/* PyBool_FromLong for old Pythons */
#if PY_VERSION_HEX < 0x02030000
static
PyObject *PyBool_FromLong(long ok)
{
  PyObject *result = ok ? Py_True : Py_False;
  Py_INCREF(result);
  return result;
}
#endif

/* Py_ssize_t for old Pythons */
/* This code is as recommended by: */
/* http://www.python.org/dev/peps/pep-0353/#conversion-guidelines */
#if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN)
typedef int Py_ssize_t;
# define PY_SSIZE_T_MAX INT_MAX
# define PY_SSIZE_T_MIN INT_MIN
#endif

/* -----------------------------------------------------------------------------
 * error manipulation
 * ----------------------------------------------------------------------------- */

SWIGRUNTIME PyObject*
SWIG_Python_ErrorType(int code) {
  PyObject* type = 0;
  switch(code) {
  case SWIG_MemoryError:
    type = PyExc_MemoryError;
    break;
  case SWIG_IOError:
    type = PyExc_IOError;
    break;
  case SWIG_RuntimeError:
    type = PyExc_RuntimeError;
    break;
  case SWIG_IndexError:
    type = PyExc_IndexError;
    break;
  case SWIG_TypeError:
    type = PyExc_TypeError;
    break;
  case SWIG_DivisionByZero:
    type = PyExc_ZeroDivisionError;
    break;
  case SWIG_OverflowError:
    type = PyExc_OverflowError;
    break;
  case SWIG_SyntaxError:
    type = PyExc_SyntaxError;
    break;
  case SWIG_ValueError:
    type = PyExc_ValueError;
    break;
  case SWIG_SystemError:
    type = PyExc_SystemError;
    break;
  case SWIG_AttributeError:
    type = PyExc_AttributeError;
    break;
  default:
    type = PyExc_RuntimeError;
  }
  return type;
}


SWIGRUNTIME void
SWIG_Python_AddErrorMsg(const char* mesg)
{
  PyObject *type = 0;
  PyObject *value = 0;
  PyObject *traceback = 0;

  if (PyErr_Occurred()) PyErr_Fetch(&type, &value, &traceback);
  if (value) {
    char *tmp;
    PyObject *old_str = PyObject_Str(value);
    PyErr_Clear();
    Py_XINCREF(type);

    PyErr_Format(type, "%s %s", tmp = SWIG_Python_str_AsChar(old_str), mesg);
    SWIG_Python_str_DelForPy3(tmp);
    Py_DECREF(old_str);
    Py_DECREF(value);
  } else {
    PyErr_SetString(PyExc_RuntimeError, mesg);
  }
}

#if defined(SWIG_PYTHON_NO_THREADS)
#  if defined(SWIG_PYTHON_THREADS)
#    undef SWIG_PYTHON_THREADS
#  endif
#endif
#if defined(SWIG_PYTHON_THREADS) /* Threading support is enabled */
#  if !defined(SWIG_PYTHON_USE_GIL) && !defined(SWIG_PYTHON_NO_USE_GIL)
#    if (PY_VERSION_HEX >= 0x02030000) /* For 2.3 or later, use the PyGILState calls */
#      define SWIG_PYTHON_USE_GIL
#    endif
#  endif
#  if defined(SWIG_PYTHON_USE_GIL) /* Use PyGILState threads calls */
#    ifndef SWIG_PYTHON_INITIALIZE_THREADS
#     define SWIG_PYTHON_INITIALIZE_THREADS  PyEval_InitThreads() 
#    endif
#    ifdef __cplusplus /* C++ code */
       class SWIG_Python_Thread_Block {
         bool status;
         PyGILState_STATE state;
       public:
         void end() { if (status) { PyGILState_Release(state); status = false;} }
         SWIG_Python_Thread_Block() : status(true), state(PyGILState_Ensure()) {}
         ~SWIG_Python_Thread_Block() { end(); }
       };
       class SWIG_Python_Thread_Allow {
         bool status;
         PyThreadState *save;
       public:
         void end() { if (status) { PyEval_RestoreThread(save); status = false; }}
         SWIG_Python_Thread_Allow() : status(true), save(PyEval_SaveThread()) {}
         ~SWIG_Python_Thread_Allow() { end(); }
       };
#      define SWIG_PYTHON_THREAD_BEGIN_BLOCK   SWIG_Python_Thread_Block _swig_thread_block
#      define SWIG_PYTHON_THREAD_END_BLOCK     _swig_thread_block.end()
#      define SWIG_PYTHON_THREAD_BEGIN_ALLOW   SWIG_Python_Thread_Allow _swig_thread_allow
#      define SWIG_PYTHON_THREAD_END_ALLOW     _swig_thread_allow.end()
#    else /* C code */
#      define SWIG_PYTHON_THREAD_BEGIN_BLOCK   PyGILState_STATE _swig_thread_block = PyGILState_Ensure()
#      define SWIG_PYTHON_THREAD_END_BLOCK     PyGILState_Release(_swig_thread_block)
#      define SWIG_PYTHON_THREAD_BEGIN_ALLOW   PyThreadState *_swig_thread_allow = PyEval_SaveThread()
#      define SWIG_PYTHON_THREAD_END_ALLOW     PyEval_RestoreThread(_swig_thread_allow)
#    endif
#  else /* Old thread way, not implemented, user must provide it */
#    if !defined(SWIG_PYTHON_INITIALIZE_THREADS)
#      define SWIG_PYTHON_INITIALIZE_THREADS
#    endif
#    if !defined(SWIG_PYTHON_THREAD_BEGIN_BLOCK)
#      define SWIG_PYTHON_THREAD_BEGIN_BLOCK
#    endif
#    if !defined(SWIG_PYTHON_THREAD_END_BLOCK)
#      define SWIG_PYTHON_THREAD_END_BLOCK
#    endif
#    if !defined(SWIG_PYTHON_THREAD_BEGIN_ALLOW)
#      define SWIG_PYTHON_THREAD_BEGIN_ALLOW
#    endif
#    if !defined(SWIG_PYTHON_THREAD_END_ALLOW)
#      define SWIG_PYTHON_THREAD_END_ALLOW
#    endif
#  endif
#else /* No thread support */
#  define SWIG_PYTHON_INITIALIZE_THREADS
#  define SWIG_PYTHON_THREAD_BEGIN_BLOCK
#  define SWIG_PYTHON_THREAD_END_BLOCK
#  define SWIG_PYTHON_THREAD_BEGIN_ALLOW
#  define SWIG_PYTHON_THREAD_END_ALLOW
#endif

/* -----------------------------------------------------------------------------
 * Python API portion that goes into the runtime
 * ----------------------------------------------------------------------------- */

#ifdef __cplusplus
extern "C" {
#if 0
} /* cc-mode */
#endif
#endif

/* -----------------------------------------------------------------------------
 * Constant declarations
 * ----------------------------------------------------------------------------- */

/* Constant Types */
#define SWIG_PY_POINTER 4
#define SWIG_PY_BINARY  5

/* Constant information structure */
typedef struct swig_const_info {
  int type;
  char *name;
  long lvalue;
  double dvalue;
  void   *pvalue;
  swig_type_info **ptype;
} swig_const_info;


/* -----------------------------------------------------------------------------
 * Wrapper of PyInstanceMethod_New() used in Python 3
 * It is exported to the generated module, used for -fastproxy
 * ----------------------------------------------------------------------------- */
SWIGRUNTIME PyObject* SWIG_PyInstanceMethod_New(PyObject *self, PyObject *func)
{
#if PY_VERSION_HEX >= 0x03000000
  return PyInstanceMethod_New(func);
#else
  return NULL;
#endif
}

#ifdef __cplusplus
#if 0
{ /* cc-mode */
#endif
}
#endif


/* -----------------------------------------------------------------------------
 * See the LICENSE file for information on copyright, usage and redistribution
 * of SWIG, and the README file for authors - http://www.swig.org/release.html.
 *
 * pyrun.swg
 *
 * This file contains the runtime support for Python modules
 * and includes code for managing global variables and pointer
 * type checking.
 *
 * ----------------------------------------------------------------------------- */

/* Common SWIG API */

/* for raw pointers */
#define SWIG_Python_ConvertPtr(obj, pptr, type, flags)  SWIG_Python_ConvertPtrAndOwn(obj, pptr, type, flags, 0)
#define SWIG_ConvertPtr(obj, pptr, type, flags)         SWIG_Python_ConvertPtr(obj, pptr, type, flags)
#define SWIG_ConvertPtrAndOwn(obj,pptr,type,flags,own)  SWIG_Python_ConvertPtrAndOwn(obj, pptr, type, flags, own)
#define SWIG_NewPointerObj(ptr, type, flags)            SWIG_Python_NewPointerObj(ptr, type, flags)
#define SWIG_CheckImplicit(ty)                          SWIG_Python_CheckImplicit(ty) 
#define SWIG_AcquirePtr(ptr, src)                       SWIG_Python_AcquirePtr(ptr, src)
#define swig_owntype                                    int

/* for raw packed data */
#define SWIG_ConvertPacked(obj, ptr, sz, ty)            SWIG_Python_ConvertPacked(obj, ptr, sz, ty)
#define SWIG_NewPackedObj(ptr, sz, type)                SWIG_Python_NewPackedObj(ptr, sz, type)

/* for class or struct pointers */
#define SWIG_ConvertInstance(obj, pptr, type, flags)    SWIG_ConvertPtr(obj, pptr, type, flags)
#define SWIG_NewInstanceObj(ptr, type, flags)           SWIG_NewPointerObj(ptr, type, flags)

/* for C or C++ function pointers */
#define SWIG_ConvertFunctionPtr(obj, pptr, type)        SWIG_Python_ConvertFunctionPtr(obj, pptr, type)
#define SWIG_NewFunctionPtrObj(ptr, type)               SWIG_Python_NewPointerObj(ptr, type, 0)

/* for C++ member pointers, ie, member methods */
#define SWIG_ConvertMember(obj, ptr, sz, ty)            SWIG_Python_ConvertPacked(obj, ptr, sz, ty)
#define SWIG_NewMemberObj(ptr, sz, type)                SWIG_Python_NewPackedObj(ptr, sz, type)


/* Runtime API */

#define SWIG_GetModule(clientdata)                      SWIG_Python_GetModule()
#define SWIG_SetModule(clientdata, pointer)             SWIG_Python_SetModule(pointer)
#define SWIG_NewClientData(obj)                         SwigPyClientData_New(obj)

#define SWIG_SetErrorObj                                SWIG_Python_SetErrorObj                            
#define SWIG_SetErrorMsg                        	SWIG_Python_SetErrorMsg				   
#define SWIG_ErrorType(code)                    	SWIG_Python_ErrorType(code)                        
#define SWIG_Error(code, msg)            		SWIG_Python_SetErrorMsg(SWIG_ErrorType(code), msg) 
#define SWIG_fail                        		goto fail					   


/* Runtime API implementation */

/* Error manipulation */

SWIGINTERN void 
SWIG_Python_SetErrorObj(PyObject *errtype, PyObject *obj) {
  SWIG_PYTHON_THREAD_BEGIN_BLOCK; 
  PyErr_SetObject(errtype, obj);
  Py_DECREF(obj);
  SWIG_PYTHON_THREAD_END_BLOCK;
}

SWIGINTERN void 
SWIG_Python_SetErrorMsg(PyObject *errtype, const char *msg) {
  SWIG_PYTHON_THREAD_BEGIN_BLOCK;
  PyErr_SetString(errtype, (char *) msg);
  SWIG_PYTHON_THREAD_END_BLOCK;
}

#define SWIG_Python_Raise(obj, type, desc)  SWIG_Python_SetErrorObj(SWIG_Python_ExceptionType(desc), obj)

/* Set a constant value */

SWIGINTERN void
SWIG_Python_SetConstant(PyObject *d, const char *name, PyObject *obj) {   
  PyDict_SetItemString(d, (char*) name, obj);
  Py_DECREF(obj);                            
}

/* Append a value to the result obj */

SWIGINTERN PyObject*
SWIG_Python_AppendOutput(PyObject* result, PyObject* obj) {
#if !defined(SWIG_PYTHON_OUTPUT_TUPLE)
  if (!result) {
    result = obj;
  } else if (result == Py_None) {
    Py_DECREF(result);
    result = obj;
  } else {
    if (!PyList_Check(result)) {
      PyObject *o2 = result;
      result = PyList_New(1);
      PyList_SetItem(result, 0, o2);
    }
    PyList_Append(result,obj);
    Py_DECREF(obj);
  }
  return result;
#else
  PyObject*   o2;
  PyObject*   o3;
  if (!result) {
    result = obj;
  } else if (result == Py_None) {
    Py_DECREF(result);
    result = obj;
  } else {
    if (!PyTuple_Check(result)) {
      o2 = result;
      result = PyTuple_New(1);
      PyTuple_SET_ITEM(result, 0, o2);
    }
    o3 = PyTuple_New(1);
    PyTuple_SET_ITEM(o3, 0, obj);
    o2 = result;
    result = PySequence_Concat(o2, o3);
    Py_DECREF(o2);
    Py_DECREF(o3);
  }
  return result;
#endif
}

/* Unpack the argument tuple */

SWIGINTERN int
SWIG_Python_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssize_t max, PyObject **objs)
{
  if (!args) {
    if (!min && !max) {
      return 1;
    } else {
      PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got none", 
		   name, (min == max ? "" : "at least "), (int)min);
      return 0;
    }
  }  
  if (!PyTuple_Check(args)) {
    PyErr_SetString(PyExc_SystemError, "UnpackTuple() argument list is not a tuple");
    return 0;
  } else {
    register Py_ssize_t l = PyTuple_GET_SIZE(args);
    if (l < min) {
      PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got %d", 
		   name, (min == max ? "" : "at least "), (int)min, (int)l);
      return 0;
    } else if (l > max) {
      PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got %d", 
		   name, (min == max ? "" : "at most "), (int)max, (int)l);
      return 0;
    } else {
      register int i;
      for (i = 0; i < l; ++i) {
	objs[i] = PyTuple_GET_ITEM(args, i);
      }
      for (; l < max; ++l) {
	objs[l] = 0;
      }
      return i + 1;
    }    
  }
}

/* A functor is a function object with one single object argument */
#if PY_VERSION_HEX >= 0x02020000
#define SWIG_Python_CallFunctor(functor, obj)	        PyObject_CallFunctionObjArgs(functor, obj, NULL);
#else
#define SWIG_Python_CallFunctor(functor, obj)	        PyObject_CallFunction(functor, "O", obj);
#endif

/*
  Helper for static pointer initialization for both C and C++ code, for example
  static PyObject *SWIG_STATIC_POINTER(MyVar) = NewSomething(...);
*/
#ifdef __cplusplus
#define SWIG_STATIC_POINTER(var)  var
#else
#define SWIG_STATIC_POINTER(var)  var = 0; if (!var) var
#endif

/* -----------------------------------------------------------------------------
 * Pointer declarations
 * ----------------------------------------------------------------------------- */

/* Flags for new pointer objects */
#define SWIG_POINTER_NOSHADOW       (SWIG_POINTER_OWN      << 1)
#define SWIG_POINTER_NEW            (SWIG_POINTER_NOSHADOW | SWIG_POINTER_OWN)

#define SWIG_POINTER_IMPLICIT_CONV  (SWIG_POINTER_DISOWN   << 1)

#ifdef __cplusplus
extern "C" {
#if 0
} /* cc-mode */
#endif
#endif

/*  How to access Py_None */
#if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)
#  ifndef SWIG_PYTHON_NO_BUILD_NONE
#    ifndef SWIG_PYTHON_BUILD_NONE
#      define SWIG_PYTHON_BUILD_NONE
#    endif
#  endif
#endif

#ifdef SWIG_PYTHON_BUILD_NONE
#  ifdef Py_None
#   undef Py_None
#   define Py_None SWIG_Py_None()
#  endif
SWIGRUNTIMEINLINE PyObject * 
_SWIG_Py_None(void)
{
  PyObject *none = Py_BuildValue((char*)"");
  Py_DECREF(none);
  return none;
}
SWIGRUNTIME PyObject * 
SWIG_Py_None(void)
{
  static PyObject *SWIG_STATIC_POINTER(none) = _SWIG_Py_None();
  return none;
}
#endif

/* The python void return value */

SWIGRUNTIMEINLINE PyObject * 
SWIG_Py_Void(void)
{
  PyObject *none = Py_None;
  Py_INCREF(none);
  return none;
}

/* SwigPyClientData */

typedef struct {
  PyObject *klass;
  PyObject *newraw;
  PyObject *newargs;
  PyObject *destroy;
  int delargs;
  int implicitconv;
} SwigPyClientData;

SWIGRUNTIMEINLINE int 
SWIG_Python_CheckImplicit(swig_type_info *ty)
{
  SwigPyClientData *data = (SwigPyClientData *)ty->clientdata;
  return data ? data->implicitconv : 0;
}

SWIGRUNTIMEINLINE PyObject *
SWIG_Python_ExceptionType(swig_type_info *desc) {
  SwigPyClientData *data = desc ? (SwigPyClientData *) desc->clientdata : 0;
  PyObject *klass = data ? data->klass : 0;
  return (klass ? klass : PyExc_RuntimeError);
}


SWIGRUNTIME SwigPyClientData * 
SwigPyClientData_New(PyObject* obj)
{
  if (!obj) {
    return 0;
  } else {
    SwigPyClientData *data = (SwigPyClientData *)malloc(sizeof(SwigPyClientData));
    /* the klass element */
    data->klass = obj;
    Py_INCREF(data->klass);
    /* the newraw method and newargs arguments used to create a new raw instance */
    if (PyClass_Check(obj)) {
      data->newraw = 0;
      data->newargs = obj;
      Py_INCREF(obj);
    } else {
#if (PY_VERSION_HEX < 0x02020000)
      data->newraw = 0;
#else
      data->newraw = PyObject_GetAttrString(data->klass, (char *)"__new__");
#endif
      if (data->newraw) {
	Py_INCREF(data->newraw);
	data->newargs = PyTuple_New(1);
	PyTuple_SetItem(data->newargs, 0, obj);
      } else {
	data->newargs = obj;
      }
      Py_INCREF(data->newargs);
    }
    /* the destroy method, aka as the C++ delete method */
    data->destroy = PyObject_GetAttrString(data->klass, (char *)"__swig_destroy__");
    if (PyErr_Occurred()) {
      PyErr_Clear();
      data->destroy = 0;
    }
    if (data->destroy) {
      int flags;
      Py_INCREF(data->destroy);
      flags = PyCFunction_GET_FLAGS(data->destroy);
#ifdef METH_O
      data->delargs = !(flags & (METH_O));
#else
      data->delargs = 0;
#endif
    } else {
      data->delargs = 0;
    }
    data->implicitconv = 0;
    return data;
  }
}

SWIGRUNTIME void 
SwigPyClientData_Del(SwigPyClientData* data)
{
  Py_XDECREF(data->newraw);
  Py_XDECREF(data->newargs);
  Py_XDECREF(data->destroy);
}

/* =============== SwigPyObject =====================*/

typedef struct {
  PyObject_HEAD
  void *ptr;
  swig_type_info *ty;
  int own;
  PyObject *next;
} SwigPyObject;

SWIGRUNTIME PyObject *
SwigPyObject_long(SwigPyObject *v)
{
  return PyLong_FromVoidPtr(v->ptr);
}

SWIGRUNTIME PyObject *
SwigPyObject_format(const char* fmt, SwigPyObject *v)
{
  PyObject *res = NULL;
  PyObject *args = PyTuple_New(1);
  if (args) {
    if (PyTuple_SetItem(args, 0, SwigPyObject_long(v)) == 0) {
      PyObject *ofmt = SWIG_Python_str_FromChar(fmt);
      if (ofmt) {
#if PY_VERSION_HEX >= 0x03000000
	res = PyUnicode_Format(ofmt,args);
#else
	res = PyString_Format(ofmt,args);
#endif
	Py_DECREF(ofmt);
      }
      Py_DECREF(args);
    }
  }
  return res;
}

SWIGRUNTIME PyObject *
SwigPyObject_oct(SwigPyObject *v)
{
  return SwigPyObject_format("%o",v);
}

SWIGRUNTIME PyObject *
SwigPyObject_hex(SwigPyObject *v)
{
  return SwigPyObject_format("%x",v);
}

SWIGRUNTIME PyObject *
#ifdef METH_NOARGS
SwigPyObject_repr(SwigPyObject *v)
#else
SwigPyObject_repr(SwigPyObject *v, PyObject *args)
#endif
{
  const char *name = SWIG_TypePrettyName(v->ty);
  PyObject *repr = SWIG_Python_str_FromFormat("<Swig Object of type '%s' at %p>", name, v);
  if (v->next) {
#ifdef METH_NOARGS
    PyObject *nrep = SwigPyObject_repr((SwigPyObject *)v->next);
#else
    PyObject *nrep = SwigPyObject_repr((SwigPyObject *)v->next, args);
#endif
#if PY_VERSION_HEX >= 0x03000000
    PyObject *joined = PyUnicode_Concat(repr, nrep);
    Py_DecRef(repr);
    Py_DecRef(nrep);
    repr = joined;
#else
    PyString_ConcatAndDel(&repr,nrep);
#endif
  }
  return repr;  
}

SWIGRUNTIME int
SwigPyObject_print(SwigPyObject *v, FILE *fp, int SWIGUNUSEDPARM(flags))
{
  char *str;
#ifdef METH_NOARGS
  PyObject *repr = SwigPyObject_repr(v);
#else
  PyObject *repr = SwigPyObject_repr(v, NULL);
#endif
  if (repr) {
    str = SWIG_Python_str_AsChar(repr); 
    fputs(str, fp);
    SWIG_Python_str_DelForPy3(str);
    Py_DECREF(repr);
    return 0; 
  } else {
    return 1; 
  }
}

SWIGRUNTIME PyObject *
SwigPyObject_str(SwigPyObject *v)
{
  char result[SWIG_BUFFER_SIZE];
  return SWIG_PackVoidPtr(result, v->ptr, v->ty->name, sizeof(result)) ?
    SWIG_Python_str_FromChar(result) : 0;
}

SWIGRUNTIME int
SwigPyObject_compare(SwigPyObject *v, SwigPyObject *w)
{
  void *i = v->ptr;
  void *j = w->ptr;
  return (i < j) ? -1 : ((i > j) ? 1 : 0);
}

/* Added for Python 3.x, would it also be useful for Python 2.x? */
SWIGRUNTIME PyObject*
SwigPyObject_richcompare(SwigPyObject *v, SwigPyObject *w, int op)
{
  PyObject* res;
  if( op != Py_EQ && op != Py_NE ) {
    Py_INCREF(Py_NotImplemented);
    return Py_NotImplemented;
  }
  if( (SwigPyObject_compare(v, w)==0) == (op == Py_EQ) )
    res = Py_True;
  else
    res = Py_False;
  Py_INCREF(res);
  return res;  
}


SWIGRUNTIME PyTypeObject* _PySwigObject_type(void);

SWIGRUNTIME PyTypeObject*
SwigPyObject_type(void) {
  static PyTypeObject *SWIG_STATIC_POINTER(type) = _PySwigObject_type();
  return type;
}

SWIGRUNTIMEINLINE int
SwigPyObject_Check(PyObject *op) {
  return (Py_TYPE(op) == SwigPyObject_type())
    || (strcmp(Py_TYPE(op)->tp_name,"SwigPyObject") == 0);
}

SWIGRUNTIME PyObject *
SwigPyObject_New(void *ptr, swig_type_info *ty, int own);

SWIGRUNTIME void
SwigPyObject_dealloc(PyObject *v)
{
  SwigPyObject *sobj = (SwigPyObject *) v;
  PyObject *next = sobj->next;
  if (sobj->own == SWIG_POINTER_OWN) {
    swig_type_info *ty = sobj->ty;
    SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0;
    PyObject *destroy = data ? data->destroy : 0;
    if (destroy) {
      /* destroy is always a VARARGS method */
      PyObject *res;
      if (data->delargs) {
	/* we need to create a temporary object to carry the destroy operation */
	PyObject *tmp = SwigPyObject_New(sobj->ptr, ty, 0);
	res = SWIG_Python_CallFunctor(destroy, tmp);
	Py_DECREF(tmp);
      } else {
	PyCFunction meth = PyCFunction_GET_FUNCTION(destroy);
	PyObject *mself = PyCFunction_GET_SELF(destroy);
	res = ((*meth)(mself, v));
      }
      Py_XDECREF(res);
    } 
#if !defined(SWIG_PYTHON_SILENT_MEMLEAK)
    else {
      const char *name = SWIG_TypePrettyName(ty);
      printf("swig/python detected a memory leak of type '%s', no destructor found.\n", (name ? name : "unknown"));
    }
#endif
  } 
  Py_XDECREF(next);
  PyObject_DEL(v);
}

SWIGRUNTIME PyObject* 
SwigPyObject_append(PyObject* v, PyObject* next)
{
  SwigPyObject *sobj = (SwigPyObject *) v;
#ifndef METH_O
  PyObject *tmp = 0;
  if (!PyArg_ParseTuple(next,(char *)"O:append", &tmp)) return NULL;
  next = tmp;
#endif
  if (!SwigPyObject_Check(next)) {
    return NULL;
  }
  sobj->next = next;
  Py_INCREF(next);
  return SWIG_Py_Void();
}

SWIGRUNTIME PyObject* 
#ifdef METH_NOARGS
SwigPyObject_next(PyObject* v)
#else
SwigPyObject_next(PyObject* v, PyObject *SWIGUNUSEDPARM(args))
#endif
{
  SwigPyObject *sobj = (SwigPyObject *) v;
  if (sobj->next) {    
    Py_INCREF(sobj->next);
    return sobj->next;
  } else {
    return SWIG_Py_Void();
  }
}

SWIGINTERN PyObject*
#ifdef METH_NOARGS
SwigPyObject_disown(PyObject *v)
#else
SwigPyObject_disown(PyObject* v, PyObject *SWIGUNUSEDPARM(args))
#endif
{
  SwigPyObject *sobj = (SwigPyObject *)v;
  sobj->own = 0;
  return SWIG_Py_Void();
}

SWIGINTERN PyObject*
#ifdef METH_NOARGS
SwigPyObject_acquire(PyObject *v)
#else
SwigPyObject_acquire(PyObject* v, PyObject *SWIGUNUSEDPARM(args))
#endif
{
  SwigPyObject *sobj = (SwigPyObject *)v;
  sobj->own = SWIG_POINTER_OWN;
  return SWIG_Py_Void();
}

SWIGINTERN PyObject*
SwigPyObject_own(PyObject *v, PyObject *args)
{
  PyObject *val = 0;
#if (PY_VERSION_HEX < 0x02020000)
  if (!PyArg_ParseTuple(args,(char *)"|O:own",&val))
#else
  if (!PyArg_UnpackTuple(args, (char *)"own", 0, 1, &val)) 
#endif
    {
      return NULL;
    } 
  else
    {
      SwigPyObject *sobj = (SwigPyObject *)v;
      PyObject *obj = PyBool_FromLong(sobj->own);
      if (val) {
#ifdef METH_NOARGS
	if (PyObject_IsTrue(val)) {
	  SwigPyObject_acquire(v);
	} else {
	  SwigPyObject_disown(v);
	}
#else
	if (PyObject_IsTrue(val)) {
	  SwigPyObject_acquire(v,args);
	} else {
	  SwigPyObject_disown(v,args);
	}
#endif
      } 
      return obj;
    }
}

#ifdef METH_O
static PyMethodDef
swigobject_methods[] = {
  {(char *)"disown",  (PyCFunction)SwigPyObject_disown,  METH_NOARGS,  (char *)"releases ownership of the pointer"},
  {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_NOARGS,  (char *)"aquires ownership of the pointer"},
  {(char *)"own",     (PyCFunction)SwigPyObject_own,     METH_VARARGS, (char *)"returns/sets ownership of the pointer"},
  {(char *)"append",  (PyCFunction)SwigPyObject_append,  METH_O,       (char *)"appends another 'this' object"},
  {(char *)"next",    (PyCFunction)SwigPyObject_next,    METH_NOARGS,  (char *)"returns the next 'this' object"},
  {(char *)"__repr__",(PyCFunction)SwigPyObject_repr,    METH_NOARGS,  (char *)"returns object representation"},
  {0, 0, 0, 0}  
};
#else
static PyMethodDef
swigobject_methods[] = {
  {(char *)"disown",  (PyCFunction)SwigPyObject_disown,  METH_VARARGS,  (char *)"releases ownership of the pointer"},
  {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_VARARGS,  (char *)"aquires ownership of the pointer"},
  {(char *)"own",     (PyCFunction)SwigPyObject_own,     METH_VARARGS,  (char *)"returns/sets ownership of the pointer"},
  {(char *)"append",  (PyCFunction)SwigPyObject_append,  METH_VARARGS,  (char *)"appends another 'this' object"},
  {(char *)"next",    (PyCFunction)SwigPyObject_next,    METH_VARARGS,  (char *)"returns the next 'this' object"},
  {(char *)"__repr__",(PyCFunction)SwigPyObject_repr,   METH_VARARGS,  (char *)"returns object representation"},
  {0, 0, 0, 0}  
};
#endif

#if PY_VERSION_HEX < 0x02020000
SWIGINTERN PyObject *
SwigPyObject_getattr(SwigPyObject *sobj,char *name)
{
  return Py_FindMethod(swigobject_methods, (PyObject *)sobj, name);
}
#endif

SWIGRUNTIME PyTypeObject*
_PySwigObject_type(void) {
  static char swigobject_doc[] = "Swig object carries a C/C++ instance pointer";
  
  static PyNumberMethods SwigPyObject_as_number = {
    (binaryfunc)0, /*nb_add*/
    (binaryfunc)0, /*nb_subtract*/
    (binaryfunc)0, /*nb_multiply*/
    /* nb_divide removed in Python 3 */
#if PY_VERSION_HEX < 0x03000000
    (binaryfunc)0, /*nb_divide*/
#endif
    (binaryfunc)0, /*nb_remainder*/
    (binaryfunc)0, /*nb_divmod*/
    (ternaryfunc)0,/*nb_power*/
    (unaryfunc)0,  /*nb_negative*/
    (unaryfunc)0,  /*nb_positive*/
    (unaryfunc)0,  /*nb_absolute*/
    (inquiry)0,    /*nb_nonzero*/
    0,		   /*nb_invert*/
    0,		   /*nb_lshift*/
    0,		   /*nb_rshift*/
    0,		   /*nb_and*/
    0,		   /*nb_xor*/
    0,		   /*nb_or*/
#if PY_VERSION_HEX < 0x03000000
    0,   /*nb_coerce*/
#endif
    (unaryfunc)SwigPyObject_long, /*nb_int*/
#if PY_VERSION_HEX < 0x03000000
    (unaryfunc)SwigPyObject_long, /*nb_long*/
#else
    0, /*nb_reserved*/
#endif
    (unaryfunc)0,                 /*nb_float*/
#if PY_VERSION_HEX < 0x03000000
    (unaryfunc)SwigPyObject_oct,  /*nb_oct*/
    (unaryfunc)SwigPyObject_hex,  /*nb_hex*/
#endif
#if PY_VERSION_HEX >= 0x03000000 /* 3.0 */
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_index, nb_inplace_divide removed */
#elif PY_VERSION_HEX >= 0x02050000 /* 2.5.0 */
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_index */
#elif PY_VERSION_HEX >= 0x02020000 /* 2.2.0 */
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_true_divide */
#elif PY_VERSION_HEX >= 0x02000000 /* 2.0.0 */
    0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_or */
#endif
  };

  static PyTypeObject swigpyobject_type;  
  static int type_init = 0;
  if (!type_init) {
    const PyTypeObject tmp
      = {
	/* PyObject header changed in Python 3 */
#if PY_VERSION_HEX >= 0x03000000
	PyVarObject_HEAD_INIT(&PyType_Type, 0)
#else    
	PyObject_HEAD_INIT(NULL)
	0,				    /* ob_size */
#endif
	(char *)"SwigPyObject",		    /* tp_name */
	sizeof(SwigPyObject),		    /* tp_basicsize */
	0,			            /* tp_itemsize */
	(destructor)SwigPyObject_dealloc,   /* tp_dealloc */
	(printfunc)SwigPyObject_print,	    /* tp_print */
#if PY_VERSION_HEX < 0x02020000
	(getattrfunc)SwigPyObject_getattr,  /* tp_getattr */ 
#else
	(getattrfunc)0,			    /* tp_getattr */ 
#endif
	(setattrfunc)0,			    /* tp_setattr */ 
#if PY_VERSION_HEX >= 0x03000000
    0, /* tp_reserved in 3.0.1, tp_compare in 3.0.0 but not used */
#else
	(cmpfunc)SwigPyObject_compare,	    /* tp_compare */
#endif
	(reprfunc)SwigPyObject_repr,	    /* tp_repr */    
	&SwigPyObject_as_number,	    /* tp_as_number */
	0,				    /* tp_as_sequence */
	0,				    /* tp_as_mapping */
	(hashfunc)0,			    /* tp_hash */
	(ternaryfunc)0,			    /* tp_call */
	(reprfunc)SwigPyObject_str,	    /* tp_str */
	PyObject_GenericGetAttr,            /* tp_getattro */
	0,				    /* tp_setattro */
	0,		                    /* tp_as_buffer */
	Py_TPFLAGS_DEFAULT,	            /* tp_flags */
	swigobject_doc, 	            /* tp_doc */        
	0,                                  /* tp_traverse */
	0,                                  /* tp_clear */
	(richcmpfunc)SwigPyObject_richcompare,           /* tp_richcompare */
	0,                                  /* tp_weaklistoffset */
#if PY_VERSION_HEX >= 0x02020000
	0,                                  /* tp_iter */
	0,                                  /* tp_iternext */
	swigobject_methods,		    /* tp_methods */ 
	0,			            /* tp_members */
	0,				    /* tp_getset */	    	
	0,			            /* tp_base */	        
	0,				    /* tp_dict */	    	
	0,				    /* tp_descr_get */  	
	0,				    /* tp_descr_set */  	
	0,				    /* tp_dictoffset */ 	
	0,				    /* tp_init */	    	
	0,				    /* tp_alloc */	    	
	0,			            /* tp_new */	    	
	0,	                            /* tp_free */	   
	0,                                  /* tp_is_gc */  
	0,				    /* tp_bases */   
	0,				    /* tp_mro */
	0,				    /* tp_cache */   
	0,				    /* tp_subclasses */
	0,				    /* tp_weaklist */
#endif
#if PY_VERSION_HEX >= 0x02030000
	0,                                  /* tp_del */
#endif
#ifdef COUNT_ALLOCS
	0,0,0,0                             /* tp_alloc -> tp_next */
#endif
      };
    swigpyobject_type = tmp;
    /* for Python 3 we already assigned ob_type in PyVarObject_HEAD_INIT() */
#if PY_VERSION_HEX < 0x03000000
    swigpyobject_type.ob_type = &PyType_Type;
#endif
    type_init = 1;
  }
  return &swigpyobject_type;
}

SWIGRUNTIME PyObject *
SwigPyObject_New(void *ptr, swig_type_info *ty, int own)
{
  SwigPyObject *sobj = PyObject_NEW(SwigPyObject, SwigPyObject_type());
  if (sobj) {
    sobj->ptr  = ptr;
    sobj->ty   = ty;
    sobj->own  = own;
    sobj->next = 0;
  }
  return (PyObject *)sobj;
}

/* -----------------------------------------------------------------------------
 * Implements a simple Swig Packed type, and use it instead of string
 * ----------------------------------------------------------------------------- */

typedef struct {
  PyObject_HEAD
  void *pack;
  swig_type_info *ty;
  size_t size;
} SwigPyPacked;

SWIGRUNTIME int
SwigPyPacked_print(SwigPyPacked *v, FILE *fp, int SWIGUNUSEDPARM(flags))
{
  char result[SWIG_BUFFER_SIZE];
  fputs("<Swig Packed ", fp); 
  if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))) {
    fputs("at ", fp); 
    fputs(result, fp); 
  }
  fputs(v->ty->name,fp); 
  fputs(">", fp);
  return 0; 
}
  
SWIGRUNTIME PyObject *
SwigPyPacked_repr(SwigPyPacked *v)
{
  char result[SWIG_BUFFER_SIZE];
  if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))) {
    return SWIG_Python_str_FromFormat("<Swig Packed at %s%s>", result, v->ty->name);
  } else {
    return SWIG_Python_str_FromFormat("<Swig Packed %s>", v->ty->name);
  }  
}

SWIGRUNTIME PyObject *
SwigPyPacked_str(SwigPyPacked *v)
{
  char result[SWIG_BUFFER_SIZE];
  if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))){
    return SWIG_Python_str_FromFormat("%s%s", result, v->ty->name);
  } else {
    return SWIG_Python_str_FromChar(v->ty->name);
  }  
}

SWIGRUNTIME int
SwigPyPacked_compare(SwigPyPacked *v, SwigPyPacked *w)
{
  size_t i = v->size;
  size_t j = w->size;
  int s = (i < j) ? -1 : ((i > j) ? 1 : 0);
  return s ? s : strncmp((char *)v->pack, (char *)w->pack, 2*v->size);
}

SWIGRUNTIME PyTypeObject* _PySwigPacked_type(void);

SWIGRUNTIME PyTypeObject*
SwigPyPacked_type(void) {
  static PyTypeObject *SWIG_STATIC_POINTER(type) = _PySwigPacked_type();
  return type;
}

SWIGRUNTIMEINLINE int
SwigPyPacked_Check(PyObject *op) {
  return ((op)->ob_type == _PySwigPacked_type()) 
    || (strcmp((op)->ob_type->tp_name,"SwigPyPacked") == 0);
}

SWIGRUNTIME void
SwigPyPacked_dealloc(PyObject *v)
{
  if (SwigPyPacked_Check(v)) {
    SwigPyPacked *sobj = (SwigPyPacked *) v;
    free(sobj->pack);
  }
  PyObject_DEL(v);
}

SWIGRUNTIME PyTypeObject*
_PySwigPacked_type(void) {
  static char swigpacked_doc[] = "Swig object carries a C/C++ instance pointer";
  static PyTypeObject swigpypacked_type;
  static int type_init = 0;  
  if (!type_init) {
    const PyTypeObject tmp
      = {
    /* PyObject header changed in Python 3 */
#if PY_VERSION_HEX>=0x03000000
    PyVarObject_HEAD_INIT(&PyType_Type, 0)
#else
	PyObject_HEAD_INIT(NULL)
    0,				    /* ob_size */	
#endif
	(char *)"SwigPyPacked",		    /* tp_name */	
	sizeof(SwigPyPacked),		    /* tp_basicsize */	
	0,				    /* tp_itemsize */	
	(destructor)SwigPyPacked_dealloc,   /* tp_dealloc */	
	(printfunc)SwigPyPacked_print,	    /* tp_print */   	
	(getattrfunc)0,			    /* tp_getattr */ 	
	(setattrfunc)0,			    /* tp_setattr */ 	
#if PY_VERSION_HEX>=0x03000000
    0, /* tp_reserved in 3.0.1 */
#else
    (cmpfunc)SwigPyPacked_compare,	    /* tp_compare */
#endif
	(reprfunc)SwigPyPacked_repr,	    /* tp_repr */
	0,	                            /* tp_as_number */
	0,				    /* tp_as_sequence */
	0,				    /* tp_as_mapping */
	(hashfunc)0,			    /* tp_hash */
	(ternaryfunc)0,			    /* tp_call */
	(reprfunc)SwigPyPacked_str,	    /* tp_str */
	PyObject_GenericGetAttr,            /* tp_getattro */
	0,				    /* tp_setattro */
	0,		                    /* tp_as_buffer */
	Py_TPFLAGS_DEFAULT,	            /* tp_flags */
	swigpacked_doc, 	            /* tp_doc */
	0,                                  /* tp_traverse */
	0,                                  /* tp_clear */
	0,                                  /* tp_richcompare */
	0,                                  /* tp_weaklistoffset */
#if PY_VERSION_HEX >= 0x02020000
	0,                                  /* tp_iter */
	0,                                  /* tp_iternext */
	0,		                    /* tp_methods */ 
	0,			            /* tp_members */
	0,				    /* tp_getset */	    	
	0,			            /* tp_base */	        
	0,				    /* tp_dict */	    	
	0,				    /* tp_descr_get */  	
	0,				    /* tp_descr_set */  	
	0,				    /* tp_dictoffset */ 	
	0,				    /* tp_init */	    	
	0,				    /* tp_alloc */	    	
	0,			            /* tp_new */	    	
	0, 	                            /* tp_free */	   
        0,                                  /* tp_is_gc */  
	0,				    /* tp_bases */   
	0,				    /* tp_mro */
	0,				    /* tp_cache */   
 	0,				    /* tp_subclasses */
	0,				    /* tp_weaklist */
#endif
#if PY_VERSION_HEX >= 0x02030000
	0,                                  /* tp_del */
#endif
#ifdef COUNT_ALLOCS
	0,0,0,0                             /* tp_alloc -> tp_next */
#endif
      };
    swigpypacked_type = tmp;
    /* for Python 3 the ob_type already assigned in PyVarObject_HEAD_INIT() */
#if PY_VERSION_HEX < 0x03000000
    swigpypacked_type.ob_type = &PyType_Type;
#endif
    type_init = 1;
  }
  return &swigpypacked_type;
}

SWIGRUNTIME PyObject *
SwigPyPacked_New(void *ptr, size_t size, swig_type_info *ty)
{
  SwigPyPacked *sobj = PyObject_NEW(SwigPyPacked, SwigPyPacked_type());
  if (sobj) {
    void *pack = malloc(size);
    if (pack) {
      memcpy(pack, ptr, size);
      sobj->pack = pack;
      sobj->ty   = ty;
      sobj->size = size;
    } else {
      PyObject_DEL((PyObject *) sobj);
      sobj = 0;
    }
  }
  return (PyObject *) sobj;
}

SWIGRUNTIME swig_type_info *
SwigPyPacked_UnpackData(PyObject *obj, void *ptr, size_t size)
{
  if (SwigPyPacked_Check(obj)) {
    SwigPyPacked *sobj = (SwigPyPacked *)obj;
    if (sobj->size != size) return 0;
    memcpy(ptr, sobj->pack, size);
    return sobj->ty;
  } else {
    return 0;
  }
}

/* -----------------------------------------------------------------------------
 * pointers/data manipulation
 * ----------------------------------------------------------------------------- */

SWIGRUNTIMEINLINE PyObject *
_SWIG_This(void)
{
    return SWIG_Python_str_FromChar("this");
}

SWIGRUNTIME PyObject *
SWIG_This(void)
{
  static PyObject *SWIG_STATIC_POINTER(swig_this) = _SWIG_This();
  return swig_this;
}

/* #define SWIG_PYTHON_SLOW_GETSET_THIS */

/* TODO: I don't know how to implement the fast getset in Python 3 right now */
#if PY_VERSION_HEX>=0x03000000
#define SWIG_PYTHON_SLOW_GETSET_THIS 
#endif

SWIGRUNTIME SwigPyObject *
SWIG_Python_GetSwigThis(PyObject *pyobj) 
{
  if (SwigPyObject_Check(pyobj)) {
    return (SwigPyObject *) pyobj;
  } else {
    PyObject *obj = 0;
#if (!defined(SWIG_PYTHON_SLOW_GETSET_THIS) && (PY_VERSION_HEX >= 0x02030000))
    if (PyInstance_Check(pyobj)) {
      obj = _PyInstance_Lookup(pyobj, SWIG_This());      
    } else {
      PyObject **dictptr = _PyObject_GetDictPtr(pyobj);
      if (dictptr != NULL) {
	PyObject *dict = *dictptr;
	obj = dict ? PyDict_GetItem(dict, SWIG_This()) : 0;
      } else {
#ifdef PyWeakref_CheckProxy
	if (PyWeakref_CheckProxy(pyobj)) {
	  PyObject *wobj = PyWeakref_GET_OBJECT(pyobj);
	  return wobj ? SWIG_Python_GetSwigThis(wobj) : 0;
	}
#endif
	obj = PyObject_GetAttr(pyobj,SWIG_This());
	if (obj) {
	  Py_DECREF(obj);
	} else {
	  if (PyErr_Occurred()) PyErr_Clear();
	  return 0;
	}
      }
    }
#else
    obj = PyObject_GetAttr(pyobj,SWIG_This());
    if (obj) {
      Py_DECREF(obj);
    } else {
      if (PyErr_Occurred()) PyErr_Clear();
      return 0;
    }
#endif
    if (obj && !SwigPyObject_Check(obj)) {
      /* a PyObject is called 'this', try to get the 'real this'
	 SwigPyObject from it */ 
      return SWIG_Python_GetSwigThis(obj);
    }
    return (SwigPyObject *)obj;
  }
}

/* Acquire a pointer value */

SWIGRUNTIME int
SWIG_Python_AcquirePtr(PyObject *obj, int own) {
  if (own == SWIG_POINTER_OWN) {
    SwigPyObject *sobj = SWIG_Python_GetSwigThis(obj);
    if (sobj) {
      int oldown = sobj->own;
      sobj->own = own;
      return oldown;
    }
  }
  return 0;
}

/* Convert a pointer value */

SWIGRUNTIME int
SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int flags, int *own) {
  if (!obj) return SWIG_ERROR;
  if (obj == Py_None) {
    if (ptr) *ptr = 0;
    return SWIG_OK;
  } else {
    SwigPyObject *sobj = SWIG_Python_GetSwigThis(obj);
    if (own)
      *own = 0;
    while (sobj) {
      void *vptr = sobj->ptr;
      if (ty) {
	swig_type_info *to = sobj->ty;
	if (to == ty) {
	  /* no type cast needed */
	  if (ptr) *ptr = vptr;
	  break;
	} else {
	  swig_cast_info *tc = SWIG_TypeCheck(to->name,ty);
	  if (!tc) {
	    sobj = (SwigPyObject *)sobj->next;
	  } else {
	    if (ptr) {
              int newmemory = 0;
              *ptr = SWIG_TypeCast(tc,vptr,&newmemory);
              if (newmemory == SWIG_CAST_NEW_MEMORY) {
                assert(own);
                if (own)
                  *own = *own | SWIG_CAST_NEW_MEMORY;
              }
            }
	    break;
	  }
	}
      } else {
	if (ptr) *ptr = vptr;
	break;
      }
    }
    if (sobj) {
      if (own)
        *own = *own | sobj->own;
      if (flags & SWIG_POINTER_DISOWN) {
	sobj->own = 0;
      }
      return SWIG_OK;
    } else {
      int res = SWIG_ERROR;
      if (flags & SWIG_POINTER_IMPLICIT_CONV) {
	SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0;
	if (data && !data->implicitconv) {
	  PyObject *klass = data->klass;
	  if (klass) {
	    PyObject *impconv;
	    data->implicitconv = 1; /* avoid recursion and call 'explicit' constructors*/
	    impconv = SWIG_Python_CallFunctor(klass, obj);
	    data->implicitconv = 0;
	    if (PyErr_Occurred()) {
	      PyErr_Clear();
	      impconv = 0;
	    }
	    if (impconv) {
	      SwigPyObject *iobj = SWIG_Python_GetSwigThis(impconv);
	      if (iobj) {
		void *vptr;
		res = SWIG_Python_ConvertPtrAndOwn((PyObject*)iobj, &vptr, ty, 0, 0);
		if (SWIG_IsOK(res)) {
		  if (ptr) {
		    *ptr = vptr;
		    /* transfer the ownership to 'ptr' */
		    iobj->own = 0;
		    res = SWIG_AddCast(res);
		    res = SWIG_AddNewMask(res);
		  } else {
		    res = SWIG_AddCast(res);		    
		  }
		}
	      }
	      Py_DECREF(impconv);
	    }
	  }
	}
      }
      return res;
    }
  }
}

/* Convert a function ptr value */

SWIGRUNTIME int
SWIG_Python_ConvertFunctionPtr(PyObject *obj, void **ptr, swig_type_info *ty) {
  if (!PyCFunction_Check(obj)) {
    return SWIG_ConvertPtr(obj, ptr, ty, 0);
  } else {
    void *vptr = 0;
    
    /* here we get the method pointer for callbacks */
    const char *doc = (((PyCFunctionObject *)obj) -> m_ml -> ml_doc);
    const char *desc = doc ? strstr(doc, "swig_ptr: ") : 0;
    if (desc)
      desc = ty ? SWIG_UnpackVoidPtr(desc + 10, &vptr, ty->name) : 0;
    if (!desc) 
      return SWIG_ERROR;
    if (ty) {
      swig_cast_info *tc = SWIG_TypeCheck(desc,ty);
      if (tc) {
        int newmemory = 0;
        *ptr = SWIG_TypeCast(tc,vptr,&newmemory);
        assert(!newmemory); /* newmemory handling not yet implemented */
      } else {
        return SWIG_ERROR;
      }
    } else {
      *ptr = vptr;
    }
    return SWIG_OK;
  }
}

/* Convert a packed value value */

SWIGRUNTIME int
SWIG_Python_ConvertPacked(PyObject *obj, void *ptr, size_t sz, swig_type_info *ty) {
  swig_type_info *to = SwigPyPacked_UnpackData(obj, ptr, sz);
  if (!to) return SWIG_ERROR;
  if (ty) {
    if (to != ty) {
      /* check type cast? */
      swig_cast_info *tc = SWIG_TypeCheck(to->name,ty);
      if (!tc) return SWIG_ERROR;
    }
  }
  return SWIG_OK;
}  

/* -----------------------------------------------------------------------------
 * Create a new pointer object
 * ----------------------------------------------------------------------------- */

/*
  Create a new instance object, without calling __init__, and set the
  'this' attribute.
*/

SWIGRUNTIME PyObject* 
SWIG_Python_NewShadowInstance(SwigPyClientData *data, PyObject *swig_this)
{
#if (PY_VERSION_HEX >= 0x02020000)
  PyObject *inst = 0;
  PyObject *newraw = data->newraw;
  if (newraw) {
    inst = PyObject_Call(newraw, data->newargs, NULL);
    if (inst) {
#if !defined(SWIG_PYTHON_SLOW_GETSET_THIS)
      PyObject **dictptr = _PyObject_GetDictPtr(inst);
      if (dictptr != NULL) {
	PyObject *dict = *dictptr;
	if (dict == NULL) {
	  dict = PyDict_New();
	  *dictptr = dict;
	  PyDict_SetItem(dict, SWIG_This(), swig_this);
	}
      }
#else
      PyObject *key = SWIG_This();
      PyObject_SetAttr(inst, key, swig_this);
#endif
    }
  } else {
#if PY_VERSION_HEX >= 0x03000000
    inst = PyBaseObject_Type.tp_new((PyTypeObject*) data->newargs, Py_None, Py_None);
    PyObject_SetAttr(inst, SWIG_This(), swig_this);
    Py_TYPE(inst)->tp_flags &= ~Py_TPFLAGS_VALID_VERSION_TAG;
#else
    PyObject *dict = PyDict_New();
    PyDict_SetItem(dict, SWIG_This(), swig_this);
    inst = PyInstance_NewRaw(data->newargs, dict);
    Py_DECREF(dict);
#endif
  }
  return inst;
#else
#if (PY_VERSION_HEX >= 0x02010000)
  PyObject *inst;
  PyObject *dict = PyDict_New();
  PyDict_SetItem(dict, SWIG_This(), swig_this);
  inst = PyInstance_NewRaw(data->newargs, dict);
  Py_DECREF(dict);
  return (PyObject *) inst;
#else
  PyInstanceObject *inst = PyObject_NEW(PyInstanceObject, &PyInstance_Type);
  if (inst == NULL) {
    return NULL;
  }
  inst->in_class = (PyClassObject *)data->newargs;
  Py_INCREF(inst->in_class);
  inst->in_dict = PyDict_New();
  if (inst->in_dict == NULL) {
    Py_DECREF(inst);
    return NULL;
  }
#ifdef Py_TPFLAGS_HAVE_WEAKREFS
  inst->in_weakreflist = NULL;
#endif
#ifdef Py_TPFLAGS_GC
  PyObject_GC_Init(inst);
#endif
  PyDict_SetItem(inst->in_dict, SWIG_This(), swig_this);
  return (PyObject *) inst;
#endif
#endif
}

SWIGRUNTIME void
SWIG_Python_SetSwigThis(PyObject *inst, PyObject *swig_this)
{
 PyObject *dict;
#if (PY_VERSION_HEX >= 0x02020000) && !defined(SWIG_PYTHON_SLOW_GETSET_THIS)
 PyObject **dictptr = _PyObject_GetDictPtr(inst);
 if (dictptr != NULL) {
   dict = *dictptr;
   if (dict == NULL) {
     dict = PyDict_New();
     *dictptr = dict;
   }
   PyDict_SetItem(dict, SWIG_This(), swig_this);
   return;
 }
#endif
 dict = PyObject_GetAttrString(inst, (char*)"__dict__");
 PyDict_SetItem(dict, SWIG_This(), swig_this);
 Py_DECREF(dict);
} 


SWIGINTERN PyObject *
SWIG_Python_InitShadowInstance(PyObject *args) {
  PyObject *obj[2];
  if (!SWIG_Python_UnpackTuple(args,(char*)"swiginit", 2, 2, obj)) {
    return NULL;
  } else {
    SwigPyObject *sthis = SWIG_Python_GetSwigThis(obj[0]);
    if (sthis) {
      SwigPyObject_append((PyObject*) sthis, obj[1]);
    } else {
      SWIG_Python_SetSwigThis(obj[0], obj[1]);
    }
    return SWIG_Py_Void();
  }
}

/* Create a new pointer object */

SWIGRUNTIME PyObject *
SWIG_Python_NewPointerObj(void *ptr, swig_type_info *type, int flags) {
  if (!ptr) {
    return SWIG_Py_Void();
  } else {
    int own = (flags & SWIG_POINTER_OWN) ? SWIG_POINTER_OWN : 0;
    PyObject *robj = SwigPyObject_New(ptr, type, own);
    SwigPyClientData *clientdata = type ? (SwigPyClientData *)(type->clientdata) : 0;
    if (clientdata && !(flags & SWIG_POINTER_NOSHADOW)) {
      PyObject *inst = SWIG_Python_NewShadowInstance(clientdata, robj);
      if (inst) {
	Py_DECREF(robj);
	robj = inst;
      }
    }
    return robj;
  }
}

/* Create a new packed object */

SWIGRUNTIMEINLINE PyObject *
SWIG_Python_NewPackedObj(void *ptr, size_t sz, swig_type_info *type) {
  return ptr ? SwigPyPacked_New((void *) ptr, sz, type) : SWIG_Py_Void();
}

/* -----------------------------------------------------------------------------*
 *  Get type list 
 * -----------------------------------------------------------------------------*/

#if PY_VERSION_HEX >= 0x03030000
#define _SWIG_PYTHON_CAPSULE_NAME (char *) "swig_runtime_data" SWIG_RUNTIME_VERSION ".type_pointer_capsule" SWIG_TYPE_TABLE_NAME
#endif

#ifdef SWIG_LINK_RUNTIME
void *SWIG_ReturnGlobalTypeList(void *);
#endif

SWIGRUNTIME swig_module_info *
SWIG_Python_GetModule(void) {
  static void *type_pointer = (void *)0;
  /* first check if module already created */
  if (!type_pointer) {
#ifdef SWIG_LINK_RUNTIME
    type_pointer = SWIG_ReturnGlobalTypeList((void *)0);
#else
# if PY_VERSION_HEX >= 0x03030000
    type_pointer = PyCapsule_Import(_SWIG_PYTHON_CAPSULE_NAME, 0);
# else
    type_pointer = PyCObject_Import((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION,
				    (char*)"type_pointer" SWIG_TYPE_TABLE_NAME);
#endif
    if (PyErr_Occurred()) {
      PyErr_Clear();
      type_pointer = (void *)0;
    }
#endif
  }
  return (swig_module_info *) type_pointer;
}

#if PY_MAJOR_VERSION < 2
/* PyModule_AddObject function was introduced in Python 2.0.  The following function
   is copied out of Python/modsupport.c in python version 2.3.4 */
SWIGINTERN int
PyModule_AddObject(PyObject *m, char *name, PyObject *o)
{
  PyObject *dict;
  if (!PyModule_Check(m)) {
    PyErr_SetString(PyExc_TypeError,
		    "PyModule_AddObject() needs module as first arg");
    return SWIG_ERROR;
  }
  if (!o) {
    PyErr_SetString(PyExc_TypeError,
		    "PyModule_AddObject() needs non-NULL value");
    return SWIG_ERROR;
  }
  
  dict = PyModule_GetDict(m);
  if (dict == NULL) {
    /* Internal error -- modules must have a dict! */
    PyErr_Format(PyExc_SystemError, "module '%s' has no __dict__",
		 PyModule_GetName(m));
    return SWIG_ERROR;
  }
  if (PyDict_SetItemString(dict, name, o))
    return SWIG_ERROR;
  Py_DECREF(o);
  return SWIG_OK;
}
#endif

SWIGRUNTIME void
#if PY_VERSION_HEX >= 0x03030000
SWIG_Python_DestroyModule(PyObject *obj)
#else
SWIG_Python_DestroyModule(void *vptr)
#endif
{
#if PY_VERSION_HEX >= 0x03030000
  swig_module_info *swig_module = (swig_module_info *) PyCapsule_GetPointer(obj, _SWIG_PYTHON_CAPSULE_NAME);
#else
  swig_module_info *swig_module = (swig_module_info *) vptr;
#endif
  swig_type_info **types = swig_module->types;
  size_t i;
  for (i =0; i < swig_module->size; ++i) {
    swig_type_info *ty = types[i];
    if (ty->owndata) {
      SwigPyClientData *data = (SwigPyClientData *) ty->clientdata;
      if (data) SwigPyClientData_Del(data);
    }
  }
  Py_DECREF(SWIG_This());
}

SWIGRUNTIME void
SWIG_Python_SetModule(swig_module_info *swig_module) {
  static PyMethodDef swig_empty_runtime_method_table[] = { {NULL, NULL, 0, NULL} };/* Sentinel */

#if PY_VERSION_HEX >= 0x03000000
 /* Add a dummy module object into sys.modules */
  PyObject *module = PyImport_AddModule((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION);
#else
  PyObject *module = Py_InitModule((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION,
				   swig_empty_runtime_method_table);
#endif
#if PY_VERSION_HEX >= 0x03030000
  PyObject *pointer = PyCapsule_New((void *) swig_module, _SWIG_PYTHON_CAPSULE_NAME, SWIG_Python_DestroyModule);
#else
  PyObject *pointer = PyCObject_FromVoidPtr((void *) swig_module, SWIG_Python_DestroyModule);
#endif
  if (pointer && module) {
#if PY_VERSION_HEX >= 0x03030000
    PyModule_AddObject(module, (char *)"type_pointer_capsule" SWIG_TYPE_TABLE_NAME, pointer);
#else
    PyModule_AddObject(module, (char*)"type_pointer" SWIG_TYPE_TABLE_NAME, pointer);
#endif
  } else {
    Py_XDECREF(pointer);
  }
}

/* The python cached type query */
SWIGRUNTIME PyObject *
SWIG_Python_TypeCache(void) {
  static PyObject *SWIG_STATIC_POINTER(cache) = PyDict_New();
  return cache;
}

SWIGRUNTIME swig_type_info *
SWIG_Python_TypeQuery(const char *type)
{
  PyObject *cache = SWIG_Python_TypeCache();
  PyObject *key = SWIG_Python_str_FromChar(type); 
  PyObject *obj = PyDict_GetItem(cache, key);
  swig_type_info *descriptor;
  if (obj) {
#if PY_VERSION_HEX >= 0x03030000
    descriptor = (swig_type_info *) PyCapsule_GetPointer(obj, NULL);
#else
    descriptor = (swig_type_info *) PyCObject_AsVoidPtr(obj);
#endif
  } else {
    swig_module_info *swig_module = SWIG_Python_GetModule();
    descriptor = SWIG_TypeQueryModule(swig_module, swig_module, type);
    if (descriptor) {
#if PY_VERSION_HEX >= 0x03030000
      obj = PyCapsule_New((void *) descriptor, NULL, NULL);
#else
      obj = PyCObject_FromVoidPtr(descriptor, NULL);
#endif
      PyDict_SetItem(cache, key, obj);
      Py_DECREF(obj);
    }
  }
  Py_DECREF(key);
  return descriptor;
}

/* 
   For backward compatibility only
*/
#define SWIG_POINTER_EXCEPTION  0
#define SWIG_arg_fail(arg)      SWIG_Python_ArgFail(arg)
#define SWIG_MustGetPtr(p, type, argnum, flags)  SWIG_Python_MustGetPtr(p, type, argnum, flags)

SWIGRUNTIME int
SWIG_Python_AddErrMesg(const char* mesg, int infront)
{  
  if (PyErr_Occurred()) {
    PyObject *type = 0;
    PyObject *value = 0;
    PyObject *traceback = 0;
    PyErr_Fetch(&type, &value, &traceback);
    if (value) {
      char *tmp;
      PyObject *old_str = PyObject_Str(value);
      Py_XINCREF(type);
      PyErr_Clear();
      if (infront) {
	PyErr_Format(type, "%s %s", mesg, tmp = SWIG_Python_str_AsChar(old_str));
      } else {
	PyErr_Format(type, "%s %s", tmp = SWIG_Python_str_AsChar(old_str), mesg);
      }
      SWIG_Python_str_DelForPy3(tmp);
      Py_DECREF(old_str);
    }
    return 1;
  } else {
    return 0;
  }
}
  
SWIGRUNTIME int
SWIG_Python_ArgFail(int argnum)
{
  if (PyErr_Occurred()) {
    /* add information about failing argument */
    char mesg[256];
    PyOS_snprintf(mesg, sizeof(mesg), "argument number %d:", argnum);
    return SWIG_Python_AddErrMesg(mesg, 1);
  } else {
    return 0;
  }
}

SWIGRUNTIMEINLINE const char *
SwigPyObject_GetDesc(PyObject *self)
{
  SwigPyObject *v = (SwigPyObject *)self;
  swig_type_info *ty = v ? v->ty : 0;
  return ty ? ty->str : (char*)"";
}

SWIGRUNTIME void
SWIG_Python_TypeError(const char *type, PyObject *obj)
{
  if (type) {
#if defined(SWIG_COBJECT_TYPES)
    if (obj && SwigPyObject_Check(obj)) {
      const char *otype = (const char *) SwigPyObject_GetDesc(obj);
      if (otype) {
	PyErr_Format(PyExc_TypeError, "a '%s' is expected, 'SwigPyObject(%s)' is received",
		     type, otype);
	return;
      }
    } else 
#endif      
    {
      const char *otype = (obj ? obj->ob_type->tp_name : 0); 
      if (otype) {
	PyObject *str = PyObject_Str(obj);
	const char *cstr = str ? SWIG_Python_str_AsChar(str) : 0;
	if (cstr) {
	  PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s(%s)' is received",
		       type, otype, cstr);
          SWIG_Python_str_DelForPy3(cstr);
	} else {
	  PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s' is received",
		       type, otype);
	}
	Py_XDECREF(str);
	return;
      }
    }   
    PyErr_Format(PyExc_TypeError, "a '%s' is expected", type);
  } else {
    PyErr_Format(PyExc_TypeError, "unexpected type is received");
  }
}


/* Convert a pointer value, signal an exception on a type mismatch */
SWIGRUNTIME void *
SWIG_Python_MustGetPtr(PyObject *obj, swig_type_info *ty, int argnum, int flags) {
  void *result;
  if (SWIG_Python_ConvertPtr(obj, &result, ty, flags) == -1) {
    PyErr_Clear();
#if SWIG_POINTER_EXCEPTION
    if (flags) {
      SWIG_Python_TypeError(SWIG_TypePrettyName(ty), obj);
      SWIG_Python_ArgFail(argnum);
    }
#endif
  }
  return result;
}


#ifdef __cplusplus
#if 0
{ /* cc-mode */
#endif
}
#endif



#define SWIG_exception_fail(code, msg) do { SWIG_Error(code, msg); SWIG_fail; } while(0) 

#define SWIG_contract_assert(expr, msg) if (!(expr)) { SWIG_Error(SWIG_RuntimeError, msg); SWIG_fail; } else 



// Forward declaration to be inserted at the start of LLDBWrapPython.h
#include "lldb/API/SBDebugger.h"
#include "lldb/API/SBValue.h"

SWIGEXPORT lldb::ValueObjectSP
LLDBSWIGPython_GetValueObjectSPFromSBValue (void* data)
{
    lldb::ValueObjectSP valobj_sp;
    if (data)
    {
        lldb::SBValue* sb_ptr = (lldb::SBValue *)data;
        valobj_sp = sb_ptr->GetSP();
    }
    return valobj_sp;
}

#ifdef __cplusplus
extern "C" {
#endif

void LLDBSwigPythonCallPythonLogOutputCallback(const char *str, void *baton);

#ifdef __cplusplus
}
#endif


/* -------- TYPES TABLE (BEGIN) -------- */

#define SWIGTYPE_p_FILE swig_types[0]
#define SWIGTYPE_p_bool swig_types[1]
#define SWIGTYPE_p_char swig_types[2]
#define SWIGTYPE_p_double swig_types[3]
#define SWIGTYPE_p_f_p_void__p_void swig_types[4]
#define SWIGTYPE_p_f_p_void_p_q_const__void_size_t__void swig_types[5]
#define SWIGTYPE_p_int swig_types[6]
#define SWIGTYPE_p_lldb__ConnectionStatus swig_types[7]
#define SWIGTYPE_p_lldb__SBAddress swig_types[8]
#define SWIGTYPE_p_lldb__SBAttachInfo swig_types[9]
#define SWIGTYPE_p_lldb__SBBlock swig_types[10]
#define SWIGTYPE_p_lldb__SBBreakpoint swig_types[11]
#define SWIGTYPE_p_lldb__SBBreakpointList swig_types[12]
#define SWIGTYPE_p_lldb__SBBreakpointLocation swig_types[13]
#define SWIGTYPE_p_lldb__SBBreakpointName swig_types[14]
#define SWIGTYPE_p_lldb__SBBroadcaster swig_types[15]
#define SWIGTYPE_p_lldb__SBCommandInterpreter swig_types[16]
#define SWIGTYPE_p_lldb__SBCommandInterpreterRunOptions swig_types[17]
#define SWIGTYPE_p_lldb__SBCommandReturnObject swig_types[18]
#define SWIGTYPE_p_lldb__SBCommunication swig_types[19]
#define SWIGTYPE_p_lldb__SBCompileUnit swig_types[20]
#define SWIGTYPE_p_lldb__SBData swig_types[21]
#define SWIGTYPE_p_lldb__SBDebugger swig_types[22]
#define SWIGTYPE_p_lldb__SBDeclaration swig_types[23]
#define SWIGTYPE_p_lldb__SBError swig_types[24]
#define SWIGTYPE_p_lldb__SBEvent swig_types[25]
#define SWIGTYPE_p_lldb__SBExecutionContext swig_types[26]
#define SWIGTYPE_p_lldb__SBExpressionOptions swig_types[27]
#define SWIGTYPE_p_lldb__SBFileSpec swig_types[28]
#define SWIGTYPE_p_lldb__SBFileSpecList swig_types[29]
#define SWIGTYPE_p_lldb__SBFrame swig_types[30]
#define SWIGTYPE_p_lldb__SBFunction swig_types[31]
#define SWIGTYPE_p_lldb__SBHostOS swig_types[32]
#define SWIGTYPE_p_lldb__SBInstruction swig_types[33]
#define SWIGTYPE_p_lldb__SBInstructionList swig_types[34]
#define SWIGTYPE_p_lldb__SBLanguageRuntime swig_types[35]
#define SWIGTYPE_p_lldb__SBLaunchInfo swig_types[36]
#define SWIGTYPE_p_lldb__SBLineEntry swig_types[37]
#define SWIGTYPE_p_lldb__SBListener swig_types[38]
#define SWIGTYPE_p_lldb__SBMemoryRegionInfo swig_types[39]
#define SWIGTYPE_p_lldb__SBMemoryRegionInfoList swig_types[40]
#define SWIGTYPE_p_lldb__SBModule swig_types[41]
#define SWIGTYPE_p_lldb__SBModuleSpec swig_types[42]
#define SWIGTYPE_p_lldb__SBModuleSpecList swig_types[43]
#define SWIGTYPE_p_lldb__SBPlatform swig_types[44]
#define SWIGTYPE_p_lldb__SBPlatformConnectOptions swig_types[45]
#define SWIGTYPE_p_lldb__SBPlatformShellCommand swig_types[46]
#define SWIGTYPE_p_lldb__SBProcess swig_types[47]
#define SWIGTYPE_p_lldb__SBProcessInfo swig_types[48]
#define SWIGTYPE_p_lldb__SBQueue swig_types[49]
#define SWIGTYPE_p_lldb__SBQueueItem swig_types[50]
#define SWIGTYPE_p_lldb__SBSection swig_types[51]
#define SWIGTYPE_p_lldb__SBSourceManager swig_types[52]
#define SWIGTYPE_p_lldb__SBStream swig_types[53]
#define SWIGTYPE_p_lldb__SBStringList swig_types[54]
#define SWIGTYPE_p_lldb__SBStructuredData swig_types[55]
#define SWIGTYPE_p_lldb__SBSymbol swig_types[56]
#define SWIGTYPE_p_lldb__SBSymbolContext swig_types[57]
#define SWIGTYPE_p_lldb__SBSymbolContextList swig_types[58]
#define SWIGTYPE_p_lldb__SBTarget swig_types[59]
#define SWIGTYPE_p_lldb__SBThread swig_types[60]
#define SWIGTYPE_p_lldb__SBThreadCollection swig_types[61]
#define SWIGTYPE_p_lldb__SBThreadPlan swig_types[62]
#define SWIGTYPE_p_lldb__SBTrace swig_types[63]
#define SWIGTYPE_p_lldb__SBTraceOptions swig_types[64]
#define SWIGTYPE_p_lldb__SBType swig_types[65]
#define SWIGTYPE_p_lldb__SBTypeCategory swig_types[66]
#define SWIGTYPE_p_lldb__SBTypeEnumMember swig_types[67]
#define SWIGTYPE_p_lldb__SBTypeEnumMemberList swig_types[68]
#define SWIGTYPE_p_lldb__SBTypeFilter swig_types[69]
#define SWIGTYPE_p_lldb__SBTypeFormat swig_types[70]
#define SWIGTYPE_p_lldb__SBTypeList swig_types[71]
#define SWIGTYPE_p_lldb__SBTypeMember swig_types[72]
#define SWIGTYPE_p_lldb__SBTypeMemberFunction swig_types[73]
#define SWIGTYPE_p_lldb__SBTypeNameSpecifier swig_types[74]
#define SWIGTYPE_p_lldb__SBTypeSummary swig_types[75]
#define SWIGTYPE_p_lldb__SBTypeSummaryOptions swig_types[76]
#define SWIGTYPE_p_lldb__SBTypeSynthetic swig_types[77]
#define SWIGTYPE_p_lldb__SBUnixSignals swig_types[78]
#define SWIGTYPE_p_lldb__SBValue swig_types[79]
#define SWIGTYPE_p_lldb__SBValueList swig_types[80]
#define SWIGTYPE_p_lldb__SBVariablesOptions swig_types[81]
#define SWIGTYPE_p_lldb__SBWatchpoint swig_types[82]
#define SWIGTYPE_p_lldb_private__SharingPtrT_lldb_private__ValueObject_t swig_types[83]
#define SWIGTYPE_p_long_double swig_types[84]
#define SWIGTYPE_p_long_long swig_types[85]
#define SWIGTYPE_p_p_void swig_types[86]
#define SWIGTYPE_p_pthread_rwlock_t swig_types[87]
#define SWIGTYPE_p_pthread_t swig_types[88]
#define SWIGTYPE_p_short swig_types[89]
#define SWIGTYPE_p_signed_char swig_types[90]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__ABI_t swig_types[91]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__Baton_t swig_types[92]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__Block_t swig_types[93]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__BreakpointLocation_t swig_types[94]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__BreakpointResolver_t swig_types[95]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__BreakpointSite_t swig_types[96]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__Breakpoint_t swig_types[97]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__BroadcasterManager_t swig_types[98]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__Broadcaster_t swig_types[99]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__ClangASTImporter_t swig_types[100]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__CommandObject_t swig_types[101]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__Communication_t swig_types[102]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__CompileUnit_t swig_types[103]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__Connection_t swig_types[104]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__DataBuffer_t swig_types[105]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__DataExtractor_t swig_types[106]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__Debugger_t swig_types[107]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__Disassembler_t swig_types[108]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__DynamicLoader_t swig_types[109]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__EventDataStructuredData_t swig_types[110]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__EventData_t swig_types[111]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__Event_t swig_types[112]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__ExecutionContextRef_t swig_types[113]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__ExpressionVariable_t swig_types[114]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__File_t swig_types[115]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__FuncUnwinders_t swig_types[116]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__FunctionCaller_t swig_types[117]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__Function_t swig_types[118]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__IOHandler_t swig_types[119]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__IOObject_t swig_types[120]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__IRExecutionUnit_t swig_types[121]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__InlineFunctionInfo_t swig_types[122]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__Instruction_t swig_types[123]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__InstrumentationRuntime_t swig_types[124]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__JITLoader_t swig_types[125]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__LanguageRuntime_t swig_types[126]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__LineTable_t swig_types[127]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__Listener_t swig_types[128]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__MemoryHistory_t swig_types[129]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__MemoryRegionInfo_t swig_types[130]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__Module_t swig_types[131]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__ObjectFileJITDelegate_t swig_types[132]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__ObjectFile_t swig_types[133]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__OptionValueArch_t swig_types[134]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__OptionValueArgs_t swig_types[135]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__OptionValueArray_t swig_types[136]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__OptionValueBoolean_t swig_types[137]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__OptionValueDictionary_t swig_types[138]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__OptionValueFileSpecList_t swig_types[139]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__OptionValueFileSpec_t swig_types[140]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__OptionValueFormat_t swig_types[141]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__OptionValuePathMappings_t swig_types[142]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__OptionValueProperties_t swig_types[143]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__OptionValueRegex_t swig_types[144]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__OptionValueSInt64_t swig_types[145]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__OptionValueString_t swig_types[146]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__OptionValueUInt64_t swig_types[147]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__OptionValueUUID_t swig_types[148]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__OptionValue_t swig_types[149]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__Platform_t swig_types[150]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__ProcessAttachInfo_t swig_types[151]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__ProcessLaunchInfo_t swig_types[152]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__Process_t swig_types[153]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__Property_t swig_types[154]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__QueueItem_t swig_types[155]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__Queue_t swig_types[156]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__REPL_t swig_types[157]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__RegisterCheckpoint_t swig_types[158]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__RegisterContext_t swig_types[159]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__RegularExpression_t swig_types[160]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__ScriptInterpreter_t swig_types[161]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__ScriptSummaryFormat_t swig_types[162]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__ScriptedSyntheticChildren_t swig_types[163]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__SearchFilter_t swig_types[164]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__SectionLoadList_t swig_types[165]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__Section_t swig_types[166]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__Settings_t swig_types[167]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__StackFrameList_t swig_types[168]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__StackFrame_t swig_types[169]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__StopInfo_t swig_types[170]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__StoppointLocation_t swig_types[171]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__StreamFile_t swig_types[172]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__Stream_t swig_types[173]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__StringSummaryFormat_t swig_types[174]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__StructuredDataPlugin_t swig_types[175]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__SwiftASTContext_t swig_types[176]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__SymbolContextSpecifier_t swig_types[177]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__SymbolFileType_t swig_types[178]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__SymbolFile_t swig_types[179]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__SyntheticChildrenFrontEnd_t swig_types[180]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__SyntheticChildren_t swig_types[181]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__SystemRuntime_t swig_types[182]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__TargetProperties_t swig_types[183]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__Target_t swig_types[184]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__ThreadCollection_t swig_types[185]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__ThreadPlanTracer_t swig_types[186]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__ThreadPlan_t swig_types[187]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__Thread_t swig_types[188]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__TraceOptions_t swig_types[189]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__TypeCategoryImpl_t swig_types[190]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__TypeEnumMemberImpl_t swig_types[191]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__TypeFilterImpl_t swig_types[192]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__TypeFormatImpl_t swig_types[193]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__TypeImpl_t swig_types[194]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__TypeMemberFunctionImpl_t swig_types[195]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__TypeNameSpecifierImpl_t swig_types[196]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__TypeSummaryImpl_t swig_types[197]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__TypeSummaryOptions_t swig_types[198]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__TypeSystem_t swig_types[199]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__TypeValidatorImpl_t swig_types[200]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__Type_t swig_types[201]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__UnixSignals_t swig_types[202]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__UnwindAssembly_t swig_types[203]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__UnwindPlan_t swig_types[204]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__UserExpression_t swig_types[205]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__UtilityFunction_t swig_types[206]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__ValueList_t swig_types[207]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__ValueObjectList_t swig_types[208]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__Value_t swig_types[209]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__VariableList_t swig_types[210]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__Variable_t swig_types[211]
#define SWIGTYPE_p_std__shared_ptrT_lldb_private__Watchpoint_t swig_types[212]
#define SWIGTYPE_p_std__unique_ptrT_lldb_private__ClangASTContext_t swig_types[213]
#define SWIGTYPE_p_std__unique_ptrT_lldb_private__ClangModulesDeclVendor_t swig_types[214]
#define SWIGTYPE_p_std__unique_ptrT_lldb_private__ClangPersistentVariables_t swig_types[215]
#define SWIGTYPE_p_std__unique_ptrT_lldb_private__DynamicCheckerFunctions_t swig_types[216]
#define SWIGTYPE_p_std__unique_ptrT_lldb_private__DynamicLoader_t swig_types[217]
#define SWIGTYPE_p_std__unique_ptrT_lldb_private__GoASTContext_t swig_types[218]
#define SWIGTYPE_p_std__unique_ptrT_lldb_private__JITLoaderList_t swig_types[219]
#define SWIGTYPE_p_std__unique_ptrT_lldb_private__MemoryRegionInfo_t swig_types[220]
#define SWIGTYPE_p_std__unique_ptrT_lldb_private__OperatingSystem_t swig_types[221]
#define SWIGTYPE_p_std__unique_ptrT_lldb_private__ScriptInterpreter_t swig_types[222]
#define SWIGTYPE_p_std__unique_ptrT_lldb_private__SectionList_t swig_types[223]
#define SWIGTYPE_p_std__unique_ptrT_lldb_private__SourceManager_t swig_types[224]
#define SWIGTYPE_p_std__unique_ptrT_lldb_private__StackFrame_t swig_types[225]
#define SWIGTYPE_p_std__unique_ptrT_lldb_private__StructuredDataImpl_t swig_types[226]
#define SWIGTYPE_p_std__unique_ptrT_lldb_private__SymbolVendor_t swig_types[227]
#define SWIGTYPE_p_std__unique_ptrT_lldb_private__SystemRuntime_t swig_types[228]
#define SWIGTYPE_p_std__weak_ptrT_lldb_private__BreakpointLocation_t swig_types[229]
#define SWIGTYPE_p_std__weak_ptrT_lldb_private__BreakpointSite_t swig_types[230]
#define SWIGTYPE_p_std__weak_ptrT_lldb_private__Breakpoint_t swig_types[231]
#define SWIGTYPE_p_std__weak_ptrT_lldb_private__BroadcasterManager_t swig_types[232]
#define SWIGTYPE_p_std__weak_ptrT_lldb_private__Debugger_t swig_types[233]
#define SWIGTYPE_p_std__weak_ptrT_lldb_private__Listener_t swig_types[234]
#define SWIGTYPE_p_std__weak_ptrT_lldb_private__Module_t swig_types[235]
#define SWIGTYPE_p_std__weak_ptrT_lldb_private__ObjectFileJITDelegate_t swig_types[236]
#define SWIGTYPE_p_std__weak_ptrT_lldb_private__ObjectFile_t swig_types[237]
#define SWIGTYPE_p_std__weak_ptrT_lldb_private__OptionValue_t swig_types[238]
#define SWIGTYPE_p_std__weak_ptrT_lldb_private__Process_t swig_types[239]
#define SWIGTYPE_p_std__weak_ptrT_lldb_private__Queue_t swig_types[240]
#define SWIGTYPE_p_std__weak_ptrT_lldb_private__Section_t swig_types[241]
#define SWIGTYPE_p_std__weak_ptrT_lldb_private__StackFrame_t swig_types[242]
#define SWIGTYPE_p_std__weak_ptrT_lldb_private__Stream_t swig_types[243]
#define SWIGTYPE_p_std__weak_ptrT_lldb_private__StructuredDataPlugin_t swig_types[244]
#define SWIGTYPE_p_std__weak_ptrT_lldb_private__SymbolFileType_t swig_types[245]
#define SWIGTYPE_p_std__weak_ptrT_lldb_private__Target_t swig_types[246]
#define SWIGTYPE_p_std__weak_ptrT_lldb_private__Thread_t swig_types[247]
#define SWIGTYPE_p_std__weak_ptrT_lldb_private__Type_t swig_types[248]
#define SWIGTYPE_p_std__weak_ptrT_lldb_private__UnixSignals_t swig_types[249]
#define SWIGTYPE_p_unsigned_char swig_types[250]
#define SWIGTYPE_p_unsigned_int swig_types[251]
#define SWIGTYPE_p_unsigned_long_long swig_types[252]
#define SWIGTYPE_p_unsigned_short swig_types[253]
#define SWIGTYPE_p_void swig_types[254]
static swig_type_info *swig_types[256];
static swig_module_info swig_module = {swig_types, 255, 0, 0, 0, 0};
#define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)
#define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)

/* -------- TYPES TABLE (END) -------- */

#if (PY_VERSION_HEX <= 0x02000000)
# if !defined(SWIG_PYTHON_CLASSIC)
#  error "This python version requires swig to be run with the '-classic' option"
# endif
#endif

/*-----------------------------------------------
              @(target):= _lldb.so
  ------------------------------------------------*/
#if PY_VERSION_HEX >= 0x03000000
#  define SWIG_init    PyInit__lldb

#else
#  define SWIG_init    init_lldb

#endif
#define SWIG_name    "_lldb"

#define SWIGVERSION 0x010340 
#define SWIG_VERSION SWIGVERSION


#define SWIG_as_voidptr(a) const_cast< void * >(static_cast< const void * >(a)) 
#define SWIG_as_voidptrptr(a) ((void)SWIG_as_voidptr(*a),reinterpret_cast< void** >(a)) 


#include <stdexcept>


namespace swig {
  class SwigPtr_PyObject {
  protected:
    PyObject *_obj;

  public:
    SwigPtr_PyObject() :_obj(0)
    {
    }

    SwigPtr_PyObject(const SwigPtr_PyObject& item) : _obj(item._obj)
    {
      Py_XINCREF(_obj);      
    }
    
    SwigPtr_PyObject(PyObject *obj, bool initial_ref = true) :_obj(obj)
    {
      if (initial_ref) {
        Py_XINCREF(_obj);
      }
    }
    
    SwigPtr_PyObject & operator=(const SwigPtr_PyObject& item) 
    {
      Py_XINCREF(item._obj);
      Py_XDECREF(_obj);
      _obj = item._obj;
      return *this;      
    }
    
    ~SwigPtr_PyObject() 
    {
      Py_XDECREF(_obj);
    }
    
    operator PyObject *() const
    {
      return _obj;
    }

    PyObject *operator->() const
    {
      return _obj;
    }
  };
}


namespace swig {
  struct SwigVar_PyObject : SwigPtr_PyObject {
    SwigVar_PyObject(PyObject* obj = 0) : SwigPtr_PyObject(obj, false) { }
    
    SwigVar_PyObject & operator = (PyObject* obj)
    {
      Py_XDECREF(_obj);
      _obj = obj;
      return *this;      
    }
  };
}


#include <algorithm>
#include <string>


#include "lldb/lldb-public.h"
#include "lldb/API/SBAddress.h"
#include "lldb/API/SBAttachInfo.h"
#include "lldb/API/SBBlock.h"
#include "lldb/API/SBBreakpoint.h"
#include "lldb/API/SBBreakpointLocation.h"
#include "lldb/API/SBBreakpointName.h"
#include "lldb/API/SBBroadcaster.h"
#include "lldb/API/SBCommandInterpreter.h"
#include "lldb/API/SBCommandReturnObject.h"
#include "lldb/API/SBCommunication.h"
#include "lldb/API/SBCompileUnit.h"
#include "lldb/API/SBData.h"
#include "lldb/API/SBDebugger.h"
#include "lldb/API/SBDeclaration.h"
#include "lldb/API/SBError.h"
#include "lldb/API/SBEvent.h"
#include "lldb/API/SBExecutionContext.h"
#include "lldb/API/SBExpressionOptions.h"
#include "lldb/API/SBFileSpec.h"
#include "lldb/API/SBFileSpecList.h"
#include "lldb/API/SBFrame.h"
#include "lldb/API/SBFunction.h"
#include "lldb/API/SBHostOS.h"
#include "lldb/API/SBInstruction.h"
#include "lldb/API/SBInstructionList.h"
#include "lldb/API/SBLanguageRuntime.h"
#include "lldb/API/SBLaunchInfo.h"
#include "lldb/API/SBLineEntry.h"
#include "lldb/API/SBListener.h"
#include "lldb/API/SBMemoryRegionInfo.h"
#include "lldb/API/SBMemoryRegionInfoList.h"
#include "lldb/API/SBModule.h"
#include "lldb/API/SBModuleSpec.h"
#include "lldb/API/SBPlatform.h"
#include "lldb/API/SBProcess.h"
#include "lldb/API/SBProcessInfo.h"
#include "lldb/API/SBQueue.h"
#include "lldb/API/SBQueueItem.h"
#include "lldb/API/SBSection.h"
#include "lldb/API/SBSourceManager.h"
#include "lldb/API/SBStream.h"
#include "lldb/API/SBStringList.h"
#include "lldb/API/SBStructuredData.h"
#include "lldb/API/SBSymbol.h"
#include "lldb/API/SBSymbolContext.h"
#include "lldb/API/SBSymbolContextList.h"
#include "lldb/API/SBTarget.h"
#include "lldb/API/SBThread.h"
#include "lldb/API/SBThreadCollection.h"
#include "lldb/API/SBThreadPlan.h"
#include "lldb/API/SBTrace.h"
#include "lldb/API/SBTraceOptions.h"
#include "lldb/API/SBType.h"
#include "lldb/API/SBTypeCategory.h"
#include "lldb/API/SBTypeEnumMember.h"
#include "lldb/API/SBTypeFilter.h"
#include "lldb/API/SBTypeFormat.h"
#include "lldb/API/SBTypeNameSpecifier.h"
#include "lldb/API/SBTypeSummary.h"
#include "lldb/API/SBTypeSynthetic.h"
#include "lldb/API/SBValue.h"
#include "lldb/API/SBValueList.h"
#include "lldb/API/SBVariablesOptions.h"
#include "lldb/API/SBWatchpoint.h"
#include "lldb/API/SBUnixSignals.h"

#include "../source/Plugins/ScriptInterpreter/Python/PythonDataObjects.h"

#include "../scripts/Python/python-swigsafecast.swig"


#include <stdint.h>		// Use the C99 official header


  #define SWIG_From_long   PyInt_FromLong 


SWIGINTERNINLINE PyObject *
SWIG_From_int  (int value)
{    
  return SWIG_From_long  (value);
}


SWIGINTERNINLINE PyObject* 
SWIG_From_unsigned_SS_long  (unsigned long value)
{
  return (value > LONG_MAX) ?
    PyLong_FromUnsignedLong(value) : PyInt_FromLong(static_cast< long >(value)); 
}


SWIGINTERNINLINE PyObject *
SWIG_From_unsigned_SS_int  (unsigned int value)
{    
  return SWIG_From_unsigned_SS_long  (value);
}


#include <limits.h>
#if !defined(SWIG_NO_LLONG_MAX)
# if !defined(LLONG_MAX) && defined(__GNUC__) && defined (__LONG_LONG_MAX__)
#   define LLONG_MAX __LONG_LONG_MAX__
#   define LLONG_MIN (-LLONG_MAX - 1LL)
#   define ULLONG_MAX (LLONG_MAX * 2ULL + 1ULL)
# endif
#endif


SWIGINTERNINLINE PyObject* 
SWIG_From_long_SS_long  (long long value)
{
  return ((value < LONG_MIN) || (value > LONG_MAX)) ?
    PyLong_FromLongLong(value) : PyInt_FromLong(static_cast< long >(value)); 
}


SWIGINTERNINLINE PyObject* 
SWIG_From_unsigned_SS_long_SS_long  (unsigned long long value)
{
  return (value > LONG_MAX) ?
    PyLong_FromUnsignedLongLong(value) : PyInt_FromLong(static_cast< long >(value)); 
}


SWIGINTERN swig_type_info*
SWIG_pchar_descriptor(void)
{
  static int init = 0;
  static swig_type_info* info = 0;
  if (!init) {
    info = SWIG_TypeQuery("_p_char");
    init = 1;
  }
  return info;
}


SWIGINTERNINLINE PyObject *
SWIG_FromCharPtrAndSize(const char* carray, size_t size)
{
  if (carray) {
    if (size > INT_MAX) {
      swig_type_info* pchar_descriptor = SWIG_pchar_descriptor();
      return pchar_descriptor ? 
	SWIG_NewPointerObj(const_cast< char * >(carray), pchar_descriptor, 0) : SWIG_Py_Void();
    } else {
#if PY_VERSION_HEX >= 0x03000000
      return PyUnicode_FromStringAndSize(carray, static_cast< int >(size));
#else
      return PyString_FromStringAndSize(carray, static_cast< int >(size));
#endif
    }
  } else {
    return SWIG_Py_Void();
  }
}


SWIGINTERNINLINE PyObject * 
SWIG_FromCharPtr(const char *cptr)
{ 
  return SWIG_FromCharPtrAndSize(cptr, (cptr ? strlen(cptr) : 0));
}


SWIGINTERN int
SWIG_AsVal_double (PyObject *obj, double *val)
{
  int res = SWIG_TypeError;
  if (PyFloat_Check(obj)) {
    if (val) *val = PyFloat_AsDouble(obj);
    return SWIG_OK;
  } else if (PyInt_Check(obj)) {
    if (val) *val = PyInt_AsLong(obj);
    return SWIG_OK;
  } else if (PyLong_Check(obj)) {
    double v = PyLong_AsDouble(obj);
    if (!PyErr_Occurred()) {
      if (val) *val = v;
      return SWIG_OK;
    } else {
      PyErr_Clear();
    }
  }
#ifdef SWIG_PYTHON_CAST_MODE
  {
    int dispatch = 0;
    double d = PyFloat_AsDouble(obj);
    if (!PyErr_Occurred()) {
      if (val) *val = d;
      return SWIG_AddCast(SWIG_OK);
    } else {
      PyErr_Clear();
    }
    if (!dispatch) {
      long v = PyLong_AsLong(obj);
      if (!PyErr_Occurred()) {
	if (val) *val = v;
	return SWIG_AddCast(SWIG_AddCast(SWIG_OK));
      } else {
	PyErr_Clear();
      }
    }
  }
#endif
  return res;
}


#include <float.h>


#include <math.h>


SWIGINTERNINLINE int
SWIG_CanCastAsInteger(double *d, double min, double max) {
  double x = *d;
  if ((min <= x && x <= max)) {
   double fx = floor(x);
   double cx = ceil(x);
   double rd =  ((x - fx) < 0.5) ? fx : cx; /* simple rint */
   if ((errno == EDOM) || (errno == ERANGE)) {
     errno = 0;
   } else {
     double summ, reps, diff;
     if (rd < x) {
       diff = x - rd;
     } else if (rd > x) {
       diff = rd - x;
     } else {
       return 1;
     }
     summ = rd + x;
     reps = diff/summ;
     if (reps < 8*DBL_EPSILON) {
       *d = rd;
       return 1;
     }
   }
  }
  return 0;
}


SWIGINTERN int
SWIG_AsVal_unsigned_SS_long (PyObject *obj, unsigned long *val) 
{
  if (PyInt_Check(obj)) {
    long v = PyInt_AsLong(obj);
    if (v >= 0) {
      if (val) *val = v;
      return SWIG_OK;
    } else {
      return SWIG_OverflowError;
    }
  } else if (PyLong_Check(obj)) {
    unsigned long v = PyLong_AsUnsignedLong(obj);
    if (!PyErr_Occurred()) {
      if (val) *val = v;
      return SWIG_OK;
    } else {
      PyErr_Clear();
    }
  }
#ifdef SWIG_PYTHON_CAST_MODE
  {
    int dispatch = 0;
    unsigned long v = PyLong_AsUnsignedLong(obj);
    if (!PyErr_Occurred()) {
      if (val) *val = v;
      return SWIG_AddCast(SWIG_OK);
    } else {
      PyErr_Clear();
    }
    if (!dispatch) {
      double d;
      int res = SWIG_AddCast(SWIG_AsVal_double (obj,&d));
      if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, 0, ULONG_MAX)) {
	if (val) *val = (unsigned long)(d);
	return res;
      }
    }
  }
#endif
  return SWIG_TypeError;
}


SWIGINTERN int
SWIG_AsVal_unsigned_SS_long_SS_long (PyObject *obj, unsigned long long *val)
{
  int res = SWIG_TypeError;
  if (PyLong_Check(obj)) {
    unsigned long long v = PyLong_AsUnsignedLongLong(obj);
    if (!PyErr_Occurred()) {
      if (val) *val = v;
      return SWIG_OK;
    } else {
      PyErr_Clear();
    }
  } else {
    unsigned long v;
    res = SWIG_AsVal_unsigned_SS_long (obj,&v);
    if (SWIG_IsOK(res)) {
      if (val) *val = v;
      return res;
    }
  }
#ifdef SWIG_PYTHON_CAST_MODE
  {
    const double mant_max = 1LL << DBL_MANT_DIG;
    double d;
    res = SWIG_AsVal_double (obj,&d);
    if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, 0, mant_max)) {
      if (val) *val = (unsigned long long)(d);
      return SWIG_AddCast(res);
    }
    res = SWIG_TypeError;
  }
#endif
  return res;
}


SWIGINTERNINLINE PyObject*
  SWIG_From_bool  (bool value)
{
  return PyBool_FromLong(value ? 1 : 0);
}


SWIGINTERN int
SWIG_AsVal_unsigned_SS_int (PyObject * obj, unsigned int *val)
{
  unsigned long v;
  int res = SWIG_AsVal_unsigned_SS_long (obj, &v);
  if (SWIG_IsOK(res)) {
    if ((v > UINT_MAX)) {
      return SWIG_OverflowError;
    } else {
      if (val) *val = static_cast< unsigned int >(v);
    }
  }  
  return res;
}

SWIGINTERN PyObject *lldb_SBAddress___str__(lldb::SBAddress *self){
                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();
        }

SWIGINTERN int
SWIG_AsCharPtrAndSize(PyObject *obj, char** cptr, size_t* psize, int *alloc)
{
#if PY_VERSION_HEX>=0x03000000
  if (PyUnicode_Check(obj))
#else  
  if (PyString_Check(obj))
#endif
  {
    char *cstr; Py_ssize_t len;
#if PY_VERSION_HEX>=0x03000000
    if (!alloc && cptr) {
        /* We can't allow converting without allocation, since the internal
           representation of string in Python 3 is UCS-2/UCS-4 but we require
           a UTF-8 representation.
           TODO(bhy) More detailed explanation */
        return SWIG_RuntimeError;
    }
    obj = PyUnicode_AsUTF8String(obj);
    PyBytes_AsStringAndSize(obj, &cstr, &len);
    if(alloc) *alloc = SWIG_NEWOBJ;
#else
    PyString_AsStringAndSize(obj, &cstr, &len);
#endif
    if (cptr) {
      if (alloc) {
	/* 
	   In python the user should not be able to modify the inner
	   string representation. To warranty that, if you define
	   SWIG_PYTHON_SAFE_CSTRINGS, a new/copy of the python string
	   buffer is always returned.

	   The default behavior is just to return the pointer value,
	   so, be careful.
	*/ 
#if defined(SWIG_PYTHON_SAFE_CSTRINGS)
	if (*alloc != SWIG_OLDOBJ) 
#else
	if (*alloc == SWIG_NEWOBJ) 
#endif
	  {
	    *cptr = reinterpret_cast< char* >(memcpy((new char[len + 1]), cstr, sizeof(char)*(len + 1)));
	    *alloc = SWIG_NEWOBJ;
	  }
	else {
	  *cptr = cstr;
	  *alloc = SWIG_OLDOBJ;
	}
      } else {
        #if PY_VERSION_HEX>=0x03000000
        assert(0); /* Should never reach here in Python 3 */
        #endif
	*cptr = SWIG_Python_str_AsChar(obj);
      }
    }
    if (psize) *psize = len + 1;
#if PY_VERSION_HEX>=0x03000000
    Py_XDECREF(obj);
#endif
    return SWIG_OK;
  } else {
    swig_type_info* pchar_descriptor = SWIG_pchar_descriptor();
    if (pchar_descriptor) {
      void* vptr = 0;
      if (SWIG_ConvertPtr(obj, &vptr, pchar_descriptor, 0) == SWIG_OK) {
	if (cptr) *cptr = (char *) vptr;
	if (psize) *psize = vptr ? (strlen((char *)vptr) + 1) : 0;
	if (alloc) *alloc = SWIG_OLDOBJ;
	return SWIG_OK;
      }
    }
  }
  return SWIG_TypeError;
}





SWIGINTERN int
SWIG_AsVal_long (PyObject *obj, long* val)
{
  if (PyInt_Check(obj)) {
    if (val) *val = PyInt_AsLong(obj);
    return SWIG_OK;
  } else if (PyLong_Check(obj)) {
    long v = PyLong_AsLong(obj);
    if (!PyErr_Occurred()) {
      if (val) *val = v;
      return SWIG_OK;
    } else {
      PyErr_Clear();
    }
  }
#ifdef SWIG_PYTHON_CAST_MODE
  {
    int dispatch = 0;
    long v = PyInt_AsLong(obj);
    if (!PyErr_Occurred()) {
      if (val) *val = v;
      return SWIG_AddCast(SWIG_OK);
    } else {
      PyErr_Clear();
    }
    if (!dispatch) {
      double d;
      int res = SWIG_AddCast(SWIG_AsVal_double (obj,&d));
      if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, LONG_MIN, LONG_MAX)) {
	if (val) *val = (long)(d);
	return res;
      }
    }
  }
#endif
  return SWIG_TypeError;
}


SWIGINTERN int
SWIG_AsVal_bool (PyObject *obj, bool *val)
{
  int r = PyObject_IsTrue(obj);
  if (r == -1)
    return SWIG_ERROR;
  if (val) *val = r ? true : false;
  return SWIG_OK;
}


SWIGINTERN int
SWIG_AsVal_int (PyObject * obj, int *val)
{
  long v;
  int res = SWIG_AsVal_long (obj, &v);
  if (SWIG_IsOK(res)) {
    if ((v < INT_MIN || v > INT_MAX)) {
      return SWIG_OverflowError;
    } else {
      if (val) *val = static_cast< int >(v);
    }
  }  
  return res;
}

SWIGINTERN PyObject *lldb_SBBlock___str__(lldb::SBBlock *self){
                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();
        }

SWIGINTERNINLINE PyObject *
SWIG_From_size_t  (size_t value)
{    
  return SWIG_From_unsigned_SS_long  (static_cast< unsigned long >(value));
}

SWIGINTERN PyObject *lldb_SBBreakpoint___str__(lldb::SBBreakpoint *self){
                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();
        }

SWIGINTERNINLINE int
SWIG_AsVal_size_t (PyObject * obj, size_t *val)
{
  unsigned long v;
  int res = SWIG_AsVal_unsigned_SS_long (obj, val ? &v : 0);
  if (SWIG_IsOK(res) && val) *val = static_cast< size_t >(v);
  return res;
}

SWIGINTERN PyObject *lldb_SBBreakpointLocation___str__(lldb::SBBreakpointLocation *self){
                lldb::SBStream description;
                self->GetDescription (description, lldb::eDescriptionLevelFull);
                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();
        }
SWIGINTERN PyObject *lldb_SBBreakpointName___str__(lldb::SBBreakpointName *self){
                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();
        }

SWIGINTERN int
SWIG_AsCharArray(PyObject * obj, char *val, size_t size)
{ 
  char* cptr = 0; size_t csize = 0; int alloc = SWIG_OLDOBJ;
  int res = SWIG_AsCharPtrAndSize(obj, &cptr, &csize, &alloc);
  if (SWIG_IsOK(res)) {
    if ((csize == size + 1) && cptr && !(cptr[csize-1])) --csize;
    if (csize <= size) {
      if (val) {
	if (csize) memcpy(val, cptr, csize*sizeof(char));
	if (csize < size) memset(val + csize, 0, (size - csize)*sizeof(char));
      }
      if (alloc == SWIG_NEWOBJ) {
	delete[] cptr;
	res = SWIG_DelNewMask(res);
      }      
      return res;
    }
    if (alloc == SWIG_NEWOBJ) delete[] cptr;
  }
  return SWIG_TypeError;
}


SWIGINTERN int
SWIG_AsVal_char (PyObject * obj, char *val)
{    
  int res = SWIG_AsCharArray(obj, val, 1);
  if (!SWIG_IsOK(res)) {
    long v;
    res = SWIG_AddCast(SWIG_AsVal_long (obj, &v));
    if (SWIG_IsOK(res)) {
      if ((CHAR_MIN <= v) && (v <= CHAR_MAX)) {
	if (val) *val = static_cast< char >(v);
      } else {
	res = SWIG_OverflowError;
      }
    }
  }
  return res;
}

SWIGINTERN void lldb_SBCommandReturnObject_SetImmediateOutputFile(lldb::SBCommandReturnObject *self,FILE *fh){
            self->SetImmediateOutputFile(fh, true);
        }
SWIGINTERN void lldb_SBCommandReturnObject_SetImmediateErrorFile(lldb::SBCommandReturnObject *self,FILE *fh){
            self->SetImmediateErrorFile(fh, true);
        }
SWIGINTERN void lldb_SBCommandReturnObject_Print(lldb::SBCommandReturnObject *self,char const *str){
            self->Printf("%s", str);
        }
SWIGINTERN PyObject *lldb_SBCommandReturnObject___str__(lldb::SBCommandReturnObject *self){
                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();
        }
SWIGINTERN void lldb_SBCommandReturnObject_write(lldb::SBCommandReturnObject *self,char const *str){
            if (str)
                self->Printf("%s",str);
        }
SWIGINTERN void lldb_SBCommandReturnObject_flush(lldb::SBCommandReturnObject *self){}
SWIGINTERN PyObject *lldb_SBCompileUnit___str__(lldb::SBCompileUnit *self){
                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();
        }

SWIGINTERNINLINE PyObject *
SWIG_From_unsigned_SS_char  (unsigned char value)
{    
  return SWIG_From_unsigned_SS_long  (value);
}


SWIGINTERN int
SWIG_AsVal_unsigned_SS_char (PyObject * obj, unsigned char *val)
{
  unsigned long v;
  int res = SWIG_AsVal_unsigned_SS_long (obj, &v);
  if (SWIG_IsOK(res)) {
    if ((v > UCHAR_MAX)) {
      return SWIG_OverflowError;
    } else {
      if (val) *val = static_cast< unsigned char >(v);
    }
  }  
  return res;
}


  #define SWIG_From_double   PyFloat_FromDouble 


SWIGINTERNINLINE PyObject *
SWIG_From_float  (float value)
{    
  return SWIG_From_double  (value);
}


SWIGINTERNINLINE PyObject *
SWIG_From_unsigned_SS_short  (unsigned short value)
{    
  return SWIG_From_unsigned_SS_long  (value);
}


SWIGINTERNINLINE PyObject *
SWIG_From_signed_SS_char  (signed char value)
{    
  return SWIG_From_long  (value);
}


SWIGINTERNINLINE PyObject *
SWIG_From_short  (short value)
{    
  return SWIG_From_long  (value);
}

SWIGINTERN PyObject *lldb_SBData___str__(lldb::SBData *self){
                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();
        }
SWIGINTERN PyObject *lldb_SBDebugger___str__(lldb::SBDebugger *self){
                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();
        }
SWIGINTERN PyObject *lldb_SBDeclaration___str__(lldb::SBDeclaration *self){
                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();
        }
SWIGINTERN PyObject *lldb_SBError___str__(lldb::SBError *self){
                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();
        }
SWIGINTERN PyObject *lldb_SBFileSpec___str__(lldb::SBFileSpec *self){
                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();
        }
SWIGINTERN PyObject *lldb_SBFrame___str__(lldb::SBFrame *self){
                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();
        }
SWIGINTERN PyObject *lldb_SBFunction___str__(lldb::SBFunction *self){
                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();
        }
SWIGINTERN PyObject *lldb_SBInstruction___str__(lldb::SBInstruction *self){
                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();
        }
SWIGINTERN PyObject *lldb_SBInstructionList___str__(lldb::SBInstructionList *self){
                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();
        }
SWIGINTERN PyObject *lldb_SBLineEntry___str__(lldb::SBLineEntry *self){
                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();
        }
SWIGINTERN PyObject *lldb_SBMemoryRegionInfo___str__(lldb::SBMemoryRegionInfo *self){
                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();
        }
SWIGINTERN PyObject *lldb_SBModule___str__(lldb::SBModule *self){
                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();
        }
SWIGINTERN PyObject *lldb_SBModuleSpec___str__(lldb::SBModuleSpec *self){
                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();
        }
SWIGINTERN PyObject *lldb_SBModuleSpecList___str__(lldb::SBModuleSpecList *self){
                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();
        }
SWIGINTERN PyObject *lldb_SBProcess___str__(lldb::SBProcess *self){
                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();
        }
SWIGINTERN PyObject *lldb_SBSection___str__(lldb::SBSection *self){
                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();
        }
SWIGINTERN void lldb_SBStream_Print(lldb::SBStream *self,char const *str){
            self->Printf("%s", str);
        }
SWIGINTERN void lldb_SBStream_write(lldb::SBStream *self,char const *str){
            if (str)
                self->Printf("%s",str);
        }
SWIGINTERN void lldb_SBStream_flush(lldb::SBStream *self){}
SWIGINTERN PyObject *lldb_SBSymbol___str__(lldb::SBSymbol *self){
                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();
        }
SWIGINTERN PyObject *lldb_SBSymbolContext___str__(lldb::SBSymbolContext *self){
                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();
        }
SWIGINTERN PyObject *lldb_SBSymbolContextList___str__(lldb::SBSymbolContextList *self){
                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();
        }

SWIGINTERN int
SWIG_AsVal_long_SS_long (PyObject *obj, long long *val)
{
  int res = SWIG_TypeError;
  if (PyLong_Check(obj)) {
    long long v = PyLong_AsLongLong(obj);
    if (!PyErr_Occurred()) {
      if (val) *val = v;
      return SWIG_OK;
    } else {
      PyErr_Clear();
    }
  } else {
    long v;
    res = SWIG_AsVal_long (obj,&v);
    if (SWIG_IsOK(res)) {
      if (val) *val = v;
      return res;
    }
  }
#ifdef SWIG_PYTHON_CAST_MODE
  {
    const double mant_max = 1LL << DBL_MANT_DIG;
    const double mant_min = -mant_max;
    double d;
    res = SWIG_AsVal_double (obj,&d);
    if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, mant_min, mant_max)) {
      if (val) *val = (long long)(d);
      return SWIG_AddCast(res);
    }
    res = SWIG_TypeError;
  }
#endif
  return res;
}

SWIGINTERN PyObject *lldb_SBTarget___str__(lldb::SBTarget *self){
                lldb::SBStream description;
                self->GetDescription (description, lldb::eDescriptionLevelBrief);
                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();
        }
SWIGINTERN PyObject *lldb_SBThread___str__(lldb::SBThread *self){
                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();
        }
SWIGINTERN PyObject *lldb_SBTypeMember___str__(lldb::SBTypeMember *self){
                lldb::SBStream description;
                self->GetDescription (description, lldb::eDescriptionLevelBrief);
                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();
        }
SWIGINTERN PyObject *lldb_SBTypeMemberFunction___str__(lldb::SBTypeMemberFunction *self){
                lldb::SBStream description;
                self->GetDescription (description, lldb::eDescriptionLevelBrief);
                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();
        }
SWIGINTERN PyObject *lldb_SBType___str__(lldb::SBType *self){
                lldb::SBStream description;
                self->GetDescription (description, lldb::eDescriptionLevelBrief);
                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();
        }
SWIGINTERN PyObject *lldb_SBTypeCategory___str__(lldb::SBTypeCategory *self){
                lldb::SBStream description;
                self->GetDescription (description, lldb::eDescriptionLevelBrief);
                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();
        }
SWIGINTERN PyObject *lldb_SBTypeEnumMember___str__(lldb::SBTypeEnumMember *self){
                lldb::SBStream description;
                self->GetDescription (description, lldb::eDescriptionLevelBrief);
                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();
        }
SWIGINTERN PyObject *lldb_SBTypeFilter___str__(lldb::SBTypeFilter *self){
                lldb::SBStream description;
                self->GetDescription (description, lldb::eDescriptionLevelBrief);
                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();
        }
SWIGINTERN PyObject *lldb_SBTypeFormat___str__(lldb::SBTypeFormat *self){
                lldb::SBStream description;
                self->GetDescription (description, lldb::eDescriptionLevelBrief);
                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();
        }
SWIGINTERN PyObject *lldb_SBTypeNameSpecifier___str__(lldb::SBTypeNameSpecifier *self){
                lldb::SBStream description;
                self->GetDescription (description, lldb::eDescriptionLevelBrief);
                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();
        }
SWIGINTERN PyObject *lldb_SBTypeSummary___str__(lldb::SBTypeSummary *self){
                lldb::SBStream description;
                self->GetDescription (description, lldb::eDescriptionLevelBrief);
                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();
        }
SWIGINTERN PyObject *lldb_SBTypeSynthetic___str__(lldb::SBTypeSynthetic *self){
                lldb::SBStream description;
                self->GetDescription (description, lldb::eDescriptionLevelBrief);
                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();
        }
SWIGINTERN PyObject *lldb_SBValue___str__(lldb::SBValue *self){
                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();
        }
SWIGINTERN PyObject *lldb_SBValueList___str__(lldb::SBValueList *self){
                lldb::SBStream description;
                const size_t n = self->GetSize();
                if (n)
                {
                    for (size_t i=0; i<n; ++i)
                        self->GetValueAtIndex(i).GetDescription(description);
                }
                else
                {
                    description.Printf("<empty> lldb.SBValueList()");
                }
                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();
        }
SWIGINTERN PyObject *lldb_SBWatchpoint___str__(lldb::SBWatchpoint *self){
                lldb::SBStream description;
                self->GetDescription (description, lldb::eDescriptionLevelVerbose);
                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();
        }


template <typename T>
PyObject *
SBTypeToSWIGWrapper (T* item);

class PyErr_Cleaner
{
public:
    PyErr_Cleaner(bool print=false) :
    m_print(print)
    {
    }

    ~PyErr_Cleaner()
    {
        if (PyErr_Occurred())
        {
            if(m_print && !PyErr_ExceptionMatches(PyExc_SystemExit))
                PyErr_Print();
            PyErr_Clear();
        }
    }

private:
    bool m_print;
};


#ifdef __cplusplus
extern "C" {
#endif
SWIGINTERN PyObject *_wrap_new_SBAddress__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAddress *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBAddress")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBAddress *)new lldb::SBAddress();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBAddress, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBAddress__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAddress *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBAddress *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBAddress",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBAddress,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBAddress" "', argument " "1"" of type '" "lldb::SBAddress const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBAddress" "', argument " "1"" of type '" "lldb::SBAddress const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAddress * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBAddress *)new lldb::SBAddress((lldb::SBAddress const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBAddress, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBAddress__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSection arg1 ;
  lldb::addr_t arg2 ;
  void *argp1 ;
  int res1 = 0 ;
  unsigned long long val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBAddress *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:new_SBAddress",&obj0,&obj1)) SWIG_fail;
  {
    res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBSection,  0  | 0);
    if (!SWIG_IsOK(res1)) {
      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBAddress" "', argument " "1"" of type '" "lldb::SBSection""'"); 
    }  
    if (!argp1) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBAddress" "', argument " "1"" of type '" "lldb::SBSection""'");
    } else {
      lldb::SBSection * temp = reinterpret_cast< lldb::SBSection * >(argp1);
      arg1 = *temp;
      if (SWIG_IsNewObj(res1)) delete temp;
    }
  }
  ecode2 = SWIG_AsVal_unsigned_SS_long_SS_long(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_SBAddress" "', argument " "2"" of type '" "lldb::addr_t""'");
  } 
  arg2 = static_cast< lldb::addr_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBAddress *)new lldb::SBAddress(arg1,arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBAddress, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBAddress__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::addr_t arg1 ;
  lldb::SBTarget *arg2 = 0 ;
  unsigned long long val1 ;
  int ecode1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBAddress *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:new_SBAddress",&obj0,&obj1)) SWIG_fail;
  ecode1 = SWIG_AsVal_unsigned_SS_long_SS_long(obj0, &val1);
  if (!SWIG_IsOK(ecode1)) {
    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_SBAddress" "', argument " "1"" of type '" "lldb::addr_t""'");
  } 
  arg1 = static_cast< lldb::addr_t >(val1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTarget,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_SBAddress" "', argument " "2"" of type '" "lldb::SBTarget &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBAddress" "', argument " "2"" of type '" "lldb::SBTarget &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBTarget * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBAddress *)new lldb::SBAddress(arg1,*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBAddress, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBAddress(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[3];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 2); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBAddress__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBAddress, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBAddress__SWIG_1(self, args);
    }
  }
  if (argc == 2) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBSection, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_unsigned_SS_long_SS_long(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        return _wrap_new_SBAddress__SWIG_2(self, args);
      }
    }
  }
  if (argc == 2) {
    int _v;
    {
      int res = SWIG_AsVal_unsigned_SS_long_SS_long(argv[0], NULL);
      _v = SWIG_CheckState(res);
    }
    if (_v) {
      void *vptr = 0;
      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_lldb__SBTarget, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        return _wrap_new_SBAddress__SWIG_3(self, args);
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBAddress'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBAddress()\n"
    "    lldb::SBAddress(lldb::SBAddress const &)\n"
    "    lldb::SBAddress(lldb::SBSection,lldb::addr_t)\n"
    "    lldb::SBAddress(lldb::addr_t,lldb::SBTarget &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBAddress(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAddress *arg1 = (lldb::SBAddress *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBAddress",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAddress, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBAddress" "', argument " "1"" of type '" "lldb::SBAddress *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAddress * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAddress_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAddress *arg1 = (lldb::SBAddress *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBAddress_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAddress, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBAddress_IsValid" "', argument " "1"" of type '" "lldb::SBAddress const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAddress * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBAddress const *)arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAddress_Clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAddress *arg1 = (lldb::SBAddress *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBAddress_Clear",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAddress, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBAddress_Clear" "', argument " "1"" of type '" "lldb::SBAddress *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAddress * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->Clear();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAddress_GetFileAddress(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAddress *arg1 = (lldb::SBAddress *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::addr_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBAddress_GetFileAddress",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAddress, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBAddress_GetFileAddress" "', argument " "1"" of type '" "lldb::SBAddress const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAddress * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::addr_t)((lldb::SBAddress const *)arg1)->GetFileAddress();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAddress_GetLoadAddress(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAddress *arg1 = (lldb::SBAddress *) 0 ;
  lldb::SBTarget *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::addr_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBAddress_GetLoadAddress",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAddress, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBAddress_GetLoadAddress" "', argument " "1"" of type '" "lldb::SBAddress const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAddress * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTarget,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBAddress_GetLoadAddress" "', argument " "2"" of type '" "lldb::SBTarget const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBAddress_GetLoadAddress" "', argument " "2"" of type '" "lldb::SBTarget const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBTarget * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::addr_t)((lldb::SBAddress const *)arg1)->GetLoadAddress((lldb::SBTarget const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAddress_SetLoadAddress(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAddress *arg1 = (lldb::SBAddress *) 0 ;
  lldb::addr_t arg2 ;
  lldb::SBTarget *arg3 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned long long val2 ;
  int ecode2 = 0 ;
  void *argp3 = 0 ;
  int res3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBAddress_SetLoadAddress",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAddress, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBAddress_SetLoadAddress" "', argument " "1"" of type '" "lldb::SBAddress *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAddress * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_long_SS_long(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBAddress_SetLoadAddress" "', argument " "2"" of type '" "lldb::addr_t""'");
  } 
  arg2 = static_cast< lldb::addr_t >(val2);
  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBTarget,  0 );
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBAddress_SetLoadAddress" "', argument " "3"" of type '" "lldb::SBTarget &""'"); 
  }
  if (!argp3) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBAddress_SetLoadAddress" "', argument " "3"" of type '" "lldb::SBTarget &""'"); 
  }
  arg3 = reinterpret_cast< lldb::SBTarget * >(argp3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetLoadAddress(arg2,*arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAddress_OffsetAddress(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAddress *arg1 = (lldb::SBAddress *) 0 ;
  lldb::addr_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned long long val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBAddress_OffsetAddress",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAddress, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBAddress_OffsetAddress" "', argument " "1"" of type '" "lldb::SBAddress *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAddress * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_long_SS_long(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBAddress_OffsetAddress" "', argument " "2"" of type '" "lldb::addr_t""'");
  } 
  arg2 = static_cast< lldb::addr_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->OffsetAddress(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAddress_GetDescription(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAddress *arg1 = (lldb::SBAddress *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBAddress_GetDescription",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAddress, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBAddress_GetDescription" "', argument " "1"" of type '" "lldb::SBAddress *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAddress * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBAddress_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBAddress_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetDescription(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAddress_GetSection(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAddress *arg1 = (lldb::SBAddress *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBSection result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBAddress_GetSection",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAddress, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBAddress_GetSection" "', argument " "1"" of type '" "lldb::SBAddress *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAddress * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetSection();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBSection(static_cast< const lldb::SBSection& >(result))), SWIGTYPE_p_lldb__SBSection, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAddress_GetOffset(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAddress *arg1 = (lldb::SBAddress *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::addr_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBAddress_GetOffset",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAddress, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBAddress_GetOffset" "', argument " "1"" of type '" "lldb::SBAddress *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAddress * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::addr_t)(arg1)->GetOffset();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAddress_SetAddress(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAddress *arg1 = (lldb::SBAddress *) 0 ;
  lldb::SBSection arg2 ;
  lldb::addr_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  unsigned long long val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBAddress_SetAddress",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAddress, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBAddress_SetAddress" "', argument " "1"" of type '" "lldb::SBAddress *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAddress * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBSection,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBAddress_SetAddress" "', argument " "2"" of type '" "lldb::SBSection""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBAddress_SetAddress" "', argument " "2"" of type '" "lldb::SBSection""'");
    } else {
      lldb::SBSection * temp = reinterpret_cast< lldb::SBSection * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  ecode3 = SWIG_AsVal_unsigned_SS_long_SS_long(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBAddress_SetAddress" "', argument " "3"" of type '" "lldb::addr_t""'");
  } 
  arg3 = static_cast< lldb::addr_t >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetAddress(arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAddress_GetAddressClass(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAddress *arg1 = (lldb::SBAddress *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::AddressClass result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBAddress_GetAddressClass",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAddress, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBAddress_GetAddressClass" "', argument " "1"" of type '" "lldb::SBAddress *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAddress * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::AddressClass)(arg1)->GetAddressClass();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAddress_GetSymbolContext(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAddress *arg1 = (lldb::SBAddress *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBSymbolContext result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBAddress_GetSymbolContext",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAddress, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBAddress_GetSymbolContext" "', argument " "1"" of type '" "lldb::SBAddress *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAddress * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBAddress_GetSymbolContext" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetSymbolContext(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBSymbolContext(static_cast< const lldb::SBSymbolContext& >(result))), SWIGTYPE_p_lldb__SBSymbolContext, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAddress_GetModule(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAddress *arg1 = (lldb::SBAddress *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBModule result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBAddress_GetModule",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAddress, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBAddress_GetModule" "', argument " "1"" of type '" "lldb::SBAddress *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAddress * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetModule();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBModule(static_cast< const lldb::SBModule& >(result))), SWIGTYPE_p_lldb__SBModule, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAddress_GetCompileUnit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAddress *arg1 = (lldb::SBAddress *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBCompileUnit result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBAddress_GetCompileUnit",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAddress, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBAddress_GetCompileUnit" "', argument " "1"" of type '" "lldb::SBAddress *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAddress * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetCompileUnit();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBCompileUnit(static_cast< const lldb::SBCompileUnit& >(result))), SWIGTYPE_p_lldb__SBCompileUnit, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAddress_GetFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAddress *arg1 = (lldb::SBAddress *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBFunction result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBAddress_GetFunction",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAddress, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBAddress_GetFunction" "', argument " "1"" of type '" "lldb::SBAddress *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAddress * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetFunction();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBFunction(static_cast< const lldb::SBFunction& >(result))), SWIGTYPE_p_lldb__SBFunction, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAddress_GetBlock(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAddress *arg1 = (lldb::SBAddress *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBBlock result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBAddress_GetBlock",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAddress, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBAddress_GetBlock" "', argument " "1"" of type '" "lldb::SBAddress *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAddress * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetBlock();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBBlock(static_cast< const lldb::SBBlock& >(result))), SWIGTYPE_p_lldb__SBBlock, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAddress_GetSymbol(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAddress *arg1 = (lldb::SBAddress *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBSymbol result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBAddress_GetSymbol",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAddress, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBAddress_GetSymbol" "', argument " "1"" of type '" "lldb::SBAddress *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAddress * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetSymbol();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBSymbol(static_cast< const lldb::SBSymbol& >(result))), SWIGTYPE_p_lldb__SBSymbol, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAddress_GetLineEntry(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAddress *arg1 = (lldb::SBAddress *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBLineEntry result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBAddress_GetLineEntry",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAddress, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBAddress_GetLineEntry" "', argument " "1"" of type '" "lldb::SBAddress *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAddress * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetLineEntry();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBLineEntry(static_cast< const lldb::SBLineEntry& >(result))), SWIGTYPE_p_lldb__SBLineEntry, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAddress___str__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAddress *arg1 = (lldb::SBAddress *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBAddress___str__",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAddress, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBAddress___str__" "', argument " "1"" of type '" "lldb::SBAddress *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAddress * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (PyObject *)lldb_SBAddress___str__(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = result;
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBAddress_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBAddress, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBAttachInfo__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAttachInfo *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBAttachInfo")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBAttachInfo *)new lldb::SBAttachInfo();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBAttachInfo, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBAttachInfo__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::pid_t arg1 ;
  unsigned long long val1 ;
  int ecode1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBAttachInfo *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBAttachInfo",&obj0)) SWIG_fail;
  ecode1 = SWIG_AsVal_unsigned_SS_long_SS_long(obj0, &val1);
  if (!SWIG_IsOK(ecode1)) {
    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_SBAttachInfo" "', argument " "1"" of type '" "lldb::pid_t""'");
  } 
  arg1 = static_cast< lldb::pid_t >(val1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBAttachInfo *)new lldb::SBAttachInfo(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBAttachInfo, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBAttachInfo__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  char *arg1 = (char *) 0 ;
  bool arg2 ;
  int res1 ;
  char *buf1 = 0 ;
  int alloc1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBAttachInfo *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:new_SBAttachInfo",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBAttachInfo" "', argument " "1"" of type '" "char const *""'");
  }
  arg1 = reinterpret_cast< char * >(buf1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_SBAttachInfo" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBAttachInfo *)new lldb::SBAttachInfo((char const *)arg1,arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBAttachInfo, SWIG_POINTER_NEW |  0 );
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return resultobj;
fail:
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBAttachInfo__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  char *arg1 = (char *) 0 ;
  bool arg2 ;
  bool arg3 ;
  int res1 ;
  char *buf1 = 0 ;
  int alloc1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  bool val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBAttachInfo *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:new_SBAttachInfo",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBAttachInfo" "', argument " "1"" of type '" "char const *""'");
  }
  arg1 = reinterpret_cast< char * >(buf1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_SBAttachInfo" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  ecode3 = SWIG_AsVal_bool(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_SBAttachInfo" "', argument " "3"" of type '" "bool""'");
  } 
  arg3 = static_cast< bool >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBAttachInfo *)new lldb::SBAttachInfo((char const *)arg1,arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBAttachInfo, SWIG_POINTER_NEW |  0 );
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return resultobj;
fail:
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBAttachInfo__SWIG_4(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAttachInfo *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBAttachInfo *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBAttachInfo",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBAttachInfo,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBAttachInfo" "', argument " "1"" of type '" "lldb::SBAttachInfo const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBAttachInfo" "', argument " "1"" of type '" "lldb::SBAttachInfo const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAttachInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBAttachInfo *)new lldb::SBAttachInfo((lldb::SBAttachInfo const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBAttachInfo, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBAttachInfo(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[4];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 3); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBAttachInfo__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBAttachInfo, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBAttachInfo__SWIG_4(self, args);
    }
  }
  if (argc == 1) {
    int _v;
    {
      int res = SWIG_AsVal_unsigned_SS_long_SS_long(argv[0], NULL);
      _v = SWIG_CheckState(res);
    }
    if (_v) {
      return _wrap_new_SBAttachInfo__SWIG_1(self, args);
    }
  }
  if (argc == 2) {
    int _v;
    int res = SWIG_AsCharPtrAndSize(argv[0], 0, NULL, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_bool(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        return _wrap_new_SBAttachInfo__SWIG_2(self, args);
      }
    }
  }
  if (argc == 3) {
    int _v;
    int res = SWIG_AsCharPtrAndSize(argv[0], 0, NULL, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_bool(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        {
          int res = SWIG_AsVal_bool(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          return _wrap_new_SBAttachInfo__SWIG_3(self, args);
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBAttachInfo'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBAttachInfo()\n"
    "    lldb::SBAttachInfo(lldb::pid_t)\n"
    "    lldb::SBAttachInfo(char const *,bool)\n"
    "    lldb::SBAttachInfo(char const *,bool,bool)\n"
    "    lldb::SBAttachInfo(lldb::SBAttachInfo const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAttachInfo_GetProcessID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAttachInfo *arg1 = (lldb::SBAttachInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::pid_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBAttachInfo_GetProcessID",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAttachInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBAttachInfo_GetProcessID" "', argument " "1"" of type '" "lldb::SBAttachInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAttachInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::pid_t)(arg1)->GetProcessID();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAttachInfo_SetProcessID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAttachInfo *arg1 = (lldb::SBAttachInfo *) 0 ;
  lldb::pid_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned long long val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBAttachInfo_SetProcessID",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAttachInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBAttachInfo_SetProcessID" "', argument " "1"" of type '" "lldb::SBAttachInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAttachInfo * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_long_SS_long(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBAttachInfo_SetProcessID" "', argument " "2"" of type '" "lldb::pid_t""'");
  } 
  arg2 = static_cast< lldb::pid_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetProcessID(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAttachInfo_SetExecutable__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAttachInfo *arg1 = (lldb::SBAttachInfo *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBAttachInfo_SetExecutable",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAttachInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBAttachInfo_SetExecutable" "', argument " "1"" of type '" "lldb::SBAttachInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAttachInfo * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBAttachInfo_SetExecutable" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetExecutable((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAttachInfo_SetExecutable__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAttachInfo *arg1 = (lldb::SBAttachInfo *) 0 ;
  lldb::SBFileSpec arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBAttachInfo_SetExecutable",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAttachInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBAttachInfo_SetExecutable" "', argument " "1"" of type '" "lldb::SBAttachInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAttachInfo * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBFileSpec,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBAttachInfo_SetExecutable" "', argument " "2"" of type '" "lldb::SBFileSpec""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBAttachInfo_SetExecutable" "', argument " "2"" of type '" "lldb::SBFileSpec""'");
    } else {
      lldb::SBFileSpec * temp = reinterpret_cast< lldb::SBFileSpec * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetExecutable(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAttachInfo_SetExecutable(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[3];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 2); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBAttachInfo, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_lldb__SBFileSpec, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        return _wrap_SBAttachInfo_SetExecutable__SWIG_1(self, args);
      }
    }
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBAttachInfo, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        return _wrap_SBAttachInfo_SetExecutable__SWIG_0(self, args);
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBAttachInfo_SetExecutable'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    SetExecutable(lldb::SBAttachInfo *,char const *)\n"
    "    SetExecutable(lldb::SBAttachInfo *,lldb::SBFileSpec)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAttachInfo_GetWaitForLaunch(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAttachInfo *arg1 = (lldb::SBAttachInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBAttachInfo_GetWaitForLaunch",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAttachInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBAttachInfo_GetWaitForLaunch" "', argument " "1"" of type '" "lldb::SBAttachInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAttachInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetWaitForLaunch();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAttachInfo_SetWaitForLaunch__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAttachInfo *arg1 = (lldb::SBAttachInfo *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBAttachInfo_SetWaitForLaunch",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAttachInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBAttachInfo_SetWaitForLaunch" "', argument " "1"" of type '" "lldb::SBAttachInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAttachInfo * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBAttachInfo_SetWaitForLaunch" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetWaitForLaunch(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAttachInfo_SetWaitForLaunch__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAttachInfo *arg1 = (lldb::SBAttachInfo *) 0 ;
  bool arg2 ;
  bool arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  bool val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBAttachInfo_SetWaitForLaunch",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAttachInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBAttachInfo_SetWaitForLaunch" "', argument " "1"" of type '" "lldb::SBAttachInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAttachInfo * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBAttachInfo_SetWaitForLaunch" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  ecode3 = SWIG_AsVal_bool(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBAttachInfo_SetWaitForLaunch" "', argument " "3"" of type '" "bool""'");
  } 
  arg3 = static_cast< bool >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetWaitForLaunch(arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAttachInfo_SetWaitForLaunch(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[4];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 3); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBAttachInfo, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_bool(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        return _wrap_SBAttachInfo_SetWaitForLaunch__SWIG_0(self, args);
      }
    }
  }
  if (argc == 3) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBAttachInfo, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_bool(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        {
          int res = SWIG_AsVal_bool(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          return _wrap_SBAttachInfo_SetWaitForLaunch__SWIG_1(self, args);
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBAttachInfo_SetWaitForLaunch'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    SetWaitForLaunch(lldb::SBAttachInfo *,bool)\n"
    "    SetWaitForLaunch(lldb::SBAttachInfo *,bool,bool)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAttachInfo_GetIgnoreExisting(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAttachInfo *arg1 = (lldb::SBAttachInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBAttachInfo_GetIgnoreExisting",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAttachInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBAttachInfo_GetIgnoreExisting" "', argument " "1"" of type '" "lldb::SBAttachInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAttachInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetIgnoreExisting();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAttachInfo_SetIgnoreExisting(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAttachInfo *arg1 = (lldb::SBAttachInfo *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBAttachInfo_SetIgnoreExisting",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAttachInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBAttachInfo_SetIgnoreExisting" "', argument " "1"" of type '" "lldb::SBAttachInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAttachInfo * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBAttachInfo_SetIgnoreExisting" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetIgnoreExisting(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAttachInfo_GetResumeCount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAttachInfo *arg1 = (lldb::SBAttachInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBAttachInfo_GetResumeCount",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAttachInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBAttachInfo_GetResumeCount" "', argument " "1"" of type '" "lldb::SBAttachInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAttachInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetResumeCount();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAttachInfo_SetResumeCount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAttachInfo *arg1 = (lldb::SBAttachInfo *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBAttachInfo_SetResumeCount",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAttachInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBAttachInfo_SetResumeCount" "', argument " "1"" of type '" "lldb::SBAttachInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAttachInfo * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBAttachInfo_SetResumeCount" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetResumeCount(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAttachInfo_GetProcessPluginName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAttachInfo *arg1 = (lldb::SBAttachInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBAttachInfo_GetProcessPluginName",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAttachInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBAttachInfo_GetProcessPluginName" "', argument " "1"" of type '" "lldb::SBAttachInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAttachInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetProcessPluginName();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAttachInfo_SetProcessPluginName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAttachInfo *arg1 = (lldb::SBAttachInfo *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBAttachInfo_SetProcessPluginName",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAttachInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBAttachInfo_SetProcessPluginName" "', argument " "1"" of type '" "lldb::SBAttachInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAttachInfo * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBAttachInfo_SetProcessPluginName" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetProcessPluginName((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAttachInfo_GetUserID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAttachInfo *arg1 = (lldb::SBAttachInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBAttachInfo_GetUserID",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAttachInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBAttachInfo_GetUserID" "', argument " "1"" of type '" "lldb::SBAttachInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAttachInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetUserID();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAttachInfo_GetGroupID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAttachInfo *arg1 = (lldb::SBAttachInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBAttachInfo_GetGroupID",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAttachInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBAttachInfo_GetGroupID" "', argument " "1"" of type '" "lldb::SBAttachInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAttachInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetGroupID();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAttachInfo_UserIDIsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAttachInfo *arg1 = (lldb::SBAttachInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBAttachInfo_UserIDIsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAttachInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBAttachInfo_UserIDIsValid" "', argument " "1"" of type '" "lldb::SBAttachInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAttachInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->UserIDIsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAttachInfo_GroupIDIsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAttachInfo *arg1 = (lldb::SBAttachInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBAttachInfo_GroupIDIsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAttachInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBAttachInfo_GroupIDIsValid" "', argument " "1"" of type '" "lldb::SBAttachInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAttachInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GroupIDIsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAttachInfo_SetUserID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAttachInfo *arg1 = (lldb::SBAttachInfo *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBAttachInfo_SetUserID",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAttachInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBAttachInfo_SetUserID" "', argument " "1"" of type '" "lldb::SBAttachInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAttachInfo * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBAttachInfo_SetUserID" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetUserID(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAttachInfo_SetGroupID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAttachInfo *arg1 = (lldb::SBAttachInfo *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBAttachInfo_SetGroupID",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAttachInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBAttachInfo_SetGroupID" "', argument " "1"" of type '" "lldb::SBAttachInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAttachInfo * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBAttachInfo_SetGroupID" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetGroupID(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAttachInfo_GetEffectiveUserID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAttachInfo *arg1 = (lldb::SBAttachInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBAttachInfo_GetEffectiveUserID",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAttachInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBAttachInfo_GetEffectiveUserID" "', argument " "1"" of type '" "lldb::SBAttachInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAttachInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetEffectiveUserID();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAttachInfo_GetEffectiveGroupID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAttachInfo *arg1 = (lldb::SBAttachInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBAttachInfo_GetEffectiveGroupID",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAttachInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBAttachInfo_GetEffectiveGroupID" "', argument " "1"" of type '" "lldb::SBAttachInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAttachInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetEffectiveGroupID();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAttachInfo_EffectiveUserIDIsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAttachInfo *arg1 = (lldb::SBAttachInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBAttachInfo_EffectiveUserIDIsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAttachInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBAttachInfo_EffectiveUserIDIsValid" "', argument " "1"" of type '" "lldb::SBAttachInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAttachInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->EffectiveUserIDIsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAttachInfo_EffectiveGroupIDIsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAttachInfo *arg1 = (lldb::SBAttachInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBAttachInfo_EffectiveGroupIDIsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAttachInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBAttachInfo_EffectiveGroupIDIsValid" "', argument " "1"" of type '" "lldb::SBAttachInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAttachInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->EffectiveGroupIDIsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAttachInfo_SetEffectiveUserID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAttachInfo *arg1 = (lldb::SBAttachInfo *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBAttachInfo_SetEffectiveUserID",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAttachInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBAttachInfo_SetEffectiveUserID" "', argument " "1"" of type '" "lldb::SBAttachInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAttachInfo * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBAttachInfo_SetEffectiveUserID" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetEffectiveUserID(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAttachInfo_SetEffectiveGroupID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAttachInfo *arg1 = (lldb::SBAttachInfo *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBAttachInfo_SetEffectiveGroupID",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAttachInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBAttachInfo_SetEffectiveGroupID" "', argument " "1"" of type '" "lldb::SBAttachInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAttachInfo * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBAttachInfo_SetEffectiveGroupID" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetEffectiveGroupID(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAttachInfo_GetParentProcessID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAttachInfo *arg1 = (lldb::SBAttachInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::pid_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBAttachInfo_GetParentProcessID",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAttachInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBAttachInfo_GetParentProcessID" "', argument " "1"" of type '" "lldb::SBAttachInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAttachInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::pid_t)(arg1)->GetParentProcessID();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAttachInfo_SetParentProcessID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAttachInfo *arg1 = (lldb::SBAttachInfo *) 0 ;
  lldb::pid_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned long long val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBAttachInfo_SetParentProcessID",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAttachInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBAttachInfo_SetParentProcessID" "', argument " "1"" of type '" "lldb::SBAttachInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAttachInfo * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_long_SS_long(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBAttachInfo_SetParentProcessID" "', argument " "2"" of type '" "lldb::pid_t""'");
  } 
  arg2 = static_cast< lldb::pid_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetParentProcessID(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAttachInfo_ParentProcessIDIsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAttachInfo *arg1 = (lldb::SBAttachInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBAttachInfo_ParentProcessIDIsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAttachInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBAttachInfo_ParentProcessIDIsValid" "', argument " "1"" of type '" "lldb::SBAttachInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAttachInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->ParentProcessIDIsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAttachInfo_GetListener(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAttachInfo *arg1 = (lldb::SBAttachInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBListener result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBAttachInfo_GetListener",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAttachInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBAttachInfo_GetListener" "', argument " "1"" of type '" "lldb::SBAttachInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAttachInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetListener();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBListener(static_cast< const lldb::SBListener& >(result))), SWIGTYPE_p_lldb__SBListener, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBAttachInfo_SetListener(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAttachInfo *arg1 = (lldb::SBAttachInfo *) 0 ;
  lldb::SBListener *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBAttachInfo_SetListener",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAttachInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBAttachInfo_SetListener" "', argument " "1"" of type '" "lldb::SBAttachInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAttachInfo * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBListener,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBAttachInfo_SetListener" "', argument " "2"" of type '" "lldb::SBListener &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBAttachInfo_SetListener" "', argument " "2"" of type '" "lldb::SBListener &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBListener * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetListener(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBAttachInfo(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBAttachInfo *arg1 = (lldb::SBAttachInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBAttachInfo",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBAttachInfo, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBAttachInfo" "', argument " "1"" of type '" "lldb::SBAttachInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBAttachInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBAttachInfo_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBAttachInfo, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBBlock__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBlock *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBBlock")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBBlock *)new lldb::SBBlock();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBBlock, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBBlock__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBlock *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBBlock *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBBlock",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBBlock,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBBlock" "', argument " "1"" of type '" "lldb::SBBlock const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBBlock" "', argument " "1"" of type '" "lldb::SBBlock const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBlock * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBBlock *)new lldb::SBBlock((lldb::SBBlock const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBBlock, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBBlock(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBBlock__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBBlock, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBBlock__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBBlock'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBBlock()\n"
    "    lldb::SBBlock(lldb::SBBlock const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBBlock(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBlock *arg1 = (lldb::SBBlock *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBBlock",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBlock, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBBlock" "', argument " "1"" of type '" "lldb::SBBlock *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBlock * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBlock_IsInlined(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBlock *arg1 = (lldb::SBBlock *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBlock_IsInlined",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBlock, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBlock_IsInlined" "', argument " "1"" of type '" "lldb::SBBlock const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBlock * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBBlock const *)arg1)->IsInlined();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBlock_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBlock *arg1 = (lldb::SBBlock *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBlock_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBlock, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBlock_IsValid" "', argument " "1"" of type '" "lldb::SBBlock const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBlock * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBBlock const *)arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBlock_GetInlinedName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBlock *arg1 = (lldb::SBBlock *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBlock_GetInlinedName",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBlock, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBlock_GetInlinedName" "', argument " "1"" of type '" "lldb::SBBlock const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBlock * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)((lldb::SBBlock const *)arg1)->GetInlinedName();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBlock_GetInlinedCallSiteFile(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBlock *arg1 = (lldb::SBBlock *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBFileSpec result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBlock_GetInlinedCallSiteFile",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBlock, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBlock_GetInlinedCallSiteFile" "', argument " "1"" of type '" "lldb::SBBlock const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBlock * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBBlock const *)arg1)->GetInlinedCallSiteFile();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBFileSpec(static_cast< const lldb::SBFileSpec& >(result))), SWIGTYPE_p_lldb__SBFileSpec, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBlock_GetInlinedCallSiteLine(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBlock *arg1 = (lldb::SBBlock *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBlock_GetInlinedCallSiteLine",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBlock, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBlock_GetInlinedCallSiteLine" "', argument " "1"" of type '" "lldb::SBBlock const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBlock * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)((lldb::SBBlock const *)arg1)->GetInlinedCallSiteLine();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBlock_GetInlinedCallSiteColumn(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBlock *arg1 = (lldb::SBBlock *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBlock_GetInlinedCallSiteColumn",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBlock, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBlock_GetInlinedCallSiteColumn" "', argument " "1"" of type '" "lldb::SBBlock const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBlock * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)((lldb::SBBlock const *)arg1)->GetInlinedCallSiteColumn();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBlock_GetParent(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBlock *arg1 = (lldb::SBBlock *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBBlock result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBlock_GetParent",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBlock, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBlock_GetParent" "', argument " "1"" of type '" "lldb::SBBlock *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBlock * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetParent();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBBlock(static_cast< const lldb::SBBlock& >(result))), SWIGTYPE_p_lldb__SBBlock, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBlock_GetContainingInlinedBlock(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBlock *arg1 = (lldb::SBBlock *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBBlock result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBlock_GetContainingInlinedBlock",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBlock, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBlock_GetContainingInlinedBlock" "', argument " "1"" of type '" "lldb::SBBlock *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBlock * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetContainingInlinedBlock();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBBlock(static_cast< const lldb::SBBlock& >(result))), SWIGTYPE_p_lldb__SBBlock, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBlock_GetSibling(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBlock *arg1 = (lldb::SBBlock *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBBlock result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBlock_GetSibling",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBlock, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBlock_GetSibling" "', argument " "1"" of type '" "lldb::SBBlock *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBlock * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetSibling();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBBlock(static_cast< const lldb::SBBlock& >(result))), SWIGTYPE_p_lldb__SBBlock, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBlock_GetFirstChild(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBlock *arg1 = (lldb::SBBlock *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBBlock result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBlock_GetFirstChild",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBlock, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBlock_GetFirstChild" "', argument " "1"" of type '" "lldb::SBBlock *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBlock * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetFirstChild();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBBlock(static_cast< const lldb::SBBlock& >(result))), SWIGTYPE_p_lldb__SBBlock, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBlock_GetNumRanges(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBlock *arg1 = (lldb::SBBlock *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBlock_GetNumRanges",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBlock, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBlock_GetNumRanges" "', argument " "1"" of type '" "lldb::SBBlock *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBlock * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetNumRanges();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBlock_GetRangeStartAddress(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBlock *arg1 = (lldb::SBBlock *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBAddress result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBlock_GetRangeStartAddress",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBlock, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBlock_GetRangeStartAddress" "', argument " "1"" of type '" "lldb::SBBlock *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBlock * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBBlock_GetRangeStartAddress" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetRangeStartAddress(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBAddress(static_cast< const lldb::SBAddress& >(result))), SWIGTYPE_p_lldb__SBAddress, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBlock_GetRangeEndAddress(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBlock *arg1 = (lldb::SBBlock *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBAddress result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBlock_GetRangeEndAddress",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBlock, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBlock_GetRangeEndAddress" "', argument " "1"" of type '" "lldb::SBBlock *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBlock * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBBlock_GetRangeEndAddress" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetRangeEndAddress(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBAddress(static_cast< const lldb::SBAddress& >(result))), SWIGTYPE_p_lldb__SBAddress, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBlock_GetRangeIndexForBlockAddress(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBlock *arg1 = (lldb::SBBlock *) 0 ;
  lldb::SBAddress arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBlock_GetRangeIndexForBlockAddress",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBlock, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBlock_GetRangeIndexForBlockAddress" "', argument " "1"" of type '" "lldb::SBBlock *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBlock * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBAddress,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBBlock_GetRangeIndexForBlockAddress" "', argument " "2"" of type '" "lldb::SBAddress""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBBlock_GetRangeIndexForBlockAddress" "', argument " "2"" of type '" "lldb::SBAddress""'");
    } else {
      lldb::SBAddress * temp = reinterpret_cast< lldb::SBAddress * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetRangeIndexForBlockAddress(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBlock_GetDescription(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBlock *arg1 = (lldb::SBBlock *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBlock_GetDescription",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBlock, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBlock_GetDescription" "', argument " "1"" of type '" "lldb::SBBlock *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBlock * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBBlock_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBBlock_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetDescription(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBlock_GetVariables__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBlock *arg1 = (lldb::SBBlock *) 0 ;
  lldb::SBFrame *arg2 = 0 ;
  bool arg3 ;
  bool arg4 ;
  bool arg5 ;
  lldb::DynamicValueType arg6 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  bool val3 ;
  int ecode3 = 0 ;
  bool val4 ;
  int ecode4 = 0 ;
  bool val5 ;
  int ecode5 = 0 ;
  int val6 ;
  int ecode6 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  PyObject * obj4 = 0 ;
  PyObject * obj5 = 0 ;
  lldb::SBValueList result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOOOO:SBBlock_GetVariables",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBlock, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBlock_GetVariables" "', argument " "1"" of type '" "lldb::SBBlock *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBlock * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBFrame,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBBlock_GetVariables" "', argument " "2"" of type '" "lldb::SBFrame &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBBlock_GetVariables" "', argument " "2"" of type '" "lldb::SBFrame &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBFrame * >(argp2);
  ecode3 = SWIG_AsVal_bool(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBBlock_GetVariables" "', argument " "3"" of type '" "bool""'");
  } 
  arg3 = static_cast< bool >(val3);
  ecode4 = SWIG_AsVal_bool(obj3, &val4);
  if (!SWIG_IsOK(ecode4)) {
    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "SBBlock_GetVariables" "', argument " "4"" of type '" "bool""'");
  } 
  arg4 = static_cast< bool >(val4);
  ecode5 = SWIG_AsVal_bool(obj4, &val5);
  if (!SWIG_IsOK(ecode5)) {
    SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "SBBlock_GetVariables" "', argument " "5"" of type '" "bool""'");
  } 
  arg5 = static_cast< bool >(val5);
  ecode6 = SWIG_AsVal_int(obj5, &val6);
  if (!SWIG_IsOK(ecode6)) {
    SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "SBBlock_GetVariables" "', argument " "6"" of type '" "lldb::DynamicValueType""'");
  } 
  arg6 = static_cast< lldb::DynamicValueType >(val6);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetVariables(*arg2,arg3,arg4,arg5,arg6);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBValueList(static_cast< const lldb::SBValueList& >(result))), SWIGTYPE_p_lldb__SBValueList, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBlock_GetVariables__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBlock *arg1 = (lldb::SBBlock *) 0 ;
  lldb::SBTarget *arg2 = 0 ;
  bool arg3 ;
  bool arg4 ;
  bool arg5 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  bool val3 ;
  int ecode3 = 0 ;
  bool val4 ;
  int ecode4 = 0 ;
  bool val5 ;
  int ecode5 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  PyObject * obj4 = 0 ;
  lldb::SBValueList result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOOO:SBBlock_GetVariables",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBlock, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBlock_GetVariables" "', argument " "1"" of type '" "lldb::SBBlock *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBlock * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTarget,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBBlock_GetVariables" "', argument " "2"" of type '" "lldb::SBTarget &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBBlock_GetVariables" "', argument " "2"" of type '" "lldb::SBTarget &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBTarget * >(argp2);
  ecode3 = SWIG_AsVal_bool(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBBlock_GetVariables" "', argument " "3"" of type '" "bool""'");
  } 
  arg3 = static_cast< bool >(val3);
  ecode4 = SWIG_AsVal_bool(obj3, &val4);
  if (!SWIG_IsOK(ecode4)) {
    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "SBBlock_GetVariables" "', argument " "4"" of type '" "bool""'");
  } 
  arg4 = static_cast< bool >(val4);
  ecode5 = SWIG_AsVal_bool(obj4, &val5);
  if (!SWIG_IsOK(ecode5)) {
    SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "SBBlock_GetVariables" "', argument " "5"" of type '" "bool""'");
  } 
  arg5 = static_cast< bool >(val5);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetVariables(*arg2,arg3,arg4,arg5);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBValueList(static_cast< const lldb::SBValueList& >(result))), SWIGTYPE_p_lldb__SBValueList, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBlock_GetVariables(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[7];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 6); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 5) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBBlock, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      void *vptr = 0;
      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_lldb__SBTarget, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        {
          int res = SWIG_AsVal_bool(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          {
            int res = SWIG_AsVal_bool(argv[3], NULL);
            _v = SWIG_CheckState(res);
          }
          if (_v) {
            {
              int res = SWIG_AsVal_bool(argv[4], NULL);
              _v = SWIG_CheckState(res);
            }
            if (_v) {
              return _wrap_SBBlock_GetVariables__SWIG_1(self, args);
            }
          }
        }
      }
    }
  }
  if (argc == 6) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBBlock, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      void *vptr = 0;
      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_lldb__SBFrame, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        {
          int res = SWIG_AsVal_bool(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          {
            int res = SWIG_AsVal_bool(argv[3], NULL);
            _v = SWIG_CheckState(res);
          }
          if (_v) {
            {
              int res = SWIG_AsVal_bool(argv[4], NULL);
              _v = SWIG_CheckState(res);
            }
            if (_v) {
              {
                int res = SWIG_AsVal_int(argv[5], NULL);
                _v = SWIG_CheckState(res);
              }
              if (_v) {
                return _wrap_SBBlock_GetVariables__SWIG_0(self, args);
              }
            }
          }
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBBlock_GetVariables'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    GetVariables(lldb::SBBlock *,lldb::SBFrame &,bool,bool,bool,lldb::DynamicValueType)\n"
    "    GetVariables(lldb::SBBlock *,lldb::SBTarget &,bool,bool,bool)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBlock___str__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBlock *arg1 = (lldb::SBBlock *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBlock___str__",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBlock, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBlock___str__" "', argument " "1"" of type '" "lldb::SBBlock *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBlock * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (PyObject *)lldb_SBBlock___str__(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = result;
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBBlock_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBBlock, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBBreakpoint__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpoint *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBBreakpoint")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBBreakpoint *)new lldb::SBBreakpoint();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBBreakpoint, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBBreakpoint__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpoint *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBBreakpoint *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBBreakpoint",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBBreakpoint,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBBreakpoint" "', argument " "1"" of type '" "lldb::SBBreakpoint const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBBreakpoint" "', argument " "1"" of type '" "lldb::SBBreakpoint const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpoint * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBBreakpoint *)new lldb::SBBreakpoint((lldb::SBBreakpoint const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBBreakpoint, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBBreakpoint(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBBreakpoint__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBBreakpoint, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBBreakpoint__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBBreakpoint'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBBreakpoint()\n"
    "    lldb::SBBreakpoint(lldb::SBBreakpoint const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBBreakpoint(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpoint *arg1 = (lldb::SBBreakpoint *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBBreakpoint",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpoint, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBBreakpoint" "', argument " "1"" of type '" "lldb::SBBreakpoint *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpoint * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpoint_GetID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpoint *arg1 = (lldb::SBBreakpoint *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::break_id_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpoint_GetID",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpoint_GetID" "', argument " "1"" of type '" "lldb::SBBreakpoint const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpoint * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::break_id_t)((lldb::SBBreakpoint const *)arg1)->GetID();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpoint_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpoint *arg1 = (lldb::SBBreakpoint *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpoint_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpoint_IsValid" "', argument " "1"" of type '" "lldb::SBBreakpoint const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpoint * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBBreakpoint const *)arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpoint_ClearAllBreakpointSites(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpoint *arg1 = (lldb::SBBreakpoint *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpoint_ClearAllBreakpointSites",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpoint_ClearAllBreakpointSites" "', argument " "1"" of type '" "lldb::SBBreakpoint *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpoint * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->ClearAllBreakpointSites();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpoint_FindLocationByAddress(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpoint *arg1 = (lldb::SBBreakpoint *) 0 ;
  lldb::addr_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned long long val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBBreakpointLocation result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpoint_FindLocationByAddress",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpoint_FindLocationByAddress" "', argument " "1"" of type '" "lldb::SBBreakpoint *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpoint * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_long_SS_long(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBBreakpoint_FindLocationByAddress" "', argument " "2"" of type '" "lldb::addr_t""'");
  } 
  arg2 = static_cast< lldb::addr_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->FindLocationByAddress(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBBreakpointLocation(static_cast< const lldb::SBBreakpointLocation& >(result))), SWIGTYPE_p_lldb__SBBreakpointLocation, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpoint_FindLocationIDByAddress(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpoint *arg1 = (lldb::SBBreakpoint *) 0 ;
  lldb::addr_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned long long val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::break_id_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpoint_FindLocationIDByAddress",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpoint_FindLocationIDByAddress" "', argument " "1"" of type '" "lldb::SBBreakpoint *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpoint * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_long_SS_long(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBBreakpoint_FindLocationIDByAddress" "', argument " "2"" of type '" "lldb::addr_t""'");
  } 
  arg2 = static_cast< lldb::addr_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::break_id_t)(arg1)->FindLocationIDByAddress(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpoint_FindLocationByID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpoint *arg1 = (lldb::SBBreakpoint *) 0 ;
  lldb::break_id_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBBreakpointLocation result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpoint_FindLocationByID",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpoint_FindLocationByID" "', argument " "1"" of type '" "lldb::SBBreakpoint *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpoint * >(argp1);
  ecode2 = SWIG_AsVal_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBBreakpoint_FindLocationByID" "', argument " "2"" of type '" "lldb::break_id_t""'");
  } 
  arg2 = static_cast< lldb::break_id_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->FindLocationByID(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBBreakpointLocation(static_cast< const lldb::SBBreakpointLocation& >(result))), SWIGTYPE_p_lldb__SBBreakpointLocation, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpoint_GetLocationAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpoint *arg1 = (lldb::SBBreakpoint *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBBreakpointLocation result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpoint_GetLocationAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpoint_GetLocationAtIndex" "', argument " "1"" of type '" "lldb::SBBreakpoint *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpoint * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBBreakpoint_GetLocationAtIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetLocationAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBBreakpointLocation(static_cast< const lldb::SBBreakpointLocation& >(result))), SWIGTYPE_p_lldb__SBBreakpointLocation, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpoint_SetEnabled(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpoint *arg1 = (lldb::SBBreakpoint *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpoint_SetEnabled",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpoint_SetEnabled" "', argument " "1"" of type '" "lldb::SBBreakpoint *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpoint * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBBreakpoint_SetEnabled" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetEnabled(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpoint_IsEnabled(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpoint *arg1 = (lldb::SBBreakpoint *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpoint_IsEnabled",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpoint_IsEnabled" "', argument " "1"" of type '" "lldb::SBBreakpoint *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpoint * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsEnabled();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpoint_SetOneShot(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpoint *arg1 = (lldb::SBBreakpoint *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpoint_SetOneShot",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpoint_SetOneShot" "', argument " "1"" of type '" "lldb::SBBreakpoint *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpoint * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBBreakpoint_SetOneShot" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetOneShot(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpoint_IsOneShot(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpoint *arg1 = (lldb::SBBreakpoint *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpoint_IsOneShot",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpoint_IsOneShot" "', argument " "1"" of type '" "lldb::SBBreakpoint *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpoint * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsOneShot();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpoint_IsInternal(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpoint *arg1 = (lldb::SBBreakpoint *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpoint_IsInternal",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpoint_IsInternal" "', argument " "1"" of type '" "lldb::SBBreakpoint *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpoint * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsInternal();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpoint_GetHitCount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpoint *arg1 = (lldb::SBBreakpoint *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpoint_GetHitCount",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpoint_GetHitCount" "', argument " "1"" of type '" "lldb::SBBreakpoint const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpoint * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)((lldb::SBBreakpoint const *)arg1)->GetHitCount();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpoint_SetIgnoreCount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpoint *arg1 = (lldb::SBBreakpoint *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpoint_SetIgnoreCount",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpoint_SetIgnoreCount" "', argument " "1"" of type '" "lldb::SBBreakpoint *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpoint * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBBreakpoint_SetIgnoreCount" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetIgnoreCount(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpoint_GetIgnoreCount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpoint *arg1 = (lldb::SBBreakpoint *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpoint_GetIgnoreCount",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpoint_GetIgnoreCount" "', argument " "1"" of type '" "lldb::SBBreakpoint const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpoint * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)((lldb::SBBreakpoint const *)arg1)->GetIgnoreCount();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpoint_SetCondition(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpoint *arg1 = (lldb::SBBreakpoint *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpoint_SetCondition",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpoint_SetCondition" "', argument " "1"" of type '" "lldb::SBBreakpoint *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpoint * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBBreakpoint_SetCondition" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetCondition((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpoint_GetCondition(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpoint *arg1 = (lldb::SBBreakpoint *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpoint_GetCondition",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpoint_GetCondition" "', argument " "1"" of type '" "lldb::SBBreakpoint *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpoint * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetCondition();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpoint_SetAutoContinue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpoint *arg1 = (lldb::SBBreakpoint *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpoint_SetAutoContinue",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpoint_SetAutoContinue" "', argument " "1"" of type '" "lldb::SBBreakpoint *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpoint * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBBreakpoint_SetAutoContinue" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetAutoContinue(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpoint_GetAutoContinue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpoint *arg1 = (lldb::SBBreakpoint *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpoint_GetAutoContinue",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpoint_GetAutoContinue" "', argument " "1"" of type '" "lldb::SBBreakpoint *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpoint * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetAutoContinue();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpoint_SetThreadID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpoint *arg1 = (lldb::SBBreakpoint *) 0 ;
  lldb::tid_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpoint_SetThreadID",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpoint_SetThreadID" "', argument " "1"" of type '" "lldb::SBBreakpoint *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpoint * >(argp1);
  {
    using namespace lldb_private;
    if (PythonInteger::Check(obj1))
    {
      PythonInteger py_int(PyRefType::Borrowed, obj1);
      arg2 = static_cast<lldb::tid_t>(py_int.GetInteger());
    }
    else
    {
      PyErr_SetString(PyExc_ValueError, "Expecting an integer");
      return nullptr;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetThreadID(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpoint_GetThreadID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpoint *arg1 = (lldb::SBBreakpoint *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::tid_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpoint_GetThreadID",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpoint_GetThreadID" "', argument " "1"" of type '" "lldb::SBBreakpoint *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpoint * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::tid_t)(arg1)->GetThreadID();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpoint_SetThreadIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpoint *arg1 = (lldb::SBBreakpoint *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpoint_SetThreadIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpoint_SetThreadIndex" "', argument " "1"" of type '" "lldb::SBBreakpoint *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpoint * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBBreakpoint_SetThreadIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetThreadIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpoint_GetThreadIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpoint *arg1 = (lldb::SBBreakpoint *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpoint_GetThreadIndex",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpoint_GetThreadIndex" "', argument " "1"" of type '" "lldb::SBBreakpoint const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpoint * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)((lldb::SBBreakpoint const *)arg1)->GetThreadIndex();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpoint_SetThreadName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpoint *arg1 = (lldb::SBBreakpoint *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpoint_SetThreadName",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpoint_SetThreadName" "', argument " "1"" of type '" "lldb::SBBreakpoint *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpoint * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBBreakpoint_SetThreadName" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetThreadName((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpoint_GetThreadName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpoint *arg1 = (lldb::SBBreakpoint *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpoint_GetThreadName",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpoint_GetThreadName" "', argument " "1"" of type '" "lldb::SBBreakpoint const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpoint * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)((lldb::SBBreakpoint const *)arg1)->GetThreadName();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpoint_SetQueueName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpoint *arg1 = (lldb::SBBreakpoint *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpoint_SetQueueName",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpoint_SetQueueName" "', argument " "1"" of type '" "lldb::SBBreakpoint *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpoint * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBBreakpoint_SetQueueName" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetQueueName((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpoint_GetQueueName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpoint *arg1 = (lldb::SBBreakpoint *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpoint_GetQueueName",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpoint_GetQueueName" "', argument " "1"" of type '" "lldb::SBBreakpoint const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpoint * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)((lldb::SBBreakpoint const *)arg1)->GetQueueName();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpoint_SetScriptCallbackFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpoint *arg1 = (lldb::SBBreakpoint *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpoint_SetScriptCallbackFunction",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpoint_SetScriptCallbackFunction" "', argument " "1"" of type '" "lldb::SBBreakpoint *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpoint * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBBreakpoint_SetScriptCallbackFunction" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetScriptCallbackFunction((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpoint_SetScriptCallbackBody(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpoint *arg1 = (lldb::SBBreakpoint *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBError result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpoint_SetScriptCallbackBody",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpoint_SetScriptCallbackBody" "', argument " "1"" of type '" "lldb::SBBreakpoint *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpoint * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBBreakpoint_SetScriptCallbackBody" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->SetScriptCallbackBody((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBError(static_cast< const lldb::SBError& >(result))), SWIGTYPE_p_lldb__SBError, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpoint_SetCommandLineCommands(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpoint *arg1 = (lldb::SBBreakpoint *) 0 ;
  lldb::SBStringList *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpoint_SetCommandLineCommands",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpoint_SetCommandLineCommands" "', argument " "1"" of type '" "lldb::SBBreakpoint *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpoint * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStringList,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBBreakpoint_SetCommandLineCommands" "', argument " "2"" of type '" "lldb::SBStringList &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBBreakpoint_SetCommandLineCommands" "', argument " "2"" of type '" "lldb::SBStringList &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStringList * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetCommandLineCommands(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpoint_GetCommandLineCommands(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpoint *arg1 = (lldb::SBBreakpoint *) 0 ;
  lldb::SBStringList *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpoint_GetCommandLineCommands",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpoint_GetCommandLineCommands" "', argument " "1"" of type '" "lldb::SBBreakpoint *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpoint * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStringList,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBBreakpoint_GetCommandLineCommands" "', argument " "2"" of type '" "lldb::SBStringList &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBBreakpoint_GetCommandLineCommands" "', argument " "2"" of type '" "lldb::SBStringList &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStringList * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetCommandLineCommands(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpoint_AddName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpoint *arg1 = (lldb::SBBreakpoint *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpoint_AddName",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpoint_AddName" "', argument " "1"" of type '" "lldb::SBBreakpoint *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpoint * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBBreakpoint_AddName" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->AddName((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpoint_RemoveName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpoint *arg1 = (lldb::SBBreakpoint *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpoint_RemoveName",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpoint_RemoveName" "', argument " "1"" of type '" "lldb::SBBreakpoint *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpoint * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBBreakpoint_RemoveName" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->RemoveName((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpoint_MatchesName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpoint *arg1 = (lldb::SBBreakpoint *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpoint_MatchesName",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpoint_MatchesName" "', argument " "1"" of type '" "lldb::SBBreakpoint *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpoint * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBBreakpoint_MatchesName" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->MatchesName((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpoint_GetNames(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpoint *arg1 = (lldb::SBBreakpoint *) 0 ;
  lldb::SBStringList *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpoint_GetNames",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpoint_GetNames" "', argument " "1"" of type '" "lldb::SBBreakpoint *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpoint * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStringList,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBBreakpoint_GetNames" "', argument " "2"" of type '" "lldb::SBStringList &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBBreakpoint_GetNames" "', argument " "2"" of type '" "lldb::SBStringList &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStringList * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->GetNames(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpoint_GetNumResolvedLocations(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpoint *arg1 = (lldb::SBBreakpoint *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  size_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpoint_GetNumResolvedLocations",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpoint_GetNumResolvedLocations" "', argument " "1"" of type '" "lldb::SBBreakpoint const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpoint * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBBreakpoint const *)arg1)->GetNumResolvedLocations();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpoint_GetNumLocations(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpoint *arg1 = (lldb::SBBreakpoint *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  size_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpoint_GetNumLocations",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpoint_GetNumLocations" "', argument " "1"" of type '" "lldb::SBBreakpoint const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpoint * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBBreakpoint const *)arg1)->GetNumLocations();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpoint_GetDescription__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpoint *arg1 = (lldb::SBBreakpoint *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpoint_GetDescription",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpoint_GetDescription" "', argument " "1"" of type '" "lldb::SBBreakpoint *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpoint * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBBreakpoint_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBBreakpoint_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetDescription(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpoint_GetDescription__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpoint *arg1 = (lldb::SBBreakpoint *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  bool arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  bool val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBBreakpoint_GetDescription",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpoint_GetDescription" "', argument " "1"" of type '" "lldb::SBBreakpoint *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpoint * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBBreakpoint_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBBreakpoint_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  ecode3 = SWIG_AsVal_bool(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBBreakpoint_GetDescription" "', argument " "3"" of type '" "bool""'");
  } 
  arg3 = static_cast< bool >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetDescription(*arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpoint_GetDescription(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[4];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 3); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBBreakpoint, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      void *vptr = 0;
      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_lldb__SBStream, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        return _wrap_SBBreakpoint_GetDescription__SWIG_0(self, args);
      }
    }
  }
  if (argc == 3) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBBreakpoint, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      void *vptr = 0;
      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_lldb__SBStream, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        {
          int res = SWIG_AsVal_bool(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          return _wrap_SBBreakpoint_GetDescription__SWIG_1(self, args);
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBBreakpoint_GetDescription'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    GetDescription(lldb::SBBreakpoint *,lldb::SBStream &)\n"
    "    GetDescription(lldb::SBBreakpoint *,lldb::SBStream &,bool)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpoint___eq__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpoint *arg1 = (lldb::SBBreakpoint *) 0 ;
  lldb::SBBreakpoint *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpoint___eq__",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpoint___eq__" "', argument " "1"" of type '" "lldb::SBBreakpoint *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpoint * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBBreakpoint,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBBreakpoint___eq__" "', argument " "2"" of type '" "lldb::SBBreakpoint const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBBreakpoint___eq__" "', argument " "2"" of type '" "lldb::SBBreakpoint const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBBreakpoint * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->operator ==((lldb::SBBreakpoint const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpoint___ne__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpoint *arg1 = (lldb::SBBreakpoint *) 0 ;
  lldb::SBBreakpoint *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpoint___ne__",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpoint___ne__" "', argument " "1"" of type '" "lldb::SBBreakpoint *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpoint * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBBreakpoint,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBBreakpoint___ne__" "', argument " "2"" of type '" "lldb::SBBreakpoint const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBBreakpoint___ne__" "', argument " "2"" of type '" "lldb::SBBreakpoint const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBBreakpoint * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->operator !=((lldb::SBBreakpoint const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpoint_EventIsBreakpointEvent(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBEvent *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpoint_EventIsBreakpointEvent",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBEvent,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpoint_EventIsBreakpointEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBBreakpoint_EventIsBreakpointEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBEvent * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)lldb::SBBreakpoint::EventIsBreakpointEvent((lldb::SBEvent const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpoint_GetBreakpointEventTypeFromEvent(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBEvent *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::BreakpointEventType result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpoint_GetBreakpointEventTypeFromEvent",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBEvent,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpoint_GetBreakpointEventTypeFromEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBBreakpoint_GetBreakpointEventTypeFromEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBEvent * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::BreakpointEventType)lldb::SBBreakpoint::GetBreakpointEventTypeFromEvent((lldb::SBEvent const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpoint_GetBreakpointFromEvent(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBEvent *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBBreakpoint result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpoint_GetBreakpointFromEvent",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBEvent,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpoint_GetBreakpointFromEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBBreakpoint_GetBreakpointFromEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBEvent * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = lldb::SBBreakpoint::GetBreakpointFromEvent((lldb::SBEvent const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBBreakpoint(static_cast< const lldb::SBBreakpoint& >(result))), SWIGTYPE_p_lldb__SBBreakpoint, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpoint_GetBreakpointLocationAtIndexFromEvent(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBEvent *arg1 = 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBBreakpointLocation result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpoint_GetBreakpointLocationAtIndexFromEvent",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBEvent,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpoint_GetBreakpointLocationAtIndexFromEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBBreakpoint_GetBreakpointLocationAtIndexFromEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBEvent * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBBreakpoint_GetBreakpointLocationAtIndexFromEvent" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = lldb::SBBreakpoint::GetBreakpointLocationAtIndexFromEvent((lldb::SBEvent const &)*arg1,arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBBreakpointLocation(static_cast< const lldb::SBBreakpointLocation& >(result))), SWIGTYPE_p_lldb__SBBreakpointLocation, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpoint_GetNumBreakpointLocationsFromEvent(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBEvent *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpoint_GetNumBreakpointLocationsFromEvent",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBEvent,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpoint_GetNumBreakpointLocationsFromEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBBreakpoint_GetNumBreakpointLocationsFromEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBEvent * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)lldb::SBBreakpoint::GetNumBreakpointLocationsFromEvent((lldb::SBEvent const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpoint___str__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpoint *arg1 = (lldb::SBBreakpoint *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpoint___str__",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpoint___str__" "', argument " "1"" of type '" "lldb::SBBreakpoint *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpoint * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (PyObject *)lldb_SBBreakpoint___str__(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = result;
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBBreakpoint_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBBreakpoint, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBBreakpointList(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBBreakpointList *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBBreakpointList",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBTarget,  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBBreakpointList" "', argument " "1"" of type '" "lldb::SBTarget &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBBreakpointList" "', argument " "1"" of type '" "lldb::SBTarget &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBBreakpointList *)new lldb::SBBreakpointList(*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBBreakpointList, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBBreakpointList(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointList *arg1 = (lldb::SBBreakpointList *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBBreakpointList",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointList, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBBreakpointList" "', argument " "1"" of type '" "lldb::SBBreakpointList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointList * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointList_GetSize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointList *arg1 = (lldb::SBBreakpointList *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  size_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpointList_GetSize",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointList_GetSize" "', argument " "1"" of type '" "lldb::SBBreakpointList const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointList * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBBreakpointList const *)arg1)->GetSize();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointList_GetBreakpointAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointList *arg1 = (lldb::SBBreakpointList *) 0 ;
  size_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  size_t val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBBreakpoint result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpointList_GetBreakpointAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointList_GetBreakpointAtIndex" "', argument " "1"" of type '" "lldb::SBBreakpointList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointList * >(argp1);
  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBBreakpointList_GetBreakpointAtIndex" "', argument " "2"" of type '" "size_t""'");
  } 
  arg2 = static_cast< size_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetBreakpointAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBBreakpoint(static_cast< const lldb::SBBreakpoint& >(result))), SWIGTYPE_p_lldb__SBBreakpoint, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointList_FindBreakpointByID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointList *arg1 = (lldb::SBBreakpointList *) 0 ;
  lldb::break_id_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBBreakpoint result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpointList_FindBreakpointByID",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointList_FindBreakpointByID" "', argument " "1"" of type '" "lldb::SBBreakpointList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointList * >(argp1);
  ecode2 = SWIG_AsVal_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBBreakpointList_FindBreakpointByID" "', argument " "2"" of type '" "lldb::break_id_t""'");
  } 
  arg2 = static_cast< lldb::break_id_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->FindBreakpointByID(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBBreakpoint(static_cast< const lldb::SBBreakpoint& >(result))), SWIGTYPE_p_lldb__SBBreakpoint, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointList_Append(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointList *arg1 = (lldb::SBBreakpointList *) 0 ;
  lldb::SBBreakpoint *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpointList_Append",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointList_Append" "', argument " "1"" of type '" "lldb::SBBreakpointList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointList * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBBreakpoint,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBBreakpointList_Append" "', argument " "2"" of type '" "lldb::SBBreakpoint const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBBreakpointList_Append" "', argument " "2"" of type '" "lldb::SBBreakpoint const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBBreakpoint * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->Append((lldb::SBBreakpoint const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointList_AppendIfUnique(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointList *arg1 = (lldb::SBBreakpointList *) 0 ;
  lldb::SBBreakpoint *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpointList_AppendIfUnique",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointList_AppendIfUnique" "', argument " "1"" of type '" "lldb::SBBreakpointList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointList * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBBreakpoint,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBBreakpointList_AppendIfUnique" "', argument " "2"" of type '" "lldb::SBBreakpoint const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBBreakpointList_AppendIfUnique" "', argument " "2"" of type '" "lldb::SBBreakpoint const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBBreakpoint * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->AppendIfUnique((lldb::SBBreakpoint const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointList_AppendByID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointList *arg1 = (lldb::SBBreakpointList *) 0 ;
  lldb::break_id_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpointList_AppendByID",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointList_AppendByID" "', argument " "1"" of type '" "lldb::SBBreakpointList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointList * >(argp1);
  ecode2 = SWIG_AsVal_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBBreakpointList_AppendByID" "', argument " "2"" of type '" "lldb::break_id_t""'");
  } 
  arg2 = static_cast< lldb::break_id_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->AppendByID(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointList_Clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointList *arg1 = (lldb::SBBreakpointList *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpointList_Clear",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointList_Clear" "', argument " "1"" of type '" "lldb::SBBreakpointList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointList * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->Clear();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBBreakpointList_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBBreakpointList, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBBreakpointLocation__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointLocation *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBBreakpointLocation")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBBreakpointLocation *)new lldb::SBBreakpointLocation();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBBreakpointLocation, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBBreakpointLocation__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointLocation *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBBreakpointLocation *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBBreakpointLocation",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBBreakpointLocation,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBBreakpointLocation" "', argument " "1"" of type '" "lldb::SBBreakpointLocation const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBBreakpointLocation" "', argument " "1"" of type '" "lldb::SBBreakpointLocation const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointLocation * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBBreakpointLocation *)new lldb::SBBreakpointLocation((lldb::SBBreakpointLocation const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBBreakpointLocation, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBBreakpointLocation(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBBreakpointLocation__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBBreakpointLocation, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBBreakpointLocation__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBBreakpointLocation'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBBreakpointLocation()\n"
    "    lldb::SBBreakpointLocation(lldb::SBBreakpointLocation const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBBreakpointLocation(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointLocation *arg1 = (lldb::SBBreakpointLocation *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBBreakpointLocation",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointLocation, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBBreakpointLocation" "', argument " "1"" of type '" "lldb::SBBreakpointLocation *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointLocation * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointLocation_GetID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointLocation *arg1 = (lldb::SBBreakpointLocation *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::break_id_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpointLocation_GetID",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointLocation, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointLocation_GetID" "', argument " "1"" of type '" "lldb::SBBreakpointLocation *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointLocation * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::break_id_t)(arg1)->GetID();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointLocation_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointLocation *arg1 = (lldb::SBBreakpointLocation *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpointLocation_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointLocation, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointLocation_IsValid" "', argument " "1"" of type '" "lldb::SBBreakpointLocation const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointLocation * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBBreakpointLocation const *)arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointLocation_GetAddress(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointLocation *arg1 = (lldb::SBBreakpointLocation *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBAddress result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpointLocation_GetAddress",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointLocation, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointLocation_GetAddress" "', argument " "1"" of type '" "lldb::SBBreakpointLocation *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointLocation * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetAddress();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBAddress(static_cast< const lldb::SBAddress& >(result))), SWIGTYPE_p_lldb__SBAddress, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointLocation_GetLoadAddress(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointLocation *arg1 = (lldb::SBBreakpointLocation *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::addr_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpointLocation_GetLoadAddress",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointLocation, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointLocation_GetLoadAddress" "', argument " "1"" of type '" "lldb::SBBreakpointLocation *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointLocation * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::addr_t)(arg1)->GetLoadAddress();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointLocation_SetEnabled(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointLocation *arg1 = (lldb::SBBreakpointLocation *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpointLocation_SetEnabled",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointLocation, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointLocation_SetEnabled" "', argument " "1"" of type '" "lldb::SBBreakpointLocation *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointLocation * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBBreakpointLocation_SetEnabled" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetEnabled(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointLocation_IsEnabled(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointLocation *arg1 = (lldb::SBBreakpointLocation *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpointLocation_IsEnabled",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointLocation, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointLocation_IsEnabled" "', argument " "1"" of type '" "lldb::SBBreakpointLocation *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointLocation * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsEnabled();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointLocation_GetHitCount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointLocation *arg1 = (lldb::SBBreakpointLocation *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpointLocation_GetHitCount",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointLocation, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointLocation_GetHitCount" "', argument " "1"" of type '" "lldb::SBBreakpointLocation *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointLocation * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetHitCount();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointLocation_GetIgnoreCount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointLocation *arg1 = (lldb::SBBreakpointLocation *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpointLocation_GetIgnoreCount",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointLocation, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointLocation_GetIgnoreCount" "', argument " "1"" of type '" "lldb::SBBreakpointLocation *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointLocation * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetIgnoreCount();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointLocation_SetIgnoreCount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointLocation *arg1 = (lldb::SBBreakpointLocation *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpointLocation_SetIgnoreCount",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointLocation, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointLocation_SetIgnoreCount" "', argument " "1"" of type '" "lldb::SBBreakpointLocation *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointLocation * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBBreakpointLocation_SetIgnoreCount" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetIgnoreCount(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointLocation_SetCondition(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointLocation *arg1 = (lldb::SBBreakpointLocation *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpointLocation_SetCondition",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointLocation, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointLocation_SetCondition" "', argument " "1"" of type '" "lldb::SBBreakpointLocation *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointLocation * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBBreakpointLocation_SetCondition" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetCondition((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointLocation_GetCondition(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointLocation *arg1 = (lldb::SBBreakpointLocation *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpointLocation_GetCondition",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointLocation, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointLocation_GetCondition" "', argument " "1"" of type '" "lldb::SBBreakpointLocation *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointLocation * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetCondition();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointLocation_GetAutoContinue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointLocation *arg1 = (lldb::SBBreakpointLocation *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpointLocation_GetAutoContinue",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointLocation, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointLocation_GetAutoContinue" "', argument " "1"" of type '" "lldb::SBBreakpointLocation *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointLocation * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetAutoContinue();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointLocation_SetAutoContinue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointLocation *arg1 = (lldb::SBBreakpointLocation *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpointLocation_SetAutoContinue",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointLocation, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointLocation_SetAutoContinue" "', argument " "1"" of type '" "lldb::SBBreakpointLocation *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointLocation * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBBreakpointLocation_SetAutoContinue" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetAutoContinue(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointLocation_SetScriptCallbackFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointLocation *arg1 = (lldb::SBBreakpointLocation *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpointLocation_SetScriptCallbackFunction",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointLocation, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointLocation_SetScriptCallbackFunction" "', argument " "1"" of type '" "lldb::SBBreakpointLocation *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointLocation * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBBreakpointLocation_SetScriptCallbackFunction" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetScriptCallbackFunction((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointLocation_SetScriptCallbackBody(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointLocation *arg1 = (lldb::SBBreakpointLocation *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBError result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpointLocation_SetScriptCallbackBody",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointLocation, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointLocation_SetScriptCallbackBody" "', argument " "1"" of type '" "lldb::SBBreakpointLocation *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointLocation * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBBreakpointLocation_SetScriptCallbackBody" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->SetScriptCallbackBody((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBError(static_cast< const lldb::SBError& >(result))), SWIGTYPE_p_lldb__SBError, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointLocation_SetCommandLineCommands(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointLocation *arg1 = (lldb::SBBreakpointLocation *) 0 ;
  lldb::SBStringList *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpointLocation_SetCommandLineCommands",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointLocation, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointLocation_SetCommandLineCommands" "', argument " "1"" of type '" "lldb::SBBreakpointLocation *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointLocation * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStringList,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBBreakpointLocation_SetCommandLineCommands" "', argument " "2"" of type '" "lldb::SBStringList &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBBreakpointLocation_SetCommandLineCommands" "', argument " "2"" of type '" "lldb::SBStringList &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStringList * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetCommandLineCommands(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointLocation_GetCommandLineCommands(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointLocation *arg1 = (lldb::SBBreakpointLocation *) 0 ;
  lldb::SBStringList *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpointLocation_GetCommandLineCommands",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointLocation, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointLocation_GetCommandLineCommands" "', argument " "1"" of type '" "lldb::SBBreakpointLocation *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointLocation * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStringList,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBBreakpointLocation_GetCommandLineCommands" "', argument " "2"" of type '" "lldb::SBStringList &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBBreakpointLocation_GetCommandLineCommands" "', argument " "2"" of type '" "lldb::SBStringList &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStringList * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetCommandLineCommands(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointLocation_SetThreadID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointLocation *arg1 = (lldb::SBBreakpointLocation *) 0 ;
  lldb::tid_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpointLocation_SetThreadID",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointLocation, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointLocation_SetThreadID" "', argument " "1"" of type '" "lldb::SBBreakpointLocation *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointLocation * >(argp1);
  {
    using namespace lldb_private;
    if (PythonInteger::Check(obj1))
    {
      PythonInteger py_int(PyRefType::Borrowed, obj1);
      arg2 = static_cast<lldb::tid_t>(py_int.GetInteger());
    }
    else
    {
      PyErr_SetString(PyExc_ValueError, "Expecting an integer");
      return nullptr;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetThreadID(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointLocation_GetThreadID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointLocation *arg1 = (lldb::SBBreakpointLocation *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::tid_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpointLocation_GetThreadID",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointLocation, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointLocation_GetThreadID" "', argument " "1"" of type '" "lldb::SBBreakpointLocation *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointLocation * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::tid_t)(arg1)->GetThreadID();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointLocation_SetThreadIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointLocation *arg1 = (lldb::SBBreakpointLocation *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpointLocation_SetThreadIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointLocation, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointLocation_SetThreadIndex" "', argument " "1"" of type '" "lldb::SBBreakpointLocation *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointLocation * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBBreakpointLocation_SetThreadIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetThreadIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointLocation_GetThreadIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointLocation *arg1 = (lldb::SBBreakpointLocation *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpointLocation_GetThreadIndex",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointLocation, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointLocation_GetThreadIndex" "', argument " "1"" of type '" "lldb::SBBreakpointLocation const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointLocation * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)((lldb::SBBreakpointLocation const *)arg1)->GetThreadIndex();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointLocation_SetThreadName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointLocation *arg1 = (lldb::SBBreakpointLocation *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpointLocation_SetThreadName",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointLocation, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointLocation_SetThreadName" "', argument " "1"" of type '" "lldb::SBBreakpointLocation *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointLocation * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBBreakpointLocation_SetThreadName" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetThreadName((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointLocation_GetThreadName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointLocation *arg1 = (lldb::SBBreakpointLocation *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpointLocation_GetThreadName",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointLocation, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointLocation_GetThreadName" "', argument " "1"" of type '" "lldb::SBBreakpointLocation const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointLocation * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)((lldb::SBBreakpointLocation const *)arg1)->GetThreadName();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointLocation_SetQueueName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointLocation *arg1 = (lldb::SBBreakpointLocation *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpointLocation_SetQueueName",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointLocation, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointLocation_SetQueueName" "', argument " "1"" of type '" "lldb::SBBreakpointLocation *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointLocation * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBBreakpointLocation_SetQueueName" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetQueueName((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointLocation_GetQueueName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointLocation *arg1 = (lldb::SBBreakpointLocation *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpointLocation_GetQueueName",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointLocation, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointLocation_GetQueueName" "', argument " "1"" of type '" "lldb::SBBreakpointLocation const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointLocation * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)((lldb::SBBreakpointLocation const *)arg1)->GetQueueName();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointLocation_IsResolved(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointLocation *arg1 = (lldb::SBBreakpointLocation *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpointLocation_IsResolved",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointLocation, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointLocation_IsResolved" "', argument " "1"" of type '" "lldb::SBBreakpointLocation *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointLocation * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsResolved();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointLocation_GetDescription(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointLocation *arg1 = (lldb::SBBreakpointLocation *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  lldb::DescriptionLevel arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  int val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBBreakpointLocation_GetDescription",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointLocation, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointLocation_GetDescription" "', argument " "1"" of type '" "lldb::SBBreakpointLocation *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointLocation * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBBreakpointLocation_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBBreakpointLocation_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  ecode3 = SWIG_AsVal_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBBreakpointLocation_GetDescription" "', argument " "3"" of type '" "lldb::DescriptionLevel""'");
  } 
  arg3 = static_cast< lldb::DescriptionLevel >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetDescription(*arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointLocation_GetBreakpoint(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointLocation *arg1 = (lldb::SBBreakpointLocation *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBBreakpoint result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpointLocation_GetBreakpoint",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointLocation, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointLocation_GetBreakpoint" "', argument " "1"" of type '" "lldb::SBBreakpointLocation *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointLocation * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetBreakpoint();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBBreakpoint(static_cast< const lldb::SBBreakpoint& >(result))), SWIGTYPE_p_lldb__SBBreakpoint, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointLocation___str__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointLocation *arg1 = (lldb::SBBreakpointLocation *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpointLocation___str__",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointLocation, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointLocation___str__" "', argument " "1"" of type '" "lldb::SBBreakpointLocation *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointLocation * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (PyObject *)lldb_SBBreakpointLocation___str__(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = result;
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBBreakpointLocation_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBBreakpointLocation, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBBreakpointName__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointName *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBBreakpointName")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBBreakpointName *)new lldb::SBBreakpointName();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBBreakpointName, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBBreakpointName__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBBreakpointName *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:new_SBBreakpointName",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBTarget,  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBBreakpointName" "', argument " "1"" of type '" "lldb::SBTarget &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBBreakpointName" "', argument " "1"" of type '" "lldb::SBTarget &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_SBBreakpointName" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBBreakpointName *)new lldb::SBBreakpointName(*arg1,(char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBBreakpointName, SWIG_POINTER_NEW |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBBreakpointName__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpoint *arg1 = 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBBreakpointName *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:new_SBBreakpointName",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBBreakpoint,  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBBreakpointName" "', argument " "1"" of type '" "lldb::SBBreakpoint &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBBreakpointName" "', argument " "1"" of type '" "lldb::SBBreakpoint &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpoint * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_SBBreakpointName" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBBreakpointName *)new lldb::SBBreakpointName(*arg1,(char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBBreakpointName, SWIG_POINTER_NEW |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBBreakpointName__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointName *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBBreakpointName *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBBreakpointName",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBBreakpointName,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBBreakpointName" "', argument " "1"" of type '" "lldb::SBBreakpointName const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBBreakpointName" "', argument " "1"" of type '" "lldb::SBBreakpointName const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointName * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBBreakpointName *)new lldb::SBBreakpointName((lldb::SBBreakpointName const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBBreakpointName, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBBreakpointName(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[3];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 2); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBBreakpointName__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBBreakpointName, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBBreakpointName__SWIG_3(self, args);
    }
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBBreakpoint, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        return _wrap_new_SBBreakpointName__SWIG_2(self, args);
      }
    }
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBTarget, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        return _wrap_new_SBBreakpointName__SWIG_1(self, args);
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBBreakpointName'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBBreakpointName()\n"
    "    lldb::SBBreakpointName(lldb::SBTarget &,char const *)\n"
    "    lldb::SBBreakpointName(lldb::SBBreakpoint &,char const *)\n"
    "    lldb::SBBreakpointName(lldb::SBBreakpointName const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBBreakpointName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointName *arg1 = (lldb::SBBreakpointName *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBBreakpointName",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointName, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBBreakpointName" "', argument " "1"" of type '" "lldb::SBBreakpointName *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointName * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointName___eq__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointName *arg1 = (lldb::SBBreakpointName *) 0 ;
  lldb::SBBreakpointName *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpointName___eq__",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointName, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointName___eq__" "', argument " "1"" of type '" "lldb::SBBreakpointName *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointName * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBBreakpointName,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBBreakpointName___eq__" "', argument " "2"" of type '" "lldb::SBBreakpointName const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBBreakpointName___eq__" "', argument " "2"" of type '" "lldb::SBBreakpointName const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBBreakpointName * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->operator ==((lldb::SBBreakpointName const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointName___ne__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointName *arg1 = (lldb::SBBreakpointName *) 0 ;
  lldb::SBBreakpointName *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpointName___ne__",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointName, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointName___ne__" "', argument " "1"" of type '" "lldb::SBBreakpointName *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointName * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBBreakpointName,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBBreakpointName___ne__" "', argument " "2"" of type '" "lldb::SBBreakpointName const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBBreakpointName___ne__" "', argument " "2"" of type '" "lldb::SBBreakpointName const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBBreakpointName * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->operator !=((lldb::SBBreakpointName const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointName_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointName *arg1 = (lldb::SBBreakpointName *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpointName_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointName, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointName_IsValid" "', argument " "1"" of type '" "lldb::SBBreakpointName const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointName * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBBreakpointName const *)arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointName_GetName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointName *arg1 = (lldb::SBBreakpointName *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpointName_GetName",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointName, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointName_GetName" "', argument " "1"" of type '" "lldb::SBBreakpointName const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointName * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)((lldb::SBBreakpointName const *)arg1)->GetName();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointName_SetEnabled(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointName *arg1 = (lldb::SBBreakpointName *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpointName_SetEnabled",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointName, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointName_SetEnabled" "', argument " "1"" of type '" "lldb::SBBreakpointName *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointName * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBBreakpointName_SetEnabled" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetEnabled(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointName_IsEnabled(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointName *arg1 = (lldb::SBBreakpointName *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpointName_IsEnabled",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointName, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointName_IsEnabled" "', argument " "1"" of type '" "lldb::SBBreakpointName *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointName * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsEnabled();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointName_SetOneShot(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointName *arg1 = (lldb::SBBreakpointName *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpointName_SetOneShot",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointName, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointName_SetOneShot" "', argument " "1"" of type '" "lldb::SBBreakpointName *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointName * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBBreakpointName_SetOneShot" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetOneShot(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointName_IsOneShot(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointName *arg1 = (lldb::SBBreakpointName *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpointName_IsOneShot",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointName, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointName_IsOneShot" "', argument " "1"" of type '" "lldb::SBBreakpointName const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointName * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBBreakpointName const *)arg1)->IsOneShot();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointName_SetIgnoreCount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointName *arg1 = (lldb::SBBreakpointName *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpointName_SetIgnoreCount",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointName, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointName_SetIgnoreCount" "', argument " "1"" of type '" "lldb::SBBreakpointName *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointName * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBBreakpointName_SetIgnoreCount" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetIgnoreCount(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointName_GetIgnoreCount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointName *arg1 = (lldb::SBBreakpointName *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpointName_GetIgnoreCount",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointName, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointName_GetIgnoreCount" "', argument " "1"" of type '" "lldb::SBBreakpointName const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointName * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)((lldb::SBBreakpointName const *)arg1)->GetIgnoreCount();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointName_SetCondition(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointName *arg1 = (lldb::SBBreakpointName *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpointName_SetCondition",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointName, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointName_SetCondition" "', argument " "1"" of type '" "lldb::SBBreakpointName *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointName * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBBreakpointName_SetCondition" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetCondition((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointName_GetCondition(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointName *arg1 = (lldb::SBBreakpointName *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpointName_GetCondition",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointName, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointName_GetCondition" "', argument " "1"" of type '" "lldb::SBBreakpointName *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointName * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetCondition();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointName_SetAutoContinue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointName *arg1 = (lldb::SBBreakpointName *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpointName_SetAutoContinue",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointName, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointName_SetAutoContinue" "', argument " "1"" of type '" "lldb::SBBreakpointName *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointName * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBBreakpointName_SetAutoContinue" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetAutoContinue(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointName_GetAutoContinue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointName *arg1 = (lldb::SBBreakpointName *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpointName_GetAutoContinue",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointName, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointName_GetAutoContinue" "', argument " "1"" of type '" "lldb::SBBreakpointName *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointName * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetAutoContinue();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointName_SetThreadID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointName *arg1 = (lldb::SBBreakpointName *) 0 ;
  lldb::tid_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpointName_SetThreadID",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointName, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointName_SetThreadID" "', argument " "1"" of type '" "lldb::SBBreakpointName *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointName * >(argp1);
  {
    using namespace lldb_private;
    if (PythonInteger::Check(obj1))
    {
      PythonInteger py_int(PyRefType::Borrowed, obj1);
      arg2 = static_cast<lldb::tid_t>(py_int.GetInteger());
    }
    else
    {
      PyErr_SetString(PyExc_ValueError, "Expecting an integer");
      return nullptr;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetThreadID(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointName_GetThreadID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointName *arg1 = (lldb::SBBreakpointName *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::tid_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpointName_GetThreadID",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointName, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointName_GetThreadID" "', argument " "1"" of type '" "lldb::SBBreakpointName *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointName * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::tid_t)(arg1)->GetThreadID();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointName_SetThreadIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointName *arg1 = (lldb::SBBreakpointName *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpointName_SetThreadIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointName, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointName_SetThreadIndex" "', argument " "1"" of type '" "lldb::SBBreakpointName *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointName * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBBreakpointName_SetThreadIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetThreadIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointName_GetThreadIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointName *arg1 = (lldb::SBBreakpointName *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpointName_GetThreadIndex",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointName, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointName_GetThreadIndex" "', argument " "1"" of type '" "lldb::SBBreakpointName const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointName * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)((lldb::SBBreakpointName const *)arg1)->GetThreadIndex();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointName_SetThreadName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointName *arg1 = (lldb::SBBreakpointName *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpointName_SetThreadName",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointName, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointName_SetThreadName" "', argument " "1"" of type '" "lldb::SBBreakpointName *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointName * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBBreakpointName_SetThreadName" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetThreadName((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointName_GetThreadName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointName *arg1 = (lldb::SBBreakpointName *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpointName_GetThreadName",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointName, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointName_GetThreadName" "', argument " "1"" of type '" "lldb::SBBreakpointName const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointName * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)((lldb::SBBreakpointName const *)arg1)->GetThreadName();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointName_SetQueueName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointName *arg1 = (lldb::SBBreakpointName *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpointName_SetQueueName",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointName, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointName_SetQueueName" "', argument " "1"" of type '" "lldb::SBBreakpointName *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointName * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBBreakpointName_SetQueueName" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetQueueName((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointName_GetQueueName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointName *arg1 = (lldb::SBBreakpointName *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpointName_GetQueueName",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointName, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointName_GetQueueName" "', argument " "1"" of type '" "lldb::SBBreakpointName const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointName * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)((lldb::SBBreakpointName const *)arg1)->GetQueueName();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointName_SetScriptCallbackFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointName *arg1 = (lldb::SBBreakpointName *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpointName_SetScriptCallbackFunction",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointName, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointName_SetScriptCallbackFunction" "', argument " "1"" of type '" "lldb::SBBreakpointName *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointName * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBBreakpointName_SetScriptCallbackFunction" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetScriptCallbackFunction((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointName_SetCommandLineCommands(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointName *arg1 = (lldb::SBBreakpointName *) 0 ;
  lldb::SBStringList *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpointName_SetCommandLineCommands",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointName, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointName_SetCommandLineCommands" "', argument " "1"" of type '" "lldb::SBBreakpointName *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointName * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStringList,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBBreakpointName_SetCommandLineCommands" "', argument " "2"" of type '" "lldb::SBStringList &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBBreakpointName_SetCommandLineCommands" "', argument " "2"" of type '" "lldb::SBStringList &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStringList * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetCommandLineCommands(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointName_GetCommandLineCommands(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointName *arg1 = (lldb::SBBreakpointName *) 0 ;
  lldb::SBStringList *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpointName_GetCommandLineCommands",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointName, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointName_GetCommandLineCommands" "', argument " "1"" of type '" "lldb::SBBreakpointName *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointName * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStringList,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBBreakpointName_GetCommandLineCommands" "', argument " "2"" of type '" "lldb::SBStringList &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBBreakpointName_GetCommandLineCommands" "', argument " "2"" of type '" "lldb::SBStringList &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStringList * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetCommandLineCommands(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointName_SetScriptCallbackBody(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointName *arg1 = (lldb::SBBreakpointName *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBError result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpointName_SetScriptCallbackBody",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointName, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointName_SetScriptCallbackBody" "', argument " "1"" of type '" "lldb::SBBreakpointName *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointName * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBBreakpointName_SetScriptCallbackBody" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->SetScriptCallbackBody((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBError(static_cast< const lldb::SBError& >(result))), SWIGTYPE_p_lldb__SBError, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointName_GetHelpString(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointName *arg1 = (lldb::SBBreakpointName *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpointName_GetHelpString",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointName, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointName_GetHelpString" "', argument " "1"" of type '" "lldb::SBBreakpointName const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointName * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)((lldb::SBBreakpointName const *)arg1)->GetHelpString();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointName_SetHelpString(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointName *arg1 = (lldb::SBBreakpointName *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpointName_SetHelpString",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointName, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointName_SetHelpString" "', argument " "1"" of type '" "lldb::SBBreakpointName *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointName * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBBreakpointName_SetHelpString" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetHelpString((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointName_GetAllowList(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointName *arg1 = (lldb::SBBreakpointName *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpointName_GetAllowList",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointName, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointName_GetAllowList" "', argument " "1"" of type '" "lldb::SBBreakpointName const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointName * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBBreakpointName const *)arg1)->GetAllowList();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointName_SetAllowList(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointName *arg1 = (lldb::SBBreakpointName *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpointName_SetAllowList",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointName, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointName_SetAllowList" "', argument " "1"" of type '" "lldb::SBBreakpointName *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointName * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBBreakpointName_SetAllowList" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetAllowList(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointName_GetAllowDelete(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointName *arg1 = (lldb::SBBreakpointName *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpointName_GetAllowDelete",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointName, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointName_GetAllowDelete" "', argument " "1"" of type '" "lldb::SBBreakpointName *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointName * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetAllowDelete();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointName_SetAllowDelete(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointName *arg1 = (lldb::SBBreakpointName *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpointName_SetAllowDelete",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointName, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointName_SetAllowDelete" "', argument " "1"" of type '" "lldb::SBBreakpointName *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointName * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBBreakpointName_SetAllowDelete" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetAllowDelete(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointName_GetAllowDisable(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointName *arg1 = (lldb::SBBreakpointName *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpointName_GetAllowDisable",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointName, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointName_GetAllowDisable" "', argument " "1"" of type '" "lldb::SBBreakpointName *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointName * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetAllowDisable();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointName_SetAllowDisable(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointName *arg1 = (lldb::SBBreakpointName *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpointName_SetAllowDisable",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointName, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointName_SetAllowDisable" "', argument " "1"" of type '" "lldb::SBBreakpointName *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointName * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBBreakpointName_SetAllowDisable" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetAllowDisable(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointName_GetDescription(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointName *arg1 = (lldb::SBBreakpointName *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBreakpointName_GetDescription",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointName, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointName_GetDescription" "', argument " "1"" of type '" "lldb::SBBreakpointName *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointName * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBBreakpointName_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBBreakpointName_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetDescription(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBreakpointName___str__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBreakpointName *arg1 = (lldb::SBBreakpointName *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBreakpointName___str__",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBreakpointName, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBreakpointName___str__" "', argument " "1"" of type '" "lldb::SBBreakpointName *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBreakpointName * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (PyObject *)lldb_SBBreakpointName___str__(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = result;
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBBreakpointName_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBBreakpointName, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBBroadcaster__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBroadcaster *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBBroadcaster")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBBroadcaster *)new lldb::SBBroadcaster();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBBroadcaster, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBBroadcaster__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  char *arg1 = (char *) 0 ;
  int res1 ;
  char *buf1 = 0 ;
  int alloc1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBBroadcaster *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBBroadcaster",&obj0)) SWIG_fail;
  res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBBroadcaster" "', argument " "1"" of type '" "char const *""'");
  }
  arg1 = reinterpret_cast< char * >(buf1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBBroadcaster *)new lldb::SBBroadcaster((char const *)arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBBroadcaster, SWIG_POINTER_NEW |  0 );
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return resultobj;
fail:
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBBroadcaster__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBroadcaster *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBBroadcaster *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBBroadcaster",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBBroadcaster,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBBroadcaster" "', argument " "1"" of type '" "lldb::SBBroadcaster const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBBroadcaster" "', argument " "1"" of type '" "lldb::SBBroadcaster const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBroadcaster * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBBroadcaster *)new lldb::SBBroadcaster((lldb::SBBroadcaster const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBBroadcaster, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBBroadcaster(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBBroadcaster__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBBroadcaster, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBBroadcaster__SWIG_2(self, args);
    }
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_AsCharPtrAndSize(argv[0], 0, NULL, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBBroadcaster__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBBroadcaster'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBBroadcaster()\n"
    "    lldb::SBBroadcaster(char const *)\n"
    "    lldb::SBBroadcaster(lldb::SBBroadcaster const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBBroadcaster(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBroadcaster *arg1 = (lldb::SBBroadcaster *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBBroadcaster",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBroadcaster, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBBroadcaster" "', argument " "1"" of type '" "lldb::SBBroadcaster *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBroadcaster * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBroadcaster_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBroadcaster *arg1 = (lldb::SBBroadcaster *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBroadcaster_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBroadcaster, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBroadcaster_IsValid" "', argument " "1"" of type '" "lldb::SBBroadcaster const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBroadcaster * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBBroadcaster const *)arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBroadcaster_Clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBroadcaster *arg1 = (lldb::SBBroadcaster *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBroadcaster_Clear",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBroadcaster, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBroadcaster_Clear" "', argument " "1"" of type '" "lldb::SBBroadcaster *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBroadcaster * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->Clear();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBroadcaster_BroadcastEventByType__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBroadcaster *arg1 = (lldb::SBBroadcaster *) 0 ;
  uint32_t arg2 ;
  bool arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  bool val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBBroadcaster_BroadcastEventByType",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBroadcaster, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBroadcaster_BroadcastEventByType" "', argument " "1"" of type '" "lldb::SBBroadcaster *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBroadcaster * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBBroadcaster_BroadcastEventByType" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  ecode3 = SWIG_AsVal_bool(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBBroadcaster_BroadcastEventByType" "', argument " "3"" of type '" "bool""'");
  } 
  arg3 = static_cast< bool >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->BroadcastEventByType(arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBroadcaster_BroadcastEventByType__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBroadcaster *arg1 = (lldb::SBBroadcaster *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBroadcaster_BroadcastEventByType",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBroadcaster, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBroadcaster_BroadcastEventByType" "', argument " "1"" of type '" "lldb::SBBroadcaster *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBroadcaster * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBBroadcaster_BroadcastEventByType" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->BroadcastEventByType(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBroadcaster_BroadcastEventByType(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[4];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 3); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBBroadcaster, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_unsigned_SS_int(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        return _wrap_SBBroadcaster_BroadcastEventByType__SWIG_1(self, args);
      }
    }
  }
  if (argc == 3) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBBroadcaster, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_unsigned_SS_int(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        {
          int res = SWIG_AsVal_bool(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          return _wrap_SBBroadcaster_BroadcastEventByType__SWIG_0(self, args);
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBBroadcaster_BroadcastEventByType'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    BroadcastEventByType(lldb::SBBroadcaster *,uint32_t,bool)\n"
    "    BroadcastEventByType(lldb::SBBroadcaster *,uint32_t)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBroadcaster_BroadcastEvent__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBroadcaster *arg1 = (lldb::SBBroadcaster *) 0 ;
  lldb::SBEvent *arg2 = 0 ;
  bool arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  bool val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBBroadcaster_BroadcastEvent",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBroadcaster, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBroadcaster_BroadcastEvent" "', argument " "1"" of type '" "lldb::SBBroadcaster *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBroadcaster * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBEvent,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBBroadcaster_BroadcastEvent" "', argument " "2"" of type '" "lldb::SBEvent const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBBroadcaster_BroadcastEvent" "', argument " "2"" of type '" "lldb::SBEvent const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBEvent * >(argp2);
  ecode3 = SWIG_AsVal_bool(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBBroadcaster_BroadcastEvent" "', argument " "3"" of type '" "bool""'");
  } 
  arg3 = static_cast< bool >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->BroadcastEvent((lldb::SBEvent const &)*arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBroadcaster_BroadcastEvent__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBroadcaster *arg1 = (lldb::SBBroadcaster *) 0 ;
  lldb::SBEvent *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBroadcaster_BroadcastEvent",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBroadcaster, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBroadcaster_BroadcastEvent" "', argument " "1"" of type '" "lldb::SBBroadcaster *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBroadcaster * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBEvent,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBBroadcaster_BroadcastEvent" "', argument " "2"" of type '" "lldb::SBEvent const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBBroadcaster_BroadcastEvent" "', argument " "2"" of type '" "lldb::SBEvent const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBEvent * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->BroadcastEvent((lldb::SBEvent const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBroadcaster_BroadcastEvent(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[4];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 3); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBBroadcaster, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_lldb__SBEvent, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        return _wrap_SBBroadcaster_BroadcastEvent__SWIG_1(self, args);
      }
    }
  }
  if (argc == 3) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBBroadcaster, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_lldb__SBEvent, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        {
          int res = SWIG_AsVal_bool(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          return _wrap_SBBroadcaster_BroadcastEvent__SWIG_0(self, args);
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBBroadcaster_BroadcastEvent'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    BroadcastEvent(lldb::SBBroadcaster *,lldb::SBEvent const &,bool)\n"
    "    BroadcastEvent(lldb::SBBroadcaster *,lldb::SBEvent const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBroadcaster_AddInitialEventsToListener(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBroadcaster *arg1 = (lldb::SBBroadcaster *) 0 ;
  lldb::SBListener *arg2 = 0 ;
  uint32_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  unsigned int val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBBroadcaster_AddInitialEventsToListener",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBroadcaster, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBroadcaster_AddInitialEventsToListener" "', argument " "1"" of type '" "lldb::SBBroadcaster *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBroadcaster * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBListener,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBBroadcaster_AddInitialEventsToListener" "', argument " "2"" of type '" "lldb::SBListener const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBBroadcaster_AddInitialEventsToListener" "', argument " "2"" of type '" "lldb::SBListener const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBListener * >(argp2);
  ecode3 = SWIG_AsVal_unsigned_SS_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBBroadcaster_AddInitialEventsToListener" "', argument " "3"" of type '" "uint32_t""'");
  } 
  arg3 = static_cast< uint32_t >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->AddInitialEventsToListener((lldb::SBListener const &)*arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBroadcaster_AddListener(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBroadcaster *arg1 = (lldb::SBBroadcaster *) 0 ;
  lldb::SBListener *arg2 = 0 ;
  uint32_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  unsigned int val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBBroadcaster_AddListener",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBroadcaster, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBroadcaster_AddListener" "', argument " "1"" of type '" "lldb::SBBroadcaster *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBroadcaster * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBListener,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBBroadcaster_AddListener" "', argument " "2"" of type '" "lldb::SBListener const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBBroadcaster_AddListener" "', argument " "2"" of type '" "lldb::SBListener const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBListener * >(argp2);
  ecode3 = SWIG_AsVal_unsigned_SS_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBBroadcaster_AddListener" "', argument " "3"" of type '" "uint32_t""'");
  } 
  arg3 = static_cast< uint32_t >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->AddListener((lldb::SBListener const &)*arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBroadcaster_GetName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBroadcaster *arg1 = (lldb::SBBroadcaster *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBBroadcaster_GetName",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBroadcaster, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBroadcaster_GetName" "', argument " "1"" of type '" "lldb::SBBroadcaster const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBroadcaster * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)((lldb::SBBroadcaster const *)arg1)->GetName();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBroadcaster_EventTypeHasListeners(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBroadcaster *arg1 = (lldb::SBBroadcaster *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBroadcaster_EventTypeHasListeners",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBroadcaster, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBroadcaster_EventTypeHasListeners" "', argument " "1"" of type '" "lldb::SBBroadcaster *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBroadcaster * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBBroadcaster_EventTypeHasListeners" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->EventTypeHasListeners(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBroadcaster_RemoveListener__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBroadcaster *arg1 = (lldb::SBBroadcaster *) 0 ;
  lldb::SBListener *arg2 = 0 ;
  uint32_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  unsigned int val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBBroadcaster_RemoveListener",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBroadcaster, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBroadcaster_RemoveListener" "', argument " "1"" of type '" "lldb::SBBroadcaster *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBroadcaster * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBListener,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBBroadcaster_RemoveListener" "', argument " "2"" of type '" "lldb::SBListener const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBBroadcaster_RemoveListener" "', argument " "2"" of type '" "lldb::SBListener const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBListener * >(argp2);
  ecode3 = SWIG_AsVal_unsigned_SS_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBBroadcaster_RemoveListener" "', argument " "3"" of type '" "uint32_t""'");
  } 
  arg3 = static_cast< uint32_t >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->RemoveListener((lldb::SBListener const &)*arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBroadcaster_RemoveListener__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBroadcaster *arg1 = (lldb::SBBroadcaster *) 0 ;
  lldb::SBListener *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBroadcaster_RemoveListener",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBroadcaster, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBroadcaster_RemoveListener" "', argument " "1"" of type '" "lldb::SBBroadcaster *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBroadcaster * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBListener,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBBroadcaster_RemoveListener" "', argument " "2"" of type '" "lldb::SBListener const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBBroadcaster_RemoveListener" "', argument " "2"" of type '" "lldb::SBListener const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBListener * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->RemoveListener((lldb::SBListener const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBroadcaster_RemoveListener(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[4];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 3); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBBroadcaster, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_lldb__SBListener, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        return _wrap_SBBroadcaster_RemoveListener__SWIG_1(self, args);
      }
    }
  }
  if (argc == 3) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBBroadcaster, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_lldb__SBListener, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        {
          int res = SWIG_AsVal_unsigned_SS_int(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          return _wrap_SBBroadcaster_RemoveListener__SWIG_0(self, args);
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBBroadcaster_RemoveListener'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    RemoveListener(lldb::SBBroadcaster *,lldb::SBListener const &,uint32_t)\n"
    "    RemoveListener(lldb::SBBroadcaster *,lldb::SBListener const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBroadcaster___eq__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBroadcaster *arg1 = (lldb::SBBroadcaster *) 0 ;
  lldb::SBBroadcaster *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBroadcaster___eq__",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBroadcaster, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBroadcaster___eq__" "', argument " "1"" of type '" "lldb::SBBroadcaster const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBroadcaster * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBBroadcaster,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBBroadcaster___eq__" "', argument " "2"" of type '" "lldb::SBBroadcaster const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBBroadcaster___eq__" "', argument " "2"" of type '" "lldb::SBBroadcaster const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBBroadcaster * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBBroadcaster const *)arg1)->operator ==((lldb::SBBroadcaster const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBBroadcaster___ne__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBBroadcaster *arg1 = (lldb::SBBroadcaster *) 0 ;
  lldb::SBBroadcaster *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBBroadcaster___ne__",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBBroadcaster, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBBroadcaster___ne__" "', argument " "1"" of type '" "lldb::SBBroadcaster const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBBroadcaster * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBBroadcaster,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBBroadcaster___ne__" "', argument " "2"" of type '" "lldb::SBBroadcaster const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBBroadcaster___ne__" "', argument " "2"" of type '" "lldb::SBBroadcaster const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBBroadcaster * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBBroadcaster const *)arg1)->operator !=((lldb::SBBroadcaster const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBBroadcaster_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBBroadcaster, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBCommandInterpreterRunOptions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandInterpreterRunOptions *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBCommandInterpreterRunOptions")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBCommandInterpreterRunOptions *)new lldb::SBCommandInterpreterRunOptions();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBCommandInterpreterRunOptions, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBCommandInterpreterRunOptions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandInterpreterRunOptions *arg1 = (lldb::SBCommandInterpreterRunOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBCommandInterpreterRunOptions",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandInterpreterRunOptions, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBCommandInterpreterRunOptions" "', argument " "1"" of type '" "lldb::SBCommandInterpreterRunOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandInterpreterRunOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandInterpreterRunOptions_GetStopOnContinue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandInterpreterRunOptions *arg1 = (lldb::SBCommandInterpreterRunOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBCommandInterpreterRunOptions_GetStopOnContinue",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandInterpreterRunOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandInterpreterRunOptions_GetStopOnContinue" "', argument " "1"" of type '" "lldb::SBCommandInterpreterRunOptions const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandInterpreterRunOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBCommandInterpreterRunOptions const *)arg1)->GetStopOnContinue();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandInterpreterRunOptions_SetStopOnContinue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandInterpreterRunOptions *arg1 = (lldb::SBCommandInterpreterRunOptions *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBCommandInterpreterRunOptions_SetStopOnContinue",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandInterpreterRunOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandInterpreterRunOptions_SetStopOnContinue" "', argument " "1"" of type '" "lldb::SBCommandInterpreterRunOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandInterpreterRunOptions * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBCommandInterpreterRunOptions_SetStopOnContinue" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetStopOnContinue(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandInterpreterRunOptions_GetStopOnError(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandInterpreterRunOptions *arg1 = (lldb::SBCommandInterpreterRunOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBCommandInterpreterRunOptions_GetStopOnError",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandInterpreterRunOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandInterpreterRunOptions_GetStopOnError" "', argument " "1"" of type '" "lldb::SBCommandInterpreterRunOptions const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandInterpreterRunOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBCommandInterpreterRunOptions const *)arg1)->GetStopOnError();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandInterpreterRunOptions_SetStopOnError(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandInterpreterRunOptions *arg1 = (lldb::SBCommandInterpreterRunOptions *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBCommandInterpreterRunOptions_SetStopOnError",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandInterpreterRunOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandInterpreterRunOptions_SetStopOnError" "', argument " "1"" of type '" "lldb::SBCommandInterpreterRunOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandInterpreterRunOptions * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBCommandInterpreterRunOptions_SetStopOnError" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetStopOnError(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandInterpreterRunOptions_GetStopOnCrash(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandInterpreterRunOptions *arg1 = (lldb::SBCommandInterpreterRunOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBCommandInterpreterRunOptions_GetStopOnCrash",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandInterpreterRunOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandInterpreterRunOptions_GetStopOnCrash" "', argument " "1"" of type '" "lldb::SBCommandInterpreterRunOptions const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandInterpreterRunOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBCommandInterpreterRunOptions const *)arg1)->GetStopOnCrash();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandInterpreterRunOptions_SetStopOnCrash(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandInterpreterRunOptions *arg1 = (lldb::SBCommandInterpreterRunOptions *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBCommandInterpreterRunOptions_SetStopOnCrash",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandInterpreterRunOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandInterpreterRunOptions_SetStopOnCrash" "', argument " "1"" of type '" "lldb::SBCommandInterpreterRunOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandInterpreterRunOptions * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBCommandInterpreterRunOptions_SetStopOnCrash" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetStopOnCrash(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandInterpreterRunOptions_GetEchoCommands(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandInterpreterRunOptions *arg1 = (lldb::SBCommandInterpreterRunOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBCommandInterpreterRunOptions_GetEchoCommands",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandInterpreterRunOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandInterpreterRunOptions_GetEchoCommands" "', argument " "1"" of type '" "lldb::SBCommandInterpreterRunOptions const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandInterpreterRunOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBCommandInterpreterRunOptions const *)arg1)->GetEchoCommands();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandInterpreterRunOptions_SetEchoCommands(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandInterpreterRunOptions *arg1 = (lldb::SBCommandInterpreterRunOptions *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBCommandInterpreterRunOptions_SetEchoCommands",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandInterpreterRunOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandInterpreterRunOptions_SetEchoCommands" "', argument " "1"" of type '" "lldb::SBCommandInterpreterRunOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandInterpreterRunOptions * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBCommandInterpreterRunOptions_SetEchoCommands" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetEchoCommands(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandInterpreterRunOptions_GetPrintResults(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandInterpreterRunOptions *arg1 = (lldb::SBCommandInterpreterRunOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBCommandInterpreterRunOptions_GetPrintResults",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandInterpreterRunOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandInterpreterRunOptions_GetPrintResults" "', argument " "1"" of type '" "lldb::SBCommandInterpreterRunOptions const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandInterpreterRunOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBCommandInterpreterRunOptions const *)arg1)->GetPrintResults();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandInterpreterRunOptions_SetPrintResults(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandInterpreterRunOptions *arg1 = (lldb::SBCommandInterpreterRunOptions *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBCommandInterpreterRunOptions_SetPrintResults",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandInterpreterRunOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandInterpreterRunOptions_SetPrintResults" "', argument " "1"" of type '" "lldb::SBCommandInterpreterRunOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandInterpreterRunOptions * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBCommandInterpreterRunOptions_SetPrintResults" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetPrintResults(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandInterpreterRunOptions_GetAddToHistory(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandInterpreterRunOptions *arg1 = (lldb::SBCommandInterpreterRunOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBCommandInterpreterRunOptions_GetAddToHistory",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandInterpreterRunOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandInterpreterRunOptions_GetAddToHistory" "', argument " "1"" of type '" "lldb::SBCommandInterpreterRunOptions const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandInterpreterRunOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBCommandInterpreterRunOptions const *)arg1)->GetAddToHistory();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandInterpreterRunOptions_SetAddToHistory(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandInterpreterRunOptions *arg1 = (lldb::SBCommandInterpreterRunOptions *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBCommandInterpreterRunOptions_SetAddToHistory",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandInterpreterRunOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandInterpreterRunOptions_SetAddToHistory" "', argument " "1"" of type '" "lldb::SBCommandInterpreterRunOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandInterpreterRunOptions * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBCommandInterpreterRunOptions_SetAddToHistory" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetAddToHistory(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBCommandInterpreterRunOptions_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBCommandInterpreterRunOptions, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBCommandInterpreter(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandInterpreter *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBCommandInterpreter *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBCommandInterpreter",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBCommandInterpreter,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBCommandInterpreter" "', argument " "1"" of type '" "lldb::SBCommandInterpreter const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBCommandInterpreter" "', argument " "1"" of type '" "lldb::SBCommandInterpreter const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandInterpreter * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBCommandInterpreter *)new lldb::SBCommandInterpreter((lldb::SBCommandInterpreter const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBCommandInterpreter, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBCommandInterpreter(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandInterpreter *arg1 = (lldb::SBCommandInterpreter *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBCommandInterpreter",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandInterpreter, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBCommandInterpreter" "', argument " "1"" of type '" "lldb::SBCommandInterpreter *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandInterpreter * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandInterpreter_GetArgumentTypeAsCString(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::CommandArgumentType arg1 ;
  int val1 ;
  int ecode1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBCommandInterpreter_GetArgumentTypeAsCString",&obj0)) SWIG_fail;
  ecode1 = SWIG_AsVal_int(obj0, &val1);
  if (!SWIG_IsOK(ecode1)) {
    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "SBCommandInterpreter_GetArgumentTypeAsCString" "', argument " "1"" of type '" "lldb::CommandArgumentType""'");
  } 
  arg1 = static_cast< lldb::CommandArgumentType >(val1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)lldb::SBCommandInterpreter::GetArgumentTypeAsCString(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandInterpreter_GetArgumentDescriptionAsCString(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::CommandArgumentType arg1 ;
  int val1 ;
  int ecode1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBCommandInterpreter_GetArgumentDescriptionAsCString",&obj0)) SWIG_fail;
  ecode1 = SWIG_AsVal_int(obj0, &val1);
  if (!SWIG_IsOK(ecode1)) {
    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "SBCommandInterpreter_GetArgumentDescriptionAsCString" "', argument " "1"" of type '" "lldb::CommandArgumentType""'");
  } 
  arg1 = static_cast< lldb::CommandArgumentType >(val1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)lldb::SBCommandInterpreter::GetArgumentDescriptionAsCString(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandInterpreter_EventIsCommandInterpreterEvent(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBEvent *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBCommandInterpreter_EventIsCommandInterpreterEvent",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBEvent,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandInterpreter_EventIsCommandInterpreterEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBCommandInterpreter_EventIsCommandInterpreterEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBEvent * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)lldb::SBCommandInterpreter::EventIsCommandInterpreterEvent((lldb::SBEvent const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandInterpreter_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandInterpreter *arg1 = (lldb::SBCommandInterpreter *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBCommandInterpreter_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandInterpreter, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandInterpreter_IsValid" "', argument " "1"" of type '" "lldb::SBCommandInterpreter const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandInterpreter * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBCommandInterpreter const *)arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandInterpreter_GetIOHandlerControlSequence(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandInterpreter *arg1 = (lldb::SBCommandInterpreter *) 0 ;
  char arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  char val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBCommandInterpreter_GetIOHandlerControlSequence",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandInterpreter, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandInterpreter_GetIOHandlerControlSequence" "', argument " "1"" of type '" "lldb::SBCommandInterpreter *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandInterpreter * >(argp1);
  ecode2 = SWIG_AsVal_char(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBCommandInterpreter_GetIOHandlerControlSequence" "', argument " "2"" of type '" "char""'");
  } 
  arg2 = static_cast< char >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetIOHandlerControlSequence(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandInterpreter_GetPromptOnQuit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandInterpreter *arg1 = (lldb::SBCommandInterpreter *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBCommandInterpreter_GetPromptOnQuit",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandInterpreter, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandInterpreter_GetPromptOnQuit" "', argument " "1"" of type '" "lldb::SBCommandInterpreter *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandInterpreter * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetPromptOnQuit();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandInterpreter_SetPromptOnQuit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandInterpreter *arg1 = (lldb::SBCommandInterpreter *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBCommandInterpreter_SetPromptOnQuit",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandInterpreter, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandInterpreter_SetPromptOnQuit" "', argument " "1"" of type '" "lldb::SBCommandInterpreter *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandInterpreter * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBCommandInterpreter_SetPromptOnQuit" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetPromptOnQuit(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandInterpreter_ResolveCommand(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandInterpreter *arg1 = (lldb::SBCommandInterpreter *) 0 ;
  char *arg2 = (char *) 0 ;
  lldb::SBCommandReturnObject *arg3 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  void *argp3 = 0 ;
  int res3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBCommandInterpreter_ResolveCommand",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandInterpreter, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandInterpreter_ResolveCommand" "', argument " "1"" of type '" "lldb::SBCommandInterpreter *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandInterpreter * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBCommandInterpreter_ResolveCommand" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBCommandReturnObject,  0 );
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBCommandInterpreter_ResolveCommand" "', argument " "3"" of type '" "lldb::SBCommandReturnObject &""'"); 
  }
  if (!argp3) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBCommandInterpreter_ResolveCommand" "', argument " "3"" of type '" "lldb::SBCommandReturnObject &""'"); 
  }
  arg3 = reinterpret_cast< lldb::SBCommandReturnObject * >(argp3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->ResolveCommand((char const *)arg2,*arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandInterpreter_CommandExists(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandInterpreter *arg1 = (lldb::SBCommandInterpreter *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBCommandInterpreter_CommandExists",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandInterpreter, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandInterpreter_CommandExists" "', argument " "1"" of type '" "lldb::SBCommandInterpreter *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandInterpreter * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBCommandInterpreter_CommandExists" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->CommandExists((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandInterpreter_AliasExists(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandInterpreter *arg1 = (lldb::SBCommandInterpreter *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBCommandInterpreter_AliasExists",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandInterpreter, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandInterpreter_AliasExists" "', argument " "1"" of type '" "lldb::SBCommandInterpreter *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandInterpreter * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBCommandInterpreter_AliasExists" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->AliasExists((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandInterpreter_GetBroadcaster(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandInterpreter *arg1 = (lldb::SBCommandInterpreter *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBBroadcaster result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBCommandInterpreter_GetBroadcaster",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandInterpreter, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandInterpreter_GetBroadcaster" "', argument " "1"" of type '" "lldb::SBCommandInterpreter *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandInterpreter * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetBroadcaster();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBBroadcaster(static_cast< const lldb::SBBroadcaster& >(result))), SWIGTYPE_p_lldb__SBBroadcaster, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandInterpreter_GetBroadcasterClass(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":SBCommandInterpreter_GetBroadcasterClass")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)lldb::SBCommandInterpreter::GetBroadcasterClass();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandInterpreter_HasCommands(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandInterpreter *arg1 = (lldb::SBCommandInterpreter *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBCommandInterpreter_HasCommands",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandInterpreter, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandInterpreter_HasCommands" "', argument " "1"" of type '" "lldb::SBCommandInterpreter *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandInterpreter * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->HasCommands();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandInterpreter_HasAliases(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandInterpreter *arg1 = (lldb::SBCommandInterpreter *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBCommandInterpreter_HasAliases",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandInterpreter, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandInterpreter_HasAliases" "', argument " "1"" of type '" "lldb::SBCommandInterpreter *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandInterpreter * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->HasAliases();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandInterpreter_HasAliasOptions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandInterpreter *arg1 = (lldb::SBCommandInterpreter *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBCommandInterpreter_HasAliasOptions",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandInterpreter, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandInterpreter_HasAliasOptions" "', argument " "1"" of type '" "lldb::SBCommandInterpreter *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandInterpreter * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->HasAliasOptions();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandInterpreter_GetProcess(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandInterpreter *arg1 = (lldb::SBCommandInterpreter *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBProcess result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBCommandInterpreter_GetProcess",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandInterpreter, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandInterpreter_GetProcess" "', argument " "1"" of type '" "lldb::SBCommandInterpreter *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandInterpreter * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetProcess();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBProcess(static_cast< const lldb::SBProcess& >(result))), SWIGTYPE_p_lldb__SBProcess, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandInterpreter_GetDebugger(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandInterpreter *arg1 = (lldb::SBCommandInterpreter *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBDebugger result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBCommandInterpreter_GetDebugger",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandInterpreter, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandInterpreter_GetDebugger" "', argument " "1"" of type '" "lldb::SBCommandInterpreter *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandInterpreter * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetDebugger();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBDebugger(static_cast< const lldb::SBDebugger& >(result))), SWIGTYPE_p_lldb__SBDebugger, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandInterpreter_SourceInitFileInHomeDirectory(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandInterpreter *arg1 = (lldb::SBCommandInterpreter *) 0 ;
  lldb::SBCommandReturnObject *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBCommandInterpreter_SourceInitFileInHomeDirectory",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandInterpreter, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandInterpreter_SourceInitFileInHomeDirectory" "', argument " "1"" of type '" "lldb::SBCommandInterpreter *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandInterpreter * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBCommandReturnObject,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBCommandInterpreter_SourceInitFileInHomeDirectory" "', argument " "2"" of type '" "lldb::SBCommandReturnObject &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBCommandInterpreter_SourceInitFileInHomeDirectory" "', argument " "2"" of type '" "lldb::SBCommandReturnObject &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBCommandReturnObject * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SourceInitFileInHomeDirectory(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandInterpreter_SourceInitFileInCurrentWorkingDirectory(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandInterpreter *arg1 = (lldb::SBCommandInterpreter *) 0 ;
  lldb::SBCommandReturnObject *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBCommandInterpreter_SourceInitFileInCurrentWorkingDirectory",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandInterpreter, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandInterpreter_SourceInitFileInCurrentWorkingDirectory" "', argument " "1"" of type '" "lldb::SBCommandInterpreter *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandInterpreter * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBCommandReturnObject,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBCommandInterpreter_SourceInitFileInCurrentWorkingDirectory" "', argument " "2"" of type '" "lldb::SBCommandReturnObject &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBCommandInterpreter_SourceInitFileInCurrentWorkingDirectory" "', argument " "2"" of type '" "lldb::SBCommandReturnObject &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBCommandReturnObject * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SourceInitFileInCurrentWorkingDirectory(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandInterpreter_HandleCommand__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandInterpreter *arg1 = (lldb::SBCommandInterpreter *) 0 ;
  char *arg2 = (char *) 0 ;
  lldb::SBCommandReturnObject *arg3 = 0 ;
  bool arg4 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  void *argp3 = 0 ;
  int res3 = 0 ;
  bool val4 ;
  int ecode4 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  lldb::ReturnStatus result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOO:SBCommandInterpreter_HandleCommand",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandInterpreter, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandInterpreter_HandleCommand" "', argument " "1"" of type '" "lldb::SBCommandInterpreter *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandInterpreter * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBCommandInterpreter_HandleCommand" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBCommandReturnObject,  0 );
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBCommandInterpreter_HandleCommand" "', argument " "3"" of type '" "lldb::SBCommandReturnObject &""'"); 
  }
  if (!argp3) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBCommandInterpreter_HandleCommand" "', argument " "3"" of type '" "lldb::SBCommandReturnObject &""'"); 
  }
  arg3 = reinterpret_cast< lldb::SBCommandReturnObject * >(argp3);
  ecode4 = SWIG_AsVal_bool(obj3, &val4);
  if (!SWIG_IsOK(ecode4)) {
    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "SBCommandInterpreter_HandleCommand" "', argument " "4"" of type '" "bool""'");
  } 
  arg4 = static_cast< bool >(val4);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::ReturnStatus)(arg1)->HandleCommand((char const *)arg2,*arg3,arg4);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandInterpreter_HandleCommand__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandInterpreter *arg1 = (lldb::SBCommandInterpreter *) 0 ;
  char *arg2 = (char *) 0 ;
  lldb::SBCommandReturnObject *arg3 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  void *argp3 = 0 ;
  int res3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::ReturnStatus result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBCommandInterpreter_HandleCommand",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandInterpreter, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandInterpreter_HandleCommand" "', argument " "1"" of type '" "lldb::SBCommandInterpreter *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandInterpreter * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBCommandInterpreter_HandleCommand" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBCommandReturnObject,  0 );
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBCommandInterpreter_HandleCommand" "', argument " "3"" of type '" "lldb::SBCommandReturnObject &""'"); 
  }
  if (!argp3) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBCommandInterpreter_HandleCommand" "', argument " "3"" of type '" "lldb::SBCommandReturnObject &""'"); 
  }
  arg3 = reinterpret_cast< lldb::SBCommandReturnObject * >(argp3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::ReturnStatus)(arg1)->HandleCommand((char const *)arg2,*arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandInterpreter_HandleCommand__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandInterpreter *arg1 = (lldb::SBCommandInterpreter *) 0 ;
  char *arg2 = (char *) 0 ;
  lldb::SBExecutionContext *arg3 = 0 ;
  lldb::SBCommandReturnObject *arg4 = 0 ;
  bool arg5 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  void *argp3 = 0 ;
  int res3 = 0 ;
  void *argp4 = 0 ;
  int res4 = 0 ;
  bool val5 ;
  int ecode5 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  PyObject * obj4 = 0 ;
  lldb::ReturnStatus result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOOO:SBCommandInterpreter_HandleCommand",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandInterpreter, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandInterpreter_HandleCommand" "', argument " "1"" of type '" "lldb::SBCommandInterpreter *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandInterpreter * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBCommandInterpreter_HandleCommand" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBExecutionContext,  0 );
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBCommandInterpreter_HandleCommand" "', argument " "3"" of type '" "lldb::SBExecutionContext &""'"); 
  }
  if (!argp3) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBCommandInterpreter_HandleCommand" "', argument " "3"" of type '" "lldb::SBExecutionContext &""'"); 
  }
  arg3 = reinterpret_cast< lldb::SBExecutionContext * >(argp3);
  res4 = SWIG_ConvertPtr(obj3, &argp4, SWIGTYPE_p_lldb__SBCommandReturnObject,  0 );
  if (!SWIG_IsOK(res4)) {
    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "SBCommandInterpreter_HandleCommand" "', argument " "4"" of type '" "lldb::SBCommandReturnObject &""'"); 
  }
  if (!argp4) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBCommandInterpreter_HandleCommand" "', argument " "4"" of type '" "lldb::SBCommandReturnObject &""'"); 
  }
  arg4 = reinterpret_cast< lldb::SBCommandReturnObject * >(argp4);
  ecode5 = SWIG_AsVal_bool(obj4, &val5);
  if (!SWIG_IsOK(ecode5)) {
    SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "SBCommandInterpreter_HandleCommand" "', argument " "5"" of type '" "bool""'");
  } 
  arg5 = static_cast< bool >(val5);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::ReturnStatus)(arg1)->HandleCommand((char const *)arg2,*arg3,*arg4,arg5);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandInterpreter_HandleCommand__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandInterpreter *arg1 = (lldb::SBCommandInterpreter *) 0 ;
  char *arg2 = (char *) 0 ;
  lldb::SBExecutionContext *arg3 = 0 ;
  lldb::SBCommandReturnObject *arg4 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  void *argp3 = 0 ;
  int res3 = 0 ;
  void *argp4 = 0 ;
  int res4 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  lldb::ReturnStatus result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOO:SBCommandInterpreter_HandleCommand",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandInterpreter, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandInterpreter_HandleCommand" "', argument " "1"" of type '" "lldb::SBCommandInterpreter *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandInterpreter * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBCommandInterpreter_HandleCommand" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBExecutionContext,  0 );
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBCommandInterpreter_HandleCommand" "', argument " "3"" of type '" "lldb::SBExecutionContext &""'"); 
  }
  if (!argp3) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBCommandInterpreter_HandleCommand" "', argument " "3"" of type '" "lldb::SBExecutionContext &""'"); 
  }
  arg3 = reinterpret_cast< lldb::SBExecutionContext * >(argp3);
  res4 = SWIG_ConvertPtr(obj3, &argp4, SWIGTYPE_p_lldb__SBCommandReturnObject,  0 );
  if (!SWIG_IsOK(res4)) {
    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "SBCommandInterpreter_HandleCommand" "', argument " "4"" of type '" "lldb::SBCommandReturnObject &""'"); 
  }
  if (!argp4) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBCommandInterpreter_HandleCommand" "', argument " "4"" of type '" "lldb::SBCommandReturnObject &""'"); 
  }
  arg4 = reinterpret_cast< lldb::SBCommandReturnObject * >(argp4);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::ReturnStatus)(arg1)->HandleCommand((char const *)arg2,*arg3,*arg4);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandInterpreter_HandleCommand(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[6];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 5); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 3) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBCommandInterpreter, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        void *vptr = 0;
        int res = SWIG_ConvertPtr(argv[2], &vptr, SWIGTYPE_p_lldb__SBCommandReturnObject, 0);
        _v = SWIG_CheckState(res);
        if (_v) {
          return _wrap_SBCommandInterpreter_HandleCommand__SWIG_1(self, args);
        }
      }
    }
  }
  if (argc == 4) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBCommandInterpreter, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        void *vptr = 0;
        int res = SWIG_ConvertPtr(argv[2], &vptr, SWIGTYPE_p_lldb__SBCommandReturnObject, 0);
        _v = SWIG_CheckState(res);
        if (_v) {
          {
            int res = SWIG_AsVal_bool(argv[3], NULL);
            _v = SWIG_CheckState(res);
          }
          if (_v) {
            return _wrap_SBCommandInterpreter_HandleCommand__SWIG_0(self, args);
          }
        }
      }
    }
  }
  if (argc == 4) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBCommandInterpreter, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        void *vptr = 0;
        int res = SWIG_ConvertPtr(argv[2], &vptr, SWIGTYPE_p_lldb__SBExecutionContext, 0);
        _v = SWIG_CheckState(res);
        if (_v) {
          void *vptr = 0;
          int res = SWIG_ConvertPtr(argv[3], &vptr, SWIGTYPE_p_lldb__SBCommandReturnObject, 0);
          _v = SWIG_CheckState(res);
          if (_v) {
            return _wrap_SBCommandInterpreter_HandleCommand__SWIG_3(self, args);
          }
        }
      }
    }
  }
  if (argc == 5) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBCommandInterpreter, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        void *vptr = 0;
        int res = SWIG_ConvertPtr(argv[2], &vptr, SWIGTYPE_p_lldb__SBExecutionContext, 0);
        _v = SWIG_CheckState(res);
        if (_v) {
          void *vptr = 0;
          int res = SWIG_ConvertPtr(argv[3], &vptr, SWIGTYPE_p_lldb__SBCommandReturnObject, 0);
          _v = SWIG_CheckState(res);
          if (_v) {
            {
              int res = SWIG_AsVal_bool(argv[4], NULL);
              _v = SWIG_CheckState(res);
            }
            if (_v) {
              return _wrap_SBCommandInterpreter_HandleCommand__SWIG_2(self, args);
            }
          }
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBCommandInterpreter_HandleCommand'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    HandleCommand(lldb::SBCommandInterpreter *,char const *,lldb::SBCommandReturnObject &,bool)\n"
    "    HandleCommand(lldb::SBCommandInterpreter *,char const *,lldb::SBCommandReturnObject &)\n"
    "    HandleCommand(lldb::SBCommandInterpreter *,char const *,lldb::SBExecutionContext &,lldb::SBCommandReturnObject &,bool)\n"
    "    HandleCommand(lldb::SBCommandInterpreter *,char const *,lldb::SBExecutionContext &,lldb::SBCommandReturnObject &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandInterpreter_HandleCommandsFromFile(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandInterpreter *arg1 = (lldb::SBCommandInterpreter *) 0 ;
  lldb::SBFileSpec *arg2 = 0 ;
  lldb::SBExecutionContext *arg3 = 0 ;
  lldb::SBCommandInterpreterRunOptions *arg4 = 0 ;
  lldb::SBCommandReturnObject arg5 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  void *argp3 = 0 ;
  int res3 = 0 ;
  void *argp4 = 0 ;
  int res4 = 0 ;
  void *argp5 ;
  int res5 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  PyObject * obj4 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOOO:SBCommandInterpreter_HandleCommandsFromFile",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandInterpreter, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandInterpreter_HandleCommandsFromFile" "', argument " "1"" of type '" "lldb::SBCommandInterpreter *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandInterpreter * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBFileSpec,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBCommandInterpreter_HandleCommandsFromFile" "', argument " "2"" of type '" "lldb::SBFileSpec &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBCommandInterpreter_HandleCommandsFromFile" "', argument " "2"" of type '" "lldb::SBFileSpec &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBFileSpec * >(argp2);
  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBExecutionContext,  0 );
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBCommandInterpreter_HandleCommandsFromFile" "', argument " "3"" of type '" "lldb::SBExecutionContext &""'"); 
  }
  if (!argp3) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBCommandInterpreter_HandleCommandsFromFile" "', argument " "3"" of type '" "lldb::SBExecutionContext &""'"); 
  }
  arg3 = reinterpret_cast< lldb::SBExecutionContext * >(argp3);
  res4 = SWIG_ConvertPtr(obj3, &argp4, SWIGTYPE_p_lldb__SBCommandInterpreterRunOptions,  0 );
  if (!SWIG_IsOK(res4)) {
    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "SBCommandInterpreter_HandleCommandsFromFile" "', argument " "4"" of type '" "lldb::SBCommandInterpreterRunOptions &""'"); 
  }
  if (!argp4) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBCommandInterpreter_HandleCommandsFromFile" "', argument " "4"" of type '" "lldb::SBCommandInterpreterRunOptions &""'"); 
  }
  arg4 = reinterpret_cast< lldb::SBCommandInterpreterRunOptions * >(argp4);
  {
    res5 = SWIG_ConvertPtr(obj4, &argp5, SWIGTYPE_p_lldb__SBCommandReturnObject,  0  | 0);
    if (!SWIG_IsOK(res5)) {
      SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "SBCommandInterpreter_HandleCommandsFromFile" "', argument " "5"" of type '" "lldb::SBCommandReturnObject""'"); 
    }  
    if (!argp5) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBCommandInterpreter_HandleCommandsFromFile" "', argument " "5"" of type '" "lldb::SBCommandReturnObject""'");
    } else {
      lldb::SBCommandReturnObject * temp = reinterpret_cast< lldb::SBCommandReturnObject * >(argp5);
      arg5 = *temp;
      if (SWIG_IsNewObj(res5)) delete temp;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->HandleCommandsFromFile(*arg2,*arg3,*arg4,arg5);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandInterpreter_HandleCompletion(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandInterpreter *arg1 = (lldb::SBCommandInterpreter *) 0 ;
  char *arg2 = (char *) 0 ;
  uint32_t arg3 ;
  int arg4 ;
  int arg5 ;
  lldb::SBStringList *arg6 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  unsigned int val3 ;
  int ecode3 = 0 ;
  int val4 ;
  int ecode4 = 0 ;
  int val5 ;
  int ecode5 = 0 ;
  void *argp6 = 0 ;
  int res6 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  PyObject * obj4 = 0 ;
  PyObject * obj5 = 0 ;
  int result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOOOO:SBCommandInterpreter_HandleCompletion",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandInterpreter, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandInterpreter_HandleCompletion" "', argument " "1"" of type '" "lldb::SBCommandInterpreter *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandInterpreter * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBCommandInterpreter_HandleCompletion" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  ecode3 = SWIG_AsVal_unsigned_SS_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBCommandInterpreter_HandleCompletion" "', argument " "3"" of type '" "uint32_t""'");
  } 
  arg3 = static_cast< uint32_t >(val3);
  ecode4 = SWIG_AsVal_int(obj3, &val4);
  if (!SWIG_IsOK(ecode4)) {
    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "SBCommandInterpreter_HandleCompletion" "', argument " "4"" of type '" "int""'");
  } 
  arg4 = static_cast< int >(val4);
  ecode5 = SWIG_AsVal_int(obj4, &val5);
  if (!SWIG_IsOK(ecode5)) {
    SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "SBCommandInterpreter_HandleCompletion" "', argument " "5"" of type '" "int""'");
  } 
  arg5 = static_cast< int >(val5);
  res6 = SWIG_ConvertPtr(obj5, &argp6, SWIGTYPE_p_lldb__SBStringList,  0 );
  if (!SWIG_IsOK(res6)) {
    SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "SBCommandInterpreter_HandleCompletion" "', argument " "6"" of type '" "lldb::SBStringList &""'"); 
  }
  if (!argp6) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBCommandInterpreter_HandleCompletion" "', argument " "6"" of type '" "lldb::SBStringList &""'"); 
  }
  arg6 = reinterpret_cast< lldb::SBStringList * >(argp6);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (int)(arg1)->HandleCompletion((char const *)arg2,arg3,arg4,arg5,*arg6);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandInterpreter_IsActive(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandInterpreter *arg1 = (lldb::SBCommandInterpreter *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBCommandInterpreter_IsActive",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandInterpreter, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandInterpreter_IsActive" "', argument " "1"" of type '" "lldb::SBCommandInterpreter *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandInterpreter * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsActive();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandInterpreter_WasInterrupted(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandInterpreter *arg1 = (lldb::SBCommandInterpreter *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBCommandInterpreter_WasInterrupted",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandInterpreter, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandInterpreter_WasInterrupted" "', argument " "1"" of type '" "lldb::SBCommandInterpreter const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandInterpreter * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBCommandInterpreter const *)arg1)->WasInterrupted();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBCommandInterpreter_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBCommandInterpreter, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBCommandReturnObject__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandReturnObject *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBCommandReturnObject")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBCommandReturnObject *)new lldb::SBCommandReturnObject();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBCommandReturnObject, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBCommandReturnObject__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandReturnObject *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBCommandReturnObject *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBCommandReturnObject",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBCommandReturnObject,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBCommandReturnObject" "', argument " "1"" of type '" "lldb::SBCommandReturnObject const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBCommandReturnObject" "', argument " "1"" of type '" "lldb::SBCommandReturnObject const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandReturnObject * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBCommandReturnObject *)new lldb::SBCommandReturnObject((lldb::SBCommandReturnObject const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBCommandReturnObject, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBCommandReturnObject(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBCommandReturnObject__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBCommandReturnObject, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBCommandReturnObject__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBCommandReturnObject'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBCommandReturnObject()\n"
    "    lldb::SBCommandReturnObject(lldb::SBCommandReturnObject const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBCommandReturnObject(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandReturnObject *arg1 = (lldb::SBCommandReturnObject *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBCommandReturnObject",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandReturnObject, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBCommandReturnObject" "', argument " "1"" of type '" "lldb::SBCommandReturnObject *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandReturnObject * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandReturnObject_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandReturnObject *arg1 = (lldb::SBCommandReturnObject *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBCommandReturnObject_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandReturnObject, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandReturnObject_IsValid" "', argument " "1"" of type '" "lldb::SBCommandReturnObject const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandReturnObject * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBCommandReturnObject const *)arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandReturnObject_GetOutput__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandReturnObject *arg1 = (lldb::SBCommandReturnObject *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBCommandReturnObject_GetOutput",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandReturnObject, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandReturnObject_GetOutput" "', argument " "1"" of type '" "lldb::SBCommandReturnObject *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandReturnObject * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetOutput();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandReturnObject_GetError__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandReturnObject *arg1 = (lldb::SBCommandReturnObject *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBCommandReturnObject_GetError",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandReturnObject, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandReturnObject_GetError" "', argument " "1"" of type '" "lldb::SBCommandReturnObject *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandReturnObject * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetError();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandReturnObject_GetOutputSize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandReturnObject *arg1 = (lldb::SBCommandReturnObject *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  size_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBCommandReturnObject_GetOutputSize",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandReturnObject, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandReturnObject_GetOutputSize" "', argument " "1"" of type '" "lldb::SBCommandReturnObject *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandReturnObject * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetOutputSize();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandReturnObject_GetErrorSize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandReturnObject *arg1 = (lldb::SBCommandReturnObject *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  size_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBCommandReturnObject_GetErrorSize",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandReturnObject, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandReturnObject_GetErrorSize" "', argument " "1"" of type '" "lldb::SBCommandReturnObject *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandReturnObject * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetErrorSize();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandReturnObject_GetOutput__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandReturnObject *arg1 = (lldb::SBCommandReturnObject *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBCommandReturnObject_GetOutput",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandReturnObject, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandReturnObject_GetOutput" "', argument " "1"" of type '" "lldb::SBCommandReturnObject *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandReturnObject * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBCommandReturnObject_GetOutput" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetOutput(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandReturnObject_GetOutput(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[3];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 2); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 1) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBCommandReturnObject, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_SBCommandReturnObject_GetOutput__SWIG_0(self, args);
    }
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBCommandReturnObject, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_bool(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        return _wrap_SBCommandReturnObject_GetOutput__SWIG_1(self, args);
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBCommandReturnObject_GetOutput'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    GetOutput(lldb::SBCommandReturnObject *)\n"
    "    GetOutput(lldb::SBCommandReturnObject *,bool)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandReturnObject_GetError__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandReturnObject *arg1 = (lldb::SBCommandReturnObject *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBCommandReturnObject_GetError",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandReturnObject, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandReturnObject_GetError" "', argument " "1"" of type '" "lldb::SBCommandReturnObject *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandReturnObject * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBCommandReturnObject_GetError" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetError(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandReturnObject_GetError(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[3];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 2); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 1) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBCommandReturnObject, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_SBCommandReturnObject_GetError__SWIG_0(self, args);
    }
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBCommandReturnObject, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_bool(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        return _wrap_SBCommandReturnObject_GetError__SWIG_1(self, args);
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBCommandReturnObject_GetError'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    GetError(lldb::SBCommandReturnObject *)\n"
    "    GetError(lldb::SBCommandReturnObject *,bool)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandReturnObject_PutOutput(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandReturnObject *arg1 = (lldb::SBCommandReturnObject *) 0 ;
  FILE *arg2 = (FILE *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  size_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBCommandReturnObject_PutOutput",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandReturnObject, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandReturnObject_PutOutput" "', argument " "1"" of type '" "lldb::SBCommandReturnObject *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandReturnObject * >(argp1);
  {
    using namespace lldb_private;
    if (obj1 == Py_None)
    arg2 = nullptr;
    else if (!lldb_private::PythonFile::Check(obj1)) {
      int fd = PyObject_AsFileDescriptor(obj1);
      PythonObject py_input(PyRefType::Borrowed, obj1);
      PythonString py_mode = py_input.GetAttributeValue("mode").AsType<PythonString>();
      
      if (-1 != fd && py_mode.IsValid()) {
        FILE *f;
        if ((f = fdopen(fd, py_mode.GetString().str().c_str())))
        arg2 = f;
        else
        PyErr_SetString(PyExc_TypeError, strerror(errno));
      } else {
        PyErr_SetString(PyExc_TypeError,"not a file-like object");
        return nullptr;
      }
    }
    else
    {
      PythonFile py_file(PyRefType::Borrowed, obj1);
      File file;
      if (!py_file.GetUnderlyingFile(file))
      return nullptr;
      
      arg2 = file.GetStream();
      if (arg2)
      file.Clear();
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->PutOutput(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandReturnObject_PutError(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandReturnObject *arg1 = (lldb::SBCommandReturnObject *) 0 ;
  FILE *arg2 = (FILE *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  size_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBCommandReturnObject_PutError",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandReturnObject, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandReturnObject_PutError" "', argument " "1"" of type '" "lldb::SBCommandReturnObject *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandReturnObject * >(argp1);
  {
    using namespace lldb_private;
    if (obj1 == Py_None)
    arg2 = nullptr;
    else if (!lldb_private::PythonFile::Check(obj1)) {
      int fd = PyObject_AsFileDescriptor(obj1);
      PythonObject py_input(PyRefType::Borrowed, obj1);
      PythonString py_mode = py_input.GetAttributeValue("mode").AsType<PythonString>();
      
      if (-1 != fd && py_mode.IsValid()) {
        FILE *f;
        if ((f = fdopen(fd, py_mode.GetString().str().c_str())))
        arg2 = f;
        else
        PyErr_SetString(PyExc_TypeError, strerror(errno));
      } else {
        PyErr_SetString(PyExc_TypeError,"not a file-like object");
        return nullptr;
      }
    }
    else
    {
      PythonFile py_file(PyRefType::Borrowed, obj1);
      File file;
      if (!py_file.GetUnderlyingFile(file))
      return nullptr;
      
      arg2 = file.GetStream();
      if (arg2)
      file.Clear();
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->PutError(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandReturnObject_Clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandReturnObject *arg1 = (lldb::SBCommandReturnObject *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBCommandReturnObject_Clear",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandReturnObject, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandReturnObject_Clear" "', argument " "1"" of type '" "lldb::SBCommandReturnObject *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandReturnObject * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->Clear();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandReturnObject_SetStatus(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandReturnObject *arg1 = (lldb::SBCommandReturnObject *) 0 ;
  lldb::ReturnStatus arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBCommandReturnObject_SetStatus",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandReturnObject, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandReturnObject_SetStatus" "', argument " "1"" of type '" "lldb::SBCommandReturnObject *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandReturnObject * >(argp1);
  ecode2 = SWIG_AsVal_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBCommandReturnObject_SetStatus" "', argument " "2"" of type '" "lldb::ReturnStatus""'");
  } 
  arg2 = static_cast< lldb::ReturnStatus >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetStatus(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandReturnObject_SetError__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandReturnObject *arg1 = (lldb::SBCommandReturnObject *) 0 ;
  lldb::SBError *arg2 = 0 ;
  char *arg3 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  int res3 ;
  char *buf3 = 0 ;
  int alloc3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBCommandReturnObject_SetError",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandReturnObject, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandReturnObject_SetError" "', argument " "1"" of type '" "lldb::SBCommandReturnObject *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandReturnObject * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBCommandReturnObject_SetError" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBCommandReturnObject_SetError" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBError * >(argp2);
  res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3);
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBCommandReturnObject_SetError" "', argument " "3"" of type '" "char const *""'");
  }
  arg3 = reinterpret_cast< char * >(buf3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetError(*arg2,(char const *)arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  return resultobj;
fail:
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandReturnObject_SetError__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandReturnObject *arg1 = (lldb::SBCommandReturnObject *) 0 ;
  lldb::SBError *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBCommandReturnObject_SetError",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandReturnObject, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandReturnObject_SetError" "', argument " "1"" of type '" "lldb::SBCommandReturnObject *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandReturnObject * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBCommandReturnObject_SetError" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBCommandReturnObject_SetError" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBError * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetError(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandReturnObject_SetError__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandReturnObject *arg1 = (lldb::SBCommandReturnObject *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBCommandReturnObject_SetError",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandReturnObject, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandReturnObject_SetError" "', argument " "1"" of type '" "lldb::SBCommandReturnObject *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandReturnObject * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBCommandReturnObject_SetError" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetError((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandReturnObject_SetError(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[4];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 3); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBCommandReturnObject, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      void *vptr = 0;
      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_lldb__SBError, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        return _wrap_SBCommandReturnObject_SetError__SWIG_1(self, args);
      }
    }
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBCommandReturnObject, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        return _wrap_SBCommandReturnObject_SetError__SWIG_2(self, args);
      }
    }
  }
  if (argc == 3) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBCommandReturnObject, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      void *vptr = 0;
      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_lldb__SBError, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        int res = SWIG_AsCharPtrAndSize(argv[2], 0, NULL, 0);
        _v = SWIG_CheckState(res);
        if (_v) {
          return _wrap_SBCommandReturnObject_SetError__SWIG_0(self, args);
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBCommandReturnObject_SetError'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    SetError(lldb::SBCommandReturnObject *,lldb::SBError &,char const *)\n"
    "    SetError(lldb::SBCommandReturnObject *,lldb::SBError &)\n"
    "    SetError(lldb::SBCommandReturnObject *,char const *)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandReturnObject_GetStatus(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandReturnObject *arg1 = (lldb::SBCommandReturnObject *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::ReturnStatus result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBCommandReturnObject_GetStatus",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandReturnObject, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandReturnObject_GetStatus" "', argument " "1"" of type '" "lldb::SBCommandReturnObject *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandReturnObject * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::ReturnStatus)(arg1)->GetStatus();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandReturnObject_Succeeded(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandReturnObject *arg1 = (lldb::SBCommandReturnObject *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBCommandReturnObject_Succeeded",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandReturnObject, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandReturnObject_Succeeded" "', argument " "1"" of type '" "lldb::SBCommandReturnObject *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandReturnObject * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->Succeeded();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandReturnObject_HasResult(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandReturnObject *arg1 = (lldb::SBCommandReturnObject *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBCommandReturnObject_HasResult",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandReturnObject, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandReturnObject_HasResult" "', argument " "1"" of type '" "lldb::SBCommandReturnObject *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandReturnObject * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->HasResult();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandReturnObject_AppendMessage(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandReturnObject *arg1 = (lldb::SBCommandReturnObject *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBCommandReturnObject_AppendMessage",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandReturnObject, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandReturnObject_AppendMessage" "', argument " "1"" of type '" "lldb::SBCommandReturnObject *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandReturnObject * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBCommandReturnObject_AppendMessage" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->AppendMessage((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandReturnObject_AppendWarning(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandReturnObject *arg1 = (lldb::SBCommandReturnObject *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBCommandReturnObject_AppendWarning",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandReturnObject, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandReturnObject_AppendWarning" "', argument " "1"" of type '" "lldb::SBCommandReturnObject *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandReturnObject * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBCommandReturnObject_AppendWarning" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->AppendWarning((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandReturnObject_GetDescription(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandReturnObject *arg1 = (lldb::SBCommandReturnObject *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBCommandReturnObject_GetDescription",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandReturnObject, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandReturnObject_GetDescription" "', argument " "1"" of type '" "lldb::SBCommandReturnObject *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandReturnObject * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBCommandReturnObject_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBCommandReturnObject_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetDescription(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandReturnObject_SetImmediateOutputFile(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandReturnObject *arg1 = (lldb::SBCommandReturnObject *) 0 ;
  FILE *arg2 = (FILE *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBCommandReturnObject_SetImmediateOutputFile",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandReturnObject, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandReturnObject_SetImmediateOutputFile" "', argument " "1"" of type '" "lldb::SBCommandReturnObject *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandReturnObject * >(argp1);
  {
    using namespace lldb_private;
    if (obj1 == Py_None)
    arg2 = nullptr;
    else if (!lldb_private::PythonFile::Check(obj1)) {
      int fd = PyObject_AsFileDescriptor(obj1);
      PythonObject py_input(PyRefType::Borrowed, obj1);
      PythonString py_mode = py_input.GetAttributeValue("mode").AsType<PythonString>();
      
      if (-1 != fd && py_mode.IsValid()) {
        FILE *f;
        if ((f = fdopen(fd, py_mode.GetString().str().c_str())))
        arg2 = f;
        else
        PyErr_SetString(PyExc_TypeError, strerror(errno));
      } else {
        PyErr_SetString(PyExc_TypeError,"not a file-like object");
        return nullptr;
      }
    }
    else
    {
      PythonFile py_file(PyRefType::Borrowed, obj1);
      File file;
      if (!py_file.GetUnderlyingFile(file))
      return nullptr;
      
      arg2 = file.GetStream();
      if (arg2)
      file.Clear();
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    lldb_SBCommandReturnObject_SetImmediateOutputFile(arg1,arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandReturnObject_SetImmediateErrorFile(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandReturnObject *arg1 = (lldb::SBCommandReturnObject *) 0 ;
  FILE *arg2 = (FILE *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBCommandReturnObject_SetImmediateErrorFile",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandReturnObject, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandReturnObject_SetImmediateErrorFile" "', argument " "1"" of type '" "lldb::SBCommandReturnObject *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandReturnObject * >(argp1);
  {
    using namespace lldb_private;
    if (obj1 == Py_None)
    arg2 = nullptr;
    else if (!lldb_private::PythonFile::Check(obj1)) {
      int fd = PyObject_AsFileDescriptor(obj1);
      PythonObject py_input(PyRefType::Borrowed, obj1);
      PythonString py_mode = py_input.GetAttributeValue("mode").AsType<PythonString>();
      
      if (-1 != fd && py_mode.IsValid()) {
        FILE *f;
        if ((f = fdopen(fd, py_mode.GetString().str().c_str())))
        arg2 = f;
        else
        PyErr_SetString(PyExc_TypeError, strerror(errno));
      } else {
        PyErr_SetString(PyExc_TypeError,"not a file-like object");
        return nullptr;
      }
    }
    else
    {
      PythonFile py_file(PyRefType::Borrowed, obj1);
      File file;
      if (!py_file.GetUnderlyingFile(file))
      return nullptr;
      
      arg2 = file.GetStream();
      if (arg2)
      file.Clear();
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    lldb_SBCommandReturnObject_SetImmediateErrorFile(arg1,arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandReturnObject_PutCString(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandReturnObject *arg1 = (lldb::SBCommandReturnObject *) 0 ;
  char *arg2 = (char *) 0 ;
  int arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBCommandReturnObject_PutCString",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandReturnObject, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandReturnObject_PutCString" "', argument " "1"" of type '" "lldb::SBCommandReturnObject *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandReturnObject * >(argp1);
  {
    using namespace lldb_private;
    if (obj1 == Py_None)
    {
      arg2 = NULL;
      arg3 = 0;
    }
    else if (PythonString::Check(obj1))
    {
      PythonString py_str(PyRefType::Borrowed, obj1);
      llvm::StringRef str = py_str.GetString();
      arg2 = const_cast<char*>(str.data());
      arg3 = str.size();
      // In Python 2, if obj1 is a PyUnicode object then this
      // will trigger a Unicode -> String conversion, in which
      // case the `PythonString` will now own the PyString.  Thus
      // if it goes out of scope, the data will be deleted.  The
      // only way to avoid this is to leak the Python object in
      // that case.  Note that if there was no conversion, then
      // releasing the string will not leak anything, since we
      // created this as a borrowed reference.
      py_str.release();
    }
    else
    {
      PyErr_SetString(PyExc_TypeError,"not a string-like object");
      return NULL;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->PutCString((char const *)arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandReturnObject_Print(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandReturnObject *arg1 = (lldb::SBCommandReturnObject *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBCommandReturnObject_Print",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandReturnObject, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandReturnObject_Print" "', argument " "1"" of type '" "lldb::SBCommandReturnObject *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandReturnObject * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBCommandReturnObject_Print" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    lldb_SBCommandReturnObject_Print(arg1,(char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandReturnObject___str__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandReturnObject *arg1 = (lldb::SBCommandReturnObject *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBCommandReturnObject___str__",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandReturnObject, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandReturnObject___str__" "', argument " "1"" of type '" "lldb::SBCommandReturnObject *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandReturnObject * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (PyObject *)lldb_SBCommandReturnObject___str__(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = result;
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandReturnObject_write(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandReturnObject *arg1 = (lldb::SBCommandReturnObject *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBCommandReturnObject_write",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandReturnObject, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandReturnObject_write" "', argument " "1"" of type '" "lldb::SBCommandReturnObject *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandReturnObject * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBCommandReturnObject_write" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    lldb_SBCommandReturnObject_write(arg1,(char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommandReturnObject_flush(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommandReturnObject *arg1 = (lldb::SBCommandReturnObject *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBCommandReturnObject_flush",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommandReturnObject, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommandReturnObject_flush" "', argument " "1"" of type '" "lldb::SBCommandReturnObject *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommandReturnObject * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    lldb_SBCommandReturnObject_flush(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBCommandReturnObject_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBCommandReturnObject, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBCommunication__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommunication *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBCommunication")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBCommunication *)new lldb::SBCommunication();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBCommunication, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBCommunication__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  char *arg1 = (char *) 0 ;
  int res1 ;
  char *buf1 = 0 ;
  int alloc1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBCommunication *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBCommunication",&obj0)) SWIG_fail;
  res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBCommunication" "', argument " "1"" of type '" "char const *""'");
  }
  arg1 = reinterpret_cast< char * >(buf1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBCommunication *)new lldb::SBCommunication((char const *)arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBCommunication, SWIG_POINTER_NEW |  0 );
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return resultobj;
fail:
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBCommunication(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBCommunication__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_AsCharPtrAndSize(argv[0], 0, NULL, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBCommunication__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBCommunication'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBCommunication()\n"
    "    lldb::SBCommunication(char const *)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBCommunication(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommunication *arg1 = (lldb::SBCommunication *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBCommunication",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommunication, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBCommunication" "', argument " "1"" of type '" "lldb::SBCommunication *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommunication * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommunication_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommunication *arg1 = (lldb::SBCommunication *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBCommunication_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommunication, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommunication_IsValid" "', argument " "1"" of type '" "lldb::SBCommunication const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommunication * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBCommunication const *)arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommunication_GetBroadcaster(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommunication *arg1 = (lldb::SBCommunication *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBBroadcaster result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBCommunication_GetBroadcaster",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommunication, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommunication_GetBroadcaster" "', argument " "1"" of type '" "lldb::SBCommunication *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommunication * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetBroadcaster();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBBroadcaster(static_cast< const lldb::SBBroadcaster& >(result))), SWIGTYPE_p_lldb__SBBroadcaster, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommunication_GetBroadcasterClass(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":SBCommunication_GetBroadcasterClass")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)lldb::SBCommunication::GetBroadcasterClass();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommunication_AdoptFileDesriptor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommunication *arg1 = (lldb::SBCommunication *) 0 ;
  int arg2 ;
  bool arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int val2 ;
  int ecode2 = 0 ;
  bool val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::ConnectionStatus result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBCommunication_AdoptFileDesriptor",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommunication, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommunication_AdoptFileDesriptor" "', argument " "1"" of type '" "lldb::SBCommunication *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommunication * >(argp1);
  ecode2 = SWIG_AsVal_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBCommunication_AdoptFileDesriptor" "', argument " "2"" of type '" "int""'");
  } 
  arg2 = static_cast< int >(val2);
  ecode3 = SWIG_AsVal_bool(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBCommunication_AdoptFileDesriptor" "', argument " "3"" of type '" "bool""'");
  } 
  arg3 = static_cast< bool >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::ConnectionStatus)(arg1)->AdoptFileDesriptor(arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommunication_Connect(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommunication *arg1 = (lldb::SBCommunication *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::ConnectionStatus result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBCommunication_Connect",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommunication, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommunication_Connect" "', argument " "1"" of type '" "lldb::SBCommunication *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommunication * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBCommunication_Connect" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::ConnectionStatus)(arg1)->Connect((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommunication_Disconnect(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommunication *arg1 = (lldb::SBCommunication *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::ConnectionStatus result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBCommunication_Disconnect",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommunication, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommunication_Disconnect" "', argument " "1"" of type '" "lldb::SBCommunication *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommunication * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::ConnectionStatus)(arg1)->Disconnect();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommunication_IsConnected(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommunication *arg1 = (lldb::SBCommunication *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBCommunication_IsConnected",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommunication, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommunication_IsConnected" "', argument " "1"" of type '" "lldb::SBCommunication const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommunication * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBCommunication const *)arg1)->IsConnected();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommunication_GetCloseOnEOF(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommunication *arg1 = (lldb::SBCommunication *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBCommunication_GetCloseOnEOF",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommunication, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommunication_GetCloseOnEOF" "', argument " "1"" of type '" "lldb::SBCommunication *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommunication * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetCloseOnEOF();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommunication_SetCloseOnEOF(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommunication *arg1 = (lldb::SBCommunication *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBCommunication_SetCloseOnEOF",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommunication, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommunication_SetCloseOnEOF" "', argument " "1"" of type '" "lldb::SBCommunication *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommunication * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBCommunication_SetCloseOnEOF" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetCloseOnEOF(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommunication_Read(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommunication *arg1 = (lldb::SBCommunication *) 0 ;
  void *arg2 = (void *) 0 ;
  size_t arg3 ;
  uint32_t arg4 ;
  lldb::ConnectionStatus *arg5 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  size_t val3 ;
  int ecode3 = 0 ;
  unsigned int val4 ;
  int ecode4 = 0 ;
  void *argp5 = 0 ;
  int res5 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  PyObject * obj4 = 0 ;
  size_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOOO:SBCommunication_Read",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommunication, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommunication_Read" "', argument " "1"" of type '" "lldb::SBCommunication *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommunication * >(argp1);
  res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2), 0, 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBCommunication_Read" "', argument " "2"" of type '" "void *""'"); 
  }
  ecode3 = SWIG_AsVal_size_t(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBCommunication_Read" "', argument " "3"" of type '" "size_t""'");
  } 
  arg3 = static_cast< size_t >(val3);
  ecode4 = SWIG_AsVal_unsigned_SS_int(obj3, &val4);
  if (!SWIG_IsOK(ecode4)) {
    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "SBCommunication_Read" "', argument " "4"" of type '" "uint32_t""'");
  } 
  arg4 = static_cast< uint32_t >(val4);
  res5 = SWIG_ConvertPtr(obj4, &argp5, SWIGTYPE_p_lldb__ConnectionStatus,  0 );
  if (!SWIG_IsOK(res5)) {
    SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "SBCommunication_Read" "', argument " "5"" of type '" "lldb::ConnectionStatus &""'"); 
  }
  if (!argp5) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBCommunication_Read" "', argument " "5"" of type '" "lldb::ConnectionStatus &""'"); 
  }
  arg5 = reinterpret_cast< lldb::ConnectionStatus * >(argp5);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->Read(arg2,arg3,arg4,*arg5);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommunication_Write(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommunication *arg1 = (lldb::SBCommunication *) 0 ;
  void *arg2 = (void *) 0 ;
  size_t arg3 ;
  lldb::ConnectionStatus *arg4 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  size_t val3 ;
  int ecode3 = 0 ;
  void *argp4 = 0 ;
  int res4 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  size_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOO:SBCommunication_Write",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommunication, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommunication_Write" "', argument " "1"" of type '" "lldb::SBCommunication *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommunication * >(argp1);
  res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2), 0, 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBCommunication_Write" "', argument " "2"" of type '" "void const *""'"); 
  }
  ecode3 = SWIG_AsVal_size_t(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBCommunication_Write" "', argument " "3"" of type '" "size_t""'");
  } 
  arg3 = static_cast< size_t >(val3);
  res4 = SWIG_ConvertPtr(obj3, &argp4, SWIGTYPE_p_lldb__ConnectionStatus,  0 );
  if (!SWIG_IsOK(res4)) {
    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "SBCommunication_Write" "', argument " "4"" of type '" "lldb::ConnectionStatus &""'"); 
  }
  if (!argp4) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBCommunication_Write" "', argument " "4"" of type '" "lldb::ConnectionStatus &""'"); 
  }
  arg4 = reinterpret_cast< lldb::ConnectionStatus * >(argp4);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->Write((void const *)arg2,arg3,*arg4);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommunication_ReadThreadStart(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommunication *arg1 = (lldb::SBCommunication *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBCommunication_ReadThreadStart",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommunication, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommunication_ReadThreadStart" "', argument " "1"" of type '" "lldb::SBCommunication *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommunication * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->ReadThreadStart();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommunication_ReadThreadStop(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommunication *arg1 = (lldb::SBCommunication *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBCommunication_ReadThreadStop",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommunication, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommunication_ReadThreadStop" "', argument " "1"" of type '" "lldb::SBCommunication *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommunication * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->ReadThreadStop();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommunication_ReadThreadIsRunning(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommunication *arg1 = (lldb::SBCommunication *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBCommunication_ReadThreadIsRunning",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommunication, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommunication_ReadThreadIsRunning" "', argument " "1"" of type '" "lldb::SBCommunication *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommunication * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->ReadThreadIsRunning();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCommunication_SetReadThreadBytesReceivedCallback(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCommunication *arg1 = (lldb::SBCommunication *) 0 ;
  lldb::SBCommunication::ReadThreadBytesReceived arg2 = (lldb::SBCommunication::ReadThreadBytesReceived) 0 ;
  void *arg3 = (void *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res3 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBCommunication_SetReadThreadBytesReceivedCallback",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCommunication, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCommunication_SetReadThreadBytesReceivedCallback" "', argument " "1"" of type '" "lldb::SBCommunication *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCommunication * >(argp1);
  {
    int res = SWIG_ConvertFunctionPtr(obj1, (void**)(&arg2), SWIGTYPE_p_f_p_void_p_q_const__void_size_t__void);
    if (!SWIG_IsOK(res)) {
      SWIG_exception_fail(SWIG_ArgError(res), "in method '" "SBCommunication_SetReadThreadBytesReceivedCallback" "', argument " "2"" of type '" "lldb::SBCommunication::ReadThreadBytesReceived""'"); 
    }
  }
  res3 = SWIG_ConvertPtr(obj2,SWIG_as_voidptrptr(&arg3), 0, 0);
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBCommunication_SetReadThreadBytesReceivedCallback" "', argument " "3"" of type '" "void *""'"); 
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->SetReadThreadBytesReceivedCallback(arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBCommunication_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBCommunication, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBCompileUnit__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCompileUnit *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBCompileUnit")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBCompileUnit *)new lldb::SBCompileUnit();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBCompileUnit, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBCompileUnit__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCompileUnit *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBCompileUnit *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBCompileUnit",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBCompileUnit,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBCompileUnit" "', argument " "1"" of type '" "lldb::SBCompileUnit const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBCompileUnit" "', argument " "1"" of type '" "lldb::SBCompileUnit const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCompileUnit * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBCompileUnit *)new lldb::SBCompileUnit((lldb::SBCompileUnit const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBCompileUnit, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBCompileUnit(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBCompileUnit__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBCompileUnit, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBCompileUnit__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBCompileUnit'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBCompileUnit()\n"
    "    lldb::SBCompileUnit(lldb::SBCompileUnit const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBCompileUnit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCompileUnit *arg1 = (lldb::SBCompileUnit *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBCompileUnit",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCompileUnit, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBCompileUnit" "', argument " "1"" of type '" "lldb::SBCompileUnit *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCompileUnit * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCompileUnit_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCompileUnit *arg1 = (lldb::SBCompileUnit *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBCompileUnit_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCompileUnit, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCompileUnit_IsValid" "', argument " "1"" of type '" "lldb::SBCompileUnit const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCompileUnit * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBCompileUnit const *)arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCompileUnit_GetFileSpec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCompileUnit *arg1 = (lldb::SBCompileUnit *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBFileSpec result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBCompileUnit_GetFileSpec",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCompileUnit, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCompileUnit_GetFileSpec" "', argument " "1"" of type '" "lldb::SBCompileUnit const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCompileUnit * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBCompileUnit const *)arg1)->GetFileSpec();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBFileSpec(static_cast< const lldb::SBFileSpec& >(result))), SWIGTYPE_p_lldb__SBFileSpec, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCompileUnit_GetNumLineEntries(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCompileUnit *arg1 = (lldb::SBCompileUnit *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBCompileUnit_GetNumLineEntries",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCompileUnit, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCompileUnit_GetNumLineEntries" "', argument " "1"" of type '" "lldb::SBCompileUnit const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCompileUnit * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)((lldb::SBCompileUnit const *)arg1)->GetNumLineEntries();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCompileUnit_GetLineEntryAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCompileUnit *arg1 = (lldb::SBCompileUnit *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBLineEntry result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBCompileUnit_GetLineEntryAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCompileUnit, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCompileUnit_GetLineEntryAtIndex" "', argument " "1"" of type '" "lldb::SBCompileUnit const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCompileUnit * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBCompileUnit_GetLineEntryAtIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBCompileUnit const *)arg1)->GetLineEntryAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBLineEntry(static_cast< const lldb::SBLineEntry& >(result))), SWIGTYPE_p_lldb__SBLineEntry, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCompileUnit_FindLineEntryIndex__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCompileUnit *arg1 = (lldb::SBCompileUnit *) 0 ;
  uint32_t arg2 ;
  uint32_t arg3 ;
  lldb::SBFileSpec *arg4 = (lldb::SBFileSpec *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  unsigned int val3 ;
  int ecode3 = 0 ;
  void *argp4 = 0 ;
  int res4 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOO:SBCompileUnit_FindLineEntryIndex",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCompileUnit, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCompileUnit_FindLineEntryIndex" "', argument " "1"" of type '" "lldb::SBCompileUnit const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCompileUnit * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBCompileUnit_FindLineEntryIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  ecode3 = SWIG_AsVal_unsigned_SS_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBCompileUnit_FindLineEntryIndex" "', argument " "3"" of type '" "uint32_t""'");
  } 
  arg3 = static_cast< uint32_t >(val3);
  res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_lldb__SBFileSpec, 0 |  0 );
  if (!SWIG_IsOK(res4)) {
    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "SBCompileUnit_FindLineEntryIndex" "', argument " "4"" of type '" "lldb::SBFileSpec *""'"); 
  }
  arg4 = reinterpret_cast< lldb::SBFileSpec * >(argp4);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)((lldb::SBCompileUnit const *)arg1)->FindLineEntryIndex(arg2,arg3,arg4);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCompileUnit_FindLineEntryIndex__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCompileUnit *arg1 = (lldb::SBCompileUnit *) 0 ;
  uint32_t arg2 ;
  uint32_t arg3 ;
  lldb::SBFileSpec *arg4 = (lldb::SBFileSpec *) 0 ;
  bool arg5 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  unsigned int val3 ;
  int ecode3 = 0 ;
  void *argp4 = 0 ;
  int res4 = 0 ;
  bool val5 ;
  int ecode5 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  PyObject * obj4 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOOO:SBCompileUnit_FindLineEntryIndex",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCompileUnit, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCompileUnit_FindLineEntryIndex" "', argument " "1"" of type '" "lldb::SBCompileUnit const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCompileUnit * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBCompileUnit_FindLineEntryIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  ecode3 = SWIG_AsVal_unsigned_SS_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBCompileUnit_FindLineEntryIndex" "', argument " "3"" of type '" "uint32_t""'");
  } 
  arg3 = static_cast< uint32_t >(val3);
  res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_lldb__SBFileSpec, 0 |  0 );
  if (!SWIG_IsOK(res4)) {
    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "SBCompileUnit_FindLineEntryIndex" "', argument " "4"" of type '" "lldb::SBFileSpec *""'"); 
  }
  arg4 = reinterpret_cast< lldb::SBFileSpec * >(argp4);
  ecode5 = SWIG_AsVal_bool(obj4, &val5);
  if (!SWIG_IsOK(ecode5)) {
    SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "SBCompileUnit_FindLineEntryIndex" "', argument " "5"" of type '" "bool""'");
  } 
  arg5 = static_cast< bool >(val5);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)((lldb::SBCompileUnit const *)arg1)->FindLineEntryIndex(arg2,arg3,arg4,arg5);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCompileUnit_FindLineEntryIndex(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[6];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 5); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 4) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBCompileUnit, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_unsigned_SS_int(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        {
          int res = SWIG_AsVal_unsigned_SS_int(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          void *vptr = 0;
          int res = SWIG_ConvertPtr(argv[3], &vptr, SWIGTYPE_p_lldb__SBFileSpec, 0);
          _v = SWIG_CheckState(res);
          if (_v) {
            return _wrap_SBCompileUnit_FindLineEntryIndex__SWIG_0(self, args);
          }
        }
      }
    }
  }
  if (argc == 5) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBCompileUnit, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_unsigned_SS_int(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        {
          int res = SWIG_AsVal_unsigned_SS_int(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          void *vptr = 0;
          int res = SWIG_ConvertPtr(argv[3], &vptr, SWIGTYPE_p_lldb__SBFileSpec, 0);
          _v = SWIG_CheckState(res);
          if (_v) {
            {
              int res = SWIG_AsVal_bool(argv[4], NULL);
              _v = SWIG_CheckState(res);
            }
            if (_v) {
              return _wrap_SBCompileUnit_FindLineEntryIndex__SWIG_1(self, args);
            }
          }
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBCompileUnit_FindLineEntryIndex'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    FindLineEntryIndex(lldb::SBCompileUnit const *,uint32_t,uint32_t,lldb::SBFileSpec *)\n"
    "    FindLineEntryIndex(lldb::SBCompileUnit const *,uint32_t,uint32_t,lldb::SBFileSpec *,bool)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCompileUnit_GetSupportFileAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCompileUnit *arg1 = (lldb::SBCompileUnit *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBFileSpec result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBCompileUnit_GetSupportFileAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCompileUnit, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCompileUnit_GetSupportFileAtIndex" "', argument " "1"" of type '" "lldb::SBCompileUnit const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCompileUnit * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBCompileUnit_GetSupportFileAtIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBCompileUnit const *)arg1)->GetSupportFileAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBFileSpec(static_cast< const lldb::SBFileSpec& >(result))), SWIGTYPE_p_lldb__SBFileSpec, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCompileUnit_GetNumSupportFiles(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCompileUnit *arg1 = (lldb::SBCompileUnit *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBCompileUnit_GetNumSupportFiles",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCompileUnit, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCompileUnit_GetNumSupportFiles" "', argument " "1"" of type '" "lldb::SBCompileUnit const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCompileUnit * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)((lldb::SBCompileUnit const *)arg1)->GetNumSupportFiles();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCompileUnit_FindSupportFileIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCompileUnit *arg1 = (lldb::SBCompileUnit *) 0 ;
  uint32_t arg2 ;
  lldb::SBFileSpec *arg3 = 0 ;
  bool arg4 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  void *argp3 = 0 ;
  int res3 = 0 ;
  bool val4 ;
  int ecode4 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOO:SBCompileUnit_FindSupportFileIndex",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCompileUnit, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCompileUnit_FindSupportFileIndex" "', argument " "1"" of type '" "lldb::SBCompileUnit *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCompileUnit * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBCompileUnit_FindSupportFileIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBFileSpec,  0  | 0);
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBCompileUnit_FindSupportFileIndex" "', argument " "3"" of type '" "lldb::SBFileSpec const &""'"); 
  }
  if (!argp3) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBCompileUnit_FindSupportFileIndex" "', argument " "3"" of type '" "lldb::SBFileSpec const &""'"); 
  }
  arg3 = reinterpret_cast< lldb::SBFileSpec * >(argp3);
  ecode4 = SWIG_AsVal_bool(obj3, &val4);
  if (!SWIG_IsOK(ecode4)) {
    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "SBCompileUnit_FindSupportFileIndex" "', argument " "4"" of type '" "bool""'");
  } 
  arg4 = static_cast< bool >(val4);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->FindSupportFileIndex(arg2,(lldb::SBFileSpec const &)*arg3,arg4);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCompileUnit_GetTypes__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCompileUnit *arg1 = (lldb::SBCompileUnit *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBTypeList result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBCompileUnit_GetTypes",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCompileUnit, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCompileUnit_GetTypes" "', argument " "1"" of type '" "lldb::SBCompileUnit *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCompileUnit * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBCompileUnit_GetTypes" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetTypes(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTypeList(static_cast< const lldb::SBTypeList& >(result))), SWIGTYPE_p_lldb__SBTypeList, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCompileUnit_GetTypes__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCompileUnit *arg1 = (lldb::SBCompileUnit *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBTypeList result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBCompileUnit_GetTypes",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCompileUnit, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCompileUnit_GetTypes" "', argument " "1"" of type '" "lldb::SBCompileUnit *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCompileUnit * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetTypes();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTypeList(static_cast< const lldb::SBTypeList& >(result))), SWIGTYPE_p_lldb__SBTypeList, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCompileUnit_GetTypes(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[3];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 2); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 1) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBCompileUnit, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_SBCompileUnit_GetTypes__SWIG_1(self, args);
    }
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBCompileUnit, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_unsigned_SS_int(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        return _wrap_SBCompileUnit_GetTypes__SWIG_0(self, args);
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBCompileUnit_GetTypes'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    GetTypes(lldb::SBCompileUnit *,uint32_t)\n"
    "    GetTypes(lldb::SBCompileUnit *)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCompileUnit_GetLanguage(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCompileUnit *arg1 = (lldb::SBCompileUnit *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::LanguageType result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBCompileUnit_GetLanguage",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCompileUnit, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCompileUnit_GetLanguage" "', argument " "1"" of type '" "lldb::SBCompileUnit *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCompileUnit * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::LanguageType)(arg1)->GetLanguage();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCompileUnit_GetDescription(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCompileUnit *arg1 = (lldb::SBCompileUnit *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBCompileUnit_GetDescription",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCompileUnit, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCompileUnit_GetDescription" "', argument " "1"" of type '" "lldb::SBCompileUnit *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCompileUnit * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBCompileUnit_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBCompileUnit_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetDescription(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCompileUnit___eq__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCompileUnit *arg1 = (lldb::SBCompileUnit *) 0 ;
  lldb::SBCompileUnit *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBCompileUnit___eq__",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCompileUnit, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCompileUnit___eq__" "', argument " "1"" of type '" "lldb::SBCompileUnit const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCompileUnit * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBCompileUnit,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBCompileUnit___eq__" "', argument " "2"" of type '" "lldb::SBCompileUnit const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBCompileUnit___eq__" "', argument " "2"" of type '" "lldb::SBCompileUnit const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBCompileUnit * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBCompileUnit const *)arg1)->operator ==((lldb::SBCompileUnit const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCompileUnit___ne__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCompileUnit *arg1 = (lldb::SBCompileUnit *) 0 ;
  lldb::SBCompileUnit *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBCompileUnit___ne__",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCompileUnit, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCompileUnit___ne__" "', argument " "1"" of type '" "lldb::SBCompileUnit const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCompileUnit * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBCompileUnit,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBCompileUnit___ne__" "', argument " "2"" of type '" "lldb::SBCompileUnit const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBCompileUnit___ne__" "', argument " "2"" of type '" "lldb::SBCompileUnit const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBCompileUnit * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBCompileUnit const *)arg1)->operator !=((lldb::SBCompileUnit const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBCompileUnit___str__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBCompileUnit *arg1 = (lldb::SBCompileUnit *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBCompileUnit___str__",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBCompileUnit, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBCompileUnit___str__" "', argument " "1"" of type '" "lldb::SBCompileUnit *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBCompileUnit * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (PyObject *)lldb_SBCompileUnit___str__(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = result;
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBCompileUnit_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBCompileUnit, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBData__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBData *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBData")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBData *)new lldb::SBData();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBData, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBData__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBData *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBData *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBData",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBData,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBData" "', argument " "1"" of type '" "lldb::SBData const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBData" "', argument " "1"" of type '" "lldb::SBData const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBData * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBData *)new lldb::SBData((lldb::SBData const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBData, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBData(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBData__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBData, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBData__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBData'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBData()\n"
    "    lldb::SBData(lldb::SBData const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBData *arg1 = (lldb::SBData *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBData",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBData, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBData" "', argument " "1"" of type '" "lldb::SBData *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBData * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBData_GetAddressByteSize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBData *arg1 = (lldb::SBData *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint8_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBData_GetAddressByteSize",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBData, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBData_GetAddressByteSize" "', argument " "1"" of type '" "lldb::SBData *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBData * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint8_t)(arg1)->GetAddressByteSize();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_char(static_cast< unsigned char >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBData_SetAddressByteSize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBData *arg1 = (lldb::SBData *) 0 ;
  uint8_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned char val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBData_SetAddressByteSize",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBData, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBData_SetAddressByteSize" "', argument " "1"" of type '" "lldb::SBData *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBData * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_char(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBData_SetAddressByteSize" "', argument " "2"" of type '" "uint8_t""'");
  } 
  arg2 = static_cast< uint8_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetAddressByteSize(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBData_Clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBData *arg1 = (lldb::SBData *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBData_Clear",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBData, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBData_Clear" "', argument " "1"" of type '" "lldb::SBData *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBData * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->Clear();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBData_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBData *arg1 = (lldb::SBData *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBData_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBData, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBData_IsValid" "', argument " "1"" of type '" "lldb::SBData *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBData * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBData_GetByteSize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBData *arg1 = (lldb::SBData *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  size_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBData_GetByteSize",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBData, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBData_GetByteSize" "', argument " "1"" of type '" "lldb::SBData *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBData * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetByteSize();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBData_GetByteOrder(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBData *arg1 = (lldb::SBData *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::ByteOrder result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBData_GetByteOrder",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBData, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBData_GetByteOrder" "', argument " "1"" of type '" "lldb::SBData *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBData * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::ByteOrder)(arg1)->GetByteOrder();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBData_SetByteOrder(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBData *arg1 = (lldb::SBData *) 0 ;
  lldb::ByteOrder arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBData_SetByteOrder",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBData, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBData_SetByteOrder" "', argument " "1"" of type '" "lldb::SBData *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBData * >(argp1);
  ecode2 = SWIG_AsVal_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBData_SetByteOrder" "', argument " "2"" of type '" "lldb::ByteOrder""'");
  } 
  arg2 = static_cast< lldb::ByteOrder >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetByteOrder(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBData_GetFloat(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBData *arg1 = (lldb::SBData *) 0 ;
  lldb::SBError *arg2 = 0 ;
  lldb::offset_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  unsigned long long val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  float result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBData_GetFloat",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBData, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBData_GetFloat" "', argument " "1"" of type '" "lldb::SBData *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBData * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBData_GetFloat" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBData_GetFloat" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBError * >(argp2);
  ecode3 = SWIG_AsVal_unsigned_SS_long_SS_long(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBData_GetFloat" "', argument " "3"" of type '" "lldb::offset_t""'");
  } 
  arg3 = static_cast< lldb::offset_t >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (float)(arg1)->GetFloat(*arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_float(static_cast< float >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBData_GetDouble(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBData *arg1 = (lldb::SBData *) 0 ;
  lldb::SBError *arg2 = 0 ;
  lldb::offset_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  unsigned long long val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  double result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBData_GetDouble",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBData, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBData_GetDouble" "', argument " "1"" of type '" "lldb::SBData *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBData * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBData_GetDouble" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBData_GetDouble" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBError * >(argp2);
  ecode3 = SWIG_AsVal_unsigned_SS_long_SS_long(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBData_GetDouble" "', argument " "3"" of type '" "lldb::offset_t""'");
  } 
  arg3 = static_cast< lldb::offset_t >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (double)(arg1)->GetDouble(*arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_double(static_cast< double >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBData_GetLongDouble(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBData *arg1 = (lldb::SBData *) 0 ;
  lldb::SBError *arg2 = 0 ;
  lldb::offset_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  unsigned long long val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  long double result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBData_GetLongDouble",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBData, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBData_GetLongDouble" "', argument " "1"" of type '" "lldb::SBData *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBData * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBData_GetLongDouble" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBData_GetLongDouble" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBError * >(argp2);
  ecode3 = SWIG_AsVal_unsigned_SS_long_SS_long(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBData_GetLongDouble" "', argument " "3"" of type '" "lldb::offset_t""'");
  } 
  arg3 = static_cast< lldb::offset_t >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (long double)(arg1)->GetLongDouble(*arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new long double(static_cast< const long double& >(result))), SWIGTYPE_p_long_double, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBData_GetAddress(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBData *arg1 = (lldb::SBData *) 0 ;
  lldb::SBError *arg2 = 0 ;
  lldb::offset_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  unsigned long long val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::addr_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBData_GetAddress",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBData, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBData_GetAddress" "', argument " "1"" of type '" "lldb::SBData *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBData * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBData_GetAddress" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBData_GetAddress" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBError * >(argp2);
  ecode3 = SWIG_AsVal_unsigned_SS_long_SS_long(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBData_GetAddress" "', argument " "3"" of type '" "lldb::offset_t""'");
  } 
  arg3 = static_cast< lldb::offset_t >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::addr_t)(arg1)->GetAddress(*arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBData_GetUnsignedInt8(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBData *arg1 = (lldb::SBData *) 0 ;
  lldb::SBError *arg2 = 0 ;
  lldb::offset_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  unsigned long long val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  uint8_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBData_GetUnsignedInt8",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBData, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBData_GetUnsignedInt8" "', argument " "1"" of type '" "lldb::SBData *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBData * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBData_GetUnsignedInt8" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBData_GetUnsignedInt8" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBError * >(argp2);
  ecode3 = SWIG_AsVal_unsigned_SS_long_SS_long(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBData_GetUnsignedInt8" "', argument " "3"" of type '" "lldb::offset_t""'");
  } 
  arg3 = static_cast< lldb::offset_t >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint8_t)(arg1)->GetUnsignedInt8(*arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_char(static_cast< unsigned char >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBData_GetUnsignedInt16(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBData *arg1 = (lldb::SBData *) 0 ;
  lldb::SBError *arg2 = 0 ;
  lldb::offset_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  unsigned long long val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  uint16_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBData_GetUnsignedInt16",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBData, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBData_GetUnsignedInt16" "', argument " "1"" of type '" "lldb::SBData *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBData * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBData_GetUnsignedInt16" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBData_GetUnsignedInt16" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBError * >(argp2);
  ecode3 = SWIG_AsVal_unsigned_SS_long_SS_long(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBData_GetUnsignedInt16" "', argument " "3"" of type '" "lldb::offset_t""'");
  } 
  arg3 = static_cast< lldb::offset_t >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint16_t)(arg1)->GetUnsignedInt16(*arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_short(static_cast< unsigned short >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBData_GetUnsignedInt32(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBData *arg1 = (lldb::SBData *) 0 ;
  lldb::SBError *arg2 = 0 ;
  lldb::offset_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  unsigned long long val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBData_GetUnsignedInt32",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBData, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBData_GetUnsignedInt32" "', argument " "1"" of type '" "lldb::SBData *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBData * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBData_GetUnsignedInt32" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBData_GetUnsignedInt32" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBError * >(argp2);
  ecode3 = SWIG_AsVal_unsigned_SS_long_SS_long(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBData_GetUnsignedInt32" "', argument " "3"" of type '" "lldb::offset_t""'");
  } 
  arg3 = static_cast< lldb::offset_t >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetUnsignedInt32(*arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBData_GetUnsignedInt64(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBData *arg1 = (lldb::SBData *) 0 ;
  lldb::SBError *arg2 = 0 ;
  lldb::offset_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  unsigned long long val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  uint64_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBData_GetUnsignedInt64",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBData, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBData_GetUnsignedInt64" "', argument " "1"" of type '" "lldb::SBData *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBData * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBData_GetUnsignedInt64" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBData_GetUnsignedInt64" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBError * >(argp2);
  ecode3 = SWIG_AsVal_unsigned_SS_long_SS_long(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBData_GetUnsignedInt64" "', argument " "3"" of type '" "lldb::offset_t""'");
  } 
  arg3 = static_cast< lldb::offset_t >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint64_t)(arg1)->GetUnsignedInt64(*arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBData_GetSignedInt8(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBData *arg1 = (lldb::SBData *) 0 ;
  lldb::SBError *arg2 = 0 ;
  lldb::offset_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  unsigned long long val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  int8_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBData_GetSignedInt8",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBData, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBData_GetSignedInt8" "', argument " "1"" of type '" "lldb::SBData *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBData * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBData_GetSignedInt8" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBData_GetSignedInt8" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBError * >(argp2);
  ecode3 = SWIG_AsVal_unsigned_SS_long_SS_long(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBData_GetSignedInt8" "', argument " "3"" of type '" "lldb::offset_t""'");
  } 
  arg3 = static_cast< lldb::offset_t >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (int8_t)(arg1)->GetSignedInt8(*arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_signed_SS_char(static_cast< signed char >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBData_GetSignedInt16(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBData *arg1 = (lldb::SBData *) 0 ;
  lldb::SBError *arg2 = 0 ;
  lldb::offset_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  unsigned long long val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  int16_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBData_GetSignedInt16",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBData, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBData_GetSignedInt16" "', argument " "1"" of type '" "lldb::SBData *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBData * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBData_GetSignedInt16" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBData_GetSignedInt16" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBError * >(argp2);
  ecode3 = SWIG_AsVal_unsigned_SS_long_SS_long(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBData_GetSignedInt16" "', argument " "3"" of type '" "lldb::offset_t""'");
  } 
  arg3 = static_cast< lldb::offset_t >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (int16_t)(arg1)->GetSignedInt16(*arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_short(static_cast< short >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBData_GetSignedInt32(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBData *arg1 = (lldb::SBData *) 0 ;
  lldb::SBError *arg2 = 0 ;
  lldb::offset_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  unsigned long long val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  int32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBData_GetSignedInt32",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBData, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBData_GetSignedInt32" "', argument " "1"" of type '" "lldb::SBData *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBData * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBData_GetSignedInt32" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBData_GetSignedInt32" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBError * >(argp2);
  ecode3 = SWIG_AsVal_unsigned_SS_long_SS_long(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBData_GetSignedInt32" "', argument " "3"" of type '" "lldb::offset_t""'");
  } 
  arg3 = static_cast< lldb::offset_t >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (int32_t)(arg1)->GetSignedInt32(*arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBData_GetSignedInt64(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBData *arg1 = (lldb::SBData *) 0 ;
  lldb::SBError *arg2 = 0 ;
  lldb::offset_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  unsigned long long val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  int64_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBData_GetSignedInt64",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBData, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBData_GetSignedInt64" "', argument " "1"" of type '" "lldb::SBData *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBData * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBData_GetSignedInt64" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBData_GetSignedInt64" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBError * >(argp2);
  ecode3 = SWIG_AsVal_unsigned_SS_long_SS_long(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBData_GetSignedInt64" "', argument " "3"" of type '" "lldb::offset_t""'");
  } 
  arg3 = static_cast< lldb::offset_t >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (int64_t)(arg1)->GetSignedInt64(*arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_long_SS_long(static_cast< long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBData_GetString(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBData *arg1 = (lldb::SBData *) 0 ;
  lldb::SBError *arg2 = 0 ;
  lldb::offset_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  unsigned long long val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBData_GetString",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBData, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBData_GetString" "', argument " "1"" of type '" "lldb::SBData *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBData * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBData_GetString" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBData_GetString" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBError * >(argp2);
  ecode3 = SWIG_AsVal_unsigned_SS_long_SS_long(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBData_GetString" "', argument " "3"" of type '" "lldb::offset_t""'");
  } 
  arg3 = static_cast< lldb::offset_t >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetString(*arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBData_GetDescription(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBData *arg1 = (lldb::SBData *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  lldb::addr_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  unsigned long long val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBData_GetDescription",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBData, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBData_GetDescription" "', argument " "1"" of type '" "lldb::SBData *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBData * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBData_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBData_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  ecode3 = SWIG_AsVal_unsigned_SS_long_SS_long(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBData_GetDescription" "', argument " "3"" of type '" "lldb::addr_t""'");
  } 
  arg3 = static_cast< lldb::addr_t >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetDescription(*arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBData_ReadRawData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBData *arg1 = (lldb::SBData *) 0 ;
  lldb::SBError *arg2 = 0 ;
  lldb::offset_t arg3 ;
  void *arg4 = (void *) 0 ;
  size_t arg5 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  unsigned long long val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  size_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOO:SBData_ReadRawData",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBData, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBData_ReadRawData" "', argument " "1"" of type '" "lldb::SBData *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBData * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBData_ReadRawData" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBData_ReadRawData" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBError * >(argp2);
  ecode3 = SWIG_AsVal_unsigned_SS_long_SS_long(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBData_ReadRawData" "', argument " "3"" of type '" "lldb::offset_t""'");
  } 
  arg3 = static_cast< lldb::offset_t >(val3);
  {
    if (PyInt_Check(obj3)) {
      arg5 = PyInt_AsLong(obj3);
    } else if (PyLong_Check(obj3)) {
      arg5 = PyLong_AsLong(obj3);
    } else {
      PyErr_SetString(PyExc_ValueError, "Expecting an integer or long object");
      return NULL;
    }
    if (arg5 <= 0) {
      PyErr_SetString(PyExc_ValueError, "Positive integer expected");
      return NULL;
    }
    arg4 = (void *) malloc(arg5);
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->ReadRawData(*arg2,arg3,arg4,arg5);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
  {
    Py_XDECREF(resultobj);   /* Blow away any previous result */
    if (result == 0) {
      resultobj = Py_None;
      Py_INCREF(resultobj);
    } else {
      lldb_private::PythonBytes bytes(static_cast<const uint8_t*>(arg4), result);
      resultobj = bytes.release();
    }
    free(arg4);
  }
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBData_SetData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBData *arg1 = (lldb::SBData *) 0 ;
  lldb::SBError *arg2 = 0 ;
  void *arg3 = (void *) 0 ;
  size_t arg4 ;
  lldb::ByteOrder arg5 ;
  uint8_t arg6 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  int val5 ;
  int ecode5 = 0 ;
  unsigned char val6 ;
  int ecode6 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  PyObject * obj4 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOOO:SBData_SetData",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBData, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBData_SetData" "', argument " "1"" of type '" "lldb::SBData *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBData * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBData_SetData" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBData_SetData" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBError * >(argp2);
  {
    using namespace lldb_private;
    if (PythonString::Check(obj2)) {
      PythonString str(PyRefType::Borrowed, obj2);
      arg3 = (void*)str.GetString().data();
      arg4 = str.GetSize();
    }
    else if(PythonByteArray::Check(obj2)) {
      PythonByteArray bytearray(PyRefType::Borrowed, obj2);
      arg3 = (void*)bytearray.GetBytes().data();
      arg4 = bytearray.GetSize();
    }
    else if (PythonBytes::Check(obj2)) {
      PythonBytes bytes(PyRefType::Borrowed, obj2);
      arg3 = (void*)bytes.GetBytes().data();
      arg4 = bytes.GetSize();
    }
    else {
      PyErr_SetString(PyExc_ValueError, "Expecting a buffer");
      return NULL;
    }
  }
  ecode5 = SWIG_AsVal_int(obj3, &val5);
  if (!SWIG_IsOK(ecode5)) {
    SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "SBData_SetData" "', argument " "5"" of type '" "lldb::ByteOrder""'");
  } 
  arg5 = static_cast< lldb::ByteOrder >(val5);
  ecode6 = SWIG_AsVal_unsigned_SS_char(obj4, &val6);
  if (!SWIG_IsOK(ecode6)) {
    SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "SBData_SetData" "', argument " "6"" of type '" "uint8_t""'");
  } 
  arg6 = static_cast< uint8_t >(val6);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetData(*arg2,(void const *)arg3,arg4,arg5,arg6);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBData_Append(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBData *arg1 = (lldb::SBData *) 0 ;
  lldb::SBData *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBData_Append",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBData, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBData_Append" "', argument " "1"" of type '" "lldb::SBData *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBData * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBData,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBData_Append" "', argument " "2"" of type '" "lldb::SBData const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBData_Append" "', argument " "2"" of type '" "lldb::SBData const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBData * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->Append((lldb::SBData const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBData_CreateDataFromCString(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::ByteOrder arg1 ;
  uint32_t arg2 ;
  char *arg3 = (char *) 0 ;
  int val1 ;
  int ecode1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  int res3 ;
  char *buf3 = 0 ;
  int alloc3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBData result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBData_CreateDataFromCString",&obj0,&obj1,&obj2)) SWIG_fail;
  ecode1 = SWIG_AsVal_int(obj0, &val1);
  if (!SWIG_IsOK(ecode1)) {
    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "SBData_CreateDataFromCString" "', argument " "1"" of type '" "lldb::ByteOrder""'");
  } 
  arg1 = static_cast< lldb::ByteOrder >(val1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBData_CreateDataFromCString" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3);
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBData_CreateDataFromCString" "', argument " "3"" of type '" "char const *""'");
  }
  arg3 = reinterpret_cast< char * >(buf3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = lldb::SBData::CreateDataFromCString(arg1,arg2,(char const *)arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBData(static_cast< const lldb::SBData& >(result))), SWIGTYPE_p_lldb__SBData, SWIG_POINTER_OWN |  0 );
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  return resultobj;
fail:
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBData_CreateDataFromUInt64Array(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::ByteOrder arg1 ;
  uint32_t arg2 ;
  uint64_t *arg3 = (uint64_t *) 0 ;
  size_t arg4 ;
  int val1 ;
  int ecode1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBData result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBData_CreateDataFromUInt64Array",&obj0,&obj1,&obj2)) SWIG_fail;
  ecode1 = SWIG_AsVal_int(obj0, &val1);
  if (!SWIG_IsOK(ecode1)) {
    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "SBData_CreateDataFromUInt64Array" "', argument " "1"" of type '" "lldb::ByteOrder""'");
  } 
  arg1 = static_cast< lldb::ByteOrder >(val1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBData_CreateDataFromUInt64Array" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    /* Check if is a list  */
    if (PyList_Check(obj2)) {
      int size = PyList_Size(obj2);
      int i = 0;
      arg4 = size;
      arg3 = (uint64_t*) malloc(size * sizeof(uint64_t));
      for (i = 0; i < size; i++) {
        PyObject *o = PyList_GetItem(obj2,i);
        if (PyInt_Check(o)) {
          arg3[i] = PyInt_AsLong(o);
        }
        else if (PyLong_Check(o)) {
          arg3[i] = PyLong_AsUnsignedLongLong(o);
        }
        else {
          PyErr_SetString(PyExc_TypeError,"list must contain numbers");
          free(arg3);
          return NULL;
        }
        
        if (PyErr_Occurred()) {
          free(arg3);
          return NULL;
        }
      }
    } else if (obj2 == Py_None) {
      arg3 =  NULL;
      arg4 = 0;
    } else {
      PyErr_SetString(PyExc_TypeError,"not a list");
      return NULL;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = lldb::SBData::CreateDataFromUInt64Array(arg1,arg2,arg3,arg4);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBData(static_cast< const lldb::SBData& >(result))), SWIGTYPE_p_lldb__SBData, SWIG_POINTER_OWN |  0 );
  {
    free(arg3);
  }
  return resultobj;
fail:
  {
    free(arg3);
  }
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBData_CreateDataFromUInt32Array(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::ByteOrder arg1 ;
  uint32_t arg2 ;
  uint32_t *arg3 = (uint32_t *) 0 ;
  size_t arg4 ;
  int val1 ;
  int ecode1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBData result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBData_CreateDataFromUInt32Array",&obj0,&obj1,&obj2)) SWIG_fail;
  ecode1 = SWIG_AsVal_int(obj0, &val1);
  if (!SWIG_IsOK(ecode1)) {
    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "SBData_CreateDataFromUInt32Array" "', argument " "1"" of type '" "lldb::ByteOrder""'");
  } 
  arg1 = static_cast< lldb::ByteOrder >(val1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBData_CreateDataFromUInt32Array" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    /* Check if is a list  */
    if (PyList_Check(obj2)) {
      int size = PyList_Size(obj2);
      int i = 0;
      arg4 = size;
      arg3 = (uint32_t*) malloc(size * sizeof(uint32_t));
      for (i = 0; i < size; i++) {
        PyObject *o = PyList_GetItem(obj2,i);
        if (PyInt_Check(o)) {
          arg3[i] = PyInt_AsLong(o);
        }
        else if (PyLong_Check(o)) {
          arg3[i] = PyLong_AsUnsignedLong(o);
        }
        else {
          PyErr_SetString(PyExc_TypeError,"list must contain numbers");
          free(arg3);
          return NULL;
        }
        
        if (PyErr_Occurred()) {
          free(arg3);
          return NULL;
        }
      }
    } else if (obj2 == Py_None) {
      arg3 =  NULL;
      arg4 = 0;
    } else {
      PyErr_SetString(PyExc_TypeError,"not a list");
      return NULL;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = lldb::SBData::CreateDataFromUInt32Array(arg1,arg2,arg3,arg4);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBData(static_cast< const lldb::SBData& >(result))), SWIGTYPE_p_lldb__SBData, SWIG_POINTER_OWN |  0 );
  {
    free(arg3);
  }
  return resultobj;
fail:
  {
    free(arg3);
  }
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBData_CreateDataFromSInt64Array(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::ByteOrder arg1 ;
  uint32_t arg2 ;
  int64_t *arg3 = (int64_t *) 0 ;
  size_t arg4 ;
  int val1 ;
  int ecode1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBData result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBData_CreateDataFromSInt64Array",&obj0,&obj1,&obj2)) SWIG_fail;
  ecode1 = SWIG_AsVal_int(obj0, &val1);
  if (!SWIG_IsOK(ecode1)) {
    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "SBData_CreateDataFromSInt64Array" "', argument " "1"" of type '" "lldb::ByteOrder""'");
  } 
  arg1 = static_cast< lldb::ByteOrder >(val1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBData_CreateDataFromSInt64Array" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    /* Check if is a list  */
    if (PyList_Check(obj2)) {
      int size = PyList_Size(obj2);
      int i = 0;
      arg4 = size;
      arg3 = (int64_t*) malloc(size * sizeof(int64_t));
      for (i = 0; i < size; i++) {
        PyObject *o = PyList_GetItem(obj2,i);
        if (PyInt_Check(o)) {
          arg3[i] = PyInt_AsLong(o);
        }
        else if (PyLong_Check(o)) {
          arg3[i] = PyLong_AsLongLong(o);
        }
        else {
          PyErr_SetString(PyExc_TypeError,"list must contain numbers");
          free(arg3);
          return NULL;
        }
        
        if (PyErr_Occurred()) {
          free(arg3);
          return NULL;
        }
      }
    } else if (obj2 == Py_None) {
      arg3 =  NULL;
      arg4 = 0;
    } else {
      PyErr_SetString(PyExc_TypeError,"not a list");
      return NULL;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = lldb::SBData::CreateDataFromSInt64Array(arg1,arg2,arg3,arg4);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBData(static_cast< const lldb::SBData& >(result))), SWIGTYPE_p_lldb__SBData, SWIG_POINTER_OWN |  0 );
  {
    free(arg3);
  }
  return resultobj;
fail:
  {
    free(arg3);
  }
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBData_CreateDataFromSInt32Array(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::ByteOrder arg1 ;
  uint32_t arg2 ;
  int32_t *arg3 = (int32_t *) 0 ;
  size_t arg4 ;
  int val1 ;
  int ecode1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBData result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBData_CreateDataFromSInt32Array",&obj0,&obj1,&obj2)) SWIG_fail;
  ecode1 = SWIG_AsVal_int(obj0, &val1);
  if (!SWIG_IsOK(ecode1)) {
    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "SBData_CreateDataFromSInt32Array" "', argument " "1"" of type '" "lldb::ByteOrder""'");
  } 
  arg1 = static_cast< lldb::ByteOrder >(val1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBData_CreateDataFromSInt32Array" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    /* Check if is a list  */
    if (PyList_Check(obj2)) {
      int size = PyList_Size(obj2);
      int i = 0;
      arg4 = size;
      arg3 = (int32_t*) malloc(size * sizeof(int32_t));
      for (i = 0; i < size; i++) {
        PyObject *o = PyList_GetItem(obj2,i);
        if (PyInt_Check(o)) {
          arg3[i] = PyInt_AsLong(o);
        }
        else if (PyLong_Check(o)) {
          arg3[i] = PyLong_AsLong(o);
        }
        else {
          PyErr_SetString(PyExc_TypeError,"list must contain numbers");
          free(arg3);
          return NULL;
        }
        
        if (PyErr_Occurred()) {
          free(arg3);
          return NULL;
        }
      }
    } else if (obj2 == Py_None) {
      arg3 =  NULL;
      arg4 = 0;
    } else {
      PyErr_SetString(PyExc_TypeError,"not a list");
      return NULL;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = lldb::SBData::CreateDataFromSInt32Array(arg1,arg2,arg3,arg4);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBData(static_cast< const lldb::SBData& >(result))), SWIGTYPE_p_lldb__SBData, SWIG_POINTER_OWN |  0 );
  {
    free(arg3);
  }
  return resultobj;
fail:
  {
    free(arg3);
  }
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBData_CreateDataFromDoubleArray(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::ByteOrder arg1 ;
  uint32_t arg2 ;
  double *arg3 = (double *) 0 ;
  size_t arg4 ;
  int val1 ;
  int ecode1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBData result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBData_CreateDataFromDoubleArray",&obj0,&obj1,&obj2)) SWIG_fail;
  ecode1 = SWIG_AsVal_int(obj0, &val1);
  if (!SWIG_IsOK(ecode1)) {
    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "SBData_CreateDataFromDoubleArray" "', argument " "1"" of type '" "lldb::ByteOrder""'");
  } 
  arg1 = static_cast< lldb::ByteOrder >(val1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBData_CreateDataFromDoubleArray" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    /* Check if is a list  */
    if (PyList_Check(obj2)) {
      int size = PyList_Size(obj2);
      int i = 0;
      arg4 = size;
      arg3 = (double*) malloc(size * sizeof(double));
      for (i = 0; i < size; i++) {
        PyObject *o = PyList_GetItem(obj2,i);
        if (PyFloat_Check(o)) {
          arg3[i] = PyFloat_AsDouble(o);
        }
        else {
          PyErr_SetString(PyExc_TypeError,"list must contain floating-point numbers");
          free(arg3);
          return NULL;
        }
      }
    } else if (obj2 == Py_None) {
      arg3 =  NULL;
      arg4 = 0;
    } else {
      PyErr_SetString(PyExc_TypeError,"not a list");
      return NULL;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = lldb::SBData::CreateDataFromDoubleArray(arg1,arg2,arg3,arg4);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBData(static_cast< const lldb::SBData& >(result))), SWIGTYPE_p_lldb__SBData, SWIG_POINTER_OWN |  0 );
  {
    free(arg3);
  }
  return resultobj;
fail:
  {
    free(arg3);
  }
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBData_SetDataFromCString(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBData *arg1 = (lldb::SBData *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBData_SetDataFromCString",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBData, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBData_SetDataFromCString" "', argument " "1"" of type '" "lldb::SBData *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBData * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBData_SetDataFromCString" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->SetDataFromCString((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBData_SetDataFromUInt64Array(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBData *arg1 = (lldb::SBData *) 0 ;
  uint64_t *arg2 = (uint64_t *) 0 ;
  size_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBData_SetDataFromUInt64Array",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBData, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBData_SetDataFromUInt64Array" "', argument " "1"" of type '" "lldb::SBData *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBData * >(argp1);
  {
    /* Check if is a list  */
    if (PyList_Check(obj1)) {
      int size = PyList_Size(obj1);
      int i = 0;
      arg3 = size;
      arg2 = (uint64_t*) malloc(size * sizeof(uint64_t));
      for (i = 0; i < size; i++) {
        PyObject *o = PyList_GetItem(obj1,i);
        if (PyInt_Check(o)) {
          arg2[i] = PyInt_AsLong(o);
        }
        else if (PyLong_Check(o)) {
          arg2[i] = PyLong_AsUnsignedLongLong(o);
        }
        else {
          PyErr_SetString(PyExc_TypeError,"list must contain numbers");
          free(arg2);
          return NULL;
        }
        
        if (PyErr_Occurred()) {
          free(arg2);
          return NULL;
        }
      }
    } else if (obj1 == Py_None) {
      arg2 =  NULL;
      arg3 = 0;
    } else {
      PyErr_SetString(PyExc_TypeError,"not a list");
      return NULL;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->SetDataFromUInt64Array(arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  {
    free(arg2);
  }
  return resultobj;
fail:
  {
    free(arg2);
  }
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBData_SetDataFromUInt32Array(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBData *arg1 = (lldb::SBData *) 0 ;
  uint32_t *arg2 = (uint32_t *) 0 ;
  size_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBData_SetDataFromUInt32Array",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBData, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBData_SetDataFromUInt32Array" "', argument " "1"" of type '" "lldb::SBData *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBData * >(argp1);
  {
    /* Check if is a list  */
    if (PyList_Check(obj1)) {
      int size = PyList_Size(obj1);
      int i = 0;
      arg3 = size;
      arg2 = (uint32_t*) malloc(size * sizeof(uint32_t));
      for (i = 0; i < size; i++) {
        PyObject *o = PyList_GetItem(obj1,i);
        if (PyInt_Check(o)) {
          arg2[i] = PyInt_AsLong(o);
        }
        else if (PyLong_Check(o)) {
          arg2[i] = PyLong_AsUnsignedLong(o);
        }
        else {
          PyErr_SetString(PyExc_TypeError,"list must contain numbers");
          free(arg2);
          return NULL;
        }
        
        if (PyErr_Occurred()) {
          free(arg2);
          return NULL;
        }
      }
    } else if (obj1 == Py_None) {
      arg2 =  NULL;
      arg3 = 0;
    } else {
      PyErr_SetString(PyExc_TypeError,"not a list");
      return NULL;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->SetDataFromUInt32Array(arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  {
    free(arg2);
  }
  return resultobj;
fail:
  {
    free(arg2);
  }
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBData_SetDataFromSInt64Array(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBData *arg1 = (lldb::SBData *) 0 ;
  int64_t *arg2 = (int64_t *) 0 ;
  size_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBData_SetDataFromSInt64Array",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBData, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBData_SetDataFromSInt64Array" "', argument " "1"" of type '" "lldb::SBData *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBData * >(argp1);
  {
    /* Check if is a list  */
    if (PyList_Check(obj1)) {
      int size = PyList_Size(obj1);
      int i = 0;
      arg3 = size;
      arg2 = (int64_t*) malloc(size * sizeof(int64_t));
      for (i = 0; i < size; i++) {
        PyObject *o = PyList_GetItem(obj1,i);
        if (PyInt_Check(o)) {
          arg2[i] = PyInt_AsLong(o);
        }
        else if (PyLong_Check(o)) {
          arg2[i] = PyLong_AsLongLong(o);
        }
        else {
          PyErr_SetString(PyExc_TypeError,"list must contain numbers");
          free(arg2);
          return NULL;
        }
        
        if (PyErr_Occurred()) {
          free(arg2);
          return NULL;
        }
      }
    } else if (obj1 == Py_None) {
      arg2 =  NULL;
      arg3 = 0;
    } else {
      PyErr_SetString(PyExc_TypeError,"not a list");
      return NULL;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->SetDataFromSInt64Array(arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  {
    free(arg2);
  }
  return resultobj;
fail:
  {
    free(arg2);
  }
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBData_SetDataFromSInt32Array(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBData *arg1 = (lldb::SBData *) 0 ;
  int32_t *arg2 = (int32_t *) 0 ;
  size_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBData_SetDataFromSInt32Array",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBData, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBData_SetDataFromSInt32Array" "', argument " "1"" of type '" "lldb::SBData *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBData * >(argp1);
  {
    /* Check if is a list  */
    if (PyList_Check(obj1)) {
      int size = PyList_Size(obj1);
      int i = 0;
      arg3 = size;
      arg2 = (int32_t*) malloc(size * sizeof(int32_t));
      for (i = 0; i < size; i++) {
        PyObject *o = PyList_GetItem(obj1,i);
        if (PyInt_Check(o)) {
          arg2[i] = PyInt_AsLong(o);
        }
        else if (PyLong_Check(o)) {
          arg2[i] = PyLong_AsLong(o);
        }
        else {
          PyErr_SetString(PyExc_TypeError,"list must contain numbers");
          free(arg2);
          return NULL;
        }
        
        if (PyErr_Occurred()) {
          free(arg2);
          return NULL;
        }
      }
    } else if (obj1 == Py_None) {
      arg2 =  NULL;
      arg3 = 0;
    } else {
      PyErr_SetString(PyExc_TypeError,"not a list");
      return NULL;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->SetDataFromSInt32Array(arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  {
    free(arg2);
  }
  return resultobj;
fail:
  {
    free(arg2);
  }
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBData_SetDataFromDoubleArray(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBData *arg1 = (lldb::SBData *) 0 ;
  double *arg2 = (double *) 0 ;
  size_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBData_SetDataFromDoubleArray",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBData, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBData_SetDataFromDoubleArray" "', argument " "1"" of type '" "lldb::SBData *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBData * >(argp1);
  {
    /* Check if is a list  */
    if (PyList_Check(obj1)) {
      int size = PyList_Size(obj1);
      int i = 0;
      arg3 = size;
      arg2 = (double*) malloc(size * sizeof(double));
      for (i = 0; i < size; i++) {
        PyObject *o = PyList_GetItem(obj1,i);
        if (PyFloat_Check(o)) {
          arg2[i] = PyFloat_AsDouble(o);
        }
        else {
          PyErr_SetString(PyExc_TypeError,"list must contain floating-point numbers");
          free(arg2);
          return NULL;
        }
      }
    } else if (obj1 == Py_None) {
      arg2 =  NULL;
      arg3 = 0;
    } else {
      PyErr_SetString(PyExc_TypeError,"not a list");
      return NULL;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->SetDataFromDoubleArray(arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  {
    free(arg2);
  }
  return resultobj;
fail:
  {
    free(arg2);
  }
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBData___str__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBData *arg1 = (lldb::SBData *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBData___str__",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBData, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBData___str__" "', argument " "1"" of type '" "lldb::SBData *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBData * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (PyObject *)lldb_SBData___str__(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = result;
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBData_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBData, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_SBDebugger_Initialize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  
  if (!PyArg_ParseTuple(args,(char *)":SBDebugger_Initialize")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    lldb::SBDebugger::Initialize();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_Terminate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  
  if (!PyArg_ParseTuple(args,(char *)":SBDebugger_Terminate")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    lldb::SBDebugger::Terminate();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_Create__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger result;
  
  if (!PyArg_ParseTuple(args,(char *)":SBDebugger_Create")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = lldb::SBDebugger::Create();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBDebugger(static_cast< const lldb::SBDebugger& >(result))), SWIGTYPE_p_lldb__SBDebugger, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_Create__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  bool arg1 ;
  bool val1 ;
  int ecode1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBDebugger result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBDebugger_Create",&obj0)) SWIG_fail;
  ecode1 = SWIG_AsVal_bool(obj0, &val1);
  if (!SWIG_IsOK(ecode1)) {
    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "SBDebugger_Create" "', argument " "1"" of type '" "bool""'");
  } 
  arg1 = static_cast< bool >(val1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = lldb::SBDebugger::Create(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBDebugger(static_cast< const lldb::SBDebugger& >(result))), SWIGTYPE_p_lldb__SBDebugger, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_Create__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  bool arg1 ;
  lldb::LogOutputCallback arg2 = (lldb::LogOutputCallback) 0 ;
  void *arg3 = (void *) 0 ;
  bool val1 ;
  int ecode1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBDebugger result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBDebugger_Create",&obj0,&obj1)) SWIG_fail;
  ecode1 = SWIG_AsVal_bool(obj0, &val1);
  if (!SWIG_IsOK(ecode1)) {
    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "SBDebugger_Create" "', argument " "1"" of type '" "bool""'");
  } 
  arg1 = static_cast< bool >(val1);
  {
    if (!(obj1 == Py_None || PyCallable_Check(reinterpret_cast<PyObject*>(obj1)))) {
      PyErr_SetString(PyExc_TypeError, "Need a callable object or None!");
      return NULL;
    }
    
    // FIXME (filcab): We can't currently check if our callback is already
    // LLDBSwigPythonCallPythonLogOutputCallback (to DECREF the previous
    // baton) nor can we just remove all traces of a callback, if we want to
    // revert to a file logging mechanism.
    
    // Don't lose the callback reference
    Py_INCREF(obj1);
    arg2 = LLDBSwigPythonCallPythonLogOutputCallback;
    arg3 = obj1;
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = lldb::SBDebugger::Create(arg1,arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBDebugger(static_cast< const lldb::SBDebugger& >(result))), SWIGTYPE_p_lldb__SBDebugger, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_Create(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[3];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 2); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_SBDebugger_Create__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    {
      int res = SWIG_AsVal_bool(argv[0], NULL);
      _v = SWIG_CheckState(res);
    }
    if (_v) {
      return _wrap_SBDebugger_Create__SWIG_1(self, args);
    }
  }
  if (argc == 2) {
    int _v;
    {
      int res = SWIG_AsVal_bool(argv[0], NULL);
      _v = SWIG_CheckState(res);
    }
    if (_v) {
      {
        _v = argv[1] == Py_None;
        _v = _v || PyCallable_Check(reinterpret_cast<PyObject*>(argv[1]));
      }
      if (_v) {
        if (argc <= 2) {
          return _wrap_SBDebugger_Create__SWIG_2(self, args);
        }
        return _wrap_SBDebugger_Create__SWIG_2(self, args);
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBDebugger_Create'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    Create()\n"
    "    Create(bool)\n"
    "    lldb::SBDebugger::Create(bool,lldb::LogOutputCallback,void *)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_Destroy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBDebugger_Destroy",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBDebugger,  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_Destroy" "', argument " "1"" of type '" "lldb::SBDebugger &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBDebugger_Destroy" "', argument " "1"" of type '" "lldb::SBDebugger &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    lldb::SBDebugger::Destroy(*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_MemoryPressureDetected(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  
  if (!PyArg_ParseTuple(args,(char *)":SBDebugger_MemoryPressureDetected")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    lldb::SBDebugger::MemoryPressureDetected();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBDebugger__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBDebugger")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBDebugger *)new lldb::SBDebugger();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBDebugger, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBDebugger__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBDebugger *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBDebugger",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBDebugger,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBDebugger" "', argument " "1"" of type '" "lldb::SBDebugger const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBDebugger" "', argument " "1"" of type '" "lldb::SBDebugger const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBDebugger *)new lldb::SBDebugger((lldb::SBDebugger const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBDebugger, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBDebugger(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBDebugger__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBDebugger, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBDebugger__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBDebugger'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBDebugger()\n"
    "    lldb::SBDebugger(lldb::SBDebugger const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBDebugger(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBDebugger",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBDebugger" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBDebugger_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_IsValid" "', argument " "1"" of type '" "lldb::SBDebugger const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBDebugger const *)arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_Clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBDebugger_Clear",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_Clear" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->Clear();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_SetAsync(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBDebugger_SetAsync",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_SetAsync" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBDebugger_SetAsync" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetAsync(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_GetAsync(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBDebugger_GetAsync",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_GetAsync" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetAsync();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_SkipLLDBInitFiles(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBDebugger_SkipLLDBInitFiles",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_SkipLLDBInitFiles" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBDebugger_SkipLLDBInitFiles" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SkipLLDBInitFiles(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_SetInputFileHandle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  FILE *arg2 = (FILE *) 0 ;
  bool arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBDebugger_SetInputFileHandle",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_SetInputFileHandle" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  {
    using namespace lldb_private;
    if (obj1 == Py_None)
    arg2 = nullptr;
    else if (!lldb_private::PythonFile::Check(obj1)) {
      int fd = PyObject_AsFileDescriptor(obj1);
      PythonObject py_input(PyRefType::Borrowed, obj1);
      PythonString py_mode = py_input.GetAttributeValue("mode").AsType<PythonString>();
      
      if (-1 != fd && py_mode.IsValid()) {
        FILE *f;
        if ((f = fdopen(fd, py_mode.GetString().str().c_str())))
        arg2 = f;
        else
        PyErr_SetString(PyExc_TypeError, strerror(errno));
      } else {
        PyErr_SetString(PyExc_TypeError,"not a file-like object");
        return nullptr;
      }
    }
    else
    {
      PythonFile py_file(PyRefType::Borrowed, obj1);
      File file;
      if (!py_file.GetUnderlyingFile(file))
      return nullptr;
      
      arg2 = file.GetStream();
      if (arg2)
      file.Clear();
    }
  }
  ecode3 = SWIG_AsVal_bool(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBDebugger_SetInputFileHandle" "', argument " "3"" of type '" "bool""'");
  } 
  arg3 = static_cast< bool >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetInputFileHandle(arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_SetOutputFileHandle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  FILE *arg2 = (FILE *) 0 ;
  bool arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBDebugger_SetOutputFileHandle",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_SetOutputFileHandle" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  {
    using namespace lldb_private;
    if (obj1 == Py_None)
    arg2 = nullptr;
    else if (!lldb_private::PythonFile::Check(obj1)) {
      int fd = PyObject_AsFileDescriptor(obj1);
      PythonObject py_input(PyRefType::Borrowed, obj1);
      PythonString py_mode = py_input.GetAttributeValue("mode").AsType<PythonString>();
      
      if (-1 != fd && py_mode.IsValid()) {
        FILE *f;
        if ((f = fdopen(fd, py_mode.GetString().str().c_str())))
        arg2 = f;
        else
        PyErr_SetString(PyExc_TypeError, strerror(errno));
      } else {
        PyErr_SetString(PyExc_TypeError,"not a file-like object");
        return nullptr;
      }
    }
    else
    {
      PythonFile py_file(PyRefType::Borrowed, obj1);
      File file;
      if (!py_file.GetUnderlyingFile(file))
      return nullptr;
      
      arg2 = file.GetStream();
      if (arg2)
      file.Clear();
    }
  }
  ecode3 = SWIG_AsVal_bool(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBDebugger_SetOutputFileHandle" "', argument " "3"" of type '" "bool""'");
  } 
  arg3 = static_cast< bool >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetOutputFileHandle(arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_SetErrorFileHandle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  FILE *arg2 = (FILE *) 0 ;
  bool arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBDebugger_SetErrorFileHandle",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_SetErrorFileHandle" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  {
    using namespace lldb_private;
    if (obj1 == Py_None)
    arg2 = nullptr;
    else if (!lldb_private::PythonFile::Check(obj1)) {
      int fd = PyObject_AsFileDescriptor(obj1);
      PythonObject py_input(PyRefType::Borrowed, obj1);
      PythonString py_mode = py_input.GetAttributeValue("mode").AsType<PythonString>();
      
      if (-1 != fd && py_mode.IsValid()) {
        FILE *f;
        if ((f = fdopen(fd, py_mode.GetString().str().c_str())))
        arg2 = f;
        else
        PyErr_SetString(PyExc_TypeError, strerror(errno));
      } else {
        PyErr_SetString(PyExc_TypeError,"not a file-like object");
        return nullptr;
      }
    }
    else
    {
      PythonFile py_file(PyRefType::Borrowed, obj1);
      File file;
      if (!py_file.GetUnderlyingFile(file))
      return nullptr;
      
      arg2 = file.GetStream();
      if (arg2)
      file.Clear();
    }
  }
  ecode3 = SWIG_AsVal_bool(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBDebugger_SetErrorFileHandle" "', argument " "3"" of type '" "bool""'");
  } 
  arg3 = static_cast< bool >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetErrorFileHandle(arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_GetInputFileHandle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  FILE *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBDebugger_GetInputFileHandle",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_GetInputFileHandle" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (FILE *)(arg1)->GetInputFileHandle();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  {
    char mode[4] = {
      0
    };
#ifdef __APPLE__
    int i = 0;
    if (result)
    {
      short flags = result->_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(result, false);
    PythonFile py_file(file, mode);
    resultobj = py_file.release();
    if (!resultobj)
    {
      resultobj = Py_None;
      Py_INCREF(Py_None);
    }
  }
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_GetOutputFileHandle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  FILE *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBDebugger_GetOutputFileHandle",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_GetOutputFileHandle" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (FILE *)(arg1)->GetOutputFileHandle();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  {
    char mode[4] = {
      0
    };
#ifdef __APPLE__
    int i = 0;
    if (result)
    {
      short flags = result->_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(result, false);
    PythonFile py_file(file, mode);
    resultobj = py_file.release();
    if (!resultobj)
    {
      resultobj = Py_None;
      Py_INCREF(Py_None);
    }
  }
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_GetErrorFileHandle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  FILE *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBDebugger_GetErrorFileHandle",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_GetErrorFileHandle" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (FILE *)(arg1)->GetErrorFileHandle();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  {
    char mode[4] = {
      0
    };
#ifdef __APPLE__
    int i = 0;
    if (result)
    {
      short flags = result->_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(result, false);
    PythonFile py_file(file, mode);
    resultobj = py_file.release();
    if (!resultobj)
    {
      resultobj = Py_None;
      Py_INCREF(Py_None);
    }
  }
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_GetCommandInterpreter(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  SwigValueWrapper< lldb::SBCommandInterpreter > result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBDebugger_GetCommandInterpreter",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_GetCommandInterpreter" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetCommandInterpreter();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBCommandInterpreter(static_cast< const lldb::SBCommandInterpreter& >(result))), SWIGTYPE_p_lldb__SBCommandInterpreter, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_HandleCommand(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBDebugger_HandleCommand",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_HandleCommand" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBDebugger_HandleCommand" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->HandleCommand((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_GetListener(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBListener result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBDebugger_GetListener",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_GetListener" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetListener();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBListener(static_cast< const lldb::SBListener& >(result))), SWIGTYPE_p_lldb__SBListener, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_HandleProcessEvent(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  lldb::SBProcess *arg2 = 0 ;
  lldb::SBEvent *arg3 = 0 ;
  FILE *arg4 = (FILE *) 0 ;
  FILE *arg5 = (FILE *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  void *argp3 = 0 ;
  int res3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  PyObject * obj4 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOOO:SBDebugger_HandleProcessEvent",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_HandleProcessEvent" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBProcess,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBDebugger_HandleProcessEvent" "', argument " "2"" of type '" "lldb::SBProcess const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBDebugger_HandleProcessEvent" "', argument " "2"" of type '" "lldb::SBProcess const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBProcess * >(argp2);
  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBEvent,  0  | 0);
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBDebugger_HandleProcessEvent" "', argument " "3"" of type '" "lldb::SBEvent const &""'"); 
  }
  if (!argp3) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBDebugger_HandleProcessEvent" "', argument " "3"" of type '" "lldb::SBEvent const &""'"); 
  }
  arg3 = reinterpret_cast< lldb::SBEvent * >(argp3);
  {
    using namespace lldb_private;
    if (obj3 == Py_None)
    arg4 = nullptr;
    else if (!lldb_private::PythonFile::Check(obj3)) {
      int fd = PyObject_AsFileDescriptor(obj3);
      PythonObject py_input(PyRefType::Borrowed, obj3);
      PythonString py_mode = py_input.GetAttributeValue("mode").AsType<PythonString>();
      
      if (-1 != fd && py_mode.IsValid()) {
        FILE *f;
        if ((f = fdopen(fd, py_mode.GetString().str().c_str())))
        arg4 = f;
        else
        PyErr_SetString(PyExc_TypeError, strerror(errno));
      } else {
        PyErr_SetString(PyExc_TypeError,"not a file-like object");
        return nullptr;
      }
    }
    else
    {
      PythonFile py_file(PyRefType::Borrowed, obj3);
      File file;
      if (!py_file.GetUnderlyingFile(file))
      return nullptr;
      
      arg4 = file.GetStream();
      if (arg4)
      file.Clear();
    }
  }
  {
    using namespace lldb_private;
    if (obj4 == Py_None)
    arg5 = nullptr;
    else if (!lldb_private::PythonFile::Check(obj4)) {
      int fd = PyObject_AsFileDescriptor(obj4);
      PythonObject py_input(PyRefType::Borrowed, obj4);
      PythonString py_mode = py_input.GetAttributeValue("mode").AsType<PythonString>();
      
      if (-1 != fd && py_mode.IsValid()) {
        FILE *f;
        if ((f = fdopen(fd, py_mode.GetString().str().c_str())))
        arg5 = f;
        else
        PyErr_SetString(PyExc_TypeError, strerror(errno));
      } else {
        PyErr_SetString(PyExc_TypeError,"not a file-like object");
        return nullptr;
      }
    }
    else
    {
      PythonFile py_file(PyRefType::Borrowed, obj4);
      File file;
      if (!py_file.GetUnderlyingFile(file))
      return nullptr;
      
      arg5 = file.GetStream();
      if (arg5)
      file.Clear();
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->HandleProcessEvent((lldb::SBProcess const &)*arg2,(lldb::SBEvent const &)*arg3,arg4,arg5);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_CreateTarget__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  char *arg2 = (char *) 0 ;
  char *arg3 = (char *) 0 ;
  char *arg4 = (char *) 0 ;
  bool arg5 ;
  lldb::SBError *arg6 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  int res3 ;
  char *buf3 = 0 ;
  int alloc3 = 0 ;
  int res4 ;
  char *buf4 = 0 ;
  int alloc4 = 0 ;
  bool val5 ;
  int ecode5 = 0 ;
  void *argp6 = 0 ;
  int res6 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  PyObject * obj4 = 0 ;
  PyObject * obj5 = 0 ;
  lldb::SBTarget result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOOOO:SBDebugger_CreateTarget",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_CreateTarget" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBDebugger_CreateTarget" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3);
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBDebugger_CreateTarget" "', argument " "3"" of type '" "char const *""'");
  }
  arg3 = reinterpret_cast< char * >(buf3);
  res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4);
  if (!SWIG_IsOK(res4)) {
    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "SBDebugger_CreateTarget" "', argument " "4"" of type '" "char const *""'");
  }
  arg4 = reinterpret_cast< char * >(buf4);
  ecode5 = SWIG_AsVal_bool(obj4, &val5);
  if (!SWIG_IsOK(ecode5)) {
    SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "SBDebugger_CreateTarget" "', argument " "5"" of type '" "bool""'");
  } 
  arg5 = static_cast< bool >(val5);
  res6 = SWIG_ConvertPtr(obj5, &argp6, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res6)) {
    SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "SBDebugger_CreateTarget" "', argument " "6"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp6) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBDebugger_CreateTarget" "', argument " "6"" of type '" "lldb::SBError &""'"); 
  }
  arg6 = reinterpret_cast< lldb::SBError * >(argp6);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->CreateTarget((char const *)arg2,(char const *)arg3,(char const *)arg4,arg5,*arg6);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTarget(static_cast< const lldb::SBTarget& >(result))), SWIGTYPE_p_lldb__SBTarget, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  if (alloc4 == SWIG_NEWOBJ) delete[] buf4;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  if (alloc4 == SWIG_NEWOBJ) delete[] buf4;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_CreateTargetWithFileAndTargetTriple(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  char *arg2 = (char *) 0 ;
  char *arg3 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  int res3 ;
  char *buf3 = 0 ;
  int alloc3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBTarget result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBDebugger_CreateTargetWithFileAndTargetTriple",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_CreateTargetWithFileAndTargetTriple" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBDebugger_CreateTargetWithFileAndTargetTriple" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3);
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBDebugger_CreateTargetWithFileAndTargetTriple" "', argument " "3"" of type '" "char const *""'");
  }
  arg3 = reinterpret_cast< char * >(buf3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->CreateTargetWithFileAndTargetTriple((char const *)arg2,(char const *)arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTarget(static_cast< const lldb::SBTarget& >(result))), SWIGTYPE_p_lldb__SBTarget, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_CreateTargetWithFileAndArch(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  char *arg2 = (char *) 0 ;
  char *arg3 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  int res3 ;
  char *buf3 = 0 ;
  int alloc3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBTarget result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBDebugger_CreateTargetWithFileAndArch",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_CreateTargetWithFileAndArch" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBDebugger_CreateTargetWithFileAndArch" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3);
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBDebugger_CreateTargetWithFileAndArch" "', argument " "3"" of type '" "char const *""'");
  }
  arg3 = reinterpret_cast< char * >(buf3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->CreateTargetWithFileAndArch((char const *)arg2,(char const *)arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTarget(static_cast< const lldb::SBTarget& >(result))), SWIGTYPE_p_lldb__SBTarget, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_CreateTarget__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBTarget result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBDebugger_CreateTarget",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_CreateTarget" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBDebugger_CreateTarget" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->CreateTarget((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTarget(static_cast< const lldb::SBTarget& >(result))), SWIGTYPE_p_lldb__SBTarget, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_CreateTarget(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[7];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 6); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBDebugger, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        return _wrap_SBDebugger_CreateTarget__SWIG_1(self, args);
      }
    }
  }
  if (argc == 6) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBDebugger, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        int res = SWIG_AsCharPtrAndSize(argv[2], 0, NULL, 0);
        _v = SWIG_CheckState(res);
        if (_v) {
          int res = SWIG_AsCharPtrAndSize(argv[3], 0, NULL, 0);
          _v = SWIG_CheckState(res);
          if (_v) {
            {
              int res = SWIG_AsVal_bool(argv[4], NULL);
              _v = SWIG_CheckState(res);
            }
            if (_v) {
              void *vptr = 0;
              int res = SWIG_ConvertPtr(argv[5], &vptr, SWIGTYPE_p_lldb__SBError, 0);
              _v = SWIG_CheckState(res);
              if (_v) {
                return _wrap_SBDebugger_CreateTarget__SWIG_0(self, args);
              }
            }
          }
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBDebugger_CreateTarget'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    CreateTarget(lldb::SBDebugger *,char const *,char const *,char const *,bool,lldb::SBError &)\n"
    "    CreateTarget(lldb::SBDebugger *,char const *)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_GetDummyTarget(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBTarget result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBDebugger_GetDummyTarget",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_GetDummyTarget" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetDummyTarget();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTarget(static_cast< const lldb::SBTarget& >(result))), SWIGTYPE_p_lldb__SBTarget, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_DeleteTarget(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  lldb::SBTarget *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBDebugger_DeleteTarget",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_DeleteTarget" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTarget,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBDebugger_DeleteTarget" "', argument " "2"" of type '" "lldb::SBTarget &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBDebugger_DeleteTarget" "', argument " "2"" of type '" "lldb::SBTarget &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBTarget * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->DeleteTarget(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_GetTargetAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBTarget result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBDebugger_GetTargetAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_GetTargetAtIndex" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBDebugger_GetTargetAtIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetTargetAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTarget(static_cast< const lldb::SBTarget& >(result))), SWIGTYPE_p_lldb__SBTarget, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_GetIndexOfTarget(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  lldb::SBTarget arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBDebugger_GetIndexOfTarget",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_GetIndexOfTarget" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTarget,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBDebugger_GetIndexOfTarget" "', argument " "2"" of type '" "lldb::SBTarget""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBDebugger_GetIndexOfTarget" "', argument " "2"" of type '" "lldb::SBTarget""'");
    } else {
      lldb::SBTarget * temp = reinterpret_cast< lldb::SBTarget * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetIndexOfTarget(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_FindTargetWithProcessID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  lldb::pid_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned long long val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBTarget result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBDebugger_FindTargetWithProcessID",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_FindTargetWithProcessID" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_long_SS_long(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBDebugger_FindTargetWithProcessID" "', argument " "2"" of type '" "lldb::pid_t""'");
  } 
  arg2 = static_cast< lldb::pid_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->FindTargetWithProcessID(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTarget(static_cast< const lldb::SBTarget& >(result))), SWIGTYPE_p_lldb__SBTarget, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_FindTargetWithFileAndArch(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  char *arg2 = (char *) 0 ;
  char *arg3 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  int res3 ;
  char *buf3 = 0 ;
  int alloc3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBTarget result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBDebugger_FindTargetWithFileAndArch",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_FindTargetWithFileAndArch" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBDebugger_FindTargetWithFileAndArch" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3);
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBDebugger_FindTargetWithFileAndArch" "', argument " "3"" of type '" "char const *""'");
  }
  arg3 = reinterpret_cast< char * >(buf3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->FindTargetWithFileAndArch((char const *)arg2,(char const *)arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTarget(static_cast< const lldb::SBTarget& >(result))), SWIGTYPE_p_lldb__SBTarget, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_GetNumTargets(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBDebugger_GetNumTargets",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_GetNumTargets" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetNumTargets();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_GetSelectedTarget(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBTarget result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBDebugger_GetSelectedTarget",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_GetSelectedTarget" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetSelectedTarget();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTarget(static_cast< const lldb::SBTarget& >(result))), SWIGTYPE_p_lldb__SBTarget, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_SetSelectedTarget(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  lldb::SBTarget *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBDebugger_SetSelectedTarget",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_SetSelectedTarget" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTarget,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBDebugger_SetSelectedTarget" "', argument " "2"" of type '" "lldb::SBTarget &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBDebugger_SetSelectedTarget" "', argument " "2"" of type '" "lldb::SBTarget &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBTarget * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetSelectedTarget(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_GetSelectedPlatform(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBPlatform result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBDebugger_GetSelectedPlatform",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_GetSelectedPlatform" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetSelectedPlatform();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBPlatform(static_cast< const lldb::SBPlatform& >(result))), SWIGTYPE_p_lldb__SBPlatform, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_SetSelectedPlatform(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  lldb::SBPlatform *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBDebugger_SetSelectedPlatform",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_SetSelectedPlatform" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBPlatform,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBDebugger_SetSelectedPlatform" "', argument " "2"" of type '" "lldb::SBPlatform &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBDebugger_SetSelectedPlatform" "', argument " "2"" of type '" "lldb::SBPlatform &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBPlatform * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetSelectedPlatform(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_GetNumPlatforms(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBDebugger_GetNumPlatforms",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_GetNumPlatforms" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetNumPlatforms();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_GetPlatformAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBPlatform result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBDebugger_GetPlatformAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_GetPlatformAtIndex" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBDebugger_GetPlatformAtIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetPlatformAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBPlatform(static_cast< const lldb::SBPlatform& >(result))), SWIGTYPE_p_lldb__SBPlatform, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_GetNumAvailablePlatforms(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBDebugger_GetNumAvailablePlatforms",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_GetNumAvailablePlatforms" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetNumAvailablePlatforms();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_GetAvailablePlatformInfoAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBStructuredData result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBDebugger_GetAvailablePlatformInfoAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_GetAvailablePlatformInfoAtIndex" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBDebugger_GetAvailablePlatformInfoAtIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetAvailablePlatformInfoAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBStructuredData(static_cast< const lldb::SBStructuredData& >(result))), SWIGTYPE_p_lldb__SBStructuredData, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_GetSourceManager(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  SwigValueWrapper< lldb::SBSourceManager > result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBDebugger_GetSourceManager",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_GetSourceManager" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetSourceManager();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBSourceManager(static_cast< const lldb::SBSourceManager& >(result))), SWIGTYPE_p_lldb__SBSourceManager, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_SetCurrentPlatform(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBError result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBDebugger_SetCurrentPlatform",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_SetCurrentPlatform" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBDebugger_SetCurrentPlatform" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->SetCurrentPlatform((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBError(static_cast< const lldb::SBError& >(result))), SWIGTYPE_p_lldb__SBError, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_SetCurrentPlatformSDKRoot(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBDebugger_SetCurrentPlatformSDKRoot",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_SetCurrentPlatformSDKRoot" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBDebugger_SetCurrentPlatformSDKRoot" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->SetCurrentPlatformSDKRoot((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_SetUseExternalEditor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBDebugger_SetUseExternalEditor",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_SetUseExternalEditor" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBDebugger_SetUseExternalEditor" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->SetUseExternalEditor(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_GetUseExternalEditor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBDebugger_GetUseExternalEditor",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_GetUseExternalEditor" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetUseExternalEditor();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_SetUseColor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBDebugger_SetUseColor",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_SetUseColor" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBDebugger_SetUseColor" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->SetUseColor(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_GetUseColor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBDebugger_GetUseColor",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_GetUseColor" "', argument " "1"" of type '" "lldb::SBDebugger const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBDebugger const *)arg1)->GetUseColor();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_GetDefaultArchitecture(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  char *arg1 = (char *) 0 ;
  size_t arg2 ;
  int res1 ;
  char *buf1 = 0 ;
  int alloc1 = 0 ;
  size_t val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBDebugger_GetDefaultArchitecture",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_GetDefaultArchitecture" "', argument " "1"" of type '" "char *""'");
  }
  arg1 = reinterpret_cast< char * >(buf1);
  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBDebugger_GetDefaultArchitecture" "', argument " "2"" of type '" "size_t""'");
  } 
  arg2 = static_cast< size_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)lldb::SBDebugger::GetDefaultArchitecture(arg1,arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return resultobj;
fail:
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_SetDefaultArchitecture(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  char *arg1 = (char *) 0 ;
  int res1 ;
  char *buf1 = 0 ;
  int alloc1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBDebugger_SetDefaultArchitecture",&obj0)) SWIG_fail;
  res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_SetDefaultArchitecture" "', argument " "1"" of type '" "char const *""'");
  }
  arg1 = reinterpret_cast< char * >(buf1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)lldb::SBDebugger::SetDefaultArchitecture((char const *)arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return resultobj;
fail:
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_GetScriptingLanguage(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::ScriptLanguage result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBDebugger_GetScriptingLanguage",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_GetScriptingLanguage" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBDebugger_GetScriptingLanguage" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::ScriptLanguage)(arg1)->GetScriptingLanguage((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_GetVersionString(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":SBDebugger_GetVersionString")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)lldb::SBDebugger::GetVersionString();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_StateAsCString(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::StateType arg1 ;
  int val1 ;
  int ecode1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBDebugger_StateAsCString",&obj0)) SWIG_fail;
  ecode1 = SWIG_AsVal_int(obj0, &val1);
  if (!SWIG_IsOK(ecode1)) {
    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "SBDebugger_StateAsCString" "', argument " "1"" of type '" "lldb::StateType""'");
  } 
  arg1 = static_cast< lldb::StateType >(val1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)lldb::SBDebugger::StateAsCString(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_StateIsRunningState(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::StateType arg1 ;
  int val1 ;
  int ecode1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBDebugger_StateIsRunningState",&obj0)) SWIG_fail;
  ecode1 = SWIG_AsVal_int(obj0, &val1);
  if (!SWIG_IsOK(ecode1)) {
    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "SBDebugger_StateIsRunningState" "', argument " "1"" of type '" "lldb::StateType""'");
  } 
  arg1 = static_cast< lldb::StateType >(val1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)lldb::SBDebugger::StateIsRunningState(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_StateIsStoppedState(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::StateType arg1 ;
  int val1 ;
  int ecode1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBDebugger_StateIsStoppedState",&obj0)) SWIG_fail;
  ecode1 = SWIG_AsVal_int(obj0, &val1);
  if (!SWIG_IsOK(ecode1)) {
    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "SBDebugger_StateIsStoppedState" "', argument " "1"" of type '" "lldb::StateType""'");
  } 
  arg1 = static_cast< lldb::StateType >(val1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)lldb::SBDebugger::StateIsStoppedState(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_EnableLog(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  char *arg2 = (char *) 0 ;
  char **arg3 = (char **) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBDebugger_EnableLog",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_EnableLog" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBDebugger_EnableLog" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    using namespace lldb_private;
    /* Check if is a list  */
    if (PythonList::Check(obj2)) {
      PythonList list(PyRefType::Borrowed, obj2);
      int size = list.GetSize();
      int i = 0;
      arg3 = (char**)malloc((size+1)*sizeof(char*));
      for (i = 0; i < size; i++) {
        PythonString py_str = list.GetItemAtIndex(i).AsType<PythonString>();
        if (!py_str.IsAllocated()) {
          PyErr_SetString(PyExc_TypeError,"list must contain strings");
          free(arg3);
          return nullptr;
        }
        
        arg3[i] = const_cast<char*>(py_str.GetString().data());
      }
      arg3[i] = 0;
    } else if (obj2 == Py_None) {
      arg3 =  NULL;
    } else {
      PyErr_SetString(PyExc_TypeError,"not a list");
      return NULL;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->EnableLog((char const *)arg2,(char const **)arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  {
    free((char *) arg3);
  }
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  {
    free((char *) arg3);
  }
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_SetLoggingCallback(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  lldb::LogOutputCallback arg2 = (lldb::LogOutputCallback) 0 ;
  void *arg3 = (void *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBDebugger_SetLoggingCallback",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_SetLoggingCallback" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  {
    if (!(obj1 == Py_None || PyCallable_Check(reinterpret_cast<PyObject*>(obj1)))) {
      PyErr_SetString(PyExc_TypeError, "Need a callable object or None!");
      return NULL;
    }
    
    // FIXME (filcab): We can't currently check if our callback is already
    // LLDBSwigPythonCallPythonLogOutputCallback (to DECREF the previous
    // baton) nor can we just remove all traces of a callback, if we want to
    // revert to a file logging mechanism.
    
    // Don't lose the callback reference
    Py_INCREF(obj1);
    arg2 = LLDBSwigPythonCallPythonLogOutputCallback;
    arg3 = obj1;
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetLoggingCallback(arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_DispatchInput(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  void *arg2 = (void *) 0 ;
  size_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBDebugger_DispatchInput",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_DispatchInput" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  {
    using namespace lldb_private;
    if (PythonString::Check(obj1)) {
      PythonString str(PyRefType::Borrowed, obj1);
      arg2 = (void*)str.GetString().data();
      arg3 = str.GetSize();
    }
    else if(PythonByteArray::Check(obj1)) {
      PythonByteArray bytearray(PyRefType::Borrowed, obj1);
      arg2 = (void*)bytearray.GetBytes().data();
      arg3 = bytearray.GetSize();
    }
    else if (PythonBytes::Check(obj1)) {
      PythonBytes bytes(PyRefType::Borrowed, obj1);
      arg2 = (void*)bytes.GetBytes().data();
      arg3 = bytes.GetSize();
    }
    else {
      PyErr_SetString(PyExc_ValueError, "Expecting a buffer");
      return NULL;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->DispatchInput((void const *)arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_DispatchInputInterrupt(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBDebugger_DispatchInputInterrupt",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_DispatchInputInterrupt" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->DispatchInputInterrupt();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_DispatchInputEndOfFile(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBDebugger_DispatchInputEndOfFile",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_DispatchInputEndOfFile" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->DispatchInputEndOfFile();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_GetInstanceName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBDebugger_GetInstanceName",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_GetInstanceName" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetInstanceName();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_FindDebuggerWithID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  int arg1 ;
  int val1 ;
  int ecode1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBDebugger result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBDebugger_FindDebuggerWithID",&obj0)) SWIG_fail;
  ecode1 = SWIG_AsVal_int(obj0, &val1);
  if (!SWIG_IsOK(ecode1)) {
    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "SBDebugger_FindDebuggerWithID" "', argument " "1"" of type '" "int""'");
  } 
  arg1 = static_cast< int >(val1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = lldb::SBDebugger::FindDebuggerWithID(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBDebugger(static_cast< const lldb::SBDebugger& >(result))), SWIGTYPE_p_lldb__SBDebugger, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_SetInternalVariable(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  char *arg1 = (char *) 0 ;
  char *arg2 = (char *) 0 ;
  char *arg3 = (char *) 0 ;
  int res1 ;
  char *buf1 = 0 ;
  int alloc1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  int res3 ;
  char *buf3 = 0 ;
  int alloc3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBError result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBDebugger_SetInternalVariable",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_SetInternalVariable" "', argument " "1"" of type '" "char const *""'");
  }
  arg1 = reinterpret_cast< char * >(buf1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBDebugger_SetInternalVariable" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3);
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBDebugger_SetInternalVariable" "', argument " "3"" of type '" "char const *""'");
  }
  arg3 = reinterpret_cast< char * >(buf3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = lldb::SBDebugger::SetInternalVariable((char const *)arg1,(char const *)arg2,(char const *)arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBError(static_cast< const lldb::SBError& >(result))), SWIGTYPE_p_lldb__SBError, SWIG_POINTER_OWN |  0 );
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  return resultobj;
fail:
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_GetInternalVariableValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  char *arg1 = (char *) 0 ;
  char *arg2 = (char *) 0 ;
  int res1 ;
  char *buf1 = 0 ;
  int alloc1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBStringList result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBDebugger_GetInternalVariableValue",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_GetInternalVariableValue" "', argument " "1"" of type '" "char const *""'");
  }
  arg1 = reinterpret_cast< char * >(buf1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBDebugger_GetInternalVariableValue" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = lldb::SBDebugger::GetInternalVariableValue((char const *)arg1,(char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBStringList(static_cast< const lldb::SBStringList& >(result))), SWIGTYPE_p_lldb__SBStringList, SWIG_POINTER_OWN |  0 );
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_GetDescription(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBDebugger_GetDescription",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_GetDescription" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBDebugger_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBDebugger_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetDescription(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_GetTerminalWidth(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBDebugger_GetTerminalWidth",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_GetTerminalWidth" "', argument " "1"" of type '" "lldb::SBDebugger const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)((lldb::SBDebugger const *)arg1)->GetTerminalWidth();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_SetTerminalWidth(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBDebugger_SetTerminalWidth",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_SetTerminalWidth" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBDebugger_SetTerminalWidth" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetTerminalWidth(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_GetID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::user_id_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBDebugger_GetID",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_GetID" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::user_id_t)(arg1)->GetID();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_GetPrompt(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBDebugger_GetPrompt",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_GetPrompt" "', argument " "1"" of type '" "lldb::SBDebugger const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)((lldb::SBDebugger const *)arg1)->GetPrompt();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_SetPrompt(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBDebugger_SetPrompt",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_SetPrompt" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBDebugger_SetPrompt" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetPrompt((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_GetScriptLanguage(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::ScriptLanguage result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBDebugger_GetScriptLanguage",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_GetScriptLanguage" "', argument " "1"" of type '" "lldb::SBDebugger const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::ScriptLanguage)((lldb::SBDebugger const *)arg1)->GetScriptLanguage();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_SetScriptLanguage(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  lldb::ScriptLanguage arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBDebugger_SetScriptLanguage",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_SetScriptLanguage" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  ecode2 = SWIG_AsVal_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBDebugger_SetScriptLanguage" "', argument " "2"" of type '" "lldb::ScriptLanguage""'");
  } 
  arg2 = static_cast< lldb::ScriptLanguage >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetScriptLanguage(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_GetCloseInputOnEOF(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBDebugger_GetCloseInputOnEOF",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_GetCloseInputOnEOF" "', argument " "1"" of type '" "lldb::SBDebugger const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBDebugger const *)arg1)->GetCloseInputOnEOF();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_SetCloseInputOnEOF(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBDebugger_SetCloseInputOnEOF",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_SetCloseInputOnEOF" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBDebugger_SetCloseInputOnEOF" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetCloseInputOnEOF(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_GetCategory__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBTypeCategory result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBDebugger_GetCategory",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_GetCategory" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBDebugger_GetCategory" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetCategory((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTypeCategory(static_cast< const lldb::SBTypeCategory& >(result))), SWIGTYPE_p_lldb__SBTypeCategory, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_GetCategory__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  lldb::LanguageType arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBTypeCategory result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBDebugger_GetCategory",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_GetCategory" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  ecode2 = SWIG_AsVal_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBDebugger_GetCategory" "', argument " "2"" of type '" "lldb::LanguageType""'");
  } 
  arg2 = static_cast< lldb::LanguageType >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetCategory(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTypeCategory(static_cast< const lldb::SBTypeCategory& >(result))), SWIGTYPE_p_lldb__SBTypeCategory, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_GetCategory(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[3];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 2); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBDebugger, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_int(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        return _wrap_SBDebugger_GetCategory__SWIG_1(self, args);
      }
    }
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBDebugger, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        return _wrap_SBDebugger_GetCategory__SWIG_0(self, args);
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBDebugger_GetCategory'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    GetCategory(lldb::SBDebugger *,char const *)\n"
    "    GetCategory(lldb::SBDebugger *,lldb::LanguageType)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_CreateCategory(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBTypeCategory result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBDebugger_CreateCategory",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_CreateCategory" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBDebugger_CreateCategory" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->CreateCategory((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTypeCategory(static_cast< const lldb::SBTypeCategory& >(result))), SWIGTYPE_p_lldb__SBTypeCategory, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_DeleteCategory(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBDebugger_DeleteCategory",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_DeleteCategory" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBDebugger_DeleteCategory" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->DeleteCategory((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_GetNumCategories(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBDebugger_GetNumCategories",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_GetNumCategories" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetNumCategories();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_GetCategoryAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBTypeCategory result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBDebugger_GetCategoryAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_GetCategoryAtIndex" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBDebugger_GetCategoryAtIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetCategoryAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTypeCategory(static_cast< const lldb::SBTypeCategory& >(result))), SWIGTYPE_p_lldb__SBTypeCategory, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_GetDefaultCategory(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBTypeCategory result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBDebugger_GetDefaultCategory",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_GetDefaultCategory" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetDefaultCategory();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTypeCategory(static_cast< const lldb::SBTypeCategory& >(result))), SWIGTYPE_p_lldb__SBTypeCategory, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_GetFormatForType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  lldb::SBTypeNameSpecifier arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBTypeFormat result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBDebugger_GetFormatForType",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_GetFormatForType" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTypeNameSpecifier,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBDebugger_GetFormatForType" "', argument " "2"" of type '" "lldb::SBTypeNameSpecifier""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBDebugger_GetFormatForType" "', argument " "2"" of type '" "lldb::SBTypeNameSpecifier""'");
    } else {
      lldb::SBTypeNameSpecifier * temp = reinterpret_cast< lldb::SBTypeNameSpecifier * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetFormatForType(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTypeFormat(static_cast< const lldb::SBTypeFormat& >(result))), SWIGTYPE_p_lldb__SBTypeFormat, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_GetSummaryForType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  lldb::SBTypeNameSpecifier arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBTypeSummary result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBDebugger_GetSummaryForType",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_GetSummaryForType" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTypeNameSpecifier,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBDebugger_GetSummaryForType" "', argument " "2"" of type '" "lldb::SBTypeNameSpecifier""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBDebugger_GetSummaryForType" "', argument " "2"" of type '" "lldb::SBTypeNameSpecifier""'");
    } else {
      lldb::SBTypeNameSpecifier * temp = reinterpret_cast< lldb::SBTypeNameSpecifier * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetSummaryForType(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTypeSummary(static_cast< const lldb::SBTypeSummary& >(result))), SWIGTYPE_p_lldb__SBTypeSummary, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_GetFilterForType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  lldb::SBTypeNameSpecifier arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBTypeFilter result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBDebugger_GetFilterForType",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_GetFilterForType" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTypeNameSpecifier,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBDebugger_GetFilterForType" "', argument " "2"" of type '" "lldb::SBTypeNameSpecifier""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBDebugger_GetFilterForType" "', argument " "2"" of type '" "lldb::SBTypeNameSpecifier""'");
    } else {
      lldb::SBTypeNameSpecifier * temp = reinterpret_cast< lldb::SBTypeNameSpecifier * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetFilterForType(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTypeFilter(static_cast< const lldb::SBTypeFilter& >(result))), SWIGTYPE_p_lldb__SBTypeFilter, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_GetSyntheticForType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  lldb::SBTypeNameSpecifier arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBTypeSynthetic result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBDebugger_GetSyntheticForType",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_GetSyntheticForType" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTypeNameSpecifier,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBDebugger_GetSyntheticForType" "', argument " "2"" of type '" "lldb::SBTypeNameSpecifier""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBDebugger_GetSyntheticForType" "', argument " "2"" of type '" "lldb::SBTypeNameSpecifier""'");
    } else {
      lldb::SBTypeNameSpecifier * temp = reinterpret_cast< lldb::SBTypeNameSpecifier * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetSyntheticForType(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTypeSynthetic(static_cast< const lldb::SBTypeSynthetic& >(result))), SWIGTYPE_p_lldb__SBTypeSynthetic, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_RunCommandInterpreter(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  bool arg2 ;
  bool arg3 ;
  lldb::SBCommandInterpreterRunOptions *arg4 = 0 ;
  int *arg5 = 0 ;
  bool *arg6 = 0 ;
  bool *arg7 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  bool val3 ;
  int ecode3 = 0 ;
  void *argp4 = 0 ;
  int res4 = 0 ;
  void *argp5 = 0 ;
  int res5 = 0 ;
  void *argp6 = 0 ;
  int res6 = 0 ;
  void *argp7 = 0 ;
  int res7 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  PyObject * obj4 = 0 ;
  PyObject * obj5 = 0 ;
  PyObject * obj6 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOOOOO:SBDebugger_RunCommandInterpreter",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_RunCommandInterpreter" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBDebugger_RunCommandInterpreter" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  ecode3 = SWIG_AsVal_bool(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBDebugger_RunCommandInterpreter" "', argument " "3"" of type '" "bool""'");
  } 
  arg3 = static_cast< bool >(val3);
  res4 = SWIG_ConvertPtr(obj3, &argp4, SWIGTYPE_p_lldb__SBCommandInterpreterRunOptions,  0 );
  if (!SWIG_IsOK(res4)) {
    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "SBDebugger_RunCommandInterpreter" "', argument " "4"" of type '" "lldb::SBCommandInterpreterRunOptions &""'"); 
  }
  if (!argp4) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBDebugger_RunCommandInterpreter" "', argument " "4"" of type '" "lldb::SBCommandInterpreterRunOptions &""'"); 
  }
  arg4 = reinterpret_cast< lldb::SBCommandInterpreterRunOptions * >(argp4);
  res5 = SWIG_ConvertPtr(obj4, &argp5, SWIGTYPE_p_int,  0 );
  if (!SWIG_IsOK(res5)) {
    SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "SBDebugger_RunCommandInterpreter" "', argument " "5"" of type '" "int &""'"); 
  }
  if (!argp5) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBDebugger_RunCommandInterpreter" "', argument " "5"" of type '" "int &""'"); 
  }
  arg5 = reinterpret_cast< int * >(argp5);
  res6 = SWIG_ConvertPtr(obj5, &argp6, SWIGTYPE_p_bool,  0 );
  if (!SWIG_IsOK(res6)) {
    SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "SBDebugger_RunCommandInterpreter" "', argument " "6"" of type '" "bool &""'"); 
  }
  if (!argp6) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBDebugger_RunCommandInterpreter" "', argument " "6"" of type '" "bool &""'"); 
  }
  arg6 = reinterpret_cast< bool * >(argp6);
  res7 = SWIG_ConvertPtr(obj6, &argp7, SWIGTYPE_p_bool,  0 );
  if (!SWIG_IsOK(res7)) {
    SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "SBDebugger_RunCommandInterpreter" "', argument " "7"" of type '" "bool &""'"); 
  }
  if (!argp7) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBDebugger_RunCommandInterpreter" "', argument " "7"" of type '" "bool &""'"); 
  }
  arg7 = reinterpret_cast< bool * >(argp7);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->RunCommandInterpreter(arg2,arg3,*arg4,*arg5,*arg6,*arg7);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger_RunREPL(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  lldb::LanguageType arg2 ;
  char *arg3 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int val2 ;
  int ecode2 = 0 ;
  int res3 ;
  char *buf3 = 0 ;
  int alloc3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBError result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBDebugger_RunREPL",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger_RunREPL" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  ecode2 = SWIG_AsVal_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBDebugger_RunREPL" "', argument " "2"" of type '" "lldb::LanguageType""'");
  } 
  arg2 = static_cast< lldb::LanguageType >(val2);
  res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3);
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBDebugger_RunREPL" "', argument " "3"" of type '" "char const *""'");
  }
  arg3 = reinterpret_cast< char * >(buf3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->RunREPL(arg2,(char const *)arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBError(static_cast< const lldb::SBError& >(result))), SWIGTYPE_p_lldb__SBError, SWIG_POINTER_OWN |  0 );
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  return resultobj;
fail:
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDebugger___str__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDebugger *arg1 = (lldb::SBDebugger *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBDebugger___str__",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDebugger, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDebugger___str__" "', argument " "1"" of type '" "lldb::SBDebugger *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDebugger * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (PyObject *)lldb_SBDebugger___str__(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = result;
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBDebugger_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBDebugger, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBDeclaration__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDeclaration *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBDeclaration")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBDeclaration *)new lldb::SBDeclaration();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBDeclaration, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBDeclaration__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDeclaration *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBDeclaration *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBDeclaration",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBDeclaration,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBDeclaration" "', argument " "1"" of type '" "lldb::SBDeclaration const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBDeclaration" "', argument " "1"" of type '" "lldb::SBDeclaration const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDeclaration * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBDeclaration *)new lldb::SBDeclaration((lldb::SBDeclaration const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBDeclaration, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBDeclaration(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBDeclaration__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBDeclaration, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBDeclaration__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBDeclaration'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBDeclaration()\n"
    "    lldb::SBDeclaration(lldb::SBDeclaration const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBDeclaration(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDeclaration *arg1 = (lldb::SBDeclaration *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBDeclaration",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDeclaration, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBDeclaration" "', argument " "1"" of type '" "lldb::SBDeclaration *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDeclaration * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDeclaration_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDeclaration *arg1 = (lldb::SBDeclaration *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBDeclaration_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDeclaration, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDeclaration_IsValid" "', argument " "1"" of type '" "lldb::SBDeclaration const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDeclaration * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBDeclaration const *)arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDeclaration_GetFileSpec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDeclaration *arg1 = (lldb::SBDeclaration *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBFileSpec result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBDeclaration_GetFileSpec",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDeclaration, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDeclaration_GetFileSpec" "', argument " "1"" of type '" "lldb::SBDeclaration const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDeclaration * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBDeclaration const *)arg1)->GetFileSpec();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBFileSpec(static_cast< const lldb::SBFileSpec& >(result))), SWIGTYPE_p_lldb__SBFileSpec, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDeclaration_GetLine(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDeclaration *arg1 = (lldb::SBDeclaration *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBDeclaration_GetLine",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDeclaration, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDeclaration_GetLine" "', argument " "1"" of type '" "lldb::SBDeclaration const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDeclaration * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)((lldb::SBDeclaration const *)arg1)->GetLine();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDeclaration_GetColumn(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDeclaration *arg1 = (lldb::SBDeclaration *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBDeclaration_GetColumn",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDeclaration, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDeclaration_GetColumn" "', argument " "1"" of type '" "lldb::SBDeclaration const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDeclaration * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)((lldb::SBDeclaration const *)arg1)->GetColumn();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDeclaration_GetDescription(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDeclaration *arg1 = (lldb::SBDeclaration *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBDeclaration_GetDescription",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDeclaration, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDeclaration_GetDescription" "', argument " "1"" of type '" "lldb::SBDeclaration *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDeclaration * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBDeclaration_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBDeclaration_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetDescription(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDeclaration_SetFileSpec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDeclaration *arg1 = (lldb::SBDeclaration *) 0 ;
  lldb::SBFileSpec arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBDeclaration_SetFileSpec",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDeclaration, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDeclaration_SetFileSpec" "', argument " "1"" of type '" "lldb::SBDeclaration *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDeclaration * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBFileSpec,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBDeclaration_SetFileSpec" "', argument " "2"" of type '" "lldb::SBFileSpec""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBDeclaration_SetFileSpec" "', argument " "2"" of type '" "lldb::SBFileSpec""'");
    } else {
      lldb::SBFileSpec * temp = reinterpret_cast< lldb::SBFileSpec * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetFileSpec(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDeclaration_SetLine(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDeclaration *arg1 = (lldb::SBDeclaration *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBDeclaration_SetLine",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDeclaration, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDeclaration_SetLine" "', argument " "1"" of type '" "lldb::SBDeclaration *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDeclaration * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBDeclaration_SetLine" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetLine(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDeclaration_SetColumn(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDeclaration *arg1 = (lldb::SBDeclaration *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBDeclaration_SetColumn",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDeclaration, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDeclaration_SetColumn" "', argument " "1"" of type '" "lldb::SBDeclaration *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDeclaration * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBDeclaration_SetColumn" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetColumn(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDeclaration___eq__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDeclaration *arg1 = (lldb::SBDeclaration *) 0 ;
  lldb::SBDeclaration *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBDeclaration___eq__",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDeclaration, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDeclaration___eq__" "', argument " "1"" of type '" "lldb::SBDeclaration const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDeclaration * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBDeclaration,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBDeclaration___eq__" "', argument " "2"" of type '" "lldb::SBDeclaration const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBDeclaration___eq__" "', argument " "2"" of type '" "lldb::SBDeclaration const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBDeclaration * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBDeclaration const *)arg1)->operator ==((lldb::SBDeclaration const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDeclaration___ne__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDeclaration *arg1 = (lldb::SBDeclaration *) 0 ;
  lldb::SBDeclaration *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBDeclaration___ne__",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDeclaration, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDeclaration___ne__" "', argument " "1"" of type '" "lldb::SBDeclaration const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDeclaration * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBDeclaration,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBDeclaration___ne__" "', argument " "2"" of type '" "lldb::SBDeclaration const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBDeclaration___ne__" "', argument " "2"" of type '" "lldb::SBDeclaration const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBDeclaration * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBDeclaration const *)arg1)->operator !=((lldb::SBDeclaration const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBDeclaration___str__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBDeclaration *arg1 = (lldb::SBDeclaration *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBDeclaration___str__",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBDeclaration, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBDeclaration___str__" "', argument " "1"" of type '" "lldb::SBDeclaration *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBDeclaration * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (PyObject *)lldb_SBDeclaration___str__(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = result;
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBDeclaration_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBDeclaration, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBError__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBError *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBError")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBError *)new lldb::SBError();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBError, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBError__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBError *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBError *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBError",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBError,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBError" "', argument " "1"" of type '" "lldb::SBError const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBError" "', argument " "1"" of type '" "lldb::SBError const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBError * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBError *)new lldb::SBError((lldb::SBError const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBError, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBError(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBError__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBError, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBError__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBError'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBError()\n"
    "    lldb::SBError(lldb::SBError const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBError(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBError *arg1 = (lldb::SBError *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBError",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBError, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBError" "', argument " "1"" of type '" "lldb::SBError *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBError * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBError_GetCString(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBError *arg1 = (lldb::SBError *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBError_GetCString",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBError, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBError_GetCString" "', argument " "1"" of type '" "lldb::SBError const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBError * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)((lldb::SBError const *)arg1)->GetCString();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBError_Clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBError *arg1 = (lldb::SBError *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBError_Clear",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBError, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBError_Clear" "', argument " "1"" of type '" "lldb::SBError *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBError * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->Clear();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBError_Fail(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBError *arg1 = (lldb::SBError *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBError_Fail",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBError, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBError_Fail" "', argument " "1"" of type '" "lldb::SBError const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBError * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBError const *)arg1)->Fail();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBError_Success(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBError *arg1 = (lldb::SBError *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBError_Success",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBError, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBError_Success" "', argument " "1"" of type '" "lldb::SBError const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBError * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBError const *)arg1)->Success();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBError_GetError(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBError *arg1 = (lldb::SBError *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBError_GetError",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBError, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBError_GetError" "', argument " "1"" of type '" "lldb::SBError const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBError * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)((lldb::SBError const *)arg1)->GetError();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBError_GetType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBError *arg1 = (lldb::SBError *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::ErrorType result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBError_GetType",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBError, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBError_GetType" "', argument " "1"" of type '" "lldb::SBError const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBError * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::ErrorType)((lldb::SBError const *)arg1)->GetType();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBError_SetError(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBError *arg1 = (lldb::SBError *) 0 ;
  uint32_t arg2 ;
  lldb::ErrorType arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  int val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBError_SetError",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBError, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBError_SetError" "', argument " "1"" of type '" "lldb::SBError *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBError * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBError_SetError" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  ecode3 = SWIG_AsVal_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBError_SetError" "', argument " "3"" of type '" "lldb::ErrorType""'");
  } 
  arg3 = static_cast< lldb::ErrorType >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetError(arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBError_SetErrorToErrno(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBError *arg1 = (lldb::SBError *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBError_SetErrorToErrno",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBError, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBError_SetErrorToErrno" "', argument " "1"" of type '" "lldb::SBError *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBError * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetErrorToErrno();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBError_SetErrorToGenericError(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBError *arg1 = (lldb::SBError *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBError_SetErrorToGenericError",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBError, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBError_SetErrorToGenericError" "', argument " "1"" of type '" "lldb::SBError *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBError * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetErrorToGenericError();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBError_SetErrorString(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBError *arg1 = (lldb::SBError *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBError_SetErrorString",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBError, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBError_SetErrorString" "', argument " "1"" of type '" "lldb::SBError *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBError * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBError_SetErrorString" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetErrorString((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBError_SetErrorStringWithFormat__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBError *arg1 = (lldb::SBError *) 0 ;
  char *arg2 = (char *) 0 ;
  char *arg3 = (char *) 0 ;
  char *arg4 = (char *) 0 ;
  char *arg5 = (char *) 0 ;
  char *arg6 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  int res3 ;
  char *buf3 = 0 ;
  int alloc3 = 0 ;
  int res4 ;
  char *buf4 = 0 ;
  int alloc4 = 0 ;
  int res5 ;
  char *buf5 = 0 ;
  int alloc5 = 0 ;
  int res6 ;
  char *buf6 = 0 ;
  int alloc6 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  PyObject * obj4 = 0 ;
  PyObject * obj5 = 0 ;
  int result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOOOO:SBError_SetErrorStringWithFormat",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBError, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBError_SetErrorStringWithFormat" "', argument " "1"" of type '" "lldb::SBError *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBError * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBError_SetErrorStringWithFormat" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3);
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBError_SetErrorStringWithFormat" "', argument " "3"" of type '" "char *""'");
  }
  arg3 = reinterpret_cast< char * >(buf3);
  res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4);
  if (!SWIG_IsOK(res4)) {
    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "SBError_SetErrorStringWithFormat" "', argument " "4"" of type '" "char *""'");
  }
  arg4 = reinterpret_cast< char * >(buf4);
  res5 = SWIG_AsCharPtrAndSize(obj4, &buf5, NULL, &alloc5);
  if (!SWIG_IsOK(res5)) {
    SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "SBError_SetErrorStringWithFormat" "', argument " "5"" of type '" "char *""'");
  }
  arg5 = reinterpret_cast< char * >(buf5);
  res6 = SWIG_AsCharPtrAndSize(obj5, &buf6, NULL, &alloc6);
  if (!SWIG_IsOK(res6)) {
    SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "SBError_SetErrorStringWithFormat" "', argument " "6"" of type '" "char *""'");
  }
  arg6 = reinterpret_cast< char * >(buf6);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (int)(arg1)->SetErrorStringWithFormat((char const *)arg2,arg3,arg4,arg5,arg6);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  if (alloc4 == SWIG_NEWOBJ) delete[] buf4;
  if (alloc5 == SWIG_NEWOBJ) delete[] buf5;
  if (alloc6 == SWIG_NEWOBJ) delete[] buf6;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  if (alloc4 == SWIG_NEWOBJ) delete[] buf4;
  if (alloc5 == SWIG_NEWOBJ) delete[] buf5;
  if (alloc6 == SWIG_NEWOBJ) delete[] buf6;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBError_SetErrorStringWithFormat__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBError *arg1 = (lldb::SBError *) 0 ;
  char *arg2 = (char *) 0 ;
  char *arg3 = (char *) 0 ;
  char *arg4 = (char *) 0 ;
  char *arg5 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  int res3 ;
  char *buf3 = 0 ;
  int alloc3 = 0 ;
  int res4 ;
  char *buf4 = 0 ;
  int alloc4 = 0 ;
  int res5 ;
  char *buf5 = 0 ;
  int alloc5 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  PyObject * obj4 = 0 ;
  int result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOOO:SBError_SetErrorStringWithFormat",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBError, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBError_SetErrorStringWithFormat" "', argument " "1"" of type '" "lldb::SBError *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBError * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBError_SetErrorStringWithFormat" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3);
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBError_SetErrorStringWithFormat" "', argument " "3"" of type '" "char *""'");
  }
  arg3 = reinterpret_cast< char * >(buf3);
  res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4);
  if (!SWIG_IsOK(res4)) {
    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "SBError_SetErrorStringWithFormat" "', argument " "4"" of type '" "char *""'");
  }
  arg4 = reinterpret_cast< char * >(buf4);
  res5 = SWIG_AsCharPtrAndSize(obj4, &buf5, NULL, &alloc5);
  if (!SWIG_IsOK(res5)) {
    SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "SBError_SetErrorStringWithFormat" "', argument " "5"" of type '" "char *""'");
  }
  arg5 = reinterpret_cast< char * >(buf5);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (int)(arg1)->SetErrorStringWithFormat((char const *)arg2,arg3,arg4,arg5);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  if (alloc4 == SWIG_NEWOBJ) delete[] buf4;
  if (alloc5 == SWIG_NEWOBJ) delete[] buf5;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  if (alloc4 == SWIG_NEWOBJ) delete[] buf4;
  if (alloc5 == SWIG_NEWOBJ) delete[] buf5;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBError_SetErrorStringWithFormat__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBError *arg1 = (lldb::SBError *) 0 ;
  char *arg2 = (char *) 0 ;
  char *arg3 = (char *) 0 ;
  char *arg4 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  int res3 ;
  char *buf3 = 0 ;
  int alloc3 = 0 ;
  int res4 ;
  char *buf4 = 0 ;
  int alloc4 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  int result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOO:SBError_SetErrorStringWithFormat",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBError, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBError_SetErrorStringWithFormat" "', argument " "1"" of type '" "lldb::SBError *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBError * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBError_SetErrorStringWithFormat" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3);
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBError_SetErrorStringWithFormat" "', argument " "3"" of type '" "char *""'");
  }
  arg3 = reinterpret_cast< char * >(buf3);
  res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4);
  if (!SWIG_IsOK(res4)) {
    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "SBError_SetErrorStringWithFormat" "', argument " "4"" of type '" "char *""'");
  }
  arg4 = reinterpret_cast< char * >(buf4);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (int)(arg1)->SetErrorStringWithFormat((char const *)arg2,arg3,arg4);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  if (alloc4 == SWIG_NEWOBJ) delete[] buf4;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  if (alloc4 == SWIG_NEWOBJ) delete[] buf4;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBError_SetErrorStringWithFormat__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBError *arg1 = (lldb::SBError *) 0 ;
  char *arg2 = (char *) 0 ;
  char *arg3 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  int res3 ;
  char *buf3 = 0 ;
  int alloc3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  int result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBError_SetErrorStringWithFormat",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBError, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBError_SetErrorStringWithFormat" "', argument " "1"" of type '" "lldb::SBError *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBError * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBError_SetErrorStringWithFormat" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3);
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBError_SetErrorStringWithFormat" "', argument " "3"" of type '" "char *""'");
  }
  arg3 = reinterpret_cast< char * >(buf3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (int)(arg1)->SetErrorStringWithFormat((char const *)arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBError_SetErrorStringWithFormat__SWIG_4(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBError *arg1 = (lldb::SBError *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  int result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBError_SetErrorStringWithFormat",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBError, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBError_SetErrorStringWithFormat" "', argument " "1"" of type '" "lldb::SBError *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBError * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBError_SetErrorStringWithFormat" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (int)(arg1)->SetErrorStringWithFormat((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBError_SetErrorStringWithFormat(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[7];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 6); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBError, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        return _wrap_SBError_SetErrorStringWithFormat__SWIG_4(self, args);
      }
    }
  }
  if (argc == 3) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBError, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        int res = SWIG_AsCharPtrAndSize(argv[2], 0, NULL, 0);
        _v = SWIG_CheckState(res);
        if (_v) {
          return _wrap_SBError_SetErrorStringWithFormat__SWIG_3(self, args);
        }
      }
    }
  }
  if (argc == 4) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBError, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        int res = SWIG_AsCharPtrAndSize(argv[2], 0, NULL, 0);
        _v = SWIG_CheckState(res);
        if (_v) {
          int res = SWIG_AsCharPtrAndSize(argv[3], 0, NULL, 0);
          _v = SWIG_CheckState(res);
          if (_v) {
            return _wrap_SBError_SetErrorStringWithFormat__SWIG_2(self, args);
          }
        }
      }
    }
  }
  if (argc == 5) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBError, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        int res = SWIG_AsCharPtrAndSize(argv[2], 0, NULL, 0);
        _v = SWIG_CheckState(res);
        if (_v) {
          int res = SWIG_AsCharPtrAndSize(argv[3], 0, NULL, 0);
          _v = SWIG_CheckState(res);
          if (_v) {
            int res = SWIG_AsCharPtrAndSize(argv[4], 0, NULL, 0);
            _v = SWIG_CheckState(res);
            if (_v) {
              return _wrap_SBError_SetErrorStringWithFormat__SWIG_1(self, args);
            }
          }
        }
      }
    }
  }
  if (argc == 6) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBError, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        int res = SWIG_AsCharPtrAndSize(argv[2], 0, NULL, 0);
        _v = SWIG_CheckState(res);
        if (_v) {
          int res = SWIG_AsCharPtrAndSize(argv[3], 0, NULL, 0);
          _v = SWIG_CheckState(res);
          if (_v) {
            int res = SWIG_AsCharPtrAndSize(argv[4], 0, NULL, 0);
            _v = SWIG_CheckState(res);
            if (_v) {
              int res = SWIG_AsCharPtrAndSize(argv[5], 0, NULL, 0);
              _v = SWIG_CheckState(res);
              if (_v) {
                return _wrap_SBError_SetErrorStringWithFormat__SWIG_0(self, args);
              }
            }
          }
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBError_SetErrorStringWithFormat'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    SetErrorStringWithFormat(lldb::SBError *,char const *,char *,char *,char *,char *)\n"
    "    SetErrorStringWithFormat(lldb::SBError *,char const *,char *,char *,char *)\n"
    "    SetErrorStringWithFormat(lldb::SBError *,char const *,char *,char *)\n"
    "    SetErrorStringWithFormat(lldb::SBError *,char const *,char *)\n"
    "    SetErrorStringWithFormat(lldb::SBError *,char const *)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBError_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBError *arg1 = (lldb::SBError *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBError_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBError, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBError_IsValid" "', argument " "1"" of type '" "lldb::SBError const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBError * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBError const *)arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBError_GetDescription(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBError *arg1 = (lldb::SBError *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBError_GetDescription",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBError, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBError_GetDescription" "', argument " "1"" of type '" "lldb::SBError *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBError * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBError_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBError_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetDescription(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBError___str__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBError *arg1 = (lldb::SBError *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBError___str__",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBError, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBError___str__" "', argument " "1"" of type '" "lldb::SBError *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBError * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (PyObject *)lldb_SBError___str__(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = result;
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBError_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBError, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBEvent__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBEvent *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBEvent")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBEvent *)new lldb::SBEvent();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBEvent, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBEvent__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBEvent *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBEvent *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBEvent",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBEvent,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBEvent * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBEvent *)new lldb::SBEvent((lldb::SBEvent const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBEvent, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBEvent__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  uint32_t arg1 ;
  char *arg2 = (char *) 0 ;
  uint32_t arg3 ;
  unsigned int val1 ;
  int ecode1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBEvent *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:new_SBEvent",&obj0,&obj1)) SWIG_fail;
  ecode1 = SWIG_AsVal_unsigned_SS_int(obj0, &val1);
  if (!SWIG_IsOK(ecode1)) {
    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_SBEvent" "', argument " "1"" of type '" "uint32_t""'");
  } 
  arg1 = static_cast< uint32_t >(val1);
  {
    using namespace lldb_private;
    if (PythonString::Check(obj1)) {
      PythonString str(PyRefType::Borrowed, obj1);
      arg2 = (char*)str.GetString().data();
      arg3 = str.GetSize();
    }
    else if(PythonByteArray::Check(obj1)) {
      PythonByteArray bytearray(PyRefType::Borrowed, obj1);
      arg2 = (char*)bytearray.GetBytes().data();
      arg3 = bytearray.GetSize();
    }
    else if (PythonBytes::Check(obj1)) {
      PythonBytes bytes(PyRefType::Borrowed, obj1);
      arg2 = (char*)bytes.GetBytes().data();
      arg3 = bytes.GetSize();
    }
    else {
      PyErr_SetString(PyExc_ValueError, "Expecting a string");
      return NULL;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBEvent *)new lldb::SBEvent(arg1,(char const *)arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBEvent, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBEvent(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[3];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 2); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBEvent__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBEvent, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBEvent__SWIG_1(self, args);
    }
  }
  if (argc == 2) {
    int _v;
    {
      int res = SWIG_AsVal_unsigned_SS_int(argv[0], NULL);
      _v = SWIG_CheckState(res);
    }
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        if (argc <= 2) {
          return _wrap_new_SBEvent__SWIG_2(self, args);
        }
        {
          int res = SWIG_AsVal_unsigned_SS_int(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          return _wrap_new_SBEvent__SWIG_2(self, args);
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBEvent'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBEvent()\n"
    "    lldb::SBEvent(lldb::SBEvent const &)\n"
    "    lldb::SBEvent(uint32_t,char const *,uint32_t)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBEvent(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBEvent *arg1 = (lldb::SBEvent *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBEvent",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBEvent, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBEvent" "', argument " "1"" of type '" "lldb::SBEvent *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBEvent * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBEvent_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBEvent *arg1 = (lldb::SBEvent *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBEvent_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBEvent, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBEvent_IsValid" "', argument " "1"" of type '" "lldb::SBEvent const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBEvent * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBEvent const *)arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBEvent_GetDataFlavor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBEvent *arg1 = (lldb::SBEvent *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBEvent_GetDataFlavor",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBEvent, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBEvent_GetDataFlavor" "', argument " "1"" of type '" "lldb::SBEvent *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBEvent * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetDataFlavor();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBEvent_GetType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBEvent *arg1 = (lldb::SBEvent *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBEvent_GetType",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBEvent, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBEvent_GetType" "', argument " "1"" of type '" "lldb::SBEvent const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBEvent * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)((lldb::SBEvent const *)arg1)->GetType();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBEvent_GetBroadcaster(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBEvent *arg1 = (lldb::SBEvent *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBBroadcaster result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBEvent_GetBroadcaster",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBEvent, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBEvent_GetBroadcaster" "', argument " "1"" of type '" "lldb::SBEvent const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBEvent * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBEvent const *)arg1)->GetBroadcaster();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBBroadcaster(static_cast< const lldb::SBBroadcaster& >(result))), SWIGTYPE_p_lldb__SBBroadcaster, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBEvent_GetBroadcasterClass(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBEvent *arg1 = (lldb::SBEvent *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBEvent_GetBroadcasterClass",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBEvent, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBEvent_GetBroadcasterClass" "', argument " "1"" of type '" "lldb::SBEvent const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBEvent * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)((lldb::SBEvent const *)arg1)->GetBroadcasterClass();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBEvent_BroadcasterMatchesRef(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBEvent *arg1 = (lldb::SBEvent *) 0 ;
  lldb::SBBroadcaster *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBEvent_BroadcasterMatchesRef",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBEvent, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBEvent_BroadcasterMatchesRef" "', argument " "1"" of type '" "lldb::SBEvent *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBEvent * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBBroadcaster,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBEvent_BroadcasterMatchesRef" "', argument " "2"" of type '" "lldb::SBBroadcaster const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBEvent_BroadcasterMatchesRef" "', argument " "2"" of type '" "lldb::SBBroadcaster const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBBroadcaster * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->BroadcasterMatchesRef((lldb::SBBroadcaster const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBEvent_Clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBEvent *arg1 = (lldb::SBEvent *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBEvent_Clear",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBEvent, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBEvent_Clear" "', argument " "1"" of type '" "lldb::SBEvent *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBEvent * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->Clear();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBEvent_GetCStringFromEvent(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBEvent *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBEvent_GetCStringFromEvent",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBEvent,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBEvent_GetCStringFromEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBEvent_GetCStringFromEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBEvent * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)lldb::SBEvent::GetCStringFromEvent((lldb::SBEvent const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBEvent_GetDescription(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBEvent *arg1 = (lldb::SBEvent *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBEvent_GetDescription",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBEvent, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBEvent_GetDescription" "', argument " "1"" of type '" "lldb::SBEvent const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBEvent * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBEvent_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBEvent_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBEvent const *)arg1)->GetDescription(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBEvent_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBEvent, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBExecutionContext__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExecutionContext *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBExecutionContext")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBExecutionContext *)new lldb::SBExecutionContext();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBExecutionContext, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBExecutionContext__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExecutionContext *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBExecutionContext *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBExecutionContext",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBExecutionContext,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBExecutionContext" "', argument " "1"" of type '" "lldb::SBExecutionContext const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBExecutionContext" "', argument " "1"" of type '" "lldb::SBExecutionContext const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExecutionContext * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBExecutionContext *)new lldb::SBExecutionContext((lldb::SBExecutionContext const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBExecutionContext, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBExecutionContext__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBExecutionContext *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBExecutionContext",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBTarget,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBExecutionContext" "', argument " "1"" of type '" "lldb::SBTarget const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBExecutionContext" "', argument " "1"" of type '" "lldb::SBTarget const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBExecutionContext *)new lldb::SBExecutionContext((lldb::SBTarget const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBExecutionContext, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBExecutionContext__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBExecutionContext *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBExecutionContext",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBProcess,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBExecutionContext" "', argument " "1"" of type '" "lldb::SBProcess const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBExecutionContext" "', argument " "1"" of type '" "lldb::SBProcess const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBExecutionContext *)new lldb::SBExecutionContext((lldb::SBProcess const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBExecutionContext, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBExecutionContext__SWIG_4(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread arg1 ;
  void *argp1 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBExecutionContext *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBExecutionContext",&obj0)) SWIG_fail;
  {
    res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBThread,  0  | 0);
    if (!SWIG_IsOK(res1)) {
      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBExecutionContext" "', argument " "1"" of type '" "lldb::SBThread""'"); 
    }  
    if (!argp1) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBExecutionContext" "', argument " "1"" of type '" "lldb::SBThread""'");
    } else {
      lldb::SBThread * temp = reinterpret_cast< lldb::SBThread * >(argp1);
      arg1 = *temp;
      if (SWIG_IsNewObj(res1)) delete temp;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBExecutionContext *)new lldb::SBExecutionContext(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBExecutionContext, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBExecutionContext__SWIG_5(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFrame *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBExecutionContext *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBExecutionContext",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBFrame,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBExecutionContext" "', argument " "1"" of type '" "lldb::SBFrame const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBExecutionContext" "', argument " "1"" of type '" "lldb::SBFrame const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFrame * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBExecutionContext *)new lldb::SBExecutionContext((lldb::SBFrame const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBExecutionContext, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBExecutionContext(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBExecutionContext__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBExecutionContext, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBExecutionContext__SWIG_1(self, args);
    }
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBTarget, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBExecutionContext__SWIG_2(self, args);
    }
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBProcess, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBExecutionContext__SWIG_3(self, args);
    }
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBThread, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBExecutionContext__SWIG_4(self, args);
    }
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBFrame, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBExecutionContext__SWIG_5(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBExecutionContext'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBExecutionContext()\n"
    "    lldb::SBExecutionContext(lldb::SBExecutionContext const &)\n"
    "    lldb::SBExecutionContext(lldb::SBTarget const &)\n"
    "    lldb::SBExecutionContext(lldb::SBProcess const &)\n"
    "    lldb::SBExecutionContext(lldb::SBThread)\n"
    "    lldb::SBExecutionContext(lldb::SBFrame const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBExecutionContext(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExecutionContext *arg1 = (lldb::SBExecutionContext *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBExecutionContext",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExecutionContext, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBExecutionContext" "', argument " "1"" of type '" "lldb::SBExecutionContext *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExecutionContext * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExecutionContext_GetTarget(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExecutionContext *arg1 = (lldb::SBExecutionContext *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBTarget result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBExecutionContext_GetTarget",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExecutionContext, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExecutionContext_GetTarget" "', argument " "1"" of type '" "lldb::SBExecutionContext const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExecutionContext * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBExecutionContext const *)arg1)->GetTarget();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTarget(static_cast< const lldb::SBTarget& >(result))), SWIGTYPE_p_lldb__SBTarget, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExecutionContext_GetProcess(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExecutionContext *arg1 = (lldb::SBExecutionContext *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBProcess result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBExecutionContext_GetProcess",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExecutionContext, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExecutionContext_GetProcess" "', argument " "1"" of type '" "lldb::SBExecutionContext const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExecutionContext * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBExecutionContext const *)arg1)->GetProcess();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBProcess(static_cast< const lldb::SBProcess& >(result))), SWIGTYPE_p_lldb__SBProcess, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExecutionContext_GetThread(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExecutionContext *arg1 = (lldb::SBExecutionContext *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBThread result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBExecutionContext_GetThread",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExecutionContext, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExecutionContext_GetThread" "', argument " "1"" of type '" "lldb::SBExecutionContext const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExecutionContext * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBExecutionContext const *)arg1)->GetThread();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBThread(static_cast< const lldb::SBThread& >(result))), SWIGTYPE_p_lldb__SBThread, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExecutionContext_GetFrame(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExecutionContext *arg1 = (lldb::SBExecutionContext *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBFrame result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBExecutionContext_GetFrame",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExecutionContext, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExecutionContext_GetFrame" "', argument " "1"" of type '" "lldb::SBExecutionContext const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExecutionContext * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBExecutionContext const *)arg1)->GetFrame();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBFrame(static_cast< const lldb::SBFrame& >(result))), SWIGTYPE_p_lldb__SBFrame, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBExecutionContext_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBExecutionContext, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBExpressionOptions__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBExpressionOptions")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBExpressionOptions *)new lldb::SBExpressionOptions();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBExpressionOptions, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBExpressionOptions__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBExpressionOptions *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBExpressionOptions",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBExpressionOptions,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBExpressionOptions" "', argument " "1"" of type '" "lldb::SBExpressionOptions const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBExpressionOptions" "', argument " "1"" of type '" "lldb::SBExpressionOptions const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExpressionOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBExpressionOptions *)new lldb::SBExpressionOptions((lldb::SBExpressionOptions const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBExpressionOptions, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBExpressionOptions(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBExpressionOptions__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBExpressionOptions, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBExpressionOptions__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBExpressionOptions'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBExpressionOptions()\n"
    "    lldb::SBExpressionOptions(lldb::SBExpressionOptions const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBExpressionOptions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *arg1 = (lldb::SBExpressionOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBExpressionOptions",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExpressionOptions, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBExpressionOptions" "', argument " "1"" of type '" "lldb::SBExpressionOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExpressionOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_GetCoerceResultToId(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *arg1 = (lldb::SBExpressionOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBExpressionOptions_GetCoerceResultToId",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExpressionOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExpressionOptions_GetCoerceResultToId" "', argument " "1"" of type '" "lldb::SBExpressionOptions const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExpressionOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBExpressionOptions const *)arg1)->GetCoerceResultToId();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_SetCoerceResultToId__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *arg1 = (lldb::SBExpressionOptions *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBExpressionOptions_SetCoerceResultToId",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExpressionOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExpressionOptions_SetCoerceResultToId" "', argument " "1"" of type '" "lldb::SBExpressionOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExpressionOptions * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBExpressionOptions_SetCoerceResultToId" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetCoerceResultToId(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_SetCoerceResultToId__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *arg1 = (lldb::SBExpressionOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBExpressionOptions_SetCoerceResultToId",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExpressionOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExpressionOptions_SetCoerceResultToId" "', argument " "1"" of type '" "lldb::SBExpressionOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExpressionOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetCoerceResultToId();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_SetCoerceResultToId(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[3];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 2); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 1) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBExpressionOptions, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_SBExpressionOptions_SetCoerceResultToId__SWIG_1(self, args);
    }
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBExpressionOptions, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_bool(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        return _wrap_SBExpressionOptions_SetCoerceResultToId__SWIG_0(self, args);
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBExpressionOptions_SetCoerceResultToId'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    SetCoerceResultToId(lldb::SBExpressionOptions *,bool)\n"
    "    SetCoerceResultToId(lldb::SBExpressionOptions *)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_GetUnwindOnError(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *arg1 = (lldb::SBExpressionOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBExpressionOptions_GetUnwindOnError",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExpressionOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExpressionOptions_GetUnwindOnError" "', argument " "1"" of type '" "lldb::SBExpressionOptions const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExpressionOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBExpressionOptions const *)arg1)->GetUnwindOnError();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_SetUnwindOnError__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *arg1 = (lldb::SBExpressionOptions *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBExpressionOptions_SetUnwindOnError",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExpressionOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExpressionOptions_SetUnwindOnError" "', argument " "1"" of type '" "lldb::SBExpressionOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExpressionOptions * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBExpressionOptions_SetUnwindOnError" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetUnwindOnError(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_SetUnwindOnError__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *arg1 = (lldb::SBExpressionOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBExpressionOptions_SetUnwindOnError",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExpressionOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExpressionOptions_SetUnwindOnError" "', argument " "1"" of type '" "lldb::SBExpressionOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExpressionOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetUnwindOnError();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_SetUnwindOnError(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[3];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 2); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 1) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBExpressionOptions, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_SBExpressionOptions_SetUnwindOnError__SWIG_1(self, args);
    }
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBExpressionOptions, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_bool(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        return _wrap_SBExpressionOptions_SetUnwindOnError__SWIG_0(self, args);
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBExpressionOptions_SetUnwindOnError'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    SetUnwindOnError(lldb::SBExpressionOptions *,bool)\n"
    "    SetUnwindOnError(lldb::SBExpressionOptions *)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_GetIgnoreBreakpoints(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *arg1 = (lldb::SBExpressionOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBExpressionOptions_GetIgnoreBreakpoints",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExpressionOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExpressionOptions_GetIgnoreBreakpoints" "', argument " "1"" of type '" "lldb::SBExpressionOptions const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExpressionOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBExpressionOptions const *)arg1)->GetIgnoreBreakpoints();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_SetIgnoreBreakpoints__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *arg1 = (lldb::SBExpressionOptions *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBExpressionOptions_SetIgnoreBreakpoints",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExpressionOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExpressionOptions_SetIgnoreBreakpoints" "', argument " "1"" of type '" "lldb::SBExpressionOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExpressionOptions * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBExpressionOptions_SetIgnoreBreakpoints" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetIgnoreBreakpoints(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_SetIgnoreBreakpoints__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *arg1 = (lldb::SBExpressionOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBExpressionOptions_SetIgnoreBreakpoints",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExpressionOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExpressionOptions_SetIgnoreBreakpoints" "', argument " "1"" of type '" "lldb::SBExpressionOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExpressionOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetIgnoreBreakpoints();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_SetIgnoreBreakpoints(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[3];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 2); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 1) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBExpressionOptions, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_SBExpressionOptions_SetIgnoreBreakpoints__SWIG_1(self, args);
    }
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBExpressionOptions, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_bool(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        return _wrap_SBExpressionOptions_SetIgnoreBreakpoints__SWIG_0(self, args);
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBExpressionOptions_SetIgnoreBreakpoints'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    SetIgnoreBreakpoints(lldb::SBExpressionOptions *,bool)\n"
    "    SetIgnoreBreakpoints(lldb::SBExpressionOptions *)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_GetFetchDynamicValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *arg1 = (lldb::SBExpressionOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::DynamicValueType result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBExpressionOptions_GetFetchDynamicValue",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExpressionOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExpressionOptions_GetFetchDynamicValue" "', argument " "1"" of type '" "lldb::SBExpressionOptions const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExpressionOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::DynamicValueType)((lldb::SBExpressionOptions const *)arg1)->GetFetchDynamicValue();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_SetFetchDynamicValue__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *arg1 = (lldb::SBExpressionOptions *) 0 ;
  lldb::DynamicValueType arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBExpressionOptions_SetFetchDynamicValue",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExpressionOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExpressionOptions_SetFetchDynamicValue" "', argument " "1"" of type '" "lldb::SBExpressionOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExpressionOptions * >(argp1);
  ecode2 = SWIG_AsVal_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBExpressionOptions_SetFetchDynamicValue" "', argument " "2"" of type '" "lldb::DynamicValueType""'");
  } 
  arg2 = static_cast< lldb::DynamicValueType >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetFetchDynamicValue(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_SetFetchDynamicValue__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *arg1 = (lldb::SBExpressionOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBExpressionOptions_SetFetchDynamicValue",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExpressionOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExpressionOptions_SetFetchDynamicValue" "', argument " "1"" of type '" "lldb::SBExpressionOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExpressionOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetFetchDynamicValue();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_SetFetchDynamicValue(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[3];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 2); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 1) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBExpressionOptions, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_SBExpressionOptions_SetFetchDynamicValue__SWIG_1(self, args);
    }
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBExpressionOptions, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_int(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        return _wrap_SBExpressionOptions_SetFetchDynamicValue__SWIG_0(self, args);
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBExpressionOptions_SetFetchDynamicValue'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    SetFetchDynamicValue(lldb::SBExpressionOptions *,lldb::DynamicValueType)\n"
    "    SetFetchDynamicValue(lldb::SBExpressionOptions *)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_GetTimeoutInMicroSeconds(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *arg1 = (lldb::SBExpressionOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBExpressionOptions_GetTimeoutInMicroSeconds",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExpressionOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExpressionOptions_GetTimeoutInMicroSeconds" "', argument " "1"" of type '" "lldb::SBExpressionOptions const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExpressionOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)((lldb::SBExpressionOptions const *)arg1)->GetTimeoutInMicroSeconds();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_SetTimeoutInMicroSeconds__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *arg1 = (lldb::SBExpressionOptions *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBExpressionOptions_SetTimeoutInMicroSeconds",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExpressionOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExpressionOptions_SetTimeoutInMicroSeconds" "', argument " "1"" of type '" "lldb::SBExpressionOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExpressionOptions * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBExpressionOptions_SetTimeoutInMicroSeconds" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetTimeoutInMicroSeconds(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_SetTimeoutInMicroSeconds__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *arg1 = (lldb::SBExpressionOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBExpressionOptions_SetTimeoutInMicroSeconds",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExpressionOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExpressionOptions_SetTimeoutInMicroSeconds" "', argument " "1"" of type '" "lldb::SBExpressionOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExpressionOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetTimeoutInMicroSeconds();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_SetTimeoutInMicroSeconds(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[3];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 2); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 1) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBExpressionOptions, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_SBExpressionOptions_SetTimeoutInMicroSeconds__SWIG_1(self, args);
    }
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBExpressionOptions, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_unsigned_SS_int(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        return _wrap_SBExpressionOptions_SetTimeoutInMicroSeconds__SWIG_0(self, args);
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBExpressionOptions_SetTimeoutInMicroSeconds'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    SetTimeoutInMicroSeconds(lldb::SBExpressionOptions *,uint32_t)\n"
    "    SetTimeoutInMicroSeconds(lldb::SBExpressionOptions *)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_GetOneThreadTimeoutInMicroSeconds(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *arg1 = (lldb::SBExpressionOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBExpressionOptions_GetOneThreadTimeoutInMicroSeconds",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExpressionOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExpressionOptions_GetOneThreadTimeoutInMicroSeconds" "', argument " "1"" of type '" "lldb::SBExpressionOptions const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExpressionOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)((lldb::SBExpressionOptions const *)arg1)->GetOneThreadTimeoutInMicroSeconds();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_SetOneThreadTimeoutInMicroSeconds__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *arg1 = (lldb::SBExpressionOptions *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBExpressionOptions_SetOneThreadTimeoutInMicroSeconds",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExpressionOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExpressionOptions_SetOneThreadTimeoutInMicroSeconds" "', argument " "1"" of type '" "lldb::SBExpressionOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExpressionOptions * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBExpressionOptions_SetOneThreadTimeoutInMicroSeconds" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetOneThreadTimeoutInMicroSeconds(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_SetOneThreadTimeoutInMicroSeconds__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *arg1 = (lldb::SBExpressionOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBExpressionOptions_SetOneThreadTimeoutInMicroSeconds",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExpressionOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExpressionOptions_SetOneThreadTimeoutInMicroSeconds" "', argument " "1"" of type '" "lldb::SBExpressionOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExpressionOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetOneThreadTimeoutInMicroSeconds();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_SetOneThreadTimeoutInMicroSeconds(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[3];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 2); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 1) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBExpressionOptions, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_SBExpressionOptions_SetOneThreadTimeoutInMicroSeconds__SWIG_1(self, args);
    }
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBExpressionOptions, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_unsigned_SS_int(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        return _wrap_SBExpressionOptions_SetOneThreadTimeoutInMicroSeconds__SWIG_0(self, args);
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBExpressionOptions_SetOneThreadTimeoutInMicroSeconds'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    SetOneThreadTimeoutInMicroSeconds(lldb::SBExpressionOptions *,uint32_t)\n"
    "    SetOneThreadTimeoutInMicroSeconds(lldb::SBExpressionOptions *)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_GetTryAllThreads(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *arg1 = (lldb::SBExpressionOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBExpressionOptions_GetTryAllThreads",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExpressionOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExpressionOptions_GetTryAllThreads" "', argument " "1"" of type '" "lldb::SBExpressionOptions const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExpressionOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBExpressionOptions const *)arg1)->GetTryAllThreads();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_SetTryAllThreads__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *arg1 = (lldb::SBExpressionOptions *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBExpressionOptions_SetTryAllThreads",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExpressionOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExpressionOptions_SetTryAllThreads" "', argument " "1"" of type '" "lldb::SBExpressionOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExpressionOptions * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBExpressionOptions_SetTryAllThreads" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetTryAllThreads(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_SetTryAllThreads__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *arg1 = (lldb::SBExpressionOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBExpressionOptions_SetTryAllThreads",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExpressionOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExpressionOptions_SetTryAllThreads" "', argument " "1"" of type '" "lldb::SBExpressionOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExpressionOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetTryAllThreads();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_SetTryAllThreads(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[3];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 2); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 1) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBExpressionOptions, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_SBExpressionOptions_SetTryAllThreads__SWIG_1(self, args);
    }
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBExpressionOptions, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_bool(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        return _wrap_SBExpressionOptions_SetTryAllThreads__SWIG_0(self, args);
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBExpressionOptions_SetTryAllThreads'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    SetTryAllThreads(lldb::SBExpressionOptions *,bool)\n"
    "    SetTryAllThreads(lldb::SBExpressionOptions *)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_GetStopOthers(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *arg1 = (lldb::SBExpressionOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBExpressionOptions_GetStopOthers",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExpressionOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExpressionOptions_GetStopOthers" "', argument " "1"" of type '" "lldb::SBExpressionOptions const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExpressionOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBExpressionOptions const *)arg1)->GetStopOthers();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_SetStopOthers__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *arg1 = (lldb::SBExpressionOptions *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBExpressionOptions_SetStopOthers",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExpressionOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExpressionOptions_SetStopOthers" "', argument " "1"" of type '" "lldb::SBExpressionOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExpressionOptions * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBExpressionOptions_SetStopOthers" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetStopOthers(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_SetStopOthers__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *arg1 = (lldb::SBExpressionOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBExpressionOptions_SetStopOthers",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExpressionOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExpressionOptions_SetStopOthers" "', argument " "1"" of type '" "lldb::SBExpressionOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExpressionOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetStopOthers();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_SetStopOthers(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[3];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 2); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 1) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBExpressionOptions, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_SBExpressionOptions_SetStopOthers__SWIG_1(self, args);
    }
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBExpressionOptions, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_bool(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        return _wrap_SBExpressionOptions_SetStopOthers__SWIG_0(self, args);
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBExpressionOptions_SetStopOthers'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    SetStopOthers(lldb::SBExpressionOptions *,bool)\n"
    "    SetStopOthers(lldb::SBExpressionOptions *)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_GetTrapExceptions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *arg1 = (lldb::SBExpressionOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBExpressionOptions_GetTrapExceptions",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExpressionOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExpressionOptions_GetTrapExceptions" "', argument " "1"" of type '" "lldb::SBExpressionOptions const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExpressionOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBExpressionOptions const *)arg1)->GetTrapExceptions();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_SetTrapExceptions__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *arg1 = (lldb::SBExpressionOptions *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBExpressionOptions_SetTrapExceptions",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExpressionOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExpressionOptions_SetTrapExceptions" "', argument " "1"" of type '" "lldb::SBExpressionOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExpressionOptions * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBExpressionOptions_SetTrapExceptions" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetTrapExceptions(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_SetTrapExceptions__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *arg1 = (lldb::SBExpressionOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBExpressionOptions_SetTrapExceptions",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExpressionOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExpressionOptions_SetTrapExceptions" "', argument " "1"" of type '" "lldb::SBExpressionOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExpressionOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetTrapExceptions();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_SetTrapExceptions(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[3];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 2); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 1) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBExpressionOptions, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_SBExpressionOptions_SetTrapExceptions__SWIG_1(self, args);
    }
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBExpressionOptions, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_bool(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        return _wrap_SBExpressionOptions_SetTrapExceptions__SWIG_0(self, args);
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBExpressionOptions_SetTrapExceptions'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    SetTrapExceptions(lldb::SBExpressionOptions *,bool)\n"
    "    SetTrapExceptions(lldb::SBExpressionOptions *)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_GetPlaygroundTransformEnabled(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *arg1 = (lldb::SBExpressionOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBExpressionOptions_GetPlaygroundTransformEnabled",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExpressionOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExpressionOptions_GetPlaygroundTransformEnabled" "', argument " "1"" of type '" "lldb::SBExpressionOptions const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExpressionOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBExpressionOptions const *)arg1)->GetPlaygroundTransformEnabled();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_SetPlaygroundTransformEnabled__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *arg1 = (lldb::SBExpressionOptions *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBExpressionOptions_SetPlaygroundTransformEnabled",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExpressionOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExpressionOptions_SetPlaygroundTransformEnabled" "', argument " "1"" of type '" "lldb::SBExpressionOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExpressionOptions * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBExpressionOptions_SetPlaygroundTransformEnabled" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetPlaygroundTransformEnabled(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_SetPlaygroundTransformEnabled__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *arg1 = (lldb::SBExpressionOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBExpressionOptions_SetPlaygroundTransformEnabled",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExpressionOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExpressionOptions_SetPlaygroundTransformEnabled" "', argument " "1"" of type '" "lldb::SBExpressionOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExpressionOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetPlaygroundTransformEnabled();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_SetPlaygroundTransformEnabled(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[3];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 2); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 1) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBExpressionOptions, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_SBExpressionOptions_SetPlaygroundTransformEnabled__SWIG_1(self, args);
    }
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBExpressionOptions, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_bool(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        return _wrap_SBExpressionOptions_SetPlaygroundTransformEnabled__SWIG_0(self, args);
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBExpressionOptions_SetPlaygroundTransformEnabled'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    SetPlaygroundTransformEnabled(lldb::SBExpressionOptions *,bool)\n"
    "    SetPlaygroundTransformEnabled(lldb::SBExpressionOptions *)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_GetREPLMode(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *arg1 = (lldb::SBExpressionOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBExpressionOptions_GetREPLMode",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExpressionOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExpressionOptions_GetREPLMode" "', argument " "1"" of type '" "lldb::SBExpressionOptions const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExpressionOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBExpressionOptions const *)arg1)->GetREPLMode();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_SetREPLMode__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *arg1 = (lldb::SBExpressionOptions *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBExpressionOptions_SetREPLMode",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExpressionOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExpressionOptions_SetREPLMode" "', argument " "1"" of type '" "lldb::SBExpressionOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExpressionOptions * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBExpressionOptions_SetREPLMode" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetREPLMode(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_SetREPLMode__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *arg1 = (lldb::SBExpressionOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBExpressionOptions_SetREPLMode",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExpressionOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExpressionOptions_SetREPLMode" "', argument " "1"" of type '" "lldb::SBExpressionOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExpressionOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetREPLMode();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_SetREPLMode(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[3];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 2); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 1) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBExpressionOptions, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_SBExpressionOptions_SetREPLMode__SWIG_1(self, args);
    }
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBExpressionOptions, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_bool(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        return _wrap_SBExpressionOptions_SetREPLMode__SWIG_0(self, args);
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBExpressionOptions_SetREPLMode'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    SetREPLMode(lldb::SBExpressionOptions *,bool)\n"
    "    SetREPLMode(lldb::SBExpressionOptions *)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_SetLanguage(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *arg1 = (lldb::SBExpressionOptions *) 0 ;
  lldb::LanguageType arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBExpressionOptions_SetLanguage",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExpressionOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExpressionOptions_SetLanguage" "', argument " "1"" of type '" "lldb::SBExpressionOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExpressionOptions * >(argp1);
  ecode2 = SWIG_AsVal_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBExpressionOptions_SetLanguage" "', argument " "2"" of type '" "lldb::LanguageType""'");
  } 
  arg2 = static_cast< lldb::LanguageType >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetLanguage(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_GetGenerateDebugInfo(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *arg1 = (lldb::SBExpressionOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBExpressionOptions_GetGenerateDebugInfo",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExpressionOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExpressionOptions_GetGenerateDebugInfo" "', argument " "1"" of type '" "lldb::SBExpressionOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExpressionOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetGenerateDebugInfo();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_SetGenerateDebugInfo__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *arg1 = (lldb::SBExpressionOptions *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBExpressionOptions_SetGenerateDebugInfo",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExpressionOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExpressionOptions_SetGenerateDebugInfo" "', argument " "1"" of type '" "lldb::SBExpressionOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExpressionOptions * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBExpressionOptions_SetGenerateDebugInfo" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetGenerateDebugInfo(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_SetGenerateDebugInfo__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *arg1 = (lldb::SBExpressionOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBExpressionOptions_SetGenerateDebugInfo",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExpressionOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExpressionOptions_SetGenerateDebugInfo" "', argument " "1"" of type '" "lldb::SBExpressionOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExpressionOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetGenerateDebugInfo();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_SetGenerateDebugInfo(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[3];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 2); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 1) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBExpressionOptions, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_SBExpressionOptions_SetGenerateDebugInfo__SWIG_1(self, args);
    }
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBExpressionOptions, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_bool(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        return _wrap_SBExpressionOptions_SetGenerateDebugInfo__SWIG_0(self, args);
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBExpressionOptions_SetGenerateDebugInfo'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    SetGenerateDebugInfo(lldb::SBExpressionOptions *,bool)\n"
    "    SetGenerateDebugInfo(lldb::SBExpressionOptions *)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_GetSuppressPersistentResult(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *arg1 = (lldb::SBExpressionOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBExpressionOptions_GetSuppressPersistentResult",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExpressionOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExpressionOptions_GetSuppressPersistentResult" "', argument " "1"" of type '" "lldb::SBExpressionOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExpressionOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetSuppressPersistentResult();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_SetSuppressPersistentResult__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *arg1 = (lldb::SBExpressionOptions *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBExpressionOptions_SetSuppressPersistentResult",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExpressionOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExpressionOptions_SetSuppressPersistentResult" "', argument " "1"" of type '" "lldb::SBExpressionOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExpressionOptions * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBExpressionOptions_SetSuppressPersistentResult" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetSuppressPersistentResult(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_SetSuppressPersistentResult__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *arg1 = (lldb::SBExpressionOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBExpressionOptions_SetSuppressPersistentResult",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExpressionOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExpressionOptions_SetSuppressPersistentResult" "', argument " "1"" of type '" "lldb::SBExpressionOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExpressionOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetSuppressPersistentResult();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_SetSuppressPersistentResult(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[3];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 2); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 1) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBExpressionOptions, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_SBExpressionOptions_SetSuppressPersistentResult__SWIG_1(self, args);
    }
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBExpressionOptions, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_bool(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        return _wrap_SBExpressionOptions_SetSuppressPersistentResult__SWIG_0(self, args);
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBExpressionOptions_SetSuppressPersistentResult'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    SetSuppressPersistentResult(lldb::SBExpressionOptions *,bool)\n"
    "    SetSuppressPersistentResult(lldb::SBExpressionOptions *)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_GetPrefix(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *arg1 = (lldb::SBExpressionOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBExpressionOptions_GetPrefix",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExpressionOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExpressionOptions_GetPrefix" "', argument " "1"" of type '" "lldb::SBExpressionOptions const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExpressionOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)((lldb::SBExpressionOptions const *)arg1)->GetPrefix();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_SetPrefix(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *arg1 = (lldb::SBExpressionOptions *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBExpressionOptions_SetPrefix",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExpressionOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExpressionOptions_SetPrefix" "', argument " "1"" of type '" "lldb::SBExpressionOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExpressionOptions * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBExpressionOptions_SetPrefix" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetPrefix((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_SetAutoApplyFixIts__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *arg1 = (lldb::SBExpressionOptions *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBExpressionOptions_SetAutoApplyFixIts",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExpressionOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExpressionOptions_SetAutoApplyFixIts" "', argument " "1"" of type '" "lldb::SBExpressionOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExpressionOptions * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBExpressionOptions_SetAutoApplyFixIts" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetAutoApplyFixIts(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_SetAutoApplyFixIts__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *arg1 = (lldb::SBExpressionOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBExpressionOptions_SetAutoApplyFixIts",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExpressionOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExpressionOptions_SetAutoApplyFixIts" "', argument " "1"" of type '" "lldb::SBExpressionOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExpressionOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetAutoApplyFixIts();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_SetAutoApplyFixIts(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[3];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 2); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 1) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBExpressionOptions, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_SBExpressionOptions_SetAutoApplyFixIts__SWIG_1(self, args);
    }
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBExpressionOptions, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_bool(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        return _wrap_SBExpressionOptions_SetAutoApplyFixIts__SWIG_0(self, args);
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBExpressionOptions_SetAutoApplyFixIts'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    SetAutoApplyFixIts(lldb::SBExpressionOptions *,bool)\n"
    "    SetAutoApplyFixIts(lldb::SBExpressionOptions *)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_GetAutoApplyFixIts(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *arg1 = (lldb::SBExpressionOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBExpressionOptions_GetAutoApplyFixIts",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExpressionOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExpressionOptions_GetAutoApplyFixIts" "', argument " "1"" of type '" "lldb::SBExpressionOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExpressionOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetAutoApplyFixIts();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_GetTopLevel(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *arg1 = (lldb::SBExpressionOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBExpressionOptions_GetTopLevel",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExpressionOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExpressionOptions_GetTopLevel" "', argument " "1"" of type '" "lldb::SBExpressionOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExpressionOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetTopLevel();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_SetTopLevel__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *arg1 = (lldb::SBExpressionOptions *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBExpressionOptions_SetTopLevel",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExpressionOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExpressionOptions_SetTopLevel" "', argument " "1"" of type '" "lldb::SBExpressionOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExpressionOptions * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBExpressionOptions_SetTopLevel" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetTopLevel(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_SetTopLevel__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBExpressionOptions *arg1 = (lldb::SBExpressionOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBExpressionOptions_SetTopLevel",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBExpressionOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBExpressionOptions_SetTopLevel" "', argument " "1"" of type '" "lldb::SBExpressionOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBExpressionOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetTopLevel();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBExpressionOptions_SetTopLevel(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[3];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 2); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 1) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBExpressionOptions, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_SBExpressionOptions_SetTopLevel__SWIG_1(self, args);
    }
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBExpressionOptions, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_bool(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        return _wrap_SBExpressionOptions_SetTopLevel__SWIG_0(self, args);
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBExpressionOptions_SetTopLevel'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    SetTopLevel(lldb::SBExpressionOptions *,bool)\n"
    "    SetTopLevel(lldb::SBExpressionOptions *)\n");
  return NULL;
}


SWIGINTERN PyObject *SBExpressionOptions_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBExpressionOptions, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBFileSpec__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFileSpec *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBFileSpec")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBFileSpec *)new lldb::SBFileSpec();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBFileSpec, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBFileSpec__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFileSpec *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBFileSpec *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBFileSpec",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBFileSpec,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBFileSpec" "', argument " "1"" of type '" "lldb::SBFileSpec const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBFileSpec" "', argument " "1"" of type '" "lldb::SBFileSpec const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFileSpec * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBFileSpec *)new lldb::SBFileSpec((lldb::SBFileSpec const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBFileSpec, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBFileSpec__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  char *arg1 = (char *) 0 ;
  int res1 ;
  char *buf1 = 0 ;
  int alloc1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBFileSpec *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBFileSpec",&obj0)) SWIG_fail;
  res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBFileSpec" "', argument " "1"" of type '" "char const *""'");
  }
  arg1 = reinterpret_cast< char * >(buf1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBFileSpec *)new lldb::SBFileSpec((char const *)arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBFileSpec, SWIG_POINTER_NEW |  0 );
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return resultobj;
fail:
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBFileSpec__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  char *arg1 = (char *) 0 ;
  bool arg2 ;
  int res1 ;
  char *buf1 = 0 ;
  int alloc1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBFileSpec *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:new_SBFileSpec",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBFileSpec" "', argument " "1"" of type '" "char const *""'");
  }
  arg1 = reinterpret_cast< char * >(buf1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_SBFileSpec" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBFileSpec *)new lldb::SBFileSpec((char const *)arg1,arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBFileSpec, SWIG_POINTER_NEW |  0 );
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return resultobj;
fail:
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBFileSpec(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[3];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 2); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBFileSpec__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBFileSpec, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBFileSpec__SWIG_1(self, args);
    }
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_AsCharPtrAndSize(argv[0], 0, NULL, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBFileSpec__SWIG_2(self, args);
    }
  }
  if (argc == 2) {
    int _v;
    int res = SWIG_AsCharPtrAndSize(argv[0], 0, NULL, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_bool(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        return _wrap_new_SBFileSpec__SWIG_3(self, args);
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBFileSpec'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBFileSpec()\n"
    "    lldb::SBFileSpec(lldb::SBFileSpec const &)\n"
    "    lldb::SBFileSpec(char const *)\n"
    "    lldb::SBFileSpec(char const *,bool)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBFileSpec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFileSpec *arg1 = (lldb::SBFileSpec *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBFileSpec",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFileSpec, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBFileSpec" "', argument " "1"" of type '" "lldb::SBFileSpec *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFileSpec * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFileSpec_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFileSpec *arg1 = (lldb::SBFileSpec *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBFileSpec_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFileSpec, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFileSpec_IsValid" "', argument " "1"" of type '" "lldb::SBFileSpec const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFileSpec * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBFileSpec const *)arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFileSpec_Exists(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFileSpec *arg1 = (lldb::SBFileSpec *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBFileSpec_Exists",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFileSpec, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFileSpec_Exists" "', argument " "1"" of type '" "lldb::SBFileSpec const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFileSpec * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBFileSpec const *)arg1)->Exists();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFileSpec_ResolveExecutableLocation(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFileSpec *arg1 = (lldb::SBFileSpec *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBFileSpec_ResolveExecutableLocation",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFileSpec, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFileSpec_ResolveExecutableLocation" "', argument " "1"" of type '" "lldb::SBFileSpec *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFileSpec * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->ResolveExecutableLocation();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFileSpec_GetFilename(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFileSpec *arg1 = (lldb::SBFileSpec *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBFileSpec_GetFilename",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFileSpec, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFileSpec_GetFilename" "', argument " "1"" of type '" "lldb::SBFileSpec const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFileSpec * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)((lldb::SBFileSpec const *)arg1)->GetFilename();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFileSpec_GetDirectory(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFileSpec *arg1 = (lldb::SBFileSpec *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBFileSpec_GetDirectory",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFileSpec, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFileSpec_GetDirectory" "', argument " "1"" of type '" "lldb::SBFileSpec const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFileSpec * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)((lldb::SBFileSpec const *)arg1)->GetDirectory();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFileSpec_SetFilename(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFileSpec *arg1 = (lldb::SBFileSpec *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBFileSpec_SetFilename",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFileSpec, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFileSpec_SetFilename" "', argument " "1"" of type '" "lldb::SBFileSpec *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFileSpec * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBFileSpec_SetFilename" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetFilename((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFileSpec_SetDirectory(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFileSpec *arg1 = (lldb::SBFileSpec *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBFileSpec_SetDirectory",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFileSpec, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFileSpec_SetDirectory" "', argument " "1"" of type '" "lldb::SBFileSpec *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFileSpec * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBFileSpec_SetDirectory" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetDirectory((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFileSpec_GetPath(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFileSpec *arg1 = (lldb::SBFileSpec *) 0 ;
  char *arg2 = (char *) 0 ;
  size_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  size_t val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBFileSpec_GetPath",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFileSpec, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFileSpec_GetPath" "', argument " "1"" of type '" "lldb::SBFileSpec const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFileSpec * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBFileSpec_GetPath" "', argument " "2"" of type '" "char *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  ecode3 = SWIG_AsVal_size_t(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBFileSpec_GetPath" "', argument " "3"" of type '" "size_t""'");
  } 
  arg3 = static_cast< size_t >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)((lldb::SBFileSpec const *)arg1)->GetPath(arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFileSpec_ResolvePath(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  char *arg1 = (char *) 0 ;
  char *arg2 = (char *) 0 ;
  size_t arg3 ;
  int res1 ;
  char *buf1 = 0 ;
  int alloc1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  size_t val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  int result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBFileSpec_ResolvePath",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFileSpec_ResolvePath" "', argument " "1"" of type '" "char const *""'");
  }
  arg1 = reinterpret_cast< char * >(buf1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBFileSpec_ResolvePath" "', argument " "2"" of type '" "char *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  ecode3 = SWIG_AsVal_size_t(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBFileSpec_ResolvePath" "', argument " "3"" of type '" "size_t""'");
  } 
  arg3 = static_cast< size_t >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (int)lldb::SBFileSpec::ResolvePath((char const *)arg1,arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFileSpec_GetDescription(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFileSpec *arg1 = (lldb::SBFileSpec *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBFileSpec_GetDescription",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFileSpec, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFileSpec_GetDescription" "', argument " "1"" of type '" "lldb::SBFileSpec const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFileSpec * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBFileSpec_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBFileSpec_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBFileSpec const *)arg1)->GetDescription(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFileSpec_AppendPathComponent(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFileSpec *arg1 = (lldb::SBFileSpec *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBFileSpec_AppendPathComponent",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFileSpec, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFileSpec_AppendPathComponent" "', argument " "1"" of type '" "lldb::SBFileSpec *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFileSpec * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBFileSpec_AppendPathComponent" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->AppendPathComponent((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFileSpec___str__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFileSpec *arg1 = (lldb::SBFileSpec *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBFileSpec___str__",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFileSpec, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFileSpec___str__" "', argument " "1"" of type '" "lldb::SBFileSpec *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFileSpec * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (PyObject *)lldb_SBFileSpec___str__(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = result;
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBFileSpec_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBFileSpec, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBFileSpecList__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFileSpecList *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBFileSpecList")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBFileSpecList *)new lldb::SBFileSpecList();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBFileSpecList, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBFileSpecList__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFileSpecList *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBFileSpecList *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBFileSpecList",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBFileSpecList,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBFileSpecList" "', argument " "1"" of type '" "lldb::SBFileSpecList const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBFileSpecList" "', argument " "1"" of type '" "lldb::SBFileSpecList const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFileSpecList * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBFileSpecList *)new lldb::SBFileSpecList((lldb::SBFileSpecList const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBFileSpecList, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBFileSpecList(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBFileSpecList__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBFileSpecList, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBFileSpecList__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBFileSpecList'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBFileSpecList()\n"
    "    lldb::SBFileSpecList(lldb::SBFileSpecList const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBFileSpecList(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFileSpecList *arg1 = (lldb::SBFileSpecList *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBFileSpecList",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFileSpecList, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBFileSpecList" "', argument " "1"" of type '" "lldb::SBFileSpecList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFileSpecList * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFileSpecList_GetSize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFileSpecList *arg1 = (lldb::SBFileSpecList *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBFileSpecList_GetSize",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFileSpecList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFileSpecList_GetSize" "', argument " "1"" of type '" "lldb::SBFileSpecList const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFileSpecList * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)((lldb::SBFileSpecList const *)arg1)->GetSize();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFileSpecList_GetDescription(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFileSpecList *arg1 = (lldb::SBFileSpecList *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBFileSpecList_GetDescription",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFileSpecList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFileSpecList_GetDescription" "', argument " "1"" of type '" "lldb::SBFileSpecList const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFileSpecList * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBFileSpecList_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBFileSpecList_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBFileSpecList const *)arg1)->GetDescription(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFileSpecList_Append(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFileSpecList *arg1 = (lldb::SBFileSpecList *) 0 ;
  lldb::SBFileSpec *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBFileSpecList_Append",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFileSpecList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFileSpecList_Append" "', argument " "1"" of type '" "lldb::SBFileSpecList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFileSpecList * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBFileSpec,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBFileSpecList_Append" "', argument " "2"" of type '" "lldb::SBFileSpec const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBFileSpecList_Append" "', argument " "2"" of type '" "lldb::SBFileSpec const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBFileSpec * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->Append((lldb::SBFileSpec const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFileSpecList_AppendIfUnique(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFileSpecList *arg1 = (lldb::SBFileSpecList *) 0 ;
  lldb::SBFileSpec *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBFileSpecList_AppendIfUnique",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFileSpecList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFileSpecList_AppendIfUnique" "', argument " "1"" of type '" "lldb::SBFileSpecList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFileSpecList * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBFileSpec,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBFileSpecList_AppendIfUnique" "', argument " "2"" of type '" "lldb::SBFileSpec const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBFileSpecList_AppendIfUnique" "', argument " "2"" of type '" "lldb::SBFileSpec const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBFileSpec * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->AppendIfUnique((lldb::SBFileSpec const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFileSpecList_Clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFileSpecList *arg1 = (lldb::SBFileSpecList *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBFileSpecList_Clear",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFileSpecList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFileSpecList_Clear" "', argument " "1"" of type '" "lldb::SBFileSpecList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFileSpecList * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->Clear();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFileSpecList_FindFileIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFileSpecList *arg1 = (lldb::SBFileSpecList *) 0 ;
  uint32_t arg2 ;
  lldb::SBFileSpec *arg3 = 0 ;
  bool arg4 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  void *argp3 = 0 ;
  int res3 = 0 ;
  bool val4 ;
  int ecode4 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOO:SBFileSpecList_FindFileIndex",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFileSpecList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFileSpecList_FindFileIndex" "', argument " "1"" of type '" "lldb::SBFileSpecList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFileSpecList * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBFileSpecList_FindFileIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBFileSpec,  0  | 0);
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBFileSpecList_FindFileIndex" "', argument " "3"" of type '" "lldb::SBFileSpec const &""'"); 
  }
  if (!argp3) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBFileSpecList_FindFileIndex" "', argument " "3"" of type '" "lldb::SBFileSpec const &""'"); 
  }
  arg3 = reinterpret_cast< lldb::SBFileSpec * >(argp3);
  ecode4 = SWIG_AsVal_bool(obj3, &val4);
  if (!SWIG_IsOK(ecode4)) {
    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "SBFileSpecList_FindFileIndex" "', argument " "4"" of type '" "bool""'");
  } 
  arg4 = static_cast< bool >(val4);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->FindFileIndex(arg2,(lldb::SBFileSpec const &)*arg3,arg4);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFileSpecList_GetFileSpecAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFileSpecList *arg1 = (lldb::SBFileSpecList *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBFileSpec result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBFileSpecList_GetFileSpecAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFileSpecList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFileSpecList_GetFileSpecAtIndex" "', argument " "1"" of type '" "lldb::SBFileSpecList const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFileSpecList * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBFileSpecList_GetFileSpecAtIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBFileSpecList const *)arg1)->GetFileSpecAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBFileSpec(static_cast< const lldb::SBFileSpec& >(result))), SWIGTYPE_p_lldb__SBFileSpec, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBFileSpecList_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBFileSpecList, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBFrame__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFrame *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBFrame")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBFrame *)new lldb::SBFrame();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBFrame, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBFrame__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFrame *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBFrame *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBFrame",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBFrame,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBFrame" "', argument " "1"" of type '" "lldb::SBFrame const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBFrame" "', argument " "1"" of type '" "lldb::SBFrame const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFrame * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBFrame *)new lldb::SBFrame((lldb::SBFrame const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBFrame, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBFrame(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBFrame__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBFrame, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBFrame__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBFrame'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBFrame()\n"
    "    lldb::SBFrame(lldb::SBFrame const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBFrame(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFrame *arg1 = (lldb::SBFrame *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBFrame",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFrame, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBFrame" "', argument " "1"" of type '" "lldb::SBFrame *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFrame * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame_IsEqual(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFrame *arg1 = (lldb::SBFrame *) 0 ;
  lldb::SBFrame *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBFrame_IsEqual",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFrame, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFrame_IsEqual" "', argument " "1"" of type '" "lldb::SBFrame const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFrame * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBFrame,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBFrame_IsEqual" "', argument " "2"" of type '" "lldb::SBFrame const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBFrame_IsEqual" "', argument " "2"" of type '" "lldb::SBFrame const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBFrame * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBFrame const *)arg1)->IsEqual((lldb::SBFrame const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFrame *arg1 = (lldb::SBFrame *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBFrame_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFrame, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFrame_IsValid" "', argument " "1"" of type '" "lldb::SBFrame const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFrame * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBFrame const *)arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame_GetFrameID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFrame *arg1 = (lldb::SBFrame *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBFrame_GetFrameID",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFrame, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFrame_GetFrameID" "', argument " "1"" of type '" "lldb::SBFrame const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFrame * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)((lldb::SBFrame const *)arg1)->GetFrameID();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame_GetCFA(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFrame *arg1 = (lldb::SBFrame *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::addr_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBFrame_GetCFA",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFrame, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFrame_GetCFA" "', argument " "1"" of type '" "lldb::SBFrame const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFrame * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::addr_t)((lldb::SBFrame const *)arg1)->GetCFA();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame_GetPC(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFrame *arg1 = (lldb::SBFrame *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::addr_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBFrame_GetPC",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFrame, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFrame_GetPC" "', argument " "1"" of type '" "lldb::SBFrame const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFrame * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::addr_t)((lldb::SBFrame const *)arg1)->GetPC();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame_SetPC(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFrame *arg1 = (lldb::SBFrame *) 0 ;
  lldb::addr_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned long long val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBFrame_SetPC",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFrame, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFrame_SetPC" "', argument " "1"" of type '" "lldb::SBFrame *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFrame * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_long_SS_long(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBFrame_SetPC" "', argument " "2"" of type '" "lldb::addr_t""'");
  } 
  arg2 = static_cast< lldb::addr_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->SetPC(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame_GetSP(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFrame *arg1 = (lldb::SBFrame *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::addr_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBFrame_GetSP",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFrame, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFrame_GetSP" "', argument " "1"" of type '" "lldb::SBFrame const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFrame * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::addr_t)((lldb::SBFrame const *)arg1)->GetSP();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame_GetFP(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFrame *arg1 = (lldb::SBFrame *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::addr_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBFrame_GetFP",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFrame, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFrame_GetFP" "', argument " "1"" of type '" "lldb::SBFrame const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFrame * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::addr_t)((lldb::SBFrame const *)arg1)->GetFP();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame_GetPCAddress(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFrame *arg1 = (lldb::SBFrame *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBAddress result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBFrame_GetPCAddress",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFrame, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFrame_GetPCAddress" "', argument " "1"" of type '" "lldb::SBFrame const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFrame * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBFrame const *)arg1)->GetPCAddress();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBAddress(static_cast< const lldb::SBAddress& >(result))), SWIGTYPE_p_lldb__SBAddress, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame_GetSymbolContext(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFrame *arg1 = (lldb::SBFrame *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBSymbolContext result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBFrame_GetSymbolContext",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFrame, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFrame_GetSymbolContext" "', argument " "1"" of type '" "lldb::SBFrame const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFrame * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBFrame_GetSymbolContext" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBFrame const *)arg1)->GetSymbolContext(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBSymbolContext(static_cast< const lldb::SBSymbolContext& >(result))), SWIGTYPE_p_lldb__SBSymbolContext, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame_GetModule(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFrame *arg1 = (lldb::SBFrame *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBModule result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBFrame_GetModule",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFrame, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFrame_GetModule" "', argument " "1"" of type '" "lldb::SBFrame const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFrame * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBFrame const *)arg1)->GetModule();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBModule(static_cast< const lldb::SBModule& >(result))), SWIGTYPE_p_lldb__SBModule, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame_GetCompileUnit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFrame *arg1 = (lldb::SBFrame *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBCompileUnit result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBFrame_GetCompileUnit",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFrame, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFrame_GetCompileUnit" "', argument " "1"" of type '" "lldb::SBFrame const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFrame * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBFrame const *)arg1)->GetCompileUnit();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBCompileUnit(static_cast< const lldb::SBCompileUnit& >(result))), SWIGTYPE_p_lldb__SBCompileUnit, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame_GetFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFrame *arg1 = (lldb::SBFrame *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBFunction result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBFrame_GetFunction",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFrame, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFrame_GetFunction" "', argument " "1"" of type '" "lldb::SBFrame const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFrame * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBFrame const *)arg1)->GetFunction();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBFunction(static_cast< const lldb::SBFunction& >(result))), SWIGTYPE_p_lldb__SBFunction, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame_GetSymbol(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFrame *arg1 = (lldb::SBFrame *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBSymbol result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBFrame_GetSymbol",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFrame, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFrame_GetSymbol" "', argument " "1"" of type '" "lldb::SBFrame const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFrame * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBFrame const *)arg1)->GetSymbol();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBSymbol(static_cast< const lldb::SBSymbol& >(result))), SWIGTYPE_p_lldb__SBSymbol, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame_GetBlock(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFrame *arg1 = (lldb::SBFrame *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBBlock result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBFrame_GetBlock",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFrame, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFrame_GetBlock" "', argument " "1"" of type '" "lldb::SBFrame const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFrame * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBFrame const *)arg1)->GetBlock();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBBlock(static_cast< const lldb::SBBlock& >(result))), SWIGTYPE_p_lldb__SBBlock, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame_GetFunctionName__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFrame *arg1 = (lldb::SBFrame *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBFrame_GetFunctionName",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFrame, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFrame_GetFunctionName" "', argument " "1"" of type '" "lldb::SBFrame *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFrame * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetFunctionName();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame_GetDisplayFunctionName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFrame *arg1 = (lldb::SBFrame *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBFrame_GetDisplayFunctionName",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFrame, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFrame_GetDisplayFunctionName" "', argument " "1"" of type '" "lldb::SBFrame *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFrame * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetDisplayFunctionName();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame_GetFunctionName__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFrame *arg1 = (lldb::SBFrame *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBFrame_GetFunctionName",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFrame, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFrame_GetFunctionName" "', argument " "1"" of type '" "lldb::SBFrame const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFrame * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)((lldb::SBFrame const *)arg1)->GetFunctionName();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame_GetFunctionName(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 1) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBFrame, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_SBFrame_GetFunctionName__SWIG_0(self, args);
    }
  }
  if (argc == 1) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBFrame, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_SBFrame_GetFunctionName__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBFrame_GetFunctionName'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    GetFunctionName(lldb::SBFrame *)\n"
    "    GetFunctionName(lldb::SBFrame const *)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame_GuessLanguage(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFrame *arg1 = (lldb::SBFrame *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::LanguageType result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBFrame_GuessLanguage",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFrame, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFrame_GuessLanguage" "', argument " "1"" of type '" "lldb::SBFrame const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFrame * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::LanguageType)((lldb::SBFrame const *)arg1)->GuessLanguage();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame_IsSwiftThunk(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFrame *arg1 = (lldb::SBFrame *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBFrame_IsSwiftThunk",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFrame, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFrame_IsSwiftThunk" "', argument " "1"" of type '" "lldb::SBFrame const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFrame * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBFrame const *)arg1)->IsSwiftThunk();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame_IsInlined__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFrame *arg1 = (lldb::SBFrame *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBFrame_IsInlined",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFrame, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFrame_IsInlined" "', argument " "1"" of type '" "lldb::SBFrame *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFrame * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsInlined();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame_IsInlined__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFrame *arg1 = (lldb::SBFrame *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBFrame_IsInlined",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFrame, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFrame_IsInlined" "', argument " "1"" of type '" "lldb::SBFrame const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFrame * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBFrame const *)arg1)->IsInlined();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame_IsInlined(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 1) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBFrame, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_SBFrame_IsInlined__SWIG_0(self, args);
    }
  }
  if (argc == 1) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBFrame, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_SBFrame_IsInlined__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBFrame_IsInlined'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    IsInlined(lldb::SBFrame *)\n"
    "    IsInlined(lldb::SBFrame const *)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame_EvaluateExpression__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFrame *arg1 = (lldb::SBFrame *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBValue result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBFrame_EvaluateExpression",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFrame, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFrame_EvaluateExpression" "', argument " "1"" of type '" "lldb::SBFrame *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFrame * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBFrame_EvaluateExpression" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->EvaluateExpression((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBValue(static_cast< const lldb::SBValue& >(result))), SWIGTYPE_p_lldb__SBValue, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame_EvaluateExpression__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFrame *arg1 = (lldb::SBFrame *) 0 ;
  char *arg2 = (char *) 0 ;
  lldb::DynamicValueType arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  int val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBValue result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBFrame_EvaluateExpression",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFrame, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFrame_EvaluateExpression" "', argument " "1"" of type '" "lldb::SBFrame *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFrame * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBFrame_EvaluateExpression" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  ecode3 = SWIG_AsVal_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBFrame_EvaluateExpression" "', argument " "3"" of type '" "lldb::DynamicValueType""'");
  } 
  arg3 = static_cast< lldb::DynamicValueType >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->EvaluateExpression((char const *)arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBValue(static_cast< const lldb::SBValue& >(result))), SWIGTYPE_p_lldb__SBValue, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame_EvaluateExpression__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFrame *arg1 = (lldb::SBFrame *) 0 ;
  char *arg2 = (char *) 0 ;
  lldb::DynamicValueType arg3 ;
  bool arg4 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  int val3 ;
  int ecode3 = 0 ;
  bool val4 ;
  int ecode4 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  lldb::SBValue result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOO:SBFrame_EvaluateExpression",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFrame, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFrame_EvaluateExpression" "', argument " "1"" of type '" "lldb::SBFrame *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFrame * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBFrame_EvaluateExpression" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  ecode3 = SWIG_AsVal_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBFrame_EvaluateExpression" "', argument " "3"" of type '" "lldb::DynamicValueType""'");
  } 
  arg3 = static_cast< lldb::DynamicValueType >(val3);
  ecode4 = SWIG_AsVal_bool(obj3, &val4);
  if (!SWIG_IsOK(ecode4)) {
    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "SBFrame_EvaluateExpression" "', argument " "4"" of type '" "bool""'");
  } 
  arg4 = static_cast< bool >(val4);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->EvaluateExpression((char const *)arg2,arg3,arg4);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBValue(static_cast< const lldb::SBValue& >(result))), SWIGTYPE_p_lldb__SBValue, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame_EvaluateExpression__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFrame *arg1 = (lldb::SBFrame *) 0 ;
  char *arg2 = (char *) 0 ;
  lldb::SBExpressionOptions *arg3 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  void *argp3 = 0 ;
  int res3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBValue result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBFrame_EvaluateExpression",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFrame, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFrame_EvaluateExpression" "', argument " "1"" of type '" "lldb::SBFrame *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFrame * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBFrame_EvaluateExpression" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBExpressionOptions,  0 );
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBFrame_EvaluateExpression" "', argument " "3"" of type '" "lldb::SBExpressionOptions &""'"); 
  }
  if (!argp3) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBFrame_EvaluateExpression" "', argument " "3"" of type '" "lldb::SBExpressionOptions &""'"); 
  }
  arg3 = reinterpret_cast< lldb::SBExpressionOptions * >(argp3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->EvaluateExpression((char const *)arg2,*arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBValue(static_cast< const lldb::SBValue& >(result))), SWIGTYPE_p_lldb__SBValue, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame_EvaluateExpression(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[5];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 4); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBFrame, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        return _wrap_SBFrame_EvaluateExpression__SWIG_0(self, args);
      }
    }
  }
  if (argc == 3) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBFrame, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        void *vptr = 0;
        int res = SWIG_ConvertPtr(argv[2], &vptr, SWIGTYPE_p_lldb__SBExpressionOptions, 0);
        _v = SWIG_CheckState(res);
        if (_v) {
          return _wrap_SBFrame_EvaluateExpression__SWIG_3(self, args);
        }
      }
    }
  }
  if (argc == 3) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBFrame, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        {
          int res = SWIG_AsVal_int(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          return _wrap_SBFrame_EvaluateExpression__SWIG_1(self, args);
        }
      }
    }
  }
  if (argc == 4) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBFrame, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        {
          int res = SWIG_AsVal_int(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          {
            int res = SWIG_AsVal_bool(argv[3], NULL);
            _v = SWIG_CheckState(res);
          }
          if (_v) {
            return _wrap_SBFrame_EvaluateExpression__SWIG_2(self, args);
          }
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBFrame_EvaluateExpression'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    EvaluateExpression(lldb::SBFrame *,char const *)\n"
    "    EvaluateExpression(lldb::SBFrame *,char const *,lldb::DynamicValueType)\n"
    "    EvaluateExpression(lldb::SBFrame *,char const *,lldb::DynamicValueType,bool)\n"
    "    EvaluateExpression(lldb::SBFrame *,char const *,lldb::SBExpressionOptions &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame_GetFrameBlock(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFrame *arg1 = (lldb::SBFrame *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBBlock result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBFrame_GetFrameBlock",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFrame, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFrame_GetFrameBlock" "', argument " "1"" of type '" "lldb::SBFrame const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFrame * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBFrame const *)arg1)->GetFrameBlock();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBBlock(static_cast< const lldb::SBBlock& >(result))), SWIGTYPE_p_lldb__SBBlock, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame_GetLineEntry(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFrame *arg1 = (lldb::SBFrame *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBLineEntry result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBFrame_GetLineEntry",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFrame, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFrame_GetLineEntry" "', argument " "1"" of type '" "lldb::SBFrame const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFrame * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBFrame const *)arg1)->GetLineEntry();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBLineEntry(static_cast< const lldb::SBLineEntry& >(result))), SWIGTYPE_p_lldb__SBLineEntry, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame_GetThread(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFrame *arg1 = (lldb::SBFrame *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBThread result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBFrame_GetThread",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFrame, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFrame_GetThread" "', argument " "1"" of type '" "lldb::SBFrame const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFrame * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBFrame const *)arg1)->GetThread();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBThread(static_cast< const lldb::SBThread& >(result))), SWIGTYPE_p_lldb__SBThread, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame_Disassemble(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFrame *arg1 = (lldb::SBFrame *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBFrame_Disassemble",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFrame, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFrame_Disassemble" "', argument " "1"" of type '" "lldb::SBFrame const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFrame * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)((lldb::SBFrame const *)arg1)->Disassemble();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame_Clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFrame *arg1 = (lldb::SBFrame *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBFrame_Clear",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFrame, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFrame_Clear" "', argument " "1"" of type '" "lldb::SBFrame *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFrame * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->Clear();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame_GetVariables__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFrame *arg1 = (lldb::SBFrame *) 0 ;
  bool arg2 ;
  bool arg3 ;
  bool arg4 ;
  bool arg5 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  bool val3 ;
  int ecode3 = 0 ;
  bool val4 ;
  int ecode4 = 0 ;
  bool val5 ;
  int ecode5 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  PyObject * obj4 = 0 ;
  lldb::SBValueList result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOOO:SBFrame_GetVariables",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFrame, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFrame_GetVariables" "', argument " "1"" of type '" "lldb::SBFrame *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFrame * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBFrame_GetVariables" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  ecode3 = SWIG_AsVal_bool(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBFrame_GetVariables" "', argument " "3"" of type '" "bool""'");
  } 
  arg3 = static_cast< bool >(val3);
  ecode4 = SWIG_AsVal_bool(obj3, &val4);
  if (!SWIG_IsOK(ecode4)) {
    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "SBFrame_GetVariables" "', argument " "4"" of type '" "bool""'");
  } 
  arg4 = static_cast< bool >(val4);
  ecode5 = SWIG_AsVal_bool(obj4, &val5);
  if (!SWIG_IsOK(ecode5)) {
    SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "SBFrame_GetVariables" "', argument " "5"" of type '" "bool""'");
  } 
  arg5 = static_cast< bool >(val5);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetVariables(arg2,arg3,arg4,arg5);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBValueList(static_cast< const lldb::SBValueList& >(result))), SWIGTYPE_p_lldb__SBValueList, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame_GetVariables__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFrame *arg1 = (lldb::SBFrame *) 0 ;
  bool arg2 ;
  bool arg3 ;
  bool arg4 ;
  bool arg5 ;
  lldb::DynamicValueType arg6 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  bool val3 ;
  int ecode3 = 0 ;
  bool val4 ;
  int ecode4 = 0 ;
  bool val5 ;
  int ecode5 = 0 ;
  int val6 ;
  int ecode6 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  PyObject * obj4 = 0 ;
  PyObject * obj5 = 0 ;
  lldb::SBValueList result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOOOO:SBFrame_GetVariables",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFrame, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFrame_GetVariables" "', argument " "1"" of type '" "lldb::SBFrame *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFrame * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBFrame_GetVariables" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  ecode3 = SWIG_AsVal_bool(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBFrame_GetVariables" "', argument " "3"" of type '" "bool""'");
  } 
  arg3 = static_cast< bool >(val3);
  ecode4 = SWIG_AsVal_bool(obj3, &val4);
  if (!SWIG_IsOK(ecode4)) {
    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "SBFrame_GetVariables" "', argument " "4"" of type '" "bool""'");
  } 
  arg4 = static_cast< bool >(val4);
  ecode5 = SWIG_AsVal_bool(obj4, &val5);
  if (!SWIG_IsOK(ecode5)) {
    SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "SBFrame_GetVariables" "', argument " "5"" of type '" "bool""'");
  } 
  arg5 = static_cast< bool >(val5);
  ecode6 = SWIG_AsVal_int(obj5, &val6);
  if (!SWIG_IsOK(ecode6)) {
    SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "SBFrame_GetVariables" "', argument " "6"" of type '" "lldb::DynamicValueType""'");
  } 
  arg6 = static_cast< lldb::DynamicValueType >(val6);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetVariables(arg2,arg3,arg4,arg5,arg6);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBValueList(static_cast< const lldb::SBValueList& >(result))), SWIGTYPE_p_lldb__SBValueList, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame_GetVariables__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFrame *arg1 = (lldb::SBFrame *) 0 ;
  lldb::SBVariablesOptions *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBValueList result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBFrame_GetVariables",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFrame, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFrame_GetVariables" "', argument " "1"" of type '" "lldb::SBFrame *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFrame * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBVariablesOptions,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBFrame_GetVariables" "', argument " "2"" of type '" "lldb::SBVariablesOptions const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBFrame_GetVariables" "', argument " "2"" of type '" "lldb::SBVariablesOptions const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBVariablesOptions * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetVariables((lldb::SBVariablesOptions const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBValueList(static_cast< const lldb::SBValueList& >(result))), SWIGTYPE_p_lldb__SBValueList, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame_GetVariables(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[7];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 6); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBFrame, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_lldb__SBVariablesOptions, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        return _wrap_SBFrame_GetVariables__SWIG_2(self, args);
      }
    }
  }
  if (argc == 5) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBFrame, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_bool(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        {
          int res = SWIG_AsVal_bool(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          {
            int res = SWIG_AsVal_bool(argv[3], NULL);
            _v = SWIG_CheckState(res);
          }
          if (_v) {
            {
              int res = SWIG_AsVal_bool(argv[4], NULL);
              _v = SWIG_CheckState(res);
            }
            if (_v) {
              return _wrap_SBFrame_GetVariables__SWIG_0(self, args);
            }
          }
        }
      }
    }
  }
  if (argc == 6) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBFrame, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_bool(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        {
          int res = SWIG_AsVal_bool(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          {
            int res = SWIG_AsVal_bool(argv[3], NULL);
            _v = SWIG_CheckState(res);
          }
          if (_v) {
            {
              int res = SWIG_AsVal_bool(argv[4], NULL);
              _v = SWIG_CheckState(res);
            }
            if (_v) {
              {
                int res = SWIG_AsVal_int(argv[5], NULL);
                _v = SWIG_CheckState(res);
              }
              if (_v) {
                return _wrap_SBFrame_GetVariables__SWIG_1(self, args);
              }
            }
          }
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBFrame_GetVariables'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    GetVariables(lldb::SBFrame *,bool,bool,bool,bool)\n"
    "    GetVariables(lldb::SBFrame *,bool,bool,bool,bool,lldb::DynamicValueType)\n"
    "    GetVariables(lldb::SBFrame *,lldb::SBVariablesOptions const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame_GetRegisters(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFrame *arg1 = (lldb::SBFrame *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBValueList result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBFrame_GetRegisters",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFrame, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFrame_GetRegisters" "', argument " "1"" of type '" "lldb::SBFrame *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFrame * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetRegisters();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBValueList(static_cast< const lldb::SBValueList& >(result))), SWIGTYPE_p_lldb__SBValueList, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame_FindVariable__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFrame *arg1 = (lldb::SBFrame *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBValue result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBFrame_FindVariable",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFrame, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFrame_FindVariable" "', argument " "1"" of type '" "lldb::SBFrame *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFrame * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBFrame_FindVariable" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->FindVariable((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBValue(static_cast< const lldb::SBValue& >(result))), SWIGTYPE_p_lldb__SBValue, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame_FindVariable__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFrame *arg1 = (lldb::SBFrame *) 0 ;
  char *arg2 = (char *) 0 ;
  lldb::DynamicValueType arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  int val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBValue result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBFrame_FindVariable",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFrame, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFrame_FindVariable" "', argument " "1"" of type '" "lldb::SBFrame *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFrame * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBFrame_FindVariable" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  ecode3 = SWIG_AsVal_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBFrame_FindVariable" "', argument " "3"" of type '" "lldb::DynamicValueType""'");
  } 
  arg3 = static_cast< lldb::DynamicValueType >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->FindVariable((char const *)arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBValue(static_cast< const lldb::SBValue& >(result))), SWIGTYPE_p_lldb__SBValue, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame_FindVariable(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[4];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 3); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBFrame, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        return _wrap_SBFrame_FindVariable__SWIG_0(self, args);
      }
    }
  }
  if (argc == 3) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBFrame, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        {
          int res = SWIG_AsVal_int(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          return _wrap_SBFrame_FindVariable__SWIG_1(self, args);
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBFrame_FindVariable'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    FindVariable(lldb::SBFrame *,char const *)\n"
    "    FindVariable(lldb::SBFrame *,char const *,lldb::DynamicValueType)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame_FindRegister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFrame *arg1 = (lldb::SBFrame *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBValue result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBFrame_FindRegister",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFrame, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFrame_FindRegister" "', argument " "1"" of type '" "lldb::SBFrame *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFrame * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBFrame_FindRegister" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->FindRegister((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBValue(static_cast< const lldb::SBValue& >(result))), SWIGTYPE_p_lldb__SBValue, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame_GetValueForVariablePath__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFrame *arg1 = (lldb::SBFrame *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBValue result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBFrame_GetValueForVariablePath",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFrame, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFrame_GetValueForVariablePath" "', argument " "1"" of type '" "lldb::SBFrame *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFrame * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBFrame_GetValueForVariablePath" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetValueForVariablePath((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBValue(static_cast< const lldb::SBValue& >(result))), SWIGTYPE_p_lldb__SBValue, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame_GetValueForVariablePath__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFrame *arg1 = (lldb::SBFrame *) 0 ;
  char *arg2 = (char *) 0 ;
  lldb::DynamicValueType arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  int val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBValue result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBFrame_GetValueForVariablePath",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFrame, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFrame_GetValueForVariablePath" "', argument " "1"" of type '" "lldb::SBFrame *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFrame * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBFrame_GetValueForVariablePath" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  ecode3 = SWIG_AsVal_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBFrame_GetValueForVariablePath" "', argument " "3"" of type '" "lldb::DynamicValueType""'");
  } 
  arg3 = static_cast< lldb::DynamicValueType >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetValueForVariablePath((char const *)arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBValue(static_cast< const lldb::SBValue& >(result))), SWIGTYPE_p_lldb__SBValue, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame_GetValueForVariablePath(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[4];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 3); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBFrame, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        return _wrap_SBFrame_GetValueForVariablePath__SWIG_0(self, args);
      }
    }
  }
  if (argc == 3) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBFrame, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        {
          int res = SWIG_AsVal_int(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          return _wrap_SBFrame_GetValueForVariablePath__SWIG_1(self, args);
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBFrame_GetValueForVariablePath'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    GetValueForVariablePath(lldb::SBFrame *,char const *)\n"
    "    GetValueForVariablePath(lldb::SBFrame *,char const *,lldb::DynamicValueType)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame_FindValue__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFrame *arg1 = (lldb::SBFrame *) 0 ;
  char *arg2 = (char *) 0 ;
  lldb::ValueType arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  int val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBValue result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBFrame_FindValue",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFrame, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFrame_FindValue" "', argument " "1"" of type '" "lldb::SBFrame *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFrame * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBFrame_FindValue" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  ecode3 = SWIG_AsVal_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBFrame_FindValue" "', argument " "3"" of type '" "lldb::ValueType""'");
  } 
  arg3 = static_cast< lldb::ValueType >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->FindValue((char const *)arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBValue(static_cast< const lldb::SBValue& >(result))), SWIGTYPE_p_lldb__SBValue, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame_FindValue__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFrame *arg1 = (lldb::SBFrame *) 0 ;
  char *arg2 = (char *) 0 ;
  lldb::ValueType arg3 ;
  lldb::DynamicValueType arg4 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  int val3 ;
  int ecode3 = 0 ;
  int val4 ;
  int ecode4 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  lldb::SBValue result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOO:SBFrame_FindValue",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFrame, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFrame_FindValue" "', argument " "1"" of type '" "lldb::SBFrame *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFrame * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBFrame_FindValue" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  ecode3 = SWIG_AsVal_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBFrame_FindValue" "', argument " "3"" of type '" "lldb::ValueType""'");
  } 
  arg3 = static_cast< lldb::ValueType >(val3);
  ecode4 = SWIG_AsVal_int(obj3, &val4);
  if (!SWIG_IsOK(ecode4)) {
    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "SBFrame_FindValue" "', argument " "4"" of type '" "lldb::DynamicValueType""'");
  } 
  arg4 = static_cast< lldb::DynamicValueType >(val4);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->FindValue((char const *)arg2,arg3,arg4);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBValue(static_cast< const lldb::SBValue& >(result))), SWIGTYPE_p_lldb__SBValue, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame_FindValue(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[5];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 4); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 3) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBFrame, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        {
          int res = SWIG_AsVal_int(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          return _wrap_SBFrame_FindValue__SWIG_0(self, args);
        }
      }
    }
  }
  if (argc == 4) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBFrame, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        {
          int res = SWIG_AsVal_int(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          {
            int res = SWIG_AsVal_int(argv[3], NULL);
            _v = SWIG_CheckState(res);
          }
          if (_v) {
            return _wrap_SBFrame_FindValue__SWIG_1(self, args);
          }
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBFrame_FindValue'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    FindValue(lldb::SBFrame *,char const *,lldb::ValueType)\n"
    "    FindValue(lldb::SBFrame *,char const *,lldb::ValueType,lldb::DynamicValueType)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame_GetDescription(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFrame *arg1 = (lldb::SBFrame *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBFrame_GetDescription",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFrame, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFrame_GetDescription" "', argument " "1"" of type '" "lldb::SBFrame *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFrame * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBFrame_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBFrame_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetDescription(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFrame___str__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFrame *arg1 = (lldb::SBFrame *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBFrame___str__",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFrame, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFrame___str__" "', argument " "1"" of type '" "lldb::SBFrame *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFrame * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (PyObject *)lldb_SBFrame___str__(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = result;
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBFrame_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBFrame, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBFunction__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFunction *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBFunction")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBFunction *)new lldb::SBFunction();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBFunction, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBFunction__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFunction *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBFunction *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBFunction",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBFunction,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBFunction" "', argument " "1"" of type '" "lldb::SBFunction const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBFunction" "', argument " "1"" of type '" "lldb::SBFunction const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFunction * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBFunction *)new lldb::SBFunction((lldb::SBFunction const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBFunction, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBFunction(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBFunction__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBFunction, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBFunction__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBFunction'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBFunction()\n"
    "    lldb::SBFunction(lldb::SBFunction const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFunction *arg1 = (lldb::SBFunction *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBFunction",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFunction, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBFunction" "', argument " "1"" of type '" "lldb::SBFunction *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFunction * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFunction_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFunction *arg1 = (lldb::SBFunction *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBFunction_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFunction, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFunction_IsValid" "', argument " "1"" of type '" "lldb::SBFunction const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFunction * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBFunction const *)arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFunction_GetName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFunction *arg1 = (lldb::SBFunction *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBFunction_GetName",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFunction, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFunction_GetName" "', argument " "1"" of type '" "lldb::SBFunction const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFunction * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)((lldb::SBFunction const *)arg1)->GetName();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFunction_GetDisplayName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFunction *arg1 = (lldb::SBFunction *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBFunction_GetDisplayName",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFunction, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFunction_GetDisplayName" "', argument " "1"" of type '" "lldb::SBFunction const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFunction * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)((lldb::SBFunction const *)arg1)->GetDisplayName();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFunction_GetMangledName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFunction *arg1 = (lldb::SBFunction *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBFunction_GetMangledName",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFunction, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFunction_GetMangledName" "', argument " "1"" of type '" "lldb::SBFunction const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFunction * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)((lldb::SBFunction const *)arg1)->GetMangledName();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFunction_GetInstructions__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFunction *arg1 = (lldb::SBFunction *) 0 ;
  lldb::SBTarget arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBInstructionList result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBFunction_GetInstructions",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFunction, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFunction_GetInstructions" "', argument " "1"" of type '" "lldb::SBFunction *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFunction * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTarget,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBFunction_GetInstructions" "', argument " "2"" of type '" "lldb::SBTarget""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBFunction_GetInstructions" "', argument " "2"" of type '" "lldb::SBTarget""'");
    } else {
      lldb::SBTarget * temp = reinterpret_cast< lldb::SBTarget * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetInstructions(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBInstructionList(static_cast< const lldb::SBInstructionList& >(result))), SWIGTYPE_p_lldb__SBInstructionList, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFunction_GetInstructions__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFunction *arg1 = (lldb::SBFunction *) 0 ;
  lldb::SBTarget arg2 ;
  char *arg3 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  int res3 ;
  char *buf3 = 0 ;
  int alloc3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBInstructionList result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBFunction_GetInstructions",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFunction, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFunction_GetInstructions" "', argument " "1"" of type '" "lldb::SBFunction *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFunction * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTarget,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBFunction_GetInstructions" "', argument " "2"" of type '" "lldb::SBTarget""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBFunction_GetInstructions" "', argument " "2"" of type '" "lldb::SBTarget""'");
    } else {
      lldb::SBTarget * temp = reinterpret_cast< lldb::SBTarget * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3);
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBFunction_GetInstructions" "', argument " "3"" of type '" "char const *""'");
  }
  arg3 = reinterpret_cast< char * >(buf3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetInstructions(arg2,(char const *)arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBInstructionList(static_cast< const lldb::SBInstructionList& >(result))), SWIGTYPE_p_lldb__SBInstructionList, SWIG_POINTER_OWN |  0 );
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  return resultobj;
fail:
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFunction_GetInstructions(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[4];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 3); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBFunction, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_lldb__SBTarget, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        return _wrap_SBFunction_GetInstructions__SWIG_0(self, args);
      }
    }
  }
  if (argc == 3) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBFunction, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_lldb__SBTarget, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        int res = SWIG_AsCharPtrAndSize(argv[2], 0, NULL, 0);
        _v = SWIG_CheckState(res);
        if (_v) {
          return _wrap_SBFunction_GetInstructions__SWIG_1(self, args);
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBFunction_GetInstructions'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    GetInstructions(lldb::SBFunction *,lldb::SBTarget)\n"
    "    GetInstructions(lldb::SBFunction *,lldb::SBTarget,char const *)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFunction_GetStartAddress(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFunction *arg1 = (lldb::SBFunction *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBAddress result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBFunction_GetStartAddress",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFunction, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFunction_GetStartAddress" "', argument " "1"" of type '" "lldb::SBFunction *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFunction * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetStartAddress();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBAddress(static_cast< const lldb::SBAddress& >(result))), SWIGTYPE_p_lldb__SBAddress, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFunction_GetEndAddress(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFunction *arg1 = (lldb::SBFunction *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBAddress result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBFunction_GetEndAddress",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFunction, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFunction_GetEndAddress" "', argument " "1"" of type '" "lldb::SBFunction *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFunction * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetEndAddress();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBAddress(static_cast< const lldb::SBAddress& >(result))), SWIGTYPE_p_lldb__SBAddress, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFunction_GetArgumentName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFunction *arg1 = (lldb::SBFunction *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBFunction_GetArgumentName",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFunction, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFunction_GetArgumentName" "', argument " "1"" of type '" "lldb::SBFunction *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFunction * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBFunction_GetArgumentName" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetArgumentName(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFunction_GetPrologueByteSize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFunction *arg1 = (lldb::SBFunction *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBFunction_GetPrologueByteSize",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFunction, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFunction_GetPrologueByteSize" "', argument " "1"" of type '" "lldb::SBFunction *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFunction * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetPrologueByteSize();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFunction_GetType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFunction *arg1 = (lldb::SBFunction *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBType result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBFunction_GetType",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFunction, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFunction_GetType" "', argument " "1"" of type '" "lldb::SBFunction *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFunction * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetType();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBType(static_cast< const lldb::SBType& >(result))), SWIGTYPE_p_lldb__SBType, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFunction_GetBlock(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFunction *arg1 = (lldb::SBFunction *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBBlock result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBFunction_GetBlock",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFunction, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFunction_GetBlock" "', argument " "1"" of type '" "lldb::SBFunction *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFunction * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetBlock();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBBlock(static_cast< const lldb::SBBlock& >(result))), SWIGTYPE_p_lldb__SBBlock, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFunction_GetLanguage(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFunction *arg1 = (lldb::SBFunction *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::LanguageType result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBFunction_GetLanguage",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFunction, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFunction_GetLanguage" "', argument " "1"" of type '" "lldb::SBFunction *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFunction * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::LanguageType)(arg1)->GetLanguage();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFunction_GetIsOptimized(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFunction *arg1 = (lldb::SBFunction *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBFunction_GetIsOptimized",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFunction, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFunction_GetIsOptimized" "', argument " "1"" of type '" "lldb::SBFunction *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFunction * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetIsOptimized();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFunction_GetCanThrow(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFunction *arg1 = (lldb::SBFunction *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBFunction_GetCanThrow",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFunction, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFunction_GetCanThrow" "', argument " "1"" of type '" "lldb::SBFunction *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFunction * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetCanThrow();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFunction_GetDescription(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFunction *arg1 = (lldb::SBFunction *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBFunction_GetDescription",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFunction, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFunction_GetDescription" "', argument " "1"" of type '" "lldb::SBFunction *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFunction * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBFunction_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBFunction_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetDescription(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFunction___eq__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFunction *arg1 = (lldb::SBFunction *) 0 ;
  lldb::SBFunction *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBFunction___eq__",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFunction, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFunction___eq__" "', argument " "1"" of type '" "lldb::SBFunction const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFunction * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBFunction,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBFunction___eq__" "', argument " "2"" of type '" "lldb::SBFunction const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBFunction___eq__" "', argument " "2"" of type '" "lldb::SBFunction const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBFunction * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBFunction const *)arg1)->operator ==((lldb::SBFunction const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFunction___ne__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFunction *arg1 = (lldb::SBFunction *) 0 ;
  lldb::SBFunction *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBFunction___ne__",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFunction, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFunction___ne__" "', argument " "1"" of type '" "lldb::SBFunction const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFunction * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBFunction,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBFunction___ne__" "', argument " "2"" of type '" "lldb::SBFunction const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBFunction___ne__" "', argument " "2"" of type '" "lldb::SBFunction const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBFunction * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBFunction const *)arg1)->operator !=((lldb::SBFunction const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBFunction___str__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFunction *arg1 = (lldb::SBFunction *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBFunction___str__",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBFunction, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBFunction___str__" "', argument " "1"" of type '" "lldb::SBFunction *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBFunction * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (PyObject *)lldb_SBFunction___str__(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = result;
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBFunction_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBFunction, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_SBHostOS_GetProgramFileSpec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFileSpec result;
  
  if (!PyArg_ParseTuple(args,(char *)":SBHostOS_GetProgramFileSpec")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = lldb::SBHostOS::GetProgramFileSpec();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBFileSpec(static_cast< const lldb::SBFileSpec& >(result))), SWIGTYPE_p_lldb__SBFileSpec, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBHostOS_GetLLDBPythonPath(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFileSpec result;
  
  if (!PyArg_ParseTuple(args,(char *)":SBHostOS_GetLLDBPythonPath")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = lldb::SBHostOS::GetLLDBPythonPath();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBFileSpec(static_cast< const lldb::SBFileSpec& >(result))), SWIGTYPE_p_lldb__SBFileSpec, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBHostOS_GetLLDBPath(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::PathType arg1 ;
  int val1 ;
  int ecode1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBFileSpec result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBHostOS_GetLLDBPath",&obj0)) SWIG_fail;
  ecode1 = SWIG_AsVal_int(obj0, &val1);
  if (!SWIG_IsOK(ecode1)) {
    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "SBHostOS_GetLLDBPath" "', argument " "1"" of type '" "lldb::PathType""'");
  } 
  arg1 = static_cast< lldb::PathType >(val1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = lldb::SBHostOS::GetLLDBPath(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBFileSpec(static_cast< const lldb::SBFileSpec& >(result))), SWIGTYPE_p_lldb__SBFileSpec, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBHostOS_GetUserHomeDirectory(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBFileSpec result;
  
  if (!PyArg_ParseTuple(args,(char *)":SBHostOS_GetUserHomeDirectory")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = lldb::SBHostOS::GetUserHomeDirectory();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBFileSpec(static_cast< const lldb::SBFileSpec& >(result))), SWIGTYPE_p_lldb__SBFileSpec, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBHostOS_ThreadCreated(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  char *arg1 = (char *) 0 ;
  int res1 ;
  char *buf1 = 0 ;
  int alloc1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBHostOS_ThreadCreated",&obj0)) SWIG_fail;
  res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBHostOS_ThreadCreated" "', argument " "1"" of type '" "char const *""'");
  }
  arg1 = reinterpret_cast< char * >(buf1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    lldb::SBHostOS::ThreadCreated((char const *)arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return resultobj;
fail:
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBHostOS_ThreadCreate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  char *arg1 = (char *) 0 ;
  lldb::thread_func_t arg2 = (lldb::thread_func_t) 0 ;
  void *arg3 = (void *) 0 ;
  lldb::SBError *arg4 = (lldb::SBError *) 0 ;
  int res1 ;
  char *buf1 = 0 ;
  int alloc1 = 0 ;
  int res3 ;
  void *argp4 = 0 ;
  int res4 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  lldb::thread_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOO:SBHostOS_ThreadCreate",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
  res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBHostOS_ThreadCreate" "', argument " "1"" of type '" "char const *""'");
  }
  arg1 = reinterpret_cast< char * >(buf1);
  {
    int res = SWIG_ConvertFunctionPtr(obj1, (void**)(&arg2), SWIGTYPE_p_f_p_void__p_void);
    if (!SWIG_IsOK(res)) {
      SWIG_exception_fail(SWIG_ArgError(res), "in method '" "SBHostOS_ThreadCreate" "', argument " "2"" of type '" "lldb::thread_func_t""'"); 
    }
  }
  res3 = SWIG_ConvertPtr(obj2,SWIG_as_voidptrptr(&arg3), 0, 0);
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBHostOS_ThreadCreate" "', argument " "3"" of type '" "void *""'"); 
  }
  res4 = SWIG_ConvertPtr(obj3, &argp4,SWIGTYPE_p_lldb__SBError, 0 |  0 );
  if (!SWIG_IsOK(res4)) {
    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "SBHostOS_ThreadCreate" "', argument " "4"" of type '" "lldb::SBError *""'"); 
  }
  arg4 = reinterpret_cast< lldb::SBError * >(argp4);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = lldb::SBHostOS::ThreadCreate((char const *)arg1,arg2,arg3,arg4);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::thread_t(static_cast< const lldb::thread_t& >(result))), SWIGTYPE_p_pthread_t, SWIG_POINTER_OWN |  0 );
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return resultobj;
fail:
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBHostOS_ThreadCancel(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::thread_t arg1 ;
  lldb::SBError *arg2 = (lldb::SBError *) 0 ;
  void *argp1 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBHostOS_ThreadCancel",&obj0,&obj1)) SWIG_fail;
  {
    res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_pthread_t,  0  | 0);
    if (!SWIG_IsOK(res1)) {
      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBHostOS_ThreadCancel" "', argument " "1"" of type '" "lldb::thread_t""'"); 
    }  
    if (!argp1) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBHostOS_ThreadCancel" "', argument " "1"" of type '" "lldb::thread_t""'");
    } else {
      lldb::thread_t * temp = reinterpret_cast< lldb::thread_t * >(argp1);
      arg1 = *temp;
      if (SWIG_IsNewObj(res1)) delete temp;
    }
  }
  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_lldb__SBError, 0 |  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBHostOS_ThreadCancel" "', argument " "2"" of type '" "lldb::SBError *""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBError * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)lldb::SBHostOS::ThreadCancel(arg1,arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBHostOS_ThreadDetach(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::thread_t arg1 ;
  lldb::SBError *arg2 = (lldb::SBError *) 0 ;
  void *argp1 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBHostOS_ThreadDetach",&obj0,&obj1)) SWIG_fail;
  {
    res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_pthread_t,  0  | 0);
    if (!SWIG_IsOK(res1)) {
      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBHostOS_ThreadDetach" "', argument " "1"" of type '" "lldb::thread_t""'"); 
    }  
    if (!argp1) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBHostOS_ThreadDetach" "', argument " "1"" of type '" "lldb::thread_t""'");
    } else {
      lldb::thread_t * temp = reinterpret_cast< lldb::thread_t * >(argp1);
      arg1 = *temp;
      if (SWIG_IsNewObj(res1)) delete temp;
    }
  }
  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_lldb__SBError, 0 |  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBHostOS_ThreadDetach" "', argument " "2"" of type '" "lldb::SBError *""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBError * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)lldb::SBHostOS::ThreadDetach(arg1,arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBHostOS_ThreadJoin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::thread_t arg1 ;
  lldb::thread_result_t *arg2 = (lldb::thread_result_t *) 0 ;
  lldb::SBError *arg3 = (lldb::SBError *) 0 ;
  void *argp1 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  void *argp3 = 0 ;
  int res3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBHostOS_ThreadJoin",&obj0,&obj1,&obj2)) SWIG_fail;
  {
    res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_pthread_t,  0  | 0);
    if (!SWIG_IsOK(res1)) {
      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBHostOS_ThreadJoin" "', argument " "1"" of type '" "lldb::thread_t""'"); 
    }  
    if (!argp1) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBHostOS_ThreadJoin" "', argument " "1"" of type '" "lldb::thread_t""'");
    } else {
      lldb::thread_t * temp = reinterpret_cast< lldb::thread_t * >(argp1);
      arg1 = *temp;
      if (SWIG_IsNewObj(res1)) delete temp;
    }
  }
  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_p_void, 0 |  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBHostOS_ThreadJoin" "', argument " "2"" of type '" "lldb::thread_result_t *""'"); 
  }
  arg2 = reinterpret_cast< lldb::thread_result_t * >(argp2);
  res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_lldb__SBError, 0 |  0 );
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBHostOS_ThreadJoin" "', argument " "3"" of type '" "lldb::SBError *""'"); 
  }
  arg3 = reinterpret_cast< lldb::SBError * >(argp3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)lldb::SBHostOS::ThreadJoin(arg1,arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBHostOS(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBHostOS *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBHostOS")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBHostOS *)new lldb::SBHostOS();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBHostOS, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBHostOS(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBHostOS *arg1 = (lldb::SBHostOS *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBHostOS",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBHostOS, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBHostOS" "', argument " "1"" of type '" "lldb::SBHostOS *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBHostOS * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBHostOS_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBHostOS, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBInstruction__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBInstruction *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBInstruction")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBInstruction *)new lldb::SBInstruction();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBInstruction, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBInstruction__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBInstruction *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBInstruction *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBInstruction",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBInstruction,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBInstruction" "', argument " "1"" of type '" "lldb::SBInstruction const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBInstruction" "', argument " "1"" of type '" "lldb::SBInstruction const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBInstruction * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBInstruction *)new lldb::SBInstruction((lldb::SBInstruction const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBInstruction, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBInstruction(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBInstruction__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBInstruction, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBInstruction__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBInstruction'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBInstruction()\n"
    "    lldb::SBInstruction(lldb::SBInstruction const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBInstruction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBInstruction *arg1 = (lldb::SBInstruction *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBInstruction",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBInstruction, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBInstruction" "', argument " "1"" of type '" "lldb::SBInstruction *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBInstruction * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBInstruction_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBInstruction *arg1 = (lldb::SBInstruction *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBInstruction_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBInstruction, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBInstruction_IsValid" "', argument " "1"" of type '" "lldb::SBInstruction *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBInstruction * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBInstruction_GetAddress(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBInstruction *arg1 = (lldb::SBInstruction *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBAddress result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBInstruction_GetAddress",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBInstruction, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBInstruction_GetAddress" "', argument " "1"" of type '" "lldb::SBInstruction *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBInstruction * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetAddress();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBAddress(static_cast< const lldb::SBAddress& >(result))), SWIGTYPE_p_lldb__SBAddress, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBInstruction_GetAddressClass(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBInstruction *arg1 = (lldb::SBInstruction *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::AddressClass result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBInstruction_GetAddressClass",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBInstruction, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBInstruction_GetAddressClass" "', argument " "1"" of type '" "lldb::SBInstruction *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBInstruction * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::AddressClass)(arg1)->GetAddressClass();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBInstruction_GetMnemonic(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBInstruction *arg1 = (lldb::SBInstruction *) 0 ;
  lldb::SBTarget arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBInstruction_GetMnemonic",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBInstruction, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBInstruction_GetMnemonic" "', argument " "1"" of type '" "lldb::SBInstruction *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBInstruction * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTarget,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBInstruction_GetMnemonic" "', argument " "2"" of type '" "lldb::SBTarget""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBInstruction_GetMnemonic" "', argument " "2"" of type '" "lldb::SBTarget""'");
    } else {
      lldb::SBTarget * temp = reinterpret_cast< lldb::SBTarget * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetMnemonic(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBInstruction_GetOperands(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBInstruction *arg1 = (lldb::SBInstruction *) 0 ;
  lldb::SBTarget arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBInstruction_GetOperands",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBInstruction, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBInstruction_GetOperands" "', argument " "1"" of type '" "lldb::SBInstruction *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBInstruction * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTarget,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBInstruction_GetOperands" "', argument " "2"" of type '" "lldb::SBTarget""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBInstruction_GetOperands" "', argument " "2"" of type '" "lldb::SBTarget""'");
    } else {
      lldb::SBTarget * temp = reinterpret_cast< lldb::SBTarget * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetOperands(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBInstruction_GetComment(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBInstruction *arg1 = (lldb::SBInstruction *) 0 ;
  lldb::SBTarget arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBInstruction_GetComment",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBInstruction, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBInstruction_GetComment" "', argument " "1"" of type '" "lldb::SBInstruction *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBInstruction * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTarget,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBInstruction_GetComment" "', argument " "2"" of type '" "lldb::SBTarget""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBInstruction_GetComment" "', argument " "2"" of type '" "lldb::SBTarget""'");
    } else {
      lldb::SBTarget * temp = reinterpret_cast< lldb::SBTarget * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetComment(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBInstruction_GetData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBInstruction *arg1 = (lldb::SBInstruction *) 0 ;
  lldb::SBTarget arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBData result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBInstruction_GetData",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBInstruction, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBInstruction_GetData" "', argument " "1"" of type '" "lldb::SBInstruction *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBInstruction * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTarget,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBInstruction_GetData" "', argument " "2"" of type '" "lldb::SBTarget""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBInstruction_GetData" "', argument " "2"" of type '" "lldb::SBTarget""'");
    } else {
      lldb::SBTarget * temp = reinterpret_cast< lldb::SBTarget * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetData(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBData(static_cast< const lldb::SBData& >(result))), SWIGTYPE_p_lldb__SBData, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBInstruction_GetByteSize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBInstruction *arg1 = (lldb::SBInstruction *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  size_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBInstruction_GetByteSize",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBInstruction, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBInstruction_GetByteSize" "', argument " "1"" of type '" "lldb::SBInstruction *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBInstruction * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetByteSize();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBInstruction_DoesBranch(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBInstruction *arg1 = (lldb::SBInstruction *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBInstruction_DoesBranch",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBInstruction, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBInstruction_DoesBranch" "', argument " "1"" of type '" "lldb::SBInstruction *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBInstruction * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->DoesBranch();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBInstruction_HasDelaySlot(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBInstruction *arg1 = (lldb::SBInstruction *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBInstruction_HasDelaySlot",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBInstruction, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBInstruction_HasDelaySlot" "', argument " "1"" of type '" "lldb::SBInstruction *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBInstruction * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->HasDelaySlot();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBInstruction_CanSetBreakpoint(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBInstruction *arg1 = (lldb::SBInstruction *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBInstruction_CanSetBreakpoint",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBInstruction, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBInstruction_CanSetBreakpoint" "', argument " "1"" of type '" "lldb::SBInstruction *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBInstruction * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->CanSetBreakpoint();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBInstruction_Print(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBInstruction *arg1 = (lldb::SBInstruction *) 0 ;
  FILE *arg2 = (FILE *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBInstruction_Print",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBInstruction, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBInstruction_Print" "', argument " "1"" of type '" "lldb::SBInstruction *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBInstruction * >(argp1);
  {
    using namespace lldb_private;
    if (obj1 == Py_None)
    arg2 = nullptr;
    else if (!lldb_private::PythonFile::Check(obj1)) {
      int fd = PyObject_AsFileDescriptor(obj1);
      PythonObject py_input(PyRefType::Borrowed, obj1);
      PythonString py_mode = py_input.GetAttributeValue("mode").AsType<PythonString>();
      
      if (-1 != fd && py_mode.IsValid()) {
        FILE *f;
        if ((f = fdopen(fd, py_mode.GetString().str().c_str())))
        arg2 = f;
        else
        PyErr_SetString(PyExc_TypeError, strerror(errno));
      } else {
        PyErr_SetString(PyExc_TypeError,"not a file-like object");
        return nullptr;
      }
    }
    else
    {
      PythonFile py_file(PyRefType::Borrowed, obj1);
      File file;
      if (!py_file.GetUnderlyingFile(file))
      return nullptr;
      
      arg2 = file.GetStream();
      if (arg2)
      file.Clear();
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->Print(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBInstruction_GetDescription(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBInstruction *arg1 = (lldb::SBInstruction *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBInstruction_GetDescription",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBInstruction, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBInstruction_GetDescription" "', argument " "1"" of type '" "lldb::SBInstruction *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBInstruction * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBInstruction_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBInstruction_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetDescription(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBInstruction_EmulateWithFrame(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBInstruction *arg1 = (lldb::SBInstruction *) 0 ;
  lldb::SBFrame *arg2 = 0 ;
  uint32_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  unsigned int val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBInstruction_EmulateWithFrame",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBInstruction, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBInstruction_EmulateWithFrame" "', argument " "1"" of type '" "lldb::SBInstruction *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBInstruction * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBFrame,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBInstruction_EmulateWithFrame" "', argument " "2"" of type '" "lldb::SBFrame &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBInstruction_EmulateWithFrame" "', argument " "2"" of type '" "lldb::SBFrame &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBFrame * >(argp2);
  ecode3 = SWIG_AsVal_unsigned_SS_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBInstruction_EmulateWithFrame" "', argument " "3"" of type '" "uint32_t""'");
  } 
  arg3 = static_cast< uint32_t >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->EmulateWithFrame(*arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBInstruction_DumpEmulation(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBInstruction *arg1 = (lldb::SBInstruction *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBInstruction_DumpEmulation",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBInstruction, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBInstruction_DumpEmulation" "', argument " "1"" of type '" "lldb::SBInstruction *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBInstruction * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBInstruction_DumpEmulation" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->DumpEmulation((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBInstruction_TestEmulation(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBInstruction *arg1 = (lldb::SBInstruction *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  char *arg3 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  int res3 ;
  char *buf3 = 0 ;
  int alloc3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBInstruction_TestEmulation",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBInstruction, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBInstruction_TestEmulation" "', argument " "1"" of type '" "lldb::SBInstruction *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBInstruction * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBInstruction_TestEmulation" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBInstruction_TestEmulation" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3);
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBInstruction_TestEmulation" "', argument " "3"" of type '" "char const *""'");
  }
  arg3 = reinterpret_cast< char * >(buf3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->TestEmulation(*arg2,(char const *)arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  return resultobj;
fail:
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBInstruction___str__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBInstruction *arg1 = (lldb::SBInstruction *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBInstruction___str__",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBInstruction, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBInstruction___str__" "', argument " "1"" of type '" "lldb::SBInstruction *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBInstruction * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (PyObject *)lldb_SBInstruction___str__(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = result;
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBInstruction_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBInstruction, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBInstructionList__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBInstructionList *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBInstructionList")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBInstructionList *)new lldb::SBInstructionList();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBInstructionList, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBInstructionList__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBInstructionList *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBInstructionList *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBInstructionList",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBInstructionList,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBInstructionList" "', argument " "1"" of type '" "lldb::SBInstructionList const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBInstructionList" "', argument " "1"" of type '" "lldb::SBInstructionList const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBInstructionList * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBInstructionList *)new lldb::SBInstructionList((lldb::SBInstructionList const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBInstructionList, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBInstructionList(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBInstructionList__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBInstructionList, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBInstructionList__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBInstructionList'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBInstructionList()\n"
    "    lldb::SBInstructionList(lldb::SBInstructionList const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBInstructionList(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBInstructionList *arg1 = (lldb::SBInstructionList *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBInstructionList",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBInstructionList, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBInstructionList" "', argument " "1"" of type '" "lldb::SBInstructionList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBInstructionList * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBInstructionList_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBInstructionList *arg1 = (lldb::SBInstructionList *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBInstructionList_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBInstructionList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBInstructionList_IsValid" "', argument " "1"" of type '" "lldb::SBInstructionList const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBInstructionList * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBInstructionList const *)arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBInstructionList_GetSize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBInstructionList *arg1 = (lldb::SBInstructionList *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  size_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBInstructionList_GetSize",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBInstructionList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBInstructionList_GetSize" "', argument " "1"" of type '" "lldb::SBInstructionList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBInstructionList * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetSize();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBInstructionList_GetInstructionAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBInstructionList *arg1 = (lldb::SBInstructionList *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBInstruction result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBInstructionList_GetInstructionAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBInstructionList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBInstructionList_GetInstructionAtIndex" "', argument " "1"" of type '" "lldb::SBInstructionList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBInstructionList * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBInstructionList_GetInstructionAtIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetInstructionAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBInstruction(static_cast< const lldb::SBInstruction& >(result))), SWIGTYPE_p_lldb__SBInstruction, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBInstructionList_GetInstructionsCount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBInstructionList *arg1 = (lldb::SBInstructionList *) 0 ;
  lldb::SBAddress *arg2 = 0 ;
  lldb::SBAddress *arg3 = 0 ;
  bool arg4 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  void *argp3 = 0 ;
  int res3 = 0 ;
  bool val4 ;
  int ecode4 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  size_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOO:SBInstructionList_GetInstructionsCount",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBInstructionList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBInstructionList_GetInstructionsCount" "', argument " "1"" of type '" "lldb::SBInstructionList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBInstructionList * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBAddress,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBInstructionList_GetInstructionsCount" "', argument " "2"" of type '" "lldb::SBAddress const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBInstructionList_GetInstructionsCount" "', argument " "2"" of type '" "lldb::SBAddress const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBAddress * >(argp2);
  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBAddress,  0  | 0);
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBInstructionList_GetInstructionsCount" "', argument " "3"" of type '" "lldb::SBAddress const &""'"); 
  }
  if (!argp3) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBInstructionList_GetInstructionsCount" "', argument " "3"" of type '" "lldb::SBAddress const &""'"); 
  }
  arg3 = reinterpret_cast< lldb::SBAddress * >(argp3);
  ecode4 = SWIG_AsVal_bool(obj3, &val4);
  if (!SWIG_IsOK(ecode4)) {
    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "SBInstructionList_GetInstructionsCount" "', argument " "4"" of type '" "bool""'");
  } 
  arg4 = static_cast< bool >(val4);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetInstructionsCount((lldb::SBAddress const &)*arg2,(lldb::SBAddress const &)*arg3,arg4);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBInstructionList_Clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBInstructionList *arg1 = (lldb::SBInstructionList *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBInstructionList_Clear",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBInstructionList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBInstructionList_Clear" "', argument " "1"" of type '" "lldb::SBInstructionList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBInstructionList * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->Clear();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBInstructionList_AppendInstruction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBInstructionList *arg1 = (lldb::SBInstructionList *) 0 ;
  lldb::SBInstruction arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBInstructionList_AppendInstruction",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBInstructionList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBInstructionList_AppendInstruction" "', argument " "1"" of type '" "lldb::SBInstructionList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBInstructionList * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBInstruction,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBInstructionList_AppendInstruction" "', argument " "2"" of type '" "lldb::SBInstruction""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBInstructionList_AppendInstruction" "', argument " "2"" of type '" "lldb::SBInstruction""'");
    } else {
      lldb::SBInstruction * temp = reinterpret_cast< lldb::SBInstruction * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->AppendInstruction(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBInstructionList_Print(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBInstructionList *arg1 = (lldb::SBInstructionList *) 0 ;
  FILE *arg2 = (FILE *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBInstructionList_Print",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBInstructionList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBInstructionList_Print" "', argument " "1"" of type '" "lldb::SBInstructionList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBInstructionList * >(argp1);
  {
    using namespace lldb_private;
    if (obj1 == Py_None)
    arg2 = nullptr;
    else if (!lldb_private::PythonFile::Check(obj1)) {
      int fd = PyObject_AsFileDescriptor(obj1);
      PythonObject py_input(PyRefType::Borrowed, obj1);
      PythonString py_mode = py_input.GetAttributeValue("mode").AsType<PythonString>();
      
      if (-1 != fd && py_mode.IsValid()) {
        FILE *f;
        if ((f = fdopen(fd, py_mode.GetString().str().c_str())))
        arg2 = f;
        else
        PyErr_SetString(PyExc_TypeError, strerror(errno));
      } else {
        PyErr_SetString(PyExc_TypeError,"not a file-like object");
        return nullptr;
      }
    }
    else
    {
      PythonFile py_file(PyRefType::Borrowed, obj1);
      File file;
      if (!py_file.GetUnderlyingFile(file))
      return nullptr;
      
      arg2 = file.GetStream();
      if (arg2)
      file.Clear();
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->Print(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBInstructionList_GetDescription(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBInstructionList *arg1 = (lldb::SBInstructionList *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBInstructionList_GetDescription",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBInstructionList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBInstructionList_GetDescription" "', argument " "1"" of type '" "lldb::SBInstructionList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBInstructionList * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBInstructionList_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBInstructionList_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetDescription(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBInstructionList_DumpEmulationForAllInstructions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBInstructionList *arg1 = (lldb::SBInstructionList *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBInstructionList_DumpEmulationForAllInstructions",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBInstructionList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBInstructionList_DumpEmulationForAllInstructions" "', argument " "1"" of type '" "lldb::SBInstructionList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBInstructionList * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBInstructionList_DumpEmulationForAllInstructions" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->DumpEmulationForAllInstructions((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBInstructionList___str__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBInstructionList *arg1 = (lldb::SBInstructionList *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBInstructionList___str__",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBInstructionList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBInstructionList___str__" "', argument " "1"" of type '" "lldb::SBInstructionList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBInstructionList * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (PyObject *)lldb_SBInstructionList___str__(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = result;
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBInstructionList_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBInstructionList, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_SBLanguageRuntime_GetLanguageTypeFromString(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  char *arg1 = (char *) 0 ;
  int res1 ;
  char *buf1 = 0 ;
  int alloc1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::LanguageType result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBLanguageRuntime_GetLanguageTypeFromString",&obj0)) SWIG_fail;
  res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLanguageRuntime_GetLanguageTypeFromString" "', argument " "1"" of type '" "char const *""'");
  }
  arg1 = reinterpret_cast< char * >(buf1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::LanguageType)lldb::SBLanguageRuntime::GetLanguageTypeFromString((char const *)arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return resultobj;
fail:
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLanguageRuntime_GetNameForLanguageType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::LanguageType arg1 ;
  int val1 ;
  int ecode1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBLanguageRuntime_GetNameForLanguageType",&obj0)) SWIG_fail;
  ecode1 = SWIG_AsVal_int(obj0, &val1);
  if (!SWIG_IsOK(ecode1)) {
    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "SBLanguageRuntime_GetNameForLanguageType" "', argument " "1"" of type '" "lldb::LanguageType""'");
  } 
  arg1 = static_cast< lldb::LanguageType >(val1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)lldb::SBLanguageRuntime::GetNameForLanguageType(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBLanguageRuntime(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLanguageRuntime *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBLanguageRuntime")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBLanguageRuntime *)new lldb::SBLanguageRuntime();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBLanguageRuntime, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBLanguageRuntime(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLanguageRuntime *arg1 = (lldb::SBLanguageRuntime *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBLanguageRuntime",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLanguageRuntime, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBLanguageRuntime" "', argument " "1"" of type '" "lldb::SBLanguageRuntime *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLanguageRuntime * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBLanguageRuntime_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBLanguageRuntime, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBLaunchInfo(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  char **arg1 = (char **) 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBLaunchInfo *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBLaunchInfo",&obj0)) SWIG_fail;
  {
    using namespace lldb_private;
    /* Check if is a list  */
    if (PythonList::Check(obj0)) {
      PythonList list(PyRefType::Borrowed, obj0);
      int size = list.GetSize();
      int i = 0;
      arg1 = (char**)malloc((size+1)*sizeof(char*));
      for (i = 0; i < size; i++) {
        PythonString py_str = list.GetItemAtIndex(i).AsType<PythonString>();
        if (!py_str.IsAllocated()) {
          PyErr_SetString(PyExc_TypeError,"list must contain strings");
          free(arg1);
          return nullptr;
        }
        
        arg1[i] = const_cast<char*>(py_str.GetString().data());
      }
      arg1[i] = 0;
    } else if (obj0 == Py_None) {
      arg1 =  NULL;
    } else {
      PyErr_SetString(PyExc_TypeError,"not a list");
      return NULL;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBLaunchInfo *)new lldb::SBLaunchInfo((char const **)arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBLaunchInfo, SWIG_POINTER_NEW |  0 );
  {
    free((char *) arg1);
  }
  return resultobj;
fail:
  {
    free((char *) arg1);
  }
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLaunchInfo_GetProcessID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLaunchInfo *arg1 = (lldb::SBLaunchInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::pid_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBLaunchInfo_GetProcessID",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLaunchInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLaunchInfo_GetProcessID" "', argument " "1"" of type '" "lldb::SBLaunchInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLaunchInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::pid_t)(arg1)->GetProcessID();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLaunchInfo_GetUserID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLaunchInfo *arg1 = (lldb::SBLaunchInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBLaunchInfo_GetUserID",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLaunchInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLaunchInfo_GetUserID" "', argument " "1"" of type '" "lldb::SBLaunchInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLaunchInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetUserID();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLaunchInfo_GetGroupID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLaunchInfo *arg1 = (lldb::SBLaunchInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBLaunchInfo_GetGroupID",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLaunchInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLaunchInfo_GetGroupID" "', argument " "1"" of type '" "lldb::SBLaunchInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLaunchInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetGroupID();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLaunchInfo_UserIDIsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLaunchInfo *arg1 = (lldb::SBLaunchInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBLaunchInfo_UserIDIsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLaunchInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLaunchInfo_UserIDIsValid" "', argument " "1"" of type '" "lldb::SBLaunchInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLaunchInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->UserIDIsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLaunchInfo_GroupIDIsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLaunchInfo *arg1 = (lldb::SBLaunchInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBLaunchInfo_GroupIDIsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLaunchInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLaunchInfo_GroupIDIsValid" "', argument " "1"" of type '" "lldb::SBLaunchInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLaunchInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GroupIDIsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLaunchInfo_SetUserID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLaunchInfo *arg1 = (lldb::SBLaunchInfo *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBLaunchInfo_SetUserID",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLaunchInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLaunchInfo_SetUserID" "', argument " "1"" of type '" "lldb::SBLaunchInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLaunchInfo * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBLaunchInfo_SetUserID" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetUserID(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLaunchInfo_SetGroupID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLaunchInfo *arg1 = (lldb::SBLaunchInfo *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBLaunchInfo_SetGroupID",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLaunchInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLaunchInfo_SetGroupID" "', argument " "1"" of type '" "lldb::SBLaunchInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLaunchInfo * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBLaunchInfo_SetGroupID" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetGroupID(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLaunchInfo_GetExecutableFile(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLaunchInfo *arg1 = (lldb::SBLaunchInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBFileSpec result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBLaunchInfo_GetExecutableFile",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLaunchInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLaunchInfo_GetExecutableFile" "', argument " "1"" of type '" "lldb::SBLaunchInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLaunchInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetExecutableFile();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBFileSpec(static_cast< const lldb::SBFileSpec& >(result))), SWIGTYPE_p_lldb__SBFileSpec, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLaunchInfo_SetExecutableFile(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLaunchInfo *arg1 = (lldb::SBLaunchInfo *) 0 ;
  lldb::SBFileSpec arg2 ;
  bool arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  bool val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBLaunchInfo_SetExecutableFile",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLaunchInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLaunchInfo_SetExecutableFile" "', argument " "1"" of type '" "lldb::SBLaunchInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLaunchInfo * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBFileSpec,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBLaunchInfo_SetExecutableFile" "', argument " "2"" of type '" "lldb::SBFileSpec""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBLaunchInfo_SetExecutableFile" "', argument " "2"" of type '" "lldb::SBFileSpec""'");
    } else {
      lldb::SBFileSpec * temp = reinterpret_cast< lldb::SBFileSpec * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  ecode3 = SWIG_AsVal_bool(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBLaunchInfo_SetExecutableFile" "', argument " "3"" of type '" "bool""'");
  } 
  arg3 = static_cast< bool >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetExecutableFile(arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLaunchInfo_GetListener(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLaunchInfo *arg1 = (lldb::SBLaunchInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBListener result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBLaunchInfo_GetListener",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLaunchInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLaunchInfo_GetListener" "', argument " "1"" of type '" "lldb::SBLaunchInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLaunchInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetListener();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBListener(static_cast< const lldb::SBListener& >(result))), SWIGTYPE_p_lldb__SBListener, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLaunchInfo_SetListener(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLaunchInfo *arg1 = (lldb::SBLaunchInfo *) 0 ;
  lldb::SBListener *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBLaunchInfo_SetListener",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLaunchInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLaunchInfo_SetListener" "', argument " "1"" of type '" "lldb::SBLaunchInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLaunchInfo * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBListener,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBLaunchInfo_SetListener" "', argument " "2"" of type '" "lldb::SBListener &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBLaunchInfo_SetListener" "', argument " "2"" of type '" "lldb::SBListener &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBListener * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetListener(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLaunchInfo_GetNumArguments(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLaunchInfo *arg1 = (lldb::SBLaunchInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBLaunchInfo_GetNumArguments",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLaunchInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLaunchInfo_GetNumArguments" "', argument " "1"" of type '" "lldb::SBLaunchInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLaunchInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetNumArguments();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLaunchInfo_GetArgumentAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLaunchInfo *arg1 = (lldb::SBLaunchInfo *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBLaunchInfo_GetArgumentAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLaunchInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLaunchInfo_GetArgumentAtIndex" "', argument " "1"" of type '" "lldb::SBLaunchInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLaunchInfo * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBLaunchInfo_GetArgumentAtIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetArgumentAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLaunchInfo_SetArguments(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLaunchInfo *arg1 = (lldb::SBLaunchInfo *) 0 ;
  char **arg2 = (char **) 0 ;
  bool arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBLaunchInfo_SetArguments",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLaunchInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLaunchInfo_SetArguments" "', argument " "1"" of type '" "lldb::SBLaunchInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLaunchInfo * >(argp1);
  {
    using namespace lldb_private;
    /* Check if is a list  */
    if (PythonList::Check(obj1)) {
      PythonList list(PyRefType::Borrowed, obj1);
      int size = list.GetSize();
      int i = 0;
      arg2 = (char**)malloc((size+1)*sizeof(char*));
      for (i = 0; i < size; i++) {
        PythonString py_str = list.GetItemAtIndex(i).AsType<PythonString>();
        if (!py_str.IsAllocated()) {
          PyErr_SetString(PyExc_TypeError,"list must contain strings");
          free(arg2);
          return nullptr;
        }
        
        arg2[i] = const_cast<char*>(py_str.GetString().data());
      }
      arg2[i] = 0;
    } else if (obj1 == Py_None) {
      arg2 =  NULL;
    } else {
      PyErr_SetString(PyExc_TypeError,"not a list");
      return NULL;
    }
  }
  ecode3 = SWIG_AsVal_bool(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBLaunchInfo_SetArguments" "', argument " "3"" of type '" "bool""'");
  } 
  arg3 = static_cast< bool >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetArguments((char const **)arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  {
    free((char *) arg2);
  }
  return resultobj;
fail:
  {
    free((char *) arg2);
  }
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLaunchInfo_GetNumEnvironmentEntries(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLaunchInfo *arg1 = (lldb::SBLaunchInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBLaunchInfo_GetNumEnvironmentEntries",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLaunchInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLaunchInfo_GetNumEnvironmentEntries" "', argument " "1"" of type '" "lldb::SBLaunchInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLaunchInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetNumEnvironmentEntries();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLaunchInfo_GetEnvironmentEntryAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLaunchInfo *arg1 = (lldb::SBLaunchInfo *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBLaunchInfo_GetEnvironmentEntryAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLaunchInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLaunchInfo_GetEnvironmentEntryAtIndex" "', argument " "1"" of type '" "lldb::SBLaunchInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLaunchInfo * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBLaunchInfo_GetEnvironmentEntryAtIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetEnvironmentEntryAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLaunchInfo_SetEnvironmentEntries(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLaunchInfo *arg1 = (lldb::SBLaunchInfo *) 0 ;
  char **arg2 = (char **) 0 ;
  bool arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBLaunchInfo_SetEnvironmentEntries",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLaunchInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLaunchInfo_SetEnvironmentEntries" "', argument " "1"" of type '" "lldb::SBLaunchInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLaunchInfo * >(argp1);
  {
    using namespace lldb_private;
    /* Check if is a list  */
    if (PythonList::Check(obj1)) {
      PythonList list(PyRefType::Borrowed, obj1);
      int size = list.GetSize();
      int i = 0;
      arg2 = (char**)malloc((size+1)*sizeof(char*));
      for (i = 0; i < size; i++) {
        PythonString py_str = list.GetItemAtIndex(i).AsType<PythonString>();
        if (!py_str.IsAllocated()) {
          PyErr_SetString(PyExc_TypeError,"list must contain strings");
          free(arg2);
          return nullptr;
        }
        
        arg2[i] = const_cast<char*>(py_str.GetString().data());
      }
      arg2[i] = 0;
    } else if (obj1 == Py_None) {
      arg2 =  NULL;
    } else {
      PyErr_SetString(PyExc_TypeError,"not a list");
      return NULL;
    }
  }
  ecode3 = SWIG_AsVal_bool(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBLaunchInfo_SetEnvironmentEntries" "', argument " "3"" of type '" "bool""'");
  } 
  arg3 = static_cast< bool >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetEnvironmentEntries((char const **)arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  {
    free((char *) arg2);
  }
  return resultobj;
fail:
  {
    free((char *) arg2);
  }
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLaunchInfo_Clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLaunchInfo *arg1 = (lldb::SBLaunchInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBLaunchInfo_Clear",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLaunchInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLaunchInfo_Clear" "', argument " "1"" of type '" "lldb::SBLaunchInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLaunchInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->Clear();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLaunchInfo_GetWorkingDirectory(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLaunchInfo *arg1 = (lldb::SBLaunchInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBLaunchInfo_GetWorkingDirectory",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLaunchInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLaunchInfo_GetWorkingDirectory" "', argument " "1"" of type '" "lldb::SBLaunchInfo const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLaunchInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)((lldb::SBLaunchInfo const *)arg1)->GetWorkingDirectory();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLaunchInfo_SetWorkingDirectory(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLaunchInfo *arg1 = (lldb::SBLaunchInfo *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBLaunchInfo_SetWorkingDirectory",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLaunchInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLaunchInfo_SetWorkingDirectory" "', argument " "1"" of type '" "lldb::SBLaunchInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLaunchInfo * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBLaunchInfo_SetWorkingDirectory" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetWorkingDirectory((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLaunchInfo_GetLaunchFlags(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLaunchInfo *arg1 = (lldb::SBLaunchInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBLaunchInfo_GetLaunchFlags",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLaunchInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLaunchInfo_GetLaunchFlags" "', argument " "1"" of type '" "lldb::SBLaunchInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLaunchInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetLaunchFlags();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLaunchInfo_SetLaunchFlags(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLaunchInfo *arg1 = (lldb::SBLaunchInfo *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBLaunchInfo_SetLaunchFlags",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLaunchInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLaunchInfo_SetLaunchFlags" "', argument " "1"" of type '" "lldb::SBLaunchInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLaunchInfo * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBLaunchInfo_SetLaunchFlags" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetLaunchFlags(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLaunchInfo_GetProcessPluginName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLaunchInfo *arg1 = (lldb::SBLaunchInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBLaunchInfo_GetProcessPluginName",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLaunchInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLaunchInfo_GetProcessPluginName" "', argument " "1"" of type '" "lldb::SBLaunchInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLaunchInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetProcessPluginName();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLaunchInfo_SetProcessPluginName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLaunchInfo *arg1 = (lldb::SBLaunchInfo *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBLaunchInfo_SetProcessPluginName",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLaunchInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLaunchInfo_SetProcessPluginName" "', argument " "1"" of type '" "lldb::SBLaunchInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLaunchInfo * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBLaunchInfo_SetProcessPluginName" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetProcessPluginName((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLaunchInfo_GetShell(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLaunchInfo *arg1 = (lldb::SBLaunchInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBLaunchInfo_GetShell",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLaunchInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLaunchInfo_GetShell" "', argument " "1"" of type '" "lldb::SBLaunchInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLaunchInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetShell();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLaunchInfo_SetShell(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLaunchInfo *arg1 = (lldb::SBLaunchInfo *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBLaunchInfo_SetShell",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLaunchInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLaunchInfo_SetShell" "', argument " "1"" of type '" "lldb::SBLaunchInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLaunchInfo * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBLaunchInfo_SetShell" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetShell((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLaunchInfo_GetShellExpandArguments(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLaunchInfo *arg1 = (lldb::SBLaunchInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBLaunchInfo_GetShellExpandArguments",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLaunchInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLaunchInfo_GetShellExpandArguments" "', argument " "1"" of type '" "lldb::SBLaunchInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLaunchInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetShellExpandArguments();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLaunchInfo_SetShellExpandArguments(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLaunchInfo *arg1 = (lldb::SBLaunchInfo *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBLaunchInfo_SetShellExpandArguments",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLaunchInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLaunchInfo_SetShellExpandArguments" "', argument " "1"" of type '" "lldb::SBLaunchInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLaunchInfo * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBLaunchInfo_SetShellExpandArguments" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetShellExpandArguments(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLaunchInfo_GetResumeCount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLaunchInfo *arg1 = (lldb::SBLaunchInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBLaunchInfo_GetResumeCount",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLaunchInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLaunchInfo_GetResumeCount" "', argument " "1"" of type '" "lldb::SBLaunchInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLaunchInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetResumeCount();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLaunchInfo_SetResumeCount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLaunchInfo *arg1 = (lldb::SBLaunchInfo *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBLaunchInfo_SetResumeCount",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLaunchInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLaunchInfo_SetResumeCount" "', argument " "1"" of type '" "lldb::SBLaunchInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLaunchInfo * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBLaunchInfo_SetResumeCount" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetResumeCount(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLaunchInfo_AddCloseFileAction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLaunchInfo *arg1 = (lldb::SBLaunchInfo *) 0 ;
  int arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBLaunchInfo_AddCloseFileAction",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLaunchInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLaunchInfo_AddCloseFileAction" "', argument " "1"" of type '" "lldb::SBLaunchInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLaunchInfo * >(argp1);
  ecode2 = SWIG_AsVal_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBLaunchInfo_AddCloseFileAction" "', argument " "2"" of type '" "int""'");
  } 
  arg2 = static_cast< int >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->AddCloseFileAction(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLaunchInfo_AddDuplicateFileAction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLaunchInfo *arg1 = (lldb::SBLaunchInfo *) 0 ;
  int arg2 ;
  int arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int val2 ;
  int ecode2 = 0 ;
  int val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBLaunchInfo_AddDuplicateFileAction",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLaunchInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLaunchInfo_AddDuplicateFileAction" "', argument " "1"" of type '" "lldb::SBLaunchInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLaunchInfo * >(argp1);
  ecode2 = SWIG_AsVal_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBLaunchInfo_AddDuplicateFileAction" "', argument " "2"" of type '" "int""'");
  } 
  arg2 = static_cast< int >(val2);
  ecode3 = SWIG_AsVal_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBLaunchInfo_AddDuplicateFileAction" "', argument " "3"" of type '" "int""'");
  } 
  arg3 = static_cast< int >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->AddDuplicateFileAction(arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLaunchInfo_AddOpenFileAction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLaunchInfo *arg1 = (lldb::SBLaunchInfo *) 0 ;
  int arg2 ;
  char *arg3 = (char *) 0 ;
  bool arg4 ;
  bool arg5 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int val2 ;
  int ecode2 = 0 ;
  int res3 ;
  char *buf3 = 0 ;
  int alloc3 = 0 ;
  bool val4 ;
  int ecode4 = 0 ;
  bool val5 ;
  int ecode5 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  PyObject * obj4 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOOO:SBLaunchInfo_AddOpenFileAction",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLaunchInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLaunchInfo_AddOpenFileAction" "', argument " "1"" of type '" "lldb::SBLaunchInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLaunchInfo * >(argp1);
  ecode2 = SWIG_AsVal_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBLaunchInfo_AddOpenFileAction" "', argument " "2"" of type '" "int""'");
  } 
  arg2 = static_cast< int >(val2);
  res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3);
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBLaunchInfo_AddOpenFileAction" "', argument " "3"" of type '" "char const *""'");
  }
  arg3 = reinterpret_cast< char * >(buf3);
  ecode4 = SWIG_AsVal_bool(obj3, &val4);
  if (!SWIG_IsOK(ecode4)) {
    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "SBLaunchInfo_AddOpenFileAction" "', argument " "4"" of type '" "bool""'");
  } 
  arg4 = static_cast< bool >(val4);
  ecode5 = SWIG_AsVal_bool(obj4, &val5);
  if (!SWIG_IsOK(ecode5)) {
    SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "SBLaunchInfo_AddOpenFileAction" "', argument " "5"" of type '" "bool""'");
  } 
  arg5 = static_cast< bool >(val5);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->AddOpenFileAction(arg2,(char const *)arg3,arg4,arg5);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  return resultobj;
fail:
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLaunchInfo_AddSuppressFileAction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLaunchInfo *arg1 = (lldb::SBLaunchInfo *) 0 ;
  int arg2 ;
  bool arg3 ;
  bool arg4 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int val2 ;
  int ecode2 = 0 ;
  bool val3 ;
  int ecode3 = 0 ;
  bool val4 ;
  int ecode4 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOO:SBLaunchInfo_AddSuppressFileAction",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLaunchInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLaunchInfo_AddSuppressFileAction" "', argument " "1"" of type '" "lldb::SBLaunchInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLaunchInfo * >(argp1);
  ecode2 = SWIG_AsVal_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBLaunchInfo_AddSuppressFileAction" "', argument " "2"" of type '" "int""'");
  } 
  arg2 = static_cast< int >(val2);
  ecode3 = SWIG_AsVal_bool(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBLaunchInfo_AddSuppressFileAction" "', argument " "3"" of type '" "bool""'");
  } 
  arg3 = static_cast< bool >(val3);
  ecode4 = SWIG_AsVal_bool(obj3, &val4);
  if (!SWIG_IsOK(ecode4)) {
    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "SBLaunchInfo_AddSuppressFileAction" "', argument " "4"" of type '" "bool""'");
  } 
  arg4 = static_cast< bool >(val4);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->AddSuppressFileAction(arg2,arg3,arg4);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLaunchInfo_SetLaunchEventData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLaunchInfo *arg1 = (lldb::SBLaunchInfo *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBLaunchInfo_SetLaunchEventData",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLaunchInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLaunchInfo_SetLaunchEventData" "', argument " "1"" of type '" "lldb::SBLaunchInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLaunchInfo * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBLaunchInfo_SetLaunchEventData" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetLaunchEventData((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLaunchInfo_GetLaunchEventData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLaunchInfo *arg1 = (lldb::SBLaunchInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBLaunchInfo_GetLaunchEventData",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLaunchInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLaunchInfo_GetLaunchEventData" "', argument " "1"" of type '" "lldb::SBLaunchInfo const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLaunchInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)((lldb::SBLaunchInfo const *)arg1)->GetLaunchEventData();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLaunchInfo_GetDetachOnError(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLaunchInfo *arg1 = (lldb::SBLaunchInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBLaunchInfo_GetDetachOnError",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLaunchInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLaunchInfo_GetDetachOnError" "', argument " "1"" of type '" "lldb::SBLaunchInfo const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLaunchInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBLaunchInfo const *)arg1)->GetDetachOnError();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLaunchInfo_SetDetachOnError(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLaunchInfo *arg1 = (lldb::SBLaunchInfo *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBLaunchInfo_SetDetachOnError",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLaunchInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLaunchInfo_SetDetachOnError" "', argument " "1"" of type '" "lldb::SBLaunchInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLaunchInfo * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBLaunchInfo_SetDetachOnError" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetDetachOnError(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBLaunchInfo(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLaunchInfo *arg1 = (lldb::SBLaunchInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBLaunchInfo",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLaunchInfo, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBLaunchInfo" "', argument " "1"" of type '" "lldb::SBLaunchInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLaunchInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBLaunchInfo_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBLaunchInfo, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBLineEntry__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLineEntry *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBLineEntry")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBLineEntry *)new lldb::SBLineEntry();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBLineEntry, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBLineEntry__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLineEntry *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBLineEntry *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBLineEntry",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBLineEntry,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBLineEntry" "', argument " "1"" of type '" "lldb::SBLineEntry const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBLineEntry" "', argument " "1"" of type '" "lldb::SBLineEntry const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLineEntry * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBLineEntry *)new lldb::SBLineEntry((lldb::SBLineEntry const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBLineEntry, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBLineEntry(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBLineEntry__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBLineEntry, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBLineEntry__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBLineEntry'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBLineEntry()\n"
    "    lldb::SBLineEntry(lldb::SBLineEntry const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBLineEntry(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLineEntry *arg1 = (lldb::SBLineEntry *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBLineEntry",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLineEntry, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBLineEntry" "', argument " "1"" of type '" "lldb::SBLineEntry *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLineEntry * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLineEntry_GetStartAddress(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLineEntry *arg1 = (lldb::SBLineEntry *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBAddress result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBLineEntry_GetStartAddress",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLineEntry, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLineEntry_GetStartAddress" "', argument " "1"" of type '" "lldb::SBLineEntry const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLineEntry * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBLineEntry const *)arg1)->GetStartAddress();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBAddress(static_cast< const lldb::SBAddress& >(result))), SWIGTYPE_p_lldb__SBAddress, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLineEntry_GetEndAddress(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLineEntry *arg1 = (lldb::SBLineEntry *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBAddress result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBLineEntry_GetEndAddress",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLineEntry, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLineEntry_GetEndAddress" "', argument " "1"" of type '" "lldb::SBLineEntry const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLineEntry * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBLineEntry const *)arg1)->GetEndAddress();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBAddress(static_cast< const lldb::SBAddress& >(result))), SWIGTYPE_p_lldb__SBAddress, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLineEntry_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLineEntry *arg1 = (lldb::SBLineEntry *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBLineEntry_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLineEntry, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLineEntry_IsValid" "', argument " "1"" of type '" "lldb::SBLineEntry const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLineEntry * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBLineEntry const *)arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLineEntry_GetFileSpec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLineEntry *arg1 = (lldb::SBLineEntry *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBFileSpec result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBLineEntry_GetFileSpec",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLineEntry, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLineEntry_GetFileSpec" "', argument " "1"" of type '" "lldb::SBLineEntry const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLineEntry * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBLineEntry const *)arg1)->GetFileSpec();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBFileSpec(static_cast< const lldb::SBFileSpec& >(result))), SWIGTYPE_p_lldb__SBFileSpec, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLineEntry_GetLine(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLineEntry *arg1 = (lldb::SBLineEntry *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBLineEntry_GetLine",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLineEntry, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLineEntry_GetLine" "', argument " "1"" of type '" "lldb::SBLineEntry const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLineEntry * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)((lldb::SBLineEntry const *)arg1)->GetLine();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLineEntry_GetColumn(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLineEntry *arg1 = (lldb::SBLineEntry *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBLineEntry_GetColumn",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLineEntry, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLineEntry_GetColumn" "', argument " "1"" of type '" "lldb::SBLineEntry const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLineEntry * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)((lldb::SBLineEntry const *)arg1)->GetColumn();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLineEntry_GetDescription(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLineEntry *arg1 = (lldb::SBLineEntry *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBLineEntry_GetDescription",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLineEntry, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLineEntry_GetDescription" "', argument " "1"" of type '" "lldb::SBLineEntry *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLineEntry * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBLineEntry_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBLineEntry_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetDescription(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLineEntry_SetFileSpec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLineEntry *arg1 = (lldb::SBLineEntry *) 0 ;
  lldb::SBFileSpec arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBLineEntry_SetFileSpec",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLineEntry, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLineEntry_SetFileSpec" "', argument " "1"" of type '" "lldb::SBLineEntry *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLineEntry * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBFileSpec,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBLineEntry_SetFileSpec" "', argument " "2"" of type '" "lldb::SBFileSpec""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBLineEntry_SetFileSpec" "', argument " "2"" of type '" "lldb::SBFileSpec""'");
    } else {
      lldb::SBFileSpec * temp = reinterpret_cast< lldb::SBFileSpec * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetFileSpec(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLineEntry_SetLine(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLineEntry *arg1 = (lldb::SBLineEntry *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBLineEntry_SetLine",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLineEntry, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLineEntry_SetLine" "', argument " "1"" of type '" "lldb::SBLineEntry *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLineEntry * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBLineEntry_SetLine" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetLine(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLineEntry_SetColumn(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLineEntry *arg1 = (lldb::SBLineEntry *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBLineEntry_SetColumn",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLineEntry, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLineEntry_SetColumn" "', argument " "1"" of type '" "lldb::SBLineEntry *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLineEntry * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBLineEntry_SetColumn" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetColumn(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLineEntry___eq__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLineEntry *arg1 = (lldb::SBLineEntry *) 0 ;
  lldb::SBLineEntry *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBLineEntry___eq__",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLineEntry, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLineEntry___eq__" "', argument " "1"" of type '" "lldb::SBLineEntry const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLineEntry * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBLineEntry,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBLineEntry___eq__" "', argument " "2"" of type '" "lldb::SBLineEntry const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBLineEntry___eq__" "', argument " "2"" of type '" "lldb::SBLineEntry const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBLineEntry * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBLineEntry const *)arg1)->operator ==((lldb::SBLineEntry const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLineEntry___ne__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLineEntry *arg1 = (lldb::SBLineEntry *) 0 ;
  lldb::SBLineEntry *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBLineEntry___ne__",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLineEntry, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLineEntry___ne__" "', argument " "1"" of type '" "lldb::SBLineEntry const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLineEntry * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBLineEntry,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBLineEntry___ne__" "', argument " "2"" of type '" "lldb::SBLineEntry const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBLineEntry___ne__" "', argument " "2"" of type '" "lldb::SBLineEntry const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBLineEntry * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBLineEntry const *)arg1)->operator !=((lldb::SBLineEntry const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBLineEntry___str__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBLineEntry *arg1 = (lldb::SBLineEntry *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBLineEntry___str__",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBLineEntry, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBLineEntry___str__" "', argument " "1"" of type '" "lldb::SBLineEntry *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBLineEntry * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (PyObject *)lldb_SBLineEntry___str__(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = result;
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBLineEntry_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBLineEntry, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBListener__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBListener *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBListener")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBListener *)new lldb::SBListener();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBListener, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBListener__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  char *arg1 = (char *) 0 ;
  int res1 ;
  char *buf1 = 0 ;
  int alloc1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBListener *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBListener",&obj0)) SWIG_fail;
  res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBListener" "', argument " "1"" of type '" "char const *""'");
  }
  arg1 = reinterpret_cast< char * >(buf1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBListener *)new lldb::SBListener((char const *)arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBListener, SWIG_POINTER_NEW |  0 );
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return resultobj;
fail:
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBListener__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBListener *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBListener *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBListener",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBListener,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBListener" "', argument " "1"" of type '" "lldb::SBListener const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBListener" "', argument " "1"" of type '" "lldb::SBListener const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBListener * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBListener *)new lldb::SBListener((lldb::SBListener const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBListener, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBListener(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBListener__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBListener, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBListener__SWIG_2(self, args);
    }
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_AsCharPtrAndSize(argv[0], 0, NULL, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBListener__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBListener'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBListener()\n"
    "    lldb::SBListener(char const *)\n"
    "    lldb::SBListener(lldb::SBListener const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBListener(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBListener *arg1 = (lldb::SBListener *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBListener",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBListener, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBListener" "', argument " "1"" of type '" "lldb::SBListener *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBListener * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBListener_AddEvent(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBListener *arg1 = (lldb::SBListener *) 0 ;
  lldb::SBEvent *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBListener_AddEvent",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBListener, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBListener_AddEvent" "', argument " "1"" of type '" "lldb::SBListener *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBListener * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBEvent,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBListener_AddEvent" "', argument " "2"" of type '" "lldb::SBEvent const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBListener_AddEvent" "', argument " "2"" of type '" "lldb::SBEvent const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBEvent * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->AddEvent((lldb::SBEvent const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBListener_Clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBListener *arg1 = (lldb::SBListener *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBListener_Clear",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBListener, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBListener_Clear" "', argument " "1"" of type '" "lldb::SBListener *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBListener * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->Clear();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBListener_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBListener *arg1 = (lldb::SBListener *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBListener_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBListener, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBListener_IsValid" "', argument " "1"" of type '" "lldb::SBListener const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBListener * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBListener const *)arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBListener_StartListeningForEventClass(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBListener *arg1 = (lldb::SBListener *) 0 ;
  lldb::SBDebugger *arg2 = 0 ;
  char *arg3 = (char *) 0 ;
  uint32_t arg4 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  int res3 ;
  char *buf3 = 0 ;
  int alloc3 = 0 ;
  unsigned int val4 ;
  int ecode4 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOO:SBListener_StartListeningForEventClass",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBListener, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBListener_StartListeningForEventClass" "', argument " "1"" of type '" "lldb::SBListener *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBListener * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBDebugger,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBListener_StartListeningForEventClass" "', argument " "2"" of type '" "lldb::SBDebugger &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBListener_StartListeningForEventClass" "', argument " "2"" of type '" "lldb::SBDebugger &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBDebugger * >(argp2);
  res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3);
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBListener_StartListeningForEventClass" "', argument " "3"" of type '" "char const *""'");
  }
  arg3 = reinterpret_cast< char * >(buf3);
  ecode4 = SWIG_AsVal_unsigned_SS_int(obj3, &val4);
  if (!SWIG_IsOK(ecode4)) {
    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "SBListener_StartListeningForEventClass" "', argument " "4"" of type '" "uint32_t""'");
  } 
  arg4 = static_cast< uint32_t >(val4);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->StartListeningForEventClass(*arg2,(char const *)arg3,arg4);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  return resultobj;
fail:
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBListener_StopListeningForEventClass(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBListener *arg1 = (lldb::SBListener *) 0 ;
  lldb::SBDebugger *arg2 = 0 ;
  char *arg3 = (char *) 0 ;
  uint32_t arg4 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  int res3 ;
  char *buf3 = 0 ;
  int alloc3 = 0 ;
  unsigned int val4 ;
  int ecode4 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOO:SBListener_StopListeningForEventClass",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBListener, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBListener_StopListeningForEventClass" "', argument " "1"" of type '" "lldb::SBListener *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBListener * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBDebugger,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBListener_StopListeningForEventClass" "', argument " "2"" of type '" "lldb::SBDebugger &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBListener_StopListeningForEventClass" "', argument " "2"" of type '" "lldb::SBDebugger &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBDebugger * >(argp2);
  res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3);
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBListener_StopListeningForEventClass" "', argument " "3"" of type '" "char const *""'");
  }
  arg3 = reinterpret_cast< char * >(buf3);
  ecode4 = SWIG_AsVal_unsigned_SS_int(obj3, &val4);
  if (!SWIG_IsOK(ecode4)) {
    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "SBListener_StopListeningForEventClass" "', argument " "4"" of type '" "uint32_t""'");
  } 
  arg4 = static_cast< uint32_t >(val4);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->StopListeningForEventClass(*arg2,(char const *)arg3,arg4);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  return resultobj;
fail:
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBListener_StartListeningForEvents(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBListener *arg1 = (lldb::SBListener *) 0 ;
  lldb::SBBroadcaster *arg2 = 0 ;
  uint32_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  unsigned int val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBListener_StartListeningForEvents",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBListener, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBListener_StartListeningForEvents" "', argument " "1"" of type '" "lldb::SBListener *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBListener * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBBroadcaster,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBListener_StartListeningForEvents" "', argument " "2"" of type '" "lldb::SBBroadcaster const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBListener_StartListeningForEvents" "', argument " "2"" of type '" "lldb::SBBroadcaster const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBBroadcaster * >(argp2);
  ecode3 = SWIG_AsVal_unsigned_SS_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBListener_StartListeningForEvents" "', argument " "3"" of type '" "uint32_t""'");
  } 
  arg3 = static_cast< uint32_t >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->StartListeningForEvents((lldb::SBBroadcaster const &)*arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBListener_StopListeningForEvents(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBListener *arg1 = (lldb::SBListener *) 0 ;
  lldb::SBBroadcaster *arg2 = 0 ;
  uint32_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  unsigned int val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBListener_StopListeningForEvents",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBListener, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBListener_StopListeningForEvents" "', argument " "1"" of type '" "lldb::SBListener *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBListener * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBBroadcaster,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBListener_StopListeningForEvents" "', argument " "2"" of type '" "lldb::SBBroadcaster const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBListener_StopListeningForEvents" "', argument " "2"" of type '" "lldb::SBBroadcaster const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBBroadcaster * >(argp2);
  ecode3 = SWIG_AsVal_unsigned_SS_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBListener_StopListeningForEvents" "', argument " "3"" of type '" "uint32_t""'");
  } 
  arg3 = static_cast< uint32_t >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->StopListeningForEvents((lldb::SBBroadcaster const &)*arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBListener_WaitForEvent(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBListener *arg1 = (lldb::SBListener *) 0 ;
  uint32_t arg2 ;
  lldb::SBEvent *arg3 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  void *argp3 = 0 ;
  int res3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBListener_WaitForEvent",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBListener, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBListener_WaitForEvent" "', argument " "1"" of type '" "lldb::SBListener *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBListener * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBListener_WaitForEvent" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBEvent,  0 );
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBListener_WaitForEvent" "', argument " "3"" of type '" "lldb::SBEvent &""'"); 
  }
  if (!argp3) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBListener_WaitForEvent" "', argument " "3"" of type '" "lldb::SBEvent &""'"); 
  }
  arg3 = reinterpret_cast< lldb::SBEvent * >(argp3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->WaitForEvent(arg2,*arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBListener_WaitForEventForBroadcaster(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBListener *arg1 = (lldb::SBListener *) 0 ;
  uint32_t arg2 ;
  lldb::SBBroadcaster *arg3 = 0 ;
  lldb::SBEvent *arg4 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  void *argp3 = 0 ;
  int res3 = 0 ;
  void *argp4 = 0 ;
  int res4 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOO:SBListener_WaitForEventForBroadcaster",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBListener, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBListener_WaitForEventForBroadcaster" "', argument " "1"" of type '" "lldb::SBListener *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBListener * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBListener_WaitForEventForBroadcaster" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBBroadcaster,  0  | 0);
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBListener_WaitForEventForBroadcaster" "', argument " "3"" of type '" "lldb::SBBroadcaster const &""'"); 
  }
  if (!argp3) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBListener_WaitForEventForBroadcaster" "', argument " "3"" of type '" "lldb::SBBroadcaster const &""'"); 
  }
  arg3 = reinterpret_cast< lldb::SBBroadcaster * >(argp3);
  res4 = SWIG_ConvertPtr(obj3, &argp4, SWIGTYPE_p_lldb__SBEvent,  0 );
  if (!SWIG_IsOK(res4)) {
    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "SBListener_WaitForEventForBroadcaster" "', argument " "4"" of type '" "lldb::SBEvent &""'"); 
  }
  if (!argp4) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBListener_WaitForEventForBroadcaster" "', argument " "4"" of type '" "lldb::SBEvent &""'"); 
  }
  arg4 = reinterpret_cast< lldb::SBEvent * >(argp4);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->WaitForEventForBroadcaster(arg2,(lldb::SBBroadcaster const &)*arg3,*arg4);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBListener_WaitForEventForBroadcasterWithType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBListener *arg1 = (lldb::SBListener *) 0 ;
  uint32_t arg2 ;
  lldb::SBBroadcaster *arg3 = 0 ;
  uint32_t arg4 ;
  lldb::SBEvent *arg5 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  void *argp3 = 0 ;
  int res3 = 0 ;
  unsigned int val4 ;
  int ecode4 = 0 ;
  void *argp5 = 0 ;
  int res5 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  PyObject * obj4 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOOO:SBListener_WaitForEventForBroadcasterWithType",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBListener, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBListener_WaitForEventForBroadcasterWithType" "', argument " "1"" of type '" "lldb::SBListener *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBListener * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBListener_WaitForEventForBroadcasterWithType" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBBroadcaster,  0  | 0);
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBListener_WaitForEventForBroadcasterWithType" "', argument " "3"" of type '" "lldb::SBBroadcaster const &""'"); 
  }
  if (!argp3) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBListener_WaitForEventForBroadcasterWithType" "', argument " "3"" of type '" "lldb::SBBroadcaster const &""'"); 
  }
  arg3 = reinterpret_cast< lldb::SBBroadcaster * >(argp3);
  ecode4 = SWIG_AsVal_unsigned_SS_int(obj3, &val4);
  if (!SWIG_IsOK(ecode4)) {
    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "SBListener_WaitForEventForBroadcasterWithType" "', argument " "4"" of type '" "uint32_t""'");
  } 
  arg4 = static_cast< uint32_t >(val4);
  res5 = SWIG_ConvertPtr(obj4, &argp5, SWIGTYPE_p_lldb__SBEvent,  0 );
  if (!SWIG_IsOK(res5)) {
    SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "SBListener_WaitForEventForBroadcasterWithType" "', argument " "5"" of type '" "lldb::SBEvent &""'"); 
  }
  if (!argp5) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBListener_WaitForEventForBroadcasterWithType" "', argument " "5"" of type '" "lldb::SBEvent &""'"); 
  }
  arg5 = reinterpret_cast< lldb::SBEvent * >(argp5);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->WaitForEventForBroadcasterWithType(arg2,(lldb::SBBroadcaster const &)*arg3,arg4,*arg5);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBListener_PeekAtNextEvent(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBListener *arg1 = (lldb::SBListener *) 0 ;
  lldb::SBEvent *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBListener_PeekAtNextEvent",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBListener, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBListener_PeekAtNextEvent" "', argument " "1"" of type '" "lldb::SBListener *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBListener * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBEvent,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBListener_PeekAtNextEvent" "', argument " "2"" of type '" "lldb::SBEvent &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBListener_PeekAtNextEvent" "', argument " "2"" of type '" "lldb::SBEvent &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBEvent * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->PeekAtNextEvent(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBListener_PeekAtNextEventForBroadcaster(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBListener *arg1 = (lldb::SBListener *) 0 ;
  lldb::SBBroadcaster *arg2 = 0 ;
  lldb::SBEvent *arg3 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  void *argp3 = 0 ;
  int res3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBListener_PeekAtNextEventForBroadcaster",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBListener, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBListener_PeekAtNextEventForBroadcaster" "', argument " "1"" of type '" "lldb::SBListener *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBListener * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBBroadcaster,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBListener_PeekAtNextEventForBroadcaster" "', argument " "2"" of type '" "lldb::SBBroadcaster const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBListener_PeekAtNextEventForBroadcaster" "', argument " "2"" of type '" "lldb::SBBroadcaster const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBBroadcaster * >(argp2);
  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBEvent,  0 );
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBListener_PeekAtNextEventForBroadcaster" "', argument " "3"" of type '" "lldb::SBEvent &""'"); 
  }
  if (!argp3) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBListener_PeekAtNextEventForBroadcaster" "', argument " "3"" of type '" "lldb::SBEvent &""'"); 
  }
  arg3 = reinterpret_cast< lldb::SBEvent * >(argp3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->PeekAtNextEventForBroadcaster((lldb::SBBroadcaster const &)*arg2,*arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBListener_PeekAtNextEventForBroadcasterWithType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBListener *arg1 = (lldb::SBListener *) 0 ;
  lldb::SBBroadcaster *arg2 = 0 ;
  uint32_t arg3 ;
  lldb::SBEvent *arg4 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  unsigned int val3 ;
  int ecode3 = 0 ;
  void *argp4 = 0 ;
  int res4 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOO:SBListener_PeekAtNextEventForBroadcasterWithType",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBListener, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBListener_PeekAtNextEventForBroadcasterWithType" "', argument " "1"" of type '" "lldb::SBListener *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBListener * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBBroadcaster,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBListener_PeekAtNextEventForBroadcasterWithType" "', argument " "2"" of type '" "lldb::SBBroadcaster const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBListener_PeekAtNextEventForBroadcasterWithType" "', argument " "2"" of type '" "lldb::SBBroadcaster const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBBroadcaster * >(argp2);
  ecode3 = SWIG_AsVal_unsigned_SS_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBListener_PeekAtNextEventForBroadcasterWithType" "', argument " "3"" of type '" "uint32_t""'");
  } 
  arg3 = static_cast< uint32_t >(val3);
  res4 = SWIG_ConvertPtr(obj3, &argp4, SWIGTYPE_p_lldb__SBEvent,  0 );
  if (!SWIG_IsOK(res4)) {
    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "SBListener_PeekAtNextEventForBroadcasterWithType" "', argument " "4"" of type '" "lldb::SBEvent &""'"); 
  }
  if (!argp4) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBListener_PeekAtNextEventForBroadcasterWithType" "', argument " "4"" of type '" "lldb::SBEvent &""'"); 
  }
  arg4 = reinterpret_cast< lldb::SBEvent * >(argp4);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->PeekAtNextEventForBroadcasterWithType((lldb::SBBroadcaster const &)*arg2,arg3,*arg4);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBListener_GetNextEvent(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBListener *arg1 = (lldb::SBListener *) 0 ;
  lldb::SBEvent *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBListener_GetNextEvent",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBListener, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBListener_GetNextEvent" "', argument " "1"" of type '" "lldb::SBListener *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBListener * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBEvent,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBListener_GetNextEvent" "', argument " "2"" of type '" "lldb::SBEvent &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBListener_GetNextEvent" "', argument " "2"" of type '" "lldb::SBEvent &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBEvent * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetNextEvent(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBListener_GetNextEventForBroadcaster(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBListener *arg1 = (lldb::SBListener *) 0 ;
  lldb::SBBroadcaster *arg2 = 0 ;
  lldb::SBEvent *arg3 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  void *argp3 = 0 ;
  int res3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBListener_GetNextEventForBroadcaster",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBListener, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBListener_GetNextEventForBroadcaster" "', argument " "1"" of type '" "lldb::SBListener *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBListener * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBBroadcaster,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBListener_GetNextEventForBroadcaster" "', argument " "2"" of type '" "lldb::SBBroadcaster const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBListener_GetNextEventForBroadcaster" "', argument " "2"" of type '" "lldb::SBBroadcaster const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBBroadcaster * >(argp2);
  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBEvent,  0 );
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBListener_GetNextEventForBroadcaster" "', argument " "3"" of type '" "lldb::SBEvent &""'"); 
  }
  if (!argp3) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBListener_GetNextEventForBroadcaster" "', argument " "3"" of type '" "lldb::SBEvent &""'"); 
  }
  arg3 = reinterpret_cast< lldb::SBEvent * >(argp3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetNextEventForBroadcaster((lldb::SBBroadcaster const &)*arg2,*arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBListener_GetNextEventForBroadcasterWithType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBListener *arg1 = (lldb::SBListener *) 0 ;
  lldb::SBBroadcaster *arg2 = 0 ;
  uint32_t arg3 ;
  lldb::SBEvent *arg4 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  unsigned int val3 ;
  int ecode3 = 0 ;
  void *argp4 = 0 ;
  int res4 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOO:SBListener_GetNextEventForBroadcasterWithType",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBListener, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBListener_GetNextEventForBroadcasterWithType" "', argument " "1"" of type '" "lldb::SBListener *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBListener * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBBroadcaster,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBListener_GetNextEventForBroadcasterWithType" "', argument " "2"" of type '" "lldb::SBBroadcaster const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBListener_GetNextEventForBroadcasterWithType" "', argument " "2"" of type '" "lldb::SBBroadcaster const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBBroadcaster * >(argp2);
  ecode3 = SWIG_AsVal_unsigned_SS_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBListener_GetNextEventForBroadcasterWithType" "', argument " "3"" of type '" "uint32_t""'");
  } 
  arg3 = static_cast< uint32_t >(val3);
  res4 = SWIG_ConvertPtr(obj3, &argp4, SWIGTYPE_p_lldb__SBEvent,  0 );
  if (!SWIG_IsOK(res4)) {
    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "SBListener_GetNextEventForBroadcasterWithType" "', argument " "4"" of type '" "lldb::SBEvent &""'"); 
  }
  if (!argp4) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBListener_GetNextEventForBroadcasterWithType" "', argument " "4"" of type '" "lldb::SBEvent &""'"); 
  }
  arg4 = reinterpret_cast< lldb::SBEvent * >(argp4);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetNextEventForBroadcasterWithType((lldb::SBBroadcaster const &)*arg2,arg3,*arg4);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBListener_HandleBroadcastEvent(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBListener *arg1 = (lldb::SBListener *) 0 ;
  lldb::SBEvent *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBListener_HandleBroadcastEvent",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBListener, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBListener_HandleBroadcastEvent" "', argument " "1"" of type '" "lldb::SBListener *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBListener * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBEvent,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBListener_HandleBroadcastEvent" "', argument " "2"" of type '" "lldb::SBEvent const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBListener_HandleBroadcastEvent" "', argument " "2"" of type '" "lldb::SBEvent const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBEvent * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->HandleBroadcastEvent((lldb::SBEvent const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBListener_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBListener, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBMemoryRegionInfo__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBMemoryRegionInfo *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBMemoryRegionInfo")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBMemoryRegionInfo *)new lldb::SBMemoryRegionInfo();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBMemoryRegionInfo, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBMemoryRegionInfo__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBMemoryRegionInfo *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBMemoryRegionInfo *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBMemoryRegionInfo",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBMemoryRegionInfo,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBMemoryRegionInfo" "', argument " "1"" of type '" "lldb::SBMemoryRegionInfo const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBMemoryRegionInfo" "', argument " "1"" of type '" "lldb::SBMemoryRegionInfo const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBMemoryRegionInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBMemoryRegionInfo *)new lldb::SBMemoryRegionInfo((lldb::SBMemoryRegionInfo const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBMemoryRegionInfo, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBMemoryRegionInfo(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBMemoryRegionInfo__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBMemoryRegionInfo, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBMemoryRegionInfo__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBMemoryRegionInfo'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBMemoryRegionInfo()\n"
    "    lldb::SBMemoryRegionInfo(lldb::SBMemoryRegionInfo const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBMemoryRegionInfo(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBMemoryRegionInfo *arg1 = (lldb::SBMemoryRegionInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBMemoryRegionInfo",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBMemoryRegionInfo, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBMemoryRegionInfo" "', argument " "1"" of type '" "lldb::SBMemoryRegionInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBMemoryRegionInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBMemoryRegionInfo_Clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBMemoryRegionInfo *arg1 = (lldb::SBMemoryRegionInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBMemoryRegionInfo_Clear",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBMemoryRegionInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBMemoryRegionInfo_Clear" "', argument " "1"" of type '" "lldb::SBMemoryRegionInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBMemoryRegionInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->Clear();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBMemoryRegionInfo_GetRegionBase(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBMemoryRegionInfo *arg1 = (lldb::SBMemoryRegionInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::addr_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBMemoryRegionInfo_GetRegionBase",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBMemoryRegionInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBMemoryRegionInfo_GetRegionBase" "', argument " "1"" of type '" "lldb::SBMemoryRegionInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBMemoryRegionInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::addr_t)(arg1)->GetRegionBase();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBMemoryRegionInfo_GetRegionEnd(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBMemoryRegionInfo *arg1 = (lldb::SBMemoryRegionInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::addr_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBMemoryRegionInfo_GetRegionEnd",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBMemoryRegionInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBMemoryRegionInfo_GetRegionEnd" "', argument " "1"" of type '" "lldb::SBMemoryRegionInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBMemoryRegionInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::addr_t)(arg1)->GetRegionEnd();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBMemoryRegionInfo_IsReadable(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBMemoryRegionInfo *arg1 = (lldb::SBMemoryRegionInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBMemoryRegionInfo_IsReadable",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBMemoryRegionInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBMemoryRegionInfo_IsReadable" "', argument " "1"" of type '" "lldb::SBMemoryRegionInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBMemoryRegionInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsReadable();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBMemoryRegionInfo_IsWritable(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBMemoryRegionInfo *arg1 = (lldb::SBMemoryRegionInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBMemoryRegionInfo_IsWritable",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBMemoryRegionInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBMemoryRegionInfo_IsWritable" "', argument " "1"" of type '" "lldb::SBMemoryRegionInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBMemoryRegionInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsWritable();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBMemoryRegionInfo_IsExecutable(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBMemoryRegionInfo *arg1 = (lldb::SBMemoryRegionInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBMemoryRegionInfo_IsExecutable",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBMemoryRegionInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBMemoryRegionInfo_IsExecutable" "', argument " "1"" of type '" "lldb::SBMemoryRegionInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBMemoryRegionInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsExecutable();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBMemoryRegionInfo_IsMapped(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBMemoryRegionInfo *arg1 = (lldb::SBMemoryRegionInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBMemoryRegionInfo_IsMapped",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBMemoryRegionInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBMemoryRegionInfo_IsMapped" "', argument " "1"" of type '" "lldb::SBMemoryRegionInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBMemoryRegionInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsMapped();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBMemoryRegionInfo___eq__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBMemoryRegionInfo *arg1 = (lldb::SBMemoryRegionInfo *) 0 ;
  lldb::SBMemoryRegionInfo *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBMemoryRegionInfo___eq__",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBMemoryRegionInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBMemoryRegionInfo___eq__" "', argument " "1"" of type '" "lldb::SBMemoryRegionInfo const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBMemoryRegionInfo * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBMemoryRegionInfo,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBMemoryRegionInfo___eq__" "', argument " "2"" of type '" "lldb::SBMemoryRegionInfo const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBMemoryRegionInfo___eq__" "', argument " "2"" of type '" "lldb::SBMemoryRegionInfo const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBMemoryRegionInfo * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBMemoryRegionInfo const *)arg1)->operator ==((lldb::SBMemoryRegionInfo const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBMemoryRegionInfo___ne__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBMemoryRegionInfo *arg1 = (lldb::SBMemoryRegionInfo *) 0 ;
  lldb::SBMemoryRegionInfo *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBMemoryRegionInfo___ne__",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBMemoryRegionInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBMemoryRegionInfo___ne__" "', argument " "1"" of type '" "lldb::SBMemoryRegionInfo const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBMemoryRegionInfo * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBMemoryRegionInfo,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBMemoryRegionInfo___ne__" "', argument " "2"" of type '" "lldb::SBMemoryRegionInfo const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBMemoryRegionInfo___ne__" "', argument " "2"" of type '" "lldb::SBMemoryRegionInfo const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBMemoryRegionInfo * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBMemoryRegionInfo const *)arg1)->operator !=((lldb::SBMemoryRegionInfo const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBMemoryRegionInfo_GetDescription(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBMemoryRegionInfo *arg1 = (lldb::SBMemoryRegionInfo *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBMemoryRegionInfo_GetDescription",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBMemoryRegionInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBMemoryRegionInfo_GetDescription" "', argument " "1"" of type '" "lldb::SBMemoryRegionInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBMemoryRegionInfo * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBMemoryRegionInfo_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBMemoryRegionInfo_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetDescription(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBMemoryRegionInfo___str__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBMemoryRegionInfo *arg1 = (lldb::SBMemoryRegionInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBMemoryRegionInfo___str__",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBMemoryRegionInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBMemoryRegionInfo___str__" "', argument " "1"" of type '" "lldb::SBMemoryRegionInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBMemoryRegionInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (PyObject *)lldb_SBMemoryRegionInfo___str__(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = result;
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBMemoryRegionInfo_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBMemoryRegionInfo, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBMemoryRegionInfoList__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBMemoryRegionInfoList *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBMemoryRegionInfoList")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBMemoryRegionInfoList *)new lldb::SBMemoryRegionInfoList();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBMemoryRegionInfoList, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBMemoryRegionInfoList__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBMemoryRegionInfoList *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBMemoryRegionInfoList *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBMemoryRegionInfoList",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBMemoryRegionInfoList,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBMemoryRegionInfoList" "', argument " "1"" of type '" "lldb::SBMemoryRegionInfoList const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBMemoryRegionInfoList" "', argument " "1"" of type '" "lldb::SBMemoryRegionInfoList const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBMemoryRegionInfoList * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBMemoryRegionInfoList *)new lldb::SBMemoryRegionInfoList((lldb::SBMemoryRegionInfoList const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBMemoryRegionInfoList, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBMemoryRegionInfoList(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBMemoryRegionInfoList__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBMemoryRegionInfoList, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBMemoryRegionInfoList__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBMemoryRegionInfoList'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBMemoryRegionInfoList()\n"
    "    lldb::SBMemoryRegionInfoList(lldb::SBMemoryRegionInfoList const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBMemoryRegionInfoList(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBMemoryRegionInfoList *arg1 = (lldb::SBMemoryRegionInfoList *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBMemoryRegionInfoList",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBMemoryRegionInfoList, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBMemoryRegionInfoList" "', argument " "1"" of type '" "lldb::SBMemoryRegionInfoList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBMemoryRegionInfoList * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBMemoryRegionInfoList_GetSize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBMemoryRegionInfoList *arg1 = (lldb::SBMemoryRegionInfoList *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBMemoryRegionInfoList_GetSize",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBMemoryRegionInfoList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBMemoryRegionInfoList_GetSize" "', argument " "1"" of type '" "lldb::SBMemoryRegionInfoList const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBMemoryRegionInfoList * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)((lldb::SBMemoryRegionInfoList const *)arg1)->GetSize();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBMemoryRegionInfoList_GetMemoryRegionAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBMemoryRegionInfoList *arg1 = (lldb::SBMemoryRegionInfoList *) 0 ;
  uint32_t arg2 ;
  lldb::SBMemoryRegionInfo *arg3 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  void *argp3 = 0 ;
  int res3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBMemoryRegionInfoList_GetMemoryRegionAtIndex",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBMemoryRegionInfoList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBMemoryRegionInfoList_GetMemoryRegionAtIndex" "', argument " "1"" of type '" "lldb::SBMemoryRegionInfoList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBMemoryRegionInfoList * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBMemoryRegionInfoList_GetMemoryRegionAtIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBMemoryRegionInfo,  0 );
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBMemoryRegionInfoList_GetMemoryRegionAtIndex" "', argument " "3"" of type '" "lldb::SBMemoryRegionInfo &""'"); 
  }
  if (!argp3) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBMemoryRegionInfoList_GetMemoryRegionAtIndex" "', argument " "3"" of type '" "lldb::SBMemoryRegionInfo &""'"); 
  }
  arg3 = reinterpret_cast< lldb::SBMemoryRegionInfo * >(argp3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetMemoryRegionAtIndex(arg2,*arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBMemoryRegionInfoList_Append__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBMemoryRegionInfoList *arg1 = (lldb::SBMemoryRegionInfoList *) 0 ;
  lldb::SBMemoryRegionInfo *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBMemoryRegionInfoList_Append",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBMemoryRegionInfoList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBMemoryRegionInfoList_Append" "', argument " "1"" of type '" "lldb::SBMemoryRegionInfoList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBMemoryRegionInfoList * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBMemoryRegionInfo,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBMemoryRegionInfoList_Append" "', argument " "2"" of type '" "lldb::SBMemoryRegionInfo &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBMemoryRegionInfoList_Append" "', argument " "2"" of type '" "lldb::SBMemoryRegionInfo &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBMemoryRegionInfo * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->Append(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBMemoryRegionInfoList_Append__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBMemoryRegionInfoList *arg1 = (lldb::SBMemoryRegionInfoList *) 0 ;
  lldb::SBMemoryRegionInfoList *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBMemoryRegionInfoList_Append",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBMemoryRegionInfoList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBMemoryRegionInfoList_Append" "', argument " "1"" of type '" "lldb::SBMemoryRegionInfoList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBMemoryRegionInfoList * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBMemoryRegionInfoList,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBMemoryRegionInfoList_Append" "', argument " "2"" of type '" "lldb::SBMemoryRegionInfoList &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBMemoryRegionInfoList_Append" "', argument " "2"" of type '" "lldb::SBMemoryRegionInfoList &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBMemoryRegionInfoList * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->Append(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBMemoryRegionInfoList_Append(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[3];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 2); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBMemoryRegionInfoList, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      void *vptr = 0;
      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_lldb__SBMemoryRegionInfo, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        return _wrap_SBMemoryRegionInfoList_Append__SWIG_0(self, args);
      }
    }
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBMemoryRegionInfoList, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      void *vptr = 0;
      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_lldb__SBMemoryRegionInfoList, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        return _wrap_SBMemoryRegionInfoList_Append__SWIG_1(self, args);
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBMemoryRegionInfoList_Append'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    Append(lldb::SBMemoryRegionInfoList *,lldb::SBMemoryRegionInfo &)\n"
    "    Append(lldb::SBMemoryRegionInfoList *,lldb::SBMemoryRegionInfoList &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBMemoryRegionInfoList_Clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBMemoryRegionInfoList *arg1 = (lldb::SBMemoryRegionInfoList *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBMemoryRegionInfoList_Clear",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBMemoryRegionInfoList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBMemoryRegionInfoList_Clear" "', argument " "1"" of type '" "lldb::SBMemoryRegionInfoList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBMemoryRegionInfoList * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->Clear();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBMemoryRegionInfoList_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBMemoryRegionInfoList, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBModule__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModule *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBModule")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBModule *)new lldb::SBModule();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBModule, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBModule__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModule *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBModule *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBModule",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBModule,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBModule" "', argument " "1"" of type '" "lldb::SBModule const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBModule" "', argument " "1"" of type '" "lldb::SBModule const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModule * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBModule *)new lldb::SBModule((lldb::SBModule const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBModule, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBModule__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModuleSpec *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBModule *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBModule",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBModuleSpec,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBModule" "', argument " "1"" of type '" "lldb::SBModuleSpec const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBModule" "', argument " "1"" of type '" "lldb::SBModuleSpec const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModuleSpec * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBModule *)new lldb::SBModule((lldb::SBModuleSpec const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBModule, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBModule__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = 0 ;
  lldb::addr_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned long long val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBModule *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:new_SBModule",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBProcess,  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBModule" "', argument " "1"" of type '" "lldb::SBProcess &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBModule" "', argument " "1"" of type '" "lldb::SBProcess &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_long_SS_long(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_SBModule" "', argument " "2"" of type '" "lldb::addr_t""'");
  } 
  arg2 = static_cast< lldb::addr_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBModule *)new lldb::SBModule(*arg1,arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBModule, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBModule(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[3];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 2); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBModule__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBModule, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBModule__SWIG_1(self, args);
    }
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBModuleSpec, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBModule__SWIG_2(self, args);
    }
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBProcess, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_unsigned_SS_long_SS_long(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        return _wrap_new_SBModule__SWIG_3(self, args);
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBModule'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBModule()\n"
    "    lldb::SBModule(lldb::SBModule const &)\n"
    "    lldb::SBModule(lldb::SBModuleSpec const &)\n"
    "    lldb::SBModule(lldb::SBProcess &,lldb::addr_t)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBModule(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModule *arg1 = (lldb::SBModule *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBModule",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModule, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBModule" "', argument " "1"" of type '" "lldb::SBModule *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModule * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModule_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModule *arg1 = (lldb::SBModule *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBModule_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModule, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModule_IsValid" "', argument " "1"" of type '" "lldb::SBModule const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModule * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBModule const *)arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModule_Clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModule *arg1 = (lldb::SBModule *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBModule_Clear",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModule, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModule_Clear" "', argument " "1"" of type '" "lldb::SBModule *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModule * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->Clear();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModule_GetFileSpec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModule *arg1 = (lldb::SBModule *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBFileSpec result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBModule_GetFileSpec",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModule, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModule_GetFileSpec" "', argument " "1"" of type '" "lldb::SBModule const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModule * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBModule const *)arg1)->GetFileSpec();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBFileSpec(static_cast< const lldb::SBFileSpec& >(result))), SWIGTYPE_p_lldb__SBFileSpec, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModule_GetPlatformFileSpec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModule *arg1 = (lldb::SBModule *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBFileSpec result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBModule_GetPlatformFileSpec",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModule, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModule_GetPlatformFileSpec" "', argument " "1"" of type '" "lldb::SBModule const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModule * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBModule const *)arg1)->GetPlatformFileSpec();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBFileSpec(static_cast< const lldb::SBFileSpec& >(result))), SWIGTYPE_p_lldb__SBFileSpec, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModule_SetPlatformFileSpec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModule *arg1 = (lldb::SBModule *) 0 ;
  lldb::SBFileSpec *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBModule_SetPlatformFileSpec",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModule, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModule_SetPlatformFileSpec" "', argument " "1"" of type '" "lldb::SBModule *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModule * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBFileSpec,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBModule_SetPlatformFileSpec" "', argument " "2"" of type '" "lldb::SBFileSpec const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBModule_SetPlatformFileSpec" "', argument " "2"" of type '" "lldb::SBFileSpec const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBFileSpec * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->SetPlatformFileSpec((lldb::SBFileSpec const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModule_GetRemoteInstallFileSpec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModule *arg1 = (lldb::SBModule *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBFileSpec result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBModule_GetRemoteInstallFileSpec",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModule, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModule_GetRemoteInstallFileSpec" "', argument " "1"" of type '" "lldb::SBModule *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModule * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetRemoteInstallFileSpec();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBFileSpec(static_cast< const lldb::SBFileSpec& >(result))), SWIGTYPE_p_lldb__SBFileSpec, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModule_SetRemoteInstallFileSpec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModule *arg1 = (lldb::SBModule *) 0 ;
  lldb::SBFileSpec *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBModule_SetRemoteInstallFileSpec",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModule, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModule_SetRemoteInstallFileSpec" "', argument " "1"" of type '" "lldb::SBModule *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModule * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBFileSpec,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBModule_SetRemoteInstallFileSpec" "', argument " "2"" of type '" "lldb::SBFileSpec &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBModule_SetRemoteInstallFileSpec" "', argument " "2"" of type '" "lldb::SBFileSpec &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBFileSpec * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->SetRemoteInstallFileSpec(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModule_GetUUIDString(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModule *arg1 = (lldb::SBModule *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBModule_GetUUIDString",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModule, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModule_GetUUIDString" "', argument " "1"" of type '" "lldb::SBModule const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModule * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)((lldb::SBModule const *)arg1)->GetUUIDString();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModule_FindSection(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModule *arg1 = (lldb::SBModule *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBSection result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBModule_FindSection",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModule, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModule_FindSection" "', argument " "1"" of type '" "lldb::SBModule *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModule * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBModule_FindSection" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->FindSection((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBSection(static_cast< const lldb::SBSection& >(result))), SWIGTYPE_p_lldb__SBSection, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModule_ResolveFileAddress(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModule *arg1 = (lldb::SBModule *) 0 ;
  lldb::addr_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned long long val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBAddress result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBModule_ResolveFileAddress",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModule, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModule_ResolveFileAddress" "', argument " "1"" of type '" "lldb::SBModule *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModule * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_long_SS_long(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBModule_ResolveFileAddress" "', argument " "2"" of type '" "lldb::addr_t""'");
  } 
  arg2 = static_cast< lldb::addr_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->ResolveFileAddress(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBAddress(static_cast< const lldb::SBAddress& >(result))), SWIGTYPE_p_lldb__SBAddress, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModule_ResolveSymbolContextForAddress(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModule *arg1 = (lldb::SBModule *) 0 ;
  lldb::SBAddress *arg2 = 0 ;
  uint32_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  unsigned int val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBSymbolContext result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBModule_ResolveSymbolContextForAddress",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModule, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModule_ResolveSymbolContextForAddress" "', argument " "1"" of type '" "lldb::SBModule *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModule * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBAddress,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBModule_ResolveSymbolContextForAddress" "', argument " "2"" of type '" "lldb::SBAddress const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBModule_ResolveSymbolContextForAddress" "', argument " "2"" of type '" "lldb::SBAddress const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBAddress * >(argp2);
  ecode3 = SWIG_AsVal_unsigned_SS_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBModule_ResolveSymbolContextForAddress" "', argument " "3"" of type '" "uint32_t""'");
  } 
  arg3 = static_cast< uint32_t >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->ResolveSymbolContextForAddress((lldb::SBAddress const &)*arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBSymbolContext(static_cast< const lldb::SBSymbolContext& >(result))), SWIGTYPE_p_lldb__SBSymbolContext, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModule_GetDescription(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModule *arg1 = (lldb::SBModule *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBModule_GetDescription",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModule, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModule_GetDescription" "', argument " "1"" of type '" "lldb::SBModule *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModule * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBModule_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBModule_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetDescription(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModule_GetNumCompileUnits(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModule *arg1 = (lldb::SBModule *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBModule_GetNumCompileUnits",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModule, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModule_GetNumCompileUnits" "', argument " "1"" of type '" "lldb::SBModule *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModule * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetNumCompileUnits();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModule_GetCompileUnitAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModule *arg1 = (lldb::SBModule *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBCompileUnit result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBModule_GetCompileUnitAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModule, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModule_GetCompileUnitAtIndex" "', argument " "1"" of type '" "lldb::SBModule *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModule * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBModule_GetCompileUnitAtIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetCompileUnitAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBCompileUnit(static_cast< const lldb::SBCompileUnit& >(result))), SWIGTYPE_p_lldb__SBCompileUnit, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModule_GetNumSymbols(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModule *arg1 = (lldb::SBModule *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  size_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBModule_GetNumSymbols",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModule, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModule_GetNumSymbols" "', argument " "1"" of type '" "lldb::SBModule *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModule * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetNumSymbols();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModule_GetSymbolAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModule *arg1 = (lldb::SBModule *) 0 ;
  size_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  size_t val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBSymbol result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBModule_GetSymbolAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModule, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModule_GetSymbolAtIndex" "', argument " "1"" of type '" "lldb::SBModule *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModule * >(argp1);
  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBModule_GetSymbolAtIndex" "', argument " "2"" of type '" "size_t""'");
  } 
  arg2 = static_cast< size_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetSymbolAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBSymbol(static_cast< const lldb::SBSymbol& >(result))), SWIGTYPE_p_lldb__SBSymbol, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModule_FindSymbol__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModule *arg1 = (lldb::SBModule *) 0 ;
  char *arg2 = (char *) 0 ;
  lldb::SymbolType arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  int val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBSymbol result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBModule_FindSymbol",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModule, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModule_FindSymbol" "', argument " "1"" of type '" "lldb::SBModule *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModule * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBModule_FindSymbol" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  ecode3 = SWIG_AsVal_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBModule_FindSymbol" "', argument " "3"" of type '" "lldb::SymbolType""'");
  } 
  arg3 = static_cast< lldb::SymbolType >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->FindSymbol((char const *)arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBSymbol(static_cast< const lldb::SBSymbol& >(result))), SWIGTYPE_p_lldb__SBSymbol, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModule_FindSymbol__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModule *arg1 = (lldb::SBModule *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBSymbol result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBModule_FindSymbol",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModule, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModule_FindSymbol" "', argument " "1"" of type '" "lldb::SBModule *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModule * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBModule_FindSymbol" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->FindSymbol((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBSymbol(static_cast< const lldb::SBSymbol& >(result))), SWIGTYPE_p_lldb__SBSymbol, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModule_FindSymbol(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[4];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 3); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBModule, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        return _wrap_SBModule_FindSymbol__SWIG_1(self, args);
      }
    }
  }
  if (argc == 3) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBModule, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        {
          int res = SWIG_AsVal_int(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          return _wrap_SBModule_FindSymbol__SWIG_0(self, args);
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBModule_FindSymbol'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    FindSymbol(lldb::SBModule *,char const *,lldb::SymbolType)\n"
    "    FindSymbol(lldb::SBModule *,char const *)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModule_FindSymbols__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModule *arg1 = (lldb::SBModule *) 0 ;
  char *arg2 = (char *) 0 ;
  lldb::SymbolType arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  int val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBSymbolContextList result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBModule_FindSymbols",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModule, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModule_FindSymbols" "', argument " "1"" of type '" "lldb::SBModule *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModule * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBModule_FindSymbols" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  ecode3 = SWIG_AsVal_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBModule_FindSymbols" "', argument " "3"" of type '" "lldb::SymbolType""'");
  } 
  arg3 = static_cast< lldb::SymbolType >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->FindSymbols((char const *)arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBSymbolContextList(static_cast< const lldb::SBSymbolContextList& >(result))), SWIGTYPE_p_lldb__SBSymbolContextList, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModule_FindSymbols__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModule *arg1 = (lldb::SBModule *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBSymbolContextList result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBModule_FindSymbols",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModule, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModule_FindSymbols" "', argument " "1"" of type '" "lldb::SBModule *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModule * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBModule_FindSymbols" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->FindSymbols((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBSymbolContextList(static_cast< const lldb::SBSymbolContextList& >(result))), SWIGTYPE_p_lldb__SBSymbolContextList, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModule_FindSymbols(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[4];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 3); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBModule, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        return _wrap_SBModule_FindSymbols__SWIG_1(self, args);
      }
    }
  }
  if (argc == 3) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBModule, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        {
          int res = SWIG_AsVal_int(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          return _wrap_SBModule_FindSymbols__SWIG_0(self, args);
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBModule_FindSymbols'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    FindSymbols(lldb::SBModule *,char const *,lldb::SymbolType)\n"
    "    FindSymbols(lldb::SBModule *,char const *)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModule_GetNumSections(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModule *arg1 = (lldb::SBModule *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  size_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBModule_GetNumSections",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModule, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModule_GetNumSections" "', argument " "1"" of type '" "lldb::SBModule *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModule * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetNumSections();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModule_GetSectionAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModule *arg1 = (lldb::SBModule *) 0 ;
  size_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  size_t val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBSection result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBModule_GetSectionAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModule, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModule_GetSectionAtIndex" "', argument " "1"" of type '" "lldb::SBModule *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModule * >(argp1);
  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBModule_GetSectionAtIndex" "', argument " "2"" of type '" "size_t""'");
  } 
  arg2 = static_cast< size_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetSectionAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBSection(static_cast< const lldb::SBSection& >(result))), SWIGTYPE_p_lldb__SBSection, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModule_FindFunctions__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModule *arg1 = (lldb::SBModule *) 0 ;
  char *arg2 = (char *) 0 ;
  uint32_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  unsigned int val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBSymbolContextList result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBModule_FindFunctions",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModule, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModule_FindFunctions" "', argument " "1"" of type '" "lldb::SBModule *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModule * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBModule_FindFunctions" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  ecode3 = SWIG_AsVal_unsigned_SS_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBModule_FindFunctions" "', argument " "3"" of type '" "uint32_t""'");
  } 
  arg3 = static_cast< uint32_t >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->FindFunctions((char const *)arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBSymbolContextList(static_cast< const lldb::SBSymbolContextList& >(result))), SWIGTYPE_p_lldb__SBSymbolContextList, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModule_FindFunctions__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModule *arg1 = (lldb::SBModule *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBSymbolContextList result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBModule_FindFunctions",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModule, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModule_FindFunctions" "', argument " "1"" of type '" "lldb::SBModule *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModule * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBModule_FindFunctions" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->FindFunctions((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBSymbolContextList(static_cast< const lldb::SBSymbolContextList& >(result))), SWIGTYPE_p_lldb__SBSymbolContextList, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModule_FindFunctions(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[4];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 3); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBModule, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        return _wrap_SBModule_FindFunctions__SWIG_1(self, args);
      }
    }
  }
  if (argc == 3) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBModule, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        {
          int res = SWIG_AsVal_unsigned_SS_int(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          return _wrap_SBModule_FindFunctions__SWIG_0(self, args);
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBModule_FindFunctions'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    FindFunctions(lldb::SBModule *,char const *,uint32_t)\n"
    "    FindFunctions(lldb::SBModule *,char const *)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModule_FindFirstType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModule *arg1 = (lldb::SBModule *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBType result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBModule_FindFirstType",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModule, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModule_FindFirstType" "', argument " "1"" of type '" "lldb::SBModule *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModule * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBModule_FindFirstType" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->FindFirstType((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBType(static_cast< const lldb::SBType& >(result))), SWIGTYPE_p_lldb__SBType, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModule_FindTypes(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModule *arg1 = (lldb::SBModule *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBTypeList result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBModule_FindTypes",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModule, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModule_FindTypes" "', argument " "1"" of type '" "lldb::SBModule *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModule * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBModule_FindTypes" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->FindTypes((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTypeList(static_cast< const lldb::SBTypeList& >(result))), SWIGTYPE_p_lldb__SBTypeList, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModule_GetTypeByID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModule *arg1 = (lldb::SBModule *) 0 ;
  lldb::user_id_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned long long val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBType result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBModule_GetTypeByID",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModule, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModule_GetTypeByID" "', argument " "1"" of type '" "lldb::SBModule *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModule * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_long_SS_long(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBModule_GetTypeByID" "', argument " "2"" of type '" "lldb::user_id_t""'");
  } 
  arg2 = static_cast< lldb::user_id_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetTypeByID(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBType(static_cast< const lldb::SBType& >(result))), SWIGTYPE_p_lldb__SBType, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModule_GetBasicType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModule *arg1 = (lldb::SBModule *) 0 ;
  lldb::BasicType arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBType result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBModule_GetBasicType",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModule, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModule_GetBasicType" "', argument " "1"" of type '" "lldb::SBModule *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModule * >(argp1);
  ecode2 = SWIG_AsVal_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBModule_GetBasicType" "', argument " "2"" of type '" "lldb::BasicType""'");
  } 
  arg2 = static_cast< lldb::BasicType >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetBasicType(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBType(static_cast< const lldb::SBType& >(result))), SWIGTYPE_p_lldb__SBType, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModule_GetTypes__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModule *arg1 = (lldb::SBModule *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBTypeList result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBModule_GetTypes",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModule, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModule_GetTypes" "', argument " "1"" of type '" "lldb::SBModule *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModule * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBModule_GetTypes" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetTypes(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTypeList(static_cast< const lldb::SBTypeList& >(result))), SWIGTYPE_p_lldb__SBTypeList, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModule_GetTypes__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModule *arg1 = (lldb::SBModule *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBTypeList result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBModule_GetTypes",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModule, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModule_GetTypes" "', argument " "1"" of type '" "lldb::SBModule *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModule * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetTypes();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTypeList(static_cast< const lldb::SBTypeList& >(result))), SWIGTYPE_p_lldb__SBTypeList, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModule_GetTypes(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[3];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 2); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 1) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBModule, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_SBModule_GetTypes__SWIG_1(self, args);
    }
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBModule, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_unsigned_SS_int(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        return _wrap_SBModule_GetTypes__SWIG_0(self, args);
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBModule_GetTypes'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    GetTypes(lldb::SBModule *,uint32_t)\n"
    "    GetTypes(lldb::SBModule *)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModule_FindGlobalVariables(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModule *arg1 = (lldb::SBModule *) 0 ;
  lldb::SBTarget *arg2 = 0 ;
  char *arg3 = (char *) 0 ;
  uint32_t arg4 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  int res3 ;
  char *buf3 = 0 ;
  int alloc3 = 0 ;
  unsigned int val4 ;
  int ecode4 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  lldb::SBValueList result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOO:SBModule_FindGlobalVariables",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModule, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModule_FindGlobalVariables" "', argument " "1"" of type '" "lldb::SBModule *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModule * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTarget,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBModule_FindGlobalVariables" "', argument " "2"" of type '" "lldb::SBTarget &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBModule_FindGlobalVariables" "', argument " "2"" of type '" "lldb::SBTarget &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBTarget * >(argp2);
  res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3);
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBModule_FindGlobalVariables" "', argument " "3"" of type '" "char const *""'");
  }
  arg3 = reinterpret_cast< char * >(buf3);
  ecode4 = SWIG_AsVal_unsigned_SS_int(obj3, &val4);
  if (!SWIG_IsOK(ecode4)) {
    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "SBModule_FindGlobalVariables" "', argument " "4"" of type '" "uint32_t""'");
  } 
  arg4 = static_cast< uint32_t >(val4);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->FindGlobalVariables(*arg2,(char const *)arg3,arg4);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBValueList(static_cast< const lldb::SBValueList& >(result))), SWIGTYPE_p_lldb__SBValueList, SWIG_POINTER_OWN |  0 );
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  return resultobj;
fail:
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModule_FindFirstGlobalVariable(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModule *arg1 = (lldb::SBModule *) 0 ;
  lldb::SBTarget *arg2 = 0 ;
  char *arg3 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  int res3 ;
  char *buf3 = 0 ;
  int alloc3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBValue result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBModule_FindFirstGlobalVariable",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModule, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModule_FindFirstGlobalVariable" "', argument " "1"" of type '" "lldb::SBModule *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModule * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTarget,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBModule_FindFirstGlobalVariable" "', argument " "2"" of type '" "lldb::SBTarget &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBModule_FindFirstGlobalVariable" "', argument " "2"" of type '" "lldb::SBTarget &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBTarget * >(argp2);
  res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3);
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBModule_FindFirstGlobalVariable" "', argument " "3"" of type '" "char const *""'");
  }
  arg3 = reinterpret_cast< char * >(buf3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->FindFirstGlobalVariable(*arg2,(char const *)arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBValue(static_cast< const lldb::SBValue& >(result))), SWIGTYPE_p_lldb__SBValue, SWIG_POINTER_OWN |  0 );
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  return resultobj;
fail:
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModule_GetByteOrder(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModule *arg1 = (lldb::SBModule *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::ByteOrder result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBModule_GetByteOrder",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModule, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModule_GetByteOrder" "', argument " "1"" of type '" "lldb::SBModule *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModule * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::ByteOrder)(arg1)->GetByteOrder();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModule_GetAddressByteSize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModule *arg1 = (lldb::SBModule *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBModule_GetAddressByteSize",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModule, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModule_GetAddressByteSize" "', argument " "1"" of type '" "lldb::SBModule *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModule * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetAddressByteSize();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModule_GetTriple(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModule *arg1 = (lldb::SBModule *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBModule_GetTriple",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModule, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModule_GetTriple" "', argument " "1"" of type '" "lldb::SBModule *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModule * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetTriple();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModule_GetVersion(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModule *arg1 = (lldb::SBModule *) 0 ;
  uint32_t *arg2 = (uint32_t *) 0 ;
  uint32_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  {
    arg2 = (uint32_t*)malloc(sizeof(uint32_t) * 50);
  }
  {
    arg3 = 50;
  }
  if (!PyArg_ParseTuple(args,(char *)"O:SBModule_GetVersion",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModule, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModule_GetVersion" "', argument " "1"" of type '" "lldb::SBModule *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModule * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetVersion(arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  {
    uint32_t count = result;
    if (count >= arg3)
    count = arg3;
    PyObject* list = PyList_New(count);
    for (uint32_t j = 0; j < count; j++)
    {
      if (arg2[j] < UINT32_MAX)
      {
        PyObject* item = PyInt_FromLong(arg2[j]);
        int ok = PyList_SetItem(list,j,item);
        if (ok != 0)
        {
          resultobj = Py_None;
          break;
        }
      }
      else
      break;
    }
    resultobj = list;
  }
  {
    free(arg2);
  }
  return resultobj;
fail:
  {
    free(arg2);
  }
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModule_GetSymbolFileSpec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModule *arg1 = (lldb::SBModule *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBFileSpec result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBModule_GetSymbolFileSpec",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModule, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModule_GetSymbolFileSpec" "', argument " "1"" of type '" "lldb::SBModule const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModule * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBModule const *)arg1)->GetSymbolFileSpec();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBFileSpec(static_cast< const lldb::SBFileSpec& >(result))), SWIGTYPE_p_lldb__SBFileSpec, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModule_GetObjectFileHeaderAddress(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModule *arg1 = (lldb::SBModule *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBAddress result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBModule_GetObjectFileHeaderAddress",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModule, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModule_GetObjectFileHeaderAddress" "', argument " "1"" of type '" "lldb::SBModule const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModule * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBModule const *)arg1)->GetObjectFileHeaderAddress();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBAddress(static_cast< const lldb::SBAddress& >(result))), SWIGTYPE_p_lldb__SBAddress, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModule_IsTypeSystemCompatible(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModule *arg1 = (lldb::SBModule *) 0 ;
  lldb::LanguageType arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBError result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBModule_IsTypeSystemCompatible",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModule, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModule_IsTypeSystemCompatible" "', argument " "1"" of type '" "lldb::SBModule *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModule * >(argp1);
  ecode2 = SWIG_AsVal_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBModule_IsTypeSystemCompatible" "', argument " "2"" of type '" "lldb::LanguageType""'");
  } 
  arg2 = static_cast< lldb::LanguageType >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->IsTypeSystemCompatible(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBError(static_cast< const lldb::SBError& >(result))), SWIGTYPE_p_lldb__SBError, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModule___eq__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModule *arg1 = (lldb::SBModule *) 0 ;
  lldb::SBModule *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBModule___eq__",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModule, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModule___eq__" "', argument " "1"" of type '" "lldb::SBModule const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModule * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBModule,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBModule___eq__" "', argument " "2"" of type '" "lldb::SBModule const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBModule___eq__" "', argument " "2"" of type '" "lldb::SBModule const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBModule * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBModule const *)arg1)->operator ==((lldb::SBModule const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModule___ne__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModule *arg1 = (lldb::SBModule *) 0 ;
  lldb::SBModule *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBModule___ne__",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModule, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModule___ne__" "', argument " "1"" of type '" "lldb::SBModule const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModule * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBModule,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBModule___ne__" "', argument " "2"" of type '" "lldb::SBModule const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBModule___ne__" "', argument " "2"" of type '" "lldb::SBModule const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBModule * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBModule const *)arg1)->operator !=((lldb::SBModule const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModule___str__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModule *arg1 = (lldb::SBModule *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBModule___str__",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModule, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModule___str__" "', argument " "1"" of type '" "lldb::SBModule *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModule * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (PyObject *)lldb_SBModule___str__(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = result;
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBModule_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBModule, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBModuleSpec__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModuleSpec *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBModuleSpec")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBModuleSpec *)new lldb::SBModuleSpec();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBModuleSpec, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBModuleSpec__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModuleSpec *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBModuleSpec *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBModuleSpec",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBModuleSpec,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBModuleSpec" "', argument " "1"" of type '" "lldb::SBModuleSpec const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBModuleSpec" "', argument " "1"" of type '" "lldb::SBModuleSpec const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModuleSpec * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBModuleSpec *)new lldb::SBModuleSpec((lldb::SBModuleSpec const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBModuleSpec, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBModuleSpec(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBModuleSpec__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBModuleSpec, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBModuleSpec__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBModuleSpec'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBModuleSpec()\n"
    "    lldb::SBModuleSpec(lldb::SBModuleSpec const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBModuleSpec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModuleSpec *arg1 = (lldb::SBModuleSpec *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBModuleSpec",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModuleSpec, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBModuleSpec" "', argument " "1"" of type '" "lldb::SBModuleSpec *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModuleSpec * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModuleSpec_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModuleSpec *arg1 = (lldb::SBModuleSpec *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBModuleSpec_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModuleSpec, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModuleSpec_IsValid" "', argument " "1"" of type '" "lldb::SBModuleSpec const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModuleSpec * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBModuleSpec const *)arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModuleSpec_Clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModuleSpec *arg1 = (lldb::SBModuleSpec *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBModuleSpec_Clear",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModuleSpec, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModuleSpec_Clear" "', argument " "1"" of type '" "lldb::SBModuleSpec *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModuleSpec * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->Clear();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModuleSpec_GetFileSpec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModuleSpec *arg1 = (lldb::SBModuleSpec *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBFileSpec result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBModuleSpec_GetFileSpec",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModuleSpec, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModuleSpec_GetFileSpec" "', argument " "1"" of type '" "lldb::SBModuleSpec *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModuleSpec * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetFileSpec();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBFileSpec(static_cast< const lldb::SBFileSpec& >(result))), SWIGTYPE_p_lldb__SBFileSpec, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModuleSpec_SetFileSpec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModuleSpec *arg1 = (lldb::SBModuleSpec *) 0 ;
  lldb::SBFileSpec *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBModuleSpec_SetFileSpec",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModuleSpec, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModuleSpec_SetFileSpec" "', argument " "1"" of type '" "lldb::SBModuleSpec *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModuleSpec * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBFileSpec,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBModuleSpec_SetFileSpec" "', argument " "2"" of type '" "lldb::SBFileSpec const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBModuleSpec_SetFileSpec" "', argument " "2"" of type '" "lldb::SBFileSpec const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBFileSpec * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetFileSpec((lldb::SBFileSpec const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModuleSpec_GetPlatformFileSpec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModuleSpec *arg1 = (lldb::SBModuleSpec *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBFileSpec result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBModuleSpec_GetPlatformFileSpec",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModuleSpec, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModuleSpec_GetPlatformFileSpec" "', argument " "1"" of type '" "lldb::SBModuleSpec *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModuleSpec * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetPlatformFileSpec();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBFileSpec(static_cast< const lldb::SBFileSpec& >(result))), SWIGTYPE_p_lldb__SBFileSpec, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModuleSpec_SetPlatformFileSpec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModuleSpec *arg1 = (lldb::SBModuleSpec *) 0 ;
  lldb::SBFileSpec *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBModuleSpec_SetPlatformFileSpec",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModuleSpec, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModuleSpec_SetPlatformFileSpec" "', argument " "1"" of type '" "lldb::SBModuleSpec *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModuleSpec * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBFileSpec,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBModuleSpec_SetPlatformFileSpec" "', argument " "2"" of type '" "lldb::SBFileSpec const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBModuleSpec_SetPlatformFileSpec" "', argument " "2"" of type '" "lldb::SBFileSpec const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBFileSpec * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetPlatformFileSpec((lldb::SBFileSpec const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModuleSpec_GetSymbolFileSpec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModuleSpec *arg1 = (lldb::SBModuleSpec *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBFileSpec result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBModuleSpec_GetSymbolFileSpec",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModuleSpec, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModuleSpec_GetSymbolFileSpec" "', argument " "1"" of type '" "lldb::SBModuleSpec *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModuleSpec * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetSymbolFileSpec();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBFileSpec(static_cast< const lldb::SBFileSpec& >(result))), SWIGTYPE_p_lldb__SBFileSpec, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModuleSpec_SetSymbolFileSpec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModuleSpec *arg1 = (lldb::SBModuleSpec *) 0 ;
  lldb::SBFileSpec *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBModuleSpec_SetSymbolFileSpec",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModuleSpec, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModuleSpec_SetSymbolFileSpec" "', argument " "1"" of type '" "lldb::SBModuleSpec *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModuleSpec * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBFileSpec,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBModuleSpec_SetSymbolFileSpec" "', argument " "2"" of type '" "lldb::SBFileSpec const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBModuleSpec_SetSymbolFileSpec" "', argument " "2"" of type '" "lldb::SBFileSpec const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBFileSpec * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetSymbolFileSpec((lldb::SBFileSpec const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModuleSpec_GetObjectName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModuleSpec *arg1 = (lldb::SBModuleSpec *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBModuleSpec_GetObjectName",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModuleSpec, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModuleSpec_GetObjectName" "', argument " "1"" of type '" "lldb::SBModuleSpec *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModuleSpec * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetObjectName();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModuleSpec_SetObjectName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModuleSpec *arg1 = (lldb::SBModuleSpec *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBModuleSpec_SetObjectName",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModuleSpec, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModuleSpec_SetObjectName" "', argument " "1"" of type '" "lldb::SBModuleSpec *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModuleSpec * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBModuleSpec_SetObjectName" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetObjectName((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModuleSpec_GetTriple(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModuleSpec *arg1 = (lldb::SBModuleSpec *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBModuleSpec_GetTriple",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModuleSpec, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModuleSpec_GetTriple" "', argument " "1"" of type '" "lldb::SBModuleSpec *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModuleSpec * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetTriple();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModuleSpec_SetTriple(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModuleSpec *arg1 = (lldb::SBModuleSpec *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBModuleSpec_SetTriple",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModuleSpec, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModuleSpec_SetTriple" "', argument " "1"" of type '" "lldb::SBModuleSpec *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModuleSpec * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBModuleSpec_SetTriple" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetTriple((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModuleSpec_GetUUIDBytes(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModuleSpec *arg1 = (lldb::SBModuleSpec *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint8_t *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBModuleSpec_GetUUIDBytes",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModuleSpec, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModuleSpec_GetUUIDBytes" "', argument " "1"" of type '" "lldb::SBModuleSpec *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModuleSpec * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint8_t *)(arg1)->GetUUIDBytes();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_unsigned_char, 0 |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModuleSpec_GetUUIDLength(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModuleSpec *arg1 = (lldb::SBModuleSpec *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  size_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBModuleSpec_GetUUIDLength",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModuleSpec, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModuleSpec_GetUUIDLength" "', argument " "1"" of type '" "lldb::SBModuleSpec *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModuleSpec * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetUUIDLength();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModuleSpec_SetUUIDBytes(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModuleSpec *arg1 = (lldb::SBModuleSpec *) 0 ;
  uint8_t *arg2 = (uint8_t *) 0 ;
  size_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  size_t val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBModuleSpec_SetUUIDBytes",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModuleSpec, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModuleSpec_SetUUIDBytes" "', argument " "1"" of type '" "lldb::SBModuleSpec *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModuleSpec * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_unsigned_char, 0 |  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBModuleSpec_SetUUIDBytes" "', argument " "2"" of type '" "uint8_t const *""'"); 
  }
  arg2 = reinterpret_cast< uint8_t * >(argp2);
  ecode3 = SWIG_AsVal_size_t(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBModuleSpec_SetUUIDBytes" "', argument " "3"" of type '" "size_t""'");
  } 
  arg3 = static_cast< size_t >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->SetUUIDBytes((uint8_t const *)arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModuleSpec_GetDescription(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModuleSpec *arg1 = (lldb::SBModuleSpec *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBModuleSpec_GetDescription",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModuleSpec, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModuleSpec_GetDescription" "', argument " "1"" of type '" "lldb::SBModuleSpec *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModuleSpec * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBModuleSpec_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBModuleSpec_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetDescription(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModuleSpec___str__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModuleSpec *arg1 = (lldb::SBModuleSpec *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBModuleSpec___str__",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModuleSpec, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModuleSpec___str__" "', argument " "1"" of type '" "lldb::SBModuleSpec *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModuleSpec * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (PyObject *)lldb_SBModuleSpec___str__(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = result;
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBModuleSpec_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBModuleSpec, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBModuleSpecList__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModuleSpecList *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBModuleSpecList")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBModuleSpecList *)new lldb::SBModuleSpecList();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBModuleSpecList, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBModuleSpecList__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModuleSpecList *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBModuleSpecList *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBModuleSpecList",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBModuleSpecList,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBModuleSpecList" "', argument " "1"" of type '" "lldb::SBModuleSpecList const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBModuleSpecList" "', argument " "1"" of type '" "lldb::SBModuleSpecList const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModuleSpecList * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBModuleSpecList *)new lldb::SBModuleSpecList((lldb::SBModuleSpecList const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBModuleSpecList, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBModuleSpecList(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBModuleSpecList__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBModuleSpecList, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBModuleSpecList__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBModuleSpecList'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBModuleSpecList()\n"
    "    lldb::SBModuleSpecList(lldb::SBModuleSpecList const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBModuleSpecList(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModuleSpecList *arg1 = (lldb::SBModuleSpecList *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBModuleSpecList",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModuleSpecList, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBModuleSpecList" "', argument " "1"" of type '" "lldb::SBModuleSpecList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModuleSpecList * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModuleSpecList_GetModuleSpecifications(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  char *arg1 = (char *) 0 ;
  int res1 ;
  char *buf1 = 0 ;
  int alloc1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBModuleSpecList result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBModuleSpecList_GetModuleSpecifications",&obj0)) SWIG_fail;
  res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModuleSpecList_GetModuleSpecifications" "', argument " "1"" of type '" "char const *""'");
  }
  arg1 = reinterpret_cast< char * >(buf1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = lldb::SBModuleSpecList::GetModuleSpecifications((char const *)arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBModuleSpecList(static_cast< const lldb::SBModuleSpecList& >(result))), SWIGTYPE_p_lldb__SBModuleSpecList, SWIG_POINTER_OWN |  0 );
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return resultobj;
fail:
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModuleSpecList_Append__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModuleSpecList *arg1 = (lldb::SBModuleSpecList *) 0 ;
  lldb::SBModuleSpec *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBModuleSpecList_Append",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModuleSpecList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModuleSpecList_Append" "', argument " "1"" of type '" "lldb::SBModuleSpecList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModuleSpecList * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBModuleSpec,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBModuleSpecList_Append" "', argument " "2"" of type '" "lldb::SBModuleSpec const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBModuleSpecList_Append" "', argument " "2"" of type '" "lldb::SBModuleSpec const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBModuleSpec * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->Append((lldb::SBModuleSpec const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModuleSpecList_Append__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModuleSpecList *arg1 = (lldb::SBModuleSpecList *) 0 ;
  lldb::SBModuleSpecList *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBModuleSpecList_Append",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModuleSpecList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModuleSpecList_Append" "', argument " "1"" of type '" "lldb::SBModuleSpecList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModuleSpecList * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBModuleSpecList,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBModuleSpecList_Append" "', argument " "2"" of type '" "lldb::SBModuleSpecList const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBModuleSpecList_Append" "', argument " "2"" of type '" "lldb::SBModuleSpecList const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBModuleSpecList * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->Append((lldb::SBModuleSpecList const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModuleSpecList_Append(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[3];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 2); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBModuleSpecList, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_lldb__SBModuleSpec, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        return _wrap_SBModuleSpecList_Append__SWIG_0(self, args);
      }
    }
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBModuleSpecList, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_lldb__SBModuleSpecList, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        return _wrap_SBModuleSpecList_Append__SWIG_1(self, args);
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBModuleSpecList_Append'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    Append(lldb::SBModuleSpecList *,lldb::SBModuleSpec const &)\n"
    "    Append(lldb::SBModuleSpecList *,lldb::SBModuleSpecList const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModuleSpecList_FindFirstMatchingSpec(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModuleSpecList *arg1 = (lldb::SBModuleSpecList *) 0 ;
  lldb::SBModuleSpec *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBModuleSpec result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBModuleSpecList_FindFirstMatchingSpec",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModuleSpecList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModuleSpecList_FindFirstMatchingSpec" "', argument " "1"" of type '" "lldb::SBModuleSpecList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModuleSpecList * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBModuleSpec,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBModuleSpecList_FindFirstMatchingSpec" "', argument " "2"" of type '" "lldb::SBModuleSpec const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBModuleSpecList_FindFirstMatchingSpec" "', argument " "2"" of type '" "lldb::SBModuleSpec const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBModuleSpec * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->FindFirstMatchingSpec((lldb::SBModuleSpec const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBModuleSpec(static_cast< const lldb::SBModuleSpec& >(result))), SWIGTYPE_p_lldb__SBModuleSpec, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModuleSpecList_FindMatchingSpecs(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModuleSpecList *arg1 = (lldb::SBModuleSpecList *) 0 ;
  lldb::SBModuleSpec *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBModuleSpecList result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBModuleSpecList_FindMatchingSpecs",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModuleSpecList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModuleSpecList_FindMatchingSpecs" "', argument " "1"" of type '" "lldb::SBModuleSpecList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModuleSpecList * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBModuleSpec,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBModuleSpecList_FindMatchingSpecs" "', argument " "2"" of type '" "lldb::SBModuleSpec const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBModuleSpecList_FindMatchingSpecs" "', argument " "2"" of type '" "lldb::SBModuleSpec const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBModuleSpec * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->FindMatchingSpecs((lldb::SBModuleSpec const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBModuleSpecList(static_cast< const lldb::SBModuleSpecList& >(result))), SWIGTYPE_p_lldb__SBModuleSpecList, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModuleSpecList_GetSize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModuleSpecList *arg1 = (lldb::SBModuleSpecList *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  size_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBModuleSpecList_GetSize",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModuleSpecList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModuleSpecList_GetSize" "', argument " "1"" of type '" "lldb::SBModuleSpecList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModuleSpecList * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetSize();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModuleSpecList_GetSpecAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModuleSpecList *arg1 = (lldb::SBModuleSpecList *) 0 ;
  size_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  size_t val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBModuleSpec result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBModuleSpecList_GetSpecAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModuleSpecList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModuleSpecList_GetSpecAtIndex" "', argument " "1"" of type '" "lldb::SBModuleSpecList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModuleSpecList * >(argp1);
  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBModuleSpecList_GetSpecAtIndex" "', argument " "2"" of type '" "size_t""'");
  } 
  arg2 = static_cast< size_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetSpecAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBModuleSpec(static_cast< const lldb::SBModuleSpec& >(result))), SWIGTYPE_p_lldb__SBModuleSpec, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModuleSpecList_GetDescription(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModuleSpecList *arg1 = (lldb::SBModuleSpecList *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBModuleSpecList_GetDescription",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModuleSpecList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModuleSpecList_GetDescription" "', argument " "1"" of type '" "lldb::SBModuleSpecList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModuleSpecList * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBModuleSpecList_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBModuleSpecList_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetDescription(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBModuleSpecList___str__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBModuleSpecList *arg1 = (lldb::SBModuleSpecList *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBModuleSpecList___str__",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBModuleSpecList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBModuleSpecList___str__" "', argument " "1"" of type '" "lldb::SBModuleSpecList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBModuleSpecList * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (PyObject *)lldb_SBModuleSpecList___str__(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = result;
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBModuleSpecList_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBModuleSpecList, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBPlatformConnectOptions__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  char *arg1 = (char *) 0 ;
  int res1 ;
  char *buf1 = 0 ;
  int alloc1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBPlatformConnectOptions *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBPlatformConnectOptions",&obj0)) SWIG_fail;
  res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBPlatformConnectOptions" "', argument " "1"" of type '" "char const *""'");
  }
  arg1 = reinterpret_cast< char * >(buf1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBPlatformConnectOptions *)new lldb::SBPlatformConnectOptions((char const *)arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBPlatformConnectOptions, SWIG_POINTER_NEW |  0 );
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return resultobj;
fail:
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBPlatformConnectOptions__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBPlatformConnectOptions *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBPlatformConnectOptions *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBPlatformConnectOptions",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBPlatformConnectOptions,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBPlatformConnectOptions" "', argument " "1"" of type '" "lldb::SBPlatformConnectOptions const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBPlatformConnectOptions" "', argument " "1"" of type '" "lldb::SBPlatformConnectOptions const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBPlatformConnectOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBPlatformConnectOptions *)new lldb::SBPlatformConnectOptions((lldb::SBPlatformConnectOptions const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBPlatformConnectOptions, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBPlatformConnectOptions(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBPlatformConnectOptions, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBPlatformConnectOptions__SWIG_1(self, args);
    }
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_AsCharPtrAndSize(argv[0], 0, NULL, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBPlatformConnectOptions__SWIG_0(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBPlatformConnectOptions'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBPlatformConnectOptions(char const *)\n"
    "    lldb::SBPlatformConnectOptions(lldb::SBPlatformConnectOptions const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBPlatformConnectOptions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBPlatformConnectOptions *arg1 = (lldb::SBPlatformConnectOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBPlatformConnectOptions",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBPlatformConnectOptions, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBPlatformConnectOptions" "', argument " "1"" of type '" "lldb::SBPlatformConnectOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBPlatformConnectOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBPlatformConnectOptions_GetURL(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBPlatformConnectOptions *arg1 = (lldb::SBPlatformConnectOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBPlatformConnectOptions_GetURL",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBPlatformConnectOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBPlatformConnectOptions_GetURL" "', argument " "1"" of type '" "lldb::SBPlatformConnectOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBPlatformConnectOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetURL();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBPlatformConnectOptions_SetURL(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBPlatformConnectOptions *arg1 = (lldb::SBPlatformConnectOptions *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBPlatformConnectOptions_SetURL",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBPlatformConnectOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBPlatformConnectOptions_SetURL" "', argument " "1"" of type '" "lldb::SBPlatformConnectOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBPlatformConnectOptions * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBPlatformConnectOptions_SetURL" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetURL((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBPlatformConnectOptions_GetRsyncEnabled(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBPlatformConnectOptions *arg1 = (lldb::SBPlatformConnectOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBPlatformConnectOptions_GetRsyncEnabled",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBPlatformConnectOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBPlatformConnectOptions_GetRsyncEnabled" "', argument " "1"" of type '" "lldb::SBPlatformConnectOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBPlatformConnectOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetRsyncEnabled();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBPlatformConnectOptions_EnableRsync(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBPlatformConnectOptions *arg1 = (lldb::SBPlatformConnectOptions *) 0 ;
  char *arg2 = (char *) 0 ;
  char *arg3 = (char *) 0 ;
  bool arg4 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  int res3 ;
  char *buf3 = 0 ;
  int alloc3 = 0 ;
  bool val4 ;
  int ecode4 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOO:SBPlatformConnectOptions_EnableRsync",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBPlatformConnectOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBPlatformConnectOptions_EnableRsync" "', argument " "1"" of type '" "lldb::SBPlatformConnectOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBPlatformConnectOptions * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBPlatformConnectOptions_EnableRsync" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3);
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBPlatformConnectOptions_EnableRsync" "', argument " "3"" of type '" "char const *""'");
  }
  arg3 = reinterpret_cast< char * >(buf3);
  ecode4 = SWIG_AsVal_bool(obj3, &val4);
  if (!SWIG_IsOK(ecode4)) {
    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "SBPlatformConnectOptions_EnableRsync" "', argument " "4"" of type '" "bool""'");
  } 
  arg4 = static_cast< bool >(val4);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->EnableRsync((char const *)arg2,(char const *)arg3,arg4);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBPlatformConnectOptions_DisableRsync(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBPlatformConnectOptions *arg1 = (lldb::SBPlatformConnectOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBPlatformConnectOptions_DisableRsync",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBPlatformConnectOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBPlatformConnectOptions_DisableRsync" "', argument " "1"" of type '" "lldb::SBPlatformConnectOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBPlatformConnectOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->DisableRsync();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBPlatformConnectOptions_GetLocalCacheDirectory(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBPlatformConnectOptions *arg1 = (lldb::SBPlatformConnectOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBPlatformConnectOptions_GetLocalCacheDirectory",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBPlatformConnectOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBPlatformConnectOptions_GetLocalCacheDirectory" "', argument " "1"" of type '" "lldb::SBPlatformConnectOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBPlatformConnectOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetLocalCacheDirectory();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBPlatformConnectOptions_SetLocalCacheDirectory(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBPlatformConnectOptions *arg1 = (lldb::SBPlatformConnectOptions *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBPlatformConnectOptions_SetLocalCacheDirectory",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBPlatformConnectOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBPlatformConnectOptions_SetLocalCacheDirectory" "', argument " "1"" of type '" "lldb::SBPlatformConnectOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBPlatformConnectOptions * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBPlatformConnectOptions_SetLocalCacheDirectory" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetLocalCacheDirectory((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *SBPlatformConnectOptions_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBPlatformConnectOptions, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBPlatformShellCommand__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  char *arg1 = (char *) 0 ;
  int res1 ;
  char *buf1 = 0 ;
  int alloc1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBPlatformShellCommand *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBPlatformShellCommand",&obj0)) SWIG_fail;
  res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBPlatformShellCommand" "', argument " "1"" of type '" "char const *""'");
  }
  arg1 = reinterpret_cast< char * >(buf1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBPlatformShellCommand *)new lldb::SBPlatformShellCommand((char const *)arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBPlatformShellCommand, SWIG_POINTER_NEW |  0 );
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return resultobj;
fail:
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBPlatformShellCommand__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBPlatformShellCommand *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBPlatformShellCommand *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBPlatformShellCommand",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBPlatformShellCommand,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBPlatformShellCommand" "', argument " "1"" of type '" "lldb::SBPlatformShellCommand const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBPlatformShellCommand" "', argument " "1"" of type '" "lldb::SBPlatformShellCommand const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBPlatformShellCommand * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBPlatformShellCommand *)new lldb::SBPlatformShellCommand((lldb::SBPlatformShellCommand const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBPlatformShellCommand, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBPlatformShellCommand(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBPlatformShellCommand, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBPlatformShellCommand__SWIG_1(self, args);
    }
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_AsCharPtrAndSize(argv[0], 0, NULL, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBPlatformShellCommand__SWIG_0(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBPlatformShellCommand'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBPlatformShellCommand(char const *)\n"
    "    lldb::SBPlatformShellCommand(lldb::SBPlatformShellCommand const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBPlatformShellCommand(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBPlatformShellCommand *arg1 = (lldb::SBPlatformShellCommand *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBPlatformShellCommand",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBPlatformShellCommand, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBPlatformShellCommand" "', argument " "1"" of type '" "lldb::SBPlatformShellCommand *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBPlatformShellCommand * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBPlatformShellCommand_Clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBPlatformShellCommand *arg1 = (lldb::SBPlatformShellCommand *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBPlatformShellCommand_Clear",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBPlatformShellCommand, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBPlatformShellCommand_Clear" "', argument " "1"" of type '" "lldb::SBPlatformShellCommand *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBPlatformShellCommand * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->Clear();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBPlatformShellCommand_GetCommand(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBPlatformShellCommand *arg1 = (lldb::SBPlatformShellCommand *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBPlatformShellCommand_GetCommand",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBPlatformShellCommand, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBPlatformShellCommand_GetCommand" "', argument " "1"" of type '" "lldb::SBPlatformShellCommand *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBPlatformShellCommand * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetCommand();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBPlatformShellCommand_SetCommand(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBPlatformShellCommand *arg1 = (lldb::SBPlatformShellCommand *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBPlatformShellCommand_SetCommand",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBPlatformShellCommand, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBPlatformShellCommand_SetCommand" "', argument " "1"" of type '" "lldb::SBPlatformShellCommand *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBPlatformShellCommand * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBPlatformShellCommand_SetCommand" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetCommand((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBPlatformShellCommand_GetWorkingDirectory(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBPlatformShellCommand *arg1 = (lldb::SBPlatformShellCommand *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBPlatformShellCommand_GetWorkingDirectory",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBPlatformShellCommand, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBPlatformShellCommand_GetWorkingDirectory" "', argument " "1"" of type '" "lldb::SBPlatformShellCommand *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBPlatformShellCommand * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetWorkingDirectory();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBPlatformShellCommand_SetWorkingDirectory(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBPlatformShellCommand *arg1 = (lldb::SBPlatformShellCommand *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBPlatformShellCommand_SetWorkingDirectory",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBPlatformShellCommand, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBPlatformShellCommand_SetWorkingDirectory" "', argument " "1"" of type '" "lldb::SBPlatformShellCommand *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBPlatformShellCommand * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBPlatformShellCommand_SetWorkingDirectory" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetWorkingDirectory((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBPlatformShellCommand_GetTimeoutSeconds(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBPlatformShellCommand *arg1 = (lldb::SBPlatformShellCommand *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBPlatformShellCommand_GetTimeoutSeconds",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBPlatformShellCommand, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBPlatformShellCommand_GetTimeoutSeconds" "', argument " "1"" of type '" "lldb::SBPlatformShellCommand *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBPlatformShellCommand * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetTimeoutSeconds();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBPlatformShellCommand_SetTimeoutSeconds(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBPlatformShellCommand *arg1 = (lldb::SBPlatformShellCommand *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBPlatformShellCommand_SetTimeoutSeconds",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBPlatformShellCommand, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBPlatformShellCommand_SetTimeoutSeconds" "', argument " "1"" of type '" "lldb::SBPlatformShellCommand *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBPlatformShellCommand * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBPlatformShellCommand_SetTimeoutSeconds" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetTimeoutSeconds(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBPlatformShellCommand_GetSignal(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBPlatformShellCommand *arg1 = (lldb::SBPlatformShellCommand *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  int result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBPlatformShellCommand_GetSignal",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBPlatformShellCommand, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBPlatformShellCommand_GetSignal" "', argument " "1"" of type '" "lldb::SBPlatformShellCommand *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBPlatformShellCommand * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (int)(arg1)->GetSignal();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBPlatformShellCommand_GetStatus(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBPlatformShellCommand *arg1 = (lldb::SBPlatformShellCommand *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  int result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBPlatformShellCommand_GetStatus",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBPlatformShellCommand, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBPlatformShellCommand_GetStatus" "', argument " "1"" of type '" "lldb::SBPlatformShellCommand *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBPlatformShellCommand * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (int)(arg1)->GetStatus();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBPlatformShellCommand_GetOutput(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBPlatformShellCommand *arg1 = (lldb::SBPlatformShellCommand *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBPlatformShellCommand_GetOutput",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBPlatformShellCommand, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBPlatformShellCommand_GetOutput" "', argument " "1"" of type '" "lldb::SBPlatformShellCommand *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBPlatformShellCommand * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetOutput();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBPlatformShellCommand_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBPlatformShellCommand, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBPlatform__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBPlatform *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBPlatform")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBPlatform *)new lldb::SBPlatform();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBPlatform, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBPlatform__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  char *arg1 = (char *) 0 ;
  int res1 ;
  char *buf1 = 0 ;
  int alloc1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBPlatform *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBPlatform",&obj0)) SWIG_fail;
  res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBPlatform" "', argument " "1"" of type '" "char const *""'");
  }
  arg1 = reinterpret_cast< char * >(buf1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBPlatform *)new lldb::SBPlatform((char const *)arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBPlatform, SWIG_POINTER_NEW |  0 );
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return resultobj;
fail:
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBPlatform(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBPlatform__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_AsCharPtrAndSize(argv[0], 0, NULL, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBPlatform__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBPlatform'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBPlatform()\n"
    "    lldb::SBPlatform(char const *)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBPlatform(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBPlatform *arg1 = (lldb::SBPlatform *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBPlatform",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBPlatform, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBPlatform" "', argument " "1"" of type '" "lldb::SBPlatform *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBPlatform * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBPlatform_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBPlatform *arg1 = (lldb::SBPlatform *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBPlatform_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBPlatform, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBPlatform_IsValid" "', argument " "1"" of type '" "lldb::SBPlatform const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBPlatform * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBPlatform const *)arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBPlatform_Clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBPlatform *arg1 = (lldb::SBPlatform *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBPlatform_Clear",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBPlatform, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBPlatform_Clear" "', argument " "1"" of type '" "lldb::SBPlatform *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBPlatform * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->Clear();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBPlatform_GetWorkingDirectory(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBPlatform *arg1 = (lldb::SBPlatform *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBPlatform_GetWorkingDirectory",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBPlatform, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBPlatform_GetWorkingDirectory" "', argument " "1"" of type '" "lldb::SBPlatform *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBPlatform * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetWorkingDirectory();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBPlatform_SetWorkingDirectory(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBPlatform *arg1 = (lldb::SBPlatform *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBPlatform_SetWorkingDirectory",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBPlatform, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBPlatform_SetWorkingDirectory" "', argument " "1"" of type '" "lldb::SBPlatform *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBPlatform * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBPlatform_SetWorkingDirectory" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->SetWorkingDirectory((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBPlatform_GetName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBPlatform *arg1 = (lldb::SBPlatform *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBPlatform_GetName",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBPlatform, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBPlatform_GetName" "', argument " "1"" of type '" "lldb::SBPlatform *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBPlatform * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetName();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBPlatform_ConnectRemote(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBPlatform *arg1 = (lldb::SBPlatform *) 0 ;
  lldb::SBPlatformConnectOptions *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBError result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBPlatform_ConnectRemote",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBPlatform, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBPlatform_ConnectRemote" "', argument " "1"" of type '" "lldb::SBPlatform *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBPlatform * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBPlatformConnectOptions,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBPlatform_ConnectRemote" "', argument " "2"" of type '" "lldb::SBPlatformConnectOptions &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBPlatform_ConnectRemote" "', argument " "2"" of type '" "lldb::SBPlatformConnectOptions &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBPlatformConnectOptions * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->ConnectRemote(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBError(static_cast< const lldb::SBError& >(result))), SWIGTYPE_p_lldb__SBError, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBPlatform_DisconnectRemote(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBPlatform *arg1 = (lldb::SBPlatform *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBPlatform_DisconnectRemote",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBPlatform, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBPlatform_DisconnectRemote" "', argument " "1"" of type '" "lldb::SBPlatform *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBPlatform * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->DisconnectRemote();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBPlatform_IsConnected(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBPlatform *arg1 = (lldb::SBPlatform *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBPlatform_IsConnected",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBPlatform, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBPlatform_IsConnected" "', argument " "1"" of type '" "lldb::SBPlatform *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBPlatform * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsConnected();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBPlatform_GetTriple(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBPlatform *arg1 = (lldb::SBPlatform *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBPlatform_GetTriple",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBPlatform, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBPlatform_GetTriple" "', argument " "1"" of type '" "lldb::SBPlatform *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBPlatform * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetTriple();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBPlatform_GetHostname(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBPlatform *arg1 = (lldb::SBPlatform *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBPlatform_GetHostname",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBPlatform, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBPlatform_GetHostname" "', argument " "1"" of type '" "lldb::SBPlatform *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBPlatform * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetHostname();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBPlatform_GetOSBuild(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBPlatform *arg1 = (lldb::SBPlatform *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBPlatform_GetOSBuild",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBPlatform, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBPlatform_GetOSBuild" "', argument " "1"" of type '" "lldb::SBPlatform *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBPlatform * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetOSBuild();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBPlatform_GetOSDescription(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBPlatform *arg1 = (lldb::SBPlatform *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBPlatform_GetOSDescription",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBPlatform, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBPlatform_GetOSDescription" "', argument " "1"" of type '" "lldb::SBPlatform *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBPlatform * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetOSDescription();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBPlatform_GetOSMajorVersion(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBPlatform *arg1 = (lldb::SBPlatform *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBPlatform_GetOSMajorVersion",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBPlatform, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBPlatform_GetOSMajorVersion" "', argument " "1"" of type '" "lldb::SBPlatform *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBPlatform * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetOSMajorVersion();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBPlatform_GetOSMinorVersion(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBPlatform *arg1 = (lldb::SBPlatform *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBPlatform_GetOSMinorVersion",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBPlatform, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBPlatform_GetOSMinorVersion" "', argument " "1"" of type '" "lldb::SBPlatform *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBPlatform * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetOSMinorVersion();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBPlatform_GetOSUpdateVersion(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBPlatform *arg1 = (lldb::SBPlatform *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBPlatform_GetOSUpdateVersion",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBPlatform, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBPlatform_GetOSUpdateVersion" "', argument " "1"" of type '" "lldb::SBPlatform *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBPlatform * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetOSUpdateVersion();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBPlatform_Get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBPlatform *arg1 = (lldb::SBPlatform *) 0 ;
  lldb::SBFileSpec *arg2 = 0 ;
  lldb::SBFileSpec *arg3 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  void *argp3 = 0 ;
  int res3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBError result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBPlatform_Get",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBPlatform, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBPlatform_Get" "', argument " "1"" of type '" "lldb::SBPlatform *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBPlatform * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBFileSpec,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBPlatform_Get" "', argument " "2"" of type '" "lldb::SBFileSpec &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBPlatform_Get" "', argument " "2"" of type '" "lldb::SBFileSpec &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBFileSpec * >(argp2);
  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBFileSpec,  0 );
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBPlatform_Get" "', argument " "3"" of type '" "lldb::SBFileSpec &""'"); 
  }
  if (!argp3) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBPlatform_Get" "', argument " "3"" of type '" "lldb::SBFileSpec &""'"); 
  }
  arg3 = reinterpret_cast< lldb::SBFileSpec * >(argp3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->Get(*arg2,*arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBError(static_cast< const lldb::SBError& >(result))), SWIGTYPE_p_lldb__SBError, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBPlatform_Put(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBPlatform *arg1 = (lldb::SBPlatform *) 0 ;
  lldb::SBFileSpec *arg2 = 0 ;
  lldb::SBFileSpec *arg3 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  void *argp3 = 0 ;
  int res3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBError result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBPlatform_Put",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBPlatform, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBPlatform_Put" "', argument " "1"" of type '" "lldb::SBPlatform *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBPlatform * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBFileSpec,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBPlatform_Put" "', argument " "2"" of type '" "lldb::SBFileSpec &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBPlatform_Put" "', argument " "2"" of type '" "lldb::SBFileSpec &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBFileSpec * >(argp2);
  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBFileSpec,  0 );
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBPlatform_Put" "', argument " "3"" of type '" "lldb::SBFileSpec &""'"); 
  }
  if (!argp3) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBPlatform_Put" "', argument " "3"" of type '" "lldb::SBFileSpec &""'"); 
  }
  arg3 = reinterpret_cast< lldb::SBFileSpec * >(argp3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->Put(*arg2,*arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBError(static_cast< const lldb::SBError& >(result))), SWIGTYPE_p_lldb__SBError, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBPlatform_Install(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBPlatform *arg1 = (lldb::SBPlatform *) 0 ;
  lldb::SBFileSpec *arg2 = 0 ;
  lldb::SBFileSpec *arg3 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  void *argp3 = 0 ;
  int res3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBError result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBPlatform_Install",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBPlatform, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBPlatform_Install" "', argument " "1"" of type '" "lldb::SBPlatform *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBPlatform * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBFileSpec,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBPlatform_Install" "', argument " "2"" of type '" "lldb::SBFileSpec &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBPlatform_Install" "', argument " "2"" of type '" "lldb::SBFileSpec &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBFileSpec * >(argp2);
  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBFileSpec,  0 );
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBPlatform_Install" "', argument " "3"" of type '" "lldb::SBFileSpec &""'"); 
  }
  if (!argp3) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBPlatform_Install" "', argument " "3"" of type '" "lldb::SBFileSpec &""'"); 
  }
  arg3 = reinterpret_cast< lldb::SBFileSpec * >(argp3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->Install(*arg2,*arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBError(static_cast< const lldb::SBError& >(result))), SWIGTYPE_p_lldb__SBError, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBPlatform_Run(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBPlatform *arg1 = (lldb::SBPlatform *) 0 ;
  lldb::SBPlatformShellCommand *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBError result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBPlatform_Run",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBPlatform, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBPlatform_Run" "', argument " "1"" of type '" "lldb::SBPlatform *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBPlatform * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBPlatformShellCommand,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBPlatform_Run" "', argument " "2"" of type '" "lldb::SBPlatformShellCommand &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBPlatform_Run" "', argument " "2"" of type '" "lldb::SBPlatformShellCommand &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBPlatformShellCommand * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->Run(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBError(static_cast< const lldb::SBError& >(result))), SWIGTYPE_p_lldb__SBError, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBPlatform_Launch(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBPlatform *arg1 = (lldb::SBPlatform *) 0 ;
  lldb::SBLaunchInfo *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBError result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBPlatform_Launch",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBPlatform, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBPlatform_Launch" "', argument " "1"" of type '" "lldb::SBPlatform *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBPlatform * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBLaunchInfo,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBPlatform_Launch" "', argument " "2"" of type '" "lldb::SBLaunchInfo &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBPlatform_Launch" "', argument " "2"" of type '" "lldb::SBLaunchInfo &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBLaunchInfo * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->Launch(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBError(static_cast< const lldb::SBError& >(result))), SWIGTYPE_p_lldb__SBError, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBPlatform_Kill(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBPlatform *arg1 = (lldb::SBPlatform *) 0 ;
  lldb::pid_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned long long val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBError result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBPlatform_Kill",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBPlatform, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBPlatform_Kill" "', argument " "1"" of type '" "lldb::SBPlatform *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBPlatform * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_long_SS_long(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBPlatform_Kill" "', argument " "2"" of type '" "lldb::pid_t""'");
  } 
  arg2 = static_cast< lldb::pid_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->Kill(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBError(static_cast< const lldb::SBError& >(result))), SWIGTYPE_p_lldb__SBError, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBPlatform_MakeDirectory__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBPlatform *arg1 = (lldb::SBPlatform *) 0 ;
  char *arg2 = (char *) 0 ;
  uint32_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  unsigned int val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBError result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBPlatform_MakeDirectory",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBPlatform, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBPlatform_MakeDirectory" "', argument " "1"" of type '" "lldb::SBPlatform *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBPlatform * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBPlatform_MakeDirectory" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  ecode3 = SWIG_AsVal_unsigned_SS_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBPlatform_MakeDirectory" "', argument " "3"" of type '" "uint32_t""'");
  } 
  arg3 = static_cast< uint32_t >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->MakeDirectory((char const *)arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBError(static_cast< const lldb::SBError& >(result))), SWIGTYPE_p_lldb__SBError, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBPlatform_MakeDirectory__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBPlatform *arg1 = (lldb::SBPlatform *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBError result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBPlatform_MakeDirectory",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBPlatform, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBPlatform_MakeDirectory" "', argument " "1"" of type '" "lldb::SBPlatform *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBPlatform * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBPlatform_MakeDirectory" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->MakeDirectory((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBError(static_cast< const lldb::SBError& >(result))), SWIGTYPE_p_lldb__SBError, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBPlatform_MakeDirectory(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[4];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 3); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBPlatform, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        return _wrap_SBPlatform_MakeDirectory__SWIG_1(self, args);
      }
    }
  }
  if (argc == 3) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBPlatform, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        {
          int res = SWIG_AsVal_unsigned_SS_int(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          return _wrap_SBPlatform_MakeDirectory__SWIG_0(self, args);
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBPlatform_MakeDirectory'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    MakeDirectory(lldb::SBPlatform *,char const *,uint32_t)\n"
    "    MakeDirectory(lldb::SBPlatform *,char const *)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBPlatform_GetFilePermissions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBPlatform *arg1 = (lldb::SBPlatform *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBPlatform_GetFilePermissions",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBPlatform, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBPlatform_GetFilePermissions" "', argument " "1"" of type '" "lldb::SBPlatform *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBPlatform * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBPlatform_GetFilePermissions" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetFilePermissions((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBPlatform_SetFilePermissions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBPlatform *arg1 = (lldb::SBPlatform *) 0 ;
  char *arg2 = (char *) 0 ;
  uint32_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  unsigned int val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBError result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBPlatform_SetFilePermissions",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBPlatform, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBPlatform_SetFilePermissions" "', argument " "1"" of type '" "lldb::SBPlatform *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBPlatform * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBPlatform_SetFilePermissions" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  ecode3 = SWIG_AsVal_unsigned_SS_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBPlatform_SetFilePermissions" "', argument " "3"" of type '" "uint32_t""'");
  } 
  arg3 = static_cast< uint32_t >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->SetFilePermissions((char const *)arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBError(static_cast< const lldb::SBError& >(result))), SWIGTYPE_p_lldb__SBError, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBPlatform_GetUnixSignals(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBPlatform *arg1 = (lldb::SBPlatform *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBUnixSignals result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBPlatform_GetUnixSignals",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBPlatform, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBPlatform_GetUnixSignals" "', argument " "1"" of type '" "lldb::SBPlatform *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBPlatform * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetUnixSignals();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBUnixSignals(static_cast< const lldb::SBUnixSignals& >(result))), SWIGTYPE_p_lldb__SBUnixSignals, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBPlatform_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBPlatform, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBProcess__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBProcess")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBProcess *)new lldb::SBProcess();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBProcess, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBProcess__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBProcess *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBProcess",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBProcess,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBProcess" "', argument " "1"" of type '" "lldb::SBProcess const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBProcess" "', argument " "1"" of type '" "lldb::SBProcess const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBProcess *)new lldb::SBProcess((lldb::SBProcess const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBProcess, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBProcess(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBProcess__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBProcess, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBProcess__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBProcess'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBProcess()\n"
    "    lldb::SBProcess(lldb::SBProcess const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBProcess(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBProcess",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBProcess" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_GetBroadcasterClassName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":SBProcess_GetBroadcasterClassName")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)lldb::SBProcess::GetBroadcasterClassName();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_GetPluginName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBProcess_GetPluginName",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_GetPluginName" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetPluginName();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_GetShortPluginName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBProcess_GetShortPluginName",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_GetShortPluginName" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetShortPluginName();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_Clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBProcess_Clear",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_Clear" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->Clear();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBProcess_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_IsValid" "', argument " "1"" of type '" "lldb::SBProcess const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBProcess const *)arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_GetTarget(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBTarget result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBProcess_GetTarget",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_GetTarget" "', argument " "1"" of type '" "lldb::SBProcess const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBProcess const *)arg1)->GetTarget();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTarget(static_cast< const lldb::SBTarget& >(result))), SWIGTYPE_p_lldb__SBTarget, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_GetByteOrder(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::ByteOrder result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBProcess_GetByteOrder",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_GetByteOrder" "', argument " "1"" of type '" "lldb::SBProcess const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::ByteOrder)((lldb::SBProcess const *)arg1)->GetByteOrder();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_PutSTDIN(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  char *arg2 = (char *) 0 ;
  size_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  size_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBProcess_PutSTDIN",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_PutSTDIN" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  {
    using namespace lldb_private;
    if (PythonString::Check(obj1)) {
      PythonString str(PyRefType::Borrowed, obj1);
      arg2 = (char*)str.GetString().data();
      arg3 = str.GetSize();
    }
    else if(PythonByteArray::Check(obj1)) {
      PythonByteArray bytearray(PyRefType::Borrowed, obj1);
      arg2 = (char*)bytearray.GetBytes().data();
      arg3 = bytearray.GetSize();
    }
    else if (PythonBytes::Check(obj1)) {
      PythonBytes bytes(PyRefType::Borrowed, obj1);
      arg2 = (char*)bytes.GetBytes().data();
      arg3 = bytes.GetSize();
    }
    else {
      PyErr_SetString(PyExc_ValueError, "Expecting a string");
      return NULL;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->PutSTDIN((char const *)arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_GetSTDOUT(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  char *arg2 = (char *) 0 ;
  size_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  size_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBProcess_GetSTDOUT",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_GetSTDOUT" "', argument " "1"" of type '" "lldb::SBProcess const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  {
    if (!PyInt_Check(obj1)) {
      PyErr_SetString(PyExc_ValueError, "Expecting an integer");
      return NULL;
    }
    arg3 = PyInt_AsLong(obj1);
    if (arg3 <= 0) {
      PyErr_SetString(PyExc_ValueError, "Positive integer expected");
      return NULL;
    }
    arg2 = (char *) malloc(arg3);
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBProcess const *)arg1)->GetSTDOUT(arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
  {
    Py_XDECREF(resultobj);   /* Blow away any previous result */
    if (result == 0) {
      lldb_private::PythonString string("");
      resultobj = string.release();
      Py_INCREF(resultobj);
    } else {
      llvm::StringRef ref(static_cast<const char*>(arg2), result);
      lldb_private::PythonString string(ref);
      resultobj = string.release();
    }
    free(arg2);
  }
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_GetSTDERR(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  char *arg2 = (char *) 0 ;
  size_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  size_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBProcess_GetSTDERR",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_GetSTDERR" "', argument " "1"" of type '" "lldb::SBProcess const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  {
    if (!PyInt_Check(obj1)) {
      PyErr_SetString(PyExc_ValueError, "Expecting an integer");
      return NULL;
    }
    arg3 = PyInt_AsLong(obj1);
    if (arg3 <= 0) {
      PyErr_SetString(PyExc_ValueError, "Positive integer expected");
      return NULL;
    }
    arg2 = (char *) malloc(arg3);
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBProcess const *)arg1)->GetSTDERR(arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
  {
    Py_XDECREF(resultobj);   /* Blow away any previous result */
    if (result == 0) {
      lldb_private::PythonString string("");
      resultobj = string.release();
      Py_INCREF(resultobj);
    } else {
      llvm::StringRef ref(static_cast<const char*>(arg2), result);
      lldb_private::PythonString string(ref);
      resultobj = string.release();
    }
    free(arg2);
  }
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_GetAsyncProfileData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  char *arg2 = (char *) 0 ;
  size_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  size_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBProcess_GetAsyncProfileData",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_GetAsyncProfileData" "', argument " "1"" of type '" "lldb::SBProcess const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  {
    if (!PyInt_Check(obj1)) {
      PyErr_SetString(PyExc_ValueError, "Expecting an integer");
      return NULL;
    }
    arg3 = PyInt_AsLong(obj1);
    if (arg3 <= 0) {
      PyErr_SetString(PyExc_ValueError, "Positive integer expected");
      return NULL;
    }
    arg2 = (char *) malloc(arg3);
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBProcess const *)arg1)->GetAsyncProfileData(arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
  {
    Py_XDECREF(resultobj);   /* Blow away any previous result */
    if (result == 0) {
      lldb_private::PythonString string("");
      resultobj = string.release();
      Py_INCREF(resultobj);
    } else {
      llvm::StringRef ref(static_cast<const char*>(arg2), result);
      lldb_private::PythonString string(ref);
      resultobj = string.release();
    }
    free(arg2);
  }
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_ReportEventState(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  lldb::SBEvent *arg2 = 0 ;
  FILE *arg3 = (FILE *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBProcess_ReportEventState",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_ReportEventState" "', argument " "1"" of type '" "lldb::SBProcess const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBEvent,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBProcess_ReportEventState" "', argument " "2"" of type '" "lldb::SBEvent const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBProcess_ReportEventState" "', argument " "2"" of type '" "lldb::SBEvent const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBEvent * >(argp2);
  {
    using namespace lldb_private;
    if (obj2 == Py_None)
    arg3 = nullptr;
    else if (!lldb_private::PythonFile::Check(obj2)) {
      int fd = PyObject_AsFileDescriptor(obj2);
      PythonObject py_input(PyRefType::Borrowed, obj2);
      PythonString py_mode = py_input.GetAttributeValue("mode").AsType<PythonString>();
      
      if (-1 != fd && py_mode.IsValid()) {
        FILE *f;
        if ((f = fdopen(fd, py_mode.GetString().str().c_str())))
        arg3 = f;
        else
        PyErr_SetString(PyExc_TypeError, strerror(errno));
      } else {
        PyErr_SetString(PyExc_TypeError,"not a file-like object");
        return nullptr;
      }
    }
    else
    {
      PythonFile py_file(PyRefType::Borrowed, obj2);
      File file;
      if (!py_file.GetUnderlyingFile(file))
      return nullptr;
      
      arg3 = file.GetStream();
      if (arg3)
      file.Clear();
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    ((lldb::SBProcess const *)arg1)->ReportEventState((lldb::SBEvent const &)*arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_AppendEventStateReport(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  lldb::SBEvent *arg2 = 0 ;
  lldb::SBCommandReturnObject *arg3 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  void *argp3 = 0 ;
  int res3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBProcess_AppendEventStateReport",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_AppendEventStateReport" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBEvent,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBProcess_AppendEventStateReport" "', argument " "2"" of type '" "lldb::SBEvent const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBProcess_AppendEventStateReport" "', argument " "2"" of type '" "lldb::SBEvent const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBEvent * >(argp2);
  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBCommandReturnObject,  0 );
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBProcess_AppendEventStateReport" "', argument " "3"" of type '" "lldb::SBCommandReturnObject &""'"); 
  }
  if (!argp3) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBProcess_AppendEventStateReport" "', argument " "3"" of type '" "lldb::SBCommandReturnObject &""'"); 
  }
  arg3 = reinterpret_cast< lldb::SBCommandReturnObject * >(argp3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->AppendEventStateReport((lldb::SBEvent const &)*arg2,*arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_RemoteAttachToProcessWithID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  lldb::pid_t arg2 ;
  lldb::SBError *arg3 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned long long val2 ;
  int ecode2 = 0 ;
  void *argp3 = 0 ;
  int res3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBProcess_RemoteAttachToProcessWithID",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_RemoteAttachToProcessWithID" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_long_SS_long(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBProcess_RemoteAttachToProcessWithID" "', argument " "2"" of type '" "lldb::pid_t""'");
  } 
  arg2 = static_cast< lldb::pid_t >(val2);
  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBProcess_RemoteAttachToProcessWithID" "', argument " "3"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp3) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBProcess_RemoteAttachToProcessWithID" "', argument " "3"" of type '" "lldb::SBError &""'"); 
  }
  arg3 = reinterpret_cast< lldb::SBError * >(argp3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->RemoteAttachToProcessWithID(arg2,*arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_RemoteLaunch(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  char **arg2 = (char **) 0 ;
  char **arg3 = (char **) 0 ;
  char *arg4 = (char *) 0 ;
  char *arg5 = (char *) 0 ;
  char *arg6 = (char *) 0 ;
  char *arg7 = (char *) 0 ;
  uint32_t arg8 ;
  bool arg9 ;
  lldb::SBError *arg10 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res4 ;
  char *buf4 = 0 ;
  int alloc4 = 0 ;
  int res5 ;
  char *buf5 = 0 ;
  int alloc5 = 0 ;
  int res6 ;
  char *buf6 = 0 ;
  int alloc6 = 0 ;
  int res7 ;
  char *buf7 = 0 ;
  int alloc7 = 0 ;
  unsigned int val8 ;
  int ecode8 = 0 ;
  bool val9 ;
  int ecode9 = 0 ;
  void *argp10 = 0 ;
  int res10 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  PyObject * obj4 = 0 ;
  PyObject * obj5 = 0 ;
  PyObject * obj6 = 0 ;
  PyObject * obj7 = 0 ;
  PyObject * obj8 = 0 ;
  PyObject * obj9 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOOOOOOOO:SBProcess_RemoteLaunch",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_RemoteLaunch" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  {
    using namespace lldb_private;
    /* Check if is a list  */
    if (PythonList::Check(obj1)) {
      PythonList list(PyRefType::Borrowed, obj1);
      int size = list.GetSize();
      int i = 0;
      arg2 = (char**)malloc((size+1)*sizeof(char*));
      for (i = 0; i < size; i++) {
        PythonString py_str = list.GetItemAtIndex(i).AsType<PythonString>();
        if (!py_str.IsAllocated()) {
          PyErr_SetString(PyExc_TypeError,"list must contain strings");
          free(arg2);
          return nullptr;
        }
        
        arg2[i] = const_cast<char*>(py_str.GetString().data());
      }
      arg2[i] = 0;
    } else if (obj1 == Py_None) {
      arg2 =  NULL;
    } else {
      PyErr_SetString(PyExc_TypeError,"not a list");
      return NULL;
    }
  }
  {
    using namespace lldb_private;
    /* Check if is a list  */
    if (PythonList::Check(obj2)) {
      PythonList list(PyRefType::Borrowed, obj2);
      int size = list.GetSize();
      int i = 0;
      arg3 = (char**)malloc((size+1)*sizeof(char*));
      for (i = 0; i < size; i++) {
        PythonString py_str = list.GetItemAtIndex(i).AsType<PythonString>();
        if (!py_str.IsAllocated()) {
          PyErr_SetString(PyExc_TypeError,"list must contain strings");
          free(arg3);
          return nullptr;
        }
        
        arg3[i] = const_cast<char*>(py_str.GetString().data());
      }
      arg3[i] = 0;
    } else if (obj2 == Py_None) {
      arg3 =  NULL;
    } else {
      PyErr_SetString(PyExc_TypeError,"not a list");
      return NULL;
    }
  }
  res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4);
  if (!SWIG_IsOK(res4)) {
    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "SBProcess_RemoteLaunch" "', argument " "4"" of type '" "char const *""'");
  }
  arg4 = reinterpret_cast< char * >(buf4);
  res5 = SWIG_AsCharPtrAndSize(obj4, &buf5, NULL, &alloc5);
  if (!SWIG_IsOK(res5)) {
    SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "SBProcess_RemoteLaunch" "', argument " "5"" of type '" "char const *""'");
  }
  arg5 = reinterpret_cast< char * >(buf5);
  res6 = SWIG_AsCharPtrAndSize(obj5, &buf6, NULL, &alloc6);
  if (!SWIG_IsOK(res6)) {
    SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "SBProcess_RemoteLaunch" "', argument " "6"" of type '" "char const *""'");
  }
  arg6 = reinterpret_cast< char * >(buf6);
  res7 = SWIG_AsCharPtrAndSize(obj6, &buf7, NULL, &alloc7);
  if (!SWIG_IsOK(res7)) {
    SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "SBProcess_RemoteLaunch" "', argument " "7"" of type '" "char const *""'");
  }
  arg7 = reinterpret_cast< char * >(buf7);
  ecode8 = SWIG_AsVal_unsigned_SS_int(obj7, &val8);
  if (!SWIG_IsOK(ecode8)) {
    SWIG_exception_fail(SWIG_ArgError(ecode8), "in method '" "SBProcess_RemoteLaunch" "', argument " "8"" of type '" "uint32_t""'");
  } 
  arg8 = static_cast< uint32_t >(val8);
  ecode9 = SWIG_AsVal_bool(obj8, &val9);
  if (!SWIG_IsOK(ecode9)) {
    SWIG_exception_fail(SWIG_ArgError(ecode9), "in method '" "SBProcess_RemoteLaunch" "', argument " "9"" of type '" "bool""'");
  } 
  arg9 = static_cast< bool >(val9);
  res10 = SWIG_ConvertPtr(obj9, &argp10, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res10)) {
    SWIG_exception_fail(SWIG_ArgError(res10), "in method '" "SBProcess_RemoteLaunch" "', argument " "10"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp10) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBProcess_RemoteLaunch" "', argument " "10"" of type '" "lldb::SBError &""'"); 
  }
  arg10 = reinterpret_cast< lldb::SBError * >(argp10);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->RemoteLaunch((char const **)arg2,(char const **)arg3,(char const *)arg4,(char const *)arg5,(char const *)arg6,(char const *)arg7,arg8,arg9,*arg10);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  {
    free((char *) arg2);
  }
  {
    free((char *) arg3);
  }
  if (alloc4 == SWIG_NEWOBJ) delete[] buf4;
  if (alloc5 == SWIG_NEWOBJ) delete[] buf5;
  if (alloc6 == SWIG_NEWOBJ) delete[] buf6;
  if (alloc7 == SWIG_NEWOBJ) delete[] buf7;
  return resultobj;
fail:
  {
    free((char *) arg2);
  }
  {
    free((char *) arg3);
  }
  if (alloc4 == SWIG_NEWOBJ) delete[] buf4;
  if (alloc5 == SWIG_NEWOBJ) delete[] buf5;
  if (alloc6 == SWIG_NEWOBJ) delete[] buf6;
  if (alloc7 == SWIG_NEWOBJ) delete[] buf7;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_GetNumThreads(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBProcess_GetNumThreads",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_GetNumThreads" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetNumThreads();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_GetThreadAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  size_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  size_t val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBThread result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBProcess_GetThreadAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_GetThreadAtIndex" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBProcess_GetThreadAtIndex" "', argument " "2"" of type '" "size_t""'");
  } 
  arg2 = static_cast< size_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetThreadAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBThread(static_cast< const lldb::SBThread& >(result))), SWIGTYPE_p_lldb__SBThread, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_GetThreadByID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  lldb::tid_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBThread result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBProcess_GetThreadByID",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_GetThreadByID" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  {
    using namespace lldb_private;
    if (PythonInteger::Check(obj1))
    {
      PythonInteger py_int(PyRefType::Borrowed, obj1);
      arg2 = static_cast<lldb::tid_t>(py_int.GetInteger());
    }
    else
    {
      PyErr_SetString(PyExc_ValueError, "Expecting an integer");
      return nullptr;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetThreadByID(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBThread(static_cast< const lldb::SBThread& >(result))), SWIGTYPE_p_lldb__SBThread, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_GetThreadByIndexID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBThread result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBProcess_GetThreadByIndexID",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_GetThreadByIndexID" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBProcess_GetThreadByIndexID" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetThreadByIndexID(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBThread(static_cast< const lldb::SBThread& >(result))), SWIGTYPE_p_lldb__SBThread, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_GetSelectedThread(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBThread result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBProcess_GetSelectedThread",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_GetSelectedThread" "', argument " "1"" of type '" "lldb::SBProcess const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBProcess const *)arg1)->GetSelectedThread();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBThread(static_cast< const lldb::SBThread& >(result))), SWIGTYPE_p_lldb__SBThread, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_CreateOSPluginThread(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  lldb::tid_t arg2 ;
  lldb::addr_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned long long val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBThread result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBProcess_CreateOSPluginThread",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_CreateOSPluginThread" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  {
    using namespace lldb_private;
    if (PythonInteger::Check(obj1))
    {
      PythonInteger py_int(PyRefType::Borrowed, obj1);
      arg2 = static_cast<lldb::tid_t>(py_int.GetInteger());
    }
    else
    {
      PyErr_SetString(PyExc_ValueError, "Expecting an integer");
      return nullptr;
    }
  }
  ecode3 = SWIG_AsVal_unsigned_SS_long_SS_long(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBProcess_CreateOSPluginThread" "', argument " "3"" of type '" "lldb::addr_t""'");
  } 
  arg3 = static_cast< lldb::addr_t >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->CreateOSPluginThread(arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBThread(static_cast< const lldb::SBThread& >(result))), SWIGTYPE_p_lldb__SBThread, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_SetSelectedThread(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  lldb::SBThread *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBProcess_SetSelectedThread",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_SetSelectedThread" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBThread,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBProcess_SetSelectedThread" "', argument " "2"" of type '" "lldb::SBThread const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBProcess_SetSelectedThread" "', argument " "2"" of type '" "lldb::SBThread const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBThread * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->SetSelectedThread((lldb::SBThread const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_SetSelectedThreadByID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  lldb::tid_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBProcess_SetSelectedThreadByID",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_SetSelectedThreadByID" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  {
    using namespace lldb_private;
    if (PythonInteger::Check(obj1))
    {
      PythonInteger py_int(PyRefType::Borrowed, obj1);
      arg2 = static_cast<lldb::tid_t>(py_int.GetInteger());
    }
    else
    {
      PyErr_SetString(PyExc_ValueError, "Expecting an integer");
      return nullptr;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->SetSelectedThreadByID(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_SetSelectedThreadByIndexID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBProcess_SetSelectedThreadByIndexID",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_SetSelectedThreadByIndexID" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBProcess_SetSelectedThreadByIndexID" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->SetSelectedThreadByIndexID(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_GetNumQueues(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBProcess_GetNumQueues",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_GetNumQueues" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetNumQueues();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_GetQueueAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBQueue result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBProcess_GetQueueAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_GetQueueAtIndex" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBProcess_GetQueueAtIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetQueueAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBQueue(static_cast< const lldb::SBQueue& >(result))), SWIGTYPE_p_lldb__SBQueue, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_GetState(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::StateType result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBProcess_GetState",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_GetState" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::StateType)(arg1)->GetState();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_GetExitStatus(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  int result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBProcess_GetExitStatus",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_GetExitStatus" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (int)(arg1)->GetExitStatus();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_GetExitDescription(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBProcess_GetExitDescription",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_GetExitDescription" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetExitDescription();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_GetProcessID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::pid_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBProcess_GetProcessID",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_GetProcessID" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::pid_t)(arg1)->GetProcessID();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_GetUniqueID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBProcess_GetUniqueID",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_GetUniqueID" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetUniqueID();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_GetAddressByteSize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBProcess_GetAddressByteSize",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_GetAddressByteSize" "', argument " "1"" of type '" "lldb::SBProcess const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)((lldb::SBProcess const *)arg1)->GetAddressByteSize();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_Destroy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBError result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBProcess_Destroy",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_Destroy" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->Destroy();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBError(static_cast< const lldb::SBError& >(result))), SWIGTYPE_p_lldb__SBError, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_Continue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBError result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBProcess_Continue",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_Continue" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->Continue();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBError(static_cast< const lldb::SBError& >(result))), SWIGTYPE_p_lldb__SBError, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_Stop(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBError result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBProcess_Stop",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_Stop" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->Stop();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBError(static_cast< const lldb::SBError& >(result))), SWIGTYPE_p_lldb__SBError, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_Kill(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBError result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBProcess_Kill",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_Kill" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->Kill();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBError(static_cast< const lldb::SBError& >(result))), SWIGTYPE_p_lldb__SBError, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_Detach(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBError result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBProcess_Detach",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_Detach" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->Detach();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBError(static_cast< const lldb::SBError& >(result))), SWIGTYPE_p_lldb__SBError, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_Signal(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  int arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBError result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBProcess_Signal",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_Signal" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  ecode2 = SWIG_AsVal_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBProcess_Signal" "', argument " "2"" of type '" "int""'");
  } 
  arg2 = static_cast< int >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->Signal(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBError(static_cast< const lldb::SBError& >(result))), SWIGTYPE_p_lldb__SBError, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_GetUnixSignals(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBUnixSignals result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBProcess_GetUnixSignals",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_GetUnixSignals" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetUnixSignals();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBUnixSignals(static_cast< const lldb::SBUnixSignals& >(result))), SWIGTYPE_p_lldb__SBUnixSignals, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_GetStopID__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBProcess_GetStopID",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_GetStopID" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBProcess_GetStopID" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetStopID(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_GetStopID__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBProcess_GetStopID",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_GetStopID" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetStopID();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_GetStopID(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[3];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 2); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 1) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBProcess, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_SBProcess_GetStopID__SWIG_1(self, args);
    }
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBProcess, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_bool(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        return _wrap_SBProcess_GetStopID__SWIG_0(self, args);
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBProcess_GetStopID'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    GetStopID(lldb::SBProcess *,bool)\n"
    "    GetStopID(lldb::SBProcess *)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_SendAsyncInterrupt(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBProcess_SendAsyncInterrupt",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_SendAsyncInterrupt" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SendAsyncInterrupt();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_ReadMemory(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  lldb::addr_t arg2 ;
  void *arg3 = (void *) 0 ;
  size_t arg4 ;
  lldb::SBError *arg5 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned long long val2 ;
  int ecode2 = 0 ;
  void *argp5 = 0 ;
  int res5 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  size_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOO:SBProcess_ReadMemory",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_ReadMemory" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_long_SS_long(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBProcess_ReadMemory" "', argument " "2"" of type '" "lldb::addr_t""'");
  } 
  arg2 = static_cast< lldb::addr_t >(val2);
  {
    if (PyInt_Check(obj2)) {
      arg4 = PyInt_AsLong(obj2);
    } else if (PyLong_Check(obj2)) {
      arg4 = PyLong_AsLong(obj2);
    } else {
      PyErr_SetString(PyExc_ValueError, "Expecting an integer or long object");
      return NULL;
    }
    if (arg4 <= 0) {
      PyErr_SetString(PyExc_ValueError, "Positive integer expected");
      return NULL;
    }
    arg3 = (void *) malloc(arg4);
  }
  res5 = SWIG_ConvertPtr(obj3, &argp5, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res5)) {
    SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "SBProcess_ReadMemory" "', argument " "5"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp5) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBProcess_ReadMemory" "', argument " "5"" of type '" "lldb::SBError &""'"); 
  }
  arg5 = reinterpret_cast< lldb::SBError * >(argp5);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->ReadMemory(arg2,arg3,arg4,*arg5);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
  {
    Py_XDECREF(resultobj);   /* Blow away any previous result */
    if (result == 0) {
      resultobj = Py_None;
      Py_INCREF(resultobj);
    } else {
      lldb_private::PythonBytes bytes(static_cast<const uint8_t*>(arg3), result);
      resultobj = bytes.release();
    }
    free(arg3);
  }
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_WriteMemory(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  lldb::addr_t arg2 ;
  void *arg3 = (void *) 0 ;
  size_t arg4 ;
  lldb::SBError *arg5 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned long long val2 ;
  int ecode2 = 0 ;
  void *argp5 = 0 ;
  int res5 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  size_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOO:SBProcess_WriteMemory",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_WriteMemory" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_long_SS_long(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBProcess_WriteMemory" "', argument " "2"" of type '" "lldb::addr_t""'");
  } 
  arg2 = static_cast< lldb::addr_t >(val2);
  {
    using namespace lldb_private;
    if (PythonString::Check(obj2)) {
      PythonString str(PyRefType::Borrowed, obj2);
      arg3 = (void*)str.GetString().data();
      arg4 = str.GetSize();
    }
    else if(PythonByteArray::Check(obj2)) {
      PythonByteArray bytearray(PyRefType::Borrowed, obj2);
      arg3 = (void*)bytearray.GetBytes().data();
      arg4 = bytearray.GetSize();
    }
    else if (PythonBytes::Check(obj2)) {
      PythonBytes bytes(PyRefType::Borrowed, obj2);
      arg3 = (void*)bytes.GetBytes().data();
      arg4 = bytes.GetSize();
    }
    else {
      PyErr_SetString(PyExc_ValueError, "Expecting a buffer");
      return NULL;
    }
  }
  res5 = SWIG_ConvertPtr(obj3, &argp5, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res5)) {
    SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "SBProcess_WriteMemory" "', argument " "5"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp5) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBProcess_WriteMemory" "', argument " "5"" of type '" "lldb::SBError &""'"); 
  }
  arg5 = reinterpret_cast< lldb::SBError * >(argp5);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->WriteMemory(arg2,(void const *)arg3,arg4,*arg5);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_ReadCStringFromMemory(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  lldb::addr_t arg2 ;
  void *arg3 = (void *) 0 ;
  size_t arg4 ;
  lldb::SBError *arg5 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned long long val2 ;
  int ecode2 = 0 ;
  void *argp5 = 0 ;
  int res5 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  size_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOO:SBProcess_ReadCStringFromMemory",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_ReadCStringFromMemory" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_long_SS_long(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBProcess_ReadCStringFromMemory" "', argument " "2"" of type '" "lldb::addr_t""'");
  } 
  arg2 = static_cast< lldb::addr_t >(val2);
  {
    if (!PyInt_Check(obj2)) {
      PyErr_SetString(PyExc_ValueError, "Expecting an integer");
      return NULL;
    }
    arg4 = PyInt_AsLong(obj2);
    if (arg4 <= 0) {
      PyErr_SetString(PyExc_ValueError, "Positive integer expected");
      return NULL;
    }
    arg3 = (char *) malloc(arg4);
  }
  res5 = SWIG_ConvertPtr(obj3, &argp5, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res5)) {
    SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "SBProcess_ReadCStringFromMemory" "', argument " "5"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp5) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBProcess_ReadCStringFromMemory" "', argument " "5"" of type '" "lldb::SBError &""'"); 
  }
  arg5 = reinterpret_cast< lldb::SBError * >(argp5);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->ReadCStringFromMemory(arg2,arg3,arg4,*arg5);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
  {
    Py_XDECREF(resultobj);   /* Blow away any previous result */
    if (result == 0) {
      lldb_private::PythonString string("");
      resultobj = string.release();
      Py_INCREF(resultobj);
    } else {
      llvm::StringRef ref(static_cast<const char*>(arg3), result);
      lldb_private::PythonString string(ref);
      resultobj = string.release();
    }
    free(arg3);
  }
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_ReadUnsignedFromMemory(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  lldb::addr_t arg2 ;
  uint32_t arg3 ;
  lldb::SBError *arg4 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned long long val2 ;
  int ecode2 = 0 ;
  unsigned int val3 ;
  int ecode3 = 0 ;
  void *argp4 = 0 ;
  int res4 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  uint64_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOO:SBProcess_ReadUnsignedFromMemory",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_ReadUnsignedFromMemory" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_long_SS_long(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBProcess_ReadUnsignedFromMemory" "', argument " "2"" of type '" "lldb::addr_t""'");
  } 
  arg2 = static_cast< lldb::addr_t >(val2);
  ecode3 = SWIG_AsVal_unsigned_SS_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBProcess_ReadUnsignedFromMemory" "', argument " "3"" of type '" "uint32_t""'");
  } 
  arg3 = static_cast< uint32_t >(val3);
  res4 = SWIG_ConvertPtr(obj3, &argp4, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res4)) {
    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "SBProcess_ReadUnsignedFromMemory" "', argument " "4"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp4) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBProcess_ReadUnsignedFromMemory" "', argument " "4"" of type '" "lldb::SBError &""'"); 
  }
  arg4 = reinterpret_cast< lldb::SBError * >(argp4);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint64_t)(arg1)->ReadUnsignedFromMemory(arg2,arg3,*arg4);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_ReadPointerFromMemory(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  lldb::addr_t arg2 ;
  lldb::SBError *arg3 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned long long val2 ;
  int ecode2 = 0 ;
  void *argp3 = 0 ;
  int res3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::addr_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBProcess_ReadPointerFromMemory",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_ReadPointerFromMemory" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_long_SS_long(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBProcess_ReadPointerFromMemory" "', argument " "2"" of type '" "lldb::addr_t""'");
  } 
  arg2 = static_cast< lldb::addr_t >(val2);
  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBProcess_ReadPointerFromMemory" "', argument " "3"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp3) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBProcess_ReadPointerFromMemory" "', argument " "3"" of type '" "lldb::SBError &""'"); 
  }
  arg3 = reinterpret_cast< lldb::SBError * >(argp3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::addr_t)(arg1)->ReadPointerFromMemory(arg2,*arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_GetStateFromEvent(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBEvent *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::StateType result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBProcess_GetStateFromEvent",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBEvent,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_GetStateFromEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBProcess_GetStateFromEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBEvent * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::StateType)lldb::SBProcess::GetStateFromEvent((lldb::SBEvent const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_GetRestartedFromEvent(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBEvent *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBProcess_GetRestartedFromEvent",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBEvent,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_GetRestartedFromEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBProcess_GetRestartedFromEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBEvent * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)lldb::SBProcess::GetRestartedFromEvent((lldb::SBEvent const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_GetNumRestartedReasonsFromEvent(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBEvent *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  size_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBProcess_GetNumRestartedReasonsFromEvent",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBEvent,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_GetNumRestartedReasonsFromEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBProcess_GetNumRestartedReasonsFromEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBEvent * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = lldb::SBProcess::GetNumRestartedReasonsFromEvent((lldb::SBEvent const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_GetRestartedReasonAtIndexFromEvent(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBEvent *arg1 = 0 ;
  size_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  size_t val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBProcess_GetRestartedReasonAtIndexFromEvent",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBEvent,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_GetRestartedReasonAtIndexFromEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBProcess_GetRestartedReasonAtIndexFromEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBEvent * >(argp1);
  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBProcess_GetRestartedReasonAtIndexFromEvent" "', argument " "2"" of type '" "size_t""'");
  } 
  arg2 = static_cast< size_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)lldb::SBProcess::GetRestartedReasonAtIndexFromEvent((lldb::SBEvent const &)*arg1,arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_GetProcessFromEvent(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBEvent *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBProcess result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBProcess_GetProcessFromEvent",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBEvent,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_GetProcessFromEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBProcess_GetProcessFromEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBEvent * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = lldb::SBProcess::GetProcessFromEvent((lldb::SBEvent const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBProcess(static_cast< const lldb::SBProcess& >(result))), SWIGTYPE_p_lldb__SBProcess, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_GetInterruptedFromEvent(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBEvent *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBProcess_GetInterruptedFromEvent",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBEvent,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_GetInterruptedFromEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBProcess_GetInterruptedFromEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBEvent * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)lldb::SBProcess::GetInterruptedFromEvent((lldb::SBEvent const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_GetStructuredDataFromEvent(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBEvent *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBStructuredData result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBProcess_GetStructuredDataFromEvent",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBEvent,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_GetStructuredDataFromEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBProcess_GetStructuredDataFromEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBEvent * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = lldb::SBProcess::GetStructuredDataFromEvent((lldb::SBEvent const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBStructuredData(static_cast< const lldb::SBStructuredData& >(result))), SWIGTYPE_p_lldb__SBStructuredData, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_EventIsProcessEvent(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBEvent *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBProcess_EventIsProcessEvent",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBEvent,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_EventIsProcessEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBProcess_EventIsProcessEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBEvent * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)lldb::SBProcess::EventIsProcessEvent((lldb::SBEvent const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_EventIsStructuredDataEvent(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBEvent *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBProcess_EventIsStructuredDataEvent",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBEvent,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_EventIsStructuredDataEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBProcess_EventIsStructuredDataEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBEvent * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)lldb::SBProcess::EventIsStructuredDataEvent((lldb::SBEvent const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_GetBroadcaster(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBBroadcaster result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBProcess_GetBroadcaster",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_GetBroadcaster" "', argument " "1"" of type '" "lldb::SBProcess const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBProcess const *)arg1)->GetBroadcaster();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBBroadcaster(static_cast< const lldb::SBBroadcaster& >(result))), SWIGTYPE_p_lldb__SBBroadcaster, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_GetDescription(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBProcess_GetDescription",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_GetDescription" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBProcess_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBProcess_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetDescription(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_GetNumSupportedHardwareWatchpoints(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  lldb::SBError *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBProcess_GetNumSupportedHardwareWatchpoints",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_GetNumSupportedHardwareWatchpoints" "', argument " "1"" of type '" "lldb::SBProcess const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBProcess_GetNumSupportedHardwareWatchpoints" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBProcess_GetNumSupportedHardwareWatchpoints" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBError * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)((lldb::SBProcess const *)arg1)->GetNumSupportedHardwareWatchpoints(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_LoadImage(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  lldb::SBFileSpec *arg2 = 0 ;
  lldb::SBError *arg3 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  void *argp3 = 0 ;
  int res3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBProcess_LoadImage",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_LoadImage" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBFileSpec,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBProcess_LoadImage" "', argument " "2"" of type '" "lldb::SBFileSpec &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBProcess_LoadImage" "', argument " "2"" of type '" "lldb::SBFileSpec &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBFileSpec * >(argp2);
  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBProcess_LoadImage" "', argument " "3"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp3) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBProcess_LoadImage" "', argument " "3"" of type '" "lldb::SBError &""'"); 
  }
  arg3 = reinterpret_cast< lldb::SBError * >(argp3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->LoadImage(*arg2,*arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_UnloadImage(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBError result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBProcess_UnloadImage",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_UnloadImage" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBProcess_UnloadImage" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->UnloadImage(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBError(static_cast< const lldb::SBError& >(result))), SWIGTYPE_p_lldb__SBError, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_SendEventData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBError result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBProcess_SendEventData",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_SendEventData" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBProcess_SendEventData" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->SendEventData((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBError(static_cast< const lldb::SBError& >(result))), SWIGTYPE_p_lldb__SBError, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_GetNumExtendedBacktraceTypes(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBProcess_GetNumExtendedBacktraceTypes",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_GetNumExtendedBacktraceTypes" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetNumExtendedBacktraceTypes();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_GetExtendedBacktraceTypeAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBProcess_GetExtendedBacktraceTypeAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_GetExtendedBacktraceTypeAtIndex" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBProcess_GetExtendedBacktraceTypeAtIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetExtendedBacktraceTypeAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_GetHistoryThreads(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  lldb::addr_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned long long val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBThreadCollection result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBProcess_GetHistoryThreads",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_GetHistoryThreads" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_long_SS_long(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBProcess_GetHistoryThreads" "', argument " "2"" of type '" "lldb::addr_t""'");
  } 
  arg2 = static_cast< lldb::addr_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetHistoryThreads(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBThreadCollection(static_cast< const lldb::SBThreadCollection& >(result))), SWIGTYPE_p_lldb__SBThreadCollection, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_IsInstrumentationRuntimePresent(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  lldb::InstrumentationRuntimeType arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBProcess_IsInstrumentationRuntimePresent",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_IsInstrumentationRuntimePresent" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  ecode2 = SWIG_AsVal_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBProcess_IsInstrumentationRuntimePresent" "', argument " "2"" of type '" "lldb::InstrumentationRuntimeType""'");
  } 
  arg2 = static_cast< lldb::InstrumentationRuntimeType >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsInstrumentationRuntimePresent(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_SaveCore(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBError result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBProcess_SaveCore",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_SaveCore" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBProcess_SaveCore" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->SaveCore((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBError(static_cast< const lldb::SBError& >(result))), SWIGTYPE_p_lldb__SBError, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_StartTrace(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  lldb::SBTraceOptions *arg2 = 0 ;
  lldb::SBError *arg3 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  void *argp3 = 0 ;
  int res3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBTrace result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBProcess_StartTrace",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_StartTrace" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTraceOptions,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBProcess_StartTrace" "', argument " "2"" of type '" "lldb::SBTraceOptions &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBProcess_StartTrace" "', argument " "2"" of type '" "lldb::SBTraceOptions &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBTraceOptions * >(argp2);
  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBProcess_StartTrace" "', argument " "3"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp3) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBProcess_StartTrace" "', argument " "3"" of type '" "lldb::SBError &""'"); 
  }
  arg3 = reinterpret_cast< lldb::SBError * >(argp3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->StartTrace(*arg2,*arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTrace(static_cast< const lldb::SBTrace& >(result))), SWIGTYPE_p_lldb__SBTrace, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_GetMemoryRegionInfo(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  lldb::addr_t arg2 ;
  lldb::SBMemoryRegionInfo *arg3 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned long long val2 ;
  int ecode2 = 0 ;
  void *argp3 = 0 ;
  int res3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBError result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBProcess_GetMemoryRegionInfo",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_GetMemoryRegionInfo" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_long_SS_long(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBProcess_GetMemoryRegionInfo" "', argument " "2"" of type '" "lldb::addr_t""'");
  } 
  arg2 = static_cast< lldb::addr_t >(val2);
  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBMemoryRegionInfo,  0 );
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBProcess_GetMemoryRegionInfo" "', argument " "3"" of type '" "lldb::SBMemoryRegionInfo &""'"); 
  }
  if (!argp3) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBProcess_GetMemoryRegionInfo" "', argument " "3"" of type '" "lldb::SBMemoryRegionInfo &""'"); 
  }
  arg3 = reinterpret_cast< lldb::SBMemoryRegionInfo * >(argp3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetMemoryRegionInfo(arg2,*arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBError(static_cast< const lldb::SBError& >(result))), SWIGTYPE_p_lldb__SBError, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_GetMemoryRegions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBMemoryRegionInfoList result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBProcess_GetMemoryRegions",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_GetMemoryRegions" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetMemoryRegions();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBMemoryRegionInfoList(static_cast< const lldb::SBMemoryRegionInfoList& >(result))), SWIGTYPE_p_lldb__SBMemoryRegionInfoList, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess_GetProcessInfo(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBProcessInfo result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBProcess_GetProcessInfo",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess_GetProcessInfo" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetProcessInfo();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBProcessInfo(static_cast< const lldb::SBProcessInfo& >(result))), SWIGTYPE_p_lldb__SBProcessInfo, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcess___str__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcess *arg1 = (lldb::SBProcess *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBProcess___str__",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcess, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcess___str__" "', argument " "1"" of type '" "lldb::SBProcess *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcess * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (PyObject *)lldb_SBProcess___str__(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = result;
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBProcess_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBProcess, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBProcessInfo__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcessInfo *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBProcessInfo")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBProcessInfo *)new lldb::SBProcessInfo();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBProcessInfo, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBProcessInfo__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcessInfo *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBProcessInfo *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBProcessInfo",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBProcessInfo,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBProcessInfo" "', argument " "1"" of type '" "lldb::SBProcessInfo const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBProcessInfo" "', argument " "1"" of type '" "lldb::SBProcessInfo const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcessInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBProcessInfo *)new lldb::SBProcessInfo((lldb::SBProcessInfo const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBProcessInfo, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBProcessInfo(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBProcessInfo__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBProcessInfo, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBProcessInfo__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBProcessInfo'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBProcessInfo()\n"
    "    lldb::SBProcessInfo(lldb::SBProcessInfo const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBProcessInfo(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcessInfo *arg1 = (lldb::SBProcessInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBProcessInfo",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcessInfo, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBProcessInfo" "', argument " "1"" of type '" "lldb::SBProcessInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcessInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcessInfo_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcessInfo *arg1 = (lldb::SBProcessInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBProcessInfo_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcessInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcessInfo_IsValid" "', argument " "1"" of type '" "lldb::SBProcessInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcessInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcessInfo_GetName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcessInfo *arg1 = (lldb::SBProcessInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBProcessInfo_GetName",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcessInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcessInfo_GetName" "', argument " "1"" of type '" "lldb::SBProcessInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcessInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetName();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcessInfo_GetExecutableFile(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcessInfo *arg1 = (lldb::SBProcessInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBFileSpec result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBProcessInfo_GetExecutableFile",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcessInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcessInfo_GetExecutableFile" "', argument " "1"" of type '" "lldb::SBProcessInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcessInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetExecutableFile();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBFileSpec(static_cast< const lldb::SBFileSpec& >(result))), SWIGTYPE_p_lldb__SBFileSpec, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcessInfo_GetProcessID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcessInfo *arg1 = (lldb::SBProcessInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::pid_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBProcessInfo_GetProcessID",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcessInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcessInfo_GetProcessID" "', argument " "1"" of type '" "lldb::SBProcessInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcessInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::pid_t)(arg1)->GetProcessID();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcessInfo_GetUserID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcessInfo *arg1 = (lldb::SBProcessInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBProcessInfo_GetUserID",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcessInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcessInfo_GetUserID" "', argument " "1"" of type '" "lldb::SBProcessInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcessInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetUserID();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcessInfo_GetGroupID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcessInfo *arg1 = (lldb::SBProcessInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBProcessInfo_GetGroupID",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcessInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcessInfo_GetGroupID" "', argument " "1"" of type '" "lldb::SBProcessInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcessInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetGroupID();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcessInfo_UserIDIsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcessInfo *arg1 = (lldb::SBProcessInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBProcessInfo_UserIDIsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcessInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcessInfo_UserIDIsValid" "', argument " "1"" of type '" "lldb::SBProcessInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcessInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->UserIDIsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcessInfo_GroupIDIsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcessInfo *arg1 = (lldb::SBProcessInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBProcessInfo_GroupIDIsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcessInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcessInfo_GroupIDIsValid" "', argument " "1"" of type '" "lldb::SBProcessInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcessInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GroupIDIsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcessInfo_GetEffectiveUserID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcessInfo *arg1 = (lldb::SBProcessInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBProcessInfo_GetEffectiveUserID",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcessInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcessInfo_GetEffectiveUserID" "', argument " "1"" of type '" "lldb::SBProcessInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcessInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetEffectiveUserID();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcessInfo_GetEffectiveGroupID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcessInfo *arg1 = (lldb::SBProcessInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBProcessInfo_GetEffectiveGroupID",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcessInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcessInfo_GetEffectiveGroupID" "', argument " "1"" of type '" "lldb::SBProcessInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcessInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetEffectiveGroupID();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcessInfo_EffectiveUserIDIsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcessInfo *arg1 = (lldb::SBProcessInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBProcessInfo_EffectiveUserIDIsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcessInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcessInfo_EffectiveUserIDIsValid" "', argument " "1"" of type '" "lldb::SBProcessInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcessInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->EffectiveUserIDIsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcessInfo_EffectiveGroupIDIsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcessInfo *arg1 = (lldb::SBProcessInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBProcessInfo_EffectiveGroupIDIsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcessInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcessInfo_EffectiveGroupIDIsValid" "', argument " "1"" of type '" "lldb::SBProcessInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcessInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->EffectiveGroupIDIsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBProcessInfo_GetParentProcessID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBProcessInfo *arg1 = (lldb::SBProcessInfo *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::pid_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBProcessInfo_GetParentProcessID",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBProcessInfo, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBProcessInfo_GetParentProcessID" "', argument " "1"" of type '" "lldb::SBProcessInfo *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBProcessInfo * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::pid_t)(arg1)->GetParentProcessID();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBProcessInfo_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBProcessInfo, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBQueue__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBQueue *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBQueue")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBQueue *)new lldb::SBQueue();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBQueue, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBQueue__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::QueueSP *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBQueue *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBQueue",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_std__shared_ptrT_lldb_private__Queue_t,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBQueue" "', argument " "1"" of type '" "lldb::QueueSP const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBQueue" "', argument " "1"" of type '" "lldb::QueueSP const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::QueueSP * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBQueue *)new lldb::SBQueue((lldb::QueueSP const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBQueue, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBQueue(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBQueue__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_std__shared_ptrT_lldb_private__Queue_t, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBQueue__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBQueue'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBQueue()\n"
    "    lldb::SBQueue(lldb::QueueSP const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBQueue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBQueue *arg1 = (lldb::SBQueue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBQueue",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBQueue, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBQueue" "', argument " "1"" of type '" "lldb::SBQueue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBQueue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBQueue_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBQueue *arg1 = (lldb::SBQueue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBQueue_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBQueue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBQueue_IsValid" "', argument " "1"" of type '" "lldb::SBQueue const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBQueue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBQueue const *)arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBQueue_Clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBQueue *arg1 = (lldb::SBQueue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBQueue_Clear",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBQueue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBQueue_Clear" "', argument " "1"" of type '" "lldb::SBQueue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBQueue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->Clear();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBQueue_GetProcess(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBQueue *arg1 = (lldb::SBQueue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBProcess result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBQueue_GetProcess",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBQueue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBQueue_GetProcess" "', argument " "1"" of type '" "lldb::SBQueue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBQueue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetProcess();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBProcess(static_cast< const lldb::SBProcess& >(result))), SWIGTYPE_p_lldb__SBProcess, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBQueue_GetQueueID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBQueue *arg1 = (lldb::SBQueue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::queue_id_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBQueue_GetQueueID",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBQueue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBQueue_GetQueueID" "', argument " "1"" of type '" "lldb::SBQueue const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBQueue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::queue_id_t)((lldb::SBQueue const *)arg1)->GetQueueID();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBQueue_GetName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBQueue *arg1 = (lldb::SBQueue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBQueue_GetName",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBQueue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBQueue_GetName" "', argument " "1"" of type '" "lldb::SBQueue const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBQueue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)((lldb::SBQueue const *)arg1)->GetName();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBQueue_GetKind(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBQueue *arg1 = (lldb::SBQueue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::QueueKind result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBQueue_GetKind",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBQueue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBQueue_GetKind" "', argument " "1"" of type '" "lldb::SBQueue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBQueue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::QueueKind)(arg1)->GetKind();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBQueue_GetIndexID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBQueue *arg1 = (lldb::SBQueue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBQueue_GetIndexID",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBQueue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBQueue_GetIndexID" "', argument " "1"" of type '" "lldb::SBQueue const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBQueue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)((lldb::SBQueue const *)arg1)->GetIndexID();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBQueue_GetNumThreads(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBQueue *arg1 = (lldb::SBQueue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBQueue_GetNumThreads",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBQueue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBQueue_GetNumThreads" "', argument " "1"" of type '" "lldb::SBQueue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBQueue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetNumThreads();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBQueue_GetThreadAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBQueue *arg1 = (lldb::SBQueue *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBThread result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBQueue_GetThreadAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBQueue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBQueue_GetThreadAtIndex" "', argument " "1"" of type '" "lldb::SBQueue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBQueue * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBQueue_GetThreadAtIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetThreadAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBThread(static_cast< const lldb::SBThread& >(result))), SWIGTYPE_p_lldb__SBThread, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBQueue_GetNumPendingItems(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBQueue *arg1 = (lldb::SBQueue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBQueue_GetNumPendingItems",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBQueue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBQueue_GetNumPendingItems" "', argument " "1"" of type '" "lldb::SBQueue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBQueue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetNumPendingItems();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBQueue_GetPendingItemAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBQueue *arg1 = (lldb::SBQueue *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBQueueItem result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBQueue_GetPendingItemAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBQueue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBQueue_GetPendingItemAtIndex" "', argument " "1"" of type '" "lldb::SBQueue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBQueue * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBQueue_GetPendingItemAtIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetPendingItemAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBQueueItem(static_cast< const lldb::SBQueueItem& >(result))), SWIGTYPE_p_lldb__SBQueueItem, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBQueue_GetNumRunningItems(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBQueue *arg1 = (lldb::SBQueue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBQueue_GetNumRunningItems",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBQueue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBQueue_GetNumRunningItems" "', argument " "1"" of type '" "lldb::SBQueue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBQueue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetNumRunningItems();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBQueue_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBQueue, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBQueueItem__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBQueueItem *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBQueueItem")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBQueueItem *)new lldb::SBQueueItem();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBQueueItem, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBQueueItem__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::QueueItemSP *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBQueueItem *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBQueueItem",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_std__shared_ptrT_lldb_private__QueueItem_t,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBQueueItem" "', argument " "1"" of type '" "lldb::QueueItemSP const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBQueueItem" "', argument " "1"" of type '" "lldb::QueueItemSP const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::QueueItemSP * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBQueueItem *)new lldb::SBQueueItem((lldb::QueueItemSP const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBQueueItem, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBQueueItem(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBQueueItem__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_std__shared_ptrT_lldb_private__QueueItem_t, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBQueueItem__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBQueueItem'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBQueueItem()\n"
    "    lldb::SBQueueItem(lldb::QueueItemSP const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBQueueItem(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBQueueItem *arg1 = (lldb::SBQueueItem *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBQueueItem",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBQueueItem, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBQueueItem" "', argument " "1"" of type '" "lldb::SBQueueItem *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBQueueItem * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBQueueItem_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBQueueItem *arg1 = (lldb::SBQueueItem *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBQueueItem_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBQueueItem, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBQueueItem_IsValid" "', argument " "1"" of type '" "lldb::SBQueueItem const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBQueueItem * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBQueueItem const *)arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBQueueItem_Clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBQueueItem *arg1 = (lldb::SBQueueItem *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBQueueItem_Clear",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBQueueItem, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBQueueItem_Clear" "', argument " "1"" of type '" "lldb::SBQueueItem *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBQueueItem * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->Clear();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBQueueItem_GetKind(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBQueueItem *arg1 = (lldb::SBQueueItem *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::QueueItemKind result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBQueueItem_GetKind",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBQueueItem, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBQueueItem_GetKind" "', argument " "1"" of type '" "lldb::SBQueueItem const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBQueueItem * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::QueueItemKind)((lldb::SBQueueItem const *)arg1)->GetKind();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBQueueItem_SetKind(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBQueueItem *arg1 = (lldb::SBQueueItem *) 0 ;
  lldb::QueueItemKind arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBQueueItem_SetKind",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBQueueItem, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBQueueItem_SetKind" "', argument " "1"" of type '" "lldb::SBQueueItem *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBQueueItem * >(argp1);
  ecode2 = SWIG_AsVal_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBQueueItem_SetKind" "', argument " "2"" of type '" "lldb::QueueItemKind""'");
  } 
  arg2 = static_cast< lldb::QueueItemKind >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetKind(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBQueueItem_GetAddress(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBQueueItem *arg1 = (lldb::SBQueueItem *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBAddress result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBQueueItem_GetAddress",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBQueueItem, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBQueueItem_GetAddress" "', argument " "1"" of type '" "lldb::SBQueueItem const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBQueueItem * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBQueueItem const *)arg1)->GetAddress();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBAddress(static_cast< const lldb::SBAddress& >(result))), SWIGTYPE_p_lldb__SBAddress, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBQueueItem_SetAddress(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBQueueItem *arg1 = (lldb::SBQueueItem *) 0 ;
  lldb::SBAddress arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBQueueItem_SetAddress",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBQueueItem, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBQueueItem_SetAddress" "', argument " "1"" of type '" "lldb::SBQueueItem *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBQueueItem * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBAddress,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBQueueItem_SetAddress" "', argument " "2"" of type '" "lldb::SBAddress""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBQueueItem_SetAddress" "', argument " "2"" of type '" "lldb::SBAddress""'");
    } else {
      lldb::SBAddress * temp = reinterpret_cast< lldb::SBAddress * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetAddress(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBQueueItem_SetQueueItem(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBQueueItem *arg1 = (lldb::SBQueueItem *) 0 ;
  lldb::QueueItemSP *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBQueueItem_SetQueueItem",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBQueueItem, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBQueueItem_SetQueueItem" "', argument " "1"" of type '" "lldb::SBQueueItem *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBQueueItem * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_std__shared_ptrT_lldb_private__QueueItem_t,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBQueueItem_SetQueueItem" "', argument " "2"" of type '" "lldb::QueueItemSP const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBQueueItem_SetQueueItem" "', argument " "2"" of type '" "lldb::QueueItemSP const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::QueueItemSP * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetQueueItem((lldb::QueueItemSP const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBQueueItem_GetExtendedBacktraceThread(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBQueueItem *arg1 = (lldb::SBQueueItem *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBThread result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBQueueItem_GetExtendedBacktraceThread",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBQueueItem, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBQueueItem_GetExtendedBacktraceThread" "', argument " "1"" of type '" "lldb::SBQueueItem *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBQueueItem * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBQueueItem_GetExtendedBacktraceThread" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetExtendedBacktraceThread((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBThread(static_cast< const lldb::SBThread& >(result))), SWIGTYPE_p_lldb__SBThread, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *SBQueueItem_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBQueueItem, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBSection__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSection *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBSection")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBSection *)new lldb::SBSection();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBSection, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBSection__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSection *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBSection *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBSection",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBSection,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBSection" "', argument " "1"" of type '" "lldb::SBSection const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBSection" "', argument " "1"" of type '" "lldb::SBSection const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSection * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBSection *)new lldb::SBSection((lldb::SBSection const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBSection, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBSection(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBSection__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBSection, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBSection__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBSection'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBSection()\n"
    "    lldb::SBSection(lldb::SBSection const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBSection(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSection *arg1 = (lldb::SBSection *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBSection",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSection, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBSection" "', argument " "1"" of type '" "lldb::SBSection *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSection * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSection_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSection *arg1 = (lldb::SBSection *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBSection_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSection, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSection_IsValid" "', argument " "1"" of type '" "lldb::SBSection const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSection * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBSection const *)arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSection_GetName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSection *arg1 = (lldb::SBSection *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBSection_GetName",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSection, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSection_GetName" "', argument " "1"" of type '" "lldb::SBSection *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSection * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetName();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSection_GetParent(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSection *arg1 = (lldb::SBSection *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBSection result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBSection_GetParent",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSection, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSection_GetParent" "', argument " "1"" of type '" "lldb::SBSection *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSection * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetParent();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBSection(static_cast< const lldb::SBSection& >(result))), SWIGTYPE_p_lldb__SBSection, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSection_FindSubSection(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSection *arg1 = (lldb::SBSection *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBSection result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBSection_FindSubSection",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSection, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSection_FindSubSection" "', argument " "1"" of type '" "lldb::SBSection *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSection * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBSection_FindSubSection" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->FindSubSection((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBSection(static_cast< const lldb::SBSection& >(result))), SWIGTYPE_p_lldb__SBSection, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSection_GetNumSubSections(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSection *arg1 = (lldb::SBSection *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  size_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBSection_GetNumSubSections",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSection, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSection_GetNumSubSections" "', argument " "1"" of type '" "lldb::SBSection *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSection * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetNumSubSections();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSection_GetSubSectionAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSection *arg1 = (lldb::SBSection *) 0 ;
  size_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  size_t val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBSection result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBSection_GetSubSectionAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSection, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSection_GetSubSectionAtIndex" "', argument " "1"" of type '" "lldb::SBSection *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSection * >(argp1);
  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBSection_GetSubSectionAtIndex" "', argument " "2"" of type '" "size_t""'");
  } 
  arg2 = static_cast< size_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetSubSectionAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBSection(static_cast< const lldb::SBSection& >(result))), SWIGTYPE_p_lldb__SBSection, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSection_GetFileAddress(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSection *arg1 = (lldb::SBSection *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::addr_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBSection_GetFileAddress",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSection, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSection_GetFileAddress" "', argument " "1"" of type '" "lldb::SBSection *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSection * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::addr_t)(arg1)->GetFileAddress();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSection_GetLoadAddress(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSection *arg1 = (lldb::SBSection *) 0 ;
  lldb::SBTarget *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::addr_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBSection_GetLoadAddress",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSection, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSection_GetLoadAddress" "', argument " "1"" of type '" "lldb::SBSection *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSection * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTarget,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBSection_GetLoadAddress" "', argument " "2"" of type '" "lldb::SBTarget &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBSection_GetLoadAddress" "', argument " "2"" of type '" "lldb::SBTarget &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBTarget * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::addr_t)(arg1)->GetLoadAddress(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSection_GetByteSize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSection *arg1 = (lldb::SBSection *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::addr_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBSection_GetByteSize",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSection, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSection_GetByteSize" "', argument " "1"" of type '" "lldb::SBSection *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSection * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::addr_t)(arg1)->GetByteSize();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSection_GetFileOffset(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSection *arg1 = (lldb::SBSection *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint64_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBSection_GetFileOffset",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSection, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSection_GetFileOffset" "', argument " "1"" of type '" "lldb::SBSection *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSection * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint64_t)(arg1)->GetFileOffset();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSection_GetFileByteSize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSection *arg1 = (lldb::SBSection *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint64_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBSection_GetFileByteSize",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSection, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSection_GetFileByteSize" "', argument " "1"" of type '" "lldb::SBSection *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSection * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint64_t)(arg1)->GetFileByteSize();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSection_GetSectionData__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSection *arg1 = (lldb::SBSection *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBData result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBSection_GetSectionData",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSection, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSection_GetSectionData" "', argument " "1"" of type '" "lldb::SBSection *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSection * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetSectionData();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBData(static_cast< const lldb::SBData& >(result))), SWIGTYPE_p_lldb__SBData, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSection_GetSectionData__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSection *arg1 = (lldb::SBSection *) 0 ;
  uint64_t arg2 ;
  uint64_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned long long val2 ;
  int ecode2 = 0 ;
  unsigned long long val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBData result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBSection_GetSectionData",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSection, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSection_GetSectionData" "', argument " "1"" of type '" "lldb::SBSection *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSection * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_long_SS_long(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBSection_GetSectionData" "', argument " "2"" of type '" "uint64_t""'");
  } 
  arg2 = static_cast< uint64_t >(val2);
  ecode3 = SWIG_AsVal_unsigned_SS_long_SS_long(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBSection_GetSectionData" "', argument " "3"" of type '" "uint64_t""'");
  } 
  arg3 = static_cast< uint64_t >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetSectionData(arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBData(static_cast< const lldb::SBData& >(result))), SWIGTYPE_p_lldb__SBData, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSection_GetSectionData(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[4];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 3); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 1) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBSection, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_SBSection_GetSectionData__SWIG_0(self, args);
    }
  }
  if (argc == 3) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBSection, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_unsigned_SS_long_SS_long(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        {
          int res = SWIG_AsVal_unsigned_SS_long_SS_long(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          return _wrap_SBSection_GetSectionData__SWIG_1(self, args);
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBSection_GetSectionData'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    GetSectionData(lldb::SBSection *)\n"
    "    GetSectionData(lldb::SBSection *,uint64_t,uint64_t)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSection_GetSectionType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSection *arg1 = (lldb::SBSection *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SectionType result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBSection_GetSectionType",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSection, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSection_GetSectionType" "', argument " "1"" of type '" "lldb::SBSection *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSection * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SectionType)(arg1)->GetSectionType();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSection_GetPermissions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSection *arg1 = (lldb::SBSection *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBSection_GetPermissions",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSection, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSection_GetPermissions" "', argument " "1"" of type '" "lldb::SBSection const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSection * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)((lldb::SBSection const *)arg1)->GetPermissions();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSection_GetTargetByteSize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSection *arg1 = (lldb::SBSection *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBSection_GetTargetByteSize",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSection, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSection_GetTargetByteSize" "', argument " "1"" of type '" "lldb::SBSection *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSection * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetTargetByteSize();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSection_GetDescription(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSection *arg1 = (lldb::SBSection *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBSection_GetDescription",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSection, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSection_GetDescription" "', argument " "1"" of type '" "lldb::SBSection *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSection * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBSection_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBSection_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetDescription(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSection___eq__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSection *arg1 = (lldb::SBSection *) 0 ;
  lldb::SBSection *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBSection___eq__",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSection, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSection___eq__" "', argument " "1"" of type '" "lldb::SBSection *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSection * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBSection,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBSection___eq__" "', argument " "2"" of type '" "lldb::SBSection const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBSection___eq__" "', argument " "2"" of type '" "lldb::SBSection const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBSection * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->operator ==((lldb::SBSection const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSection___ne__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSection *arg1 = (lldb::SBSection *) 0 ;
  lldb::SBSection *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBSection___ne__",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSection, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSection___ne__" "', argument " "1"" of type '" "lldb::SBSection *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSection * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBSection,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBSection___ne__" "', argument " "2"" of type '" "lldb::SBSection const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBSection___ne__" "', argument " "2"" of type '" "lldb::SBSection const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBSection * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->operator !=((lldb::SBSection const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSection___str__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSection *arg1 = (lldb::SBSection *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBSection___str__",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSection, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSection___str__" "', argument " "1"" of type '" "lldb::SBSection *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSection * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (PyObject *)lldb_SBSection___str__(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = result;
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBSection_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBSection, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBSourceManager(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSourceManager *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBSourceManager *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBSourceManager",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBSourceManager,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBSourceManager" "', argument " "1"" of type '" "lldb::SBSourceManager const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBSourceManager" "', argument " "1"" of type '" "lldb::SBSourceManager const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSourceManager * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBSourceManager *)new lldb::SBSourceManager((lldb::SBSourceManager const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBSourceManager, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBSourceManager(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSourceManager *arg1 = (lldb::SBSourceManager *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBSourceManager",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSourceManager, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBSourceManager" "', argument " "1"" of type '" "lldb::SBSourceManager *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSourceManager * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSourceManager_DisplaySourceLinesWithLineNumbers(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSourceManager *arg1 = (lldb::SBSourceManager *) 0 ;
  lldb::SBFileSpec *arg2 = 0 ;
  uint32_t arg3 ;
  uint32_t arg4 ;
  uint32_t arg5 ;
  char *arg6 = (char *) 0 ;
  lldb::SBStream *arg7 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  unsigned int val3 ;
  int ecode3 = 0 ;
  unsigned int val4 ;
  int ecode4 = 0 ;
  unsigned int val5 ;
  int ecode5 = 0 ;
  int res6 ;
  char *buf6 = 0 ;
  int alloc6 = 0 ;
  void *argp7 = 0 ;
  int res7 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  PyObject * obj4 = 0 ;
  PyObject * obj5 = 0 ;
  PyObject * obj6 = 0 ;
  size_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOOOOO:SBSourceManager_DisplaySourceLinesWithLineNumbers",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSourceManager, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSourceManager_DisplaySourceLinesWithLineNumbers" "', argument " "1"" of type '" "lldb::SBSourceManager *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSourceManager * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBFileSpec,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBSourceManager_DisplaySourceLinesWithLineNumbers" "', argument " "2"" of type '" "lldb::SBFileSpec const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBSourceManager_DisplaySourceLinesWithLineNumbers" "', argument " "2"" of type '" "lldb::SBFileSpec const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBFileSpec * >(argp2);
  ecode3 = SWIG_AsVal_unsigned_SS_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBSourceManager_DisplaySourceLinesWithLineNumbers" "', argument " "3"" of type '" "uint32_t""'");
  } 
  arg3 = static_cast< uint32_t >(val3);
  ecode4 = SWIG_AsVal_unsigned_SS_int(obj3, &val4);
  if (!SWIG_IsOK(ecode4)) {
    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "SBSourceManager_DisplaySourceLinesWithLineNumbers" "', argument " "4"" of type '" "uint32_t""'");
  } 
  arg4 = static_cast< uint32_t >(val4);
  ecode5 = SWIG_AsVal_unsigned_SS_int(obj4, &val5);
  if (!SWIG_IsOK(ecode5)) {
    SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "SBSourceManager_DisplaySourceLinesWithLineNumbers" "', argument " "5"" of type '" "uint32_t""'");
  } 
  arg5 = static_cast< uint32_t >(val5);
  res6 = SWIG_AsCharPtrAndSize(obj5, &buf6, NULL, &alloc6);
  if (!SWIG_IsOK(res6)) {
    SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "SBSourceManager_DisplaySourceLinesWithLineNumbers" "', argument " "6"" of type '" "char const *""'");
  }
  arg6 = reinterpret_cast< char * >(buf6);
  res7 = SWIG_ConvertPtr(obj6, &argp7, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res7)) {
    SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "SBSourceManager_DisplaySourceLinesWithLineNumbers" "', argument " "7"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp7) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBSourceManager_DisplaySourceLinesWithLineNumbers" "', argument " "7"" of type '" "lldb::SBStream &""'"); 
  }
  arg7 = reinterpret_cast< lldb::SBStream * >(argp7);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->DisplaySourceLinesWithLineNumbers((lldb::SBFileSpec const &)*arg2,arg3,arg4,arg5,(char const *)arg6,*arg7);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
  if (alloc6 == SWIG_NEWOBJ) delete[] buf6;
  return resultobj;
fail:
  if (alloc6 == SWIG_NEWOBJ) delete[] buf6;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSourceManager_DisplaySourceLinesWithLineNumbersAndColumn(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSourceManager *arg1 = (lldb::SBSourceManager *) 0 ;
  lldb::SBFileSpec *arg2 = 0 ;
  uint32_t arg3 ;
  uint32_t arg4 ;
  uint32_t arg5 ;
  uint32_t arg6 ;
  char *arg7 = (char *) 0 ;
  lldb::SBStream *arg8 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  unsigned int val3 ;
  int ecode3 = 0 ;
  unsigned int val4 ;
  int ecode4 = 0 ;
  unsigned int val5 ;
  int ecode5 = 0 ;
  unsigned int val6 ;
  int ecode6 = 0 ;
  int res7 ;
  char *buf7 = 0 ;
  int alloc7 = 0 ;
  void *argp8 = 0 ;
  int res8 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  PyObject * obj4 = 0 ;
  PyObject * obj5 = 0 ;
  PyObject * obj6 = 0 ;
  PyObject * obj7 = 0 ;
  size_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOOOOOO:SBSourceManager_DisplaySourceLinesWithLineNumbersAndColumn",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSourceManager, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSourceManager_DisplaySourceLinesWithLineNumbersAndColumn" "', argument " "1"" of type '" "lldb::SBSourceManager *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSourceManager * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBFileSpec,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBSourceManager_DisplaySourceLinesWithLineNumbersAndColumn" "', argument " "2"" of type '" "lldb::SBFileSpec const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBSourceManager_DisplaySourceLinesWithLineNumbersAndColumn" "', argument " "2"" of type '" "lldb::SBFileSpec const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBFileSpec * >(argp2);
  ecode3 = SWIG_AsVal_unsigned_SS_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBSourceManager_DisplaySourceLinesWithLineNumbersAndColumn" "', argument " "3"" of type '" "uint32_t""'");
  } 
  arg3 = static_cast< uint32_t >(val3);
  ecode4 = SWIG_AsVal_unsigned_SS_int(obj3, &val4);
  if (!SWIG_IsOK(ecode4)) {
    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "SBSourceManager_DisplaySourceLinesWithLineNumbersAndColumn" "', argument " "4"" of type '" "uint32_t""'");
  } 
  arg4 = static_cast< uint32_t >(val4);
  ecode5 = SWIG_AsVal_unsigned_SS_int(obj4, &val5);
  if (!SWIG_IsOK(ecode5)) {
    SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "SBSourceManager_DisplaySourceLinesWithLineNumbersAndColumn" "', argument " "5"" of type '" "uint32_t""'");
  } 
  arg5 = static_cast< uint32_t >(val5);
  ecode6 = SWIG_AsVal_unsigned_SS_int(obj5, &val6);
  if (!SWIG_IsOK(ecode6)) {
    SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "SBSourceManager_DisplaySourceLinesWithLineNumbersAndColumn" "', argument " "6"" of type '" "uint32_t""'");
  } 
  arg6 = static_cast< uint32_t >(val6);
  res7 = SWIG_AsCharPtrAndSize(obj6, &buf7, NULL, &alloc7);
  if (!SWIG_IsOK(res7)) {
    SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "SBSourceManager_DisplaySourceLinesWithLineNumbersAndColumn" "', argument " "7"" of type '" "char const *""'");
  }
  arg7 = reinterpret_cast< char * >(buf7);
  res8 = SWIG_ConvertPtr(obj7, &argp8, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res8)) {
    SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "SBSourceManager_DisplaySourceLinesWithLineNumbersAndColumn" "', argument " "8"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp8) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBSourceManager_DisplaySourceLinesWithLineNumbersAndColumn" "', argument " "8"" of type '" "lldb::SBStream &""'"); 
  }
  arg8 = reinterpret_cast< lldb::SBStream * >(argp8);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->DisplaySourceLinesWithLineNumbersAndColumn((lldb::SBFileSpec const &)*arg2,arg3,arg4,arg5,arg6,(char const *)arg7,*arg8);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
  if (alloc7 == SWIG_NEWOBJ) delete[] buf7;
  return resultobj;
fail:
  if (alloc7 == SWIG_NEWOBJ) delete[] buf7;
  return NULL;
}


SWIGINTERN PyObject *SBSourceManager_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBSourceManager, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBStream(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBStream *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBStream")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBStream *)new lldb::SBStream();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBStream, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBStream(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBStream *arg1 = (lldb::SBStream *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBStream",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBStream, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBStream" "', argument " "1"" of type '" "lldb::SBStream *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBStream * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBStream_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBStream *arg1 = (lldb::SBStream *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBStream_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBStream, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBStream_IsValid" "', argument " "1"" of type '" "lldb::SBStream const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBStream * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBStream const *)arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBStream_GetData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBStream *arg1 = (lldb::SBStream *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBStream_GetData",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBStream, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBStream_GetData" "', argument " "1"" of type '" "lldb::SBStream *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBStream * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetData();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBStream_GetSize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBStream *arg1 = (lldb::SBStream *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  size_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBStream_GetSize",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBStream, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBStream_GetSize" "', argument " "1"" of type '" "lldb::SBStream *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBStream * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetSize();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBStream_Print(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBStream *arg1 = (lldb::SBStream *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBStream_Print",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBStream, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBStream_Print" "', argument " "1"" of type '" "lldb::SBStream *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBStream * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBStream_Print" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    lldb_SBStream_Print(arg1,(char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBStream_RedirectToFile(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBStream *arg1 = (lldb::SBStream *) 0 ;
  char *arg2 = (char *) 0 ;
  bool arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  bool val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBStream_RedirectToFile",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBStream, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBStream_RedirectToFile" "', argument " "1"" of type '" "lldb::SBStream *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBStream * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBStream_RedirectToFile" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  ecode3 = SWIG_AsVal_bool(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBStream_RedirectToFile" "', argument " "3"" of type '" "bool""'");
  } 
  arg3 = static_cast< bool >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->RedirectToFile((char const *)arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBStream_RedirectToFileHandle(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBStream *arg1 = (lldb::SBStream *) 0 ;
  FILE *arg2 = (FILE *) 0 ;
  bool arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBStream_RedirectToFileHandle",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBStream, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBStream_RedirectToFileHandle" "', argument " "1"" of type '" "lldb::SBStream *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBStream * >(argp1);
  {
    using namespace lldb_private;
    if (obj1 == Py_None)
    arg2 = nullptr;
    else if (!lldb_private::PythonFile::Check(obj1)) {
      int fd = PyObject_AsFileDescriptor(obj1);
      PythonObject py_input(PyRefType::Borrowed, obj1);
      PythonString py_mode = py_input.GetAttributeValue("mode").AsType<PythonString>();
      
      if (-1 != fd && py_mode.IsValid()) {
        FILE *f;
        if ((f = fdopen(fd, py_mode.GetString().str().c_str())))
        arg2 = f;
        else
        PyErr_SetString(PyExc_TypeError, strerror(errno));
      } else {
        PyErr_SetString(PyExc_TypeError,"not a file-like object");
        return nullptr;
      }
    }
    else
    {
      PythonFile py_file(PyRefType::Borrowed, obj1);
      File file;
      if (!py_file.GetUnderlyingFile(file))
      return nullptr;
      
      arg2 = file.GetStream();
      if (arg2)
      file.Clear();
    }
  }
  ecode3 = SWIG_AsVal_bool(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBStream_RedirectToFileHandle" "', argument " "3"" of type '" "bool""'");
  } 
  arg3 = static_cast< bool >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->RedirectToFileHandle(arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBStream_RedirectToFileDescriptor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBStream *arg1 = (lldb::SBStream *) 0 ;
  int arg2 ;
  bool arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int val2 ;
  int ecode2 = 0 ;
  bool val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBStream_RedirectToFileDescriptor",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBStream, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBStream_RedirectToFileDescriptor" "', argument " "1"" of type '" "lldb::SBStream *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBStream * >(argp1);
  ecode2 = SWIG_AsVal_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBStream_RedirectToFileDescriptor" "', argument " "2"" of type '" "int""'");
  } 
  arg2 = static_cast< int >(val2);
  ecode3 = SWIG_AsVal_bool(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBStream_RedirectToFileDescriptor" "', argument " "3"" of type '" "bool""'");
  } 
  arg3 = static_cast< bool >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->RedirectToFileDescriptor(arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBStream_Clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBStream *arg1 = (lldb::SBStream *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBStream_Clear",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBStream, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBStream_Clear" "', argument " "1"" of type '" "lldb::SBStream *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBStream * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->Clear();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBStream_write(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBStream *arg1 = (lldb::SBStream *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBStream_write",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBStream, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBStream_write" "', argument " "1"" of type '" "lldb::SBStream *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBStream * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBStream_write" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    lldb_SBStream_write(arg1,(char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBStream_flush(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBStream *arg1 = (lldb::SBStream *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBStream_flush",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBStream, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBStream_flush" "', argument " "1"" of type '" "lldb::SBStream *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBStream * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    lldb_SBStream_flush(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBStream_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBStream, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBStringList__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBStringList *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBStringList")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBStringList *)new lldb::SBStringList();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBStringList, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBStringList__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBStringList *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBStringList *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBStringList",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBStringList,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBStringList" "', argument " "1"" of type '" "lldb::SBStringList const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBStringList" "', argument " "1"" of type '" "lldb::SBStringList const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBStringList * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBStringList *)new lldb::SBStringList((lldb::SBStringList const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBStringList, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBStringList(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBStringList__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBStringList, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBStringList__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBStringList'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBStringList()\n"
    "    lldb::SBStringList(lldb::SBStringList const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBStringList(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBStringList *arg1 = (lldb::SBStringList *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBStringList",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBStringList, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBStringList" "', argument " "1"" of type '" "lldb::SBStringList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBStringList * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBStringList_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBStringList *arg1 = (lldb::SBStringList *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBStringList_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBStringList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBStringList_IsValid" "', argument " "1"" of type '" "lldb::SBStringList const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBStringList * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBStringList const *)arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBStringList_AppendString(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBStringList *arg1 = (lldb::SBStringList *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBStringList_AppendString",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBStringList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBStringList_AppendString" "', argument " "1"" of type '" "lldb::SBStringList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBStringList * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBStringList_AppendString" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->AppendString((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBStringList_AppendList__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBStringList *arg1 = (lldb::SBStringList *) 0 ;
  char **arg2 = (char **) 0 ;
  int arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBStringList_AppendList",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBStringList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBStringList_AppendList" "', argument " "1"" of type '" "lldb::SBStringList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBStringList * >(argp1);
  {
    using namespace lldb_private;
    /* Check if is a list  */
    if (PythonList::Check(obj1)) {
      PythonList list(PyRefType::Borrowed, obj1);
      int size = list.GetSize();
      int i = 0;
      arg2 = (char**)malloc((size+1)*sizeof(char*));
      for (i = 0; i < size; i++) {
        PythonString py_str = list.GetItemAtIndex(i).AsType<PythonString>();
        if (!py_str.IsAllocated()) {
          PyErr_SetString(PyExc_TypeError,"list must contain strings");
          free(arg2);
          return nullptr;
        }
        
        arg2[i] = const_cast<char*>(py_str.GetString().data());
      }
      arg2[i] = 0;
    } else if (obj1 == Py_None) {
      arg2 =  NULL;
    } else {
      PyErr_SetString(PyExc_TypeError,"not a list");
      return NULL;
    }
  }
  ecode3 = SWIG_AsVal_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBStringList_AppendList" "', argument " "3"" of type '" "int""'");
  } 
  arg3 = static_cast< int >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->AppendList((char const **)arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  {
    free((char *) arg2);
  }
  return resultobj;
fail:
  {
    free((char *) arg2);
  }
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBStringList_AppendList__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBStringList *arg1 = (lldb::SBStringList *) 0 ;
  lldb::SBStringList *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBStringList_AppendList",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBStringList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBStringList_AppendList" "', argument " "1"" of type '" "lldb::SBStringList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBStringList * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStringList,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBStringList_AppendList" "', argument " "2"" of type '" "lldb::SBStringList const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBStringList_AppendList" "', argument " "2"" of type '" "lldb::SBStringList const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStringList * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->AppendList((lldb::SBStringList const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBStringList_AppendList(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[4];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 3); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBStringList, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_lldb__SBStringList, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        return _wrap_SBStringList_AppendList__SWIG_1(self, args);
      }
    }
  }
  if (argc == 3) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBStringList, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        /* Check if is a list  */
        _v = 1;
        using namespace lldb_private;
        if (PythonList::Check(argv[1])) {
          PythonList list(PyRefType::Borrowed, argv[1]);
          int size = list.GetSize();
          int i = 0;
          for (i = 0; i < size; i++) {
            PythonString s = list.GetItemAtIndex(i).AsType<PythonString>();
            if (!s.IsAllocated()) {
              _v = 0; 
            }
          }
        }
        else
        {
          _v = ( (argv[1] == Py_None) ? 1 : 0);
        }
      }
      if (_v) {
        {
          int res = SWIG_AsVal_int(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          return _wrap_SBStringList_AppendList__SWIG_0(self, args);
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBStringList_AppendList'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    AppendList(lldb::SBStringList *,char const **,int)\n"
    "    AppendList(lldb::SBStringList *,lldb::SBStringList const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBStringList_GetSize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBStringList *arg1 = (lldb::SBStringList *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBStringList_GetSize",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBStringList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBStringList_GetSize" "', argument " "1"" of type '" "lldb::SBStringList const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBStringList * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)((lldb::SBStringList const *)arg1)->GetSize();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBStringList_GetStringAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBStringList *arg1 = (lldb::SBStringList *) 0 ;
  size_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  size_t val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBStringList_GetStringAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBStringList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBStringList_GetStringAtIndex" "', argument " "1"" of type '" "lldb::SBStringList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBStringList * >(argp1);
  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBStringList_GetStringAtIndex" "', argument " "2"" of type '" "size_t""'");
  } 
  arg2 = static_cast< size_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetStringAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBStringList_Clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBStringList *arg1 = (lldb::SBStringList *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBStringList_Clear",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBStringList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBStringList_Clear" "', argument " "1"" of type '" "lldb::SBStringList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBStringList * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->Clear();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBStringList_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBStringList, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBStructuredData__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBStructuredData *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBStructuredData")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBStructuredData *)new lldb::SBStructuredData();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBStructuredData, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBStructuredData__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBStructuredData *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBStructuredData *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBStructuredData",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBStructuredData,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBStructuredData" "', argument " "1"" of type '" "lldb::SBStructuredData const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBStructuredData" "', argument " "1"" of type '" "lldb::SBStructuredData const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBStructuredData * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBStructuredData *)new lldb::SBStructuredData((lldb::SBStructuredData const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBStructuredData, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBStructuredData__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::EventSP *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBStructuredData *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBStructuredData",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_std__shared_ptrT_lldb_private__Event_t,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBStructuredData" "', argument " "1"" of type '" "lldb::EventSP const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBStructuredData" "', argument " "1"" of type '" "lldb::EventSP const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::EventSP * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBStructuredData *)new lldb::SBStructuredData((lldb::EventSP const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBStructuredData, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBStructuredData(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBStructuredData__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBStructuredData, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBStructuredData__SWIG_1(self, args);
    }
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_std__shared_ptrT_lldb_private__Event_t, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBStructuredData__SWIG_2(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBStructuredData'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBStructuredData()\n"
    "    lldb::SBStructuredData(lldb::SBStructuredData const &)\n"
    "    lldb::SBStructuredData(lldb::EventSP const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBStructuredData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBStructuredData *arg1 = (lldb::SBStructuredData *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBStructuredData",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBStructuredData, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBStructuredData" "', argument " "1"" of type '" "lldb::SBStructuredData *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBStructuredData * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBStructuredData_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBStructuredData *arg1 = (lldb::SBStructuredData *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBStructuredData_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBStructuredData, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBStructuredData_IsValid" "', argument " "1"" of type '" "lldb::SBStructuredData const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBStructuredData * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBStructuredData const *)arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBStructuredData_Clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBStructuredData *arg1 = (lldb::SBStructuredData *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBStructuredData_Clear",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBStructuredData, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBStructuredData_Clear" "', argument " "1"" of type '" "lldb::SBStructuredData *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBStructuredData * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->Clear();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBStructuredData_GetType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBStructuredData *arg1 = (lldb::SBStructuredData *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::StructuredDataType result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBStructuredData_GetType",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBStructuredData, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBStructuredData_GetType" "', argument " "1"" of type '" "lldb::SBStructuredData const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBStructuredData * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::StructuredDataType)((lldb::SBStructuredData const *)arg1)->GetType();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBStructuredData_GetSize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBStructuredData *arg1 = (lldb::SBStructuredData *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  size_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBStructuredData_GetSize",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBStructuredData, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBStructuredData_GetSize" "', argument " "1"" of type '" "lldb::SBStructuredData const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBStructuredData * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBStructuredData const *)arg1)->GetSize();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBStructuredData_GetValueForKey(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBStructuredData *arg1 = (lldb::SBStructuredData *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBStructuredData result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBStructuredData_GetValueForKey",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBStructuredData, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBStructuredData_GetValueForKey" "', argument " "1"" of type '" "lldb::SBStructuredData const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBStructuredData * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBStructuredData_GetValueForKey" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBStructuredData const *)arg1)->GetValueForKey((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBStructuredData(static_cast< const lldb::SBStructuredData& >(result))), SWIGTYPE_p_lldb__SBStructuredData, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBStructuredData_GetItemAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBStructuredData *arg1 = (lldb::SBStructuredData *) 0 ;
  size_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  size_t val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBStructuredData result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBStructuredData_GetItemAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBStructuredData, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBStructuredData_GetItemAtIndex" "', argument " "1"" of type '" "lldb::SBStructuredData const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBStructuredData * >(argp1);
  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBStructuredData_GetItemAtIndex" "', argument " "2"" of type '" "size_t""'");
  } 
  arg2 = static_cast< size_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBStructuredData const *)arg1)->GetItemAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBStructuredData(static_cast< const lldb::SBStructuredData& >(result))), SWIGTYPE_p_lldb__SBStructuredData, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBStructuredData_GetIntegerValue__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBStructuredData *arg1 = (lldb::SBStructuredData *) 0 ;
  uint64_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned long long val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  uint64_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBStructuredData_GetIntegerValue",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBStructuredData, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBStructuredData_GetIntegerValue" "', argument " "1"" of type '" "lldb::SBStructuredData const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBStructuredData * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_long_SS_long(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBStructuredData_GetIntegerValue" "', argument " "2"" of type '" "uint64_t""'");
  } 
  arg2 = static_cast< uint64_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint64_t)((lldb::SBStructuredData const *)arg1)->GetIntegerValue(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBStructuredData_GetIntegerValue__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBStructuredData *arg1 = (lldb::SBStructuredData *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint64_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBStructuredData_GetIntegerValue",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBStructuredData, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBStructuredData_GetIntegerValue" "', argument " "1"" of type '" "lldb::SBStructuredData const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBStructuredData * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint64_t)((lldb::SBStructuredData const *)arg1)->GetIntegerValue();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBStructuredData_GetIntegerValue(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[3];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 2); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 1) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBStructuredData, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_SBStructuredData_GetIntegerValue__SWIG_1(self, args);
    }
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBStructuredData, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_unsigned_SS_long_SS_long(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        return _wrap_SBStructuredData_GetIntegerValue__SWIG_0(self, args);
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBStructuredData_GetIntegerValue'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    GetIntegerValue(lldb::SBStructuredData const *,uint64_t)\n"
    "    GetIntegerValue(lldb::SBStructuredData const *)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBStructuredData_GetFloatValue__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBStructuredData *arg1 = (lldb::SBStructuredData *) 0 ;
  double arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  double val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  double result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBStructuredData_GetFloatValue",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBStructuredData, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBStructuredData_GetFloatValue" "', argument " "1"" of type '" "lldb::SBStructuredData const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBStructuredData * >(argp1);
  ecode2 = SWIG_AsVal_double(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBStructuredData_GetFloatValue" "', argument " "2"" of type '" "double""'");
  } 
  arg2 = static_cast< double >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (double)((lldb::SBStructuredData const *)arg1)->GetFloatValue(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_double(static_cast< double >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBStructuredData_GetFloatValue__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBStructuredData *arg1 = (lldb::SBStructuredData *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  double result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBStructuredData_GetFloatValue",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBStructuredData, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBStructuredData_GetFloatValue" "', argument " "1"" of type '" "lldb::SBStructuredData const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBStructuredData * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (double)((lldb::SBStructuredData const *)arg1)->GetFloatValue();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_double(static_cast< double >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBStructuredData_GetFloatValue(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[3];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 2); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 1) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBStructuredData, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_SBStructuredData_GetFloatValue__SWIG_1(self, args);
    }
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBStructuredData, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_double(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        return _wrap_SBStructuredData_GetFloatValue__SWIG_0(self, args);
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBStructuredData_GetFloatValue'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    GetFloatValue(lldb::SBStructuredData const *,double)\n"
    "    GetFloatValue(lldb::SBStructuredData const *)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBStructuredData_GetBooleanValue__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBStructuredData *arg1 = (lldb::SBStructuredData *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBStructuredData_GetBooleanValue",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBStructuredData, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBStructuredData_GetBooleanValue" "', argument " "1"" of type '" "lldb::SBStructuredData const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBStructuredData * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBStructuredData_GetBooleanValue" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBStructuredData const *)arg1)->GetBooleanValue(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBStructuredData_GetBooleanValue__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBStructuredData *arg1 = (lldb::SBStructuredData *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBStructuredData_GetBooleanValue",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBStructuredData, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBStructuredData_GetBooleanValue" "', argument " "1"" of type '" "lldb::SBStructuredData const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBStructuredData * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBStructuredData const *)arg1)->GetBooleanValue();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBStructuredData_GetBooleanValue(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[3];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 2); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 1) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBStructuredData, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_SBStructuredData_GetBooleanValue__SWIG_1(self, args);
    }
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBStructuredData, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_bool(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        return _wrap_SBStructuredData_GetBooleanValue__SWIG_0(self, args);
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBStructuredData_GetBooleanValue'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    GetBooleanValue(lldb::SBStructuredData const *,bool)\n"
    "    GetBooleanValue(lldb::SBStructuredData const *)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBStructuredData_GetStringValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBStructuredData *arg1 = (lldb::SBStructuredData *) 0 ;
  char *arg2 = (char *) 0 ;
  size_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  size_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBStructuredData_GetStringValue",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBStructuredData, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBStructuredData_GetStringValue" "', argument " "1"" of type '" "lldb::SBStructuredData const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBStructuredData * >(argp1);
  {
    if (!PyInt_Check(obj1)) {
      PyErr_SetString(PyExc_ValueError, "Expecting an integer");
      return NULL;
    }
    arg3 = PyInt_AsLong(obj1);
    if (arg3 <= 0) {
      PyErr_SetString(PyExc_ValueError, "Positive integer expected");
      return NULL;
    }
    arg2 = (char *) malloc(arg3);
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBStructuredData const *)arg1)->GetStringValue(arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
  {
    Py_XDECREF(resultobj);   /* Blow away any previous result */
    if (result == 0) {
      lldb_private::PythonString string("");
      resultobj = string.release();
      Py_INCREF(resultobj);
    } else {
      llvm::StringRef ref(static_cast<const char*>(arg2), result);
      lldb_private::PythonString string(ref);
      resultobj = string.release();
    }
    free(arg2);
  }
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBStructuredData_GetAsJSON(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBStructuredData *arg1 = (lldb::SBStructuredData *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBError result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBStructuredData_GetAsJSON",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBStructuredData, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBStructuredData_GetAsJSON" "', argument " "1"" of type '" "lldb::SBStructuredData const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBStructuredData * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBStructuredData_GetAsJSON" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBStructuredData_GetAsJSON" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBStructuredData const *)arg1)->GetAsJSON(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBError(static_cast< const lldb::SBError& >(result))), SWIGTYPE_p_lldb__SBError, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBStructuredData_GetDescription(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBStructuredData *arg1 = (lldb::SBStructuredData *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBError result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBStructuredData_GetDescription",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBStructuredData, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBStructuredData_GetDescription" "', argument " "1"" of type '" "lldb::SBStructuredData const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBStructuredData * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBStructuredData_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBStructuredData_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBStructuredData const *)arg1)->GetDescription(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBError(static_cast< const lldb::SBError& >(result))), SWIGTYPE_p_lldb__SBError, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBStructuredData_SetFromJSON(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBStructuredData *arg1 = (lldb::SBStructuredData *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBError result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBStructuredData_SetFromJSON",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBStructuredData, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBStructuredData_SetFromJSON" "', argument " "1"" of type '" "lldb::SBStructuredData *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBStructuredData * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBStructuredData_SetFromJSON" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBStructuredData_SetFromJSON" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->SetFromJSON(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBError(static_cast< const lldb::SBError& >(result))), SWIGTYPE_p_lldb__SBError, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBStructuredData_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBStructuredData, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBSymbol__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSymbol *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBSymbol")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBSymbol *)new lldb::SBSymbol();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBSymbol, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBSymbol(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSymbol *arg1 = (lldb::SBSymbol *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBSymbol",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSymbol, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBSymbol" "', argument " "1"" of type '" "lldb::SBSymbol *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSymbol * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBSymbol__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSymbol *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBSymbol *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBSymbol",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBSymbol,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBSymbol" "', argument " "1"" of type '" "lldb::SBSymbol const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBSymbol" "', argument " "1"" of type '" "lldb::SBSymbol const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSymbol * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBSymbol *)new lldb::SBSymbol((lldb::SBSymbol const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBSymbol, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBSymbol(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBSymbol__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBSymbol, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBSymbol__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBSymbol'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBSymbol()\n"
    "    lldb::SBSymbol(lldb::SBSymbol const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSymbol_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSymbol *arg1 = (lldb::SBSymbol *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBSymbol_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSymbol, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSymbol_IsValid" "', argument " "1"" of type '" "lldb::SBSymbol const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSymbol * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBSymbol const *)arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSymbol_GetName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSymbol *arg1 = (lldb::SBSymbol *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBSymbol_GetName",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSymbol, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSymbol_GetName" "', argument " "1"" of type '" "lldb::SBSymbol const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSymbol * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)((lldb::SBSymbol const *)arg1)->GetName();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSymbol_GetDisplayName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSymbol *arg1 = (lldb::SBSymbol *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBSymbol_GetDisplayName",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSymbol, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSymbol_GetDisplayName" "', argument " "1"" of type '" "lldb::SBSymbol const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSymbol * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)((lldb::SBSymbol const *)arg1)->GetDisplayName();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSymbol_GetMangledName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSymbol *arg1 = (lldb::SBSymbol *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBSymbol_GetMangledName",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSymbol, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSymbol_GetMangledName" "', argument " "1"" of type '" "lldb::SBSymbol const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSymbol * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)((lldb::SBSymbol const *)arg1)->GetMangledName();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSymbol_GetInstructions__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSymbol *arg1 = (lldb::SBSymbol *) 0 ;
  lldb::SBTarget arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBInstructionList result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBSymbol_GetInstructions",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSymbol, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSymbol_GetInstructions" "', argument " "1"" of type '" "lldb::SBSymbol *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSymbol * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTarget,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBSymbol_GetInstructions" "', argument " "2"" of type '" "lldb::SBTarget""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBSymbol_GetInstructions" "', argument " "2"" of type '" "lldb::SBTarget""'");
    } else {
      lldb::SBTarget * temp = reinterpret_cast< lldb::SBTarget * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetInstructions(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBInstructionList(static_cast< const lldb::SBInstructionList& >(result))), SWIGTYPE_p_lldb__SBInstructionList, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSymbol_GetInstructions__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSymbol *arg1 = (lldb::SBSymbol *) 0 ;
  lldb::SBTarget arg2 ;
  char *arg3 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  int res3 ;
  char *buf3 = 0 ;
  int alloc3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBInstructionList result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBSymbol_GetInstructions",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSymbol, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSymbol_GetInstructions" "', argument " "1"" of type '" "lldb::SBSymbol *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSymbol * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTarget,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBSymbol_GetInstructions" "', argument " "2"" of type '" "lldb::SBTarget""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBSymbol_GetInstructions" "', argument " "2"" of type '" "lldb::SBTarget""'");
    } else {
      lldb::SBTarget * temp = reinterpret_cast< lldb::SBTarget * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3);
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBSymbol_GetInstructions" "', argument " "3"" of type '" "char const *""'");
  }
  arg3 = reinterpret_cast< char * >(buf3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetInstructions(arg2,(char const *)arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBInstructionList(static_cast< const lldb::SBInstructionList& >(result))), SWIGTYPE_p_lldb__SBInstructionList, SWIG_POINTER_OWN |  0 );
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  return resultobj;
fail:
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSymbol_GetInstructions(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[4];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 3); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBSymbol, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_lldb__SBTarget, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        return _wrap_SBSymbol_GetInstructions__SWIG_0(self, args);
      }
    }
  }
  if (argc == 3) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBSymbol, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_lldb__SBTarget, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        int res = SWIG_AsCharPtrAndSize(argv[2], 0, NULL, 0);
        _v = SWIG_CheckState(res);
        if (_v) {
          return _wrap_SBSymbol_GetInstructions__SWIG_1(self, args);
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBSymbol_GetInstructions'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    GetInstructions(lldb::SBSymbol *,lldb::SBTarget)\n"
    "    GetInstructions(lldb::SBSymbol *,lldb::SBTarget,char const *)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSymbol_GetStartAddress(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSymbol *arg1 = (lldb::SBSymbol *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBAddress result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBSymbol_GetStartAddress",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSymbol, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSymbol_GetStartAddress" "', argument " "1"" of type '" "lldb::SBSymbol *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSymbol * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetStartAddress();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBAddress(static_cast< const lldb::SBAddress& >(result))), SWIGTYPE_p_lldb__SBAddress, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSymbol_GetEndAddress(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSymbol *arg1 = (lldb::SBSymbol *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBAddress result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBSymbol_GetEndAddress",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSymbol, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSymbol_GetEndAddress" "', argument " "1"" of type '" "lldb::SBSymbol *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSymbol * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetEndAddress();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBAddress(static_cast< const lldb::SBAddress& >(result))), SWIGTYPE_p_lldb__SBAddress, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSymbol_GetPrologueByteSize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSymbol *arg1 = (lldb::SBSymbol *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBSymbol_GetPrologueByteSize",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSymbol, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSymbol_GetPrologueByteSize" "', argument " "1"" of type '" "lldb::SBSymbol *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSymbol * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetPrologueByteSize();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSymbol_GetType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSymbol *arg1 = (lldb::SBSymbol *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SymbolType result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBSymbol_GetType",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSymbol, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSymbol_GetType" "', argument " "1"" of type '" "lldb::SBSymbol *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSymbol * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SymbolType)(arg1)->GetType();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSymbol_GetDescription(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSymbol *arg1 = (lldb::SBSymbol *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBSymbol_GetDescription",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSymbol, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSymbol_GetDescription" "', argument " "1"" of type '" "lldb::SBSymbol *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSymbol * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBSymbol_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBSymbol_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetDescription(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSymbol_IsExternal(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSymbol *arg1 = (lldb::SBSymbol *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBSymbol_IsExternal",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSymbol, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSymbol_IsExternal" "', argument " "1"" of type '" "lldb::SBSymbol *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSymbol * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsExternal();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSymbol_IsSynthetic(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSymbol *arg1 = (lldb::SBSymbol *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBSymbol_IsSynthetic",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSymbol, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSymbol_IsSynthetic" "', argument " "1"" of type '" "lldb::SBSymbol *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSymbol * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsSynthetic();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSymbol___eq__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSymbol *arg1 = (lldb::SBSymbol *) 0 ;
  lldb::SBSymbol *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBSymbol___eq__",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSymbol, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSymbol___eq__" "', argument " "1"" of type '" "lldb::SBSymbol const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSymbol * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBSymbol,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBSymbol___eq__" "', argument " "2"" of type '" "lldb::SBSymbol const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBSymbol___eq__" "', argument " "2"" of type '" "lldb::SBSymbol const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBSymbol * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBSymbol const *)arg1)->operator ==((lldb::SBSymbol const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSymbol___ne__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSymbol *arg1 = (lldb::SBSymbol *) 0 ;
  lldb::SBSymbol *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBSymbol___ne__",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSymbol, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSymbol___ne__" "', argument " "1"" of type '" "lldb::SBSymbol const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSymbol * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBSymbol,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBSymbol___ne__" "', argument " "2"" of type '" "lldb::SBSymbol const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBSymbol___ne__" "', argument " "2"" of type '" "lldb::SBSymbol const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBSymbol * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBSymbol const *)arg1)->operator !=((lldb::SBSymbol const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSymbol___str__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSymbol *arg1 = (lldb::SBSymbol *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBSymbol___str__",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSymbol, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSymbol___str__" "', argument " "1"" of type '" "lldb::SBSymbol *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSymbol * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (PyObject *)lldb_SBSymbol___str__(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = result;
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBSymbol_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBSymbol, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBSymbolContext__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSymbolContext *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBSymbolContext")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBSymbolContext *)new lldb::SBSymbolContext();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBSymbolContext, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBSymbolContext__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSymbolContext *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBSymbolContext *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBSymbolContext",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBSymbolContext,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBSymbolContext" "', argument " "1"" of type '" "lldb::SBSymbolContext const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBSymbolContext" "', argument " "1"" of type '" "lldb::SBSymbolContext const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSymbolContext * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBSymbolContext *)new lldb::SBSymbolContext((lldb::SBSymbolContext const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBSymbolContext, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBSymbolContext(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBSymbolContext__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBSymbolContext, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBSymbolContext__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBSymbolContext'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBSymbolContext()\n"
    "    lldb::SBSymbolContext(lldb::SBSymbolContext const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBSymbolContext(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSymbolContext *arg1 = (lldb::SBSymbolContext *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBSymbolContext",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSymbolContext, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBSymbolContext" "', argument " "1"" of type '" "lldb::SBSymbolContext *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSymbolContext * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSymbolContext_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSymbolContext *arg1 = (lldb::SBSymbolContext *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBSymbolContext_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSymbolContext, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSymbolContext_IsValid" "', argument " "1"" of type '" "lldb::SBSymbolContext const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSymbolContext * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBSymbolContext const *)arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSymbolContext_GetModule(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSymbolContext *arg1 = (lldb::SBSymbolContext *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBModule result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBSymbolContext_GetModule",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSymbolContext, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSymbolContext_GetModule" "', argument " "1"" of type '" "lldb::SBSymbolContext *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSymbolContext * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetModule();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBModule(static_cast< const lldb::SBModule& >(result))), SWIGTYPE_p_lldb__SBModule, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSymbolContext_GetCompileUnit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSymbolContext *arg1 = (lldb::SBSymbolContext *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBCompileUnit result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBSymbolContext_GetCompileUnit",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSymbolContext, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSymbolContext_GetCompileUnit" "', argument " "1"" of type '" "lldb::SBSymbolContext *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSymbolContext * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetCompileUnit();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBCompileUnit(static_cast< const lldb::SBCompileUnit& >(result))), SWIGTYPE_p_lldb__SBCompileUnit, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSymbolContext_GetFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSymbolContext *arg1 = (lldb::SBSymbolContext *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBFunction result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBSymbolContext_GetFunction",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSymbolContext, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSymbolContext_GetFunction" "', argument " "1"" of type '" "lldb::SBSymbolContext *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSymbolContext * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetFunction();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBFunction(static_cast< const lldb::SBFunction& >(result))), SWIGTYPE_p_lldb__SBFunction, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSymbolContext_GetBlock(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSymbolContext *arg1 = (lldb::SBSymbolContext *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBBlock result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBSymbolContext_GetBlock",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSymbolContext, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSymbolContext_GetBlock" "', argument " "1"" of type '" "lldb::SBSymbolContext *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSymbolContext * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetBlock();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBBlock(static_cast< const lldb::SBBlock& >(result))), SWIGTYPE_p_lldb__SBBlock, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSymbolContext_GetLineEntry(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSymbolContext *arg1 = (lldb::SBSymbolContext *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBLineEntry result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBSymbolContext_GetLineEntry",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSymbolContext, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSymbolContext_GetLineEntry" "', argument " "1"" of type '" "lldb::SBSymbolContext *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSymbolContext * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetLineEntry();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBLineEntry(static_cast< const lldb::SBLineEntry& >(result))), SWIGTYPE_p_lldb__SBLineEntry, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSymbolContext_GetSymbol(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSymbolContext *arg1 = (lldb::SBSymbolContext *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBSymbol result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBSymbolContext_GetSymbol",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSymbolContext, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSymbolContext_GetSymbol" "', argument " "1"" of type '" "lldb::SBSymbolContext *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSymbolContext * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetSymbol();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBSymbol(static_cast< const lldb::SBSymbol& >(result))), SWIGTYPE_p_lldb__SBSymbol, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSymbolContext_SetModule(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSymbolContext *arg1 = (lldb::SBSymbolContext *) 0 ;
  lldb::SBModule arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBSymbolContext_SetModule",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSymbolContext, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSymbolContext_SetModule" "', argument " "1"" of type '" "lldb::SBSymbolContext *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSymbolContext * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBModule,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBSymbolContext_SetModule" "', argument " "2"" of type '" "lldb::SBModule""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBSymbolContext_SetModule" "', argument " "2"" of type '" "lldb::SBModule""'");
    } else {
      lldb::SBModule * temp = reinterpret_cast< lldb::SBModule * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetModule(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSymbolContext_SetCompileUnit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSymbolContext *arg1 = (lldb::SBSymbolContext *) 0 ;
  lldb::SBCompileUnit arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBSymbolContext_SetCompileUnit",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSymbolContext, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSymbolContext_SetCompileUnit" "', argument " "1"" of type '" "lldb::SBSymbolContext *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSymbolContext * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBCompileUnit,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBSymbolContext_SetCompileUnit" "', argument " "2"" of type '" "lldb::SBCompileUnit""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBSymbolContext_SetCompileUnit" "', argument " "2"" of type '" "lldb::SBCompileUnit""'");
    } else {
      lldb::SBCompileUnit * temp = reinterpret_cast< lldb::SBCompileUnit * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetCompileUnit(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSymbolContext_SetFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSymbolContext *arg1 = (lldb::SBSymbolContext *) 0 ;
  lldb::SBFunction arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBSymbolContext_SetFunction",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSymbolContext, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSymbolContext_SetFunction" "', argument " "1"" of type '" "lldb::SBSymbolContext *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSymbolContext * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBFunction,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBSymbolContext_SetFunction" "', argument " "2"" of type '" "lldb::SBFunction""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBSymbolContext_SetFunction" "', argument " "2"" of type '" "lldb::SBFunction""'");
    } else {
      lldb::SBFunction * temp = reinterpret_cast< lldb::SBFunction * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetFunction(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSymbolContext_SetBlock(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSymbolContext *arg1 = (lldb::SBSymbolContext *) 0 ;
  lldb::SBBlock arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBSymbolContext_SetBlock",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSymbolContext, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSymbolContext_SetBlock" "', argument " "1"" of type '" "lldb::SBSymbolContext *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSymbolContext * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBBlock,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBSymbolContext_SetBlock" "', argument " "2"" of type '" "lldb::SBBlock""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBSymbolContext_SetBlock" "', argument " "2"" of type '" "lldb::SBBlock""'");
    } else {
      lldb::SBBlock * temp = reinterpret_cast< lldb::SBBlock * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetBlock(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSymbolContext_SetLineEntry(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSymbolContext *arg1 = (lldb::SBSymbolContext *) 0 ;
  lldb::SBLineEntry arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBSymbolContext_SetLineEntry",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSymbolContext, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSymbolContext_SetLineEntry" "', argument " "1"" of type '" "lldb::SBSymbolContext *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSymbolContext * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBLineEntry,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBSymbolContext_SetLineEntry" "', argument " "2"" of type '" "lldb::SBLineEntry""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBSymbolContext_SetLineEntry" "', argument " "2"" of type '" "lldb::SBLineEntry""'");
    } else {
      lldb::SBLineEntry * temp = reinterpret_cast< lldb::SBLineEntry * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetLineEntry(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSymbolContext_SetSymbol(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSymbolContext *arg1 = (lldb::SBSymbolContext *) 0 ;
  lldb::SBSymbol arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBSymbolContext_SetSymbol",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSymbolContext, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSymbolContext_SetSymbol" "', argument " "1"" of type '" "lldb::SBSymbolContext *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSymbolContext * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBSymbol,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBSymbolContext_SetSymbol" "', argument " "2"" of type '" "lldb::SBSymbol""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBSymbolContext_SetSymbol" "', argument " "2"" of type '" "lldb::SBSymbol""'");
    } else {
      lldb::SBSymbol * temp = reinterpret_cast< lldb::SBSymbol * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetSymbol(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSymbolContext_GetParentOfInlinedScope(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSymbolContext *arg1 = (lldb::SBSymbolContext *) 0 ;
  lldb::SBAddress *arg2 = 0 ;
  lldb::SBAddress *arg3 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  void *argp3 = 0 ;
  int res3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBSymbolContext result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBSymbolContext_GetParentOfInlinedScope",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSymbolContext, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSymbolContext_GetParentOfInlinedScope" "', argument " "1"" of type '" "lldb::SBSymbolContext const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSymbolContext * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBAddress,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBSymbolContext_GetParentOfInlinedScope" "', argument " "2"" of type '" "lldb::SBAddress const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBSymbolContext_GetParentOfInlinedScope" "', argument " "2"" of type '" "lldb::SBAddress const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBAddress * >(argp2);
  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBAddress,  0 );
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBSymbolContext_GetParentOfInlinedScope" "', argument " "3"" of type '" "lldb::SBAddress &""'"); 
  }
  if (!argp3) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBSymbolContext_GetParentOfInlinedScope" "', argument " "3"" of type '" "lldb::SBAddress &""'"); 
  }
  arg3 = reinterpret_cast< lldb::SBAddress * >(argp3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBSymbolContext const *)arg1)->GetParentOfInlinedScope((lldb::SBAddress const &)*arg2,*arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBSymbolContext(static_cast< const lldb::SBSymbolContext& >(result))), SWIGTYPE_p_lldb__SBSymbolContext, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSymbolContext_GetDescription(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSymbolContext *arg1 = (lldb::SBSymbolContext *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBSymbolContext_GetDescription",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSymbolContext, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSymbolContext_GetDescription" "', argument " "1"" of type '" "lldb::SBSymbolContext *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSymbolContext * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBSymbolContext_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBSymbolContext_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetDescription(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSymbolContext___str__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSymbolContext *arg1 = (lldb::SBSymbolContext *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBSymbolContext___str__",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSymbolContext, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSymbolContext___str__" "', argument " "1"" of type '" "lldb::SBSymbolContext *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSymbolContext * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (PyObject *)lldb_SBSymbolContext___str__(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = result;
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBSymbolContext_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBSymbolContext, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBSymbolContextList__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSymbolContextList *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBSymbolContextList")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBSymbolContextList *)new lldb::SBSymbolContextList();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBSymbolContextList, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBSymbolContextList__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSymbolContextList *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBSymbolContextList *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBSymbolContextList",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBSymbolContextList,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBSymbolContextList" "', argument " "1"" of type '" "lldb::SBSymbolContextList const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBSymbolContextList" "', argument " "1"" of type '" "lldb::SBSymbolContextList const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSymbolContextList * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBSymbolContextList *)new lldb::SBSymbolContextList((lldb::SBSymbolContextList const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBSymbolContextList, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBSymbolContextList(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBSymbolContextList__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBSymbolContextList, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBSymbolContextList__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBSymbolContextList'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBSymbolContextList()\n"
    "    lldb::SBSymbolContextList(lldb::SBSymbolContextList const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBSymbolContextList(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSymbolContextList *arg1 = (lldb::SBSymbolContextList *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBSymbolContextList",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSymbolContextList, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBSymbolContextList" "', argument " "1"" of type '" "lldb::SBSymbolContextList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSymbolContextList * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSymbolContextList_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSymbolContextList *arg1 = (lldb::SBSymbolContextList *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBSymbolContextList_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSymbolContextList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSymbolContextList_IsValid" "', argument " "1"" of type '" "lldb::SBSymbolContextList const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSymbolContextList * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBSymbolContextList const *)arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSymbolContextList_GetSize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSymbolContextList *arg1 = (lldb::SBSymbolContextList *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBSymbolContextList_GetSize",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSymbolContextList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSymbolContextList_GetSize" "', argument " "1"" of type '" "lldb::SBSymbolContextList const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSymbolContextList * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)((lldb::SBSymbolContextList const *)arg1)->GetSize();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSymbolContextList_GetContextAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSymbolContextList *arg1 = (lldb::SBSymbolContextList *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBSymbolContext result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBSymbolContextList_GetContextAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSymbolContextList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSymbolContextList_GetContextAtIndex" "', argument " "1"" of type '" "lldb::SBSymbolContextList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSymbolContextList * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBSymbolContextList_GetContextAtIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetContextAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBSymbolContext(static_cast< const lldb::SBSymbolContext& >(result))), SWIGTYPE_p_lldb__SBSymbolContext, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSymbolContextList_Append__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSymbolContextList *arg1 = (lldb::SBSymbolContextList *) 0 ;
  lldb::SBSymbolContext *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBSymbolContextList_Append",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSymbolContextList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSymbolContextList_Append" "', argument " "1"" of type '" "lldb::SBSymbolContextList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSymbolContextList * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBSymbolContext,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBSymbolContextList_Append" "', argument " "2"" of type '" "lldb::SBSymbolContext &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBSymbolContextList_Append" "', argument " "2"" of type '" "lldb::SBSymbolContext &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBSymbolContext * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->Append(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSymbolContextList_Append__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSymbolContextList *arg1 = (lldb::SBSymbolContextList *) 0 ;
  lldb::SBSymbolContextList *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBSymbolContextList_Append",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSymbolContextList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSymbolContextList_Append" "', argument " "1"" of type '" "lldb::SBSymbolContextList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSymbolContextList * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBSymbolContextList,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBSymbolContextList_Append" "', argument " "2"" of type '" "lldb::SBSymbolContextList &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBSymbolContextList_Append" "', argument " "2"" of type '" "lldb::SBSymbolContextList &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBSymbolContextList * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->Append(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSymbolContextList_Append(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[3];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 2); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBSymbolContextList, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      void *vptr = 0;
      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_lldb__SBSymbolContext, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        return _wrap_SBSymbolContextList_Append__SWIG_0(self, args);
      }
    }
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBSymbolContextList, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      void *vptr = 0;
      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_lldb__SBSymbolContextList, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        return _wrap_SBSymbolContextList_Append__SWIG_1(self, args);
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBSymbolContextList_Append'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    Append(lldb::SBSymbolContextList *,lldb::SBSymbolContext &)\n"
    "    Append(lldb::SBSymbolContextList *,lldb::SBSymbolContextList &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSymbolContextList_GetDescription(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSymbolContextList *arg1 = (lldb::SBSymbolContextList *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBSymbolContextList_GetDescription",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSymbolContextList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSymbolContextList_GetDescription" "', argument " "1"" of type '" "lldb::SBSymbolContextList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSymbolContextList * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBSymbolContextList_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBSymbolContextList_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetDescription(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSymbolContextList_Clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSymbolContextList *arg1 = (lldb::SBSymbolContextList *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBSymbolContextList_Clear",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSymbolContextList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSymbolContextList_Clear" "', argument " "1"" of type '" "lldb::SBSymbolContextList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSymbolContextList * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->Clear();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBSymbolContextList___str__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBSymbolContextList *arg1 = (lldb::SBSymbolContextList *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBSymbolContextList___str__",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBSymbolContextList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBSymbolContextList___str__" "', argument " "1"" of type '" "lldb::SBSymbolContextList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBSymbolContextList * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (PyObject *)lldb_SBSymbolContextList___str__(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = result;
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBSymbolContextList_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBSymbolContextList, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBTarget__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBTarget")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBTarget *)new lldb::SBTarget();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBTarget, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBTarget__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBTarget *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBTarget",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBTarget,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBTarget" "', argument " "1"" of type '" "lldb::SBTarget const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBTarget" "', argument " "1"" of type '" "lldb::SBTarget const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBTarget *)new lldb::SBTarget((lldb::SBTarget const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBTarget, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBTarget(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBTarget__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBTarget, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBTarget__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBTarget'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBTarget()\n"
    "    lldb::SBTarget(lldb::SBTarget const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBTarget(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBTarget",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBTarget" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_GetBroadcasterClassName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":SBTarget_GetBroadcasterClassName")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)lldb::SBTarget::GetBroadcasterClassName();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTarget_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_IsValid" "', argument " "1"" of type '" "lldb::SBTarget const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBTarget const *)arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_EventIsTargetEvent(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBEvent *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTarget_EventIsTargetEvent",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBEvent,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_EventIsTargetEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_EventIsTargetEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBEvent * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)lldb::SBTarget::EventIsTargetEvent((lldb::SBEvent const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_GetTargetFromEvent(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBEvent *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBTarget result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTarget_GetTargetFromEvent",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBEvent,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_GetTargetFromEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_GetTargetFromEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBEvent * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = lldb::SBTarget::GetTargetFromEvent((lldb::SBEvent const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTarget(static_cast< const lldb::SBTarget& >(result))), SWIGTYPE_p_lldb__SBTarget, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_GetNumModulesFromEvent(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBEvent *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTarget_GetNumModulesFromEvent",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBEvent,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_GetNumModulesFromEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_GetNumModulesFromEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBEvent * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)lldb::SBTarget::GetNumModulesFromEvent((lldb::SBEvent const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_GetModuleAtIndexFromEvent(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  uint32_t arg1 ;
  lldb::SBEvent *arg2 = 0 ;
  unsigned int val1 ;
  int ecode1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBModule result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTarget_GetModuleAtIndexFromEvent",&obj0,&obj1)) SWIG_fail;
  ecode1 = SWIG_AsVal_unsigned_SS_int(obj0, &val1);
  if (!SWIG_IsOK(ecode1)) {
    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "SBTarget_GetModuleAtIndexFromEvent" "', argument " "1"" of type '" "uint32_t""'");
  } 
  arg1 = static_cast< uint32_t >(val1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBEvent,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_GetModuleAtIndexFromEvent" "', argument " "2"" of type '" "lldb::SBEvent const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_GetModuleAtIndexFromEvent" "', argument " "2"" of type '" "lldb::SBEvent const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBEvent * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = lldb::SBTarget::GetModuleAtIndexFromEvent(arg1,(lldb::SBEvent const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBModule(static_cast< const lldb::SBModule& >(result))), SWIGTYPE_p_lldb__SBModule, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_GetProcess(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBProcess result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTarget_GetProcess",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_GetProcess" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetProcess();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBProcess(static_cast< const lldb::SBProcess& >(result))), SWIGTYPE_p_lldb__SBProcess, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_GetPlatform(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBPlatform result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTarget_GetPlatform",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_GetPlatform" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetPlatform();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBPlatform(static_cast< const lldb::SBPlatform& >(result))), SWIGTYPE_p_lldb__SBPlatform, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_Install(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBError result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTarget_Install",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_Install" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->Install();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBError(static_cast< const lldb::SBError& >(result))), SWIGTYPE_p_lldb__SBError, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_Launch__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  lldb::SBListener *arg2 = 0 ;
  char **arg3 = (char **) 0 ;
  char **arg4 = (char **) 0 ;
  char *arg5 = (char *) 0 ;
  char *arg6 = (char *) 0 ;
  char *arg7 = (char *) 0 ;
  char *arg8 = (char *) 0 ;
  uint32_t arg9 ;
  bool arg10 ;
  lldb::SBError *arg11 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  int res5 ;
  char *buf5 = 0 ;
  int alloc5 = 0 ;
  int res6 ;
  char *buf6 = 0 ;
  int alloc6 = 0 ;
  int res7 ;
  char *buf7 = 0 ;
  int alloc7 = 0 ;
  int res8 ;
  char *buf8 = 0 ;
  int alloc8 = 0 ;
  unsigned int val9 ;
  int ecode9 = 0 ;
  bool val10 ;
  int ecode10 = 0 ;
  void *argp11 = 0 ;
  int res11 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  PyObject * obj4 = 0 ;
  PyObject * obj5 = 0 ;
  PyObject * obj6 = 0 ;
  PyObject * obj7 = 0 ;
  PyObject * obj8 = 0 ;
  PyObject * obj9 = 0 ;
  PyObject * obj10 = 0 ;
  lldb::SBProcess result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOOOOOOOOO:SBTarget_Launch",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9,&obj10)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_Launch" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBListener,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_Launch" "', argument " "2"" of type '" "lldb::SBListener &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_Launch" "', argument " "2"" of type '" "lldb::SBListener &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBListener * >(argp2);
  {
    using namespace lldb_private;
    /* Check if is a list  */
    if (PythonList::Check(obj2)) {
      PythonList list(PyRefType::Borrowed, obj2);
      int size = list.GetSize();
      int i = 0;
      arg3 = (char**)malloc((size+1)*sizeof(char*));
      for (i = 0; i < size; i++) {
        PythonString py_str = list.GetItemAtIndex(i).AsType<PythonString>();
        if (!py_str.IsAllocated()) {
          PyErr_SetString(PyExc_TypeError,"list must contain strings");
          free(arg3);
          return nullptr;
        }
        
        arg3[i] = const_cast<char*>(py_str.GetString().data());
      }
      arg3[i] = 0;
    } else if (obj2 == Py_None) {
      arg3 =  NULL;
    } else {
      PyErr_SetString(PyExc_TypeError,"not a list");
      return NULL;
    }
  }
  {
    using namespace lldb_private;
    /* Check if is a list  */
    if (PythonList::Check(obj3)) {
      PythonList list(PyRefType::Borrowed, obj3);
      int size = list.GetSize();
      int i = 0;
      arg4 = (char**)malloc((size+1)*sizeof(char*));
      for (i = 0; i < size; i++) {
        PythonString py_str = list.GetItemAtIndex(i).AsType<PythonString>();
        if (!py_str.IsAllocated()) {
          PyErr_SetString(PyExc_TypeError,"list must contain strings");
          free(arg4);
          return nullptr;
        }
        
        arg4[i] = const_cast<char*>(py_str.GetString().data());
      }
      arg4[i] = 0;
    } else if (obj3 == Py_None) {
      arg4 =  NULL;
    } else {
      PyErr_SetString(PyExc_TypeError,"not a list");
      return NULL;
    }
  }
  res5 = SWIG_AsCharPtrAndSize(obj4, &buf5, NULL, &alloc5);
  if (!SWIG_IsOK(res5)) {
    SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "SBTarget_Launch" "', argument " "5"" of type '" "char const *""'");
  }
  arg5 = reinterpret_cast< char * >(buf5);
  res6 = SWIG_AsCharPtrAndSize(obj5, &buf6, NULL, &alloc6);
  if (!SWIG_IsOK(res6)) {
    SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "SBTarget_Launch" "', argument " "6"" of type '" "char const *""'");
  }
  arg6 = reinterpret_cast< char * >(buf6);
  res7 = SWIG_AsCharPtrAndSize(obj6, &buf7, NULL, &alloc7);
  if (!SWIG_IsOK(res7)) {
    SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "SBTarget_Launch" "', argument " "7"" of type '" "char const *""'");
  }
  arg7 = reinterpret_cast< char * >(buf7);
  res8 = SWIG_AsCharPtrAndSize(obj7, &buf8, NULL, &alloc8);
  if (!SWIG_IsOK(res8)) {
    SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "SBTarget_Launch" "', argument " "8"" of type '" "char const *""'");
  }
  arg8 = reinterpret_cast< char * >(buf8);
  ecode9 = SWIG_AsVal_unsigned_SS_int(obj8, &val9);
  if (!SWIG_IsOK(ecode9)) {
    SWIG_exception_fail(SWIG_ArgError(ecode9), "in method '" "SBTarget_Launch" "', argument " "9"" of type '" "uint32_t""'");
  } 
  arg9 = static_cast< uint32_t >(val9);
  ecode10 = SWIG_AsVal_bool(obj9, &val10);
  if (!SWIG_IsOK(ecode10)) {
    SWIG_exception_fail(SWIG_ArgError(ecode10), "in method '" "SBTarget_Launch" "', argument " "10"" of type '" "bool""'");
  } 
  arg10 = static_cast< bool >(val10);
  res11 = SWIG_ConvertPtr(obj10, &argp11, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res11)) {
    SWIG_exception_fail(SWIG_ArgError(res11), "in method '" "SBTarget_Launch" "', argument " "11"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp11) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_Launch" "', argument " "11"" of type '" "lldb::SBError &""'"); 
  }
  arg11 = reinterpret_cast< lldb::SBError * >(argp11);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->Launch(*arg2,(char const **)arg3,(char const **)arg4,(char const *)arg5,(char const *)arg6,(char const *)arg7,(char const *)arg8,arg9,arg10,*arg11);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBProcess(static_cast< const lldb::SBProcess& >(result))), SWIGTYPE_p_lldb__SBProcess, SWIG_POINTER_OWN |  0 );
  {
    free((char *) arg3);
  }
  {
    free((char *) arg4);
  }
  if (alloc5 == SWIG_NEWOBJ) delete[] buf5;
  if (alloc6 == SWIG_NEWOBJ) delete[] buf6;
  if (alloc7 == SWIG_NEWOBJ) delete[] buf7;
  if (alloc8 == SWIG_NEWOBJ) delete[] buf8;
  return resultobj;
fail:
  {
    free((char *) arg3);
  }
  {
    free((char *) arg4);
  }
  if (alloc5 == SWIG_NEWOBJ) delete[] buf5;
  if (alloc6 == SWIG_NEWOBJ) delete[] buf6;
  if (alloc7 == SWIG_NEWOBJ) delete[] buf7;
  if (alloc8 == SWIG_NEWOBJ) delete[] buf8;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_LaunchSimple(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  char **arg2 = (char **) 0 ;
  char **arg3 = (char **) 0 ;
  char *arg4 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res4 ;
  char *buf4 = 0 ;
  int alloc4 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  lldb::SBProcess result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOO:SBTarget_LaunchSimple",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_LaunchSimple" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  {
    using namespace lldb_private;
    /* Check if is a list  */
    if (PythonList::Check(obj1)) {
      PythonList list(PyRefType::Borrowed, obj1);
      int size = list.GetSize();
      int i = 0;
      arg2 = (char**)malloc((size+1)*sizeof(char*));
      for (i = 0; i < size; i++) {
        PythonString py_str = list.GetItemAtIndex(i).AsType<PythonString>();
        if (!py_str.IsAllocated()) {
          PyErr_SetString(PyExc_TypeError,"list must contain strings");
          free(arg2);
          return nullptr;
        }
        
        arg2[i] = const_cast<char*>(py_str.GetString().data());
      }
      arg2[i] = 0;
    } else if (obj1 == Py_None) {
      arg2 =  NULL;
    } else {
      PyErr_SetString(PyExc_TypeError,"not a list");
      return NULL;
    }
  }
  {
    using namespace lldb_private;
    /* Check if is a list  */
    if (PythonList::Check(obj2)) {
      PythonList list(PyRefType::Borrowed, obj2);
      int size = list.GetSize();
      int i = 0;
      arg3 = (char**)malloc((size+1)*sizeof(char*));
      for (i = 0; i < size; i++) {
        PythonString py_str = list.GetItemAtIndex(i).AsType<PythonString>();
        if (!py_str.IsAllocated()) {
          PyErr_SetString(PyExc_TypeError,"list must contain strings");
          free(arg3);
          return nullptr;
        }
        
        arg3[i] = const_cast<char*>(py_str.GetString().data());
      }
      arg3[i] = 0;
    } else if (obj2 == Py_None) {
      arg3 =  NULL;
    } else {
      PyErr_SetString(PyExc_TypeError,"not a list");
      return NULL;
    }
  }
  res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4);
  if (!SWIG_IsOK(res4)) {
    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "SBTarget_LaunchSimple" "', argument " "4"" of type '" "char const *""'");
  }
  arg4 = reinterpret_cast< char * >(buf4);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->LaunchSimple((char const **)arg2,(char const **)arg3,(char const *)arg4);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBProcess(static_cast< const lldb::SBProcess& >(result))), SWIGTYPE_p_lldb__SBProcess, SWIG_POINTER_OWN |  0 );
  {
    free((char *) arg2);
  }
  {
    free((char *) arg3);
  }
  if (alloc4 == SWIG_NEWOBJ) delete[] buf4;
  return resultobj;
fail:
  {
    free((char *) arg2);
  }
  {
    free((char *) arg3);
  }
  if (alloc4 == SWIG_NEWOBJ) delete[] buf4;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_Launch__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  lldb::SBLaunchInfo *arg2 = 0 ;
  lldb::SBError *arg3 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  void *argp3 = 0 ;
  int res3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBProcess result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBTarget_Launch",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_Launch" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBLaunchInfo,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_Launch" "', argument " "2"" of type '" "lldb::SBLaunchInfo &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_Launch" "', argument " "2"" of type '" "lldb::SBLaunchInfo &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBLaunchInfo * >(argp2);
  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBTarget_Launch" "', argument " "3"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp3) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_Launch" "', argument " "3"" of type '" "lldb::SBError &""'"); 
  }
  arg3 = reinterpret_cast< lldb::SBError * >(argp3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->Launch(*arg2,*arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBProcess(static_cast< const lldb::SBProcess& >(result))), SWIGTYPE_p_lldb__SBProcess, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_Launch(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[12];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 11); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 3) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBTarget, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      void *vptr = 0;
      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_lldb__SBLaunchInfo, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        void *vptr = 0;
        int res = SWIG_ConvertPtr(argv[2], &vptr, SWIGTYPE_p_lldb__SBError, 0);
        _v = SWIG_CheckState(res);
        if (_v) {
          return _wrap_SBTarget_Launch__SWIG_1(self, args);
        }
      }
    }
  }
  if (argc == 11) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBTarget, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      void *vptr = 0;
      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_lldb__SBListener, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        {
          /* Check if is a list  */
          _v = 1;
          using namespace lldb_private;
          if (PythonList::Check(argv[2])) {
            PythonList list(PyRefType::Borrowed, argv[2]);
            int size = list.GetSize();
            int i = 0;
            for (i = 0; i < size; i++) {
              PythonString s = list.GetItemAtIndex(i).AsType<PythonString>();
              if (!s.IsAllocated()) {
                _v = 0; 
              }
            }
          }
          else
          {
            _v = ( (argv[2] == Py_None) ? 1 : 0);
          }
        }
        if (_v) {
          {
            /* Check if is a list  */
            _v = 1;
            using namespace lldb_private;
            if (PythonList::Check(argv[3])) {
              PythonList list(PyRefType::Borrowed, argv[3]);
              int size = list.GetSize();
              int i = 0;
              for (i = 0; i < size; i++) {
                PythonString s = list.GetItemAtIndex(i).AsType<PythonString>();
                if (!s.IsAllocated()) {
                  _v = 0; 
                }
              }
            }
            else
            {
              _v = ( (argv[3] == Py_None) ? 1 : 0);
            }
          }
          if (_v) {
            int res = SWIG_AsCharPtrAndSize(argv[4], 0, NULL, 0);
            _v = SWIG_CheckState(res);
            if (_v) {
              int res = SWIG_AsCharPtrAndSize(argv[5], 0, NULL, 0);
              _v = SWIG_CheckState(res);
              if (_v) {
                int res = SWIG_AsCharPtrAndSize(argv[6], 0, NULL, 0);
                _v = SWIG_CheckState(res);
                if (_v) {
                  int res = SWIG_AsCharPtrAndSize(argv[7], 0, NULL, 0);
                  _v = SWIG_CheckState(res);
                  if (_v) {
                    {
                      int res = SWIG_AsVal_unsigned_SS_int(argv[8], NULL);
                      _v = SWIG_CheckState(res);
                    }
                    if (_v) {
                      {
                        int res = SWIG_AsVal_bool(argv[9], NULL);
                        _v = SWIG_CheckState(res);
                      }
                      if (_v) {
                        void *vptr = 0;
                        int res = SWIG_ConvertPtr(argv[10], &vptr, SWIGTYPE_p_lldb__SBError, 0);
                        _v = SWIG_CheckState(res);
                        if (_v) {
                          return _wrap_SBTarget_Launch__SWIG_0(self, args);
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBTarget_Launch'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    Launch(lldb::SBTarget *,lldb::SBListener &,char const **,char const **,char const *,char const *,char const *,char const *,uint32_t,bool,lldb::SBError &)\n"
    "    Launch(lldb::SBTarget *,lldb::SBLaunchInfo &,lldb::SBError &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_LoadCore(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBProcess result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTarget_LoadCore",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_LoadCore" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_LoadCore" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->LoadCore((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBProcess(static_cast< const lldb::SBProcess& >(result))), SWIGTYPE_p_lldb__SBProcess, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_Attach(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  lldb::SBAttachInfo *arg2 = 0 ;
  lldb::SBError *arg3 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  void *argp3 = 0 ;
  int res3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBProcess result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBTarget_Attach",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_Attach" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBAttachInfo,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_Attach" "', argument " "2"" of type '" "lldb::SBAttachInfo &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_Attach" "', argument " "2"" of type '" "lldb::SBAttachInfo &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBAttachInfo * >(argp2);
  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBTarget_Attach" "', argument " "3"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp3) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_Attach" "', argument " "3"" of type '" "lldb::SBError &""'"); 
  }
  arg3 = reinterpret_cast< lldb::SBError * >(argp3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->Attach(*arg2,*arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBProcess(static_cast< const lldb::SBProcess& >(result))), SWIGTYPE_p_lldb__SBProcess, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_AttachToProcessWithID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  lldb::SBListener *arg2 = 0 ;
  lldb::pid_t arg3 ;
  lldb::SBError *arg4 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  unsigned long long val3 ;
  int ecode3 = 0 ;
  void *argp4 = 0 ;
  int res4 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  lldb::SBProcess result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOO:SBTarget_AttachToProcessWithID",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_AttachToProcessWithID" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBListener,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_AttachToProcessWithID" "', argument " "2"" of type '" "lldb::SBListener &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_AttachToProcessWithID" "', argument " "2"" of type '" "lldb::SBListener &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBListener * >(argp2);
  ecode3 = SWIG_AsVal_unsigned_SS_long_SS_long(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBTarget_AttachToProcessWithID" "', argument " "3"" of type '" "lldb::pid_t""'");
  } 
  arg3 = static_cast< lldb::pid_t >(val3);
  res4 = SWIG_ConvertPtr(obj3, &argp4, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res4)) {
    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "SBTarget_AttachToProcessWithID" "', argument " "4"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp4) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_AttachToProcessWithID" "', argument " "4"" of type '" "lldb::SBError &""'"); 
  }
  arg4 = reinterpret_cast< lldb::SBError * >(argp4);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->AttachToProcessWithID(*arg2,arg3,*arg4);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBProcess(static_cast< const lldb::SBProcess& >(result))), SWIGTYPE_p_lldb__SBProcess, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_AttachToProcessWithName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  lldb::SBListener *arg2 = 0 ;
  char *arg3 = (char *) 0 ;
  bool arg4 ;
  lldb::SBError *arg5 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  int res3 ;
  char *buf3 = 0 ;
  int alloc3 = 0 ;
  bool val4 ;
  int ecode4 = 0 ;
  void *argp5 = 0 ;
  int res5 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  PyObject * obj4 = 0 ;
  lldb::SBProcess result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOOO:SBTarget_AttachToProcessWithName",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_AttachToProcessWithName" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBListener,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_AttachToProcessWithName" "', argument " "2"" of type '" "lldb::SBListener &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_AttachToProcessWithName" "', argument " "2"" of type '" "lldb::SBListener &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBListener * >(argp2);
  res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3);
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBTarget_AttachToProcessWithName" "', argument " "3"" of type '" "char const *""'");
  }
  arg3 = reinterpret_cast< char * >(buf3);
  ecode4 = SWIG_AsVal_bool(obj3, &val4);
  if (!SWIG_IsOK(ecode4)) {
    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "SBTarget_AttachToProcessWithName" "', argument " "4"" of type '" "bool""'");
  } 
  arg4 = static_cast< bool >(val4);
  res5 = SWIG_ConvertPtr(obj4, &argp5, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res5)) {
    SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "SBTarget_AttachToProcessWithName" "', argument " "5"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp5) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_AttachToProcessWithName" "', argument " "5"" of type '" "lldb::SBError &""'"); 
  }
  arg5 = reinterpret_cast< lldb::SBError * >(argp5);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->AttachToProcessWithName(*arg2,(char const *)arg3,arg4,*arg5);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBProcess(static_cast< const lldb::SBProcess& >(result))), SWIGTYPE_p_lldb__SBProcess, SWIG_POINTER_OWN |  0 );
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  return resultobj;
fail:
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_ConnectRemote(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  lldb::SBListener *arg2 = 0 ;
  char *arg3 = (char *) 0 ;
  char *arg4 = (char *) 0 ;
  lldb::SBError *arg5 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  int res3 ;
  char *buf3 = 0 ;
  int alloc3 = 0 ;
  int res4 ;
  char *buf4 = 0 ;
  int alloc4 = 0 ;
  void *argp5 = 0 ;
  int res5 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  PyObject * obj4 = 0 ;
  lldb::SBProcess result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOOO:SBTarget_ConnectRemote",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_ConnectRemote" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBListener,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_ConnectRemote" "', argument " "2"" of type '" "lldb::SBListener &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_ConnectRemote" "', argument " "2"" of type '" "lldb::SBListener &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBListener * >(argp2);
  res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3);
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBTarget_ConnectRemote" "', argument " "3"" of type '" "char const *""'");
  }
  arg3 = reinterpret_cast< char * >(buf3);
  res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4);
  if (!SWIG_IsOK(res4)) {
    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "SBTarget_ConnectRemote" "', argument " "4"" of type '" "char const *""'");
  }
  arg4 = reinterpret_cast< char * >(buf4);
  res5 = SWIG_ConvertPtr(obj4, &argp5, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res5)) {
    SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "SBTarget_ConnectRemote" "', argument " "5"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp5) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_ConnectRemote" "', argument " "5"" of type '" "lldb::SBError &""'"); 
  }
  arg5 = reinterpret_cast< lldb::SBError * >(argp5);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->ConnectRemote(*arg2,(char const *)arg3,(char const *)arg4,*arg5);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBProcess(static_cast< const lldb::SBProcess& >(result))), SWIGTYPE_p_lldb__SBProcess, SWIG_POINTER_OWN |  0 );
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  if (alloc4 == SWIG_NEWOBJ) delete[] buf4;
  return resultobj;
fail:
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  if (alloc4 == SWIG_NEWOBJ) delete[] buf4;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_GetExecutable(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBFileSpec result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTarget_GetExecutable",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_GetExecutable" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetExecutable();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBFileSpec(static_cast< const lldb::SBFileSpec& >(result))), SWIGTYPE_p_lldb__SBFileSpec, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_AddModule__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  lldb::SBModule *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTarget_AddModule",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_AddModule" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBModule,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_AddModule" "', argument " "2"" of type '" "lldb::SBModule &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_AddModule" "', argument " "2"" of type '" "lldb::SBModule &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBModule * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->AddModule(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_AddModule__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  char *arg2 = (char *) 0 ;
  char *arg3 = (char *) 0 ;
  char *arg4 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  int res3 ;
  char *buf3 = 0 ;
  int alloc3 = 0 ;
  int res4 ;
  char *buf4 = 0 ;
  int alloc4 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  lldb::SBModule result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOO:SBTarget_AddModule",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_AddModule" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_AddModule" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3);
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBTarget_AddModule" "', argument " "3"" of type '" "char const *""'");
  }
  arg3 = reinterpret_cast< char * >(buf3);
  res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4);
  if (!SWIG_IsOK(res4)) {
    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "SBTarget_AddModule" "', argument " "4"" of type '" "char const *""'");
  }
  arg4 = reinterpret_cast< char * >(buf4);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->AddModule((char const *)arg2,(char const *)arg3,(char const *)arg4);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBModule(static_cast< const lldb::SBModule& >(result))), SWIGTYPE_p_lldb__SBModule, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  if (alloc4 == SWIG_NEWOBJ) delete[] buf4;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  if (alloc4 == SWIG_NEWOBJ) delete[] buf4;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_AddModule__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  char *arg2 = (char *) 0 ;
  char *arg3 = (char *) 0 ;
  char *arg4 = (char *) 0 ;
  char *arg5 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  int res3 ;
  char *buf3 = 0 ;
  int alloc3 = 0 ;
  int res4 ;
  char *buf4 = 0 ;
  int alloc4 = 0 ;
  int res5 ;
  char *buf5 = 0 ;
  int alloc5 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  PyObject * obj4 = 0 ;
  lldb::SBModule result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOOO:SBTarget_AddModule",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_AddModule" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_AddModule" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3);
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBTarget_AddModule" "', argument " "3"" of type '" "char const *""'");
  }
  arg3 = reinterpret_cast< char * >(buf3);
  res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4);
  if (!SWIG_IsOK(res4)) {
    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "SBTarget_AddModule" "', argument " "4"" of type '" "char const *""'");
  }
  arg4 = reinterpret_cast< char * >(buf4);
  res5 = SWIG_AsCharPtrAndSize(obj4, &buf5, NULL, &alloc5);
  if (!SWIG_IsOK(res5)) {
    SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "SBTarget_AddModule" "', argument " "5"" of type '" "char const *""'");
  }
  arg5 = reinterpret_cast< char * >(buf5);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->AddModule((char const *)arg2,(char const *)arg3,(char const *)arg4,(char const *)arg5);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBModule(static_cast< const lldb::SBModule& >(result))), SWIGTYPE_p_lldb__SBModule, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  if (alloc4 == SWIG_NEWOBJ) delete[] buf4;
  if (alloc5 == SWIG_NEWOBJ) delete[] buf5;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  if (alloc4 == SWIG_NEWOBJ) delete[] buf4;
  if (alloc5 == SWIG_NEWOBJ) delete[] buf5;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_AddModule__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  lldb::SBModuleSpec *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBModule result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTarget_AddModule",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_AddModule" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBModuleSpec,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_AddModule" "', argument " "2"" of type '" "lldb::SBModuleSpec const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_AddModule" "', argument " "2"" of type '" "lldb::SBModuleSpec const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBModuleSpec * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->AddModule((lldb::SBModuleSpec const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBModule(static_cast< const lldb::SBModule& >(result))), SWIGTYPE_p_lldb__SBModule, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_AddModule(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[6];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 5); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBTarget, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      void *vptr = 0;
      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_lldb__SBModule, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        return _wrap_SBTarget_AddModule__SWIG_0(self, args);
      }
    }
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBTarget, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_lldb__SBModuleSpec, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        return _wrap_SBTarget_AddModule__SWIG_3(self, args);
      }
    }
  }
  if (argc == 4) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBTarget, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        int res = SWIG_AsCharPtrAndSize(argv[2], 0, NULL, 0);
        _v = SWIG_CheckState(res);
        if (_v) {
          int res = SWIG_AsCharPtrAndSize(argv[3], 0, NULL, 0);
          _v = SWIG_CheckState(res);
          if (_v) {
            return _wrap_SBTarget_AddModule__SWIG_1(self, args);
          }
        }
      }
    }
  }
  if (argc == 5) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBTarget, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        int res = SWIG_AsCharPtrAndSize(argv[2], 0, NULL, 0);
        _v = SWIG_CheckState(res);
        if (_v) {
          int res = SWIG_AsCharPtrAndSize(argv[3], 0, NULL, 0);
          _v = SWIG_CheckState(res);
          if (_v) {
            int res = SWIG_AsCharPtrAndSize(argv[4], 0, NULL, 0);
            _v = SWIG_CheckState(res);
            if (_v) {
              return _wrap_SBTarget_AddModule__SWIG_2(self, args);
            }
          }
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBTarget_AddModule'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    AddModule(lldb::SBTarget *,lldb::SBModule &)\n"
    "    AddModule(lldb::SBTarget *,char const *,char const *,char const *)\n"
    "    AddModule(lldb::SBTarget *,char const *,char const *,char const *,char const *)\n"
    "    AddModule(lldb::SBTarget *,lldb::SBModuleSpec const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_GetNumModules(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTarget_GetNumModules",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_GetNumModules" "', argument " "1"" of type '" "lldb::SBTarget const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)((lldb::SBTarget const *)arg1)->GetNumModules();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_GetModuleAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBModule result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTarget_GetModuleAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_GetModuleAtIndex" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBTarget_GetModuleAtIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetModuleAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBModule(static_cast< const lldb::SBModule& >(result))), SWIGTYPE_p_lldb__SBModule, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_RemoveModule(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  lldb::SBModule arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTarget_RemoveModule",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_RemoveModule" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBModule,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_RemoveModule" "', argument " "2"" of type '" "lldb::SBModule""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_RemoveModule" "', argument " "2"" of type '" "lldb::SBModule""'");
    } else {
      lldb::SBModule * temp = reinterpret_cast< lldb::SBModule * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->RemoveModule(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_GetDebugger(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBDebugger result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTarget_GetDebugger",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_GetDebugger" "', argument " "1"" of type '" "lldb::SBTarget const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBTarget const *)arg1)->GetDebugger();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBDebugger(static_cast< const lldb::SBDebugger& >(result))), SWIGTYPE_p_lldb__SBDebugger, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_FindModule(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  lldb::SBFileSpec *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBModule result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTarget_FindModule",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_FindModule" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBFileSpec,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_FindModule" "', argument " "2"" of type '" "lldb::SBFileSpec const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_FindModule" "', argument " "2"" of type '" "lldb::SBFileSpec const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBFileSpec * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->FindModule((lldb::SBFileSpec const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBModule(static_cast< const lldb::SBModule& >(result))), SWIGTYPE_p_lldb__SBModule, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_GetByteOrder(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::ByteOrder result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTarget_GetByteOrder",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_GetByteOrder" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::ByteOrder)(arg1)->GetByteOrder();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_GetAddressByteSize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTarget_GetAddressByteSize",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_GetAddressByteSize" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetAddressByteSize();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_GetTriple(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTarget_GetTriple",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_GetTriple" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetTriple();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_GetDataByteSize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTarget_GetDataByteSize",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_GetDataByteSize" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetDataByteSize();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_GetCodeByteSize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTarget_GetCodeByteSize",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_GetCodeByteSize" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetCodeByteSize();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_SetSectionLoadAddress(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  lldb::SBSection arg2 ;
  lldb::addr_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  unsigned long long val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBError result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBTarget_SetSectionLoadAddress",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_SetSectionLoadAddress" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBSection,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_SetSectionLoadAddress" "', argument " "2"" of type '" "lldb::SBSection""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_SetSectionLoadAddress" "', argument " "2"" of type '" "lldb::SBSection""'");
    } else {
      lldb::SBSection * temp = reinterpret_cast< lldb::SBSection * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  ecode3 = SWIG_AsVal_unsigned_SS_long_SS_long(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBTarget_SetSectionLoadAddress" "', argument " "3"" of type '" "lldb::addr_t""'");
  } 
  arg3 = static_cast< lldb::addr_t >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->SetSectionLoadAddress(arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBError(static_cast< const lldb::SBError& >(result))), SWIGTYPE_p_lldb__SBError, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_ClearSectionLoadAddress(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  lldb::SBSection arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBError result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTarget_ClearSectionLoadAddress",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_ClearSectionLoadAddress" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBSection,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_ClearSectionLoadAddress" "', argument " "2"" of type '" "lldb::SBSection""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_ClearSectionLoadAddress" "', argument " "2"" of type '" "lldb::SBSection""'");
    } else {
      lldb::SBSection * temp = reinterpret_cast< lldb::SBSection * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->ClearSectionLoadAddress(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBError(static_cast< const lldb::SBError& >(result))), SWIGTYPE_p_lldb__SBError, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_SetModuleLoadAddress(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  lldb::SBModule arg2 ;
  int64_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  long long val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBError result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBTarget_SetModuleLoadAddress",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_SetModuleLoadAddress" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBModule,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_SetModuleLoadAddress" "', argument " "2"" of type '" "lldb::SBModule""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_SetModuleLoadAddress" "', argument " "2"" of type '" "lldb::SBModule""'");
    } else {
      lldb::SBModule * temp = reinterpret_cast< lldb::SBModule * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  ecode3 = SWIG_AsVal_long_SS_long(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBTarget_SetModuleLoadAddress" "', argument " "3"" of type '" "int64_t""'");
  } 
  arg3 = static_cast< int64_t >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->SetModuleLoadAddress(arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBError(static_cast< const lldb::SBError& >(result))), SWIGTYPE_p_lldb__SBError, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_ClearModuleLoadAddress(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  lldb::SBModule arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBError result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTarget_ClearModuleLoadAddress",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_ClearModuleLoadAddress" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBModule,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_ClearModuleLoadAddress" "', argument " "2"" of type '" "lldb::SBModule""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_ClearModuleLoadAddress" "', argument " "2"" of type '" "lldb::SBModule""'");
    } else {
      lldb::SBModule * temp = reinterpret_cast< lldb::SBModule * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->ClearModuleLoadAddress(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBError(static_cast< const lldb::SBError& >(result))), SWIGTYPE_p_lldb__SBError, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_FindFunctions__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  char *arg2 = (char *) 0 ;
  uint32_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  unsigned int val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBSymbolContextList result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBTarget_FindFunctions",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_FindFunctions" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_FindFunctions" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  ecode3 = SWIG_AsVal_unsigned_SS_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBTarget_FindFunctions" "', argument " "3"" of type '" "uint32_t""'");
  } 
  arg3 = static_cast< uint32_t >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->FindFunctions((char const *)arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBSymbolContextList(static_cast< const lldb::SBSymbolContextList& >(result))), SWIGTYPE_p_lldb__SBSymbolContextList, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_FindFunctions__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBSymbolContextList result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTarget_FindFunctions",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_FindFunctions" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_FindFunctions" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->FindFunctions((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBSymbolContextList(static_cast< const lldb::SBSymbolContextList& >(result))), SWIGTYPE_p_lldb__SBSymbolContextList, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_FindFunctions(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[4];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 3); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBTarget, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        return _wrap_SBTarget_FindFunctions__SWIG_1(self, args);
      }
    }
  }
  if (argc == 3) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBTarget, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        {
          int res = SWIG_AsVal_unsigned_SS_int(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          return _wrap_SBTarget_FindFunctions__SWIG_0(self, args);
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBTarget_FindFunctions'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    FindFunctions(lldb::SBTarget *,char const *,uint32_t)\n"
    "    FindFunctions(lldb::SBTarget *,char const *)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_FindFirstType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBType result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTarget_FindFirstType",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_FindFirstType" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_FindFirstType" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->FindFirstType((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBType(static_cast< const lldb::SBType& >(result))), SWIGTYPE_p_lldb__SBType, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_FindTypes(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBTypeList result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTarget_FindTypes",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_FindTypes" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_FindTypes" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->FindTypes((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTypeList(static_cast< const lldb::SBTypeList& >(result))), SWIGTYPE_p_lldb__SBTypeList, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_GetBasicType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  lldb::BasicType arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBType result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTarget_GetBasicType",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_GetBasicType" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  ecode2 = SWIG_AsVal_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBTarget_GetBasicType" "', argument " "2"" of type '" "lldb::BasicType""'");
  } 
  arg2 = static_cast< lldb::BasicType >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetBasicType(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBType(static_cast< const lldb::SBType& >(result))), SWIGTYPE_p_lldb__SBType, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_GetSourceManager(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  SwigValueWrapper< lldb::SBSourceManager > result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTarget_GetSourceManager",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_GetSourceManager" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetSourceManager();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBSourceManager(static_cast< const lldb::SBSourceManager& >(result))), SWIGTYPE_p_lldb__SBSourceManager, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_FindGlobalVariables__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  char *arg2 = (char *) 0 ;
  uint32_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  unsigned int val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBValueList result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBTarget_FindGlobalVariables",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_FindGlobalVariables" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_FindGlobalVariables" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  ecode3 = SWIG_AsVal_unsigned_SS_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBTarget_FindGlobalVariables" "', argument " "3"" of type '" "uint32_t""'");
  } 
  arg3 = static_cast< uint32_t >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->FindGlobalVariables((char const *)arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBValueList(static_cast< const lldb::SBValueList& >(result))), SWIGTYPE_p_lldb__SBValueList, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_FindFirstGlobalVariable(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBValue result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTarget_FindFirstGlobalVariable",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_FindFirstGlobalVariable" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_FindFirstGlobalVariable" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->FindFirstGlobalVariable((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBValue(static_cast< const lldb::SBValue& >(result))), SWIGTYPE_p_lldb__SBValue, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_FindGlobalVariables__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  char *arg2 = (char *) 0 ;
  uint32_t arg3 ;
  lldb::MatchType arg4 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  unsigned int val3 ;
  int ecode3 = 0 ;
  int val4 ;
  int ecode4 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  lldb::SBValueList result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOO:SBTarget_FindGlobalVariables",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_FindGlobalVariables" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_FindGlobalVariables" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  ecode3 = SWIG_AsVal_unsigned_SS_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBTarget_FindGlobalVariables" "', argument " "3"" of type '" "uint32_t""'");
  } 
  arg3 = static_cast< uint32_t >(val3);
  ecode4 = SWIG_AsVal_int(obj3, &val4);
  if (!SWIG_IsOK(ecode4)) {
    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "SBTarget_FindGlobalVariables" "', argument " "4"" of type '" "lldb::MatchType""'");
  } 
  arg4 = static_cast< lldb::MatchType >(val4);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->FindGlobalVariables((char const *)arg2,arg3,arg4);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBValueList(static_cast< const lldb::SBValueList& >(result))), SWIGTYPE_p_lldb__SBValueList, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_FindGlobalVariables(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[5];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 4); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 3) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBTarget, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        {
          int res = SWIG_AsVal_unsigned_SS_int(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          return _wrap_SBTarget_FindGlobalVariables__SWIG_0(self, args);
        }
      }
    }
  }
  if (argc == 4) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBTarget, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        {
          int res = SWIG_AsVal_unsigned_SS_int(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          {
            int res = SWIG_AsVal_int(argv[3], NULL);
            _v = SWIG_CheckState(res);
          }
          if (_v) {
            return _wrap_SBTarget_FindGlobalVariables__SWIG_1(self, args);
          }
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBTarget_FindGlobalVariables'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    FindGlobalVariables(lldb::SBTarget *,char const *,uint32_t)\n"
    "    FindGlobalVariables(lldb::SBTarget *,char const *,uint32_t,lldb::MatchType)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_FindGlobalFunctions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  char *arg2 = (char *) 0 ;
  uint32_t arg3 ;
  lldb::MatchType arg4 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  unsigned int val3 ;
  int ecode3 = 0 ;
  int val4 ;
  int ecode4 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  lldb::SBSymbolContextList result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOO:SBTarget_FindGlobalFunctions",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_FindGlobalFunctions" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_FindGlobalFunctions" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  ecode3 = SWIG_AsVal_unsigned_SS_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBTarget_FindGlobalFunctions" "', argument " "3"" of type '" "uint32_t""'");
  } 
  arg3 = static_cast< uint32_t >(val3);
  ecode4 = SWIG_AsVal_int(obj3, &val4);
  if (!SWIG_IsOK(ecode4)) {
    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "SBTarget_FindGlobalFunctions" "', argument " "4"" of type '" "lldb::MatchType""'");
  } 
  arg4 = static_cast< lldb::MatchType >(val4);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->FindGlobalFunctions((char const *)arg2,arg3,arg4);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBSymbolContextList(static_cast< const lldb::SBSymbolContextList& >(result))), SWIGTYPE_p_lldb__SBSymbolContextList, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_Clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTarget_Clear",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_Clear" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->Clear();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_ResolveFileAddress(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  lldb::addr_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned long long val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBAddress result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTarget_ResolveFileAddress",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_ResolveFileAddress" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_long_SS_long(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBTarget_ResolveFileAddress" "', argument " "2"" of type '" "lldb::addr_t""'");
  } 
  arg2 = static_cast< lldb::addr_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->ResolveFileAddress(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBAddress(static_cast< const lldb::SBAddress& >(result))), SWIGTYPE_p_lldb__SBAddress, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_ResolveLoadAddress(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  lldb::addr_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned long long val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBAddress result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTarget_ResolveLoadAddress",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_ResolveLoadAddress" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_long_SS_long(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBTarget_ResolveLoadAddress" "', argument " "2"" of type '" "lldb::addr_t""'");
  } 
  arg2 = static_cast< lldb::addr_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->ResolveLoadAddress(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBAddress(static_cast< const lldb::SBAddress& >(result))), SWIGTYPE_p_lldb__SBAddress, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_ResolvePastLoadAddress(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  uint32_t arg2 ;
  lldb::addr_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  unsigned long long val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBAddress result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBTarget_ResolvePastLoadAddress",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_ResolvePastLoadAddress" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBTarget_ResolvePastLoadAddress" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  ecode3 = SWIG_AsVal_unsigned_SS_long_SS_long(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBTarget_ResolvePastLoadAddress" "', argument " "3"" of type '" "lldb::addr_t""'");
  } 
  arg3 = static_cast< lldb::addr_t >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->ResolvePastLoadAddress(arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBAddress(static_cast< const lldb::SBAddress& >(result))), SWIGTYPE_p_lldb__SBAddress, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_ResolveSymbolContextForAddress(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  lldb::SBAddress *arg2 = 0 ;
  uint32_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  unsigned int val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBSymbolContext result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBTarget_ResolveSymbolContextForAddress",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_ResolveSymbolContextForAddress" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBAddress,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_ResolveSymbolContextForAddress" "', argument " "2"" of type '" "lldb::SBAddress const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_ResolveSymbolContextForAddress" "', argument " "2"" of type '" "lldb::SBAddress const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBAddress * >(argp2);
  ecode3 = SWIG_AsVal_unsigned_SS_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBTarget_ResolveSymbolContextForAddress" "', argument " "3"" of type '" "uint32_t""'");
  } 
  arg3 = static_cast< uint32_t >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->ResolveSymbolContextForAddress((lldb::SBAddress const &)*arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBSymbolContext(static_cast< const lldb::SBSymbolContext& >(result))), SWIGTYPE_p_lldb__SBSymbolContext, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_ReadMemory(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  lldb::SBAddress arg2 ;
  void *arg3 = (void *) 0 ;
  size_t arg4 ;
  lldb::SBError *arg5 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  void *argp5 = 0 ;
  int res5 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  size_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOO:SBTarget_ReadMemory",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_ReadMemory" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBAddress,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_ReadMemory" "', argument " "2"" of type '" "lldb::SBAddress const""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_ReadMemory" "', argument " "2"" of type '" "lldb::SBAddress const""'");
    } else {
      lldb::SBAddress * temp = reinterpret_cast< lldb::SBAddress * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  {
    if (PyInt_Check(obj2)) {
      arg4 = PyInt_AsLong(obj2);
    } else if (PyLong_Check(obj2)) {
      arg4 = PyLong_AsLong(obj2);
    } else {
      PyErr_SetString(PyExc_ValueError, "Expecting an integer or long object");
      return NULL;
    }
    if (arg4 <= 0) {
      PyErr_SetString(PyExc_ValueError, "Positive integer expected");
      return NULL;
    }
    arg3 = (void *) malloc(arg4);
  }
  res5 = SWIG_ConvertPtr(obj3, &argp5, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res5)) {
    SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "SBTarget_ReadMemory" "', argument " "5"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp5) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_ReadMemory" "', argument " "5"" of type '" "lldb::SBError &""'"); 
  }
  arg5 = reinterpret_cast< lldb::SBError * >(argp5);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->ReadMemory(arg2,arg3,arg4,*arg5);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
  {
    Py_XDECREF(resultobj);   /* Blow away any previous result */
    if (result == 0) {
      resultobj = Py_None;
      Py_INCREF(resultobj);
    } else {
      lldb_private::PythonBytes bytes(static_cast<const uint8_t*>(arg3), result);
      resultobj = bytes.release();
    }
    free(arg3);
  }
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_BreakpointCreateByLocation__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  char *arg2 = (char *) 0 ;
  uint32_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  unsigned int val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBBreakpoint result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBTarget_BreakpointCreateByLocation",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_BreakpointCreateByLocation" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_BreakpointCreateByLocation" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  ecode3 = SWIG_AsVal_unsigned_SS_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBTarget_BreakpointCreateByLocation" "', argument " "3"" of type '" "uint32_t""'");
  } 
  arg3 = static_cast< uint32_t >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->BreakpointCreateByLocation((char const *)arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBBreakpoint(static_cast< const lldb::SBBreakpoint& >(result))), SWIGTYPE_p_lldb__SBBreakpoint, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_BreakpointCreateByLocation__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  lldb::SBFileSpec *arg2 = 0 ;
  uint32_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  unsigned int val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBBreakpoint result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBTarget_BreakpointCreateByLocation",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_BreakpointCreateByLocation" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBFileSpec,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_BreakpointCreateByLocation" "', argument " "2"" of type '" "lldb::SBFileSpec const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_BreakpointCreateByLocation" "', argument " "2"" of type '" "lldb::SBFileSpec const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBFileSpec * >(argp2);
  ecode3 = SWIG_AsVal_unsigned_SS_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBTarget_BreakpointCreateByLocation" "', argument " "3"" of type '" "uint32_t""'");
  } 
  arg3 = static_cast< uint32_t >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->BreakpointCreateByLocation((lldb::SBFileSpec const &)*arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBBreakpoint(static_cast< const lldb::SBBreakpoint& >(result))), SWIGTYPE_p_lldb__SBBreakpoint, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_BreakpointCreateByLocation__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  lldb::SBFileSpec *arg2 = 0 ;
  uint32_t arg3 ;
  lldb::addr_t arg4 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  unsigned int val3 ;
  int ecode3 = 0 ;
  unsigned long long val4 ;
  int ecode4 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  lldb::SBBreakpoint result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOO:SBTarget_BreakpointCreateByLocation",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_BreakpointCreateByLocation" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBFileSpec,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_BreakpointCreateByLocation" "', argument " "2"" of type '" "lldb::SBFileSpec const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_BreakpointCreateByLocation" "', argument " "2"" of type '" "lldb::SBFileSpec const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBFileSpec * >(argp2);
  ecode3 = SWIG_AsVal_unsigned_SS_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBTarget_BreakpointCreateByLocation" "', argument " "3"" of type '" "uint32_t""'");
  } 
  arg3 = static_cast< uint32_t >(val3);
  ecode4 = SWIG_AsVal_unsigned_SS_long_SS_long(obj3, &val4);
  if (!SWIG_IsOK(ecode4)) {
    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "SBTarget_BreakpointCreateByLocation" "', argument " "4"" of type '" "lldb::addr_t""'");
  } 
  arg4 = static_cast< lldb::addr_t >(val4);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->BreakpointCreateByLocation((lldb::SBFileSpec const &)*arg2,arg3,arg4);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBBreakpoint(static_cast< const lldb::SBBreakpoint& >(result))), SWIGTYPE_p_lldb__SBBreakpoint, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_BreakpointCreateByLocation__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  lldb::SBFileSpec *arg2 = 0 ;
  uint32_t arg3 ;
  lldb::addr_t arg4 ;
  lldb::SBFileSpecList *arg5 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  unsigned int val3 ;
  int ecode3 = 0 ;
  unsigned long long val4 ;
  int ecode4 = 0 ;
  void *argp5 = 0 ;
  int res5 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  PyObject * obj4 = 0 ;
  lldb::SBBreakpoint result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOOO:SBTarget_BreakpointCreateByLocation",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_BreakpointCreateByLocation" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBFileSpec,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_BreakpointCreateByLocation" "', argument " "2"" of type '" "lldb::SBFileSpec const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_BreakpointCreateByLocation" "', argument " "2"" of type '" "lldb::SBFileSpec const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBFileSpec * >(argp2);
  ecode3 = SWIG_AsVal_unsigned_SS_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBTarget_BreakpointCreateByLocation" "', argument " "3"" of type '" "uint32_t""'");
  } 
  arg3 = static_cast< uint32_t >(val3);
  ecode4 = SWIG_AsVal_unsigned_SS_long_SS_long(obj3, &val4);
  if (!SWIG_IsOK(ecode4)) {
    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "SBTarget_BreakpointCreateByLocation" "', argument " "4"" of type '" "lldb::addr_t""'");
  } 
  arg4 = static_cast< lldb::addr_t >(val4);
  res5 = SWIG_ConvertPtr(obj4, &argp5, SWIGTYPE_p_lldb__SBFileSpecList,  0 );
  if (!SWIG_IsOK(res5)) {
    SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "SBTarget_BreakpointCreateByLocation" "', argument " "5"" of type '" "lldb::SBFileSpecList &""'"); 
  }
  if (!argp5) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_BreakpointCreateByLocation" "', argument " "5"" of type '" "lldb::SBFileSpecList &""'"); 
  }
  arg5 = reinterpret_cast< lldb::SBFileSpecList * >(argp5);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->BreakpointCreateByLocation((lldb::SBFileSpec const &)*arg2,arg3,arg4,*arg5);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBBreakpoint(static_cast< const lldb::SBBreakpoint& >(result))), SWIGTYPE_p_lldb__SBBreakpoint, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_BreakpointCreateByLocation(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[6];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 5); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 3) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBTarget, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_lldb__SBFileSpec, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        {
          int res = SWIG_AsVal_unsigned_SS_int(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          return _wrap_SBTarget_BreakpointCreateByLocation__SWIG_1(self, args);
        }
      }
    }
  }
  if (argc == 3) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBTarget, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        {
          int res = SWIG_AsVal_unsigned_SS_int(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          return _wrap_SBTarget_BreakpointCreateByLocation__SWIG_0(self, args);
        }
      }
    }
  }
  if (argc == 4) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBTarget, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_lldb__SBFileSpec, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        {
          int res = SWIG_AsVal_unsigned_SS_int(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          {
            int res = SWIG_AsVal_unsigned_SS_long_SS_long(argv[3], NULL);
            _v = SWIG_CheckState(res);
          }
          if (_v) {
            return _wrap_SBTarget_BreakpointCreateByLocation__SWIG_2(self, args);
          }
        }
      }
    }
  }
  if (argc == 5) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBTarget, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_lldb__SBFileSpec, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        {
          int res = SWIG_AsVal_unsigned_SS_int(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          {
            int res = SWIG_AsVal_unsigned_SS_long_SS_long(argv[3], NULL);
            _v = SWIG_CheckState(res);
          }
          if (_v) {
            void *vptr = 0;
            int res = SWIG_ConvertPtr(argv[4], &vptr, SWIGTYPE_p_lldb__SBFileSpecList, 0);
            _v = SWIG_CheckState(res);
            if (_v) {
              return _wrap_SBTarget_BreakpointCreateByLocation__SWIG_3(self, args);
            }
          }
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBTarget_BreakpointCreateByLocation'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    BreakpointCreateByLocation(lldb::SBTarget *,char const *,uint32_t)\n"
    "    BreakpointCreateByLocation(lldb::SBTarget *,lldb::SBFileSpec const &,uint32_t)\n"
    "    BreakpointCreateByLocation(lldb::SBTarget *,lldb::SBFileSpec const &,uint32_t,lldb::addr_t)\n"
    "    BreakpointCreateByLocation(lldb::SBTarget *,lldb::SBFileSpec const &,uint32_t,lldb::addr_t,lldb::SBFileSpecList &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_BreakpointCreateByName__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  char *arg2 = (char *) 0 ;
  char *arg3 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  int res3 ;
  char *buf3 = 0 ;
  int alloc3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBBreakpoint result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBTarget_BreakpointCreateByName",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_BreakpointCreateByName" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_BreakpointCreateByName" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3);
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBTarget_BreakpointCreateByName" "', argument " "3"" of type '" "char const *""'");
  }
  arg3 = reinterpret_cast< char * >(buf3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->BreakpointCreateByName((char const *)arg2,(char const *)arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBBreakpoint(static_cast< const lldb::SBBreakpoint& >(result))), SWIGTYPE_p_lldb__SBBreakpoint, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_BreakpointCreateByName__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBBreakpoint result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTarget_BreakpointCreateByName",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_BreakpointCreateByName" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_BreakpointCreateByName" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->BreakpointCreateByName((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBBreakpoint(static_cast< const lldb::SBBreakpoint& >(result))), SWIGTYPE_p_lldb__SBBreakpoint, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_BreakpointCreateByName__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  char *arg2 = (char *) 0 ;
  uint32_t arg3 ;
  lldb::SBFileSpecList *arg4 = 0 ;
  lldb::SBFileSpecList *arg5 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  unsigned int val3 ;
  int ecode3 = 0 ;
  void *argp4 = 0 ;
  int res4 = 0 ;
  void *argp5 = 0 ;
  int res5 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  PyObject * obj4 = 0 ;
  lldb::SBBreakpoint result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOOO:SBTarget_BreakpointCreateByName",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_BreakpointCreateByName" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_BreakpointCreateByName" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  ecode3 = SWIG_AsVal_unsigned_SS_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBTarget_BreakpointCreateByName" "', argument " "3"" of type '" "uint32_t""'");
  } 
  arg3 = static_cast< uint32_t >(val3);
  res4 = SWIG_ConvertPtr(obj3, &argp4, SWIGTYPE_p_lldb__SBFileSpecList,  0  | 0);
  if (!SWIG_IsOK(res4)) {
    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "SBTarget_BreakpointCreateByName" "', argument " "4"" of type '" "lldb::SBFileSpecList const &""'"); 
  }
  if (!argp4) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_BreakpointCreateByName" "', argument " "4"" of type '" "lldb::SBFileSpecList const &""'"); 
  }
  arg4 = reinterpret_cast< lldb::SBFileSpecList * >(argp4);
  res5 = SWIG_ConvertPtr(obj4, &argp5, SWIGTYPE_p_lldb__SBFileSpecList,  0  | 0);
  if (!SWIG_IsOK(res5)) {
    SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "SBTarget_BreakpointCreateByName" "', argument " "5"" of type '" "lldb::SBFileSpecList const &""'"); 
  }
  if (!argp5) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_BreakpointCreateByName" "', argument " "5"" of type '" "lldb::SBFileSpecList const &""'"); 
  }
  arg5 = reinterpret_cast< lldb::SBFileSpecList * >(argp5);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->BreakpointCreateByName((char const *)arg2,arg3,(lldb::SBFileSpecList const &)*arg4,(lldb::SBFileSpecList const &)*arg5);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBBreakpoint(static_cast< const lldb::SBBreakpoint& >(result))), SWIGTYPE_p_lldb__SBBreakpoint, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_BreakpointCreateByName__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  char *arg2 = (char *) 0 ;
  uint32_t arg3 ;
  lldb::LanguageType arg4 ;
  lldb::SBFileSpecList *arg5 = 0 ;
  lldb::SBFileSpecList *arg6 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  unsigned int val3 ;
  int ecode3 = 0 ;
  int val4 ;
  int ecode4 = 0 ;
  void *argp5 = 0 ;
  int res5 = 0 ;
  void *argp6 = 0 ;
  int res6 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  PyObject * obj4 = 0 ;
  PyObject * obj5 = 0 ;
  lldb::SBBreakpoint result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOOOO:SBTarget_BreakpointCreateByName",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_BreakpointCreateByName" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_BreakpointCreateByName" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  ecode3 = SWIG_AsVal_unsigned_SS_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBTarget_BreakpointCreateByName" "', argument " "3"" of type '" "uint32_t""'");
  } 
  arg3 = static_cast< uint32_t >(val3);
  ecode4 = SWIG_AsVal_int(obj3, &val4);
  if (!SWIG_IsOK(ecode4)) {
    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "SBTarget_BreakpointCreateByName" "', argument " "4"" of type '" "lldb::LanguageType""'");
  } 
  arg4 = static_cast< lldb::LanguageType >(val4);
  res5 = SWIG_ConvertPtr(obj4, &argp5, SWIGTYPE_p_lldb__SBFileSpecList,  0  | 0);
  if (!SWIG_IsOK(res5)) {
    SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "SBTarget_BreakpointCreateByName" "', argument " "5"" of type '" "lldb::SBFileSpecList const &""'"); 
  }
  if (!argp5) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_BreakpointCreateByName" "', argument " "5"" of type '" "lldb::SBFileSpecList const &""'"); 
  }
  arg5 = reinterpret_cast< lldb::SBFileSpecList * >(argp5);
  res6 = SWIG_ConvertPtr(obj5, &argp6, SWIGTYPE_p_lldb__SBFileSpecList,  0  | 0);
  if (!SWIG_IsOK(res6)) {
    SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "SBTarget_BreakpointCreateByName" "', argument " "6"" of type '" "lldb::SBFileSpecList const &""'"); 
  }
  if (!argp6) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_BreakpointCreateByName" "', argument " "6"" of type '" "lldb::SBFileSpecList const &""'"); 
  }
  arg6 = reinterpret_cast< lldb::SBFileSpecList * >(argp6);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->BreakpointCreateByName((char const *)arg2,arg3,arg4,(lldb::SBFileSpecList const &)*arg5,(lldb::SBFileSpecList const &)*arg6);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBBreakpoint(static_cast< const lldb::SBBreakpoint& >(result))), SWIGTYPE_p_lldb__SBBreakpoint, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_BreakpointCreateByName(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[7];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 6); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBTarget, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        return _wrap_SBTarget_BreakpointCreateByName__SWIG_1(self, args);
      }
    }
  }
  if (argc == 3) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBTarget, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        int res = SWIG_AsCharPtrAndSize(argv[2], 0, NULL, 0);
        _v = SWIG_CheckState(res);
        if (_v) {
          return _wrap_SBTarget_BreakpointCreateByName__SWIG_0(self, args);
        }
      }
    }
  }
  if (argc == 5) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBTarget, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        {
          int res = SWIG_AsVal_unsigned_SS_int(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          int res = SWIG_ConvertPtr(argv[3], 0, SWIGTYPE_p_lldb__SBFileSpecList, 0);
          _v = SWIG_CheckState(res);
          if (_v) {
            int res = SWIG_ConvertPtr(argv[4], 0, SWIGTYPE_p_lldb__SBFileSpecList, 0);
            _v = SWIG_CheckState(res);
            if (_v) {
              return _wrap_SBTarget_BreakpointCreateByName__SWIG_2(self, args);
            }
          }
        }
      }
    }
  }
  if (argc == 6) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBTarget, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        {
          int res = SWIG_AsVal_unsigned_SS_int(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          {
            int res = SWIG_AsVal_int(argv[3], NULL);
            _v = SWIG_CheckState(res);
          }
          if (_v) {
            int res = SWIG_ConvertPtr(argv[4], 0, SWIGTYPE_p_lldb__SBFileSpecList, 0);
            _v = SWIG_CheckState(res);
            if (_v) {
              int res = SWIG_ConvertPtr(argv[5], 0, SWIGTYPE_p_lldb__SBFileSpecList, 0);
              _v = SWIG_CheckState(res);
              if (_v) {
                return _wrap_SBTarget_BreakpointCreateByName__SWIG_3(self, args);
              }
            }
          }
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBTarget_BreakpointCreateByName'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    BreakpointCreateByName(lldb::SBTarget *,char const *,char const *)\n"
    "    BreakpointCreateByName(lldb::SBTarget *,char const *)\n"
    "    BreakpointCreateByName(lldb::SBTarget *,char const *,uint32_t,lldb::SBFileSpecList const &,lldb::SBFileSpecList const &)\n"
    "    BreakpointCreateByName(lldb::SBTarget *,char const *,uint32_t,lldb::LanguageType,lldb::SBFileSpecList const &,lldb::SBFileSpecList const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_BreakpointCreateByNames__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  char **arg2 = (char **) 0 ;
  uint32_t arg3 ;
  uint32_t arg4 ;
  lldb::SBFileSpecList *arg5 = 0 ;
  lldb::SBFileSpecList *arg6 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val4 ;
  int ecode4 = 0 ;
  void *argp5 = 0 ;
  int res5 = 0 ;
  void *argp6 = 0 ;
  int res6 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  PyObject * obj4 = 0 ;
  lldb::SBBreakpoint result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOOO:SBTarget_BreakpointCreateByNames",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_BreakpointCreateByNames" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  {
    using namespace lldb_private;
    /* Check if is a list  */
    if (PythonList::Check(obj1)) {
      PythonList list(PyRefType::Borrowed, obj1);
      arg3 = list.GetSize();
      int i = 0;
      arg2 = (char**)malloc((arg3+1)*sizeof(char*));
      for (i = 0; i < arg3; i++) {
        PythonString py_str = list.GetItemAtIndex(i).AsType<PythonString>();
        if (!py_str.IsAllocated()) {
          PyErr_SetString(PyExc_TypeError,"list must contain strings and blubby");
          free(arg2);
          return nullptr;
        }
        
        arg2[i] = const_cast<char*>(py_str.GetString().data());
      }
      arg2[i] = 0;
    } else if (obj1 == Py_None) {
      arg2 =  NULL;
    } else {
      PyErr_SetString(PyExc_TypeError,"not a list");
      return NULL;
    }
  }
  ecode4 = SWIG_AsVal_unsigned_SS_int(obj2, &val4);
  if (!SWIG_IsOK(ecode4)) {
    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "SBTarget_BreakpointCreateByNames" "', argument " "4"" of type '" "uint32_t""'");
  } 
  arg4 = static_cast< uint32_t >(val4);
  res5 = SWIG_ConvertPtr(obj3, &argp5, SWIGTYPE_p_lldb__SBFileSpecList,  0  | 0);
  if (!SWIG_IsOK(res5)) {
    SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "SBTarget_BreakpointCreateByNames" "', argument " "5"" of type '" "lldb::SBFileSpecList const &""'"); 
  }
  if (!argp5) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_BreakpointCreateByNames" "', argument " "5"" of type '" "lldb::SBFileSpecList const &""'"); 
  }
  arg5 = reinterpret_cast< lldb::SBFileSpecList * >(argp5);
  res6 = SWIG_ConvertPtr(obj4, &argp6, SWIGTYPE_p_lldb__SBFileSpecList,  0  | 0);
  if (!SWIG_IsOK(res6)) {
    SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "SBTarget_BreakpointCreateByNames" "', argument " "6"" of type '" "lldb::SBFileSpecList const &""'"); 
  }
  if (!argp6) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_BreakpointCreateByNames" "', argument " "6"" of type '" "lldb::SBFileSpecList const &""'"); 
  }
  arg6 = reinterpret_cast< lldb::SBFileSpecList * >(argp6);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->BreakpointCreateByNames((char const **)arg2,arg3,arg4,(lldb::SBFileSpecList const &)*arg5,(lldb::SBFileSpecList const &)*arg6);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBBreakpoint(static_cast< const lldb::SBBreakpoint& >(result))), SWIGTYPE_p_lldb__SBBreakpoint, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_BreakpointCreateByNames__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  char **arg2 = (char **) 0 ;
  uint32_t arg3 ;
  uint32_t arg4 ;
  lldb::LanguageType arg5 ;
  lldb::SBFileSpecList *arg6 = 0 ;
  lldb::SBFileSpecList *arg7 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val4 ;
  int ecode4 = 0 ;
  int val5 ;
  int ecode5 = 0 ;
  void *argp6 = 0 ;
  int res6 = 0 ;
  void *argp7 = 0 ;
  int res7 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  PyObject * obj4 = 0 ;
  PyObject * obj5 = 0 ;
  lldb::SBBreakpoint result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOOOO:SBTarget_BreakpointCreateByNames",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_BreakpointCreateByNames" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  {
    using namespace lldb_private;
    /* Check if is a list  */
    if (PythonList::Check(obj1)) {
      PythonList list(PyRefType::Borrowed, obj1);
      arg3 = list.GetSize();
      int i = 0;
      arg2 = (char**)malloc((arg3+1)*sizeof(char*));
      for (i = 0; i < arg3; i++) {
        PythonString py_str = list.GetItemAtIndex(i).AsType<PythonString>();
        if (!py_str.IsAllocated()) {
          PyErr_SetString(PyExc_TypeError,"list must contain strings and blubby");
          free(arg2);
          return nullptr;
        }
        
        arg2[i] = const_cast<char*>(py_str.GetString().data());
      }
      arg2[i] = 0;
    } else if (obj1 == Py_None) {
      arg2 =  NULL;
    } else {
      PyErr_SetString(PyExc_TypeError,"not a list");
      return NULL;
    }
  }
  ecode4 = SWIG_AsVal_unsigned_SS_int(obj2, &val4);
  if (!SWIG_IsOK(ecode4)) {
    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "SBTarget_BreakpointCreateByNames" "', argument " "4"" of type '" "uint32_t""'");
  } 
  arg4 = static_cast< uint32_t >(val4);
  ecode5 = SWIG_AsVal_int(obj3, &val5);
  if (!SWIG_IsOK(ecode5)) {
    SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "SBTarget_BreakpointCreateByNames" "', argument " "5"" of type '" "lldb::LanguageType""'");
  } 
  arg5 = static_cast< lldb::LanguageType >(val5);
  res6 = SWIG_ConvertPtr(obj4, &argp6, SWIGTYPE_p_lldb__SBFileSpecList,  0  | 0);
  if (!SWIG_IsOK(res6)) {
    SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "SBTarget_BreakpointCreateByNames" "', argument " "6"" of type '" "lldb::SBFileSpecList const &""'"); 
  }
  if (!argp6) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_BreakpointCreateByNames" "', argument " "6"" of type '" "lldb::SBFileSpecList const &""'"); 
  }
  arg6 = reinterpret_cast< lldb::SBFileSpecList * >(argp6);
  res7 = SWIG_ConvertPtr(obj5, &argp7, SWIGTYPE_p_lldb__SBFileSpecList,  0  | 0);
  if (!SWIG_IsOK(res7)) {
    SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "SBTarget_BreakpointCreateByNames" "', argument " "7"" of type '" "lldb::SBFileSpecList const &""'"); 
  }
  if (!argp7) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_BreakpointCreateByNames" "', argument " "7"" of type '" "lldb::SBFileSpecList const &""'"); 
  }
  arg7 = reinterpret_cast< lldb::SBFileSpecList * >(argp7);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->BreakpointCreateByNames((char const **)arg2,arg3,arg4,arg5,(lldb::SBFileSpecList const &)*arg6,(lldb::SBFileSpecList const &)*arg7);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBBreakpoint(static_cast< const lldb::SBBreakpoint& >(result))), SWIGTYPE_p_lldb__SBBreakpoint, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_BreakpointCreateByNames__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  char **arg2 = (char **) 0 ;
  uint32_t arg3 ;
  uint32_t arg4 ;
  lldb::LanguageType arg5 ;
  lldb::addr_t arg6 ;
  lldb::SBFileSpecList *arg7 = 0 ;
  lldb::SBFileSpecList *arg8 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val4 ;
  int ecode4 = 0 ;
  int val5 ;
  int ecode5 = 0 ;
  unsigned long long val6 ;
  int ecode6 = 0 ;
  void *argp7 = 0 ;
  int res7 = 0 ;
  void *argp8 = 0 ;
  int res8 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  PyObject * obj4 = 0 ;
  PyObject * obj5 = 0 ;
  PyObject * obj6 = 0 ;
  lldb::SBBreakpoint result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOOOOO:SBTarget_BreakpointCreateByNames",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_BreakpointCreateByNames" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  {
    using namespace lldb_private;
    /* Check if is a list  */
    if (PythonList::Check(obj1)) {
      PythonList list(PyRefType::Borrowed, obj1);
      arg3 = list.GetSize();
      int i = 0;
      arg2 = (char**)malloc((arg3+1)*sizeof(char*));
      for (i = 0; i < arg3; i++) {
        PythonString py_str = list.GetItemAtIndex(i).AsType<PythonString>();
        if (!py_str.IsAllocated()) {
          PyErr_SetString(PyExc_TypeError,"list must contain strings and blubby");
          free(arg2);
          return nullptr;
        }
        
        arg2[i] = const_cast<char*>(py_str.GetString().data());
      }
      arg2[i] = 0;
    } else if (obj1 == Py_None) {
      arg2 =  NULL;
    } else {
      PyErr_SetString(PyExc_TypeError,"not a list");
      return NULL;
    }
  }
  ecode4 = SWIG_AsVal_unsigned_SS_int(obj2, &val4);
  if (!SWIG_IsOK(ecode4)) {
    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "SBTarget_BreakpointCreateByNames" "', argument " "4"" of type '" "uint32_t""'");
  } 
  arg4 = static_cast< uint32_t >(val4);
  ecode5 = SWIG_AsVal_int(obj3, &val5);
  if (!SWIG_IsOK(ecode5)) {
    SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "SBTarget_BreakpointCreateByNames" "', argument " "5"" of type '" "lldb::LanguageType""'");
  } 
  arg5 = static_cast< lldb::LanguageType >(val5);
  ecode6 = SWIG_AsVal_unsigned_SS_long_SS_long(obj4, &val6);
  if (!SWIG_IsOK(ecode6)) {
    SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "SBTarget_BreakpointCreateByNames" "', argument " "6"" of type '" "lldb::addr_t""'");
  } 
  arg6 = static_cast< lldb::addr_t >(val6);
  res7 = SWIG_ConvertPtr(obj5, &argp7, SWIGTYPE_p_lldb__SBFileSpecList,  0  | 0);
  if (!SWIG_IsOK(res7)) {
    SWIG_exception_fail(SWIG_ArgError(res7), "in method '" "SBTarget_BreakpointCreateByNames" "', argument " "7"" of type '" "lldb::SBFileSpecList const &""'"); 
  }
  if (!argp7) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_BreakpointCreateByNames" "', argument " "7"" of type '" "lldb::SBFileSpecList const &""'"); 
  }
  arg7 = reinterpret_cast< lldb::SBFileSpecList * >(argp7);
  res8 = SWIG_ConvertPtr(obj6, &argp8, SWIGTYPE_p_lldb__SBFileSpecList,  0  | 0);
  if (!SWIG_IsOK(res8)) {
    SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "SBTarget_BreakpointCreateByNames" "', argument " "8"" of type '" "lldb::SBFileSpecList const &""'"); 
  }
  if (!argp8) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_BreakpointCreateByNames" "', argument " "8"" of type '" "lldb::SBFileSpecList const &""'"); 
  }
  arg8 = reinterpret_cast< lldb::SBFileSpecList * >(argp8);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->BreakpointCreateByNames((char const **)arg2,arg3,arg4,arg5,arg6,(lldb::SBFileSpecList const &)*arg7,(lldb::SBFileSpecList const &)*arg8);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBBreakpoint(static_cast< const lldb::SBBreakpoint& >(result))), SWIGTYPE_p_lldb__SBBreakpoint, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_BreakpointCreateByNames(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[8];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 7); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 5) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBTarget, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        /* Check if is a list  */
        _v = 1;
        using namespace lldb_private;
        if (PythonList::Check(argv[1])) {
          PythonList list(PyRefType::Borrowed, argv[1]);
          int size = list.GetSize();
          int i = 0;
          for (i = 0; i < size; i++) {
            PythonString s = list.GetItemAtIndex(i).AsType<PythonString>();
            if (!s.IsAllocated()) {
              _v = 0; 
            }
          }
        }
        else
        {
          _v = ( (argv[1] == Py_None) ? 1 : 0);
        }
      }
      if (_v) {
        {
          int res = SWIG_AsVal_unsigned_SS_int(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          int res = SWIG_ConvertPtr(argv[3], 0, SWIGTYPE_p_lldb__SBFileSpecList, 0);
          _v = SWIG_CheckState(res);
          if (_v) {
            int res = SWIG_ConvertPtr(argv[4], 0, SWIGTYPE_p_lldb__SBFileSpecList, 0);
            _v = SWIG_CheckState(res);
            if (_v) {
              return _wrap_SBTarget_BreakpointCreateByNames__SWIG_0(self, args);
            }
          }
        }
      }
    }
  }
  if (argc == 6) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBTarget, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        /* Check if is a list  */
        _v = 1;
        using namespace lldb_private;
        if (PythonList::Check(argv[1])) {
          PythonList list(PyRefType::Borrowed, argv[1]);
          int size = list.GetSize();
          int i = 0;
          for (i = 0; i < size; i++) {
            PythonString s = list.GetItemAtIndex(i).AsType<PythonString>();
            if (!s.IsAllocated()) {
              _v = 0; 
            }
          }
        }
        else
        {
          _v = ( (argv[1] == Py_None) ? 1 : 0);
        }
      }
      if (_v) {
        {
          int res = SWIG_AsVal_unsigned_SS_int(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          {
            int res = SWIG_AsVal_int(argv[3], NULL);
            _v = SWIG_CheckState(res);
          }
          if (_v) {
            int res = SWIG_ConvertPtr(argv[4], 0, SWIGTYPE_p_lldb__SBFileSpecList, 0);
            _v = SWIG_CheckState(res);
            if (_v) {
              int res = SWIG_ConvertPtr(argv[5], 0, SWIGTYPE_p_lldb__SBFileSpecList, 0);
              _v = SWIG_CheckState(res);
              if (_v) {
                return _wrap_SBTarget_BreakpointCreateByNames__SWIG_1(self, args);
              }
            }
          }
        }
      }
    }
  }
  if (argc == 7) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBTarget, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        /* Check if is a list  */
        _v = 1;
        using namespace lldb_private;
        if (PythonList::Check(argv[1])) {
          PythonList list(PyRefType::Borrowed, argv[1]);
          int size = list.GetSize();
          int i = 0;
          for (i = 0; i < size; i++) {
            PythonString s = list.GetItemAtIndex(i).AsType<PythonString>();
            if (!s.IsAllocated()) {
              _v = 0; 
            }
          }
        }
        else
        {
          _v = ( (argv[1] == Py_None) ? 1 : 0);
        }
      }
      if (_v) {
        {
          int res = SWIG_AsVal_unsigned_SS_int(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          {
            int res = SWIG_AsVal_int(argv[3], NULL);
            _v = SWIG_CheckState(res);
          }
          if (_v) {
            {
              int res = SWIG_AsVal_unsigned_SS_long_SS_long(argv[4], NULL);
              _v = SWIG_CheckState(res);
            }
            if (_v) {
              int res = SWIG_ConvertPtr(argv[5], 0, SWIGTYPE_p_lldb__SBFileSpecList, 0);
              _v = SWIG_CheckState(res);
              if (_v) {
                int res = SWIG_ConvertPtr(argv[6], 0, SWIGTYPE_p_lldb__SBFileSpecList, 0);
                _v = SWIG_CheckState(res);
                if (_v) {
                  return _wrap_SBTarget_BreakpointCreateByNames__SWIG_2(self, args);
                }
              }
            }
          }
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBTarget_BreakpointCreateByNames'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    BreakpointCreateByNames(lldb::SBTarget *,char const **,uint32_t,uint32_t,lldb::SBFileSpecList const &,lldb::SBFileSpecList const &)\n"
    "    BreakpointCreateByNames(lldb::SBTarget *,char const **,uint32_t,uint32_t,lldb::LanguageType,lldb::SBFileSpecList const &,lldb::SBFileSpecList const &)\n"
    "    BreakpointCreateByNames(lldb::SBTarget *,char const **,uint32_t,uint32_t,lldb::LanguageType,lldb::addr_t,lldb::SBFileSpecList const &,lldb::SBFileSpecList const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_BreakpointCreateByRegex__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  char *arg2 = (char *) 0 ;
  char *arg3 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  int res3 ;
  char *buf3 = 0 ;
  int alloc3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBBreakpoint result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBTarget_BreakpointCreateByRegex",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_BreakpointCreateByRegex" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_BreakpointCreateByRegex" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3);
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBTarget_BreakpointCreateByRegex" "', argument " "3"" of type '" "char const *""'");
  }
  arg3 = reinterpret_cast< char * >(buf3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->BreakpointCreateByRegex((char const *)arg2,(char const *)arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBBreakpoint(static_cast< const lldb::SBBreakpoint& >(result))), SWIGTYPE_p_lldb__SBBreakpoint, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_BreakpointCreateByRegex__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBBreakpoint result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTarget_BreakpointCreateByRegex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_BreakpointCreateByRegex" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_BreakpointCreateByRegex" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->BreakpointCreateByRegex((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBBreakpoint(static_cast< const lldb::SBBreakpoint& >(result))), SWIGTYPE_p_lldb__SBBreakpoint, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_BreakpointCreateByRegex__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  char *arg2 = (char *) 0 ;
  lldb::LanguageType arg3 ;
  lldb::SBFileSpecList *arg4 = 0 ;
  lldb::SBFileSpecList *arg5 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  int val3 ;
  int ecode3 = 0 ;
  void *argp4 = 0 ;
  int res4 = 0 ;
  void *argp5 = 0 ;
  int res5 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  PyObject * obj4 = 0 ;
  lldb::SBBreakpoint result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOOO:SBTarget_BreakpointCreateByRegex",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_BreakpointCreateByRegex" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_BreakpointCreateByRegex" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  ecode3 = SWIG_AsVal_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBTarget_BreakpointCreateByRegex" "', argument " "3"" of type '" "lldb::LanguageType""'");
  } 
  arg3 = static_cast< lldb::LanguageType >(val3);
  res4 = SWIG_ConvertPtr(obj3, &argp4, SWIGTYPE_p_lldb__SBFileSpecList,  0  | 0);
  if (!SWIG_IsOK(res4)) {
    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "SBTarget_BreakpointCreateByRegex" "', argument " "4"" of type '" "lldb::SBFileSpecList const &""'"); 
  }
  if (!argp4) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_BreakpointCreateByRegex" "', argument " "4"" of type '" "lldb::SBFileSpecList const &""'"); 
  }
  arg4 = reinterpret_cast< lldb::SBFileSpecList * >(argp4);
  res5 = SWIG_ConvertPtr(obj4, &argp5, SWIGTYPE_p_lldb__SBFileSpecList,  0  | 0);
  if (!SWIG_IsOK(res5)) {
    SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "SBTarget_BreakpointCreateByRegex" "', argument " "5"" of type '" "lldb::SBFileSpecList const &""'"); 
  }
  if (!argp5) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_BreakpointCreateByRegex" "', argument " "5"" of type '" "lldb::SBFileSpecList const &""'"); 
  }
  arg5 = reinterpret_cast< lldb::SBFileSpecList * >(argp5);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->BreakpointCreateByRegex((char const *)arg2,arg3,(lldb::SBFileSpecList const &)*arg4,(lldb::SBFileSpecList const &)*arg5);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBBreakpoint(static_cast< const lldb::SBBreakpoint& >(result))), SWIGTYPE_p_lldb__SBBreakpoint, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_BreakpointCreateByRegex(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[6];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 5); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBTarget, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        return _wrap_SBTarget_BreakpointCreateByRegex__SWIG_1(self, args);
      }
    }
  }
  if (argc == 3) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBTarget, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        int res = SWIG_AsCharPtrAndSize(argv[2], 0, NULL, 0);
        _v = SWIG_CheckState(res);
        if (_v) {
          return _wrap_SBTarget_BreakpointCreateByRegex__SWIG_0(self, args);
        }
      }
    }
  }
  if (argc == 5) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBTarget, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        {
          int res = SWIG_AsVal_int(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          int res = SWIG_ConvertPtr(argv[3], 0, SWIGTYPE_p_lldb__SBFileSpecList, 0);
          _v = SWIG_CheckState(res);
          if (_v) {
            int res = SWIG_ConvertPtr(argv[4], 0, SWIGTYPE_p_lldb__SBFileSpecList, 0);
            _v = SWIG_CheckState(res);
            if (_v) {
              return _wrap_SBTarget_BreakpointCreateByRegex__SWIG_2(self, args);
            }
          }
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBTarget_BreakpointCreateByRegex'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    BreakpointCreateByRegex(lldb::SBTarget *,char const *,char const *)\n"
    "    BreakpointCreateByRegex(lldb::SBTarget *,char const *)\n"
    "    BreakpointCreateByRegex(lldb::SBTarget *,char const *,lldb::LanguageType,lldb::SBFileSpecList const &,lldb::SBFileSpecList const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_BreakpointCreateBySourceRegex__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  char *arg2 = (char *) 0 ;
  lldb::SBFileSpec *arg3 = 0 ;
  char *arg4 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  void *argp3 = 0 ;
  int res3 = 0 ;
  int res4 ;
  char *buf4 = 0 ;
  int alloc4 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  lldb::SBBreakpoint result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOO:SBTarget_BreakpointCreateBySourceRegex",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_BreakpointCreateBySourceRegex" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_BreakpointCreateBySourceRegex" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBFileSpec,  0  | 0);
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBTarget_BreakpointCreateBySourceRegex" "', argument " "3"" of type '" "lldb::SBFileSpec const &""'"); 
  }
  if (!argp3) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_BreakpointCreateBySourceRegex" "', argument " "3"" of type '" "lldb::SBFileSpec const &""'"); 
  }
  arg3 = reinterpret_cast< lldb::SBFileSpec * >(argp3);
  res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4);
  if (!SWIG_IsOK(res4)) {
    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "SBTarget_BreakpointCreateBySourceRegex" "', argument " "4"" of type '" "char const *""'");
  }
  arg4 = reinterpret_cast< char * >(buf4);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->BreakpointCreateBySourceRegex((char const *)arg2,(lldb::SBFileSpec const &)*arg3,(char const *)arg4);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBBreakpoint(static_cast< const lldb::SBBreakpoint& >(result))), SWIGTYPE_p_lldb__SBBreakpoint, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  if (alloc4 == SWIG_NEWOBJ) delete[] buf4;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  if (alloc4 == SWIG_NEWOBJ) delete[] buf4;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_BreakpointCreateBySourceRegex__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  char *arg2 = (char *) 0 ;
  lldb::SBFileSpec *arg3 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  void *argp3 = 0 ;
  int res3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBBreakpoint result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBTarget_BreakpointCreateBySourceRegex",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_BreakpointCreateBySourceRegex" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_BreakpointCreateBySourceRegex" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBFileSpec,  0  | 0);
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBTarget_BreakpointCreateBySourceRegex" "', argument " "3"" of type '" "lldb::SBFileSpec const &""'"); 
  }
  if (!argp3) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_BreakpointCreateBySourceRegex" "', argument " "3"" of type '" "lldb::SBFileSpec const &""'"); 
  }
  arg3 = reinterpret_cast< lldb::SBFileSpec * >(argp3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->BreakpointCreateBySourceRegex((char const *)arg2,(lldb::SBFileSpec const &)*arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBBreakpoint(static_cast< const lldb::SBBreakpoint& >(result))), SWIGTYPE_p_lldb__SBBreakpoint, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_BreakpointCreateBySourceRegex__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  char *arg2 = (char *) 0 ;
  lldb::SBFileSpecList *arg3 = 0 ;
  lldb::SBFileSpecList *arg4 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  void *argp3 = 0 ;
  int res3 = 0 ;
  void *argp4 = 0 ;
  int res4 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  lldb::SBBreakpoint result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOO:SBTarget_BreakpointCreateBySourceRegex",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_BreakpointCreateBySourceRegex" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_BreakpointCreateBySourceRegex" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBFileSpecList,  0  | 0);
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBTarget_BreakpointCreateBySourceRegex" "', argument " "3"" of type '" "lldb::SBFileSpecList const &""'"); 
  }
  if (!argp3) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_BreakpointCreateBySourceRegex" "', argument " "3"" of type '" "lldb::SBFileSpecList const &""'"); 
  }
  arg3 = reinterpret_cast< lldb::SBFileSpecList * >(argp3);
  res4 = SWIG_ConvertPtr(obj3, &argp4, SWIGTYPE_p_lldb__SBFileSpecList,  0  | 0);
  if (!SWIG_IsOK(res4)) {
    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "SBTarget_BreakpointCreateBySourceRegex" "', argument " "4"" of type '" "lldb::SBFileSpecList const &""'"); 
  }
  if (!argp4) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_BreakpointCreateBySourceRegex" "', argument " "4"" of type '" "lldb::SBFileSpecList const &""'"); 
  }
  arg4 = reinterpret_cast< lldb::SBFileSpecList * >(argp4);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->BreakpointCreateBySourceRegex((char const *)arg2,(lldb::SBFileSpecList const &)*arg3,(lldb::SBFileSpecList const &)*arg4);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBBreakpoint(static_cast< const lldb::SBBreakpoint& >(result))), SWIGTYPE_p_lldb__SBBreakpoint, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_BreakpointCreateBySourceRegex__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  char *arg2 = (char *) 0 ;
  lldb::SBFileSpecList *arg3 = 0 ;
  lldb::SBFileSpecList *arg4 = 0 ;
  lldb::SBStringList *arg5 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  void *argp3 = 0 ;
  int res3 = 0 ;
  void *argp4 = 0 ;
  int res4 = 0 ;
  void *argp5 = 0 ;
  int res5 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  PyObject * obj4 = 0 ;
  lldb::SBBreakpoint result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOOO:SBTarget_BreakpointCreateBySourceRegex",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_BreakpointCreateBySourceRegex" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_BreakpointCreateBySourceRegex" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBFileSpecList,  0  | 0);
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBTarget_BreakpointCreateBySourceRegex" "', argument " "3"" of type '" "lldb::SBFileSpecList const &""'"); 
  }
  if (!argp3) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_BreakpointCreateBySourceRegex" "', argument " "3"" of type '" "lldb::SBFileSpecList const &""'"); 
  }
  arg3 = reinterpret_cast< lldb::SBFileSpecList * >(argp3);
  res4 = SWIG_ConvertPtr(obj3, &argp4, SWIGTYPE_p_lldb__SBFileSpecList,  0  | 0);
  if (!SWIG_IsOK(res4)) {
    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "SBTarget_BreakpointCreateBySourceRegex" "', argument " "4"" of type '" "lldb::SBFileSpecList const &""'"); 
  }
  if (!argp4) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_BreakpointCreateBySourceRegex" "', argument " "4"" of type '" "lldb::SBFileSpecList const &""'"); 
  }
  arg4 = reinterpret_cast< lldb::SBFileSpecList * >(argp4);
  res5 = SWIG_ConvertPtr(obj4, &argp5, SWIGTYPE_p_lldb__SBStringList,  0  | 0);
  if (!SWIG_IsOK(res5)) {
    SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "SBTarget_BreakpointCreateBySourceRegex" "', argument " "5"" of type '" "lldb::SBStringList const &""'"); 
  }
  if (!argp5) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_BreakpointCreateBySourceRegex" "', argument " "5"" of type '" "lldb::SBStringList const &""'"); 
  }
  arg5 = reinterpret_cast< lldb::SBStringList * >(argp5);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->BreakpointCreateBySourceRegex((char const *)arg2,(lldb::SBFileSpecList const &)*arg3,(lldb::SBFileSpecList const &)*arg4,(lldb::SBStringList const &)*arg5);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBBreakpoint(static_cast< const lldb::SBBreakpoint& >(result))), SWIGTYPE_p_lldb__SBBreakpoint, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_BreakpointCreateBySourceRegex(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[6];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 5); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 3) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBTarget, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_lldb__SBFileSpec, 0);
        _v = SWIG_CheckState(res);
        if (_v) {
          return _wrap_SBTarget_BreakpointCreateBySourceRegex__SWIG_1(self, args);
        }
      }
    }
  }
  if (argc == 4) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBTarget, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_lldb__SBFileSpec, 0);
        _v = SWIG_CheckState(res);
        if (_v) {
          int res = SWIG_AsCharPtrAndSize(argv[3], 0, NULL, 0);
          _v = SWIG_CheckState(res);
          if (_v) {
            return _wrap_SBTarget_BreakpointCreateBySourceRegex__SWIG_0(self, args);
          }
        }
      }
    }
  }
  if (argc == 4) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBTarget, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_lldb__SBFileSpecList, 0);
        _v = SWIG_CheckState(res);
        if (_v) {
          int res = SWIG_ConvertPtr(argv[3], 0, SWIGTYPE_p_lldb__SBFileSpecList, 0);
          _v = SWIG_CheckState(res);
          if (_v) {
            return _wrap_SBTarget_BreakpointCreateBySourceRegex__SWIG_2(self, args);
          }
        }
      }
    }
  }
  if (argc == 5) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBTarget, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_lldb__SBFileSpecList, 0);
        _v = SWIG_CheckState(res);
        if (_v) {
          int res = SWIG_ConvertPtr(argv[3], 0, SWIGTYPE_p_lldb__SBFileSpecList, 0);
          _v = SWIG_CheckState(res);
          if (_v) {
            int res = SWIG_ConvertPtr(argv[4], 0, SWIGTYPE_p_lldb__SBStringList, 0);
            _v = SWIG_CheckState(res);
            if (_v) {
              return _wrap_SBTarget_BreakpointCreateBySourceRegex__SWIG_3(self, args);
            }
          }
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBTarget_BreakpointCreateBySourceRegex'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    BreakpointCreateBySourceRegex(lldb::SBTarget *,char const *,lldb::SBFileSpec const &,char const *)\n"
    "    BreakpointCreateBySourceRegex(lldb::SBTarget *,char const *,lldb::SBFileSpec const &)\n"
    "    BreakpointCreateBySourceRegex(lldb::SBTarget *,char const *,lldb::SBFileSpecList const &,lldb::SBFileSpecList const &)\n"
    "    BreakpointCreateBySourceRegex(lldb::SBTarget *,char const *,lldb::SBFileSpecList const &,lldb::SBFileSpecList const &,lldb::SBStringList const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_BreakpointCreateForException__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  lldb::LanguageType arg2 ;
  bool arg3 ;
  bool arg4 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int val2 ;
  int ecode2 = 0 ;
  bool val3 ;
  int ecode3 = 0 ;
  bool val4 ;
  int ecode4 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  lldb::SBBreakpoint result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOO:SBTarget_BreakpointCreateForException",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_BreakpointCreateForException" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  ecode2 = SWIG_AsVal_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBTarget_BreakpointCreateForException" "', argument " "2"" of type '" "lldb::LanguageType""'");
  } 
  arg2 = static_cast< lldb::LanguageType >(val2);
  ecode3 = SWIG_AsVal_bool(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBTarget_BreakpointCreateForException" "', argument " "3"" of type '" "bool""'");
  } 
  arg3 = static_cast< bool >(val3);
  ecode4 = SWIG_AsVal_bool(obj3, &val4);
  if (!SWIG_IsOK(ecode4)) {
    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "SBTarget_BreakpointCreateForException" "', argument " "4"" of type '" "bool""'");
  } 
  arg4 = static_cast< bool >(val4);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->BreakpointCreateForException(arg2,arg3,arg4);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBBreakpoint(static_cast< const lldb::SBBreakpoint& >(result))), SWIGTYPE_p_lldb__SBBreakpoint, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_BreakpointCreateForException__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  lldb::LanguageType arg2 ;
  bool arg3 ;
  bool arg4 ;
  lldb::SBStringList *arg5 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int val2 ;
  int ecode2 = 0 ;
  bool val3 ;
  int ecode3 = 0 ;
  bool val4 ;
  int ecode4 = 0 ;
  void *argp5 = 0 ;
  int res5 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  PyObject * obj4 = 0 ;
  lldb::SBBreakpoint result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOOO:SBTarget_BreakpointCreateForException",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_BreakpointCreateForException" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  ecode2 = SWIG_AsVal_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBTarget_BreakpointCreateForException" "', argument " "2"" of type '" "lldb::LanguageType""'");
  } 
  arg2 = static_cast< lldb::LanguageType >(val2);
  ecode3 = SWIG_AsVal_bool(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBTarget_BreakpointCreateForException" "', argument " "3"" of type '" "bool""'");
  } 
  arg3 = static_cast< bool >(val3);
  ecode4 = SWIG_AsVal_bool(obj3, &val4);
  if (!SWIG_IsOK(ecode4)) {
    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "SBTarget_BreakpointCreateForException" "', argument " "4"" of type '" "bool""'");
  } 
  arg4 = static_cast< bool >(val4);
  res5 = SWIG_ConvertPtr(obj4, &argp5, SWIGTYPE_p_lldb__SBStringList,  0 );
  if (!SWIG_IsOK(res5)) {
    SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "SBTarget_BreakpointCreateForException" "', argument " "5"" of type '" "lldb::SBStringList &""'"); 
  }
  if (!argp5) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_BreakpointCreateForException" "', argument " "5"" of type '" "lldb::SBStringList &""'"); 
  }
  arg5 = reinterpret_cast< lldb::SBStringList * >(argp5);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->BreakpointCreateForException(arg2,arg3,arg4,*arg5);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBBreakpoint(static_cast< const lldb::SBBreakpoint& >(result))), SWIGTYPE_p_lldb__SBBreakpoint, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_BreakpointCreateForException(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[6];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 5); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 4) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBTarget, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_int(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        {
          int res = SWIG_AsVal_bool(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          {
            int res = SWIG_AsVal_bool(argv[3], NULL);
            _v = SWIG_CheckState(res);
          }
          if (_v) {
            return _wrap_SBTarget_BreakpointCreateForException__SWIG_0(self, args);
          }
        }
      }
    }
  }
  if (argc == 5) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBTarget, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_int(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        {
          int res = SWIG_AsVal_bool(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          {
            int res = SWIG_AsVal_bool(argv[3], NULL);
            _v = SWIG_CheckState(res);
          }
          if (_v) {
            void *vptr = 0;
            int res = SWIG_ConvertPtr(argv[4], &vptr, SWIGTYPE_p_lldb__SBStringList, 0);
            _v = SWIG_CheckState(res);
            if (_v) {
              return _wrap_SBTarget_BreakpointCreateForException__SWIG_1(self, args);
            }
          }
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBTarget_BreakpointCreateForException'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    BreakpointCreateForException(lldb::SBTarget *,lldb::LanguageType,bool,bool)\n"
    "    BreakpointCreateForException(lldb::SBTarget *,lldb::LanguageType,bool,bool,lldb::SBStringList &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_BreakpointCreateByAddress(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  lldb::addr_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned long long val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBBreakpoint result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTarget_BreakpointCreateByAddress",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_BreakpointCreateByAddress" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_long_SS_long(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBTarget_BreakpointCreateByAddress" "', argument " "2"" of type '" "lldb::addr_t""'");
  } 
  arg2 = static_cast< lldb::addr_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->BreakpointCreateByAddress(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBBreakpoint(static_cast< const lldb::SBBreakpoint& >(result))), SWIGTYPE_p_lldb__SBBreakpoint, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_BreakpointCreateBySBAddress(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  lldb::SBAddress *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBBreakpoint result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTarget_BreakpointCreateBySBAddress",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_BreakpointCreateBySBAddress" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBAddress,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_BreakpointCreateBySBAddress" "', argument " "2"" of type '" "lldb::SBAddress &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_BreakpointCreateBySBAddress" "', argument " "2"" of type '" "lldb::SBAddress &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBAddress * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->BreakpointCreateBySBAddress(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBBreakpoint(static_cast< const lldb::SBBreakpoint& >(result))), SWIGTYPE_p_lldb__SBBreakpoint, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_GetNumBreakpoints(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTarget_GetNumBreakpoints",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_GetNumBreakpoints" "', argument " "1"" of type '" "lldb::SBTarget const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)((lldb::SBTarget const *)arg1)->GetNumBreakpoints();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_GetBreakpointAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBBreakpoint result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTarget_GetBreakpointAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_GetBreakpointAtIndex" "', argument " "1"" of type '" "lldb::SBTarget const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBTarget_GetBreakpointAtIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBTarget const *)arg1)->GetBreakpointAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBBreakpoint(static_cast< const lldb::SBBreakpoint& >(result))), SWIGTYPE_p_lldb__SBBreakpoint, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_BreakpointDelete(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  lldb::break_id_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTarget_BreakpointDelete",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_BreakpointDelete" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  ecode2 = SWIG_AsVal_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBTarget_BreakpointDelete" "', argument " "2"" of type '" "lldb::break_id_t""'");
  } 
  arg2 = static_cast< lldb::break_id_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->BreakpointDelete(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_FindBreakpointByID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  lldb::break_id_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBBreakpoint result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTarget_FindBreakpointByID",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_FindBreakpointByID" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  ecode2 = SWIG_AsVal_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBTarget_FindBreakpointByID" "', argument " "2"" of type '" "lldb::break_id_t""'");
  } 
  arg2 = static_cast< lldb::break_id_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->FindBreakpointByID(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBBreakpoint(static_cast< const lldb::SBBreakpoint& >(result))), SWIGTYPE_p_lldb__SBBreakpoint, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_FindBreakpointsByName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  char *arg2 = (char *) 0 ;
  lldb::SBBreakpointList *arg3 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  void *argp3 = 0 ;
  int res3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBTarget_FindBreakpointsByName",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_FindBreakpointsByName" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_FindBreakpointsByName" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBBreakpointList,  0 );
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBTarget_FindBreakpointsByName" "', argument " "3"" of type '" "lldb::SBBreakpointList &""'"); 
  }
  if (!argp3) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_FindBreakpointsByName" "', argument " "3"" of type '" "lldb::SBBreakpointList &""'"); 
  }
  arg3 = reinterpret_cast< lldb::SBBreakpointList * >(argp3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->FindBreakpointsByName((char const *)arg2,*arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_DeleteBreakpointName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTarget_DeleteBreakpointName",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_DeleteBreakpointName" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_DeleteBreakpointName" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->DeleteBreakpointName((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_GetBreakpointNames(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  lldb::SBStringList *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTarget_GetBreakpointNames",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_GetBreakpointNames" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStringList,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_GetBreakpointNames" "', argument " "2"" of type '" "lldb::SBStringList &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_GetBreakpointNames" "', argument " "2"" of type '" "lldb::SBStringList &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStringList * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->GetBreakpointNames(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_EnableAllBreakpoints(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTarget_EnableAllBreakpoints",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_EnableAllBreakpoints" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->EnableAllBreakpoints();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_DisableAllBreakpoints(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTarget_DisableAllBreakpoints",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_DisableAllBreakpoints" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->DisableAllBreakpoints();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_DeleteAllBreakpoints(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTarget_DeleteAllBreakpoints",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_DeleteAllBreakpoints" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->DeleteAllBreakpoints();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_BreakpointsCreateFromFile__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  lldb::SBFileSpec *arg2 = 0 ;
  lldb::SBBreakpointList *arg3 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  void *argp3 = 0 ;
  int res3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBError result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBTarget_BreakpointsCreateFromFile",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_BreakpointsCreateFromFile" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBFileSpec,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_BreakpointsCreateFromFile" "', argument " "2"" of type '" "lldb::SBFileSpec &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_BreakpointsCreateFromFile" "', argument " "2"" of type '" "lldb::SBFileSpec &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBFileSpec * >(argp2);
  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBBreakpointList,  0 );
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBTarget_BreakpointsCreateFromFile" "', argument " "3"" of type '" "lldb::SBBreakpointList &""'"); 
  }
  if (!argp3) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_BreakpointsCreateFromFile" "', argument " "3"" of type '" "lldb::SBBreakpointList &""'"); 
  }
  arg3 = reinterpret_cast< lldb::SBBreakpointList * >(argp3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->BreakpointsCreateFromFile(*arg2,*arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBError(static_cast< const lldb::SBError& >(result))), SWIGTYPE_p_lldb__SBError, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_BreakpointsCreateFromFile__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  lldb::SBFileSpec *arg2 = 0 ;
  lldb::SBStringList *arg3 = 0 ;
  lldb::SBBreakpointList *arg4 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  void *argp3 = 0 ;
  int res3 = 0 ;
  void *argp4 = 0 ;
  int res4 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  lldb::SBError result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOO:SBTarget_BreakpointsCreateFromFile",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_BreakpointsCreateFromFile" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBFileSpec,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_BreakpointsCreateFromFile" "', argument " "2"" of type '" "lldb::SBFileSpec &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_BreakpointsCreateFromFile" "', argument " "2"" of type '" "lldb::SBFileSpec &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBFileSpec * >(argp2);
  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBStringList,  0 );
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBTarget_BreakpointsCreateFromFile" "', argument " "3"" of type '" "lldb::SBStringList &""'"); 
  }
  if (!argp3) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_BreakpointsCreateFromFile" "', argument " "3"" of type '" "lldb::SBStringList &""'"); 
  }
  arg3 = reinterpret_cast< lldb::SBStringList * >(argp3);
  res4 = SWIG_ConvertPtr(obj3, &argp4, SWIGTYPE_p_lldb__SBBreakpointList,  0 );
  if (!SWIG_IsOK(res4)) {
    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "SBTarget_BreakpointsCreateFromFile" "', argument " "4"" of type '" "lldb::SBBreakpointList &""'"); 
  }
  if (!argp4) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_BreakpointsCreateFromFile" "', argument " "4"" of type '" "lldb::SBBreakpointList &""'"); 
  }
  arg4 = reinterpret_cast< lldb::SBBreakpointList * >(argp4);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->BreakpointsCreateFromFile(*arg2,*arg3,*arg4);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBError(static_cast< const lldb::SBError& >(result))), SWIGTYPE_p_lldb__SBError, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_BreakpointsCreateFromFile(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[5];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 4); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 3) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBTarget, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      void *vptr = 0;
      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_lldb__SBFileSpec, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        void *vptr = 0;
        int res = SWIG_ConvertPtr(argv[2], &vptr, SWIGTYPE_p_lldb__SBBreakpointList, 0);
        _v = SWIG_CheckState(res);
        if (_v) {
          return _wrap_SBTarget_BreakpointsCreateFromFile__SWIG_0(self, args);
        }
      }
    }
  }
  if (argc == 4) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBTarget, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      void *vptr = 0;
      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_lldb__SBFileSpec, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        void *vptr = 0;
        int res = SWIG_ConvertPtr(argv[2], &vptr, SWIGTYPE_p_lldb__SBStringList, 0);
        _v = SWIG_CheckState(res);
        if (_v) {
          void *vptr = 0;
          int res = SWIG_ConvertPtr(argv[3], &vptr, SWIGTYPE_p_lldb__SBBreakpointList, 0);
          _v = SWIG_CheckState(res);
          if (_v) {
            return _wrap_SBTarget_BreakpointsCreateFromFile__SWIG_1(self, args);
          }
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBTarget_BreakpointsCreateFromFile'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    BreakpointsCreateFromFile(lldb::SBTarget *,lldb::SBFileSpec &,lldb::SBBreakpointList &)\n"
    "    BreakpointsCreateFromFile(lldb::SBTarget *,lldb::SBFileSpec &,lldb::SBStringList &,lldb::SBBreakpointList &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_BreakpointsWriteToFile__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  lldb::SBFileSpec *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBError result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTarget_BreakpointsWriteToFile",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_BreakpointsWriteToFile" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBFileSpec,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_BreakpointsWriteToFile" "', argument " "2"" of type '" "lldb::SBFileSpec &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_BreakpointsWriteToFile" "', argument " "2"" of type '" "lldb::SBFileSpec &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBFileSpec * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->BreakpointsWriteToFile(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBError(static_cast< const lldb::SBError& >(result))), SWIGTYPE_p_lldb__SBError, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_BreakpointsWriteToFile__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  lldb::SBFileSpec *arg2 = 0 ;
  lldb::SBBreakpointList *arg3 = 0 ;
  bool arg4 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  void *argp3 = 0 ;
  int res3 = 0 ;
  bool val4 ;
  int ecode4 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  lldb::SBError result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOO:SBTarget_BreakpointsWriteToFile",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_BreakpointsWriteToFile" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBFileSpec,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_BreakpointsWriteToFile" "', argument " "2"" of type '" "lldb::SBFileSpec &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_BreakpointsWriteToFile" "', argument " "2"" of type '" "lldb::SBFileSpec &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBFileSpec * >(argp2);
  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBBreakpointList,  0 );
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBTarget_BreakpointsWriteToFile" "', argument " "3"" of type '" "lldb::SBBreakpointList &""'"); 
  }
  if (!argp3) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_BreakpointsWriteToFile" "', argument " "3"" of type '" "lldb::SBBreakpointList &""'"); 
  }
  arg3 = reinterpret_cast< lldb::SBBreakpointList * >(argp3);
  ecode4 = SWIG_AsVal_bool(obj3, &val4);
  if (!SWIG_IsOK(ecode4)) {
    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "SBTarget_BreakpointsWriteToFile" "', argument " "4"" of type '" "bool""'");
  } 
  arg4 = static_cast< bool >(val4);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->BreakpointsWriteToFile(*arg2,*arg3,arg4);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBError(static_cast< const lldb::SBError& >(result))), SWIGTYPE_p_lldb__SBError, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_BreakpointsWriteToFile__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  lldb::SBFileSpec *arg2 = 0 ;
  lldb::SBBreakpointList *arg3 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  void *argp3 = 0 ;
  int res3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBError result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBTarget_BreakpointsWriteToFile",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_BreakpointsWriteToFile" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBFileSpec,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_BreakpointsWriteToFile" "', argument " "2"" of type '" "lldb::SBFileSpec &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_BreakpointsWriteToFile" "', argument " "2"" of type '" "lldb::SBFileSpec &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBFileSpec * >(argp2);
  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBBreakpointList,  0 );
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBTarget_BreakpointsWriteToFile" "', argument " "3"" of type '" "lldb::SBBreakpointList &""'"); 
  }
  if (!argp3) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_BreakpointsWriteToFile" "', argument " "3"" of type '" "lldb::SBBreakpointList &""'"); 
  }
  arg3 = reinterpret_cast< lldb::SBBreakpointList * >(argp3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->BreakpointsWriteToFile(*arg2,*arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBError(static_cast< const lldb::SBError& >(result))), SWIGTYPE_p_lldb__SBError, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_BreakpointsWriteToFile(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[5];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 4); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBTarget, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      void *vptr = 0;
      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_lldb__SBFileSpec, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        return _wrap_SBTarget_BreakpointsWriteToFile__SWIG_0(self, args);
      }
    }
  }
  if (argc == 3) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBTarget, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      void *vptr = 0;
      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_lldb__SBFileSpec, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        void *vptr = 0;
        int res = SWIG_ConvertPtr(argv[2], &vptr, SWIGTYPE_p_lldb__SBBreakpointList, 0);
        _v = SWIG_CheckState(res);
        if (_v) {
          return _wrap_SBTarget_BreakpointsWriteToFile__SWIG_2(self, args);
        }
      }
    }
  }
  if (argc == 4) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBTarget, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      void *vptr = 0;
      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_lldb__SBFileSpec, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        void *vptr = 0;
        int res = SWIG_ConvertPtr(argv[2], &vptr, SWIGTYPE_p_lldb__SBBreakpointList, 0);
        _v = SWIG_CheckState(res);
        if (_v) {
          {
            int res = SWIG_AsVal_bool(argv[3], NULL);
            _v = SWIG_CheckState(res);
          }
          if (_v) {
            return _wrap_SBTarget_BreakpointsWriteToFile__SWIG_1(self, args);
          }
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBTarget_BreakpointsWriteToFile'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    BreakpointsWriteToFile(lldb::SBTarget *,lldb::SBFileSpec &)\n"
    "    BreakpointsWriteToFile(lldb::SBTarget *,lldb::SBFileSpec &,lldb::SBBreakpointList &,bool)\n"
    "    BreakpointsWriteToFile(lldb::SBTarget *,lldb::SBFileSpec &,lldb::SBBreakpointList &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_GetNumWatchpoints(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTarget_GetNumWatchpoints",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_GetNumWatchpoints" "', argument " "1"" of type '" "lldb::SBTarget const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)((lldb::SBTarget const *)arg1)->GetNumWatchpoints();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_GetWatchpointAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBWatchpoint result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTarget_GetWatchpointAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_GetWatchpointAtIndex" "', argument " "1"" of type '" "lldb::SBTarget const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBTarget_GetWatchpointAtIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBTarget const *)arg1)->GetWatchpointAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBWatchpoint(static_cast< const lldb::SBWatchpoint& >(result))), SWIGTYPE_p_lldb__SBWatchpoint, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_DeleteWatchpoint(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  lldb::watch_id_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTarget_DeleteWatchpoint",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_DeleteWatchpoint" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  ecode2 = SWIG_AsVal_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBTarget_DeleteWatchpoint" "', argument " "2"" of type '" "lldb::watch_id_t""'");
  } 
  arg2 = static_cast< lldb::watch_id_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->DeleteWatchpoint(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_FindWatchpointByID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  lldb::watch_id_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBWatchpoint result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTarget_FindWatchpointByID",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_FindWatchpointByID" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  ecode2 = SWIG_AsVal_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBTarget_FindWatchpointByID" "', argument " "2"" of type '" "lldb::watch_id_t""'");
  } 
  arg2 = static_cast< lldb::watch_id_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->FindWatchpointByID(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBWatchpoint(static_cast< const lldb::SBWatchpoint& >(result))), SWIGTYPE_p_lldb__SBWatchpoint, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_EnableAllWatchpoints(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTarget_EnableAllWatchpoints",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_EnableAllWatchpoints" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->EnableAllWatchpoints();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_DisableAllWatchpoints(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTarget_DisableAllWatchpoints",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_DisableAllWatchpoints" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->DisableAllWatchpoints();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_DeleteAllWatchpoints(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTarget_DeleteAllWatchpoints",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_DeleteAllWatchpoints" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->DeleteAllWatchpoints();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_WatchAddress(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  lldb::addr_t arg2 ;
  size_t arg3 ;
  bool arg4 ;
  bool arg5 ;
  lldb::SBError *arg6 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned long long val2 ;
  int ecode2 = 0 ;
  size_t val3 ;
  int ecode3 = 0 ;
  bool val4 ;
  int ecode4 = 0 ;
  bool val5 ;
  int ecode5 = 0 ;
  void *argp6 = 0 ;
  int res6 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  PyObject * obj4 = 0 ;
  PyObject * obj5 = 0 ;
  lldb::SBWatchpoint result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOOOO:SBTarget_WatchAddress",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_WatchAddress" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_long_SS_long(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBTarget_WatchAddress" "', argument " "2"" of type '" "lldb::addr_t""'");
  } 
  arg2 = static_cast< lldb::addr_t >(val2);
  ecode3 = SWIG_AsVal_size_t(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBTarget_WatchAddress" "', argument " "3"" of type '" "size_t""'");
  } 
  arg3 = static_cast< size_t >(val3);
  ecode4 = SWIG_AsVal_bool(obj3, &val4);
  if (!SWIG_IsOK(ecode4)) {
    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "SBTarget_WatchAddress" "', argument " "4"" of type '" "bool""'");
  } 
  arg4 = static_cast< bool >(val4);
  ecode5 = SWIG_AsVal_bool(obj4, &val5);
  if (!SWIG_IsOK(ecode5)) {
    SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "SBTarget_WatchAddress" "', argument " "5"" of type '" "bool""'");
  } 
  arg5 = static_cast< bool >(val5);
  res6 = SWIG_ConvertPtr(obj5, &argp6, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res6)) {
    SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "SBTarget_WatchAddress" "', argument " "6"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp6) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_WatchAddress" "', argument " "6"" of type '" "lldb::SBError &""'"); 
  }
  arg6 = reinterpret_cast< lldb::SBError * >(argp6);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->WatchAddress(arg2,arg3,arg4,arg5,*arg6);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBWatchpoint(static_cast< const lldb::SBWatchpoint& >(result))), SWIGTYPE_p_lldb__SBWatchpoint, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_GetBroadcaster(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBBroadcaster result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTarget_GetBroadcaster",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_GetBroadcaster" "', argument " "1"" of type '" "lldb::SBTarget const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBTarget const *)arg1)->GetBroadcaster();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBBroadcaster(static_cast< const lldb::SBBroadcaster& >(result))), SWIGTYPE_p_lldb__SBBroadcaster, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_CreateValueFromAddress(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  char *arg2 = (char *) 0 ;
  lldb::SBAddress arg3 ;
  lldb::SBType arg4 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  void *argp3 ;
  int res3 = 0 ;
  void *argp4 ;
  int res4 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  lldb::SBValue result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOO:SBTarget_CreateValueFromAddress",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_CreateValueFromAddress" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_CreateValueFromAddress" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBAddress,  0  | 0);
    if (!SWIG_IsOK(res3)) {
      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBTarget_CreateValueFromAddress" "', argument " "3"" of type '" "lldb::SBAddress""'"); 
    }  
    if (!argp3) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_CreateValueFromAddress" "', argument " "3"" of type '" "lldb::SBAddress""'");
    } else {
      lldb::SBAddress * temp = reinterpret_cast< lldb::SBAddress * >(argp3);
      arg3 = *temp;
      if (SWIG_IsNewObj(res3)) delete temp;
    }
  }
  {
    res4 = SWIG_ConvertPtr(obj3, &argp4, SWIGTYPE_p_lldb__SBType,  0  | 0);
    if (!SWIG_IsOK(res4)) {
      SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "SBTarget_CreateValueFromAddress" "', argument " "4"" of type '" "lldb::SBType""'"); 
    }  
    if (!argp4) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_CreateValueFromAddress" "', argument " "4"" of type '" "lldb::SBType""'");
    } else {
      lldb::SBType * temp = reinterpret_cast< lldb::SBType * >(argp4);
      arg4 = *temp;
      if (SWIG_IsNewObj(res4)) delete temp;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->CreateValueFromAddress((char const *)arg2,arg3,arg4);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBValue(static_cast< const lldb::SBValue& >(result))), SWIGTYPE_p_lldb__SBValue, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_CreateValueFromData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  char *arg2 = (char *) 0 ;
  lldb::SBData arg3 ;
  lldb::SBType arg4 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  void *argp3 ;
  int res3 = 0 ;
  void *argp4 ;
  int res4 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  lldb::SBValue result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOO:SBTarget_CreateValueFromData",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_CreateValueFromData" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_CreateValueFromData" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBData,  0  | 0);
    if (!SWIG_IsOK(res3)) {
      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBTarget_CreateValueFromData" "', argument " "3"" of type '" "lldb::SBData""'"); 
    }  
    if (!argp3) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_CreateValueFromData" "', argument " "3"" of type '" "lldb::SBData""'");
    } else {
      lldb::SBData * temp = reinterpret_cast< lldb::SBData * >(argp3);
      arg3 = *temp;
      if (SWIG_IsNewObj(res3)) delete temp;
    }
  }
  {
    res4 = SWIG_ConvertPtr(obj3, &argp4, SWIGTYPE_p_lldb__SBType,  0  | 0);
    if (!SWIG_IsOK(res4)) {
      SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "SBTarget_CreateValueFromData" "', argument " "4"" of type '" "lldb::SBType""'"); 
    }  
    if (!argp4) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_CreateValueFromData" "', argument " "4"" of type '" "lldb::SBType""'");
    } else {
      lldb::SBType * temp = reinterpret_cast< lldb::SBType * >(argp4);
      arg4 = *temp;
      if (SWIG_IsNewObj(res4)) delete temp;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->CreateValueFromData((char const *)arg2,arg3,arg4);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBValue(static_cast< const lldb::SBValue& >(result))), SWIGTYPE_p_lldb__SBValue, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_CreateValueFromExpression(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  char *arg2 = (char *) 0 ;
  char *arg3 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  int res3 ;
  char *buf3 = 0 ;
  int alloc3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBValue result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBTarget_CreateValueFromExpression",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_CreateValueFromExpression" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_CreateValueFromExpression" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3);
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBTarget_CreateValueFromExpression" "', argument " "3"" of type '" "char const *""'");
  }
  arg3 = reinterpret_cast< char * >(buf3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->CreateValueFromExpression((char const *)arg2,(char const *)arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBValue(static_cast< const lldb::SBValue& >(result))), SWIGTYPE_p_lldb__SBValue, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_ReadInstructions__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  lldb::SBAddress arg2 ;
  uint32_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  unsigned int val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBInstructionList result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBTarget_ReadInstructions",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_ReadInstructions" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBAddress,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_ReadInstructions" "', argument " "2"" of type '" "lldb::SBAddress""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_ReadInstructions" "', argument " "2"" of type '" "lldb::SBAddress""'");
    } else {
      lldb::SBAddress * temp = reinterpret_cast< lldb::SBAddress * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  ecode3 = SWIG_AsVal_unsigned_SS_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBTarget_ReadInstructions" "', argument " "3"" of type '" "uint32_t""'");
  } 
  arg3 = static_cast< uint32_t >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->ReadInstructions(arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBInstructionList(static_cast< const lldb::SBInstructionList& >(result))), SWIGTYPE_p_lldb__SBInstructionList, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_ReadInstructions__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  lldb::SBAddress arg2 ;
  uint32_t arg3 ;
  char *arg4 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  unsigned int val3 ;
  int ecode3 = 0 ;
  int res4 ;
  char *buf4 = 0 ;
  int alloc4 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  lldb::SBInstructionList result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOO:SBTarget_ReadInstructions",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_ReadInstructions" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBAddress,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_ReadInstructions" "', argument " "2"" of type '" "lldb::SBAddress""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_ReadInstructions" "', argument " "2"" of type '" "lldb::SBAddress""'");
    } else {
      lldb::SBAddress * temp = reinterpret_cast< lldb::SBAddress * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  ecode3 = SWIG_AsVal_unsigned_SS_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBTarget_ReadInstructions" "', argument " "3"" of type '" "uint32_t""'");
  } 
  arg3 = static_cast< uint32_t >(val3);
  res4 = SWIG_AsCharPtrAndSize(obj3, &buf4, NULL, &alloc4);
  if (!SWIG_IsOK(res4)) {
    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "SBTarget_ReadInstructions" "', argument " "4"" of type '" "char const *""'");
  }
  arg4 = reinterpret_cast< char * >(buf4);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->ReadInstructions(arg2,arg3,(char const *)arg4);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBInstructionList(static_cast< const lldb::SBInstructionList& >(result))), SWIGTYPE_p_lldb__SBInstructionList, SWIG_POINTER_OWN |  0 );
  if (alloc4 == SWIG_NEWOBJ) delete[] buf4;
  return resultobj;
fail:
  if (alloc4 == SWIG_NEWOBJ) delete[] buf4;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_ReadInstructions(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[5];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 4); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 3) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBTarget, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_lldb__SBAddress, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        {
          int res = SWIG_AsVal_unsigned_SS_int(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          return _wrap_SBTarget_ReadInstructions__SWIG_0(self, args);
        }
      }
    }
  }
  if (argc == 4) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBTarget, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_lldb__SBAddress, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        {
          int res = SWIG_AsVal_unsigned_SS_int(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          int res = SWIG_AsCharPtrAndSize(argv[3], 0, NULL, 0);
          _v = SWIG_CheckState(res);
          if (_v) {
            return _wrap_SBTarget_ReadInstructions__SWIG_1(self, args);
          }
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBTarget_ReadInstructions'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    ReadInstructions(lldb::SBTarget *,lldb::SBAddress,uint32_t)\n"
    "    ReadInstructions(lldb::SBTarget *,lldb::SBAddress,uint32_t,char const *)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_GetInstructions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  lldb::SBAddress arg2 ;
  void *arg3 = (void *) 0 ;
  size_t arg4 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBInstructionList result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBTarget_GetInstructions",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_GetInstructions" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBAddress,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_GetInstructions" "', argument " "2"" of type '" "lldb::SBAddress""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_GetInstructions" "', argument " "2"" of type '" "lldb::SBAddress""'");
    } else {
      lldb::SBAddress * temp = reinterpret_cast< lldb::SBAddress * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  {
    using namespace lldb_private;
    if (PythonString::Check(obj2)) {
      PythonString str(PyRefType::Borrowed, obj2);
      arg3 = (void*)str.GetString().data();
      arg4 = str.GetSize();
    }
    else if(PythonByteArray::Check(obj2)) {
      PythonByteArray bytearray(PyRefType::Borrowed, obj2);
      arg3 = (void*)bytearray.GetBytes().data();
      arg4 = bytearray.GetSize();
    }
    else if (PythonBytes::Check(obj2)) {
      PythonBytes bytes(PyRefType::Borrowed, obj2);
      arg3 = (void*)bytes.GetBytes().data();
      arg4 = bytes.GetSize();
    }
    else {
      PyErr_SetString(PyExc_ValueError, "Expecting a buffer");
      return NULL;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetInstructions(arg2,(void const *)arg3,arg4);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBInstructionList(static_cast< const lldb::SBInstructionList& >(result))), SWIGTYPE_p_lldb__SBInstructionList, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_GetInstructionsWithFlavor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  lldb::SBAddress arg2 ;
  char *arg3 = (char *) 0 ;
  void *arg4 = (void *) 0 ;
  size_t arg5 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  int res3 ;
  char *buf3 = 0 ;
  int alloc3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  lldb::SBInstructionList result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOO:SBTarget_GetInstructionsWithFlavor",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_GetInstructionsWithFlavor" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBAddress,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_GetInstructionsWithFlavor" "', argument " "2"" of type '" "lldb::SBAddress""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_GetInstructionsWithFlavor" "', argument " "2"" of type '" "lldb::SBAddress""'");
    } else {
      lldb::SBAddress * temp = reinterpret_cast< lldb::SBAddress * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3);
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBTarget_GetInstructionsWithFlavor" "', argument " "3"" of type '" "char const *""'");
  }
  arg3 = reinterpret_cast< char * >(buf3);
  {
    using namespace lldb_private;
    if (PythonString::Check(obj3)) {
      PythonString str(PyRefType::Borrowed, obj3);
      arg4 = (void*)str.GetString().data();
      arg5 = str.GetSize();
    }
    else if(PythonByteArray::Check(obj3)) {
      PythonByteArray bytearray(PyRefType::Borrowed, obj3);
      arg4 = (void*)bytearray.GetBytes().data();
      arg5 = bytearray.GetSize();
    }
    else if (PythonBytes::Check(obj3)) {
      PythonBytes bytes(PyRefType::Borrowed, obj3);
      arg4 = (void*)bytes.GetBytes().data();
      arg5 = bytes.GetSize();
    }
    else {
      PyErr_SetString(PyExc_ValueError, "Expecting a buffer");
      return NULL;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetInstructionsWithFlavor(arg2,(char const *)arg3,(void const *)arg4,arg5);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBInstructionList(static_cast< const lldb::SBInstructionList& >(result))), SWIGTYPE_p_lldb__SBInstructionList, SWIG_POINTER_OWN |  0 );
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  return resultobj;
fail:
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_FindSymbols__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  char *arg2 = (char *) 0 ;
  lldb::SymbolType arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  int val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBSymbolContextList result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBTarget_FindSymbols",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_FindSymbols" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_FindSymbols" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  ecode3 = SWIG_AsVal_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBTarget_FindSymbols" "', argument " "3"" of type '" "lldb::SymbolType""'");
  } 
  arg3 = static_cast< lldb::SymbolType >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->FindSymbols((char const *)arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBSymbolContextList(static_cast< const lldb::SBSymbolContextList& >(result))), SWIGTYPE_p_lldb__SBSymbolContextList, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_FindSymbols__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBSymbolContextList result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTarget_FindSymbols",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_FindSymbols" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_FindSymbols" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->FindSymbols((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBSymbolContextList(static_cast< const lldb::SBSymbolContextList& >(result))), SWIGTYPE_p_lldb__SBSymbolContextList, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_FindSymbols(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[4];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 3); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBTarget, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        return _wrap_SBTarget_FindSymbols__SWIG_1(self, args);
      }
    }
  }
  if (argc == 3) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBTarget, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        {
          int res = SWIG_AsVal_int(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          return _wrap_SBTarget_FindSymbols__SWIG_0(self, args);
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBTarget_FindSymbols'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    FindSymbols(lldb::SBTarget *,char const *,lldb::SymbolType)\n"
    "    FindSymbols(lldb::SBTarget *,char const *)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_GetDescription(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  lldb::DescriptionLevel arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  int val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBTarget_GetDescription",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_GetDescription" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  ecode3 = SWIG_AsVal_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBTarget_GetDescription" "', argument " "3"" of type '" "lldb::DescriptionLevel""'");
  } 
  arg3 = static_cast< lldb::DescriptionLevel >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetDescription(*arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_GetStackRedZoneSize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::addr_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTarget_GetStackRedZoneSize",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_GetStackRedZoneSize" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::addr_t)(arg1)->GetStackRedZoneSize();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_GetLaunchInfo(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  SwigValueWrapper< lldb::SBLaunchInfo > result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTarget_GetLaunchInfo",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_GetLaunchInfo" "', argument " "1"" of type '" "lldb::SBTarget const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBTarget const *)arg1)->GetLaunchInfo();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBLaunchInfo(static_cast< const lldb::SBLaunchInfo& >(result))), SWIGTYPE_p_lldb__SBLaunchInfo, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_SetLaunchInfo(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  lldb::SBLaunchInfo *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTarget_SetLaunchInfo",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_SetLaunchInfo" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBLaunchInfo,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_SetLaunchInfo" "', argument " "2"" of type '" "lldb::SBLaunchInfo const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_SetLaunchInfo" "', argument " "2"" of type '" "lldb::SBLaunchInfo const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBLaunchInfo * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetLaunchInfo((lldb::SBLaunchInfo const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget___eq__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  lldb::SBTarget *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTarget___eq__",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget___eq__" "', argument " "1"" of type '" "lldb::SBTarget const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTarget,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget___eq__" "', argument " "2"" of type '" "lldb::SBTarget const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget___eq__" "', argument " "2"" of type '" "lldb::SBTarget const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBTarget * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBTarget const *)arg1)->operator ==((lldb::SBTarget const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget___ne__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  lldb::SBTarget *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTarget___ne__",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget___ne__" "', argument " "1"" of type '" "lldb::SBTarget const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTarget,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget___ne__" "', argument " "2"" of type '" "lldb::SBTarget const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget___ne__" "', argument " "2"" of type '" "lldb::SBTarget const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBTarget * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBTarget const *)arg1)->operator !=((lldb::SBTarget const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_EvaluateExpression__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBValue result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTarget_EvaluateExpression",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_EvaluateExpression" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_EvaluateExpression" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->EvaluateExpression((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBValue(static_cast< const lldb::SBValue& >(result))), SWIGTYPE_p_lldb__SBValue, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_EvaluateExpression__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  char *arg2 = (char *) 0 ;
  lldb::SBExpressionOptions *arg3 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  void *argp3 = 0 ;
  int res3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBValue result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBTarget_EvaluateExpression",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget_EvaluateExpression" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTarget_EvaluateExpression" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBExpressionOptions,  0  | 0);
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBTarget_EvaluateExpression" "', argument " "3"" of type '" "lldb::SBExpressionOptions const &""'"); 
  }
  if (!argp3) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTarget_EvaluateExpression" "', argument " "3"" of type '" "lldb::SBExpressionOptions const &""'"); 
  }
  arg3 = reinterpret_cast< lldb::SBExpressionOptions * >(argp3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->EvaluateExpression((char const *)arg2,(lldb::SBExpressionOptions const &)*arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBValue(static_cast< const lldb::SBValue& >(result))), SWIGTYPE_p_lldb__SBValue, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget_EvaluateExpression(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[4];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 3); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBTarget, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        return _wrap_SBTarget_EvaluateExpression__SWIG_0(self, args);
      }
    }
  }
  if (argc == 3) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBTarget, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_lldb__SBExpressionOptions, 0);
        _v = SWIG_CheckState(res);
        if (_v) {
          return _wrap_SBTarget_EvaluateExpression__SWIG_1(self, args);
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBTarget_EvaluateExpression'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    EvaluateExpression(lldb::SBTarget *,char const *)\n"
    "    EvaluateExpression(lldb::SBTarget *,char const *,lldb::SBExpressionOptions const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTarget___str__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTarget *arg1 = (lldb::SBTarget *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTarget___str__",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTarget, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTarget___str__" "', argument " "1"" of type '" "lldb::SBTarget *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTarget * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (PyObject *)lldb_SBTarget___str__(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = result;
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBTarget_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBTarget, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBThread__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBThread")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBThread *)new lldb::SBThread();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBThread, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBThread__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBThread *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBThread",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBThread,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBThread" "', argument " "1"" of type '" "lldb::SBThread const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBThread" "', argument " "1"" of type '" "lldb::SBThread const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBThread *)new lldb::SBThread((lldb::SBThread const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBThread, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBThread(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBThread__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBThread, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBThread__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBThread'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBThread()\n"
    "    lldb::SBThread(lldb::SBThread const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBThread(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBThread",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBThread" "', argument " "1"" of type '" "lldb::SBThread *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_GetBroadcasterClassName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":SBThread_GetBroadcasterClassName")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)lldb::SBThread::GetBroadcasterClassName();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_EventIsThreadEvent(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBEvent *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBThread_EventIsThreadEvent",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBEvent,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_EventIsThreadEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBThread_EventIsThreadEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBEvent * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)lldb::SBThread::EventIsThreadEvent((lldb::SBEvent const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_GetStackFrameFromEvent(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBEvent *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBFrame result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBThread_GetStackFrameFromEvent",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBEvent,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_GetStackFrameFromEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBThread_GetStackFrameFromEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBEvent * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = lldb::SBThread::GetStackFrameFromEvent((lldb::SBEvent const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBFrame(static_cast< const lldb::SBFrame& >(result))), SWIGTYPE_p_lldb__SBFrame, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_GetThreadFromEvent(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBEvent *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBThread result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBThread_GetThreadFromEvent",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBEvent,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_GetThreadFromEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBThread_GetThreadFromEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBEvent * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = lldb::SBThread::GetThreadFromEvent((lldb::SBEvent const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBThread(static_cast< const lldb::SBThread& >(result))), SWIGTYPE_p_lldb__SBThread, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBThread_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_IsValid" "', argument " "1"" of type '" "lldb::SBThread const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBThread const *)arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_Clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBThread_Clear",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_Clear" "', argument " "1"" of type '" "lldb::SBThread *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->Clear();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_GetStopReason(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::StopReason result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBThread_GetStopReason",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_GetStopReason" "', argument " "1"" of type '" "lldb::SBThread *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::StopReason)(arg1)->GetStopReason();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_GetStopReasonDataCount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  size_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBThread_GetStopReasonDataCount",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_GetStopReasonDataCount" "', argument " "1"" of type '" "lldb::SBThread *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetStopReasonDataCount();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_GetStopReasonDataAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  uint64_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBThread_GetStopReasonDataAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_GetStopReasonDataAtIndex" "', argument " "1"" of type '" "lldb::SBThread *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBThread_GetStopReasonDataAtIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint64_t)(arg1)->GetStopReasonDataAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_GetStopReasonExtendedInfoAsJSON(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBThread_GetStopReasonExtendedInfoAsJSON",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_GetStopReasonExtendedInfoAsJSON" "', argument " "1"" of type '" "lldb::SBThread *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBThread_GetStopReasonExtendedInfoAsJSON" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBThread_GetStopReasonExtendedInfoAsJSON" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetStopReasonExtendedInfoAsJSON(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_GetStopReasonExtendedBacktraces(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  lldb::InstrumentationRuntimeType arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBThreadCollection result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBThread_GetStopReasonExtendedBacktraces",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_GetStopReasonExtendedBacktraces" "', argument " "1"" of type '" "lldb::SBThread *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  ecode2 = SWIG_AsVal_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBThread_GetStopReasonExtendedBacktraces" "', argument " "2"" of type '" "lldb::InstrumentationRuntimeType""'");
  } 
  arg2 = static_cast< lldb::InstrumentationRuntimeType >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetStopReasonExtendedBacktraces(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBThreadCollection(static_cast< const lldb::SBThreadCollection& >(result))), SWIGTYPE_p_lldb__SBThreadCollection, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_GetStopDescription(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  char *arg2 = (char *) 0 ;
  size_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  size_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBThread_GetStopDescription",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_GetStopDescription" "', argument " "1"" of type '" "lldb::SBThread *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  {
    if (!PyInt_Check(obj1)) {
      PyErr_SetString(PyExc_ValueError, "Expecting an integer");
      return NULL;
    }
    arg3 = PyInt_AsLong(obj1);
    if (arg3 <= 0) {
      PyErr_SetString(PyExc_ValueError, "Positive integer expected");
      return NULL;
    }
    arg2 = (char *) malloc(arg3);
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetStopDescription(arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
  {
    Py_XDECREF(resultobj);   /* Blow away any previous result */
    if (result == 0) {
      lldb_private::PythonString string("");
      resultobj = string.release();
      Py_INCREF(resultobj);
    } else {
      llvm::StringRef ref(static_cast<const char*>(arg2), result);
      lldb_private::PythonString string(ref);
      resultobj = string.release();
    }
    free(arg2);
  }
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_GetStopReturnValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBValue result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBThread_GetStopReturnValue",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_GetStopReturnValue" "', argument " "1"" of type '" "lldb::SBThread *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetStopReturnValue();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBValue(static_cast< const lldb::SBValue& >(result))), SWIGTYPE_p_lldb__SBValue, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_GetStopErrorValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBValue result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBThread_GetStopErrorValue",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_GetStopErrorValue" "', argument " "1"" of type '" "lldb::SBThread *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetStopErrorValue();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBValue(static_cast< const lldb::SBValue& >(result))), SWIGTYPE_p_lldb__SBValue, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_GetThreadID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::tid_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBThread_GetThreadID",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_GetThreadID" "', argument " "1"" of type '" "lldb::SBThread const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::tid_t)((lldb::SBThread const *)arg1)->GetThreadID();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_GetIndexID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBThread_GetIndexID",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_GetIndexID" "', argument " "1"" of type '" "lldb::SBThread const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)((lldb::SBThread const *)arg1)->GetIndexID();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_GetName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBThread_GetName",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_GetName" "', argument " "1"" of type '" "lldb::SBThread const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)((lldb::SBThread const *)arg1)->GetName();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_GetQueueName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBThread_GetQueueName",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_GetQueueName" "', argument " "1"" of type '" "lldb::SBThread const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)((lldb::SBThread const *)arg1)->GetQueueName();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_GetQueueID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::queue_id_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBThread_GetQueueID",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_GetQueueID" "', argument " "1"" of type '" "lldb::SBThread const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::queue_id_t)((lldb::SBThread const *)arg1)->GetQueueID();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_GetInfoItemByPathAsString(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  char *arg2 = (char *) 0 ;
  lldb::SBStream *arg3 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  void *argp3 = 0 ;
  int res3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBThread_GetInfoItemByPathAsString",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_GetInfoItemByPathAsString" "', argument " "1"" of type '" "lldb::SBThread *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBThread_GetInfoItemByPathAsString" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBThread_GetInfoItemByPathAsString" "', argument " "3"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp3) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBThread_GetInfoItemByPathAsString" "', argument " "3"" of type '" "lldb::SBStream &""'"); 
  }
  arg3 = reinterpret_cast< lldb::SBStream * >(argp3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetInfoItemByPathAsString((char const *)arg2,*arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_GetQueue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBQueue result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBThread_GetQueue",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_GetQueue" "', argument " "1"" of type '" "lldb::SBThread const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBThread const *)arg1)->GetQueue();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBQueue(static_cast< const lldb::SBQueue& >(result))), SWIGTYPE_p_lldb__SBQueue, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_StepOver__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  lldb::RunMode arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBThread_StepOver",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_StepOver" "', argument " "1"" of type '" "lldb::SBThread *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  ecode2 = SWIG_AsVal_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBThread_StepOver" "', argument " "2"" of type '" "lldb::RunMode""'");
  } 
  arg2 = static_cast< lldb::RunMode >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->StepOver(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_StepOver__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBThread_StepOver",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_StepOver" "', argument " "1"" of type '" "lldb::SBThread *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->StepOver();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_StepOver(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[3];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 2); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 1) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBThread, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_SBThread_StepOver__SWIG_1(self, args);
    }
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBThread, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_int(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        return _wrap_SBThread_StepOver__SWIG_0(self, args);
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBThread_StepOver'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    StepOver(lldb::SBThread *,lldb::RunMode)\n"
    "    StepOver(lldb::SBThread *)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_StepInto__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  lldb::RunMode arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBThread_StepInto",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_StepInto" "', argument " "1"" of type '" "lldb::SBThread *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  ecode2 = SWIG_AsVal_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBThread_StepInto" "', argument " "2"" of type '" "lldb::RunMode""'");
  } 
  arg2 = static_cast< lldb::RunMode >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->StepInto(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_StepInto__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBThread_StepInto",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_StepInto" "', argument " "1"" of type '" "lldb::SBThread *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->StepInto();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_StepInto__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  char *arg2 = (char *) 0 ;
  lldb::RunMode arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  int val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBThread_StepInto",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_StepInto" "', argument " "1"" of type '" "lldb::SBThread *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBThread_StepInto" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  ecode3 = SWIG_AsVal_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBThread_StepInto" "', argument " "3"" of type '" "lldb::RunMode""'");
  } 
  arg3 = static_cast< lldb::RunMode >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->StepInto((char const *)arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_StepInto__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBThread_StepInto",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_StepInto" "', argument " "1"" of type '" "lldb::SBThread *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBThread_StepInto" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->StepInto((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_StepInto__SWIG_4(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  char *arg2 = (char *) 0 ;
  uint32_t arg3 ;
  lldb::SBError *arg4 = 0 ;
  lldb::RunMode arg5 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  unsigned int val3 ;
  int ecode3 = 0 ;
  void *argp4 = 0 ;
  int res4 = 0 ;
  int val5 ;
  int ecode5 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  PyObject * obj4 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOOO:SBThread_StepInto",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_StepInto" "', argument " "1"" of type '" "lldb::SBThread *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBThread_StepInto" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  ecode3 = SWIG_AsVal_unsigned_SS_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBThread_StepInto" "', argument " "3"" of type '" "uint32_t""'");
  } 
  arg3 = static_cast< uint32_t >(val3);
  res4 = SWIG_ConvertPtr(obj3, &argp4, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res4)) {
    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "SBThread_StepInto" "', argument " "4"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp4) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBThread_StepInto" "', argument " "4"" of type '" "lldb::SBError &""'"); 
  }
  arg4 = reinterpret_cast< lldb::SBError * >(argp4);
  ecode5 = SWIG_AsVal_int(obj4, &val5);
  if (!SWIG_IsOK(ecode5)) {
    SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "SBThread_StepInto" "', argument " "5"" of type '" "lldb::RunMode""'");
  } 
  arg5 = static_cast< lldb::RunMode >(val5);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->StepInto((char const *)arg2,arg3,*arg4,arg5);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_StepInto__SWIG_5(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  char *arg2 = (char *) 0 ;
  uint32_t arg3 ;
  lldb::SBError *arg4 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  unsigned int val3 ;
  int ecode3 = 0 ;
  void *argp4 = 0 ;
  int res4 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOO:SBThread_StepInto",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_StepInto" "', argument " "1"" of type '" "lldb::SBThread *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBThread_StepInto" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  ecode3 = SWIG_AsVal_unsigned_SS_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBThread_StepInto" "', argument " "3"" of type '" "uint32_t""'");
  } 
  arg3 = static_cast< uint32_t >(val3);
  res4 = SWIG_ConvertPtr(obj3, &argp4, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res4)) {
    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "SBThread_StepInto" "', argument " "4"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp4) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBThread_StepInto" "', argument " "4"" of type '" "lldb::SBError &""'"); 
  }
  arg4 = reinterpret_cast< lldb::SBError * >(argp4);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->StepInto((char const *)arg2,arg3,*arg4);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_StepInto(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[6];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 5); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 1) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBThread, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_SBThread_StepInto__SWIG_1(self, args);
    }
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBThread, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_int(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        return _wrap_SBThread_StepInto__SWIG_0(self, args);
      }
    }
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBThread, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        return _wrap_SBThread_StepInto__SWIG_3(self, args);
      }
    }
  }
  if (argc == 3) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBThread, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        {
          int res = SWIG_AsVal_int(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          return _wrap_SBThread_StepInto__SWIG_2(self, args);
        }
      }
    }
  }
  if (argc == 4) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBThread, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        {
          int res = SWIG_AsVal_unsigned_SS_int(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          void *vptr = 0;
          int res = SWIG_ConvertPtr(argv[3], &vptr, SWIGTYPE_p_lldb__SBError, 0);
          _v = SWIG_CheckState(res);
          if (_v) {
            return _wrap_SBThread_StepInto__SWIG_5(self, args);
          }
        }
      }
    }
  }
  if (argc == 5) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBThread, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        {
          int res = SWIG_AsVal_unsigned_SS_int(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          void *vptr = 0;
          int res = SWIG_ConvertPtr(argv[3], &vptr, SWIGTYPE_p_lldb__SBError, 0);
          _v = SWIG_CheckState(res);
          if (_v) {
            {
              int res = SWIG_AsVal_int(argv[4], NULL);
              _v = SWIG_CheckState(res);
            }
            if (_v) {
              return _wrap_SBThread_StepInto__SWIG_4(self, args);
            }
          }
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBThread_StepInto'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    StepInto(lldb::SBThread *,lldb::RunMode)\n"
    "    StepInto(lldb::SBThread *)\n"
    "    StepInto(lldb::SBThread *,char const *,lldb::RunMode)\n"
    "    StepInto(lldb::SBThread *,char const *)\n"
    "    StepInto(lldb::SBThread *,char const *,uint32_t,lldb::SBError &,lldb::RunMode)\n"
    "    StepInto(lldb::SBThread *,char const *,uint32_t,lldb::SBError &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_StepOut(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBThread_StepOut",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_StepOut" "', argument " "1"" of type '" "lldb::SBThread *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->StepOut();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_StepOutOfFrame(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  lldb::SBFrame *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBThread_StepOutOfFrame",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_StepOutOfFrame" "', argument " "1"" of type '" "lldb::SBThread *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBFrame,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBThread_StepOutOfFrame" "', argument " "2"" of type '" "lldb::SBFrame &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBThread_StepOutOfFrame" "', argument " "2"" of type '" "lldb::SBFrame &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBFrame * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->StepOutOfFrame(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_StepInstruction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBThread_StepInstruction",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_StepInstruction" "', argument " "1"" of type '" "lldb::SBThread *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBThread_StepInstruction" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->StepInstruction(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_StepOverUntil(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  lldb::SBFrame *arg2 = 0 ;
  lldb::SBFileSpec *arg3 = 0 ;
  uint32_t arg4 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  void *argp3 = 0 ;
  int res3 = 0 ;
  unsigned int val4 ;
  int ecode4 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  lldb::SBError result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOO:SBThread_StepOverUntil",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_StepOverUntil" "', argument " "1"" of type '" "lldb::SBThread *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBFrame,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBThread_StepOverUntil" "', argument " "2"" of type '" "lldb::SBFrame &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBThread_StepOverUntil" "', argument " "2"" of type '" "lldb::SBFrame &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBFrame * >(argp2);
  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBFileSpec,  0 );
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBThread_StepOverUntil" "', argument " "3"" of type '" "lldb::SBFileSpec &""'"); 
  }
  if (!argp3) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBThread_StepOverUntil" "', argument " "3"" of type '" "lldb::SBFileSpec &""'"); 
  }
  arg3 = reinterpret_cast< lldb::SBFileSpec * >(argp3);
  ecode4 = SWIG_AsVal_unsigned_SS_int(obj3, &val4);
  if (!SWIG_IsOK(ecode4)) {
    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "SBThread_StepOverUntil" "', argument " "4"" of type '" "uint32_t""'");
  } 
  arg4 = static_cast< uint32_t >(val4);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->StepOverUntil(*arg2,*arg3,arg4);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBError(static_cast< const lldb::SBError& >(result))), SWIGTYPE_p_lldb__SBError, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_StepUsingScriptedThreadPlan__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBError result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBThread_StepUsingScriptedThreadPlan",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_StepUsingScriptedThreadPlan" "', argument " "1"" of type '" "lldb::SBThread *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBThread_StepUsingScriptedThreadPlan" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->StepUsingScriptedThreadPlan((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBError(static_cast< const lldb::SBError& >(result))), SWIGTYPE_p_lldb__SBError, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_StepUsingScriptedThreadPlan__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  char *arg2 = (char *) 0 ;
  bool arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  bool val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBError result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBThread_StepUsingScriptedThreadPlan",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_StepUsingScriptedThreadPlan" "', argument " "1"" of type '" "lldb::SBThread *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBThread_StepUsingScriptedThreadPlan" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  ecode3 = SWIG_AsVal_bool(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBThread_StepUsingScriptedThreadPlan" "', argument " "3"" of type '" "bool""'");
  } 
  arg3 = static_cast< bool >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->StepUsingScriptedThreadPlan((char const *)arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBError(static_cast< const lldb::SBError& >(result))), SWIGTYPE_p_lldb__SBError, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_StepUsingScriptedThreadPlan(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[4];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 3); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBThread, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        return _wrap_SBThread_StepUsingScriptedThreadPlan__SWIG_0(self, args);
      }
    }
  }
  if (argc == 3) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBThread, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        {
          int res = SWIG_AsVal_bool(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          return _wrap_SBThread_StepUsingScriptedThreadPlan__SWIG_1(self, args);
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBThread_StepUsingScriptedThreadPlan'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    StepUsingScriptedThreadPlan(lldb::SBThread *,char const *)\n"
    "    StepUsingScriptedThreadPlan(lldb::SBThread *,char const *,bool)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_JumpToLine(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  lldb::SBFileSpec *arg2 = 0 ;
  uint32_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  unsigned int val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBError result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBThread_JumpToLine",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_JumpToLine" "', argument " "1"" of type '" "lldb::SBThread *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBFileSpec,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBThread_JumpToLine" "', argument " "2"" of type '" "lldb::SBFileSpec &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBThread_JumpToLine" "', argument " "2"" of type '" "lldb::SBFileSpec &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBFileSpec * >(argp2);
  ecode3 = SWIG_AsVal_unsigned_SS_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBThread_JumpToLine" "', argument " "3"" of type '" "uint32_t""'");
  } 
  arg3 = static_cast< uint32_t >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->JumpToLine(*arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBError(static_cast< const lldb::SBError& >(result))), SWIGTYPE_p_lldb__SBError, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_RunToAddress(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  lldb::addr_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned long long val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBThread_RunToAddress",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_RunToAddress" "', argument " "1"" of type '" "lldb::SBThread *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_long_SS_long(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBThread_RunToAddress" "', argument " "2"" of type '" "lldb::addr_t""'");
  } 
  arg2 = static_cast< lldb::addr_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->RunToAddress(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_ReturnFromFrame(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  lldb::SBFrame *arg2 = 0 ;
  lldb::SBValue *arg3 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  void *argp3 = 0 ;
  int res3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBError result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBThread_ReturnFromFrame",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_ReturnFromFrame" "', argument " "1"" of type '" "lldb::SBThread *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBFrame,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBThread_ReturnFromFrame" "', argument " "2"" of type '" "lldb::SBFrame &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBThread_ReturnFromFrame" "', argument " "2"" of type '" "lldb::SBFrame &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBFrame * >(argp2);
  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBValue,  0 );
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBThread_ReturnFromFrame" "', argument " "3"" of type '" "lldb::SBValue &""'"); 
  }
  if (!argp3) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBThread_ReturnFromFrame" "', argument " "3"" of type '" "lldb::SBValue &""'"); 
  }
  arg3 = reinterpret_cast< lldb::SBValue * >(argp3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->ReturnFromFrame(*arg2,*arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBError(static_cast< const lldb::SBError& >(result))), SWIGTYPE_p_lldb__SBError, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_UnwindInnermostExpression(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBError result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBThread_UnwindInnermostExpression",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_UnwindInnermostExpression" "', argument " "1"" of type '" "lldb::SBThread *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->UnwindInnermostExpression();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBError(static_cast< const lldb::SBError& >(result))), SWIGTYPE_p_lldb__SBError, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_Suspend(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBThread_Suspend",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_Suspend" "', argument " "1"" of type '" "lldb::SBThread *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->Suspend();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_Resume(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBThread_Resume",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_Resume" "', argument " "1"" of type '" "lldb::SBThread *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->Resume();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_IsSuspended(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBThread_IsSuspended",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_IsSuspended" "', argument " "1"" of type '" "lldb::SBThread *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsSuspended();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_IsStopped(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBThread_IsStopped",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_IsStopped" "', argument " "1"" of type '" "lldb::SBThread *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsStopped();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_GetNumFrames(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBThread_GetNumFrames",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_GetNumFrames" "', argument " "1"" of type '" "lldb::SBThread *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetNumFrames();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_GetFrameAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBFrame result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBThread_GetFrameAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_GetFrameAtIndex" "', argument " "1"" of type '" "lldb::SBThread *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBThread_GetFrameAtIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetFrameAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBFrame(static_cast< const lldb::SBFrame& >(result))), SWIGTYPE_p_lldb__SBFrame, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_GetSelectedFrame(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBFrame result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBThread_GetSelectedFrame",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_GetSelectedFrame" "', argument " "1"" of type '" "lldb::SBThread *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetSelectedFrame();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBFrame(static_cast< const lldb::SBFrame& >(result))), SWIGTYPE_p_lldb__SBFrame, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_SetSelectedFrame(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBFrame result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBThread_SetSelectedFrame",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_SetSelectedFrame" "', argument " "1"" of type '" "lldb::SBThread *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBThread_SetSelectedFrame" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->SetSelectedFrame(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBFrame(static_cast< const lldb::SBFrame& >(result))), SWIGTYPE_p_lldb__SBFrame, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_GetProcess(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBProcess result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBThread_GetProcess",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_GetProcess" "', argument " "1"" of type '" "lldb::SBThread *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetProcess();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBProcess(static_cast< const lldb::SBProcess& >(result))), SWIGTYPE_p_lldb__SBProcess, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_GetDescription__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBThread_GetDescription",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_GetDescription" "', argument " "1"" of type '" "lldb::SBThread const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBThread_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBThread_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBThread const *)arg1)->GetDescription(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_GetDescription__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  bool arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  bool val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBThread_GetDescription",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_GetDescription" "', argument " "1"" of type '" "lldb::SBThread const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBThread_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBThread_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  ecode3 = SWIG_AsVal_bool(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBThread_GetDescription" "', argument " "3"" of type '" "bool""'");
  } 
  arg3 = static_cast< bool >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBThread const *)arg1)->GetDescription(*arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_GetDescription(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[4];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 3); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBThread, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      void *vptr = 0;
      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_lldb__SBStream, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        return _wrap_SBThread_GetDescription__SWIG_0(self, args);
      }
    }
  }
  if (argc == 3) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBThread, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      void *vptr = 0;
      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_lldb__SBStream, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        {
          int res = SWIG_AsVal_bool(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          return _wrap_SBThread_GetDescription__SWIG_1(self, args);
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBThread_GetDescription'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    GetDescription(lldb::SBThread const *,lldb::SBStream &)\n"
    "    GetDescription(lldb::SBThread const *,lldb::SBStream &,bool)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_GetStatus(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBThread_GetStatus",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_GetStatus" "', argument " "1"" of type '" "lldb::SBThread const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBThread_GetStatus" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBThread_GetStatus" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBThread const *)arg1)->GetStatus(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread___eq__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  lldb::SBThread *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBThread___eq__",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread___eq__" "', argument " "1"" of type '" "lldb::SBThread const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBThread,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBThread___eq__" "', argument " "2"" of type '" "lldb::SBThread const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBThread___eq__" "', argument " "2"" of type '" "lldb::SBThread const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBThread * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBThread const *)arg1)->operator ==((lldb::SBThread const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread___ne__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  lldb::SBThread *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBThread___ne__",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread___ne__" "', argument " "1"" of type '" "lldb::SBThread const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBThread,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBThread___ne__" "', argument " "2"" of type '" "lldb::SBThread const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBThread___ne__" "', argument " "2"" of type '" "lldb::SBThread const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBThread * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBThread const *)arg1)->operator !=((lldb::SBThread const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_GetExtendedBacktraceThread(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBThread result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBThread_GetExtendedBacktraceThread",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_GetExtendedBacktraceThread" "', argument " "1"" of type '" "lldb::SBThread *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBThread_GetExtendedBacktraceThread" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetExtendedBacktraceThread((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBThread(static_cast< const lldb::SBThread& >(result))), SWIGTYPE_p_lldb__SBThread, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_GetExtendedBacktraceOriginatingIndexID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBThread_GetExtendedBacktraceOriginatingIndexID",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_GetExtendedBacktraceOriginatingIndexID" "', argument " "1"" of type '" "lldb::SBThread *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetExtendedBacktraceOriginatingIndexID();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread_SafeToCallFunctions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBThread_SafeToCallFunctions",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread_SafeToCallFunctions" "', argument " "1"" of type '" "lldb::SBThread *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->SafeToCallFunctions();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThread___str__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = (lldb::SBThread *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBThread___str__",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThread, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThread___str__" "', argument " "1"" of type '" "lldb::SBThread *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (PyObject *)lldb_SBThread___str__(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = result;
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBThread_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBThread, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBThreadCollection__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThreadCollection *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBThreadCollection")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBThreadCollection *)new lldb::SBThreadCollection();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBThreadCollection, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBThreadCollection__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThreadCollection *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBThreadCollection *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBThreadCollection",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBThreadCollection,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBThreadCollection" "', argument " "1"" of type '" "lldb::SBThreadCollection const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBThreadCollection" "', argument " "1"" of type '" "lldb::SBThreadCollection const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThreadCollection * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBThreadCollection *)new lldb::SBThreadCollection((lldb::SBThreadCollection const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBThreadCollection, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBThreadCollection(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBThreadCollection__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBThreadCollection, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBThreadCollection__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBThreadCollection'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBThreadCollection()\n"
    "    lldb::SBThreadCollection(lldb::SBThreadCollection const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBThreadCollection(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThreadCollection *arg1 = (lldb::SBThreadCollection *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBThreadCollection",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThreadCollection, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBThreadCollection" "', argument " "1"" of type '" "lldb::SBThreadCollection *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThreadCollection * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThreadCollection_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThreadCollection *arg1 = (lldb::SBThreadCollection *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBThreadCollection_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThreadCollection, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThreadCollection_IsValid" "', argument " "1"" of type '" "lldb::SBThreadCollection const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThreadCollection * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBThreadCollection const *)arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThreadCollection_GetSize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThreadCollection *arg1 = (lldb::SBThreadCollection *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  size_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBThreadCollection_GetSize",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThreadCollection, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThreadCollection_GetSize" "', argument " "1"" of type '" "lldb::SBThreadCollection *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThreadCollection * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetSize();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThreadCollection_GetThreadAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThreadCollection *arg1 = (lldb::SBThreadCollection *) 0 ;
  size_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  size_t val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBThread result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBThreadCollection_GetThreadAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThreadCollection, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThreadCollection_GetThreadAtIndex" "', argument " "1"" of type '" "lldb::SBThreadCollection *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThreadCollection * >(argp1);
  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBThreadCollection_GetThreadAtIndex" "', argument " "2"" of type '" "size_t""'");
  } 
  arg2 = static_cast< size_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetThreadAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBThread(static_cast< const lldb::SBThread& >(result))), SWIGTYPE_p_lldb__SBThread, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBThreadCollection_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBThreadCollection, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBThreadPlan__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThreadPlan *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBThreadPlan")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBThreadPlan *)new lldb::SBThreadPlan();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBThreadPlan, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBThreadPlan__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThreadPlan *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBThreadPlan *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBThreadPlan",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBThreadPlan,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBThreadPlan" "', argument " "1"" of type '" "lldb::SBThreadPlan const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBThreadPlan" "', argument " "1"" of type '" "lldb::SBThreadPlan const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThreadPlan * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBThreadPlan *)new lldb::SBThreadPlan((lldb::SBThreadPlan const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBThreadPlan, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBThreadPlan__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::ThreadPlanSP *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBThreadPlan *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBThreadPlan",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_std__shared_ptrT_lldb_private__ThreadPlan_t,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBThreadPlan" "', argument " "1"" of type '" "lldb::ThreadPlanSP const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBThreadPlan" "', argument " "1"" of type '" "lldb::ThreadPlanSP const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::ThreadPlanSP * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBThreadPlan *)new lldb::SBThreadPlan((lldb::ThreadPlanSP const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBThreadPlan, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBThreadPlan__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThread *arg1 = 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBThreadPlan *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:new_SBThreadPlan",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBThread,  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBThreadPlan" "', argument " "1"" of type '" "lldb::SBThread &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBThreadPlan" "', argument " "1"" of type '" "lldb::SBThread &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThread * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_SBThreadPlan" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBThreadPlan *)new lldb::SBThreadPlan(*arg1,(char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBThreadPlan, SWIG_POINTER_NEW |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBThreadPlan(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[3];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 2); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBThreadPlan__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBThreadPlan, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBThreadPlan__SWIG_1(self, args);
    }
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_std__shared_ptrT_lldb_private__ThreadPlan_t, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBThreadPlan__SWIG_2(self, args);
    }
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBThread, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        return _wrap_new_SBThreadPlan__SWIG_3(self, args);
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBThreadPlan'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBThreadPlan()\n"
    "    lldb::SBThreadPlan(lldb::SBThreadPlan const &)\n"
    "    lldb::SBThreadPlan(lldb::ThreadPlanSP const &)\n"
    "    lldb::SBThreadPlan(lldb::SBThread &,char const *)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBThreadPlan(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThreadPlan *arg1 = (lldb::SBThreadPlan *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBThreadPlan",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThreadPlan, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBThreadPlan" "', argument " "1"" of type '" "lldb::SBThreadPlan *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThreadPlan * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThreadPlan_IsValid__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThreadPlan *arg1 = (lldb::SBThreadPlan *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBThreadPlan_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThreadPlan, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThreadPlan_IsValid" "', argument " "1"" of type '" "lldb::SBThreadPlan const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThreadPlan * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBThreadPlan const *)arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThreadPlan_Clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThreadPlan *arg1 = (lldb::SBThreadPlan *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBThreadPlan_Clear",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThreadPlan, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThreadPlan_Clear" "', argument " "1"" of type '" "lldb::SBThreadPlan *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThreadPlan * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->Clear();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThreadPlan_GetStopReason(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThreadPlan *arg1 = (lldb::SBThreadPlan *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::StopReason result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBThreadPlan_GetStopReason",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThreadPlan, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThreadPlan_GetStopReason" "', argument " "1"" of type '" "lldb::SBThreadPlan *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThreadPlan * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::StopReason)(arg1)->GetStopReason();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThreadPlan_GetStopReasonDataCount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThreadPlan *arg1 = (lldb::SBThreadPlan *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  size_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBThreadPlan_GetStopReasonDataCount",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThreadPlan, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThreadPlan_GetStopReasonDataCount" "', argument " "1"" of type '" "lldb::SBThreadPlan *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThreadPlan * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetStopReasonDataCount();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThreadPlan_GetStopReasonDataAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThreadPlan *arg1 = (lldb::SBThreadPlan *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  uint64_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBThreadPlan_GetStopReasonDataAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThreadPlan, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThreadPlan_GetStopReasonDataAtIndex" "', argument " "1"" of type '" "lldb::SBThreadPlan *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThreadPlan * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBThreadPlan_GetStopReasonDataAtIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint64_t)(arg1)->GetStopReasonDataAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThreadPlan_GetThread(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThreadPlan *arg1 = (lldb::SBThreadPlan *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBThread result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBThreadPlan_GetThread",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThreadPlan, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThreadPlan_GetThread" "', argument " "1"" of type '" "lldb::SBThreadPlan const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThreadPlan * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBThreadPlan const *)arg1)->GetThread();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBThread(static_cast< const lldb::SBThread& >(result))), SWIGTYPE_p_lldb__SBThread, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThreadPlan_GetDescription(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThreadPlan *arg1 = (lldb::SBThreadPlan *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBThreadPlan_GetDescription",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThreadPlan, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThreadPlan_GetDescription" "', argument " "1"" of type '" "lldb::SBThreadPlan const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThreadPlan * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBThreadPlan_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBThreadPlan_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBThreadPlan const *)arg1)->GetDescription(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThreadPlan_SetPlanComplete(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThreadPlan *arg1 = (lldb::SBThreadPlan *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBThreadPlan_SetPlanComplete",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThreadPlan, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThreadPlan_SetPlanComplete" "', argument " "1"" of type '" "lldb::SBThreadPlan *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThreadPlan * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBThreadPlan_SetPlanComplete" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetPlanComplete(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThreadPlan_IsPlanComplete(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThreadPlan *arg1 = (lldb::SBThreadPlan *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBThreadPlan_IsPlanComplete",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThreadPlan, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThreadPlan_IsPlanComplete" "', argument " "1"" of type '" "lldb::SBThreadPlan *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThreadPlan * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsPlanComplete();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThreadPlan_IsPlanStale(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThreadPlan *arg1 = (lldb::SBThreadPlan *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBThreadPlan_IsPlanStale",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThreadPlan, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThreadPlan_IsPlanStale" "', argument " "1"" of type '" "lldb::SBThreadPlan *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThreadPlan * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsPlanStale();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThreadPlan_IsValid__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThreadPlan *arg1 = (lldb::SBThreadPlan *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBThreadPlan_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThreadPlan, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThreadPlan_IsValid" "', argument " "1"" of type '" "lldb::SBThreadPlan *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThreadPlan * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThreadPlan_IsValid(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 1) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBThreadPlan, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_SBThreadPlan_IsValid__SWIG_1(self, args);
    }
  }
  if (argc == 1) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBThreadPlan, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_SBThreadPlan_IsValid__SWIG_0(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBThreadPlan_IsValid'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    IsValid(lldb::SBThreadPlan const *)\n"
    "    IsValid(lldb::SBThreadPlan *)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThreadPlan_QueueThreadPlanForStepOverRange(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThreadPlan *arg1 = (lldb::SBThreadPlan *) 0 ;
  lldb::SBAddress *arg2 = 0 ;
  lldb::addr_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  unsigned long long val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBThreadPlan result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBThreadPlan_QueueThreadPlanForStepOverRange",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThreadPlan, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThreadPlan_QueueThreadPlanForStepOverRange" "', argument " "1"" of type '" "lldb::SBThreadPlan *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThreadPlan * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBAddress,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBThreadPlan_QueueThreadPlanForStepOverRange" "', argument " "2"" of type '" "lldb::SBAddress &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBThreadPlan_QueueThreadPlanForStepOverRange" "', argument " "2"" of type '" "lldb::SBAddress &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBAddress * >(argp2);
  ecode3 = SWIG_AsVal_unsigned_SS_long_SS_long(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBThreadPlan_QueueThreadPlanForStepOverRange" "', argument " "3"" of type '" "lldb::addr_t""'");
  } 
  arg3 = static_cast< lldb::addr_t >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->QueueThreadPlanForStepOverRange(*arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBThreadPlan(static_cast< const lldb::SBThreadPlan& >(result))), SWIGTYPE_p_lldb__SBThreadPlan, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThreadPlan_QueueThreadPlanForStepInRange(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThreadPlan *arg1 = (lldb::SBThreadPlan *) 0 ;
  lldb::SBAddress *arg2 = 0 ;
  lldb::addr_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  unsigned long long val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBThreadPlan result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBThreadPlan_QueueThreadPlanForStepInRange",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThreadPlan, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThreadPlan_QueueThreadPlanForStepInRange" "', argument " "1"" of type '" "lldb::SBThreadPlan *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThreadPlan * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBAddress,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBThreadPlan_QueueThreadPlanForStepInRange" "', argument " "2"" of type '" "lldb::SBAddress &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBThreadPlan_QueueThreadPlanForStepInRange" "', argument " "2"" of type '" "lldb::SBAddress &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBAddress * >(argp2);
  ecode3 = SWIG_AsVal_unsigned_SS_long_SS_long(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBThreadPlan_QueueThreadPlanForStepInRange" "', argument " "3"" of type '" "lldb::addr_t""'");
  } 
  arg3 = static_cast< lldb::addr_t >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->QueueThreadPlanForStepInRange(*arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBThreadPlan(static_cast< const lldb::SBThreadPlan& >(result))), SWIGTYPE_p_lldb__SBThreadPlan, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThreadPlan_QueueThreadPlanForStepOut__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThreadPlan *arg1 = (lldb::SBThreadPlan *) 0 ;
  uint32_t arg2 ;
  bool arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  bool val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBThreadPlan result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBThreadPlan_QueueThreadPlanForStepOut",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThreadPlan, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThreadPlan_QueueThreadPlanForStepOut" "', argument " "1"" of type '" "lldb::SBThreadPlan *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThreadPlan * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBThreadPlan_QueueThreadPlanForStepOut" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  ecode3 = SWIG_AsVal_bool(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBThreadPlan_QueueThreadPlanForStepOut" "', argument " "3"" of type '" "bool""'");
  } 
  arg3 = static_cast< bool >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->QueueThreadPlanForStepOut(arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBThreadPlan(static_cast< const lldb::SBThreadPlan& >(result))), SWIGTYPE_p_lldb__SBThreadPlan, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThreadPlan_QueueThreadPlanForStepOut__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThreadPlan *arg1 = (lldb::SBThreadPlan *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBThreadPlan result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBThreadPlan_QueueThreadPlanForStepOut",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThreadPlan, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThreadPlan_QueueThreadPlanForStepOut" "', argument " "1"" of type '" "lldb::SBThreadPlan *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThreadPlan * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBThreadPlan_QueueThreadPlanForStepOut" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->QueueThreadPlanForStepOut(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBThreadPlan(static_cast< const lldb::SBThreadPlan& >(result))), SWIGTYPE_p_lldb__SBThreadPlan, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThreadPlan_QueueThreadPlanForStepOut(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[4];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 3); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBThreadPlan, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_unsigned_SS_int(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        return _wrap_SBThreadPlan_QueueThreadPlanForStepOut__SWIG_1(self, args);
      }
    }
  }
  if (argc == 3) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBThreadPlan, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_unsigned_SS_int(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        {
          int res = SWIG_AsVal_bool(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          return _wrap_SBThreadPlan_QueueThreadPlanForStepOut__SWIG_0(self, args);
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBThreadPlan_QueueThreadPlanForStepOut'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    QueueThreadPlanForStepOut(lldb::SBThreadPlan *,uint32_t,bool)\n"
    "    QueueThreadPlanForStepOut(lldb::SBThreadPlan *,uint32_t)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBThreadPlan_QueueThreadPlanForRunToAddress(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBThreadPlan *arg1 = (lldb::SBThreadPlan *) 0 ;
  lldb::SBAddress arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBThreadPlan result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBThreadPlan_QueueThreadPlanForRunToAddress",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBThreadPlan, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBThreadPlan_QueueThreadPlanForRunToAddress" "', argument " "1"" of type '" "lldb::SBThreadPlan *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBThreadPlan * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBAddress,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBThreadPlan_QueueThreadPlanForRunToAddress" "', argument " "2"" of type '" "lldb::SBAddress""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBThreadPlan_QueueThreadPlanForRunToAddress" "', argument " "2"" of type '" "lldb::SBAddress""'");
    } else {
      lldb::SBAddress * temp = reinterpret_cast< lldb::SBAddress * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->QueueThreadPlanForRunToAddress(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBThreadPlan(static_cast< const lldb::SBThreadPlan& >(result))), SWIGTYPE_p_lldb__SBThreadPlan, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBThreadPlan_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBThreadPlan, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBTrace(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTrace *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBTrace")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBTrace *)new lldb::SBTrace();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBTrace, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTrace_GetTraceData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTrace *arg1 = (lldb::SBTrace *) 0 ;
  lldb::SBError *arg2 = 0 ;
  void *arg3 = (void *) 0 ;
  size_t arg4 ;
  size_t arg5 ;
  lldb::tid_t arg6 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  size_t val5 ;
  int ecode5 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  PyObject * obj4 = 0 ;
  size_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOOO:SBTrace_GetTraceData",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTrace, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTrace_GetTraceData" "', argument " "1"" of type '" "lldb::SBTrace *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTrace * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTrace_GetTraceData" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTrace_GetTraceData" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBError * >(argp2);
  {
    if (PyInt_Check(obj2)) {
      arg4 = PyInt_AsLong(obj2);
    } else if (PyLong_Check(obj2)) {
      arg4 = PyLong_AsLong(obj2);
    } else {
      PyErr_SetString(PyExc_ValueError, "Expecting an integer or long object");
      return NULL;
    }
    if (arg4 <= 0) {
      PyErr_SetString(PyExc_ValueError, "Positive integer expected");
      return NULL;
    }
    arg3 = (void *) malloc(arg4);
  }
  ecode5 = SWIG_AsVal_size_t(obj3, &val5);
  if (!SWIG_IsOK(ecode5)) {
    SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "SBTrace_GetTraceData" "', argument " "5"" of type '" "size_t""'");
  } 
  arg5 = static_cast< size_t >(val5);
  {
    using namespace lldb_private;
    if (PythonInteger::Check(obj4))
    {
      PythonInteger py_int(PyRefType::Borrowed, obj4);
      arg6 = static_cast<lldb::tid_t>(py_int.GetInteger());
    }
    else
    {
      PyErr_SetString(PyExc_ValueError, "Expecting an integer");
      return nullptr;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetTraceData(*arg2,arg3,arg4,arg5,arg6);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
  {
    Py_XDECREF(resultobj);   /* Blow away any previous result */
    if (result == 0) {
      resultobj = Py_None;
      Py_INCREF(resultobj);
    } else {
      lldb_private::PythonBytes bytes(static_cast<const uint8_t*>(arg3), result);
      resultobj = bytes.release();
    }
    free(arg3);
  }
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTrace_GetMetaData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTrace *arg1 = (lldb::SBTrace *) 0 ;
  lldb::SBError *arg2 = 0 ;
  void *arg3 = (void *) 0 ;
  size_t arg4 ;
  size_t arg5 ;
  lldb::tid_t arg6 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  size_t val5 ;
  int ecode5 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  PyObject * obj4 = 0 ;
  size_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOOO:SBTrace_GetMetaData",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTrace, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTrace_GetMetaData" "', argument " "1"" of type '" "lldb::SBTrace *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTrace * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTrace_GetMetaData" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTrace_GetMetaData" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBError * >(argp2);
  {
    if (PyInt_Check(obj2)) {
      arg4 = PyInt_AsLong(obj2);
    } else if (PyLong_Check(obj2)) {
      arg4 = PyLong_AsLong(obj2);
    } else {
      PyErr_SetString(PyExc_ValueError, "Expecting an integer or long object");
      return NULL;
    }
    if (arg4 <= 0) {
      PyErr_SetString(PyExc_ValueError, "Positive integer expected");
      return NULL;
    }
    arg3 = (void *) malloc(arg4);
  }
  ecode5 = SWIG_AsVal_size_t(obj3, &val5);
  if (!SWIG_IsOK(ecode5)) {
    SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "SBTrace_GetMetaData" "', argument " "5"" of type '" "size_t""'");
  } 
  arg5 = static_cast< size_t >(val5);
  {
    using namespace lldb_private;
    if (PythonInteger::Check(obj4))
    {
      PythonInteger py_int(PyRefType::Borrowed, obj4);
      arg6 = static_cast<lldb::tid_t>(py_int.GetInteger());
    }
    else
    {
      PyErr_SetString(PyExc_ValueError, "Expecting an integer");
      return nullptr;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetMetaData(*arg2,arg3,arg4,arg5,arg6);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
  {
    Py_XDECREF(resultobj);   /* Blow away any previous result */
    if (result == 0) {
      resultobj = Py_None;
      Py_INCREF(resultobj);
    } else {
      lldb_private::PythonBytes bytes(static_cast<const uint8_t*>(arg3), result);
      resultobj = bytes.release();
    }
    free(arg3);
  }
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTrace_StopTrace(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTrace *arg1 = (lldb::SBTrace *) 0 ;
  lldb::SBError *arg2 = 0 ;
  lldb::tid_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBTrace_StopTrace",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTrace, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTrace_StopTrace" "', argument " "1"" of type '" "lldb::SBTrace *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTrace * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTrace_StopTrace" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTrace_StopTrace" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBError * >(argp2);
  {
    using namespace lldb_private;
    if (PythonInteger::Check(obj2))
    {
      PythonInteger py_int(PyRefType::Borrowed, obj2);
      arg3 = static_cast<lldb::tid_t>(py_int.GetInteger());
    }
    else
    {
      PyErr_SetString(PyExc_ValueError, "Expecting an integer");
      return nullptr;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->StopTrace(*arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTrace_GetTraceConfig(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTrace *arg1 = (lldb::SBTrace *) 0 ;
  lldb::SBTraceOptions *arg2 = 0 ;
  lldb::SBError *arg3 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  void *argp3 = 0 ;
  int res3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBTrace_GetTraceConfig",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTrace, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTrace_GetTraceConfig" "', argument " "1"" of type '" "lldb::SBTrace *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTrace * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTraceOptions,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTrace_GetTraceConfig" "', argument " "2"" of type '" "lldb::SBTraceOptions &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTrace_GetTraceConfig" "', argument " "2"" of type '" "lldb::SBTraceOptions &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBTraceOptions * >(argp2);
  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBTrace_GetTraceConfig" "', argument " "3"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp3) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTrace_GetTraceConfig" "', argument " "3"" of type '" "lldb::SBError &""'"); 
  }
  arg3 = reinterpret_cast< lldb::SBError * >(argp3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->GetTraceConfig(*arg2,*arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTrace_GetTraceUID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTrace *arg1 = (lldb::SBTrace *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::user_id_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTrace_GetTraceUID",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTrace, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTrace_GetTraceUID" "', argument " "1"" of type '" "lldb::SBTrace *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTrace * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::user_id_t)(arg1)->GetTraceUID();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTrace_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTrace *arg1 = (lldb::SBTrace *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTrace_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTrace, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTrace_IsValid" "', argument " "1"" of type '" "lldb::SBTrace *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTrace * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBTrace(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTrace *arg1 = (lldb::SBTrace *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBTrace",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTrace, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBTrace" "', argument " "1"" of type '" "lldb::SBTrace *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTrace * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBTrace_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBTrace, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBTraceOptions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTraceOptions *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBTraceOptions")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBTraceOptions *)new lldb::SBTraceOptions();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBTraceOptions, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTraceOptions_getType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTraceOptions *arg1 = (lldb::SBTraceOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::TraceType result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTraceOptions_getType",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTraceOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTraceOptions_getType" "', argument " "1"" of type '" "lldb::SBTraceOptions const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTraceOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::TraceType)((lldb::SBTraceOptions const *)arg1)->getType();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTraceOptions_getTraceBufferSize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTraceOptions *arg1 = (lldb::SBTraceOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint64_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTraceOptions_getTraceBufferSize",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTraceOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTraceOptions_getTraceBufferSize" "', argument " "1"" of type '" "lldb::SBTraceOptions const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTraceOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint64_t)((lldb::SBTraceOptions const *)arg1)->getTraceBufferSize();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTraceOptions_getTraceParams(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTraceOptions *arg1 = (lldb::SBTraceOptions *) 0 ;
  lldb::SBError *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBStructuredData result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTraceOptions_getTraceParams",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTraceOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTraceOptions_getTraceParams" "', argument " "1"" of type '" "lldb::SBTraceOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTraceOptions * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTraceOptions_getTraceParams" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTraceOptions_getTraceParams" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBError * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->getTraceParams(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBStructuredData(static_cast< const lldb::SBStructuredData& >(result))), SWIGTYPE_p_lldb__SBStructuredData, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTraceOptions_getMetaDataBufferSize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTraceOptions *arg1 = (lldb::SBTraceOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint64_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTraceOptions_getMetaDataBufferSize",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTraceOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTraceOptions_getMetaDataBufferSize" "', argument " "1"" of type '" "lldb::SBTraceOptions const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTraceOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint64_t)((lldb::SBTraceOptions const *)arg1)->getMetaDataBufferSize();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTraceOptions_setTraceParams(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTraceOptions *arg1 = (lldb::SBTraceOptions *) 0 ;
  lldb::SBStructuredData *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTraceOptions_setTraceParams",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTraceOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTraceOptions_setTraceParams" "', argument " "1"" of type '" "lldb::SBTraceOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTraceOptions * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStructuredData,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTraceOptions_setTraceParams" "', argument " "2"" of type '" "lldb::SBStructuredData &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTraceOptions_setTraceParams" "', argument " "2"" of type '" "lldb::SBStructuredData &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStructuredData * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->setTraceParams(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTraceOptions_setType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTraceOptions *arg1 = (lldb::SBTraceOptions *) 0 ;
  lldb::TraceType arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTraceOptions_setType",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTraceOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTraceOptions_setType" "', argument " "1"" of type '" "lldb::SBTraceOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTraceOptions * >(argp1);
  ecode2 = SWIG_AsVal_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBTraceOptions_setType" "', argument " "2"" of type '" "lldb::TraceType""'");
  } 
  arg2 = static_cast< lldb::TraceType >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->setType(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTraceOptions_setTraceBufferSize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTraceOptions *arg1 = (lldb::SBTraceOptions *) 0 ;
  uint64_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned long long val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTraceOptions_setTraceBufferSize",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTraceOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTraceOptions_setTraceBufferSize" "', argument " "1"" of type '" "lldb::SBTraceOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTraceOptions * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_long_SS_long(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBTraceOptions_setTraceBufferSize" "', argument " "2"" of type '" "uint64_t""'");
  } 
  arg2 = static_cast< uint64_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->setTraceBufferSize(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTraceOptions_setMetaDataBufferSize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTraceOptions *arg1 = (lldb::SBTraceOptions *) 0 ;
  uint64_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned long long val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTraceOptions_setMetaDataBufferSize",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTraceOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTraceOptions_setMetaDataBufferSize" "', argument " "1"" of type '" "lldb::SBTraceOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTraceOptions * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_long_SS_long(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBTraceOptions_setMetaDataBufferSize" "', argument " "2"" of type '" "uint64_t""'");
  } 
  arg2 = static_cast< uint64_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->setMetaDataBufferSize(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTraceOptions_setThreadID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTraceOptions *arg1 = (lldb::SBTraceOptions *) 0 ;
  lldb::tid_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTraceOptions_setThreadID",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTraceOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTraceOptions_setThreadID" "', argument " "1"" of type '" "lldb::SBTraceOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTraceOptions * >(argp1);
  {
    using namespace lldb_private;
    if (PythonInteger::Check(obj1))
    {
      PythonInteger py_int(PyRefType::Borrowed, obj1);
      arg2 = static_cast<lldb::tid_t>(py_int.GetInteger());
    }
    else
    {
      PyErr_SetString(PyExc_ValueError, "Expecting an integer");
      return nullptr;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->setThreadID(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTraceOptions_getThreadID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTraceOptions *arg1 = (lldb::SBTraceOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::tid_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTraceOptions_getThreadID",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTraceOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTraceOptions_getThreadID" "', argument " "1"" of type '" "lldb::SBTraceOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTraceOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::tid_t)(arg1)->getThreadID();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTraceOptions_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTraceOptions *arg1 = (lldb::SBTraceOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTraceOptions_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTraceOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTraceOptions_IsValid" "', argument " "1"" of type '" "lldb::SBTraceOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTraceOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBTraceOptions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTraceOptions *arg1 = (lldb::SBTraceOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBTraceOptions",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTraceOptions, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBTraceOptions" "', argument " "1"" of type '" "lldb::SBTraceOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTraceOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBTraceOptions_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBTraceOptions, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBTypeMember__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeMember *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBTypeMember")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBTypeMember *)new lldb::SBTypeMember();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBTypeMember, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBTypeMember__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeMember *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBTypeMember *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBTypeMember",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBTypeMember,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBTypeMember" "', argument " "1"" of type '" "lldb::SBTypeMember const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBTypeMember" "', argument " "1"" of type '" "lldb::SBTypeMember const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeMember * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBTypeMember *)new lldb::SBTypeMember((lldb::SBTypeMember const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBTypeMember, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBTypeMember(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBTypeMember__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBTypeMember, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBTypeMember__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBTypeMember'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBTypeMember()\n"
    "    lldb::SBTypeMember(lldb::SBTypeMember const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBTypeMember(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeMember *arg1 = (lldb::SBTypeMember *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBTypeMember",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeMember, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBTypeMember" "', argument " "1"" of type '" "lldb::SBTypeMember *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeMember * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeMember_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeMember *arg1 = (lldb::SBTypeMember *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeMember_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeMember, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeMember_IsValid" "', argument " "1"" of type '" "lldb::SBTypeMember const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeMember * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBTypeMember const *)arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeMember_GetName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeMember *arg1 = (lldb::SBTypeMember *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeMember_GetName",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeMember, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeMember_GetName" "', argument " "1"" of type '" "lldb::SBTypeMember *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeMember * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetName();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeMember_GetType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeMember *arg1 = (lldb::SBTypeMember *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBType result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeMember_GetType",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeMember, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeMember_GetType" "', argument " "1"" of type '" "lldb::SBTypeMember *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeMember * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetType();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBType(static_cast< const lldb::SBType& >(result))), SWIGTYPE_p_lldb__SBType, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeMember_GetOffsetInBytes(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeMember *arg1 = (lldb::SBTypeMember *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint64_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeMember_GetOffsetInBytes",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeMember, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeMember_GetOffsetInBytes" "', argument " "1"" of type '" "lldb::SBTypeMember *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeMember * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint64_t)(arg1)->GetOffsetInBytes();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeMember_GetOffsetInBits(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeMember *arg1 = (lldb::SBTypeMember *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint64_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeMember_GetOffsetInBits",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeMember, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeMember_GetOffsetInBits" "', argument " "1"" of type '" "lldb::SBTypeMember *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeMember * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint64_t)(arg1)->GetOffsetInBits();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeMember_IsBitfield(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeMember *arg1 = (lldb::SBTypeMember *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeMember_IsBitfield",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeMember, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeMember_IsBitfield" "', argument " "1"" of type '" "lldb::SBTypeMember *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeMember * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsBitfield();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeMember_GetBitfieldSizeInBits(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeMember *arg1 = (lldb::SBTypeMember *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeMember_GetBitfieldSizeInBits",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeMember, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeMember_GetBitfieldSizeInBits" "', argument " "1"" of type '" "lldb::SBTypeMember *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeMember * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetBitfieldSizeInBits();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeMember___str__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeMember *arg1 = (lldb::SBTypeMember *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeMember___str__",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeMember, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeMember___str__" "', argument " "1"" of type '" "lldb::SBTypeMember *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeMember * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (PyObject *)lldb_SBTypeMember___str__(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = result;
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBTypeMember_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBTypeMember, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBTypeMemberFunction__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeMemberFunction *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBTypeMemberFunction")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBTypeMemberFunction *)new lldb::SBTypeMemberFunction();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBTypeMemberFunction, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBTypeMemberFunction__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeMemberFunction *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBTypeMemberFunction *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBTypeMemberFunction",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBTypeMemberFunction,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBTypeMemberFunction" "', argument " "1"" of type '" "lldb::SBTypeMemberFunction const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBTypeMemberFunction" "', argument " "1"" of type '" "lldb::SBTypeMemberFunction const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeMemberFunction * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBTypeMemberFunction *)new lldb::SBTypeMemberFunction((lldb::SBTypeMemberFunction const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBTypeMemberFunction, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBTypeMemberFunction(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBTypeMemberFunction__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBTypeMemberFunction, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBTypeMemberFunction__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBTypeMemberFunction'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBTypeMemberFunction()\n"
    "    lldb::SBTypeMemberFunction(lldb::SBTypeMemberFunction const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBTypeMemberFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeMemberFunction *arg1 = (lldb::SBTypeMemberFunction *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBTypeMemberFunction",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeMemberFunction, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBTypeMemberFunction" "', argument " "1"" of type '" "lldb::SBTypeMemberFunction *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeMemberFunction * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeMemberFunction_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeMemberFunction *arg1 = (lldb::SBTypeMemberFunction *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeMemberFunction_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeMemberFunction, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeMemberFunction_IsValid" "', argument " "1"" of type '" "lldb::SBTypeMemberFunction const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeMemberFunction * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBTypeMemberFunction const *)arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeMemberFunction_GetName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeMemberFunction *arg1 = (lldb::SBTypeMemberFunction *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeMemberFunction_GetName",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeMemberFunction, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeMemberFunction_GetName" "', argument " "1"" of type '" "lldb::SBTypeMemberFunction *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeMemberFunction * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetName();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeMemberFunction_GetDemangledName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeMemberFunction *arg1 = (lldb::SBTypeMemberFunction *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeMemberFunction_GetDemangledName",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeMemberFunction, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeMemberFunction_GetDemangledName" "', argument " "1"" of type '" "lldb::SBTypeMemberFunction *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeMemberFunction * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetDemangledName();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeMemberFunction_GetMangledName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeMemberFunction *arg1 = (lldb::SBTypeMemberFunction *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeMemberFunction_GetMangledName",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeMemberFunction, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeMemberFunction_GetMangledName" "', argument " "1"" of type '" "lldb::SBTypeMemberFunction *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeMemberFunction * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetMangledName();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeMemberFunction_GetType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeMemberFunction *arg1 = (lldb::SBTypeMemberFunction *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBType result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeMemberFunction_GetType",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeMemberFunction, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeMemberFunction_GetType" "', argument " "1"" of type '" "lldb::SBTypeMemberFunction *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeMemberFunction * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetType();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBType(static_cast< const lldb::SBType& >(result))), SWIGTYPE_p_lldb__SBType, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeMemberFunction_GetReturnType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeMemberFunction *arg1 = (lldb::SBTypeMemberFunction *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBType result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeMemberFunction_GetReturnType",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeMemberFunction, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeMemberFunction_GetReturnType" "', argument " "1"" of type '" "lldb::SBTypeMemberFunction *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeMemberFunction * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetReturnType();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBType(static_cast< const lldb::SBType& >(result))), SWIGTYPE_p_lldb__SBType, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeMemberFunction_GetNumberOfArguments(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeMemberFunction *arg1 = (lldb::SBTypeMemberFunction *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeMemberFunction_GetNumberOfArguments",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeMemberFunction, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeMemberFunction_GetNumberOfArguments" "', argument " "1"" of type '" "lldb::SBTypeMemberFunction *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeMemberFunction * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetNumberOfArguments();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeMemberFunction_GetArgumentTypeAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeMemberFunction *arg1 = (lldb::SBTypeMemberFunction *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBType result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeMemberFunction_GetArgumentTypeAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeMemberFunction, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeMemberFunction_GetArgumentTypeAtIndex" "', argument " "1"" of type '" "lldb::SBTypeMemberFunction *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeMemberFunction * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBTypeMemberFunction_GetArgumentTypeAtIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetArgumentTypeAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBType(static_cast< const lldb::SBType& >(result))), SWIGTYPE_p_lldb__SBType, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeMemberFunction_GetKind(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeMemberFunction *arg1 = (lldb::SBTypeMemberFunction *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::MemberFunctionKind result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeMemberFunction_GetKind",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeMemberFunction, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeMemberFunction_GetKind" "', argument " "1"" of type '" "lldb::SBTypeMemberFunction *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeMemberFunction * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::MemberFunctionKind)(arg1)->GetKind();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeMemberFunction_GetDescription(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeMemberFunction *arg1 = (lldb::SBTypeMemberFunction *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  lldb::DescriptionLevel arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  int val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBTypeMemberFunction_GetDescription",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeMemberFunction, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeMemberFunction_GetDescription" "', argument " "1"" of type '" "lldb::SBTypeMemberFunction *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeMemberFunction * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTypeMemberFunction_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTypeMemberFunction_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  ecode3 = SWIG_AsVal_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBTypeMemberFunction_GetDescription" "', argument " "3"" of type '" "lldb::DescriptionLevel""'");
  } 
  arg3 = static_cast< lldb::DescriptionLevel >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetDescription(*arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeMemberFunction___str__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeMemberFunction *arg1 = (lldb::SBTypeMemberFunction *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeMemberFunction___str__",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeMemberFunction, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeMemberFunction___str__" "', argument " "1"" of type '" "lldb::SBTypeMemberFunction *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeMemberFunction * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (PyObject *)lldb_SBTypeMemberFunction___str__(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = result;
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBTypeMemberFunction_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBTypeMemberFunction, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBType__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBType *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBType")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBType *)new lldb::SBType();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBType, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBType__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBType *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBType *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBType",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBType,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBType" "', argument " "1"" of type '" "lldb::SBType const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBType" "', argument " "1"" of type '" "lldb::SBType const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBType * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBType *)new lldb::SBType((lldb::SBType const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBType, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBType(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBType__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBType, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBType__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBType'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBType()\n"
    "    lldb::SBType(lldb::SBType const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBType *arg1 = (lldb::SBType *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBType",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBType, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBType" "', argument " "1"" of type '" "lldb::SBType *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBType * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBType_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBType *arg1 = (lldb::SBType *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBType_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBType, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBType_IsValid" "', argument " "1"" of type '" "lldb::SBType *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBType * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBType_GetByteSize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBType *arg1 = (lldb::SBType *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint64_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBType_GetByteSize",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBType, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBType_GetByteSize" "', argument " "1"" of type '" "lldb::SBType *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBType * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint64_t)(arg1)->GetByteSize();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBType_IsPointerType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBType *arg1 = (lldb::SBType *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBType_IsPointerType",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBType, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBType_IsPointerType" "', argument " "1"" of type '" "lldb::SBType *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBType * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsPointerType();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBType_IsReferenceType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBType *arg1 = (lldb::SBType *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBType_IsReferenceType",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBType, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBType_IsReferenceType" "', argument " "1"" of type '" "lldb::SBType *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBType * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsReferenceType();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBType_IsFunctionType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBType *arg1 = (lldb::SBType *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBType_IsFunctionType",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBType, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBType_IsFunctionType" "', argument " "1"" of type '" "lldb::SBType *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBType * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsFunctionType();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBType_IsPolymorphicClass(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBType *arg1 = (lldb::SBType *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBType_IsPolymorphicClass",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBType, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBType_IsPolymorphicClass" "', argument " "1"" of type '" "lldb::SBType *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBType * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsPolymorphicClass();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBType_IsArrayType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBType *arg1 = (lldb::SBType *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBType_IsArrayType",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBType, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBType_IsArrayType" "', argument " "1"" of type '" "lldb::SBType *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBType * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsArrayType();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBType_IsVectorType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBType *arg1 = (lldb::SBType *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBType_IsVectorType",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBType, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBType_IsVectorType" "', argument " "1"" of type '" "lldb::SBType *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBType * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsVectorType();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBType_IsTypedefType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBType *arg1 = (lldb::SBType *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBType_IsTypedefType",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBType, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBType_IsTypedefType" "', argument " "1"" of type '" "lldb::SBType *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBType * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsTypedefType();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBType_IsAnonymousType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBType *arg1 = (lldb::SBType *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBType_IsAnonymousType",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBType, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBType_IsAnonymousType" "', argument " "1"" of type '" "lldb::SBType *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBType * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsAnonymousType();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBType_GetPointerType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBType *arg1 = (lldb::SBType *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBType result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBType_GetPointerType",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBType, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBType_GetPointerType" "', argument " "1"" of type '" "lldb::SBType *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBType * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetPointerType();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBType(static_cast< const lldb::SBType& >(result))), SWIGTYPE_p_lldb__SBType, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBType_GetPointeeType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBType *arg1 = (lldb::SBType *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBType result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBType_GetPointeeType",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBType, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBType_GetPointeeType" "', argument " "1"" of type '" "lldb::SBType *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBType * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetPointeeType();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBType(static_cast< const lldb::SBType& >(result))), SWIGTYPE_p_lldb__SBType, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBType_GetReferenceType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBType *arg1 = (lldb::SBType *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBType result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBType_GetReferenceType",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBType, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBType_GetReferenceType" "', argument " "1"" of type '" "lldb::SBType *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBType * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetReferenceType();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBType(static_cast< const lldb::SBType& >(result))), SWIGTYPE_p_lldb__SBType, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBType_GetTypedefedType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBType *arg1 = (lldb::SBType *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBType result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBType_GetTypedefedType",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBType, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBType_GetTypedefedType" "', argument " "1"" of type '" "lldb::SBType *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBType * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetTypedefedType();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBType(static_cast< const lldb::SBType& >(result))), SWIGTYPE_p_lldb__SBType, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBType_GetDereferencedType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBType *arg1 = (lldb::SBType *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBType result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBType_GetDereferencedType",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBType, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBType_GetDereferencedType" "', argument " "1"" of type '" "lldb::SBType *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBType * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetDereferencedType();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBType(static_cast< const lldb::SBType& >(result))), SWIGTYPE_p_lldb__SBType, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBType_GetUnqualifiedType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBType *arg1 = (lldb::SBType *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBType result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBType_GetUnqualifiedType",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBType, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBType_GetUnqualifiedType" "', argument " "1"" of type '" "lldb::SBType *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBType * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetUnqualifiedType();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBType(static_cast< const lldb::SBType& >(result))), SWIGTYPE_p_lldb__SBType, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBType_GetCanonicalType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBType *arg1 = (lldb::SBType *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBType result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBType_GetCanonicalType",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBType, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBType_GetCanonicalType" "', argument " "1"" of type '" "lldb::SBType *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBType * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetCanonicalType();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBType(static_cast< const lldb::SBType& >(result))), SWIGTYPE_p_lldb__SBType, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBType_GetArrayElementType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBType *arg1 = (lldb::SBType *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBType result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBType_GetArrayElementType",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBType, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBType_GetArrayElementType" "', argument " "1"" of type '" "lldb::SBType *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBType * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetArrayElementType();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBType(static_cast< const lldb::SBType& >(result))), SWIGTYPE_p_lldb__SBType, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBType_GetArrayType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBType *arg1 = (lldb::SBType *) 0 ;
  uint64_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned long long val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBType result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBType_GetArrayType",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBType, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBType_GetArrayType" "', argument " "1"" of type '" "lldb::SBType *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBType * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_long_SS_long(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBType_GetArrayType" "', argument " "2"" of type '" "uint64_t""'");
  } 
  arg2 = static_cast< uint64_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetArrayType(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBType(static_cast< const lldb::SBType& >(result))), SWIGTYPE_p_lldb__SBType, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBType_GetVectorElementType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBType *arg1 = (lldb::SBType *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBType result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBType_GetVectorElementType",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBType, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBType_GetVectorElementType" "', argument " "1"" of type '" "lldb::SBType *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBType * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetVectorElementType();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBType(static_cast< const lldb::SBType& >(result))), SWIGTYPE_p_lldb__SBType, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBType_GetBasicType__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBType *arg1 = (lldb::SBType *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::BasicType result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBType_GetBasicType",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBType, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBType_GetBasicType" "', argument " "1"" of type '" "lldb::SBType *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBType * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::BasicType)(arg1)->GetBasicType();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBType_GetBasicType__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBType *arg1 = (lldb::SBType *) 0 ;
  lldb::BasicType arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBType result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBType_GetBasicType",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBType, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBType_GetBasicType" "', argument " "1"" of type '" "lldb::SBType *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBType * >(argp1);
  ecode2 = SWIG_AsVal_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBType_GetBasicType" "', argument " "2"" of type '" "lldb::BasicType""'");
  } 
  arg2 = static_cast< lldb::BasicType >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetBasicType(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBType(static_cast< const lldb::SBType& >(result))), SWIGTYPE_p_lldb__SBType, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBType_GetBasicType(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[3];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 2); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 1) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBType, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_SBType_GetBasicType__SWIG_0(self, args);
    }
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBType, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_int(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        return _wrap_SBType_GetBasicType__SWIG_1(self, args);
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBType_GetBasicType'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    GetBasicType(lldb::SBType *)\n"
    "    GetBasicType(lldb::SBType *,lldb::BasicType)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBType_GetNumberOfFields(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBType *arg1 = (lldb::SBType *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBType_GetNumberOfFields",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBType, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBType_GetNumberOfFields" "', argument " "1"" of type '" "lldb::SBType *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBType * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetNumberOfFields();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBType_GetNumberOfDirectBaseClasses(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBType *arg1 = (lldb::SBType *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBType_GetNumberOfDirectBaseClasses",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBType, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBType_GetNumberOfDirectBaseClasses" "', argument " "1"" of type '" "lldb::SBType *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBType * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetNumberOfDirectBaseClasses();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBType_GetNumberOfVirtualBaseClasses(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBType *arg1 = (lldb::SBType *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBType_GetNumberOfVirtualBaseClasses",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBType, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBType_GetNumberOfVirtualBaseClasses" "', argument " "1"" of type '" "lldb::SBType *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBType * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetNumberOfVirtualBaseClasses();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBType_GetFieldAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBType *arg1 = (lldb::SBType *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBTypeMember result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBType_GetFieldAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBType, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBType_GetFieldAtIndex" "', argument " "1"" of type '" "lldb::SBType *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBType * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBType_GetFieldAtIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetFieldAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTypeMember(static_cast< const lldb::SBTypeMember& >(result))), SWIGTYPE_p_lldb__SBTypeMember, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBType_GetDirectBaseClassAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBType *arg1 = (lldb::SBType *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBTypeMember result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBType_GetDirectBaseClassAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBType, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBType_GetDirectBaseClassAtIndex" "', argument " "1"" of type '" "lldb::SBType *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBType * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBType_GetDirectBaseClassAtIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetDirectBaseClassAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTypeMember(static_cast< const lldb::SBTypeMember& >(result))), SWIGTYPE_p_lldb__SBTypeMember, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBType_GetVirtualBaseClassAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBType *arg1 = (lldb::SBType *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBTypeMember result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBType_GetVirtualBaseClassAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBType, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBType_GetVirtualBaseClassAtIndex" "', argument " "1"" of type '" "lldb::SBType *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBType * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBType_GetVirtualBaseClassAtIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetVirtualBaseClassAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTypeMember(static_cast< const lldb::SBTypeMember& >(result))), SWIGTYPE_p_lldb__SBTypeMember, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBType_GetEnumMembers(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBType *arg1 = (lldb::SBType *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBTypeEnumMemberList result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBType_GetEnumMembers",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBType, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBType_GetEnumMembers" "', argument " "1"" of type '" "lldb::SBType *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBType * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetEnumMembers();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTypeEnumMemberList(static_cast< const lldb::SBTypeEnumMemberList& >(result))), SWIGTYPE_p_lldb__SBTypeEnumMemberList, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBType_GetName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBType *arg1 = (lldb::SBType *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBType_GetName",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBType, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBType_GetName" "', argument " "1"" of type '" "lldb::SBType *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBType * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetName();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBType_GetDisplayTypeName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBType *arg1 = (lldb::SBType *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBType_GetDisplayTypeName",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBType, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBType_GetDisplayTypeName" "', argument " "1"" of type '" "lldb::SBType *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBType * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetDisplayTypeName();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBType_GetTypeClass(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBType *arg1 = (lldb::SBType *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::TypeClass result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBType_GetTypeClass",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBType, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBType_GetTypeClass" "', argument " "1"" of type '" "lldb::SBType *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBType * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::TypeClass)(arg1)->GetTypeClass();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBType_GetNumberOfTemplateArguments(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBType *arg1 = (lldb::SBType *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBType_GetNumberOfTemplateArguments",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBType, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBType_GetNumberOfTemplateArguments" "', argument " "1"" of type '" "lldb::SBType *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBType * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetNumberOfTemplateArguments();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBType_GetTemplateArgumentType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBType *arg1 = (lldb::SBType *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBType result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBType_GetTemplateArgumentType",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBType, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBType_GetTemplateArgumentType" "', argument " "1"" of type '" "lldb::SBType *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBType * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBType_GetTemplateArgumentType" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetTemplateArgumentType(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBType(static_cast< const lldb::SBType& >(result))), SWIGTYPE_p_lldb__SBType, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBType_GetTemplateArgumentKind(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBType *arg1 = (lldb::SBType *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::TemplateArgumentKind result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBType_GetTemplateArgumentKind",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBType, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBType_GetTemplateArgumentKind" "', argument " "1"" of type '" "lldb::SBType *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBType * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBType_GetTemplateArgumentKind" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::TemplateArgumentKind)(arg1)->GetTemplateArgumentKind(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBType_GetFunctionReturnType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBType *arg1 = (lldb::SBType *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBType result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBType_GetFunctionReturnType",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBType, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBType_GetFunctionReturnType" "', argument " "1"" of type '" "lldb::SBType *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBType * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetFunctionReturnType();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBType(static_cast< const lldb::SBType& >(result))), SWIGTYPE_p_lldb__SBType, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBType_GetFunctionArgumentTypes(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBType *arg1 = (lldb::SBType *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBTypeList result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBType_GetFunctionArgumentTypes",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBType, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBType_GetFunctionArgumentTypes" "', argument " "1"" of type '" "lldb::SBType *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBType * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetFunctionArgumentTypes();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTypeList(static_cast< const lldb::SBTypeList& >(result))), SWIGTYPE_p_lldb__SBTypeList, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBType_GetNumberOfMemberFunctions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBType *arg1 = (lldb::SBType *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBType_GetNumberOfMemberFunctions",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBType, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBType_GetNumberOfMemberFunctions" "', argument " "1"" of type '" "lldb::SBType *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBType * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetNumberOfMemberFunctions();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBType_GetMemberFunctionAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBType *arg1 = (lldb::SBType *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBTypeMemberFunction result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBType_GetMemberFunctionAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBType, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBType_GetMemberFunctionAtIndex" "', argument " "1"" of type '" "lldb::SBType *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBType * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBType_GetMemberFunctionAtIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetMemberFunctionAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTypeMemberFunction(static_cast< const lldb::SBTypeMemberFunction& >(result))), SWIGTYPE_p_lldb__SBTypeMemberFunction, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBType_IsTypeComplete(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBType *arg1 = (lldb::SBType *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBType_IsTypeComplete",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBType, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBType_IsTypeComplete" "', argument " "1"" of type '" "lldb::SBType *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBType * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsTypeComplete();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBType_GetTypeFlags(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBType *arg1 = (lldb::SBType *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBType_GetTypeFlags",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBType, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBType_GetTypeFlags" "', argument " "1"" of type '" "lldb::SBType *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBType * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetTypeFlags();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBType___str__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBType *arg1 = (lldb::SBType *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBType___str__",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBType, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBType___str__" "', argument " "1"" of type '" "lldb::SBType *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBType * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (PyObject *)lldb_SBType___str__(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = result;
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBType_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBType, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBTypeList(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeList *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBTypeList")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBTypeList *)new lldb::SBTypeList();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBTypeList, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeList_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeList *arg1 = (lldb::SBTypeList *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeList_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeList_IsValid" "', argument " "1"" of type '" "lldb::SBTypeList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeList * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeList_Append(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeList *arg1 = (lldb::SBTypeList *) 0 ;
  lldb::SBType arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeList_Append",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeList_Append" "', argument " "1"" of type '" "lldb::SBTypeList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeList * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBType,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTypeList_Append" "', argument " "2"" of type '" "lldb::SBType""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTypeList_Append" "', argument " "2"" of type '" "lldb::SBType""'");
    } else {
      lldb::SBType * temp = reinterpret_cast< lldb::SBType * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->Append(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeList_GetTypeAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeList *arg1 = (lldb::SBTypeList *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBType result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeList_GetTypeAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeList_GetTypeAtIndex" "', argument " "1"" of type '" "lldb::SBTypeList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeList * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBTypeList_GetTypeAtIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetTypeAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBType(static_cast< const lldb::SBType& >(result))), SWIGTYPE_p_lldb__SBType, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeList_GetSize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeList *arg1 = (lldb::SBTypeList *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeList_GetSize",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeList_GetSize" "', argument " "1"" of type '" "lldb::SBTypeList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeList * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetSize();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBTypeList(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeList *arg1 = (lldb::SBTypeList *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBTypeList",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeList, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBTypeList" "', argument " "1"" of type '" "lldb::SBTypeList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeList * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBTypeList_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBTypeList, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBTypeCategory__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeCategory *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBTypeCategory")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBTypeCategory *)new lldb::SBTypeCategory();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBTypeCategory, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBTypeCategory__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeCategory *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBTypeCategory *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBTypeCategory",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBTypeCategory,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBTypeCategory" "', argument " "1"" of type '" "lldb::SBTypeCategory const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBTypeCategory" "', argument " "1"" of type '" "lldb::SBTypeCategory const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeCategory * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBTypeCategory *)new lldb::SBTypeCategory((lldb::SBTypeCategory const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBTypeCategory, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBTypeCategory(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBTypeCategory__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBTypeCategory, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBTypeCategory__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBTypeCategory'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBTypeCategory()\n"
    "    lldb::SBTypeCategory(lldb::SBTypeCategory const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBTypeCategory(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeCategory *arg1 = (lldb::SBTypeCategory *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBTypeCategory",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeCategory, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBTypeCategory" "', argument " "1"" of type '" "lldb::SBTypeCategory *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeCategory * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeCategory_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeCategory *arg1 = (lldb::SBTypeCategory *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeCategory_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeCategory, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeCategory_IsValid" "', argument " "1"" of type '" "lldb::SBTypeCategory const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeCategory * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBTypeCategory const *)arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeCategory_GetEnabled(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeCategory *arg1 = (lldb::SBTypeCategory *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeCategory_GetEnabled",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeCategory, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeCategory_GetEnabled" "', argument " "1"" of type '" "lldb::SBTypeCategory *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeCategory * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetEnabled();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeCategory_SetEnabled(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeCategory *arg1 = (lldb::SBTypeCategory *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeCategory_SetEnabled",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeCategory, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeCategory_SetEnabled" "', argument " "1"" of type '" "lldb::SBTypeCategory *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeCategory * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBTypeCategory_SetEnabled" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetEnabled(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeCategory_GetName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeCategory *arg1 = (lldb::SBTypeCategory *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeCategory_GetName",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeCategory, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeCategory_GetName" "', argument " "1"" of type '" "lldb::SBTypeCategory *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeCategory * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetName();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeCategory_GetLanguageAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeCategory *arg1 = (lldb::SBTypeCategory *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::LanguageType result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeCategory_GetLanguageAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeCategory, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeCategory_GetLanguageAtIndex" "', argument " "1"" of type '" "lldb::SBTypeCategory *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeCategory * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBTypeCategory_GetLanguageAtIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::LanguageType)(arg1)->GetLanguageAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeCategory_GetNumLanguages(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeCategory *arg1 = (lldb::SBTypeCategory *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeCategory_GetNumLanguages",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeCategory, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeCategory_GetNumLanguages" "', argument " "1"" of type '" "lldb::SBTypeCategory *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeCategory * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetNumLanguages();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeCategory_AddLanguage(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeCategory *arg1 = (lldb::SBTypeCategory *) 0 ;
  lldb::LanguageType arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeCategory_AddLanguage",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeCategory, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeCategory_AddLanguage" "', argument " "1"" of type '" "lldb::SBTypeCategory *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeCategory * >(argp1);
  ecode2 = SWIG_AsVal_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBTypeCategory_AddLanguage" "', argument " "2"" of type '" "lldb::LanguageType""'");
  } 
  arg2 = static_cast< lldb::LanguageType >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->AddLanguage(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeCategory_GetDescription(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeCategory *arg1 = (lldb::SBTypeCategory *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  lldb::DescriptionLevel arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  int val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBTypeCategory_GetDescription",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeCategory, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeCategory_GetDescription" "', argument " "1"" of type '" "lldb::SBTypeCategory *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeCategory * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTypeCategory_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTypeCategory_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  ecode3 = SWIG_AsVal_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBTypeCategory_GetDescription" "', argument " "3"" of type '" "lldb::DescriptionLevel""'");
  } 
  arg3 = static_cast< lldb::DescriptionLevel >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetDescription(*arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeCategory_GetNumFormats(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeCategory *arg1 = (lldb::SBTypeCategory *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeCategory_GetNumFormats",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeCategory, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeCategory_GetNumFormats" "', argument " "1"" of type '" "lldb::SBTypeCategory *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeCategory * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetNumFormats();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeCategory_GetNumSummaries(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeCategory *arg1 = (lldb::SBTypeCategory *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeCategory_GetNumSummaries",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeCategory, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeCategory_GetNumSummaries" "', argument " "1"" of type '" "lldb::SBTypeCategory *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeCategory * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetNumSummaries();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeCategory_GetNumFilters(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeCategory *arg1 = (lldb::SBTypeCategory *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeCategory_GetNumFilters",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeCategory, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeCategory_GetNumFilters" "', argument " "1"" of type '" "lldb::SBTypeCategory *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeCategory * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetNumFilters();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeCategory_GetNumSynthetics(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeCategory *arg1 = (lldb::SBTypeCategory *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeCategory_GetNumSynthetics",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeCategory, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeCategory_GetNumSynthetics" "', argument " "1"" of type '" "lldb::SBTypeCategory *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeCategory * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetNumSynthetics();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeCategory_GetTypeNameSpecifierForFilterAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeCategory *arg1 = (lldb::SBTypeCategory *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBTypeNameSpecifier result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeCategory_GetTypeNameSpecifierForFilterAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeCategory, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeCategory_GetTypeNameSpecifierForFilterAtIndex" "', argument " "1"" of type '" "lldb::SBTypeCategory *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeCategory * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBTypeCategory_GetTypeNameSpecifierForFilterAtIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetTypeNameSpecifierForFilterAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTypeNameSpecifier(static_cast< const lldb::SBTypeNameSpecifier& >(result))), SWIGTYPE_p_lldb__SBTypeNameSpecifier, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeCategory_GetTypeNameSpecifierForFormatAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeCategory *arg1 = (lldb::SBTypeCategory *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBTypeNameSpecifier result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeCategory_GetTypeNameSpecifierForFormatAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeCategory, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeCategory_GetTypeNameSpecifierForFormatAtIndex" "', argument " "1"" of type '" "lldb::SBTypeCategory *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeCategory * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBTypeCategory_GetTypeNameSpecifierForFormatAtIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetTypeNameSpecifierForFormatAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTypeNameSpecifier(static_cast< const lldb::SBTypeNameSpecifier& >(result))), SWIGTYPE_p_lldb__SBTypeNameSpecifier, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeCategory_GetTypeNameSpecifierForSummaryAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeCategory *arg1 = (lldb::SBTypeCategory *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBTypeNameSpecifier result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeCategory_GetTypeNameSpecifierForSummaryAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeCategory, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeCategory_GetTypeNameSpecifierForSummaryAtIndex" "', argument " "1"" of type '" "lldb::SBTypeCategory *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeCategory * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBTypeCategory_GetTypeNameSpecifierForSummaryAtIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetTypeNameSpecifierForSummaryAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTypeNameSpecifier(static_cast< const lldb::SBTypeNameSpecifier& >(result))), SWIGTYPE_p_lldb__SBTypeNameSpecifier, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeCategory_GetTypeNameSpecifierForSyntheticAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeCategory *arg1 = (lldb::SBTypeCategory *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBTypeNameSpecifier result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeCategory_GetTypeNameSpecifierForSyntheticAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeCategory, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeCategory_GetTypeNameSpecifierForSyntheticAtIndex" "', argument " "1"" of type '" "lldb::SBTypeCategory *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeCategory * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBTypeCategory_GetTypeNameSpecifierForSyntheticAtIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetTypeNameSpecifierForSyntheticAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTypeNameSpecifier(static_cast< const lldb::SBTypeNameSpecifier& >(result))), SWIGTYPE_p_lldb__SBTypeNameSpecifier, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeCategory_GetFilterForType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeCategory *arg1 = (lldb::SBTypeCategory *) 0 ;
  lldb::SBTypeNameSpecifier arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBTypeFilter result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeCategory_GetFilterForType",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeCategory, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeCategory_GetFilterForType" "', argument " "1"" of type '" "lldb::SBTypeCategory *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeCategory * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTypeNameSpecifier,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTypeCategory_GetFilterForType" "', argument " "2"" of type '" "lldb::SBTypeNameSpecifier""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTypeCategory_GetFilterForType" "', argument " "2"" of type '" "lldb::SBTypeNameSpecifier""'");
    } else {
      lldb::SBTypeNameSpecifier * temp = reinterpret_cast< lldb::SBTypeNameSpecifier * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetFilterForType(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTypeFilter(static_cast< const lldb::SBTypeFilter& >(result))), SWIGTYPE_p_lldb__SBTypeFilter, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeCategory_GetFormatForType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeCategory *arg1 = (lldb::SBTypeCategory *) 0 ;
  lldb::SBTypeNameSpecifier arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBTypeFormat result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeCategory_GetFormatForType",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeCategory, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeCategory_GetFormatForType" "', argument " "1"" of type '" "lldb::SBTypeCategory *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeCategory * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTypeNameSpecifier,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTypeCategory_GetFormatForType" "', argument " "2"" of type '" "lldb::SBTypeNameSpecifier""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTypeCategory_GetFormatForType" "', argument " "2"" of type '" "lldb::SBTypeNameSpecifier""'");
    } else {
      lldb::SBTypeNameSpecifier * temp = reinterpret_cast< lldb::SBTypeNameSpecifier * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetFormatForType(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTypeFormat(static_cast< const lldb::SBTypeFormat& >(result))), SWIGTYPE_p_lldb__SBTypeFormat, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeCategory_GetSummaryForType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeCategory *arg1 = (lldb::SBTypeCategory *) 0 ;
  lldb::SBTypeNameSpecifier arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBTypeSummary result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeCategory_GetSummaryForType",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeCategory, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeCategory_GetSummaryForType" "', argument " "1"" of type '" "lldb::SBTypeCategory *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeCategory * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTypeNameSpecifier,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTypeCategory_GetSummaryForType" "', argument " "2"" of type '" "lldb::SBTypeNameSpecifier""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTypeCategory_GetSummaryForType" "', argument " "2"" of type '" "lldb::SBTypeNameSpecifier""'");
    } else {
      lldb::SBTypeNameSpecifier * temp = reinterpret_cast< lldb::SBTypeNameSpecifier * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetSummaryForType(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTypeSummary(static_cast< const lldb::SBTypeSummary& >(result))), SWIGTYPE_p_lldb__SBTypeSummary, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeCategory_GetSyntheticForType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeCategory *arg1 = (lldb::SBTypeCategory *) 0 ;
  lldb::SBTypeNameSpecifier arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBTypeSynthetic result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeCategory_GetSyntheticForType",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeCategory, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeCategory_GetSyntheticForType" "', argument " "1"" of type '" "lldb::SBTypeCategory *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeCategory * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTypeNameSpecifier,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTypeCategory_GetSyntheticForType" "', argument " "2"" of type '" "lldb::SBTypeNameSpecifier""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTypeCategory_GetSyntheticForType" "', argument " "2"" of type '" "lldb::SBTypeNameSpecifier""'");
    } else {
      lldb::SBTypeNameSpecifier * temp = reinterpret_cast< lldb::SBTypeNameSpecifier * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetSyntheticForType(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTypeSynthetic(static_cast< const lldb::SBTypeSynthetic& >(result))), SWIGTYPE_p_lldb__SBTypeSynthetic, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeCategory_GetFilterAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeCategory *arg1 = (lldb::SBTypeCategory *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBTypeFilter result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeCategory_GetFilterAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeCategory, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeCategory_GetFilterAtIndex" "', argument " "1"" of type '" "lldb::SBTypeCategory *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeCategory * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBTypeCategory_GetFilterAtIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetFilterAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTypeFilter(static_cast< const lldb::SBTypeFilter& >(result))), SWIGTYPE_p_lldb__SBTypeFilter, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeCategory_GetFormatAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeCategory *arg1 = (lldb::SBTypeCategory *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBTypeFormat result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeCategory_GetFormatAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeCategory, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeCategory_GetFormatAtIndex" "', argument " "1"" of type '" "lldb::SBTypeCategory *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeCategory * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBTypeCategory_GetFormatAtIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetFormatAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTypeFormat(static_cast< const lldb::SBTypeFormat& >(result))), SWIGTYPE_p_lldb__SBTypeFormat, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeCategory_GetSummaryAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeCategory *arg1 = (lldb::SBTypeCategory *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBTypeSummary result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeCategory_GetSummaryAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeCategory, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeCategory_GetSummaryAtIndex" "', argument " "1"" of type '" "lldb::SBTypeCategory *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeCategory * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBTypeCategory_GetSummaryAtIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetSummaryAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTypeSummary(static_cast< const lldb::SBTypeSummary& >(result))), SWIGTYPE_p_lldb__SBTypeSummary, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeCategory_GetSyntheticAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeCategory *arg1 = (lldb::SBTypeCategory *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBTypeSynthetic result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeCategory_GetSyntheticAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeCategory, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeCategory_GetSyntheticAtIndex" "', argument " "1"" of type '" "lldb::SBTypeCategory *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeCategory * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBTypeCategory_GetSyntheticAtIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetSyntheticAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTypeSynthetic(static_cast< const lldb::SBTypeSynthetic& >(result))), SWIGTYPE_p_lldb__SBTypeSynthetic, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeCategory_AddTypeFormat(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeCategory *arg1 = (lldb::SBTypeCategory *) 0 ;
  lldb::SBTypeNameSpecifier arg2 ;
  lldb::SBTypeFormat arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  void *argp3 ;
  int res3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBTypeCategory_AddTypeFormat",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeCategory, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeCategory_AddTypeFormat" "', argument " "1"" of type '" "lldb::SBTypeCategory *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeCategory * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTypeNameSpecifier,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTypeCategory_AddTypeFormat" "', argument " "2"" of type '" "lldb::SBTypeNameSpecifier""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTypeCategory_AddTypeFormat" "', argument " "2"" of type '" "lldb::SBTypeNameSpecifier""'");
    } else {
      lldb::SBTypeNameSpecifier * temp = reinterpret_cast< lldb::SBTypeNameSpecifier * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  {
    res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBTypeFormat,  0  | 0);
    if (!SWIG_IsOK(res3)) {
      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBTypeCategory_AddTypeFormat" "', argument " "3"" of type '" "lldb::SBTypeFormat""'"); 
    }  
    if (!argp3) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTypeCategory_AddTypeFormat" "', argument " "3"" of type '" "lldb::SBTypeFormat""'");
    } else {
      lldb::SBTypeFormat * temp = reinterpret_cast< lldb::SBTypeFormat * >(argp3);
      arg3 = *temp;
      if (SWIG_IsNewObj(res3)) delete temp;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->AddTypeFormat(arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeCategory_DeleteTypeFormat(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeCategory *arg1 = (lldb::SBTypeCategory *) 0 ;
  lldb::SBTypeNameSpecifier arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeCategory_DeleteTypeFormat",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeCategory, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeCategory_DeleteTypeFormat" "', argument " "1"" of type '" "lldb::SBTypeCategory *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeCategory * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTypeNameSpecifier,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTypeCategory_DeleteTypeFormat" "', argument " "2"" of type '" "lldb::SBTypeNameSpecifier""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTypeCategory_DeleteTypeFormat" "', argument " "2"" of type '" "lldb::SBTypeNameSpecifier""'");
    } else {
      lldb::SBTypeNameSpecifier * temp = reinterpret_cast< lldb::SBTypeNameSpecifier * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->DeleteTypeFormat(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeCategory_AddTypeSummary(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeCategory *arg1 = (lldb::SBTypeCategory *) 0 ;
  lldb::SBTypeNameSpecifier arg2 ;
  lldb::SBTypeSummary arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  void *argp3 ;
  int res3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBTypeCategory_AddTypeSummary",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeCategory, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeCategory_AddTypeSummary" "', argument " "1"" of type '" "lldb::SBTypeCategory *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeCategory * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTypeNameSpecifier,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTypeCategory_AddTypeSummary" "', argument " "2"" of type '" "lldb::SBTypeNameSpecifier""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTypeCategory_AddTypeSummary" "', argument " "2"" of type '" "lldb::SBTypeNameSpecifier""'");
    } else {
      lldb::SBTypeNameSpecifier * temp = reinterpret_cast< lldb::SBTypeNameSpecifier * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  {
    res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBTypeSummary,  0  | 0);
    if (!SWIG_IsOK(res3)) {
      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBTypeCategory_AddTypeSummary" "', argument " "3"" of type '" "lldb::SBTypeSummary""'"); 
    }  
    if (!argp3) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTypeCategory_AddTypeSummary" "', argument " "3"" of type '" "lldb::SBTypeSummary""'");
    } else {
      lldb::SBTypeSummary * temp = reinterpret_cast< lldb::SBTypeSummary * >(argp3);
      arg3 = *temp;
      if (SWIG_IsNewObj(res3)) delete temp;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->AddTypeSummary(arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeCategory_DeleteTypeSummary(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeCategory *arg1 = (lldb::SBTypeCategory *) 0 ;
  lldb::SBTypeNameSpecifier arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeCategory_DeleteTypeSummary",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeCategory, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeCategory_DeleteTypeSummary" "', argument " "1"" of type '" "lldb::SBTypeCategory *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeCategory * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTypeNameSpecifier,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTypeCategory_DeleteTypeSummary" "', argument " "2"" of type '" "lldb::SBTypeNameSpecifier""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTypeCategory_DeleteTypeSummary" "', argument " "2"" of type '" "lldb::SBTypeNameSpecifier""'");
    } else {
      lldb::SBTypeNameSpecifier * temp = reinterpret_cast< lldb::SBTypeNameSpecifier * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->DeleteTypeSummary(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeCategory_AddTypeFilter(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeCategory *arg1 = (lldb::SBTypeCategory *) 0 ;
  lldb::SBTypeNameSpecifier arg2 ;
  lldb::SBTypeFilter arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  void *argp3 ;
  int res3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBTypeCategory_AddTypeFilter",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeCategory, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeCategory_AddTypeFilter" "', argument " "1"" of type '" "lldb::SBTypeCategory *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeCategory * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTypeNameSpecifier,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTypeCategory_AddTypeFilter" "', argument " "2"" of type '" "lldb::SBTypeNameSpecifier""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTypeCategory_AddTypeFilter" "', argument " "2"" of type '" "lldb::SBTypeNameSpecifier""'");
    } else {
      lldb::SBTypeNameSpecifier * temp = reinterpret_cast< lldb::SBTypeNameSpecifier * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  {
    res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBTypeFilter,  0  | 0);
    if (!SWIG_IsOK(res3)) {
      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBTypeCategory_AddTypeFilter" "', argument " "3"" of type '" "lldb::SBTypeFilter""'"); 
    }  
    if (!argp3) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTypeCategory_AddTypeFilter" "', argument " "3"" of type '" "lldb::SBTypeFilter""'");
    } else {
      lldb::SBTypeFilter * temp = reinterpret_cast< lldb::SBTypeFilter * >(argp3);
      arg3 = *temp;
      if (SWIG_IsNewObj(res3)) delete temp;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->AddTypeFilter(arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeCategory_DeleteTypeFilter(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeCategory *arg1 = (lldb::SBTypeCategory *) 0 ;
  lldb::SBTypeNameSpecifier arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeCategory_DeleteTypeFilter",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeCategory, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeCategory_DeleteTypeFilter" "', argument " "1"" of type '" "lldb::SBTypeCategory *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeCategory * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTypeNameSpecifier,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTypeCategory_DeleteTypeFilter" "', argument " "2"" of type '" "lldb::SBTypeNameSpecifier""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTypeCategory_DeleteTypeFilter" "', argument " "2"" of type '" "lldb::SBTypeNameSpecifier""'");
    } else {
      lldb::SBTypeNameSpecifier * temp = reinterpret_cast< lldb::SBTypeNameSpecifier * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->DeleteTypeFilter(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeCategory_AddTypeSynthetic(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeCategory *arg1 = (lldb::SBTypeCategory *) 0 ;
  lldb::SBTypeNameSpecifier arg2 ;
  lldb::SBTypeSynthetic arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  void *argp3 ;
  int res3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBTypeCategory_AddTypeSynthetic",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeCategory, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeCategory_AddTypeSynthetic" "', argument " "1"" of type '" "lldb::SBTypeCategory *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeCategory * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTypeNameSpecifier,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTypeCategory_AddTypeSynthetic" "', argument " "2"" of type '" "lldb::SBTypeNameSpecifier""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTypeCategory_AddTypeSynthetic" "', argument " "2"" of type '" "lldb::SBTypeNameSpecifier""'");
    } else {
      lldb::SBTypeNameSpecifier * temp = reinterpret_cast< lldb::SBTypeNameSpecifier * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  {
    res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBTypeSynthetic,  0  | 0);
    if (!SWIG_IsOK(res3)) {
      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBTypeCategory_AddTypeSynthetic" "', argument " "3"" of type '" "lldb::SBTypeSynthetic""'"); 
    }  
    if (!argp3) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTypeCategory_AddTypeSynthetic" "', argument " "3"" of type '" "lldb::SBTypeSynthetic""'");
    } else {
      lldb::SBTypeSynthetic * temp = reinterpret_cast< lldb::SBTypeSynthetic * >(argp3);
      arg3 = *temp;
      if (SWIG_IsNewObj(res3)) delete temp;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->AddTypeSynthetic(arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeCategory_DeleteTypeSynthetic(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeCategory *arg1 = (lldb::SBTypeCategory *) 0 ;
  lldb::SBTypeNameSpecifier arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeCategory_DeleteTypeSynthetic",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeCategory, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeCategory_DeleteTypeSynthetic" "', argument " "1"" of type '" "lldb::SBTypeCategory *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeCategory * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTypeNameSpecifier,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTypeCategory_DeleteTypeSynthetic" "', argument " "2"" of type '" "lldb::SBTypeNameSpecifier""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTypeCategory_DeleteTypeSynthetic" "', argument " "2"" of type '" "lldb::SBTypeNameSpecifier""'");
    } else {
      lldb::SBTypeNameSpecifier * temp = reinterpret_cast< lldb::SBTypeNameSpecifier * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->DeleteTypeSynthetic(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeCategory___str__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeCategory *arg1 = (lldb::SBTypeCategory *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeCategory___str__",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeCategory, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeCategory___str__" "', argument " "1"" of type '" "lldb::SBTypeCategory *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeCategory * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (PyObject *)lldb_SBTypeCategory___str__(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = result;
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBTypeCategory_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBTypeCategory, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBTypeEnumMember__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeEnumMember *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBTypeEnumMember")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBTypeEnumMember *)new lldb::SBTypeEnumMember();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBTypeEnumMember, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBTypeEnumMember__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeEnumMember *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBTypeEnumMember *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBTypeEnumMember",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBTypeEnumMember,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBTypeEnumMember" "', argument " "1"" of type '" "lldb::SBTypeEnumMember const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBTypeEnumMember" "', argument " "1"" of type '" "lldb::SBTypeEnumMember const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeEnumMember * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBTypeEnumMember *)new lldb::SBTypeEnumMember((lldb::SBTypeEnumMember const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBTypeEnumMember, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBTypeEnumMember(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBTypeEnumMember__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBTypeEnumMember, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBTypeEnumMember__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBTypeEnumMember'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBTypeEnumMember()\n"
    "    lldb::SBTypeEnumMember(lldb::SBTypeEnumMember const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBTypeEnumMember(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeEnumMember *arg1 = (lldb::SBTypeEnumMember *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBTypeEnumMember",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeEnumMember, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBTypeEnumMember" "', argument " "1"" of type '" "lldb::SBTypeEnumMember *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeEnumMember * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeEnumMember_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeEnumMember *arg1 = (lldb::SBTypeEnumMember *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeEnumMember_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeEnumMember, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeEnumMember_IsValid" "', argument " "1"" of type '" "lldb::SBTypeEnumMember const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeEnumMember * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBTypeEnumMember const *)arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeEnumMember_GetValueAsSigned(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeEnumMember *arg1 = (lldb::SBTypeEnumMember *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  int64_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeEnumMember_GetValueAsSigned",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeEnumMember, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeEnumMember_GetValueAsSigned" "', argument " "1"" of type '" "lldb::SBTypeEnumMember *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeEnumMember * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (int64_t)(arg1)->GetValueAsSigned();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_long_SS_long(static_cast< long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeEnumMember_GetValueAsUnsigned(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeEnumMember *arg1 = (lldb::SBTypeEnumMember *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint64_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeEnumMember_GetValueAsUnsigned",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeEnumMember, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeEnumMember_GetValueAsUnsigned" "', argument " "1"" of type '" "lldb::SBTypeEnumMember *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeEnumMember * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint64_t)(arg1)->GetValueAsUnsigned();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeEnumMember_GetName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeEnumMember *arg1 = (lldb::SBTypeEnumMember *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeEnumMember_GetName",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeEnumMember, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeEnumMember_GetName" "', argument " "1"" of type '" "lldb::SBTypeEnumMember *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeEnumMember * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetName();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeEnumMember_GetType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeEnumMember *arg1 = (lldb::SBTypeEnumMember *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBType result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeEnumMember_GetType",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeEnumMember, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeEnumMember_GetType" "', argument " "1"" of type '" "lldb::SBTypeEnumMember *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeEnumMember * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetType();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBType(static_cast< const lldb::SBType& >(result))), SWIGTYPE_p_lldb__SBType, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeEnumMember_GetDescription(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeEnumMember *arg1 = (lldb::SBTypeEnumMember *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  lldb::DescriptionLevel arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  int val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBTypeEnumMember_GetDescription",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeEnumMember, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeEnumMember_GetDescription" "', argument " "1"" of type '" "lldb::SBTypeEnumMember *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeEnumMember * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTypeEnumMember_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTypeEnumMember_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  ecode3 = SWIG_AsVal_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBTypeEnumMember_GetDescription" "', argument " "3"" of type '" "lldb::DescriptionLevel""'");
  } 
  arg3 = static_cast< lldb::DescriptionLevel >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetDescription(*arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeEnumMember___str__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeEnumMember *arg1 = (lldb::SBTypeEnumMember *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeEnumMember___str__",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeEnumMember, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeEnumMember___str__" "', argument " "1"" of type '" "lldb::SBTypeEnumMember *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeEnumMember * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (PyObject *)lldb_SBTypeEnumMember___str__(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = result;
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBTypeEnumMember_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBTypeEnumMember, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBTypeEnumMemberList__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeEnumMemberList *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBTypeEnumMemberList")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBTypeEnumMemberList *)new lldb::SBTypeEnumMemberList();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBTypeEnumMemberList, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBTypeEnumMemberList__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeEnumMemberList *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBTypeEnumMemberList *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBTypeEnumMemberList",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBTypeEnumMemberList,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBTypeEnumMemberList" "', argument " "1"" of type '" "lldb::SBTypeEnumMemberList const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBTypeEnumMemberList" "', argument " "1"" of type '" "lldb::SBTypeEnumMemberList const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeEnumMemberList * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBTypeEnumMemberList *)new lldb::SBTypeEnumMemberList((lldb::SBTypeEnumMemberList const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBTypeEnumMemberList, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBTypeEnumMemberList(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBTypeEnumMemberList__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBTypeEnumMemberList, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBTypeEnumMemberList__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBTypeEnumMemberList'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBTypeEnumMemberList()\n"
    "    lldb::SBTypeEnumMemberList(lldb::SBTypeEnumMemberList const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBTypeEnumMemberList(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeEnumMemberList *arg1 = (lldb::SBTypeEnumMemberList *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBTypeEnumMemberList",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeEnumMemberList, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBTypeEnumMemberList" "', argument " "1"" of type '" "lldb::SBTypeEnumMemberList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeEnumMemberList * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeEnumMemberList_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeEnumMemberList *arg1 = (lldb::SBTypeEnumMemberList *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeEnumMemberList_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeEnumMemberList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeEnumMemberList_IsValid" "', argument " "1"" of type '" "lldb::SBTypeEnumMemberList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeEnumMemberList * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeEnumMemberList_Append(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeEnumMemberList *arg1 = (lldb::SBTypeEnumMemberList *) 0 ;
  lldb::SBTypeEnumMember arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeEnumMemberList_Append",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeEnumMemberList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeEnumMemberList_Append" "', argument " "1"" of type '" "lldb::SBTypeEnumMemberList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeEnumMemberList * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTypeEnumMember,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTypeEnumMemberList_Append" "', argument " "2"" of type '" "lldb::SBTypeEnumMember""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTypeEnumMemberList_Append" "', argument " "2"" of type '" "lldb::SBTypeEnumMember""'");
    } else {
      lldb::SBTypeEnumMember * temp = reinterpret_cast< lldb::SBTypeEnumMember * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->Append(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeEnumMemberList_GetTypeEnumMemberAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeEnumMemberList *arg1 = (lldb::SBTypeEnumMemberList *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBTypeEnumMember result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeEnumMemberList_GetTypeEnumMemberAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeEnumMemberList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeEnumMemberList_GetTypeEnumMemberAtIndex" "', argument " "1"" of type '" "lldb::SBTypeEnumMemberList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeEnumMemberList * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBTypeEnumMemberList_GetTypeEnumMemberAtIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetTypeEnumMemberAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTypeEnumMember(static_cast< const lldb::SBTypeEnumMember& >(result))), SWIGTYPE_p_lldb__SBTypeEnumMember, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeEnumMemberList_GetSize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeEnumMemberList *arg1 = (lldb::SBTypeEnumMemberList *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeEnumMemberList_GetSize",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeEnumMemberList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeEnumMemberList_GetSize" "', argument " "1"" of type '" "lldb::SBTypeEnumMemberList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeEnumMemberList * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetSize();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBTypeEnumMemberList_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBTypeEnumMemberList, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBTypeFilter__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeFilter *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBTypeFilter")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBTypeFilter *)new lldb::SBTypeFilter();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBTypeFilter, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBTypeFilter__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  uint32_t arg1 ;
  unsigned int val1 ;
  int ecode1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBTypeFilter *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBTypeFilter",&obj0)) SWIG_fail;
  ecode1 = SWIG_AsVal_unsigned_SS_int(obj0, &val1);
  if (!SWIG_IsOK(ecode1)) {
    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_SBTypeFilter" "', argument " "1"" of type '" "uint32_t""'");
  } 
  arg1 = static_cast< uint32_t >(val1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBTypeFilter *)new lldb::SBTypeFilter(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBTypeFilter, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBTypeFilter__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeFilter *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBTypeFilter *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBTypeFilter",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBTypeFilter,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBTypeFilter" "', argument " "1"" of type '" "lldb::SBTypeFilter const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBTypeFilter" "', argument " "1"" of type '" "lldb::SBTypeFilter const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeFilter * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBTypeFilter *)new lldb::SBTypeFilter((lldb::SBTypeFilter const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBTypeFilter, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBTypeFilter(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBTypeFilter__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBTypeFilter, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBTypeFilter__SWIG_2(self, args);
    }
  }
  if (argc == 1) {
    int _v;
    {
      int res = SWIG_AsVal_unsigned_SS_int(argv[0], NULL);
      _v = SWIG_CheckState(res);
    }
    if (_v) {
      return _wrap_new_SBTypeFilter__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBTypeFilter'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBTypeFilter()\n"
    "    lldb::SBTypeFilter(uint32_t)\n"
    "    lldb::SBTypeFilter(lldb::SBTypeFilter const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBTypeFilter(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeFilter *arg1 = (lldb::SBTypeFilter *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBTypeFilter",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeFilter, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBTypeFilter" "', argument " "1"" of type '" "lldb::SBTypeFilter *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeFilter * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeFilter_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeFilter *arg1 = (lldb::SBTypeFilter *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeFilter_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeFilter, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeFilter_IsValid" "', argument " "1"" of type '" "lldb::SBTypeFilter const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeFilter * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBTypeFilter const *)arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeFilter_IsEqualTo(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeFilter *arg1 = (lldb::SBTypeFilter *) 0 ;
  lldb::SBTypeFilter *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeFilter_IsEqualTo",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeFilter, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeFilter_IsEqualTo" "', argument " "1"" of type '" "lldb::SBTypeFilter *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeFilter * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTypeFilter,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTypeFilter_IsEqualTo" "', argument " "2"" of type '" "lldb::SBTypeFilter &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTypeFilter_IsEqualTo" "', argument " "2"" of type '" "lldb::SBTypeFilter &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBTypeFilter * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsEqualTo(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeFilter_GetNumberOfExpressionPaths(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeFilter *arg1 = (lldb::SBTypeFilter *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeFilter_GetNumberOfExpressionPaths",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeFilter, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeFilter_GetNumberOfExpressionPaths" "', argument " "1"" of type '" "lldb::SBTypeFilter *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeFilter * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetNumberOfExpressionPaths();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeFilter_GetExpressionPathAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeFilter *arg1 = (lldb::SBTypeFilter *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeFilter_GetExpressionPathAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeFilter, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeFilter_GetExpressionPathAtIndex" "', argument " "1"" of type '" "lldb::SBTypeFilter *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeFilter * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBTypeFilter_GetExpressionPathAtIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetExpressionPathAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeFilter_ReplaceExpressionPathAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeFilter *arg1 = (lldb::SBTypeFilter *) 0 ;
  uint32_t arg2 ;
  char *arg3 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  int res3 ;
  char *buf3 = 0 ;
  int alloc3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBTypeFilter_ReplaceExpressionPathAtIndex",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeFilter, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeFilter_ReplaceExpressionPathAtIndex" "', argument " "1"" of type '" "lldb::SBTypeFilter *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeFilter * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBTypeFilter_ReplaceExpressionPathAtIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3);
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBTypeFilter_ReplaceExpressionPathAtIndex" "', argument " "3"" of type '" "char const *""'");
  }
  arg3 = reinterpret_cast< char * >(buf3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->ReplaceExpressionPathAtIndex(arg2,(char const *)arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  return resultobj;
fail:
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeFilter_AppendExpressionPath(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeFilter *arg1 = (lldb::SBTypeFilter *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeFilter_AppendExpressionPath",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeFilter, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeFilter_AppendExpressionPath" "', argument " "1"" of type '" "lldb::SBTypeFilter *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeFilter * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTypeFilter_AppendExpressionPath" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->AppendExpressionPath((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeFilter_Clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeFilter *arg1 = (lldb::SBTypeFilter *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeFilter_Clear",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeFilter, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeFilter_Clear" "', argument " "1"" of type '" "lldb::SBTypeFilter *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeFilter * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->Clear();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeFilter_GetOptions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeFilter *arg1 = (lldb::SBTypeFilter *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeFilter_GetOptions",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeFilter, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeFilter_GetOptions" "', argument " "1"" of type '" "lldb::SBTypeFilter *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeFilter * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetOptions();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeFilter_SetOptions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeFilter *arg1 = (lldb::SBTypeFilter *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeFilter_SetOptions",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeFilter, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeFilter_SetOptions" "', argument " "1"" of type '" "lldb::SBTypeFilter *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeFilter * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBTypeFilter_SetOptions" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetOptions(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeFilter_GetDescription(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeFilter *arg1 = (lldb::SBTypeFilter *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  lldb::DescriptionLevel arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  int val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBTypeFilter_GetDescription",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeFilter, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeFilter_GetDescription" "', argument " "1"" of type '" "lldb::SBTypeFilter *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeFilter * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTypeFilter_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTypeFilter_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  ecode3 = SWIG_AsVal_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBTypeFilter_GetDescription" "', argument " "3"" of type '" "lldb::DescriptionLevel""'");
  } 
  arg3 = static_cast< lldb::DescriptionLevel >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetDescription(*arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeFilter___eq__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeFilter *arg1 = (lldb::SBTypeFilter *) 0 ;
  lldb::SBTypeFilter *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeFilter___eq__",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeFilter, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeFilter___eq__" "', argument " "1"" of type '" "lldb::SBTypeFilter *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeFilter * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTypeFilter,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTypeFilter___eq__" "', argument " "2"" of type '" "lldb::SBTypeFilter &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTypeFilter___eq__" "', argument " "2"" of type '" "lldb::SBTypeFilter &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBTypeFilter * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->operator ==(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeFilter___ne__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeFilter *arg1 = (lldb::SBTypeFilter *) 0 ;
  lldb::SBTypeFilter *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeFilter___ne__",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeFilter, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeFilter___ne__" "', argument " "1"" of type '" "lldb::SBTypeFilter *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeFilter * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTypeFilter,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTypeFilter___ne__" "', argument " "2"" of type '" "lldb::SBTypeFilter &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTypeFilter___ne__" "', argument " "2"" of type '" "lldb::SBTypeFilter &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBTypeFilter * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->operator !=(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeFilter___str__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeFilter *arg1 = (lldb::SBTypeFilter *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeFilter___str__",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeFilter, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeFilter___str__" "', argument " "1"" of type '" "lldb::SBTypeFilter *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeFilter * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (PyObject *)lldb_SBTypeFilter___str__(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = result;
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBTypeFilter_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBTypeFilter, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBTypeFormat__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeFormat *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBTypeFormat")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBTypeFormat *)new lldb::SBTypeFormat();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBTypeFormat, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBTypeFormat__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::Format arg1 ;
  uint32_t arg2 ;
  int val1 ;
  int ecode1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBTypeFormat *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:new_SBTypeFormat",&obj0,&obj1)) SWIG_fail;
  ecode1 = SWIG_AsVal_int(obj0, &val1);
  if (!SWIG_IsOK(ecode1)) {
    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_SBTypeFormat" "', argument " "1"" of type '" "lldb::Format""'");
  } 
  arg1 = static_cast< lldb::Format >(val1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_SBTypeFormat" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBTypeFormat *)new lldb::SBTypeFormat(arg1,arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBTypeFormat, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBTypeFormat__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::Format arg1 ;
  int val1 ;
  int ecode1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBTypeFormat *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBTypeFormat",&obj0)) SWIG_fail;
  ecode1 = SWIG_AsVal_int(obj0, &val1);
  if (!SWIG_IsOK(ecode1)) {
    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_SBTypeFormat" "', argument " "1"" of type '" "lldb::Format""'");
  } 
  arg1 = static_cast< lldb::Format >(val1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBTypeFormat *)new lldb::SBTypeFormat(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBTypeFormat, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBTypeFormat__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  char *arg1 = (char *) 0 ;
  uint32_t arg2 ;
  int res1 ;
  char *buf1 = 0 ;
  int alloc1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBTypeFormat *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:new_SBTypeFormat",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBTypeFormat" "', argument " "1"" of type '" "char const *""'");
  }
  arg1 = reinterpret_cast< char * >(buf1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_SBTypeFormat" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBTypeFormat *)new lldb::SBTypeFormat((char const *)arg1,arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBTypeFormat, SWIG_POINTER_NEW |  0 );
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return resultobj;
fail:
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBTypeFormat__SWIG_4(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  char *arg1 = (char *) 0 ;
  int res1 ;
  char *buf1 = 0 ;
  int alloc1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBTypeFormat *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBTypeFormat",&obj0)) SWIG_fail;
  res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBTypeFormat" "', argument " "1"" of type '" "char const *""'");
  }
  arg1 = reinterpret_cast< char * >(buf1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBTypeFormat *)new lldb::SBTypeFormat((char const *)arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBTypeFormat, SWIG_POINTER_NEW |  0 );
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return resultobj;
fail:
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBTypeFormat__SWIG_5(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeFormat *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBTypeFormat *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBTypeFormat",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBTypeFormat,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBTypeFormat" "', argument " "1"" of type '" "lldb::SBTypeFormat const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBTypeFormat" "', argument " "1"" of type '" "lldb::SBTypeFormat const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeFormat * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBTypeFormat *)new lldb::SBTypeFormat((lldb::SBTypeFormat const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBTypeFormat, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBTypeFormat(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[3];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 2); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBTypeFormat__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBTypeFormat, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBTypeFormat__SWIG_5(self, args);
    }
  }
  if (argc == 1) {
    int _v;
    {
      int res = SWIG_AsVal_int(argv[0], NULL);
      _v = SWIG_CheckState(res);
    }
    if (_v) {
      return _wrap_new_SBTypeFormat__SWIG_2(self, args);
    }
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_AsCharPtrAndSize(argv[0], 0, NULL, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBTypeFormat__SWIG_4(self, args);
    }
  }
  if (argc == 2) {
    int _v;
    {
      int res = SWIG_AsVal_int(argv[0], NULL);
      _v = SWIG_CheckState(res);
    }
    if (_v) {
      {
        int res = SWIG_AsVal_unsigned_SS_int(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        return _wrap_new_SBTypeFormat__SWIG_1(self, args);
      }
    }
  }
  if (argc == 2) {
    int _v;
    int res = SWIG_AsCharPtrAndSize(argv[0], 0, NULL, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_unsigned_SS_int(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        return _wrap_new_SBTypeFormat__SWIG_3(self, args);
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBTypeFormat'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBTypeFormat()\n"
    "    lldb::SBTypeFormat(lldb::Format,uint32_t)\n"
    "    lldb::SBTypeFormat(lldb::Format)\n"
    "    lldb::SBTypeFormat(char const *,uint32_t)\n"
    "    lldb::SBTypeFormat(char const *)\n"
    "    lldb::SBTypeFormat(lldb::SBTypeFormat const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBTypeFormat(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeFormat *arg1 = (lldb::SBTypeFormat *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBTypeFormat",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeFormat, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBTypeFormat" "', argument " "1"" of type '" "lldb::SBTypeFormat *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeFormat * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeFormat_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeFormat *arg1 = (lldb::SBTypeFormat *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeFormat_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeFormat, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeFormat_IsValid" "', argument " "1"" of type '" "lldb::SBTypeFormat const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeFormat * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBTypeFormat const *)arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeFormat_IsEqualTo(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeFormat *arg1 = (lldb::SBTypeFormat *) 0 ;
  lldb::SBTypeFormat *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeFormat_IsEqualTo",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeFormat, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeFormat_IsEqualTo" "', argument " "1"" of type '" "lldb::SBTypeFormat *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeFormat * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTypeFormat,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTypeFormat_IsEqualTo" "', argument " "2"" of type '" "lldb::SBTypeFormat &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTypeFormat_IsEqualTo" "', argument " "2"" of type '" "lldb::SBTypeFormat &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBTypeFormat * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsEqualTo(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeFormat_GetFormat(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeFormat *arg1 = (lldb::SBTypeFormat *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::Format result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeFormat_GetFormat",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeFormat, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeFormat_GetFormat" "', argument " "1"" of type '" "lldb::SBTypeFormat *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeFormat * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::Format)(arg1)->GetFormat();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeFormat_GetTypeName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeFormat *arg1 = (lldb::SBTypeFormat *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeFormat_GetTypeName",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeFormat, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeFormat_GetTypeName" "', argument " "1"" of type '" "lldb::SBTypeFormat *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeFormat * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetTypeName();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeFormat_GetOptions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeFormat *arg1 = (lldb::SBTypeFormat *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeFormat_GetOptions",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeFormat, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeFormat_GetOptions" "', argument " "1"" of type '" "lldb::SBTypeFormat *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeFormat * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetOptions();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeFormat_SetFormat(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeFormat *arg1 = (lldb::SBTypeFormat *) 0 ;
  lldb::Format arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeFormat_SetFormat",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeFormat, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeFormat_SetFormat" "', argument " "1"" of type '" "lldb::SBTypeFormat *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeFormat * >(argp1);
  ecode2 = SWIG_AsVal_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBTypeFormat_SetFormat" "', argument " "2"" of type '" "lldb::Format""'");
  } 
  arg2 = static_cast< lldb::Format >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetFormat(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeFormat_SetTypeName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeFormat *arg1 = (lldb::SBTypeFormat *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeFormat_SetTypeName",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeFormat, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeFormat_SetTypeName" "', argument " "1"" of type '" "lldb::SBTypeFormat *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeFormat * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTypeFormat_SetTypeName" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetTypeName((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeFormat_SetOptions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeFormat *arg1 = (lldb::SBTypeFormat *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeFormat_SetOptions",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeFormat, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeFormat_SetOptions" "', argument " "1"" of type '" "lldb::SBTypeFormat *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeFormat * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBTypeFormat_SetOptions" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetOptions(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeFormat_GetDescription(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeFormat *arg1 = (lldb::SBTypeFormat *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  lldb::DescriptionLevel arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  int val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBTypeFormat_GetDescription",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeFormat, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeFormat_GetDescription" "', argument " "1"" of type '" "lldb::SBTypeFormat *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeFormat * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTypeFormat_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTypeFormat_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  ecode3 = SWIG_AsVal_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBTypeFormat_GetDescription" "', argument " "3"" of type '" "lldb::DescriptionLevel""'");
  } 
  arg3 = static_cast< lldb::DescriptionLevel >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetDescription(*arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeFormat___eq__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeFormat *arg1 = (lldb::SBTypeFormat *) 0 ;
  lldb::SBTypeFormat *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeFormat___eq__",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeFormat, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeFormat___eq__" "', argument " "1"" of type '" "lldb::SBTypeFormat *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeFormat * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTypeFormat,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTypeFormat___eq__" "', argument " "2"" of type '" "lldb::SBTypeFormat &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTypeFormat___eq__" "', argument " "2"" of type '" "lldb::SBTypeFormat &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBTypeFormat * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->operator ==(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeFormat___ne__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeFormat *arg1 = (lldb::SBTypeFormat *) 0 ;
  lldb::SBTypeFormat *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeFormat___ne__",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeFormat, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeFormat___ne__" "', argument " "1"" of type '" "lldb::SBTypeFormat *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeFormat * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTypeFormat,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTypeFormat___ne__" "', argument " "2"" of type '" "lldb::SBTypeFormat &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTypeFormat___ne__" "', argument " "2"" of type '" "lldb::SBTypeFormat &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBTypeFormat * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->operator !=(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeFormat___str__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeFormat *arg1 = (lldb::SBTypeFormat *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeFormat___str__",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeFormat, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeFormat___str__" "', argument " "1"" of type '" "lldb::SBTypeFormat *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeFormat * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (PyObject *)lldb_SBTypeFormat___str__(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = result;
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBTypeFormat_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBTypeFormat, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBTypeNameSpecifier__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeNameSpecifier *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBTypeNameSpecifier")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBTypeNameSpecifier *)new lldb::SBTypeNameSpecifier();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBTypeNameSpecifier, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBTypeNameSpecifier__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  char *arg1 = (char *) 0 ;
  bool arg2 ;
  int res1 ;
  char *buf1 = 0 ;
  int alloc1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBTypeNameSpecifier *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:new_SBTypeNameSpecifier",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBTypeNameSpecifier" "', argument " "1"" of type '" "char const *""'");
  }
  arg1 = reinterpret_cast< char * >(buf1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_SBTypeNameSpecifier" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBTypeNameSpecifier *)new lldb::SBTypeNameSpecifier((char const *)arg1,arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBTypeNameSpecifier, SWIG_POINTER_NEW |  0 );
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return resultobj;
fail:
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBTypeNameSpecifier__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  char *arg1 = (char *) 0 ;
  int res1 ;
  char *buf1 = 0 ;
  int alloc1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBTypeNameSpecifier *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBTypeNameSpecifier",&obj0)) SWIG_fail;
  res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBTypeNameSpecifier" "', argument " "1"" of type '" "char const *""'");
  }
  arg1 = reinterpret_cast< char * >(buf1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBTypeNameSpecifier *)new lldb::SBTypeNameSpecifier((char const *)arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBTypeNameSpecifier, SWIG_POINTER_NEW |  0 );
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return resultobj;
fail:
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBTypeNameSpecifier__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBType arg1 ;
  void *argp1 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBTypeNameSpecifier *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBTypeNameSpecifier",&obj0)) SWIG_fail;
  {
    res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBType,  0  | 0);
    if (!SWIG_IsOK(res1)) {
      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBTypeNameSpecifier" "', argument " "1"" of type '" "lldb::SBType""'"); 
    }  
    if (!argp1) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBTypeNameSpecifier" "', argument " "1"" of type '" "lldb::SBType""'");
    } else {
      lldb::SBType * temp = reinterpret_cast< lldb::SBType * >(argp1);
      arg1 = *temp;
      if (SWIG_IsNewObj(res1)) delete temp;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBTypeNameSpecifier *)new lldb::SBTypeNameSpecifier(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBTypeNameSpecifier, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBTypeNameSpecifier__SWIG_4(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeNameSpecifier *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBTypeNameSpecifier *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBTypeNameSpecifier",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBTypeNameSpecifier,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBTypeNameSpecifier" "', argument " "1"" of type '" "lldb::SBTypeNameSpecifier const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBTypeNameSpecifier" "', argument " "1"" of type '" "lldb::SBTypeNameSpecifier const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeNameSpecifier * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBTypeNameSpecifier *)new lldb::SBTypeNameSpecifier((lldb::SBTypeNameSpecifier const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBTypeNameSpecifier, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBTypeNameSpecifier(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[3];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 2); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBTypeNameSpecifier__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBType, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBTypeNameSpecifier__SWIG_3(self, args);
    }
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBTypeNameSpecifier, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBTypeNameSpecifier__SWIG_4(self, args);
    }
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_AsCharPtrAndSize(argv[0], 0, NULL, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBTypeNameSpecifier__SWIG_2(self, args);
    }
  }
  if (argc == 2) {
    int _v;
    int res = SWIG_AsCharPtrAndSize(argv[0], 0, NULL, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_bool(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        return _wrap_new_SBTypeNameSpecifier__SWIG_1(self, args);
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBTypeNameSpecifier'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBTypeNameSpecifier()\n"
    "    lldb::SBTypeNameSpecifier(char const *,bool)\n"
    "    lldb::SBTypeNameSpecifier(char const *)\n"
    "    lldb::SBTypeNameSpecifier(lldb::SBType)\n"
    "    lldb::SBTypeNameSpecifier(lldb::SBTypeNameSpecifier const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBTypeNameSpecifier(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeNameSpecifier *arg1 = (lldb::SBTypeNameSpecifier *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBTypeNameSpecifier",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeNameSpecifier, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBTypeNameSpecifier" "', argument " "1"" of type '" "lldb::SBTypeNameSpecifier *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeNameSpecifier * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeNameSpecifier_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeNameSpecifier *arg1 = (lldb::SBTypeNameSpecifier *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeNameSpecifier_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeNameSpecifier, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeNameSpecifier_IsValid" "', argument " "1"" of type '" "lldb::SBTypeNameSpecifier const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeNameSpecifier * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBTypeNameSpecifier const *)arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeNameSpecifier_IsEqualTo(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeNameSpecifier *arg1 = (lldb::SBTypeNameSpecifier *) 0 ;
  lldb::SBTypeNameSpecifier *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeNameSpecifier_IsEqualTo",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeNameSpecifier, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeNameSpecifier_IsEqualTo" "', argument " "1"" of type '" "lldb::SBTypeNameSpecifier *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeNameSpecifier * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTypeNameSpecifier,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTypeNameSpecifier_IsEqualTo" "', argument " "2"" of type '" "lldb::SBTypeNameSpecifier &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTypeNameSpecifier_IsEqualTo" "', argument " "2"" of type '" "lldb::SBTypeNameSpecifier &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBTypeNameSpecifier * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsEqualTo(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeNameSpecifier_GetName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeNameSpecifier *arg1 = (lldb::SBTypeNameSpecifier *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeNameSpecifier_GetName",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeNameSpecifier, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeNameSpecifier_GetName" "', argument " "1"" of type '" "lldb::SBTypeNameSpecifier *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeNameSpecifier * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetName();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeNameSpecifier_GetType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeNameSpecifier *arg1 = (lldb::SBTypeNameSpecifier *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBType result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeNameSpecifier_GetType",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeNameSpecifier, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeNameSpecifier_GetType" "', argument " "1"" of type '" "lldb::SBTypeNameSpecifier *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeNameSpecifier * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetType();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBType(static_cast< const lldb::SBType& >(result))), SWIGTYPE_p_lldb__SBType, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeNameSpecifier_IsRegex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeNameSpecifier *arg1 = (lldb::SBTypeNameSpecifier *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeNameSpecifier_IsRegex",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeNameSpecifier, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeNameSpecifier_IsRegex" "', argument " "1"" of type '" "lldb::SBTypeNameSpecifier *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeNameSpecifier * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsRegex();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeNameSpecifier_GetDescription(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeNameSpecifier *arg1 = (lldb::SBTypeNameSpecifier *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  lldb::DescriptionLevel arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  int val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBTypeNameSpecifier_GetDescription",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeNameSpecifier, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeNameSpecifier_GetDescription" "', argument " "1"" of type '" "lldb::SBTypeNameSpecifier *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeNameSpecifier * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTypeNameSpecifier_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTypeNameSpecifier_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  ecode3 = SWIG_AsVal_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBTypeNameSpecifier_GetDescription" "', argument " "3"" of type '" "lldb::DescriptionLevel""'");
  } 
  arg3 = static_cast< lldb::DescriptionLevel >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetDescription(*arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeNameSpecifier___eq__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeNameSpecifier *arg1 = (lldb::SBTypeNameSpecifier *) 0 ;
  lldb::SBTypeNameSpecifier *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeNameSpecifier___eq__",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeNameSpecifier, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeNameSpecifier___eq__" "', argument " "1"" of type '" "lldb::SBTypeNameSpecifier *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeNameSpecifier * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTypeNameSpecifier,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTypeNameSpecifier___eq__" "', argument " "2"" of type '" "lldb::SBTypeNameSpecifier &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTypeNameSpecifier___eq__" "', argument " "2"" of type '" "lldb::SBTypeNameSpecifier &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBTypeNameSpecifier * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->operator ==(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeNameSpecifier___ne__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeNameSpecifier *arg1 = (lldb::SBTypeNameSpecifier *) 0 ;
  lldb::SBTypeNameSpecifier *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeNameSpecifier___ne__",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeNameSpecifier, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeNameSpecifier___ne__" "', argument " "1"" of type '" "lldb::SBTypeNameSpecifier *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeNameSpecifier * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTypeNameSpecifier,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTypeNameSpecifier___ne__" "', argument " "2"" of type '" "lldb::SBTypeNameSpecifier &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTypeNameSpecifier___ne__" "', argument " "2"" of type '" "lldb::SBTypeNameSpecifier &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBTypeNameSpecifier * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->operator !=(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeNameSpecifier___str__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeNameSpecifier *arg1 = (lldb::SBTypeNameSpecifier *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeNameSpecifier___str__",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeNameSpecifier, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeNameSpecifier___str__" "', argument " "1"" of type '" "lldb::SBTypeNameSpecifier *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeNameSpecifier * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (PyObject *)lldb_SBTypeNameSpecifier___str__(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = result;
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBTypeNameSpecifier_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBTypeNameSpecifier, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBTypeSummaryOptions__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeSummaryOptions *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBTypeSummaryOptions")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBTypeSummaryOptions *)new lldb::SBTypeSummaryOptions();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBTypeSummaryOptions, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBTypeSummaryOptions__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeSummaryOptions *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBTypeSummaryOptions *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBTypeSummaryOptions",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBTypeSummaryOptions,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBTypeSummaryOptions" "', argument " "1"" of type '" "lldb::SBTypeSummaryOptions const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBTypeSummaryOptions" "', argument " "1"" of type '" "lldb::SBTypeSummaryOptions const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeSummaryOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBTypeSummaryOptions *)new lldb::SBTypeSummaryOptions((lldb::SBTypeSummaryOptions const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBTypeSummaryOptions, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBTypeSummaryOptions(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBTypeSummaryOptions__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBTypeSummaryOptions, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBTypeSummaryOptions__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBTypeSummaryOptions'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBTypeSummaryOptions()\n"
    "    lldb::SBTypeSummaryOptions(lldb::SBTypeSummaryOptions const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBTypeSummaryOptions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeSummaryOptions *arg1 = (lldb::SBTypeSummaryOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBTypeSummaryOptions",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeSummaryOptions, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBTypeSummaryOptions" "', argument " "1"" of type '" "lldb::SBTypeSummaryOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeSummaryOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeSummaryOptions_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeSummaryOptions *arg1 = (lldb::SBTypeSummaryOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeSummaryOptions_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeSummaryOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeSummaryOptions_IsValid" "', argument " "1"" of type '" "lldb::SBTypeSummaryOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeSummaryOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeSummaryOptions_GetLanguage(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeSummaryOptions *arg1 = (lldb::SBTypeSummaryOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::LanguageType result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeSummaryOptions_GetLanguage",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeSummaryOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeSummaryOptions_GetLanguage" "', argument " "1"" of type '" "lldb::SBTypeSummaryOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeSummaryOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::LanguageType)(arg1)->GetLanguage();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeSummaryOptions_GetCapping(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeSummaryOptions *arg1 = (lldb::SBTypeSummaryOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::TypeSummaryCapping result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeSummaryOptions_GetCapping",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeSummaryOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeSummaryOptions_GetCapping" "', argument " "1"" of type '" "lldb::SBTypeSummaryOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeSummaryOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::TypeSummaryCapping)(arg1)->GetCapping();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeSummaryOptions_SetLanguage(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeSummaryOptions *arg1 = (lldb::SBTypeSummaryOptions *) 0 ;
  lldb::LanguageType arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeSummaryOptions_SetLanguage",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeSummaryOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeSummaryOptions_SetLanguage" "', argument " "1"" of type '" "lldb::SBTypeSummaryOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeSummaryOptions * >(argp1);
  ecode2 = SWIG_AsVal_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBTypeSummaryOptions_SetLanguage" "', argument " "2"" of type '" "lldb::LanguageType""'");
  } 
  arg2 = static_cast< lldb::LanguageType >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetLanguage(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeSummaryOptions_SetCapping(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeSummaryOptions *arg1 = (lldb::SBTypeSummaryOptions *) 0 ;
  lldb::TypeSummaryCapping arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeSummaryOptions_SetCapping",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeSummaryOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeSummaryOptions_SetCapping" "', argument " "1"" of type '" "lldb::SBTypeSummaryOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeSummaryOptions * >(argp1);
  ecode2 = SWIG_AsVal_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBTypeSummaryOptions_SetCapping" "', argument " "2"" of type '" "lldb::TypeSummaryCapping""'");
  } 
  arg2 = static_cast< lldb::TypeSummaryCapping >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetCapping(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBTypeSummaryOptions_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBTypeSummaryOptions, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBTypeSummary__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeSummary *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBTypeSummary")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBTypeSummary *)new lldb::SBTypeSummary();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBTypeSummary, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeSummary_CreateWithSummaryString__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  char *arg1 = (char *) 0 ;
  uint32_t arg2 ;
  int res1 ;
  char *buf1 = 0 ;
  int alloc1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBTypeSummary result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeSummary_CreateWithSummaryString",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeSummary_CreateWithSummaryString" "', argument " "1"" of type '" "char const *""'");
  }
  arg1 = reinterpret_cast< char * >(buf1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBTypeSummary_CreateWithSummaryString" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = lldb::SBTypeSummary::CreateWithSummaryString((char const *)arg1,arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTypeSummary(static_cast< const lldb::SBTypeSummary& >(result))), SWIGTYPE_p_lldb__SBTypeSummary, SWIG_POINTER_OWN |  0 );
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return resultobj;
fail:
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeSummary_CreateWithSummaryString__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  char *arg1 = (char *) 0 ;
  int res1 ;
  char *buf1 = 0 ;
  int alloc1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBTypeSummary result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeSummary_CreateWithSummaryString",&obj0)) SWIG_fail;
  res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeSummary_CreateWithSummaryString" "', argument " "1"" of type '" "char const *""'");
  }
  arg1 = reinterpret_cast< char * >(buf1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = lldb::SBTypeSummary::CreateWithSummaryString((char const *)arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTypeSummary(static_cast< const lldb::SBTypeSummary& >(result))), SWIGTYPE_p_lldb__SBTypeSummary, SWIG_POINTER_OWN |  0 );
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return resultobj;
fail:
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeSummary_CreateWithSummaryString(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[3];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 2); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_AsCharPtrAndSize(argv[0], 0, NULL, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_SBTypeSummary_CreateWithSummaryString__SWIG_1(self, args);
    }
  }
  if (argc == 2) {
    int _v;
    int res = SWIG_AsCharPtrAndSize(argv[0], 0, NULL, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_unsigned_SS_int(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        return _wrap_SBTypeSummary_CreateWithSummaryString__SWIG_0(self, args);
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBTypeSummary_CreateWithSummaryString'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    CreateWithSummaryString(char const *,uint32_t)\n"
    "    lldb::SBTypeSummary::CreateWithSummaryString(char const *)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeSummary_CreateWithFunctionName__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  char *arg1 = (char *) 0 ;
  uint32_t arg2 ;
  int res1 ;
  char *buf1 = 0 ;
  int alloc1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBTypeSummary result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeSummary_CreateWithFunctionName",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeSummary_CreateWithFunctionName" "', argument " "1"" of type '" "char const *""'");
  }
  arg1 = reinterpret_cast< char * >(buf1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBTypeSummary_CreateWithFunctionName" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = lldb::SBTypeSummary::CreateWithFunctionName((char const *)arg1,arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTypeSummary(static_cast< const lldb::SBTypeSummary& >(result))), SWIGTYPE_p_lldb__SBTypeSummary, SWIG_POINTER_OWN |  0 );
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return resultobj;
fail:
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeSummary_CreateWithFunctionName__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  char *arg1 = (char *) 0 ;
  int res1 ;
  char *buf1 = 0 ;
  int alloc1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBTypeSummary result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeSummary_CreateWithFunctionName",&obj0)) SWIG_fail;
  res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeSummary_CreateWithFunctionName" "', argument " "1"" of type '" "char const *""'");
  }
  arg1 = reinterpret_cast< char * >(buf1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = lldb::SBTypeSummary::CreateWithFunctionName((char const *)arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTypeSummary(static_cast< const lldb::SBTypeSummary& >(result))), SWIGTYPE_p_lldb__SBTypeSummary, SWIG_POINTER_OWN |  0 );
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return resultobj;
fail:
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeSummary_CreateWithFunctionName(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[3];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 2); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_AsCharPtrAndSize(argv[0], 0, NULL, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_SBTypeSummary_CreateWithFunctionName__SWIG_1(self, args);
    }
  }
  if (argc == 2) {
    int _v;
    int res = SWIG_AsCharPtrAndSize(argv[0], 0, NULL, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_unsigned_SS_int(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        return _wrap_SBTypeSummary_CreateWithFunctionName__SWIG_0(self, args);
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBTypeSummary_CreateWithFunctionName'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    CreateWithFunctionName(char const *,uint32_t)\n"
    "    lldb::SBTypeSummary::CreateWithFunctionName(char const *)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeSummary_CreateWithScriptCode__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  char *arg1 = (char *) 0 ;
  uint32_t arg2 ;
  int res1 ;
  char *buf1 = 0 ;
  int alloc1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBTypeSummary result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeSummary_CreateWithScriptCode",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeSummary_CreateWithScriptCode" "', argument " "1"" of type '" "char const *""'");
  }
  arg1 = reinterpret_cast< char * >(buf1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBTypeSummary_CreateWithScriptCode" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = lldb::SBTypeSummary::CreateWithScriptCode((char const *)arg1,arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTypeSummary(static_cast< const lldb::SBTypeSummary& >(result))), SWIGTYPE_p_lldb__SBTypeSummary, SWIG_POINTER_OWN |  0 );
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return resultobj;
fail:
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeSummary_CreateWithScriptCode__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  char *arg1 = (char *) 0 ;
  int res1 ;
  char *buf1 = 0 ;
  int alloc1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBTypeSummary result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeSummary_CreateWithScriptCode",&obj0)) SWIG_fail;
  res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeSummary_CreateWithScriptCode" "', argument " "1"" of type '" "char const *""'");
  }
  arg1 = reinterpret_cast< char * >(buf1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = lldb::SBTypeSummary::CreateWithScriptCode((char const *)arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTypeSummary(static_cast< const lldb::SBTypeSummary& >(result))), SWIGTYPE_p_lldb__SBTypeSummary, SWIG_POINTER_OWN |  0 );
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return resultobj;
fail:
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeSummary_CreateWithScriptCode(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[3];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 2); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_AsCharPtrAndSize(argv[0], 0, NULL, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_SBTypeSummary_CreateWithScriptCode__SWIG_1(self, args);
    }
  }
  if (argc == 2) {
    int _v;
    int res = SWIG_AsCharPtrAndSize(argv[0], 0, NULL, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_unsigned_SS_int(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        return _wrap_SBTypeSummary_CreateWithScriptCode__SWIG_0(self, args);
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBTypeSummary_CreateWithScriptCode'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    CreateWithScriptCode(char const *,uint32_t)\n"
    "    lldb::SBTypeSummary::CreateWithScriptCode(char const *)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBTypeSummary__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeSummary *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBTypeSummary *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBTypeSummary",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBTypeSummary,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBTypeSummary" "', argument " "1"" of type '" "lldb::SBTypeSummary const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBTypeSummary" "', argument " "1"" of type '" "lldb::SBTypeSummary const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeSummary * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBTypeSummary *)new lldb::SBTypeSummary((lldb::SBTypeSummary const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBTypeSummary, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBTypeSummary(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBTypeSummary__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBTypeSummary, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBTypeSummary__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBTypeSummary'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBTypeSummary()\n"
    "    lldb::SBTypeSummary(lldb::SBTypeSummary const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBTypeSummary(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeSummary *arg1 = (lldb::SBTypeSummary *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBTypeSummary",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeSummary, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBTypeSummary" "', argument " "1"" of type '" "lldb::SBTypeSummary *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeSummary * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeSummary_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeSummary *arg1 = (lldb::SBTypeSummary *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeSummary_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeSummary, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeSummary_IsValid" "', argument " "1"" of type '" "lldb::SBTypeSummary const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeSummary * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBTypeSummary const *)arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeSummary_IsEqualTo(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeSummary *arg1 = (lldb::SBTypeSummary *) 0 ;
  lldb::SBTypeSummary *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeSummary_IsEqualTo",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeSummary, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeSummary_IsEqualTo" "', argument " "1"" of type '" "lldb::SBTypeSummary *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeSummary * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTypeSummary,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTypeSummary_IsEqualTo" "', argument " "2"" of type '" "lldb::SBTypeSummary &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTypeSummary_IsEqualTo" "', argument " "2"" of type '" "lldb::SBTypeSummary &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBTypeSummary * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsEqualTo(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeSummary_IsFunctionCode(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeSummary *arg1 = (lldb::SBTypeSummary *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeSummary_IsFunctionCode",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeSummary, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeSummary_IsFunctionCode" "', argument " "1"" of type '" "lldb::SBTypeSummary *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeSummary * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsFunctionCode();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeSummary_IsFunctionName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeSummary *arg1 = (lldb::SBTypeSummary *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeSummary_IsFunctionName",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeSummary, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeSummary_IsFunctionName" "', argument " "1"" of type '" "lldb::SBTypeSummary *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeSummary * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsFunctionName();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeSummary_IsSummaryString(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeSummary *arg1 = (lldb::SBTypeSummary *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeSummary_IsSummaryString",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeSummary, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeSummary_IsSummaryString" "', argument " "1"" of type '" "lldb::SBTypeSummary *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeSummary * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsSummaryString();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeSummary_GetData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeSummary *arg1 = (lldb::SBTypeSummary *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeSummary_GetData",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeSummary, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeSummary_GetData" "', argument " "1"" of type '" "lldb::SBTypeSummary *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeSummary * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetData();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeSummary_SetSummaryString(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeSummary *arg1 = (lldb::SBTypeSummary *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeSummary_SetSummaryString",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeSummary, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeSummary_SetSummaryString" "', argument " "1"" of type '" "lldb::SBTypeSummary *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeSummary * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTypeSummary_SetSummaryString" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetSummaryString((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeSummary_SetFunctionName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeSummary *arg1 = (lldb::SBTypeSummary *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeSummary_SetFunctionName",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeSummary, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeSummary_SetFunctionName" "', argument " "1"" of type '" "lldb::SBTypeSummary *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeSummary * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTypeSummary_SetFunctionName" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetFunctionName((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeSummary_SetFunctionCode(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeSummary *arg1 = (lldb::SBTypeSummary *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeSummary_SetFunctionCode",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeSummary, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeSummary_SetFunctionCode" "', argument " "1"" of type '" "lldb::SBTypeSummary *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeSummary * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTypeSummary_SetFunctionCode" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetFunctionCode((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeSummary_GetOptions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeSummary *arg1 = (lldb::SBTypeSummary *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeSummary_GetOptions",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeSummary, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeSummary_GetOptions" "', argument " "1"" of type '" "lldb::SBTypeSummary *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeSummary * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetOptions();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeSummary_SetOptions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeSummary *arg1 = (lldb::SBTypeSummary *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeSummary_SetOptions",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeSummary, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeSummary_SetOptions" "', argument " "1"" of type '" "lldb::SBTypeSummary *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeSummary * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBTypeSummary_SetOptions" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetOptions(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeSummary_GetDescription(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeSummary *arg1 = (lldb::SBTypeSummary *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  lldb::DescriptionLevel arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  int val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBTypeSummary_GetDescription",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeSummary, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeSummary_GetDescription" "', argument " "1"" of type '" "lldb::SBTypeSummary *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeSummary * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTypeSummary_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTypeSummary_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  ecode3 = SWIG_AsVal_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBTypeSummary_GetDescription" "', argument " "3"" of type '" "lldb::DescriptionLevel""'");
  } 
  arg3 = static_cast< lldb::DescriptionLevel >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetDescription(*arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeSummary___eq__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeSummary *arg1 = (lldb::SBTypeSummary *) 0 ;
  lldb::SBTypeSummary *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeSummary___eq__",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeSummary, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeSummary___eq__" "', argument " "1"" of type '" "lldb::SBTypeSummary *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeSummary * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTypeSummary,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTypeSummary___eq__" "', argument " "2"" of type '" "lldb::SBTypeSummary &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTypeSummary___eq__" "', argument " "2"" of type '" "lldb::SBTypeSummary &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBTypeSummary * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->operator ==(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeSummary___ne__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeSummary *arg1 = (lldb::SBTypeSummary *) 0 ;
  lldb::SBTypeSummary *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeSummary___ne__",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeSummary, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeSummary___ne__" "', argument " "1"" of type '" "lldb::SBTypeSummary *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeSummary * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTypeSummary,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTypeSummary___ne__" "', argument " "2"" of type '" "lldb::SBTypeSummary &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTypeSummary___ne__" "', argument " "2"" of type '" "lldb::SBTypeSummary &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBTypeSummary * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->operator !=(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeSummary___str__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeSummary *arg1 = (lldb::SBTypeSummary *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeSummary___str__",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeSummary, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeSummary___str__" "', argument " "1"" of type '" "lldb::SBTypeSummary *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeSummary * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (PyObject *)lldb_SBTypeSummary___str__(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = result;
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBTypeSummary_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBTypeSummary, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBTypeSynthetic__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeSynthetic *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBTypeSynthetic")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBTypeSynthetic *)new lldb::SBTypeSynthetic();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBTypeSynthetic, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeSynthetic_CreateWithClassName__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  char *arg1 = (char *) 0 ;
  uint32_t arg2 ;
  int res1 ;
  char *buf1 = 0 ;
  int alloc1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBTypeSynthetic result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeSynthetic_CreateWithClassName",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeSynthetic_CreateWithClassName" "', argument " "1"" of type '" "char const *""'");
  }
  arg1 = reinterpret_cast< char * >(buf1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBTypeSynthetic_CreateWithClassName" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = lldb::SBTypeSynthetic::CreateWithClassName((char const *)arg1,arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTypeSynthetic(static_cast< const lldb::SBTypeSynthetic& >(result))), SWIGTYPE_p_lldb__SBTypeSynthetic, SWIG_POINTER_OWN |  0 );
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return resultobj;
fail:
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeSynthetic_CreateWithClassName__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  char *arg1 = (char *) 0 ;
  int res1 ;
  char *buf1 = 0 ;
  int alloc1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBTypeSynthetic result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeSynthetic_CreateWithClassName",&obj0)) SWIG_fail;
  res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeSynthetic_CreateWithClassName" "', argument " "1"" of type '" "char const *""'");
  }
  arg1 = reinterpret_cast< char * >(buf1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = lldb::SBTypeSynthetic::CreateWithClassName((char const *)arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTypeSynthetic(static_cast< const lldb::SBTypeSynthetic& >(result))), SWIGTYPE_p_lldb__SBTypeSynthetic, SWIG_POINTER_OWN |  0 );
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return resultobj;
fail:
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeSynthetic_CreateWithClassName(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[3];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 2); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_AsCharPtrAndSize(argv[0], 0, NULL, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_SBTypeSynthetic_CreateWithClassName__SWIG_1(self, args);
    }
  }
  if (argc == 2) {
    int _v;
    int res = SWIG_AsCharPtrAndSize(argv[0], 0, NULL, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_unsigned_SS_int(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        return _wrap_SBTypeSynthetic_CreateWithClassName__SWIG_0(self, args);
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBTypeSynthetic_CreateWithClassName'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    CreateWithClassName(char const *,uint32_t)\n"
    "    lldb::SBTypeSynthetic::CreateWithClassName(char const *)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeSynthetic_CreateWithScriptCode__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  char *arg1 = (char *) 0 ;
  uint32_t arg2 ;
  int res1 ;
  char *buf1 = 0 ;
  int alloc1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBTypeSynthetic result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeSynthetic_CreateWithScriptCode",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeSynthetic_CreateWithScriptCode" "', argument " "1"" of type '" "char const *""'");
  }
  arg1 = reinterpret_cast< char * >(buf1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBTypeSynthetic_CreateWithScriptCode" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = lldb::SBTypeSynthetic::CreateWithScriptCode((char const *)arg1,arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTypeSynthetic(static_cast< const lldb::SBTypeSynthetic& >(result))), SWIGTYPE_p_lldb__SBTypeSynthetic, SWIG_POINTER_OWN |  0 );
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return resultobj;
fail:
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeSynthetic_CreateWithScriptCode__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  char *arg1 = (char *) 0 ;
  int res1 ;
  char *buf1 = 0 ;
  int alloc1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBTypeSynthetic result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeSynthetic_CreateWithScriptCode",&obj0)) SWIG_fail;
  res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeSynthetic_CreateWithScriptCode" "', argument " "1"" of type '" "char const *""'");
  }
  arg1 = reinterpret_cast< char * >(buf1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = lldb::SBTypeSynthetic::CreateWithScriptCode((char const *)arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTypeSynthetic(static_cast< const lldb::SBTypeSynthetic& >(result))), SWIGTYPE_p_lldb__SBTypeSynthetic, SWIG_POINTER_OWN |  0 );
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return resultobj;
fail:
  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeSynthetic_CreateWithScriptCode(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[3];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 2); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_AsCharPtrAndSize(argv[0], 0, NULL, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_SBTypeSynthetic_CreateWithScriptCode__SWIG_1(self, args);
    }
  }
  if (argc == 2) {
    int _v;
    int res = SWIG_AsCharPtrAndSize(argv[0], 0, NULL, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_unsigned_SS_int(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        return _wrap_SBTypeSynthetic_CreateWithScriptCode__SWIG_0(self, args);
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBTypeSynthetic_CreateWithScriptCode'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    CreateWithScriptCode(char const *,uint32_t)\n"
    "    lldb::SBTypeSynthetic::CreateWithScriptCode(char const *)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBTypeSynthetic__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeSynthetic *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBTypeSynthetic *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBTypeSynthetic",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBTypeSynthetic,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBTypeSynthetic" "', argument " "1"" of type '" "lldb::SBTypeSynthetic const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBTypeSynthetic" "', argument " "1"" of type '" "lldb::SBTypeSynthetic const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeSynthetic * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBTypeSynthetic *)new lldb::SBTypeSynthetic((lldb::SBTypeSynthetic const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBTypeSynthetic, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBTypeSynthetic(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBTypeSynthetic__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBTypeSynthetic, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBTypeSynthetic__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBTypeSynthetic'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBTypeSynthetic()\n"
    "    lldb::SBTypeSynthetic(lldb::SBTypeSynthetic const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBTypeSynthetic(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeSynthetic *arg1 = (lldb::SBTypeSynthetic *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBTypeSynthetic",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeSynthetic, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBTypeSynthetic" "', argument " "1"" of type '" "lldb::SBTypeSynthetic *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeSynthetic * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeSynthetic_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeSynthetic *arg1 = (lldb::SBTypeSynthetic *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeSynthetic_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeSynthetic, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeSynthetic_IsValid" "', argument " "1"" of type '" "lldb::SBTypeSynthetic const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeSynthetic * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBTypeSynthetic const *)arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeSynthetic_IsEqualTo(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeSynthetic *arg1 = (lldb::SBTypeSynthetic *) 0 ;
  lldb::SBTypeSynthetic *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeSynthetic_IsEqualTo",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeSynthetic, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeSynthetic_IsEqualTo" "', argument " "1"" of type '" "lldb::SBTypeSynthetic *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeSynthetic * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTypeSynthetic,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTypeSynthetic_IsEqualTo" "', argument " "2"" of type '" "lldb::SBTypeSynthetic &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTypeSynthetic_IsEqualTo" "', argument " "2"" of type '" "lldb::SBTypeSynthetic &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBTypeSynthetic * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsEqualTo(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeSynthetic_IsClassCode(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeSynthetic *arg1 = (lldb::SBTypeSynthetic *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeSynthetic_IsClassCode",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeSynthetic, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeSynthetic_IsClassCode" "', argument " "1"" of type '" "lldb::SBTypeSynthetic *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeSynthetic * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsClassCode();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeSynthetic_GetData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeSynthetic *arg1 = (lldb::SBTypeSynthetic *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeSynthetic_GetData",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeSynthetic, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeSynthetic_GetData" "', argument " "1"" of type '" "lldb::SBTypeSynthetic *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeSynthetic * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetData();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeSynthetic_SetClassName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeSynthetic *arg1 = (lldb::SBTypeSynthetic *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeSynthetic_SetClassName",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeSynthetic, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeSynthetic_SetClassName" "', argument " "1"" of type '" "lldb::SBTypeSynthetic *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeSynthetic * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTypeSynthetic_SetClassName" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetClassName((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeSynthetic_SetClassCode(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeSynthetic *arg1 = (lldb::SBTypeSynthetic *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeSynthetic_SetClassCode",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeSynthetic, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeSynthetic_SetClassCode" "', argument " "1"" of type '" "lldb::SBTypeSynthetic *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeSynthetic * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTypeSynthetic_SetClassCode" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetClassCode((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeSynthetic_GetOptions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeSynthetic *arg1 = (lldb::SBTypeSynthetic *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeSynthetic_GetOptions",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeSynthetic, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeSynthetic_GetOptions" "', argument " "1"" of type '" "lldb::SBTypeSynthetic *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeSynthetic * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetOptions();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeSynthetic_SetOptions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeSynthetic *arg1 = (lldb::SBTypeSynthetic *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeSynthetic_SetOptions",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeSynthetic, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeSynthetic_SetOptions" "', argument " "1"" of type '" "lldb::SBTypeSynthetic *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeSynthetic * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBTypeSynthetic_SetOptions" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetOptions(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeSynthetic_GetDescription(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeSynthetic *arg1 = (lldb::SBTypeSynthetic *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  lldb::DescriptionLevel arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  int val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBTypeSynthetic_GetDescription",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeSynthetic, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeSynthetic_GetDescription" "', argument " "1"" of type '" "lldb::SBTypeSynthetic *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeSynthetic * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTypeSynthetic_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTypeSynthetic_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  ecode3 = SWIG_AsVal_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBTypeSynthetic_GetDescription" "', argument " "3"" of type '" "lldb::DescriptionLevel""'");
  } 
  arg3 = static_cast< lldb::DescriptionLevel >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetDescription(*arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeSynthetic___eq__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeSynthetic *arg1 = (lldb::SBTypeSynthetic *) 0 ;
  lldb::SBTypeSynthetic *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeSynthetic___eq__",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeSynthetic, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeSynthetic___eq__" "', argument " "1"" of type '" "lldb::SBTypeSynthetic *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeSynthetic * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTypeSynthetic,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTypeSynthetic___eq__" "', argument " "2"" of type '" "lldb::SBTypeSynthetic &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTypeSynthetic___eq__" "', argument " "2"" of type '" "lldb::SBTypeSynthetic &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBTypeSynthetic * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->operator ==(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeSynthetic___ne__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeSynthetic *arg1 = (lldb::SBTypeSynthetic *) 0 ;
  lldb::SBTypeSynthetic *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBTypeSynthetic___ne__",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeSynthetic, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeSynthetic___ne__" "', argument " "1"" of type '" "lldb::SBTypeSynthetic *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeSynthetic * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBTypeSynthetic,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBTypeSynthetic___ne__" "', argument " "2"" of type '" "lldb::SBTypeSynthetic &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBTypeSynthetic___ne__" "', argument " "2"" of type '" "lldb::SBTypeSynthetic &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBTypeSynthetic * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->operator !=(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBTypeSynthetic___str__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBTypeSynthetic *arg1 = (lldb::SBTypeSynthetic *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBTypeSynthetic___str__",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBTypeSynthetic, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBTypeSynthetic___str__" "', argument " "1"" of type '" "lldb::SBTypeSynthetic *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBTypeSynthetic * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (PyObject *)lldb_SBTypeSynthetic___str__(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = result;
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBTypeSynthetic_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBTypeSynthetic, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBValue__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBValue")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBValue *)new lldb::SBValue();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBValue, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBValue__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBValue *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBValue",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBValue,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBValue" "', argument " "1"" of type '" "lldb::SBValue const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBValue" "', argument " "1"" of type '" "lldb::SBValue const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBValue *)new lldb::SBValue((lldb::SBValue const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBValue, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBValue(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBValue__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBValue, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBValue__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBValue'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBValue()\n"
    "    lldb::SBValue(lldb::SBValue const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBValue",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBValue" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValue_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_IsValid" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_Clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValue_Clear",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_Clear" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->Clear();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetError(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBError result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValue_GetError",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetError" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetError();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBError(static_cast< const lldb::SBError& >(result))), SWIGTYPE_p_lldb__SBError, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::user_id_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValue_GetID",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetID" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::user_id_t)(arg1)->GetID();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValue_GetName",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetName" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetName();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetTypeName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValue_GetTypeName",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetTypeName" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetTypeName();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetDisplayTypeName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValue_GetDisplayTypeName",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetDisplayTypeName" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetDisplayTypeName();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetByteSize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  size_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValue_GetByteSize",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetByteSize" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetByteSize();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_IsInScope(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValue_IsInScope",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_IsInScope" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsInScope();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetFormat(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::Format result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValue_GetFormat",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetFormat" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::Format)(arg1)->GetFormat();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_SetFormat(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  lldb::Format arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBValue_SetFormat",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_SetFormat" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  ecode2 = SWIG_AsVal_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBValue_SetFormat" "', argument " "2"" of type '" "lldb::Format""'");
  } 
  arg2 = static_cast< lldb::Format >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetFormat(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValue_GetValue",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetValue" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetValue();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetValueAsSigned__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  lldb::SBError *arg2 = 0 ;
  int64_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  long long val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  int64_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBValue_GetValueAsSigned",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetValueAsSigned" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBValue_GetValueAsSigned" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBValue_GetValueAsSigned" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBError * >(argp2);
  ecode3 = SWIG_AsVal_long_SS_long(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBValue_GetValueAsSigned" "', argument " "3"" of type '" "int64_t""'");
  } 
  arg3 = static_cast< int64_t >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (int64_t)(arg1)->GetValueAsSigned(*arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_long_SS_long(static_cast< long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetValueAsSigned__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  lldb::SBError *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  int64_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBValue_GetValueAsSigned",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetValueAsSigned" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBValue_GetValueAsSigned" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBValue_GetValueAsSigned" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBError * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (int64_t)(arg1)->GetValueAsSigned(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_long_SS_long(static_cast< long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetValueAsUnsigned__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  lldb::SBError *arg2 = 0 ;
  uint64_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  unsigned long long val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  uint64_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBValue_GetValueAsUnsigned",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetValueAsUnsigned" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBValue_GetValueAsUnsigned" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBValue_GetValueAsUnsigned" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBError * >(argp2);
  ecode3 = SWIG_AsVal_unsigned_SS_long_SS_long(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBValue_GetValueAsUnsigned" "', argument " "3"" of type '" "uint64_t""'");
  } 
  arg3 = static_cast< uint64_t >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint64_t)(arg1)->GetValueAsUnsigned(*arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetValueAsUnsigned__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  lldb::SBError *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  uint64_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBValue_GetValueAsUnsigned",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetValueAsUnsigned" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBValue_GetValueAsUnsigned" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBValue_GetValueAsUnsigned" "', argument " "2"" of type '" "lldb::SBError &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBError * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint64_t)(arg1)->GetValueAsUnsigned(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetValueAsSigned__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  int64_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  long long val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  int64_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBValue_GetValueAsSigned",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetValueAsSigned" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  ecode2 = SWIG_AsVal_long_SS_long(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBValue_GetValueAsSigned" "', argument " "2"" of type '" "int64_t""'");
  } 
  arg2 = static_cast< int64_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (int64_t)(arg1)->GetValueAsSigned(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_long_SS_long(static_cast< long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetValueAsSigned__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  int64_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValue_GetValueAsSigned",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetValueAsSigned" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (int64_t)(arg1)->GetValueAsSigned();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_long_SS_long(static_cast< long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetValueAsSigned(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[4];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 3); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 1) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBValue, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_SBValue_GetValueAsSigned__SWIG_3(self, args);
    }
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBValue, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      void *vptr = 0;
      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_lldb__SBError, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        return _wrap_SBValue_GetValueAsSigned__SWIG_1(self, args);
      }
    }
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBValue, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_long_SS_long(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        return _wrap_SBValue_GetValueAsSigned__SWIG_2(self, args);
      }
    }
  }
  if (argc == 3) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBValue, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      void *vptr = 0;
      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_lldb__SBError, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        {
          int res = SWIG_AsVal_long_SS_long(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          return _wrap_SBValue_GetValueAsSigned__SWIG_0(self, args);
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBValue_GetValueAsSigned'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    GetValueAsSigned(lldb::SBValue *,lldb::SBError &,int64_t)\n"
    "    GetValueAsSigned(lldb::SBValue *,lldb::SBError &)\n"
    "    GetValueAsSigned(lldb::SBValue *,int64_t)\n"
    "    GetValueAsSigned(lldb::SBValue *)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetValueAsUnsigned__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  uint64_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned long long val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  uint64_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBValue_GetValueAsUnsigned",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetValueAsUnsigned" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_long_SS_long(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBValue_GetValueAsUnsigned" "', argument " "2"" of type '" "uint64_t""'");
  } 
  arg2 = static_cast< uint64_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint64_t)(arg1)->GetValueAsUnsigned(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetValueAsUnsigned__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint64_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValue_GetValueAsUnsigned",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetValueAsUnsigned" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint64_t)(arg1)->GetValueAsUnsigned();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetValueAsUnsigned(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[4];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 3); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 1) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBValue, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_SBValue_GetValueAsUnsigned__SWIG_3(self, args);
    }
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBValue, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      void *vptr = 0;
      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_lldb__SBError, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        return _wrap_SBValue_GetValueAsUnsigned__SWIG_1(self, args);
      }
    }
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBValue, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_unsigned_SS_long_SS_long(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        return _wrap_SBValue_GetValueAsUnsigned__SWIG_2(self, args);
      }
    }
  }
  if (argc == 3) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBValue, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      void *vptr = 0;
      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_lldb__SBError, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        {
          int res = SWIG_AsVal_unsigned_SS_long_SS_long(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          return _wrap_SBValue_GetValueAsUnsigned__SWIG_0(self, args);
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBValue_GetValueAsUnsigned'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    GetValueAsUnsigned(lldb::SBValue *,lldb::SBError &,uint64_t)\n"
    "    GetValueAsUnsigned(lldb::SBValue *,lldb::SBError &)\n"
    "    GetValueAsUnsigned(lldb::SBValue *,uint64_t)\n"
    "    GetValueAsUnsigned(lldb::SBValue *)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetValueType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::ValueType result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValue_GetValueType",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetValueType" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::ValueType)(arg1)->GetValueType();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetValueDidChange(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValue_GetValueDidChange",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetValueDidChange" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetValueDidChange();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetSummary__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValue_GetSummary",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetSummary" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetSummary();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetSummary__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  lldb::SBTypeSummaryOptions *arg3 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  void *argp3 = 0 ;
  int res3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBValue_GetSummary",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetSummary" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBValue_GetSummary" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBValue_GetSummary" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBTypeSummaryOptions,  0 );
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBValue_GetSummary" "', argument " "3"" of type '" "lldb::SBTypeSummaryOptions &""'"); 
  }
  if (!argp3) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBValue_GetSummary" "', argument " "3"" of type '" "lldb::SBTypeSummaryOptions &""'"); 
  }
  arg3 = reinterpret_cast< lldb::SBTypeSummaryOptions * >(argp3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetSummary(*arg2,*arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetSummary(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[4];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 3); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 1) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBValue, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_SBValue_GetSummary__SWIG_0(self, args);
    }
  }
  if (argc == 3) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBValue, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      void *vptr = 0;
      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_lldb__SBStream, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        void *vptr = 0;
        int res = SWIG_ConvertPtr(argv[2], &vptr, SWIGTYPE_p_lldb__SBTypeSummaryOptions, 0);
        _v = SWIG_CheckState(res);
        if (_v) {
          return _wrap_SBValue_GetSummary__SWIG_1(self, args);
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBValue_GetSummary'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    GetSummary(lldb::SBValue *)\n"
    "    GetSummary(lldb::SBValue *,lldb::SBStream &,lldb::SBTypeSummaryOptions &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetObjectDescription(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValue_GetObjectDescription",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetObjectDescription" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetObjectDescription();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetTypeValidatorResult(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValue_GetTypeValidatorResult",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetTypeValidatorResult" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetTypeValidatorResult();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetDynamicValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  lldb::DynamicValueType arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBValue result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBValue_GetDynamicValue",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetDynamicValue" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  ecode2 = SWIG_AsVal_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBValue_GetDynamicValue" "', argument " "2"" of type '" "lldb::DynamicValueType""'");
  } 
  arg2 = static_cast< lldb::DynamicValueType >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetDynamicValue(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBValue(static_cast< const lldb::SBValue& >(result))), SWIGTYPE_p_lldb__SBValue, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetStaticValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBValue result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValue_GetStaticValue",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetStaticValue" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetStaticValue();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBValue(static_cast< const lldb::SBValue& >(result))), SWIGTYPE_p_lldb__SBValue, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetNonSyntheticValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBValue result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValue_GetNonSyntheticValue",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetNonSyntheticValue" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetNonSyntheticValue();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBValue(static_cast< const lldb::SBValue& >(result))), SWIGTYPE_p_lldb__SBValue, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetPreferDynamicValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::DynamicValueType result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValue_GetPreferDynamicValue",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetPreferDynamicValue" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::DynamicValueType)(arg1)->GetPreferDynamicValue();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_SetPreferDynamicValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  lldb::DynamicValueType arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBValue_SetPreferDynamicValue",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_SetPreferDynamicValue" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  ecode2 = SWIG_AsVal_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBValue_SetPreferDynamicValue" "', argument " "2"" of type '" "lldb::DynamicValueType""'");
  } 
  arg2 = static_cast< lldb::DynamicValueType >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetPreferDynamicValue(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetPreferSyntheticValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValue_GetPreferSyntheticValue",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetPreferSyntheticValue" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetPreferSyntheticValue();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_SetPreferSyntheticValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBValue_SetPreferSyntheticValue",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_SetPreferSyntheticValue" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBValue_SetPreferSyntheticValue" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetPreferSyntheticValue(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_IsDynamic(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValue_IsDynamic",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_IsDynamic" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsDynamic();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_IsSynthetic(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValue_IsSynthetic",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_IsSynthetic" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsSynthetic();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_IsSyntheticChildrenGenerated(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValue_IsSyntheticChildrenGenerated",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_IsSyntheticChildrenGenerated" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsSyntheticChildrenGenerated();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_SetSyntheticChildrenGenerated(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBValue_SetSyntheticChildrenGenerated",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_SetSyntheticChildrenGenerated" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBValue_SetSyntheticChildrenGenerated" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetSyntheticChildrenGenerated(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetLocation(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValue_GetLocation",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetLocation" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetLocation();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_SetValueFromCString__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBValue_SetValueFromCString",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_SetValueFromCString" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBValue_SetValueFromCString" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->SetValueFromCString((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_SetValueFromCString__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  char *arg2 = (char *) 0 ;
  lldb::SBError *arg3 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  void *argp3 = 0 ;
  int res3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBValue_SetValueFromCString",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_SetValueFromCString" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBValue_SetValueFromCString" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBValue_SetValueFromCString" "', argument " "3"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp3) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBValue_SetValueFromCString" "', argument " "3"" of type '" "lldb::SBError &""'"); 
  }
  arg3 = reinterpret_cast< lldb::SBError * >(argp3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->SetValueFromCString((char const *)arg2,*arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_SetValueFromCString(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[4];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 3); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBValue, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        return _wrap_SBValue_SetValueFromCString__SWIG_0(self, args);
      }
    }
  }
  if (argc == 3) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBValue, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        void *vptr = 0;
        int res = SWIG_ConvertPtr(argv[2], &vptr, SWIGTYPE_p_lldb__SBError, 0);
        _v = SWIG_CheckState(res);
        if (_v) {
          return _wrap_SBValue_SetValueFromCString__SWIG_1(self, args);
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBValue_SetValueFromCString'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    SetValueFromCString(lldb::SBValue *,char const *)\n"
    "    SetValueFromCString(lldb::SBValue *,char const *,lldb::SBError &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetTypeFormat(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBTypeFormat result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValue_GetTypeFormat",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetTypeFormat" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetTypeFormat();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTypeFormat(static_cast< const lldb::SBTypeFormat& >(result))), SWIGTYPE_p_lldb__SBTypeFormat, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetTypeSummary(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBTypeSummary result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValue_GetTypeSummary",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetTypeSummary" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetTypeSummary();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTypeSummary(static_cast< const lldb::SBTypeSummary& >(result))), SWIGTYPE_p_lldb__SBTypeSummary, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetTypeFilter(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBTypeFilter result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValue_GetTypeFilter",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetTypeFilter" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetTypeFilter();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTypeFilter(static_cast< const lldb::SBTypeFilter& >(result))), SWIGTYPE_p_lldb__SBTypeFilter, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetTypeSynthetic(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBTypeSynthetic result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValue_GetTypeSynthetic",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetTypeSynthetic" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetTypeSynthetic();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTypeSynthetic(static_cast< const lldb::SBTypeSynthetic& >(result))), SWIGTYPE_p_lldb__SBTypeSynthetic, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetChildAtIndex__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBValue result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBValue_GetChildAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetChildAtIndex" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBValue_GetChildAtIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetChildAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBValue(static_cast< const lldb::SBValue& >(result))), SWIGTYPE_p_lldb__SBValue, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetChildAtIndex__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  uint32_t arg2 ;
  lldb::DynamicValueType arg3 ;
  bool arg4 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  int val3 ;
  int ecode3 = 0 ;
  bool val4 ;
  int ecode4 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  lldb::SBValue result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOO:SBValue_GetChildAtIndex",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetChildAtIndex" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBValue_GetChildAtIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  ecode3 = SWIG_AsVal_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBValue_GetChildAtIndex" "', argument " "3"" of type '" "lldb::DynamicValueType""'");
  } 
  arg3 = static_cast< lldb::DynamicValueType >(val3);
  ecode4 = SWIG_AsVal_bool(obj3, &val4);
  if (!SWIG_IsOK(ecode4)) {
    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "SBValue_GetChildAtIndex" "', argument " "4"" of type '" "bool""'");
  } 
  arg4 = static_cast< bool >(val4);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetChildAtIndex(arg2,arg3,arg4);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBValue(static_cast< const lldb::SBValue& >(result))), SWIGTYPE_p_lldb__SBValue, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetChildAtIndex(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[5];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 4); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBValue, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_unsigned_SS_int(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        return _wrap_SBValue_GetChildAtIndex__SWIG_0(self, args);
      }
    }
  }
  if (argc == 4) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBValue, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_unsigned_SS_int(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        {
          int res = SWIG_AsVal_int(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          {
            int res = SWIG_AsVal_bool(argv[3], NULL);
            _v = SWIG_CheckState(res);
          }
          if (_v) {
            return _wrap_SBValue_GetChildAtIndex__SWIG_1(self, args);
          }
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBValue_GetChildAtIndex'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    GetChildAtIndex(lldb::SBValue *,uint32_t)\n"
    "    GetChildAtIndex(lldb::SBValue *,uint32_t,lldb::DynamicValueType,bool)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_CreateChildAtOffset(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  char *arg2 = (char *) 0 ;
  uint32_t arg3 ;
  lldb::SBType arg4 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  unsigned int val3 ;
  int ecode3 = 0 ;
  void *argp4 ;
  int res4 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  lldb::SBValue result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOO:SBValue_CreateChildAtOffset",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_CreateChildAtOffset" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBValue_CreateChildAtOffset" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  ecode3 = SWIG_AsVal_unsigned_SS_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBValue_CreateChildAtOffset" "', argument " "3"" of type '" "uint32_t""'");
  } 
  arg3 = static_cast< uint32_t >(val3);
  {
    res4 = SWIG_ConvertPtr(obj3, &argp4, SWIGTYPE_p_lldb__SBType,  0  | 0);
    if (!SWIG_IsOK(res4)) {
      SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "SBValue_CreateChildAtOffset" "', argument " "4"" of type '" "lldb::SBType""'"); 
    }  
    if (!argp4) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBValue_CreateChildAtOffset" "', argument " "4"" of type '" "lldb::SBType""'");
    } else {
      lldb::SBType * temp = reinterpret_cast< lldb::SBType * >(argp4);
      arg4 = *temp;
      if (SWIG_IsNewObj(res4)) delete temp;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->CreateChildAtOffset((char const *)arg2,arg3,arg4);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBValue(static_cast< const lldb::SBValue& >(result))), SWIGTYPE_p_lldb__SBValue, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_Cast(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  lldb::SBType arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBValue result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBValue_Cast",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_Cast" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBType,  0  | 0);
    if (!SWIG_IsOK(res2)) {
      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBValue_Cast" "', argument " "2"" of type '" "lldb::SBType""'"); 
    }  
    if (!argp2) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBValue_Cast" "', argument " "2"" of type '" "lldb::SBType""'");
    } else {
      lldb::SBType * temp = reinterpret_cast< lldb::SBType * >(argp2);
      arg2 = *temp;
      if (SWIG_IsNewObj(res2)) delete temp;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->Cast(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBValue(static_cast< const lldb::SBValue& >(result))), SWIGTYPE_p_lldb__SBValue, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_CreateValueFromExpression__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  char *arg2 = (char *) 0 ;
  char *arg3 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  int res3 ;
  char *buf3 = 0 ;
  int alloc3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBValue result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBValue_CreateValueFromExpression",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_CreateValueFromExpression" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBValue_CreateValueFromExpression" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3);
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBValue_CreateValueFromExpression" "', argument " "3"" of type '" "char const *""'");
  }
  arg3 = reinterpret_cast< char * >(buf3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->CreateValueFromExpression((char const *)arg2,(char const *)arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBValue(static_cast< const lldb::SBValue& >(result))), SWIGTYPE_p_lldb__SBValue, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_CreateValueFromExpression__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  char *arg2 = (char *) 0 ;
  char *arg3 = (char *) 0 ;
  lldb::SBExpressionOptions *arg4 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  int res3 ;
  char *buf3 = 0 ;
  int alloc3 = 0 ;
  void *argp4 = 0 ;
  int res4 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  lldb::SBValue result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOO:SBValue_CreateValueFromExpression",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_CreateValueFromExpression" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBValue_CreateValueFromExpression" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3);
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBValue_CreateValueFromExpression" "', argument " "3"" of type '" "char const *""'");
  }
  arg3 = reinterpret_cast< char * >(buf3);
  res4 = SWIG_ConvertPtr(obj3, &argp4, SWIGTYPE_p_lldb__SBExpressionOptions,  0 );
  if (!SWIG_IsOK(res4)) {
    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "SBValue_CreateValueFromExpression" "', argument " "4"" of type '" "lldb::SBExpressionOptions &""'"); 
  }
  if (!argp4) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBValue_CreateValueFromExpression" "', argument " "4"" of type '" "lldb::SBExpressionOptions &""'"); 
  }
  arg4 = reinterpret_cast< lldb::SBExpressionOptions * >(argp4);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->CreateValueFromExpression((char const *)arg2,(char const *)arg3,*arg4);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBValue(static_cast< const lldb::SBValue& >(result))), SWIGTYPE_p_lldb__SBValue, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_CreateValueFromExpression(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[5];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 4); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 3) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBValue, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        int res = SWIG_AsCharPtrAndSize(argv[2], 0, NULL, 0);
        _v = SWIG_CheckState(res);
        if (_v) {
          return _wrap_SBValue_CreateValueFromExpression__SWIG_0(self, args);
        }
      }
    }
  }
  if (argc == 4) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBValue, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        int res = SWIG_AsCharPtrAndSize(argv[2], 0, NULL, 0);
        _v = SWIG_CheckState(res);
        if (_v) {
          void *vptr = 0;
          int res = SWIG_ConvertPtr(argv[3], &vptr, SWIGTYPE_p_lldb__SBExpressionOptions, 0);
          _v = SWIG_CheckState(res);
          if (_v) {
            return _wrap_SBValue_CreateValueFromExpression__SWIG_1(self, args);
          }
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBValue_CreateValueFromExpression'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    CreateValueFromExpression(lldb::SBValue *,char const *,char const *)\n"
    "    CreateValueFromExpression(lldb::SBValue *,char const *,char const *,lldb::SBExpressionOptions &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_CreateValueFromAddress(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  char *arg2 = (char *) 0 ;
  lldb::addr_t arg3 ;
  lldb::SBType arg4 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  unsigned long long val3 ;
  int ecode3 = 0 ;
  void *argp4 ;
  int res4 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  lldb::SBValue result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOO:SBValue_CreateValueFromAddress",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_CreateValueFromAddress" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBValue_CreateValueFromAddress" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  ecode3 = SWIG_AsVal_unsigned_SS_long_SS_long(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBValue_CreateValueFromAddress" "', argument " "3"" of type '" "lldb::addr_t""'");
  } 
  arg3 = static_cast< lldb::addr_t >(val3);
  {
    res4 = SWIG_ConvertPtr(obj3, &argp4, SWIGTYPE_p_lldb__SBType,  0  | 0);
    if (!SWIG_IsOK(res4)) {
      SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "SBValue_CreateValueFromAddress" "', argument " "4"" of type '" "lldb::SBType""'"); 
    }  
    if (!argp4) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBValue_CreateValueFromAddress" "', argument " "4"" of type '" "lldb::SBType""'");
    } else {
      lldb::SBType * temp = reinterpret_cast< lldb::SBType * >(argp4);
      arg4 = *temp;
      if (SWIG_IsNewObj(res4)) delete temp;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->CreateValueFromAddress((char const *)arg2,arg3,arg4);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBValue(static_cast< const lldb::SBValue& >(result))), SWIGTYPE_p_lldb__SBValue, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_CreateValueFromData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  char *arg2 = (char *) 0 ;
  lldb::SBData arg3 ;
  lldb::SBType arg4 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  void *argp3 ;
  int res3 = 0 ;
  void *argp4 ;
  int res4 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  lldb::SBValue result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOO:SBValue_CreateValueFromData",&obj0,&obj1,&obj2,&obj3)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_CreateValueFromData" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBValue_CreateValueFromData" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBData,  0  | 0);
    if (!SWIG_IsOK(res3)) {
      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBValue_CreateValueFromData" "', argument " "3"" of type '" "lldb::SBData""'"); 
    }  
    if (!argp3) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBValue_CreateValueFromData" "', argument " "3"" of type '" "lldb::SBData""'");
    } else {
      lldb::SBData * temp = reinterpret_cast< lldb::SBData * >(argp3);
      arg3 = *temp;
      if (SWIG_IsNewObj(res3)) delete temp;
    }
  }
  {
    res4 = SWIG_ConvertPtr(obj3, &argp4, SWIGTYPE_p_lldb__SBType,  0  | 0);
    if (!SWIG_IsOK(res4)) {
      SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "SBValue_CreateValueFromData" "', argument " "4"" of type '" "lldb::SBType""'"); 
    }  
    if (!argp4) {
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBValue_CreateValueFromData" "', argument " "4"" of type '" "lldb::SBType""'");
    } else {
      lldb::SBType * temp = reinterpret_cast< lldb::SBType * >(argp4);
      arg4 = *temp;
      if (SWIG_IsNewObj(res4)) delete temp;
    }
  }
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->CreateValueFromData((char const *)arg2,arg3,arg4);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBValue(static_cast< const lldb::SBValue& >(result))), SWIGTYPE_p_lldb__SBValue, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBType result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValue_GetType",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetType" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetType();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBType(static_cast< const lldb::SBType& >(result))), SWIGTYPE_p_lldb__SBType, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetIndexOfChildWithName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBValue_GetIndexOfChildWithName",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetIndexOfChildWithName" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBValue_GetIndexOfChildWithName" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetIndexOfChildWithName((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetChildMemberWithName__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBValue result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBValue_GetChildMemberWithName",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetChildMemberWithName" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBValue_GetChildMemberWithName" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetChildMemberWithName((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBValue(static_cast< const lldb::SBValue& >(result))), SWIGTYPE_p_lldb__SBValue, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetChildMemberWithName__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  char *arg2 = (char *) 0 ;
  lldb::DynamicValueType arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  int val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBValue result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBValue_GetChildMemberWithName",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetChildMemberWithName" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBValue_GetChildMemberWithName" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  ecode3 = SWIG_AsVal_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBValue_GetChildMemberWithName" "', argument " "3"" of type '" "lldb::DynamicValueType""'");
  } 
  arg3 = static_cast< lldb::DynamicValueType >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetChildMemberWithName((char const *)arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBValue(static_cast< const lldb::SBValue& >(result))), SWIGTYPE_p_lldb__SBValue, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetChildMemberWithName(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[4];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 3); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBValue, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        return _wrap_SBValue_GetChildMemberWithName__SWIG_0(self, args);
      }
    }
  }
  if (argc == 3) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBValue, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        {
          int res = SWIG_AsVal_int(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          return _wrap_SBValue_GetChildMemberWithName__SWIG_1(self, args);
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBValue_GetChildMemberWithName'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    GetChildMemberWithName(lldb::SBValue *,char const *)\n"
    "    GetChildMemberWithName(lldb::SBValue *,char const *,lldb::DynamicValueType)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetValueForExpressionPath(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBValue result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBValue_GetValueForExpressionPath",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetValueForExpressionPath" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBValue_GetValueForExpressionPath" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetValueForExpressionPath((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBValue(static_cast< const lldb::SBValue& >(result))), SWIGTYPE_p_lldb__SBValue, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetDeclaration(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBDeclaration result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValue_GetDeclaration",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetDeclaration" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetDeclaration();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBDeclaration(static_cast< const lldb::SBDeclaration& >(result))), SWIGTYPE_p_lldb__SBDeclaration, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_MightHaveChildren(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValue_MightHaveChildren",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_MightHaveChildren" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->MightHaveChildren();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_IsRuntimeSupportValue(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValue_IsRuntimeSupportValue",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_IsRuntimeSupportValue" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsRuntimeSupportValue();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetNumChildren__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValue_GetNumChildren",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetNumChildren" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetNumChildren();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetNumChildren__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBValue_GetNumChildren",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetNumChildren" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBValue_GetNumChildren" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetNumChildren(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetNumChildren(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[3];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 2); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 1) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBValue, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_SBValue_GetNumChildren__SWIG_0(self, args);
    }
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBValue, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_unsigned_SS_int(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        return _wrap_SBValue_GetNumChildren__SWIG_1(self, args);
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBValue_GetNumChildren'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    GetNumChildren(lldb::SBValue *)\n"
    "    GetNumChildren(lldb::SBValue *,uint32_t)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetOpaqueType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  void *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValue_GetOpaqueType",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetOpaqueType" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (void *)(arg1)->GetOpaqueType();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_void, 0 |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_Dereference(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBValue result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValue_Dereference",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_Dereference" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->Dereference();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBValue(static_cast< const lldb::SBValue& >(result))), SWIGTYPE_p_lldb__SBValue, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_AddressOf(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBValue result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValue_AddressOf",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_AddressOf" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->AddressOf();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBValue(static_cast< const lldb::SBValue& >(result))), SWIGTYPE_p_lldb__SBValue, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_TypeIsPointerType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValue_TypeIsPointerType",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_TypeIsPointerType" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->TypeIsPointerType();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetTarget(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBTarget result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValue_GetTarget",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetTarget" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetTarget();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBTarget(static_cast< const lldb::SBTarget& >(result))), SWIGTYPE_p_lldb__SBTarget, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetProcess(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBProcess result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValue_GetProcess",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetProcess" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetProcess();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBProcess(static_cast< const lldb::SBProcess& >(result))), SWIGTYPE_p_lldb__SBProcess, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetThread(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBThread result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValue_GetThread",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetThread" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetThread();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBThread(static_cast< const lldb::SBThread& >(result))), SWIGTYPE_p_lldb__SBThread, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetFrame(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBFrame result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValue_GetFrame",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetFrame" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetFrame();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBFrame(static_cast< const lldb::SBFrame& >(result))), SWIGTYPE_p_lldb__SBFrame, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_Watch(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  bool arg2 ;
  bool arg3 ;
  bool arg4 ;
  lldb::SBError *arg5 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  bool val3 ;
  int ecode3 = 0 ;
  bool val4 ;
  int ecode4 = 0 ;
  void *argp5 = 0 ;
  int res5 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  PyObject * obj4 = 0 ;
  lldb::SBWatchpoint result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOOO:SBValue_Watch",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_Watch" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBValue_Watch" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  ecode3 = SWIG_AsVal_bool(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBValue_Watch" "', argument " "3"" of type '" "bool""'");
  } 
  arg3 = static_cast< bool >(val3);
  ecode4 = SWIG_AsVal_bool(obj3, &val4);
  if (!SWIG_IsOK(ecode4)) {
    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "SBValue_Watch" "', argument " "4"" of type '" "bool""'");
  } 
  arg4 = static_cast< bool >(val4);
  res5 = SWIG_ConvertPtr(obj4, &argp5, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res5)) {
    SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "SBValue_Watch" "', argument " "5"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp5) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBValue_Watch" "', argument " "5"" of type '" "lldb::SBError &""'"); 
  }
  arg5 = reinterpret_cast< lldb::SBError * >(argp5);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->Watch(arg2,arg3,arg4,*arg5);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBWatchpoint(static_cast< const lldb::SBWatchpoint& >(result))), SWIGTYPE_p_lldb__SBWatchpoint, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_WatchPointee(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  bool arg2 ;
  bool arg3 ;
  bool arg4 ;
  lldb::SBError *arg5 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  bool val3 ;
  int ecode3 = 0 ;
  bool val4 ;
  int ecode4 = 0 ;
  void *argp5 = 0 ;
  int res5 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  PyObject * obj3 = 0 ;
  PyObject * obj4 = 0 ;
  lldb::SBWatchpoint result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOOOO:SBValue_WatchPointee",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_WatchPointee" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBValue_WatchPointee" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  ecode3 = SWIG_AsVal_bool(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBValue_WatchPointee" "', argument " "3"" of type '" "bool""'");
  } 
  arg3 = static_cast< bool >(val3);
  ecode4 = SWIG_AsVal_bool(obj3, &val4);
  if (!SWIG_IsOK(ecode4)) {
    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "SBValue_WatchPointee" "', argument " "4"" of type '" "bool""'");
  } 
  arg4 = static_cast< bool >(val4);
  res5 = SWIG_ConvertPtr(obj4, &argp5, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res5)) {
    SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "SBValue_WatchPointee" "', argument " "5"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp5) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBValue_WatchPointee" "', argument " "5"" of type '" "lldb::SBError &""'"); 
  }
  arg5 = reinterpret_cast< lldb::SBError * >(argp5);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->WatchPointee(arg2,arg3,arg4,*arg5);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBWatchpoint(static_cast< const lldb::SBWatchpoint& >(result))), SWIGTYPE_p_lldb__SBWatchpoint, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetDescription(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBValue_GetDescription",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetDescription" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBValue_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBValue_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetDescription(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetExpressionPath__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBValue_GetExpressionPath",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetExpressionPath" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBValue_GetExpressionPath" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBValue_GetExpressionPath" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetExpressionPath(*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetPointeeData__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  uint32_t arg2 ;
  uint32_t arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  unsigned int val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  lldb::SBData result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBValue_GetPointeeData",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetPointeeData" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBValue_GetPointeeData" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  ecode3 = SWIG_AsVal_unsigned_SS_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBValue_GetPointeeData" "', argument " "3"" of type '" "uint32_t""'");
  } 
  arg3 = static_cast< uint32_t >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetPointeeData(arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBData(static_cast< const lldb::SBData& >(result))), SWIGTYPE_p_lldb__SBData, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetPointeeData__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBData result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBValue_GetPointeeData",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetPointeeData" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBValue_GetPointeeData" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetPointeeData(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBData(static_cast< const lldb::SBData& >(result))), SWIGTYPE_p_lldb__SBData, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetPointeeData__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBData result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValue_GetPointeeData",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetPointeeData" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetPointeeData();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBData(static_cast< const lldb::SBData& >(result))), SWIGTYPE_p_lldb__SBData, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetPointeeData(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[4];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 3); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 1) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBValue, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_SBValue_GetPointeeData__SWIG_2(self, args);
    }
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBValue, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_unsigned_SS_int(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        return _wrap_SBValue_GetPointeeData__SWIG_1(self, args);
      }
    }
  }
  if (argc == 3) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBValue, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      {
        int res = SWIG_AsVal_unsigned_SS_int(argv[1], NULL);
        _v = SWIG_CheckState(res);
      }
      if (_v) {
        {
          int res = SWIG_AsVal_unsigned_SS_int(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          return _wrap_SBValue_GetPointeeData__SWIG_0(self, args);
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBValue_GetPointeeData'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    GetPointeeData(lldb::SBValue *,uint32_t,uint32_t)\n"
    "    GetPointeeData(lldb::SBValue *,uint32_t)\n"
    "    GetPointeeData(lldb::SBValue *)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBData result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValue_GetData",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetData" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetData();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBData(static_cast< const lldb::SBData& >(result))), SWIGTYPE_p_lldb__SBData, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_SetData(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  lldb::SBData *arg2 = 0 ;
  lldb::SBError *arg3 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  void *argp3 = 0 ;
  int res3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBValue_SetData",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_SetData" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBData,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBValue_SetData" "', argument " "2"" of type '" "lldb::SBData &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBValue_SetData" "', argument " "2"" of type '" "lldb::SBData &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBData * >(argp2);
  res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_lldb__SBError,  0 );
  if (!SWIG_IsOK(res3)) {
    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "SBValue_SetData" "', argument " "3"" of type '" "lldb::SBError &""'"); 
  }
  if (!argp3) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBValue_SetData" "', argument " "3"" of type '" "lldb::SBError &""'"); 
  }
  arg3 = reinterpret_cast< lldb::SBError * >(argp3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->SetData(*arg2,*arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetLoadAddress(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::addr_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValue_GetLoadAddress",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetLoadAddress" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::addr_t)(arg1)->GetLoadAddress();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetAddress(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBAddress result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValue_GetAddress",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetAddress" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetAddress();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBAddress(static_cast< const lldb::SBAddress& >(result))), SWIGTYPE_p_lldb__SBAddress, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_Persist(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBValue result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValue_Persist",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_Persist" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->Persist();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBValue(static_cast< const lldb::SBValue& >(result))), SWIGTYPE_p_lldb__SBValue, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetExpressionPath__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  bool arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  bool val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBValue_GetExpressionPath",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue_GetExpressionPath" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBValue_GetExpressionPath" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBValue_GetExpressionPath" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  ecode3 = SWIG_AsVal_bool(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBValue_GetExpressionPath" "', argument " "3"" of type '" "bool""'");
  } 
  arg3 = static_cast< bool >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetExpressionPath(*arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue_GetExpressionPath(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[4];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 3); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBValue, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      void *vptr = 0;
      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_lldb__SBStream, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        return _wrap_SBValue_GetExpressionPath__SWIG_0(self, args);
      }
    }
  }
  if (argc == 3) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBValue, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      void *vptr = 0;
      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_lldb__SBStream, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        {
          int res = SWIG_AsVal_bool(argv[2], NULL);
          _v = SWIG_CheckState(res);
        }
        if (_v) {
          return _wrap_SBValue_GetExpressionPath__SWIG_1(self, args);
        }
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBValue_GetExpressionPath'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    GetExpressionPath(lldb::SBValue *,lldb::SBStream &)\n"
    "    GetExpressionPath(lldb::SBValue *,lldb::SBStream &,bool)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValue___str__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValue *arg1 = (lldb::SBValue *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValue___str__",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValue, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValue___str__" "', argument " "1"" of type '" "lldb::SBValue *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValue * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (PyObject *)lldb_SBValue___str__(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = result;
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBValue_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBValue, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBValueList__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValueList *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBValueList")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBValueList *)new lldb::SBValueList();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBValueList, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBValueList__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValueList *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBValueList *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBValueList",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBValueList,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBValueList" "', argument " "1"" of type '" "lldb::SBValueList const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBValueList" "', argument " "1"" of type '" "lldb::SBValueList const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValueList * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBValueList *)new lldb::SBValueList((lldb::SBValueList const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBValueList, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBValueList(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBValueList__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBValueList, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBValueList__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBValueList'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBValueList()\n"
    "    lldb::SBValueList(lldb::SBValueList const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBValueList(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValueList *arg1 = (lldb::SBValueList *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBValueList",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValueList, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBValueList" "', argument " "1"" of type '" "lldb::SBValueList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValueList * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValueList_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValueList *arg1 = (lldb::SBValueList *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValueList_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValueList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValueList_IsValid" "', argument " "1"" of type '" "lldb::SBValueList const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValueList * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBValueList const *)arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValueList_Clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValueList *arg1 = (lldb::SBValueList *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValueList_Clear",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValueList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValueList_Clear" "', argument " "1"" of type '" "lldb::SBValueList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValueList * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->Clear();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValueList_Append__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValueList *arg1 = (lldb::SBValueList *) 0 ;
  lldb::SBValue *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBValueList_Append",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValueList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValueList_Append" "', argument " "1"" of type '" "lldb::SBValueList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValueList * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBValue,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBValueList_Append" "', argument " "2"" of type '" "lldb::SBValue const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBValueList_Append" "', argument " "2"" of type '" "lldb::SBValue const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBValue * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->Append((lldb::SBValue const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValueList_Append__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValueList *arg1 = (lldb::SBValueList *) 0 ;
  lldb::SBValueList *arg2 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBValueList_Append",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValueList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValueList_Append" "', argument " "1"" of type '" "lldb::SBValueList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValueList * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBValueList,  0  | 0);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBValueList_Append" "', argument " "2"" of type '" "lldb::SBValueList const &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBValueList_Append" "', argument " "2"" of type '" "lldb::SBValueList const &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBValueList * >(argp2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->Append((lldb::SBValueList const &)*arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValueList_Append(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[3];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 2); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBValueList, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_lldb__SBValue, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        return _wrap_SBValueList_Append__SWIG_0(self, args);
      }
    }
  }
  if (argc == 2) {
    int _v;
    void *vptr = 0;
    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_lldb__SBValueList, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_lldb__SBValueList, 0);
      _v = SWIG_CheckState(res);
      if (_v) {
        return _wrap_SBValueList_Append__SWIG_1(self, args);
      }
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'SBValueList_Append'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    Append(lldb::SBValueList *,lldb::SBValue const &)\n"
    "    Append(lldb::SBValueList *,lldb::SBValueList const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValueList_GetSize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValueList *arg1 = (lldb::SBValueList *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValueList_GetSize",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValueList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValueList_GetSize" "', argument " "1"" of type '" "lldb::SBValueList const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValueList * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)((lldb::SBValueList const *)arg1)->GetSize();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValueList_GetValueAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValueList *arg1 = (lldb::SBValueList *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBValue result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBValueList_GetValueAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValueList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValueList_GetValueAtIndex" "', argument " "1"" of type '" "lldb::SBValueList const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValueList * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBValueList_GetValueAtIndex" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBValueList const *)arg1)->GetValueAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBValue(static_cast< const lldb::SBValue& >(result))), SWIGTYPE_p_lldb__SBValue, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValueList_FindValueObjectByUID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValueList *arg1 = (lldb::SBValueList *) 0 ;
  lldb::user_id_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned long long val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBValue result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBValueList_FindValueObjectByUID",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValueList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValueList_FindValueObjectByUID" "', argument " "1"" of type '" "lldb::SBValueList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValueList * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_long_SS_long(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBValueList_FindValueObjectByUID" "', argument " "2"" of type '" "lldb::user_id_t""'");
  } 
  arg2 = static_cast< lldb::user_id_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->FindValueObjectByUID(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBValue(static_cast< const lldb::SBValue& >(result))), SWIGTYPE_p_lldb__SBValue, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValueList_GetFirstValueByName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValueList *arg1 = (lldb::SBValueList *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  lldb::SBValue result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBValueList_GetFirstValueByName",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValueList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValueList_GetFirstValueByName" "', argument " "1"" of type '" "lldb::SBValueList const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValueList * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBValueList_GetFirstValueByName" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = ((lldb::SBValueList const *)arg1)->GetFirstValueByName((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBValue(static_cast< const lldb::SBValue& >(result))), SWIGTYPE_p_lldb__SBValue, SWIG_POINTER_OWN |  0 );
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBValueList___str__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBValueList *arg1 = (lldb::SBValueList *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBValueList___str__",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBValueList, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBValueList___str__" "', argument " "1"" of type '" "lldb::SBValueList *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBValueList * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (PyObject *)lldb_SBValueList___str__(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = result;
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBValueList_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBValueList, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBVariablesOptions__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBVariablesOptions *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBVariablesOptions")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBVariablesOptions *)new lldb::SBVariablesOptions();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBVariablesOptions, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBVariablesOptions__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBVariablesOptions *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBVariablesOptions *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBVariablesOptions",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBVariablesOptions,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBVariablesOptions" "', argument " "1"" of type '" "lldb::SBVariablesOptions const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBVariablesOptions" "', argument " "1"" of type '" "lldb::SBVariablesOptions const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBVariablesOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBVariablesOptions *)new lldb::SBVariablesOptions((lldb::SBVariablesOptions const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBVariablesOptions, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBVariablesOptions(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBVariablesOptions__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBVariablesOptions, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBVariablesOptions__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBVariablesOptions'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBVariablesOptions()\n"
    "    lldb::SBVariablesOptions(lldb::SBVariablesOptions const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBVariablesOptions(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBVariablesOptions *arg1 = (lldb::SBVariablesOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBVariablesOptions",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBVariablesOptions, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBVariablesOptions" "', argument " "1"" of type '" "lldb::SBVariablesOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBVariablesOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBVariablesOptions_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBVariablesOptions *arg1 = (lldb::SBVariablesOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBVariablesOptions_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBVariablesOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBVariablesOptions_IsValid" "', argument " "1"" of type '" "lldb::SBVariablesOptions const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBVariablesOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBVariablesOptions const *)arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBVariablesOptions_GetIncludeArguments(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBVariablesOptions *arg1 = (lldb::SBVariablesOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBVariablesOptions_GetIncludeArguments",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBVariablesOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBVariablesOptions_GetIncludeArguments" "', argument " "1"" of type '" "lldb::SBVariablesOptions const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBVariablesOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBVariablesOptions const *)arg1)->GetIncludeArguments();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBVariablesOptions_SetIncludeArguments(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBVariablesOptions *arg1 = (lldb::SBVariablesOptions *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBVariablesOptions_SetIncludeArguments",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBVariablesOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBVariablesOptions_SetIncludeArguments" "', argument " "1"" of type '" "lldb::SBVariablesOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBVariablesOptions * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBVariablesOptions_SetIncludeArguments" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetIncludeArguments(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBVariablesOptions_GetIncludeLocals(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBVariablesOptions *arg1 = (lldb::SBVariablesOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBVariablesOptions_GetIncludeLocals",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBVariablesOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBVariablesOptions_GetIncludeLocals" "', argument " "1"" of type '" "lldb::SBVariablesOptions const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBVariablesOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBVariablesOptions const *)arg1)->GetIncludeLocals();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBVariablesOptions_SetIncludeLocals(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBVariablesOptions *arg1 = (lldb::SBVariablesOptions *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBVariablesOptions_SetIncludeLocals",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBVariablesOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBVariablesOptions_SetIncludeLocals" "', argument " "1"" of type '" "lldb::SBVariablesOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBVariablesOptions * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBVariablesOptions_SetIncludeLocals" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetIncludeLocals(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBVariablesOptions_GetIncludeStatics(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBVariablesOptions *arg1 = (lldb::SBVariablesOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBVariablesOptions_GetIncludeStatics",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBVariablesOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBVariablesOptions_GetIncludeStatics" "', argument " "1"" of type '" "lldb::SBVariablesOptions const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBVariablesOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBVariablesOptions const *)arg1)->GetIncludeStatics();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBVariablesOptions_SetIncludeStatics(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBVariablesOptions *arg1 = (lldb::SBVariablesOptions *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBVariablesOptions_SetIncludeStatics",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBVariablesOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBVariablesOptions_SetIncludeStatics" "', argument " "1"" of type '" "lldb::SBVariablesOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBVariablesOptions * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBVariablesOptions_SetIncludeStatics" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetIncludeStatics(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBVariablesOptions_GetInScopeOnly(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBVariablesOptions *arg1 = (lldb::SBVariablesOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBVariablesOptions_GetInScopeOnly",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBVariablesOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBVariablesOptions_GetInScopeOnly" "', argument " "1"" of type '" "lldb::SBVariablesOptions const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBVariablesOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBVariablesOptions const *)arg1)->GetInScopeOnly();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBVariablesOptions_SetInScopeOnly(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBVariablesOptions *arg1 = (lldb::SBVariablesOptions *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBVariablesOptions_SetInScopeOnly",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBVariablesOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBVariablesOptions_SetInScopeOnly" "', argument " "1"" of type '" "lldb::SBVariablesOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBVariablesOptions * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBVariablesOptions_SetInScopeOnly" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetInScopeOnly(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBVariablesOptions_GetIncludeRuntimeSupportValues(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBVariablesOptions *arg1 = (lldb::SBVariablesOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBVariablesOptions_GetIncludeRuntimeSupportValues",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBVariablesOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBVariablesOptions_GetIncludeRuntimeSupportValues" "', argument " "1"" of type '" "lldb::SBVariablesOptions const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBVariablesOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBVariablesOptions const *)arg1)->GetIncludeRuntimeSupportValues();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBVariablesOptions_SetIncludeRuntimeSupportValues(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBVariablesOptions *arg1 = (lldb::SBVariablesOptions *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBVariablesOptions_SetIncludeRuntimeSupportValues",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBVariablesOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBVariablesOptions_SetIncludeRuntimeSupportValues" "', argument " "1"" of type '" "lldb::SBVariablesOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBVariablesOptions * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBVariablesOptions_SetIncludeRuntimeSupportValues" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetIncludeRuntimeSupportValues(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBVariablesOptions_GetUseDynamic(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBVariablesOptions *arg1 = (lldb::SBVariablesOptions *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::DynamicValueType result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBVariablesOptions_GetUseDynamic",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBVariablesOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBVariablesOptions_GetUseDynamic" "', argument " "1"" of type '" "lldb::SBVariablesOptions const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBVariablesOptions * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::DynamicValueType)((lldb::SBVariablesOptions const *)arg1)->GetUseDynamic();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBVariablesOptions_SetUseDynamic(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBVariablesOptions *arg1 = (lldb::SBVariablesOptions *) 0 ;
  lldb::DynamicValueType arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBVariablesOptions_SetUseDynamic",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBVariablesOptions, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBVariablesOptions_SetUseDynamic" "', argument " "1"" of type '" "lldb::SBVariablesOptions *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBVariablesOptions * >(argp1);
  ecode2 = SWIG_AsVal_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBVariablesOptions_SetUseDynamic" "', argument " "2"" of type '" "lldb::DynamicValueType""'");
  } 
  arg2 = static_cast< lldb::DynamicValueType >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetUseDynamic(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBVariablesOptions_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBVariablesOptions, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBWatchpoint__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBWatchpoint *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBWatchpoint")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBWatchpoint *)new lldb::SBWatchpoint();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBWatchpoint, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBWatchpoint__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBWatchpoint *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBWatchpoint *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBWatchpoint",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBWatchpoint,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBWatchpoint" "', argument " "1"" of type '" "lldb::SBWatchpoint const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBWatchpoint" "', argument " "1"" of type '" "lldb::SBWatchpoint const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBWatchpoint * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBWatchpoint *)new lldb::SBWatchpoint((lldb::SBWatchpoint const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBWatchpoint, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBWatchpoint(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBWatchpoint__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBWatchpoint, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBWatchpoint__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBWatchpoint'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBWatchpoint()\n"
    "    lldb::SBWatchpoint(lldb::SBWatchpoint const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBWatchpoint(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBWatchpoint *arg1 = (lldb::SBWatchpoint *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBWatchpoint",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBWatchpoint, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBWatchpoint" "', argument " "1"" of type '" "lldb::SBWatchpoint *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBWatchpoint * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBWatchpoint_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBWatchpoint *arg1 = (lldb::SBWatchpoint *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBWatchpoint_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBWatchpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBWatchpoint_IsValid" "', argument " "1"" of type '" "lldb::SBWatchpoint *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBWatchpoint * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBWatchpoint_GetError(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBWatchpoint *arg1 = (lldb::SBWatchpoint *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBError result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBWatchpoint_GetError",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBWatchpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBWatchpoint_GetError" "', argument " "1"" of type '" "lldb::SBWatchpoint *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBWatchpoint * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetError();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBError(static_cast< const lldb::SBError& >(result))), SWIGTYPE_p_lldb__SBError, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBWatchpoint_GetID(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBWatchpoint *arg1 = (lldb::SBWatchpoint *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::watch_id_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBWatchpoint_GetID",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBWatchpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBWatchpoint_GetID" "', argument " "1"" of type '" "lldb::SBWatchpoint *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBWatchpoint * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::watch_id_t)(arg1)->GetID();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBWatchpoint_GetHardwareIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBWatchpoint *arg1 = (lldb::SBWatchpoint *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  int32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBWatchpoint_GetHardwareIndex",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBWatchpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBWatchpoint_GetHardwareIndex" "', argument " "1"" of type '" "lldb::SBWatchpoint *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBWatchpoint * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (int32_t)(arg1)->GetHardwareIndex();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBWatchpoint_GetWatchAddress(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBWatchpoint *arg1 = (lldb::SBWatchpoint *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::addr_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBWatchpoint_GetWatchAddress",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBWatchpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBWatchpoint_GetWatchAddress" "', argument " "1"" of type '" "lldb::SBWatchpoint *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBWatchpoint * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::addr_t)(arg1)->GetWatchAddress();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBWatchpoint_GetWatchSize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBWatchpoint *arg1 = (lldb::SBWatchpoint *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  size_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBWatchpoint_GetWatchSize",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBWatchpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBWatchpoint_GetWatchSize" "', argument " "1"" of type '" "lldb::SBWatchpoint *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBWatchpoint * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (arg1)->GetWatchSize();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBWatchpoint_SetEnabled(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBWatchpoint *arg1 = (lldb::SBWatchpoint *) 0 ;
  bool arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  bool val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBWatchpoint_SetEnabled",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBWatchpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBWatchpoint_SetEnabled" "', argument " "1"" of type '" "lldb::SBWatchpoint *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBWatchpoint * >(argp1);
  ecode2 = SWIG_AsVal_bool(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBWatchpoint_SetEnabled" "', argument " "2"" of type '" "bool""'");
  } 
  arg2 = static_cast< bool >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetEnabled(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBWatchpoint_IsEnabled(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBWatchpoint *arg1 = (lldb::SBWatchpoint *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBWatchpoint_IsEnabled",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBWatchpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBWatchpoint_IsEnabled" "', argument " "1"" of type '" "lldb::SBWatchpoint *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBWatchpoint * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->IsEnabled();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBWatchpoint_GetHitCount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBWatchpoint *arg1 = (lldb::SBWatchpoint *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBWatchpoint_GetHitCount",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBWatchpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBWatchpoint_GetHitCount" "', argument " "1"" of type '" "lldb::SBWatchpoint *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBWatchpoint * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetHitCount();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBWatchpoint_GetIgnoreCount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBWatchpoint *arg1 = (lldb::SBWatchpoint *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  uint32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBWatchpoint_GetIgnoreCount",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBWatchpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBWatchpoint_GetIgnoreCount" "', argument " "1"" of type '" "lldb::SBWatchpoint *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBWatchpoint * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (uint32_t)(arg1)->GetIgnoreCount();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_unsigned_SS_int(static_cast< unsigned int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBWatchpoint_SetIgnoreCount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBWatchpoint *arg1 = (lldb::SBWatchpoint *) 0 ;
  uint32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  unsigned int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBWatchpoint_SetIgnoreCount",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBWatchpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBWatchpoint_SetIgnoreCount" "', argument " "1"" of type '" "lldb::SBWatchpoint *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBWatchpoint * >(argp1);
  ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBWatchpoint_SetIgnoreCount" "', argument " "2"" of type '" "uint32_t""'");
  } 
  arg2 = static_cast< uint32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetIgnoreCount(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBWatchpoint_GetCondition(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBWatchpoint *arg1 = (lldb::SBWatchpoint *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBWatchpoint_GetCondition",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBWatchpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBWatchpoint_GetCondition" "', argument " "1"" of type '" "lldb::SBWatchpoint *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBWatchpoint * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)(arg1)->GetCondition();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBWatchpoint_SetCondition(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBWatchpoint *arg1 = (lldb::SBWatchpoint *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBWatchpoint_SetCondition",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBWatchpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBWatchpoint_SetCondition" "', argument " "1"" of type '" "lldb::SBWatchpoint *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBWatchpoint * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBWatchpoint_SetCondition" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->SetCondition((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBWatchpoint_GetDescription(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBWatchpoint *arg1 = (lldb::SBWatchpoint *) 0 ;
  lldb::SBStream *arg2 = 0 ;
  lldb::DescriptionLevel arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  void *argp2 = 0 ;
  int res2 = 0 ;
  int val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBWatchpoint_GetDescription",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBWatchpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBWatchpoint_GetDescription" "', argument " "1"" of type '" "lldb::SBWatchpoint *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBWatchpoint * >(argp1);
  res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_lldb__SBStream,  0 );
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBWatchpoint_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  if (!argp2) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBWatchpoint_GetDescription" "', argument " "2"" of type '" "lldb::SBStream &""'"); 
  }
  arg2 = reinterpret_cast< lldb::SBStream * >(argp2);
  ecode3 = SWIG_AsVal_int(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBWatchpoint_GetDescription" "', argument " "3"" of type '" "lldb::DescriptionLevel""'");
  } 
  arg3 = static_cast< lldb::DescriptionLevel >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->GetDescription(*arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBWatchpoint_EventIsWatchpointEvent(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBEvent *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBWatchpoint_EventIsWatchpointEvent",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBEvent,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBWatchpoint_EventIsWatchpointEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBWatchpoint_EventIsWatchpointEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBEvent * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)lldb::SBWatchpoint::EventIsWatchpointEvent((lldb::SBEvent const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBWatchpoint_GetWatchpointEventTypeFromEvent(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBEvent *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::WatchpointEventType result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBWatchpoint_GetWatchpointEventTypeFromEvent",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBEvent,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBWatchpoint_GetWatchpointEventTypeFromEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBWatchpoint_GetWatchpointEventTypeFromEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBEvent * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::WatchpointEventType)lldb::SBWatchpoint::GetWatchpointEventTypeFromEvent((lldb::SBEvent const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBWatchpoint_GetWatchpointFromEvent(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBEvent *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBWatchpoint result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBWatchpoint_GetWatchpointFromEvent",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBEvent,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBWatchpoint_GetWatchpointFromEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SBWatchpoint_GetWatchpointFromEvent" "', argument " "1"" of type '" "lldb::SBEvent const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBEvent * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = lldb::SBWatchpoint::GetWatchpointFromEvent((lldb::SBEvent const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj((new lldb::SBWatchpoint(static_cast< const lldb::SBWatchpoint& >(result))), SWIGTYPE_p_lldb__SBWatchpoint, SWIG_POINTER_OWN |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBWatchpoint___str__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBWatchpoint *arg1 = (lldb::SBWatchpoint *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBWatchpoint___str__",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBWatchpoint, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBWatchpoint___str__" "', argument " "1"" of type '" "lldb::SBWatchpoint *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBWatchpoint * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (PyObject *)lldb_SBWatchpoint___str__(arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = result;
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBWatchpoint_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBWatchpoint, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}

SWIGINTERN PyObject *_wrap_new_SBUnixSignals__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBUnixSignals *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)":new_SBUnixSignals")) SWIG_fail;
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBUnixSignals *)new lldb::SBUnixSignals();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBUnixSignals, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBUnixSignals__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBUnixSignals *arg1 = 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  lldb::SBUnixSignals *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:new_SBUnixSignals",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_lldb__SBUnixSignals,  0  | 0);
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SBUnixSignals" "', argument " "1"" of type '" "lldb::SBUnixSignals const &""'"); 
  }
  if (!argp1) {
    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SBUnixSignals" "', argument " "1"" of type '" "lldb::SBUnixSignals const &""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBUnixSignals * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (lldb::SBUnixSignals *)new lldb::SBUnixSignals((lldb::SBUnixSignals const &)*arg1);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_lldb__SBUnixSignals, SWIG_POINTER_NEW |  0 );
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_new_SBUnixSignals(PyObject *self, PyObject *args) {
  int argc;
  PyObject *argv[2];
  int ii;
  
  if (!PyTuple_Check(args)) SWIG_fail;
  argc = (int)PyObject_Length(args);
  for (ii = 0; (ii < argc) && (ii < 1); ii++) {
    argv[ii] = PyTuple_GET_ITEM(args,ii);
  }
  if (argc == 0) {
    return _wrap_new_SBUnixSignals__SWIG_0(self, args);
  }
  if (argc == 1) {
    int _v;
    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_lldb__SBUnixSignals, 0);
    _v = SWIG_CheckState(res);
    if (_v) {
      return _wrap_new_SBUnixSignals__SWIG_1(self, args);
    }
  }
  
fail:
  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'new_SBUnixSignals'.\n"
    "  Possible C/C++ prototypes are:\n"
    "    lldb::SBUnixSignals()\n"
    "    lldb::SBUnixSignals(lldb::SBUnixSignals const &)\n");
  return NULL;
}


SWIGINTERN PyObject *_wrap_delete_SBUnixSignals(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBUnixSignals *arg1 = (lldb::SBUnixSignals *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:delete_SBUnixSignals",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBUnixSignals, SWIG_POINTER_DISOWN |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SBUnixSignals" "', argument " "1"" of type '" "lldb::SBUnixSignals *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBUnixSignals * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    delete arg1;
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBUnixSignals_Clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBUnixSignals *arg1 = (lldb::SBUnixSignals *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBUnixSignals_Clear",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBUnixSignals, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBUnixSignals_Clear" "', argument " "1"" of type '" "lldb::SBUnixSignals *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBUnixSignals * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    (arg1)->Clear();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_Py_Void();
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBUnixSignals_IsValid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBUnixSignals *arg1 = (lldb::SBUnixSignals *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBUnixSignals_IsValid",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBUnixSignals, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBUnixSignals_IsValid" "', argument " "1"" of type '" "lldb::SBUnixSignals const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBUnixSignals * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBUnixSignals const *)arg1)->IsValid();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBUnixSignals_GetSignalAsCString(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBUnixSignals *arg1 = (lldb::SBUnixSignals *) 0 ;
  int32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  char *result = 0 ;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBUnixSignals_GetSignalAsCString",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBUnixSignals, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBUnixSignals_GetSignalAsCString" "', argument " "1"" of type '" "lldb::SBUnixSignals const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBUnixSignals * >(argp1);
  ecode2 = SWIG_AsVal_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBUnixSignals_GetSignalAsCString" "', argument " "2"" of type '" "int32_t""'");
  } 
  arg2 = static_cast< int32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (char *)((lldb::SBUnixSignals const *)arg1)->GetSignalAsCString(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_FromCharPtr((const char *)result);
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBUnixSignals_GetSignalNumberFromName(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBUnixSignals *arg1 = (lldb::SBUnixSignals *) 0 ;
  char *arg2 = (char *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int res2 ;
  char *buf2 = 0 ;
  int alloc2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  int32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBUnixSignals_GetSignalNumberFromName",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBUnixSignals, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBUnixSignals_GetSignalNumberFromName" "', argument " "1"" of type '" "lldb::SBUnixSignals const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBUnixSignals * >(argp1);
  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
  if (!SWIG_IsOK(res2)) {
    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SBUnixSignals_GetSignalNumberFromName" "', argument " "2"" of type '" "char const *""'");
  }
  arg2 = reinterpret_cast< char * >(buf2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (int32_t)((lldb::SBUnixSignals const *)arg1)->GetSignalNumberFromName((char const *)arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return resultobj;
fail:
  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBUnixSignals_GetShouldSuppress(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBUnixSignals *arg1 = (lldb::SBUnixSignals *) 0 ;
  int32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBUnixSignals_GetShouldSuppress",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBUnixSignals, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBUnixSignals_GetShouldSuppress" "', argument " "1"" of type '" "lldb::SBUnixSignals const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBUnixSignals * >(argp1);
  ecode2 = SWIG_AsVal_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBUnixSignals_GetShouldSuppress" "', argument " "2"" of type '" "int32_t""'");
  } 
  arg2 = static_cast< int32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBUnixSignals const *)arg1)->GetShouldSuppress(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBUnixSignals_SetShouldSuppress(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBUnixSignals *arg1 = (lldb::SBUnixSignals *) 0 ;
  int32_t arg2 ;
  bool arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int val2 ;
  int ecode2 = 0 ;
  bool val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBUnixSignals_SetShouldSuppress",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBUnixSignals, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBUnixSignals_SetShouldSuppress" "', argument " "1"" of type '" "lldb::SBUnixSignals *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBUnixSignals * >(argp1);
  ecode2 = SWIG_AsVal_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBUnixSignals_SetShouldSuppress" "', argument " "2"" of type '" "int32_t""'");
  } 
  arg2 = static_cast< int32_t >(val2);
  ecode3 = SWIG_AsVal_bool(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBUnixSignals_SetShouldSuppress" "', argument " "3"" of type '" "bool""'");
  } 
  arg3 = static_cast< bool >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->SetShouldSuppress(arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBUnixSignals_GetShouldStop(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBUnixSignals *arg1 = (lldb::SBUnixSignals *) 0 ;
  int32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBUnixSignals_GetShouldStop",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBUnixSignals, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBUnixSignals_GetShouldStop" "', argument " "1"" of type '" "lldb::SBUnixSignals const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBUnixSignals * >(argp1);
  ecode2 = SWIG_AsVal_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBUnixSignals_GetShouldStop" "', argument " "2"" of type '" "int32_t""'");
  } 
  arg2 = static_cast< int32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBUnixSignals const *)arg1)->GetShouldStop(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBUnixSignals_SetShouldStop(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBUnixSignals *arg1 = (lldb::SBUnixSignals *) 0 ;
  int32_t arg2 ;
  bool arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int val2 ;
  int ecode2 = 0 ;
  bool val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBUnixSignals_SetShouldStop",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBUnixSignals, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBUnixSignals_SetShouldStop" "', argument " "1"" of type '" "lldb::SBUnixSignals *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBUnixSignals * >(argp1);
  ecode2 = SWIG_AsVal_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBUnixSignals_SetShouldStop" "', argument " "2"" of type '" "int32_t""'");
  } 
  arg2 = static_cast< int32_t >(val2);
  ecode3 = SWIG_AsVal_bool(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBUnixSignals_SetShouldStop" "', argument " "3"" of type '" "bool""'");
  } 
  arg3 = static_cast< bool >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->SetShouldStop(arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBUnixSignals_GetShouldNotify(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBUnixSignals *arg1 = (lldb::SBUnixSignals *) 0 ;
  int32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBUnixSignals_GetShouldNotify",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBUnixSignals, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBUnixSignals_GetShouldNotify" "', argument " "1"" of type '" "lldb::SBUnixSignals const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBUnixSignals * >(argp1);
  ecode2 = SWIG_AsVal_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBUnixSignals_GetShouldNotify" "', argument " "2"" of type '" "int32_t""'");
  } 
  arg2 = static_cast< int32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)((lldb::SBUnixSignals const *)arg1)->GetShouldNotify(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBUnixSignals_SetShouldNotify(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBUnixSignals *arg1 = (lldb::SBUnixSignals *) 0 ;
  int32_t arg2 ;
  bool arg3 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int val2 ;
  int ecode2 = 0 ;
  bool val3 ;
  int ecode3 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  PyObject * obj2 = 0 ;
  bool result;
  
  if (!PyArg_ParseTuple(args,(char *)"OOO:SBUnixSignals_SetShouldNotify",&obj0,&obj1,&obj2)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBUnixSignals, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBUnixSignals_SetShouldNotify" "', argument " "1"" of type '" "lldb::SBUnixSignals *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBUnixSignals * >(argp1);
  ecode2 = SWIG_AsVal_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBUnixSignals_SetShouldNotify" "', argument " "2"" of type '" "int32_t""'");
  } 
  arg2 = static_cast< int32_t >(val2);
  ecode3 = SWIG_AsVal_bool(obj2, &val3);
  if (!SWIG_IsOK(ecode3)) {
    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "SBUnixSignals_SetShouldNotify" "', argument " "3"" of type '" "bool""'");
  } 
  arg3 = static_cast< bool >(val3);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (bool)(arg1)->SetShouldNotify(arg2,arg3);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_bool(static_cast< bool >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBUnixSignals_GetNumSignals(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBUnixSignals *arg1 = (lldb::SBUnixSignals *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  int32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"O:SBUnixSignals_GetNumSignals",&obj0)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBUnixSignals, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBUnixSignals_GetNumSignals" "', argument " "1"" of type '" "lldb::SBUnixSignals const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBUnixSignals * >(argp1);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (int32_t)((lldb::SBUnixSignals const *)arg1)->GetNumSignals();
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *_wrap_SBUnixSignals_GetSignalAtIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  lldb::SBUnixSignals *arg1 = (lldb::SBUnixSignals *) 0 ;
  int32_t arg2 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  int val2 ;
  int ecode2 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  int32_t result;
  
  if (!PyArg_ParseTuple(args,(char *)"OO:SBUnixSignals_GetSignalAtIndex",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_lldb__SBUnixSignals, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SBUnixSignals_GetSignalAtIndex" "', argument " "1"" of type '" "lldb::SBUnixSignals const *""'"); 
  }
  arg1 = reinterpret_cast< lldb::SBUnixSignals * >(argp1);
  ecode2 = SWIG_AsVal_int(obj1, &val2);
  if (!SWIG_IsOK(ecode2)) {
    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SBUnixSignals_GetSignalAtIndex" "', argument " "2"" of type '" "int32_t""'");
  } 
  arg2 = static_cast< int32_t >(val2);
  {
    SWIG_PYTHON_THREAD_BEGIN_ALLOW;
    result = (int32_t)((lldb::SBUnixSignals const *)arg1)->GetSignalAtIndex(arg2);
    SWIG_PYTHON_THREAD_END_ALLOW;
  }
  resultobj = SWIG_From_int(static_cast< int >(result));
  return resultobj;
fail:
  return NULL;
}


SWIGINTERN PyObject *SBUnixSignals_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *obj;
  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
  SWIG_TypeNewClientData(SWIGTYPE_p_lldb__SBUnixSignals, SWIG_NewClientData(obj));
  return SWIG_Py_Void();
}



// resolve a dotted Python name in the form
// foo.bar.baz.Foobar to an actual Python object
// if pmodule is NULL, the __main__ module will be used
// as the starting point for the search


// This function is called by lldb_private::ScriptInterpreterPython::BreakpointCallbackFunction(...)
// and is used when a script command is attached to a breakpoint for execution.

SWIGEXPORT bool
LLDBSwigPythonBreakpointCallbackFunction
(
    const char *python_function_name,
    const char *session_dictionary_name,
    const lldb::StackFrameSP& frame_sp,
    const lldb::BreakpointLocationSP& bp_loc_sp
)
{
    using namespace lldb_private;
    lldb::SBFrame sb_frame (frame_sp);
    lldb::SBBreakpointLocation sb_bp_loc(bp_loc_sp);

    bool stop_at_breakpoint = true;

    PyErr_Cleaner py_err_cleaner(true);
    auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name);
    auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict);

    if (!pfunc.IsAllocated())
        return stop_at_breakpoint;

    PythonObject frame_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_frame));
    PythonObject bp_loc_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_bp_loc));
    PythonObject result = pfunc(frame_arg, bp_loc_arg, dict);

    if (result.get() == Py_False)
        stop_at_breakpoint = false;

    return stop_at_breakpoint;
}

// This function is called by lldb_private::ScriptInterpreterPython::WatchpointCallbackFunction(...)
// and is used when a script command is attached to a watchpoint for execution.

SWIGEXPORT bool
LLDBSwigPythonWatchpointCallbackFunction
(
    const char *python_function_name,
    const char *session_dictionary_name,
    const lldb::StackFrameSP& frame_sp,
    const lldb::WatchpointSP& wp_sp
)
{
    using namespace lldb_private;
    lldb::SBFrame sb_frame (frame_sp);
    lldb::SBWatchpoint sb_wp(wp_sp);

    bool stop_at_watchpoint = true;

    PyErr_Cleaner py_err_cleaner(true);

    auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name);
    auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict);

    if (!pfunc.IsAllocated())
        return stop_at_watchpoint;

    PythonObject frame_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_frame));
    PythonObject wp_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_wp));
    PythonObject result = pfunc(frame_arg, wp_arg, dict);

    if (result.get() == Py_False)
        stop_at_watchpoint = false;

    return stop_at_watchpoint;
}

SWIGEXPORT bool
LLDBSwigPythonCallTypeScript
(
    const char *python_function_name,
    const void *session_dictionary,
    const lldb::ValueObjectSP& valobj_sp,
    void** pyfunct_wrapper,
    const lldb::TypeSummaryOptionsSP& options_sp,
    std::string& retval
)
{
    using namespace lldb_private;
    lldb::SBValue sb_value (valobj_sp);
    lldb::SBTypeSummaryOptions sb_options(options_sp.get());

    retval.clear();

    if (!python_function_name || !session_dictionary)
        return false;

    PyObject *pfunc_impl = nullptr;

    if (pyfunct_wrapper && *pyfunct_wrapper && PyFunction_Check (*pyfunct_wrapper))
    {
        pfunc_impl = (PyObject*)(*pyfunct_wrapper);
        if (pfunc_impl->ob_refcnt == 1)
        {
            Py_XDECREF(pfunc_impl);
            pfunc_impl = NULL;
        }
    }

    PyObject *py_dict = (PyObject*)session_dictionary;
    if (!PythonDictionary::Check(py_dict))
        return true;

    PythonDictionary dict(PyRefType::Borrowed, py_dict);

    PyErr_Cleaner pyerr_cleanup(true);  // show Python errors

    PythonCallable pfunc(PyRefType::Borrowed, pfunc_impl);

    if (!pfunc.IsAllocated())
    {
        pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict);
        if (!pfunc.IsAllocated())
            return false;

        if (pyfunct_wrapper)
        {
            *pyfunct_wrapper = pfunc.get();
            Py_XINCREF(pfunc.get());
        }
    }

    PythonObject result;
    auto argc = pfunc.GetNumArguments();
    // if the third argument is supported, or varargs are allowed
    PythonObject value_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_value));
    PythonObject options_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_options));
    if (argc.count == 3 || argc.has_varargs)
        result = pfunc(value_arg,dict,options_arg);
    else
        result = pfunc(value_arg,dict);

    retval = result.Str().GetString().str();

    return true;
}

SWIGEXPORT void*
LLDBSwigPythonCreateSyntheticProvider
(
    const char *python_class_name,
    const char *session_dictionary_name,
    const lldb::ValueObjectSP& valobj_sp
)
{
    using namespace lldb_private;

    if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name)
        Py_RETURN_NONE;

    PyErr_Cleaner py_err_cleaner(true);

    auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name);
    auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_class_name,dict);

    if (!pfunc.IsAllocated())
        Py_RETURN_NONE;

    // I do not want the SBValue to be deallocated when going out of scope because python
    // has ownership of it and will manage memory for this object by itself
    lldb::SBValue *sb_value = new lldb::SBValue(valobj_sp);
    sb_value->SetPreferSyntheticValue(false);

    PythonObject val_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_value));
    if (!val_arg.IsAllocated())
        Py_RETURN_NONE;

    PythonObject result = pfunc(val_arg, dict);

    if (result.IsAllocated())
        return result.release();

    Py_RETURN_NONE;
}

SWIGEXPORT void*
LLDBSwigPythonCreateCommandObject
(
    const char *python_class_name,
    const char *session_dictionary_name,
    const lldb::DebuggerSP debugger_sp
)
{
    using namespace lldb_private;

    if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name)
        Py_RETURN_NONE;

    PyErr_Cleaner py_err_cleaner(true);
    auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name);
    auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_class_name, dict);

    if (!pfunc.IsAllocated())
        return nullptr;

    lldb::SBDebugger debugger_sb(debugger_sp);
    PythonObject debugger_arg(PyRefType::Owned, SBTypeToSWIGWrapper(debugger_sb));
    PythonObject result = pfunc(debugger_arg, dict);

    if (result.IsAllocated())
        return result.release();

    Py_RETURN_NONE;
}

SWIGEXPORT void*
LLDBSwigPythonCreateScriptedThreadPlan
(
    const char *python_class_name,
    const char *session_dictionary_name,
    const lldb::ThreadPlanSP& thread_plan_sp
)
{
    using namespace lldb_private;

    if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name)
        Py_RETURN_NONE;

    // I do not want the SBThreadPlan to be deallocated when going out of scope because python
    // has ownership of it and will manage memory for this object by itself
    lldb::SBThreadPlan *tp_value = new lldb::SBThreadPlan(thread_plan_sp);

    PyErr_Cleaner py_err_cleaner(true);

    auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name);
    auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_class_name, dict);

    if (!pfunc.IsAllocated())
        return nullptr;

    PythonObject tp_arg(PyRefType::Owned, SBTypeToSWIGWrapper(tp_value));

    if (!tp_arg.IsAllocated())
        Py_RETURN_NONE;

    PythonObject result = pfunc(tp_arg, dict);
    // FIXME: At this point we should check that the class we found supports all the methods
    // that we need.

    if (result.IsAllocated())
        return result.release();
    Py_RETURN_NONE;
}

SWIGEXPORT bool
LLDBSWIGPythonCallThreadPlan
(
    void *implementor,
    const char *method_name,
    lldb_private::Event *event,
    bool &got_error
)
{
    using namespace lldb_private;

    got_error = false;

    PyErr_Cleaner py_err_cleaner(false);
    PythonObject self(PyRefType::Borrowed, static_cast<PyObject*>(implementor));
    auto pfunc = self.ResolveName<PythonCallable>(method_name);

    if (!pfunc.IsAllocated())
        return false;

    PythonObject result;
    if (event != nullptr)
    {
        lldb::SBEvent sb_event(event);
        PythonObject event_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_event));
        result = pfunc(event_arg);
    }
    else
        result = pfunc();

    if (PyErr_Occurred())
    {
        got_error = true;
        printf ("Return value was neither false nor true for call to %s.\n", method_name);
        PyErr_Print();
        return false;
    }

    if (result.get() == Py_True)
        return true;
    else if (result.get() == Py_False)
        return false;

    // Somebody returned the wrong thing...
    got_error = true;
    printf ("Wrong return value type for call to %s.\n", method_name);
    return false;
}

// wrapper that calls an optional instance member of an object taking no arguments
static PyObject*
LLDBSwigPython_CallOptionalMember
(
    PyObject* implementor,
    char* callee_name,
    PyObject* ret_if_not_found = Py_None,
    bool* was_found = NULL
)
{
    using namespace lldb_private;

    PyErr_Cleaner py_err_cleaner(false);

    PythonObject self(PyRefType::Borrowed, static_cast<PyObject*>(implementor));
    auto pfunc = self.ResolveName<PythonCallable>(callee_name);

    if (!pfunc.IsAllocated())
    {
        if (was_found)
            *was_found = false;
        Py_XINCREF(ret_if_not_found);
        return ret_if_not_found;
    }

    if (was_found)
        *was_found = true;

    PythonObject result = pfunc();
    return result.release();
}

SWIGEXPORT size_t
LLDBSwigPython_CalculateNumChildren
(
    PyObject *implementor,
    uint32_t max
)
{
    using namespace lldb_private;

    PythonObject self(PyRefType::Borrowed, implementor);
    auto pfunc = self.ResolveName<PythonCallable>("num_children");

    if (!pfunc.IsAllocated())
        return 0;

    PythonObject result;
    auto argc = pfunc.GetNumArguments();
    if (argc.count == 1)
        result = pfunc();
    else if (argc.count == 2)
        result = pfunc(PythonInteger(max));

    if (!result.IsAllocated())
        return 0;

    PythonInteger int_result = result.AsType<PythonInteger>();
    if (!int_result.IsAllocated())
        return 0;

    size_t ret_val = int_result.GetInteger();

    if (PyErr_Occurred())
    {
        PyErr_Print();
        PyErr_Clear();
    }

    if (argc.count == 1)
        ret_val = std::min(ret_val, static_cast<size_t>(max));

    return ret_val;
}

SWIGEXPORT PyObject*
LLDBSwigPython_GetChildAtIndex
(
    PyObject *implementor,
    uint32_t idx
)
{
    using namespace lldb_private;
    PyErr_Cleaner py_err_cleaner(true);

    PythonObject self(PyRefType::Borrowed, implementor);
    auto pfunc = self.ResolveName<PythonCallable>("get_child_at_index");

    if (!pfunc.IsAllocated())
        return nullptr;

    PythonObject result = pfunc(PythonInteger(idx));

    if (!result.IsAllocated())
        return nullptr;

    lldb::SBValue* sbvalue_ptr = nullptr;
    if (SWIG_ConvertPtr(result.get(), (void**)&sbvalue_ptr, SWIGTYPE_p_lldb__SBValue, 0) == -1)
        return nullptr;

    if (sbvalue_ptr == nullptr)
        return nullptr;

    return result.release();
}

SWIGEXPORT int
LLDBSwigPython_GetIndexOfChildWithName
(
    PyObject *implementor,
    const char* child_name
)
{
    using namespace lldb_private;
    PyErr_Cleaner py_err_cleaner(true);

    PythonObject self(PyRefType::Borrowed, implementor);
    auto pfunc = self.ResolveName<PythonCallable>("get_child_index");

    if (!pfunc.IsAllocated())
        return UINT32_MAX;

    PythonObject result = pfunc(PythonString(child_name));

    if (!result.IsAllocated())
        return UINT32_MAX;

    PythonInteger int_result = result.AsType<PythonInteger>();
    if (!int_result.IsAllocated())
        return UINT32_MAX;

    int64_t retval = int_result.GetInteger();
    if (retval >= 0)
        return (uint32_t)retval;

    return UINT32_MAX;
}

SWIGEXPORT bool
LLDBSwigPython_UpdateSynthProviderInstance
(
    PyObject *implementor
)
{
    bool ret_val = false;

    static char callee_name[] = "update";

    PyObject* py_return = LLDBSwigPython_CallOptionalMember(implementor,callee_name);

    if (py_return == Py_True)
        ret_val = true;

    Py_XDECREF(py_return);

    return ret_val;
}

SWIGEXPORT bool
LLDBSwigPython_MightHaveChildrenSynthProviderInstance
(
    PyObject *implementor
)
{
    bool ret_val = false;

    static char callee_name[] = "has_children";

    PyObject* py_return = LLDBSwigPython_CallOptionalMember(implementor,callee_name, Py_True);

    if (py_return == Py_True)
        ret_val = true;

    Py_XDECREF(py_return);

    return ret_val;
}

SWIGEXPORT PyObject*
LLDBSwigPython_GetValueSynthProviderInstance
(
    PyObject *implementor
)
{
    PyObject* ret_val = nullptr;

    static char callee_name[] = "get_value";

    PyObject* py_return = LLDBSwigPython_CallOptionalMember(implementor,callee_name, Py_None);

    if (py_return == Py_None || py_return == nullptr)
        ret_val = nullptr;

    lldb::SBValue* sbvalue_ptr = NULL;

    if (SWIG_ConvertPtr(py_return, (void**)&sbvalue_ptr, SWIGTYPE_p_lldb__SBValue, 0) == -1)
        ret_val = nullptr;
    else if (sbvalue_ptr == NULL)
        ret_val = nullptr;
    else
        ret_val = py_return;

    Py_XDECREF(py_return);
    return ret_val;
}

SWIGEXPORT void*
LLDBSWIGPython_CastPyObjectToSBValue
(
    PyObject* data
)
{
    lldb::SBValue* sb_ptr = NULL;

    int valid_cast = SWIG_ConvertPtr(data, (void**)&sb_ptr, SWIGTYPE_p_lldb__SBValue, 0);

    if (valid_cast == -1)
        return NULL;

    return sb_ptr;
}

// Currently, SBCommandReturnObjectReleaser wraps a unique pointer to an
// lldb_private::CommandReturnObject. This means that the destructor for the
// SB object will deallocate its contained CommandReturnObject. Because that
// object is used as the real return object for Python-based commands, we want
// it to stay around. Thus, we release the unique pointer before returning from
// LLDBSwigPythonCallCommand, and to guarantee that the release will occur no
// matter how we exit from the function, we have a releaser object whose
// destructor does the right thing for us
class SBCommandReturnObjectReleaser
{
public:
    SBCommandReturnObjectReleaser (lldb::SBCommandReturnObject &obj) :
        m_command_return_object_ref (obj)
    {
    }

    ~SBCommandReturnObjectReleaser ()
    {
        m_command_return_object_ref.Release();
    }
private:
    lldb::SBCommandReturnObject &m_command_return_object_ref;
};

SWIGEXPORT bool
LLDBSwigPythonCallCommand
(
    const char *python_function_name,
    const char *session_dictionary_name,
    lldb::DebuggerSP& debugger,
    const char* args,
    lldb_private::CommandReturnObject& cmd_retobj,
    lldb::ExecutionContextRefSP exe_ctx_ref_sp
)
{
    using namespace lldb_private;
    lldb::SBCommandReturnObject cmd_retobj_sb(&cmd_retobj);
    SBCommandReturnObjectReleaser cmd_retobj_sb_releaser(cmd_retobj_sb);
    lldb::SBDebugger debugger_sb(debugger);
    lldb::SBExecutionContext exe_ctx_sb(exe_ctx_ref_sp);

    PyErr_Cleaner py_err_cleaner(true);
    auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name);
    auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict);

    if (!pfunc.IsAllocated())
        return false;

    // pass the pointer-to cmd_retobj_sb or watch the underlying object disappear from under you
    // see comment above for SBCommandReturnObjectReleaser for further details
    auto argc = pfunc.GetNumArguments();
    PythonObject debugger_arg(PyRefType::Owned, SBTypeToSWIGWrapper(debugger_sb));
    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.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);

    return true;
}

SWIGEXPORT bool
LLDBSwigPythonCallCommandObject
(
    PyObject *implementor,
    lldb::DebuggerSP& debugger,
    const char* args,
    lldb_private::CommandReturnObject& cmd_retobj,
    lldb::ExecutionContextRefSP exe_ctx_ref_sp
)
{
    using namespace lldb_private;
    lldb::SBCommandReturnObject cmd_retobj_sb(&cmd_retobj);
    SBCommandReturnObjectReleaser cmd_retobj_sb_releaser(cmd_retobj_sb);
    lldb::SBDebugger debugger_sb(debugger);
    lldb::SBExecutionContext exe_ctx_sb(exe_ctx_ref_sp);

    PyErr_Cleaner py_err_cleaner(true);

    PythonObject self(PyRefType::Borrowed, implementor);
    auto pfunc = self.ResolveName<PythonCallable>("__call__");

    if (!pfunc.IsAllocated())
        return false;

    // pass the pointer-to cmd_retobj_sb or watch the underlying object disappear from under you
    // see comment above for SBCommandReturnObjectReleaser for further details
    PythonObject debugger_arg(PyRefType::Owned, SBTypeToSWIGWrapper(debugger_sb));
    PythonObject exe_ctx_arg(PyRefType::Owned, SBTypeToSWIGWrapper(exe_ctx_sb));
    PythonObject cmd_retobj_arg(PyRefType::Owned, SBTypeToSWIGWrapper(&cmd_retobj_sb));

    pfunc(debugger_arg, PythonString(args), exe_ctx_arg, cmd_retobj_arg);

    return true;
}

SWIGEXPORT void*
LLDBSWIGPythonCreateOSPlugin
(
    const char *python_class_name,
    const char *session_dictionary_name,
    const lldb::ProcessSP& process_sp
)
{
    using namespace lldb_private;

    if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name)
        Py_RETURN_NONE;

    PyErr_Cleaner py_err_cleaner(true);

    auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name);
    auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_class_name, dict);

    if (!pfunc.IsAllocated())
        Py_RETURN_NONE;

    // I do not want the SBProcess to be deallocated when going out of scope because python
    // has ownership of it and will manage memory for this object by itself
    lldb::SBProcess *process_sb = new lldb::SBProcess(process_sp);
    PythonObject process_arg(PyRefType::Owned, SBTypeToSWIGWrapper(process_sb));
    if (!process_arg.IsAllocated())
        Py_RETURN_NONE;

    auto result = pfunc(process_arg);

    if (result.IsAllocated())
        return result.release();

    Py_RETURN_NONE;
}

SWIGEXPORT void*
LLDBSWIGPython_GetDynamicSetting (void* module, const char* setting, const lldb::TargetSP& target_sp)
{
    using namespace lldb_private;

    if (!module || !setting)
        Py_RETURN_NONE;

    PyErr_Cleaner py_err_cleaner(true);
    PythonObject py_module(PyRefType::Borrowed, (PyObject *)module);
    auto pfunc = py_module.ResolveName<PythonCallable>("get_dynamic_setting");

    if (!pfunc.IsAllocated())
        Py_RETURN_NONE;

    lldb::SBTarget target_sb(target_sp);
    PythonObject target_arg(PyRefType::Owned, SBTypeToSWIGWrapper(target_sb));
    auto result = pfunc(target_arg, PythonString(setting));

    return result.release();
}

SWIGEXPORT bool
LLDBSWIGPythonRunScriptKeywordProcess
(const char* python_function_name,
const char* session_dictionary_name,
lldb::ProcessSP& process,
std::string& output)

{
    using namespace lldb_private;

    if (python_function_name == NULL || python_function_name[0] == '\0' || !session_dictionary_name)
        return false;

    PyErr_Cleaner py_err_cleaner(true);

    auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name);
    auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict);

    if (!pfunc.IsAllocated())
        return false;

    lldb::SBProcess process_sb(process);
    PythonObject process_arg(PyRefType::Owned, SBTypeToSWIGWrapper(process_sb));
    auto result = pfunc(process_arg, dict);

    output = result.Str().GetString().str();

    return true;
}

SWIGEXPORT bool
LLDBSWIGPythonRunScriptKeywordThread
(const char* python_function_name,
const char* session_dictionary_name,
lldb::ThreadSP& thread,
std::string& output)

{
    using namespace lldb_private;

    if (python_function_name == NULL || python_function_name[0] == '\0' || !session_dictionary_name)
        return false;

    PyErr_Cleaner py_err_cleaner(true);

    auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name);
    auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict);

    if (!pfunc.IsAllocated())
        return false;

    lldb::SBThread thread_sb(thread);
    PythonObject thread_arg(PyRefType::Owned, SBTypeToSWIGWrapper(thread_sb));
    auto result = pfunc(thread_arg, dict);

    output = result.Str().GetString().str();

    return true;
}

SWIGEXPORT bool
LLDBSWIGPythonRunScriptKeywordTarget
(const char* python_function_name,
const char* session_dictionary_name,
lldb::TargetSP& target,
std::string& output)

{
    using namespace lldb_private;

    if (python_function_name == NULL || python_function_name[0] == '\0' || !session_dictionary_name)
        return false;

    PyErr_Cleaner py_err_cleaner(true);

    auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name);
    auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name,dict);

    if (!pfunc.IsAllocated())
        return false;

    lldb::SBTarget target_sb(target);
    PythonObject target_arg(PyRefType::Owned, SBTypeToSWIGWrapper(target_sb));
    auto result = pfunc(target_arg, dict);

    output = result.Str().GetString().str();

    return true;
}

SWIGEXPORT bool
LLDBSWIGPythonRunScriptKeywordFrame
(const char* python_function_name,
const char* session_dictionary_name,
lldb::StackFrameSP& frame,
std::string& output)

{
    using namespace lldb_private;

    if (python_function_name == NULL || python_function_name[0] == '\0' || !session_dictionary_name)
        return false;

    PyErr_Cleaner py_err_cleaner(true);

    auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name);
    auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name,dict);

    if (!pfunc.IsAllocated())
        return false;

    lldb::SBFrame frame_sb(frame);
    PythonObject frame_arg(PyRefType::Owned, SBTypeToSWIGWrapper(frame_sb));
    auto result = pfunc(frame_arg, dict);

    output = result.Str().GetString().str();

    return true;
}

SWIGEXPORT bool
LLDBSWIGPythonRunScriptKeywordValue
(const char* python_function_name,
const char* session_dictionary_name,
lldb::ValueObjectSP& value,
std::string& output)

{
    using namespace lldb_private;

    if (python_function_name == NULL || python_function_name[0] == '\0' || !session_dictionary_name)
        return false;

    PyErr_Cleaner py_err_cleaner(true);

    auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name);
    auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict);

    if (!pfunc.IsAllocated())
        return false;

    lldb::SBValue value_sb(value);
    PythonObject value_arg(PyRefType::Owned, SBTypeToSWIGWrapper(value_sb));
    auto result = pfunc(value_arg, dict);

    output = result.Str().GetString().str();

    return true;
}

SWIGEXPORT bool
LLDBSwigPythonCallModuleInit
(
    const char *python_module_name,
    const char *session_dictionary_name,
    lldb::DebuggerSP& debugger
)
{
    using namespace lldb_private;

    std::string python_function_name_string = python_module_name;
    python_function_name_string += ".__lldb_init_module";
    const char* python_function_name = python_function_name_string.c_str();

    PyErr_Cleaner py_err_cleaner(true);

    auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name);
    auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict);

    // This method is optional and need not exist.  So if we don't find it,
    // it's actually a success, not a failure.
    if (!pfunc.IsAllocated())
        return true;

    lldb::SBDebugger debugger_sb(debugger);
    PythonObject debugger_arg(PyRefType::Owned, SBTypeToSWIGWrapper(debugger_sb));
    pfunc(debugger_arg, dict);

    return true;
}




// For the LogOutputCallback functions
void LLDBSwigPythonCallPythonLogOutputCallback(const char *str, void *baton) {
    if (baton != Py_None) {
      SWIG_PYTHON_THREAD_BEGIN_BLOCK;
      PyObject *result = PyObject_CallFunction(reinterpret_cast<PyObject*>(baton), const_cast<char*>("s"), str);
	  Py_XDECREF(result);
      SWIG_PYTHON_THREAD_END_BLOCK;
    }
}

static PyMethodDef SwigMethods[] = {
	 { (char *)"SWIG_PyInstanceMethod_New", (PyCFunction)SWIG_PyInstanceMethod_New, METH_O, NULL},
	 { (char *)"new_SBAddress", _wrap_new_SBAddress, METH_VARARGS, (char *)"\n"
		"SBAddress()\n"
		"SBAddress(SBAddress rhs)\n"
		"SBAddress(SBSection section, addr_t offset)\n"
		"new_SBAddress(addr_t load_addr, SBTarget target) -> SBAddress\n"
		""},
	 { (char *)"delete_SBAddress", _wrap_delete_SBAddress, METH_VARARGS, (char *)"delete_SBAddress(SBAddress self)"},
	 { (char *)"SBAddress_IsValid", _wrap_SBAddress_IsValid, METH_VARARGS, (char *)"SBAddress_IsValid(SBAddress self) -> bool"},
	 { (char *)"SBAddress_Clear", _wrap_SBAddress_Clear, METH_VARARGS, (char *)"SBAddress_Clear(SBAddress self)"},
	 { (char *)"SBAddress_GetFileAddress", _wrap_SBAddress_GetFileAddress, METH_VARARGS, (char *)"SBAddress_GetFileAddress(SBAddress self) -> addr_t"},
	 { (char *)"SBAddress_GetLoadAddress", _wrap_SBAddress_GetLoadAddress, METH_VARARGS, (char *)"SBAddress_GetLoadAddress(SBAddress self, SBTarget target) -> addr_t"},
	 { (char *)"SBAddress_SetLoadAddress", _wrap_SBAddress_SetLoadAddress, METH_VARARGS, (char *)"SBAddress_SetLoadAddress(SBAddress self, addr_t load_addr, SBTarget target)"},
	 { (char *)"SBAddress_OffsetAddress", _wrap_SBAddress_OffsetAddress, METH_VARARGS, (char *)"SBAddress_OffsetAddress(SBAddress self, addr_t offset) -> bool"},
	 { (char *)"SBAddress_GetDescription", _wrap_SBAddress_GetDescription, METH_VARARGS, (char *)"SBAddress_GetDescription(SBAddress self, SBStream description) -> bool"},
	 { (char *)"SBAddress_GetSection", _wrap_SBAddress_GetSection, METH_VARARGS, (char *)"SBAddress_GetSection(SBAddress self) -> SBSection"},
	 { (char *)"SBAddress_GetOffset", _wrap_SBAddress_GetOffset, METH_VARARGS, (char *)"SBAddress_GetOffset(SBAddress self) -> addr_t"},
	 { (char *)"SBAddress_SetAddress", _wrap_SBAddress_SetAddress, METH_VARARGS, (char *)"SBAddress_SetAddress(SBAddress self, SBSection section, addr_t offset)"},
	 { (char *)"SBAddress_GetAddressClass", _wrap_SBAddress_GetAddressClass, METH_VARARGS, (char *)"SBAddress_GetAddressClass(SBAddress self) -> AddressClass"},
	 { (char *)"SBAddress_GetSymbolContext", _wrap_SBAddress_GetSymbolContext, METH_VARARGS, (char *)"\n"
		"SBAddress_GetSymbolContext(SBAddress self, uint32_t resolve_scope) -> SBSymbolContext\n"
		"\n"
		"//------------------------------------------------------------------\n"
		"/// GetSymbolContext() and the following can lookup symbol information for a given address.\n"
		"/// An address might refer to code or data from an existing module, or it\n"
		"/// might refer to something on the stack or heap. The following functions\n"
		"/// will only return valid values if the address has been resolved to a code\n"
		"/// or data address using 'void SBAddress::SetLoadAddress(...)' or \n"
		"/// 'lldb::SBAddress SBTarget::ResolveLoadAddress (...)'. \n"
		"//------------------------------------------------------------------\n"
		"\n"
		""},
	 { (char *)"SBAddress_GetModule", _wrap_SBAddress_GetModule, METH_VARARGS, (char *)"\n"
		"SBAddress_GetModule(SBAddress self) -> SBModule\n"
		"\n"
		"//------------------------------------------------------------------\n"
		"/// GetModule() and the following grab individual objects for a given address and\n"
		"/// are less efficient if you want more than one symbol related objects. \n"
		"/// Use one of the following when you want multiple debug symbol related \n"
		"/// objects for an address:\n"
		"///    lldb::SBSymbolContext SBAddress::GetSymbolContext (uint32_t resolve_scope);\n"
		"///    lldb::SBSymbolContext SBTarget::ResolveSymbolContextForAddress (const SBAddress &addr, uint32_t resolve_scope);\n"
		"/// One or more bits from the SymbolContextItem enumerations can be logically\n"
		"/// OR'ed together to more efficiently retrieve multiple symbol objects.\n"
		"//------------------------------------------------------------------\n"
		"\n"
		""},
	 { (char *)"SBAddress_GetCompileUnit", _wrap_SBAddress_GetCompileUnit, METH_VARARGS, (char *)"SBAddress_GetCompileUnit(SBAddress self) -> SBCompileUnit"},
	 { (char *)"SBAddress_GetFunction", _wrap_SBAddress_GetFunction, METH_VARARGS, (char *)"SBAddress_GetFunction(SBAddress self) -> SBFunction"},
	 { (char *)"SBAddress_GetBlock", _wrap_SBAddress_GetBlock, METH_VARARGS, (char *)"SBAddress_GetBlock(SBAddress self) -> SBBlock"},
	 { (char *)"SBAddress_GetSymbol", _wrap_SBAddress_GetSymbol, METH_VARARGS, (char *)"SBAddress_GetSymbol(SBAddress self) -> SBSymbol"},
	 { (char *)"SBAddress_GetLineEntry", _wrap_SBAddress_GetLineEntry, METH_VARARGS, (char *)"SBAddress_GetLineEntry(SBAddress self) -> SBLineEntry"},
	 { (char *)"SBAddress___str__", _wrap_SBAddress___str__, METH_VARARGS, (char *)"SBAddress___str__(SBAddress self) -> PyObject"},
	 { (char *)"SBAddress_swigregister", SBAddress_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBAttachInfo", _wrap_new_SBAttachInfo, METH_VARARGS, (char *)"\n"
		"SBAttachInfo()\n"
		"SBAttachInfo(pid_t pid)\n"
		"SBAttachInfo(char path, bool wait_for)\n"
		"SBAttachInfo(char path, bool wait_for, bool async)\n"
		"new_SBAttachInfo(SBAttachInfo rhs) -> SBAttachInfo\n"
		""},
	 { (char *)"SBAttachInfo_GetProcessID", _wrap_SBAttachInfo_GetProcessID, METH_VARARGS, (char *)"SBAttachInfo_GetProcessID(SBAttachInfo self) -> pid_t"},
	 { (char *)"SBAttachInfo_SetProcessID", _wrap_SBAttachInfo_SetProcessID, METH_VARARGS, (char *)"SBAttachInfo_SetProcessID(SBAttachInfo self, pid_t pid)"},
	 { (char *)"SBAttachInfo_SetExecutable", _wrap_SBAttachInfo_SetExecutable, METH_VARARGS, (char *)"\n"
		"SetExecutable(char path)\n"
		"SBAttachInfo_SetExecutable(SBAttachInfo self, SBFileSpec exe_file)\n"
		""},
	 { (char *)"SBAttachInfo_GetWaitForLaunch", _wrap_SBAttachInfo_GetWaitForLaunch, METH_VARARGS, (char *)"SBAttachInfo_GetWaitForLaunch(SBAttachInfo self) -> bool"},
	 { (char *)"SBAttachInfo_SetWaitForLaunch", _wrap_SBAttachInfo_SetWaitForLaunch, METH_VARARGS, (char *)"\n"
		"SetWaitForLaunch(bool b)\n"
		"SBAttachInfo_SetWaitForLaunch(SBAttachInfo self, bool b, bool async)\n"
		""},
	 { (char *)"SBAttachInfo_GetIgnoreExisting", _wrap_SBAttachInfo_GetIgnoreExisting, METH_VARARGS, (char *)"SBAttachInfo_GetIgnoreExisting(SBAttachInfo self) -> bool"},
	 { (char *)"SBAttachInfo_SetIgnoreExisting", _wrap_SBAttachInfo_SetIgnoreExisting, METH_VARARGS, (char *)"SBAttachInfo_SetIgnoreExisting(SBAttachInfo self, bool b)"},
	 { (char *)"SBAttachInfo_GetResumeCount", _wrap_SBAttachInfo_GetResumeCount, METH_VARARGS, (char *)"SBAttachInfo_GetResumeCount(SBAttachInfo self) -> uint32_t"},
	 { (char *)"SBAttachInfo_SetResumeCount", _wrap_SBAttachInfo_SetResumeCount, METH_VARARGS, (char *)"SBAttachInfo_SetResumeCount(SBAttachInfo self, uint32_t c)"},
	 { (char *)"SBAttachInfo_GetProcessPluginName", _wrap_SBAttachInfo_GetProcessPluginName, METH_VARARGS, (char *)"SBAttachInfo_GetProcessPluginName(SBAttachInfo self) -> char"},
	 { (char *)"SBAttachInfo_SetProcessPluginName", _wrap_SBAttachInfo_SetProcessPluginName, METH_VARARGS, (char *)"SBAttachInfo_SetProcessPluginName(SBAttachInfo self, char plugin_name)"},
	 { (char *)"SBAttachInfo_GetUserID", _wrap_SBAttachInfo_GetUserID, METH_VARARGS, (char *)"SBAttachInfo_GetUserID(SBAttachInfo self) -> uint32_t"},
	 { (char *)"SBAttachInfo_GetGroupID", _wrap_SBAttachInfo_GetGroupID, METH_VARARGS, (char *)"SBAttachInfo_GetGroupID(SBAttachInfo self) -> uint32_t"},
	 { (char *)"SBAttachInfo_UserIDIsValid", _wrap_SBAttachInfo_UserIDIsValid, METH_VARARGS, (char *)"SBAttachInfo_UserIDIsValid(SBAttachInfo self) -> bool"},
	 { (char *)"SBAttachInfo_GroupIDIsValid", _wrap_SBAttachInfo_GroupIDIsValid, METH_VARARGS, (char *)"SBAttachInfo_GroupIDIsValid(SBAttachInfo self) -> bool"},
	 { (char *)"SBAttachInfo_SetUserID", _wrap_SBAttachInfo_SetUserID, METH_VARARGS, (char *)"SBAttachInfo_SetUserID(SBAttachInfo self, uint32_t uid)"},
	 { (char *)"SBAttachInfo_SetGroupID", _wrap_SBAttachInfo_SetGroupID, METH_VARARGS, (char *)"SBAttachInfo_SetGroupID(SBAttachInfo self, uint32_t gid)"},
	 { (char *)"SBAttachInfo_GetEffectiveUserID", _wrap_SBAttachInfo_GetEffectiveUserID, METH_VARARGS, (char *)"SBAttachInfo_GetEffectiveUserID(SBAttachInfo self) -> uint32_t"},
	 { (char *)"SBAttachInfo_GetEffectiveGroupID", _wrap_SBAttachInfo_GetEffectiveGroupID, METH_VARARGS, (char *)"SBAttachInfo_GetEffectiveGroupID(SBAttachInfo self) -> uint32_t"},
	 { (char *)"SBAttachInfo_EffectiveUserIDIsValid", _wrap_SBAttachInfo_EffectiveUserIDIsValid, METH_VARARGS, (char *)"SBAttachInfo_EffectiveUserIDIsValid(SBAttachInfo self) -> bool"},
	 { (char *)"SBAttachInfo_EffectiveGroupIDIsValid", _wrap_SBAttachInfo_EffectiveGroupIDIsValid, METH_VARARGS, (char *)"SBAttachInfo_EffectiveGroupIDIsValid(SBAttachInfo self) -> bool"},
	 { (char *)"SBAttachInfo_SetEffectiveUserID", _wrap_SBAttachInfo_SetEffectiveUserID, METH_VARARGS, (char *)"SBAttachInfo_SetEffectiveUserID(SBAttachInfo self, uint32_t uid)"},
	 { (char *)"SBAttachInfo_SetEffectiveGroupID", _wrap_SBAttachInfo_SetEffectiveGroupID, METH_VARARGS, (char *)"SBAttachInfo_SetEffectiveGroupID(SBAttachInfo self, uint32_t gid)"},
	 { (char *)"SBAttachInfo_GetParentProcessID", _wrap_SBAttachInfo_GetParentProcessID, METH_VARARGS, (char *)"SBAttachInfo_GetParentProcessID(SBAttachInfo self) -> pid_t"},
	 { (char *)"SBAttachInfo_SetParentProcessID", _wrap_SBAttachInfo_SetParentProcessID, METH_VARARGS, (char *)"SBAttachInfo_SetParentProcessID(SBAttachInfo self, pid_t pid)"},
	 { (char *)"SBAttachInfo_ParentProcessIDIsValid", _wrap_SBAttachInfo_ParentProcessIDIsValid, METH_VARARGS, (char *)"SBAttachInfo_ParentProcessIDIsValid(SBAttachInfo self) -> bool"},
	 { (char *)"SBAttachInfo_GetListener", _wrap_SBAttachInfo_GetListener, METH_VARARGS, (char *)"SBAttachInfo_GetListener(SBAttachInfo self) -> SBListener"},
	 { (char *)"SBAttachInfo_SetListener", _wrap_SBAttachInfo_SetListener, METH_VARARGS, (char *)"SBAttachInfo_SetListener(SBAttachInfo self, SBListener listener)"},
	 { (char *)"delete_SBAttachInfo", _wrap_delete_SBAttachInfo, METH_VARARGS, (char *)"delete_SBAttachInfo(SBAttachInfo self)"},
	 { (char *)"SBAttachInfo_swigregister", SBAttachInfo_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBBlock", _wrap_new_SBBlock, METH_VARARGS, (char *)"\n"
		"SBBlock()\n"
		"new_SBBlock(SBBlock rhs) -> SBBlock\n"
		""},
	 { (char *)"delete_SBBlock", _wrap_delete_SBBlock, METH_VARARGS, (char *)"delete_SBBlock(SBBlock self)"},
	 { (char *)"SBBlock_IsInlined", _wrap_SBBlock_IsInlined, METH_VARARGS, (char *)"\n"
		"SBBlock_IsInlined(SBBlock self) -> bool\n"
		"\n"
		"Does this block represent an inlined function?\n"
		""},
	 { (char *)"SBBlock_IsValid", _wrap_SBBlock_IsValid, METH_VARARGS, (char *)"SBBlock_IsValid(SBBlock self) -> bool"},
	 { (char *)"SBBlock_GetInlinedName", _wrap_SBBlock_GetInlinedName, METH_VARARGS, (char *)"\n"
		"SBBlock_GetInlinedName(SBBlock self) -> char\n"
		"\n"
		"Get the function name if this block represents an inlined function;\n"
		"otherwise, return None.\n"
		"\n"
		""},
	 { (char *)"SBBlock_GetInlinedCallSiteFile", _wrap_SBBlock_GetInlinedCallSiteFile, METH_VARARGS, (char *)"\n"
		"SBBlock_GetInlinedCallSiteFile(SBBlock self) -> SBFileSpec\n"
		"\n"
		"Get the call site file if this block represents an inlined function;\n"
		"otherwise, return an invalid file spec.\n"
		"\n"
		""},
	 { (char *)"SBBlock_GetInlinedCallSiteLine", _wrap_SBBlock_GetInlinedCallSiteLine, METH_VARARGS, (char *)"\n"
		"SBBlock_GetInlinedCallSiteLine(SBBlock self) -> uint32_t\n"
		"\n"
		"Get the call site line if this block represents an inlined function;\n"
		"otherwise, return 0.\n"
		"\n"
		""},
	 { (char *)"SBBlock_GetInlinedCallSiteColumn", _wrap_SBBlock_GetInlinedCallSiteColumn, METH_VARARGS, (char *)"\n"
		"SBBlock_GetInlinedCallSiteColumn(SBBlock self) -> uint32_t\n"
		"\n"
		"Get the call site column if this block represents an inlined function;\n"
		"otherwise, return 0.\n"
		"\n"
		""},
	 { (char *)"SBBlock_GetParent", _wrap_SBBlock_GetParent, METH_VARARGS, (char *)"\n"
		"SBBlock_GetParent(SBBlock self) -> SBBlock\n"
		"\n"
		"Get the parent block.\n"
		""},
	 { (char *)"SBBlock_GetContainingInlinedBlock", _wrap_SBBlock_GetContainingInlinedBlock, METH_VARARGS, (char *)"\n"
		"SBBlock_GetContainingInlinedBlock(SBBlock self) -> SBBlock\n"
		"\n"
		"Get the inlined block that is or contains this block.\n"
		""},
	 { (char *)"SBBlock_GetSibling", _wrap_SBBlock_GetSibling, METH_VARARGS, (char *)"\n"
		"SBBlock_GetSibling(SBBlock self) -> SBBlock\n"
		"\n"
		"Get the sibling block for this block.\n"
		""},
	 { (char *)"SBBlock_GetFirstChild", _wrap_SBBlock_GetFirstChild, METH_VARARGS, (char *)"\n"
		"SBBlock_GetFirstChild(SBBlock self) -> SBBlock\n"
		"\n"
		"Get the first child block.\n"
		""},
	 { (char *)"SBBlock_GetNumRanges", _wrap_SBBlock_GetNumRanges, METH_VARARGS, (char *)"SBBlock_GetNumRanges(SBBlock self) -> uint32_t"},
	 { (char *)"SBBlock_GetRangeStartAddress", _wrap_SBBlock_GetRangeStartAddress, METH_VARARGS, (char *)"SBBlock_GetRangeStartAddress(SBBlock self, uint32_t idx) -> SBAddress"},
	 { (char *)"SBBlock_GetRangeEndAddress", _wrap_SBBlock_GetRangeEndAddress, METH_VARARGS, (char *)"SBBlock_GetRangeEndAddress(SBBlock self, uint32_t idx) -> SBAddress"},
	 { (char *)"SBBlock_GetRangeIndexForBlockAddress", _wrap_SBBlock_GetRangeIndexForBlockAddress, METH_VARARGS, (char *)"SBBlock_GetRangeIndexForBlockAddress(SBBlock self, SBAddress block_addr) -> uint32_t"},
	 { (char *)"SBBlock_GetDescription", _wrap_SBBlock_GetDescription, METH_VARARGS, (char *)"SBBlock_GetDescription(SBBlock self, SBStream description) -> bool"},
	 { (char *)"SBBlock_GetVariables", _wrap_SBBlock_GetVariables, METH_VARARGS, (char *)"\n"
		"GetVariables(SBFrame frame, bool arguments, bool locals, bool statics, \n"
		"    DynamicValueType use_dynamic) -> SBValueList\n"
		"SBBlock_GetVariables(SBBlock self, SBTarget target, bool arguments, bool locals, \n"
		"    bool statics) -> SBValueList\n"
		""},
	 { (char *)"SBBlock___str__", _wrap_SBBlock___str__, METH_VARARGS, (char *)"SBBlock___str__(SBBlock self) -> PyObject"},
	 { (char *)"SBBlock_swigregister", SBBlock_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBBreakpoint", _wrap_new_SBBreakpoint, METH_VARARGS, (char *)"\n"
		"SBBreakpoint()\n"
		"new_SBBreakpoint(SBBreakpoint rhs) -> SBBreakpoint\n"
		""},
	 { (char *)"delete_SBBreakpoint", _wrap_delete_SBBreakpoint, METH_VARARGS, (char *)"delete_SBBreakpoint(SBBreakpoint self)"},
	 { (char *)"SBBreakpoint_GetID", _wrap_SBBreakpoint_GetID, METH_VARARGS, (char *)"SBBreakpoint_GetID(SBBreakpoint self) -> break_id_t"},
	 { (char *)"SBBreakpoint_IsValid", _wrap_SBBreakpoint_IsValid, METH_VARARGS, (char *)"SBBreakpoint_IsValid(SBBreakpoint self) -> bool"},
	 { (char *)"SBBreakpoint_ClearAllBreakpointSites", _wrap_SBBreakpoint_ClearAllBreakpointSites, METH_VARARGS, (char *)"SBBreakpoint_ClearAllBreakpointSites(SBBreakpoint self)"},
	 { (char *)"SBBreakpoint_FindLocationByAddress", _wrap_SBBreakpoint_FindLocationByAddress, METH_VARARGS, (char *)"SBBreakpoint_FindLocationByAddress(SBBreakpoint self, addr_t vm_addr) -> SBBreakpointLocation"},
	 { (char *)"SBBreakpoint_FindLocationIDByAddress", _wrap_SBBreakpoint_FindLocationIDByAddress, METH_VARARGS, (char *)"SBBreakpoint_FindLocationIDByAddress(SBBreakpoint self, addr_t vm_addr) -> break_id_t"},
	 { (char *)"SBBreakpoint_FindLocationByID", _wrap_SBBreakpoint_FindLocationByID, METH_VARARGS, (char *)"SBBreakpoint_FindLocationByID(SBBreakpoint self, break_id_t bp_loc_id) -> SBBreakpointLocation"},
	 { (char *)"SBBreakpoint_GetLocationAtIndex", _wrap_SBBreakpoint_GetLocationAtIndex, METH_VARARGS, (char *)"SBBreakpoint_GetLocationAtIndex(SBBreakpoint self, uint32_t index) -> SBBreakpointLocation"},
	 { (char *)"SBBreakpoint_SetEnabled", _wrap_SBBreakpoint_SetEnabled, METH_VARARGS, (char *)"SBBreakpoint_SetEnabled(SBBreakpoint self, bool enable)"},
	 { (char *)"SBBreakpoint_IsEnabled", _wrap_SBBreakpoint_IsEnabled, METH_VARARGS, (char *)"SBBreakpoint_IsEnabled(SBBreakpoint self) -> bool"},
	 { (char *)"SBBreakpoint_SetOneShot", _wrap_SBBreakpoint_SetOneShot, METH_VARARGS, (char *)"SBBreakpoint_SetOneShot(SBBreakpoint self, bool one_shot)"},
	 { (char *)"SBBreakpoint_IsOneShot", _wrap_SBBreakpoint_IsOneShot, METH_VARARGS, (char *)"SBBreakpoint_IsOneShot(SBBreakpoint self) -> bool"},
	 { (char *)"SBBreakpoint_IsInternal", _wrap_SBBreakpoint_IsInternal, METH_VARARGS, (char *)"SBBreakpoint_IsInternal(SBBreakpoint self) -> bool"},
	 { (char *)"SBBreakpoint_GetHitCount", _wrap_SBBreakpoint_GetHitCount, METH_VARARGS, (char *)"SBBreakpoint_GetHitCount(SBBreakpoint self) -> uint32_t"},
	 { (char *)"SBBreakpoint_SetIgnoreCount", _wrap_SBBreakpoint_SetIgnoreCount, METH_VARARGS, (char *)"SBBreakpoint_SetIgnoreCount(SBBreakpoint self, uint32_t count)"},
	 { (char *)"SBBreakpoint_GetIgnoreCount", _wrap_SBBreakpoint_GetIgnoreCount, METH_VARARGS, (char *)"SBBreakpoint_GetIgnoreCount(SBBreakpoint self) -> uint32_t"},
	 { (char *)"SBBreakpoint_SetCondition", _wrap_SBBreakpoint_SetCondition, METH_VARARGS, (char *)"\n"
		"SBBreakpoint_SetCondition(SBBreakpoint self, char condition)\n"
		"\n"
		"//--------------------------------------------------------------------------\n"
		"/// The breakpoint stops only if the condition expression evaluates to true.\n"
		"//--------------------------------------------------------------------------\n"
		"\n"
		""},
	 { (char *)"SBBreakpoint_GetCondition", _wrap_SBBreakpoint_GetCondition, METH_VARARGS, (char *)"\n"
		"SBBreakpoint_GetCondition(SBBreakpoint self) -> char\n"
		"\n"
		"//------------------------------------------------------------------\n"
		"/// Get the condition expression for the breakpoint.\n"
		"//------------------------------------------------------------------\n"
		"\n"
		""},
	 { (char *)"SBBreakpoint_SetAutoContinue", _wrap_SBBreakpoint_SetAutoContinue, METH_VARARGS, (char *)"SBBreakpoint_SetAutoContinue(SBBreakpoint self, bool auto_continue)"},
	 { (char *)"SBBreakpoint_GetAutoContinue", _wrap_SBBreakpoint_GetAutoContinue, METH_VARARGS, (char *)"SBBreakpoint_GetAutoContinue(SBBreakpoint self) -> bool"},
	 { (char *)"SBBreakpoint_SetThreadID", _wrap_SBBreakpoint_SetThreadID, METH_VARARGS, (char *)"SBBreakpoint_SetThreadID(SBBreakpoint self, tid_t sb_thread_id)"},
	 { (char *)"SBBreakpoint_GetThreadID", _wrap_SBBreakpoint_GetThreadID, METH_VARARGS, (char *)"SBBreakpoint_GetThreadID(SBBreakpoint self) -> tid_t"},
	 { (char *)"SBBreakpoint_SetThreadIndex", _wrap_SBBreakpoint_SetThreadIndex, METH_VARARGS, (char *)"SBBreakpoint_SetThreadIndex(SBBreakpoint self, uint32_t index)"},
	 { (char *)"SBBreakpoint_GetThreadIndex", _wrap_SBBreakpoint_GetThreadIndex, METH_VARARGS, (char *)"SBBreakpoint_GetThreadIndex(SBBreakpoint self) -> uint32_t"},
	 { (char *)"SBBreakpoint_SetThreadName", _wrap_SBBreakpoint_SetThreadName, METH_VARARGS, (char *)"SBBreakpoint_SetThreadName(SBBreakpoint self, char thread_name)"},
	 { (char *)"SBBreakpoint_GetThreadName", _wrap_SBBreakpoint_GetThreadName, METH_VARARGS, (char *)"SBBreakpoint_GetThreadName(SBBreakpoint self) -> char"},
	 { (char *)"SBBreakpoint_SetQueueName", _wrap_SBBreakpoint_SetQueueName, METH_VARARGS, (char *)"SBBreakpoint_SetQueueName(SBBreakpoint self, char queue_name)"},
	 { (char *)"SBBreakpoint_GetQueueName", _wrap_SBBreakpoint_GetQueueName, METH_VARARGS, (char *)"SBBreakpoint_GetQueueName(SBBreakpoint self) -> char"},
	 { (char *)"SBBreakpoint_SetScriptCallbackFunction", _wrap_SBBreakpoint_SetScriptCallbackFunction, METH_VARARGS, (char *)"\n"
		"SBBreakpoint_SetScriptCallbackFunction(SBBreakpoint self, char callback_function_name)\n"
		"\n"
		"//------------------------------------------------------------------\n"
		"/// Set the name of the script function to be called when the breakpoint is hit.\n"
		"//------------------------------------------------------------------\n"
		"\n"
		""},
	 { (char *)"SBBreakpoint_SetScriptCallbackBody", _wrap_SBBreakpoint_SetScriptCallbackBody, METH_VARARGS, (char *)"\n"
		"SBBreakpoint_SetScriptCallbackBody(SBBreakpoint self, char script_body_text) -> SBError\n"
		"\n"
		"//------------------------------------------------------------------\n"
		"/// Provide the body for the script function to be called when the breakpoint is hit.\n"
		"/// The body will be wrapped in a function, which be passed two arguments:\n"
		"/// 'frame' - which holds the bottom-most SBFrame of the thread that hit the breakpoint\n"
		"/// 'bpno'  - which is the SBBreakpointLocation to which the callback was attached.\n"
		"///\n"
		"/// The error parameter is currently ignored, but will at some point hold the Python\n"
		"/// compilation diagnostics.\n"
		"/// Returns true if the body compiles successfully, false if not.\n"
		"//------------------------------------------------------------------\n"
		"\n"
		""},
	 { (char *)"SBBreakpoint_SetCommandLineCommands", _wrap_SBBreakpoint_SetCommandLineCommands, METH_VARARGS, (char *)"SBBreakpoint_SetCommandLineCommands(SBBreakpoint self, SBStringList commands)"},
	 { (char *)"SBBreakpoint_GetCommandLineCommands", _wrap_SBBreakpoint_GetCommandLineCommands, METH_VARARGS, (char *)"SBBreakpoint_GetCommandLineCommands(SBBreakpoint self, SBStringList commands) -> bool"},
	 { (char *)"SBBreakpoint_AddName", _wrap_SBBreakpoint_AddName, METH_VARARGS, (char *)"SBBreakpoint_AddName(SBBreakpoint self, char new_name) -> bool"},
	 { (char *)"SBBreakpoint_RemoveName", _wrap_SBBreakpoint_RemoveName, METH_VARARGS, (char *)"SBBreakpoint_RemoveName(SBBreakpoint self, char name_to_remove)"},
	 { (char *)"SBBreakpoint_MatchesName", _wrap_SBBreakpoint_MatchesName, METH_VARARGS, (char *)"SBBreakpoint_MatchesName(SBBreakpoint self, char name) -> bool"},
	 { (char *)"SBBreakpoint_GetNames", _wrap_SBBreakpoint_GetNames, METH_VARARGS, (char *)"SBBreakpoint_GetNames(SBBreakpoint self, SBStringList names)"},
	 { (char *)"SBBreakpoint_GetNumResolvedLocations", _wrap_SBBreakpoint_GetNumResolvedLocations, METH_VARARGS, (char *)"SBBreakpoint_GetNumResolvedLocations(SBBreakpoint self) -> size_t"},
	 { (char *)"SBBreakpoint_GetNumLocations", _wrap_SBBreakpoint_GetNumLocations, METH_VARARGS, (char *)"SBBreakpoint_GetNumLocations(SBBreakpoint self) -> size_t"},
	 { (char *)"SBBreakpoint_GetDescription", _wrap_SBBreakpoint_GetDescription, METH_VARARGS, (char *)"\n"
		"GetDescription(SBStream description) -> bool\n"
		"SBBreakpoint_GetDescription(SBBreakpoint self, SBStream description, bool include_locations) -> bool\n"
		""},
	 { (char *)"SBBreakpoint___eq__", _wrap_SBBreakpoint___eq__, METH_VARARGS, (char *)"SBBreakpoint___eq__(SBBreakpoint self, SBBreakpoint rhs) -> bool"},
	 { (char *)"SBBreakpoint___ne__", _wrap_SBBreakpoint___ne__, METH_VARARGS, (char *)"SBBreakpoint___ne__(SBBreakpoint self, SBBreakpoint rhs) -> bool"},
	 { (char *)"SBBreakpoint_EventIsBreakpointEvent", _wrap_SBBreakpoint_EventIsBreakpointEvent, METH_VARARGS, (char *)"SBBreakpoint_EventIsBreakpointEvent(SBEvent event) -> bool"},
	 { (char *)"SBBreakpoint_GetBreakpointEventTypeFromEvent", _wrap_SBBreakpoint_GetBreakpointEventTypeFromEvent, METH_VARARGS, (char *)"SBBreakpoint_GetBreakpointEventTypeFromEvent(SBEvent event) -> BreakpointEventType"},
	 { (char *)"SBBreakpoint_GetBreakpointFromEvent", _wrap_SBBreakpoint_GetBreakpointFromEvent, METH_VARARGS, (char *)"SBBreakpoint_GetBreakpointFromEvent(SBEvent event) -> SBBreakpoint"},
	 { (char *)"SBBreakpoint_GetBreakpointLocationAtIndexFromEvent", _wrap_SBBreakpoint_GetBreakpointLocationAtIndexFromEvent, METH_VARARGS, (char *)"SBBreakpoint_GetBreakpointLocationAtIndexFromEvent(SBEvent event, uint32_t loc_idx) -> SBBreakpointLocation"},
	 { (char *)"SBBreakpoint_GetNumBreakpointLocationsFromEvent", _wrap_SBBreakpoint_GetNumBreakpointLocationsFromEvent, METH_VARARGS, (char *)"SBBreakpoint_GetNumBreakpointLocationsFromEvent(SBEvent event_sp) -> uint32_t"},
	 { (char *)"SBBreakpoint___str__", _wrap_SBBreakpoint___str__, METH_VARARGS, (char *)"SBBreakpoint___str__(SBBreakpoint self) -> PyObject"},
	 { (char *)"SBBreakpoint_swigregister", SBBreakpoint_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBBreakpointList", _wrap_new_SBBreakpointList, METH_VARARGS, (char *)"new_SBBreakpointList(SBTarget target) -> SBBreakpointList"},
	 { (char *)"delete_SBBreakpointList", _wrap_delete_SBBreakpointList, METH_VARARGS, (char *)"delete_SBBreakpointList(SBBreakpointList self)"},
	 { (char *)"SBBreakpointList_GetSize", _wrap_SBBreakpointList_GetSize, METH_VARARGS, (char *)"SBBreakpointList_GetSize(SBBreakpointList self) -> size_t"},
	 { (char *)"SBBreakpointList_GetBreakpointAtIndex", _wrap_SBBreakpointList_GetBreakpointAtIndex, METH_VARARGS, (char *)"SBBreakpointList_GetBreakpointAtIndex(SBBreakpointList self, size_t idx) -> SBBreakpoint"},
	 { (char *)"SBBreakpointList_FindBreakpointByID", _wrap_SBBreakpointList_FindBreakpointByID, METH_VARARGS, (char *)"SBBreakpointList_FindBreakpointByID(SBBreakpointList self, break_id_t arg1) -> SBBreakpoint"},
	 { (char *)"SBBreakpointList_Append", _wrap_SBBreakpointList_Append, METH_VARARGS, (char *)"SBBreakpointList_Append(SBBreakpointList self, SBBreakpoint sb_bkpt)"},
	 { (char *)"SBBreakpointList_AppendIfUnique", _wrap_SBBreakpointList_AppendIfUnique, METH_VARARGS, (char *)"SBBreakpointList_AppendIfUnique(SBBreakpointList self, SBBreakpoint sb_bkpt) -> bool"},
	 { (char *)"SBBreakpointList_AppendByID", _wrap_SBBreakpointList_AppendByID, METH_VARARGS, (char *)"SBBreakpointList_AppendByID(SBBreakpointList self, break_id_t id)"},
	 { (char *)"SBBreakpointList_Clear", _wrap_SBBreakpointList_Clear, METH_VARARGS, (char *)"SBBreakpointList_Clear(SBBreakpointList self)"},
	 { (char *)"SBBreakpointList_swigregister", SBBreakpointList_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBBreakpointLocation", _wrap_new_SBBreakpointLocation, METH_VARARGS, (char *)"\n"
		"SBBreakpointLocation()\n"
		"new_SBBreakpointLocation(SBBreakpointLocation rhs) -> SBBreakpointLocation\n"
		""},
	 { (char *)"delete_SBBreakpointLocation", _wrap_delete_SBBreakpointLocation, METH_VARARGS, (char *)"delete_SBBreakpointLocation(SBBreakpointLocation self)"},
	 { (char *)"SBBreakpointLocation_GetID", _wrap_SBBreakpointLocation_GetID, METH_VARARGS, (char *)"SBBreakpointLocation_GetID(SBBreakpointLocation self) -> break_id_t"},
	 { (char *)"SBBreakpointLocation_IsValid", _wrap_SBBreakpointLocation_IsValid, METH_VARARGS, (char *)"SBBreakpointLocation_IsValid(SBBreakpointLocation self) -> bool"},
	 { (char *)"SBBreakpointLocation_GetAddress", _wrap_SBBreakpointLocation_GetAddress, METH_VARARGS, (char *)"SBBreakpointLocation_GetAddress(SBBreakpointLocation self) -> SBAddress"},
	 { (char *)"SBBreakpointLocation_GetLoadAddress", _wrap_SBBreakpointLocation_GetLoadAddress, METH_VARARGS, (char *)"SBBreakpointLocation_GetLoadAddress(SBBreakpointLocation self) -> addr_t"},
	 { (char *)"SBBreakpointLocation_SetEnabled", _wrap_SBBreakpointLocation_SetEnabled, METH_VARARGS, (char *)"SBBreakpointLocation_SetEnabled(SBBreakpointLocation self, bool enabled)"},
	 { (char *)"SBBreakpointLocation_IsEnabled", _wrap_SBBreakpointLocation_IsEnabled, METH_VARARGS, (char *)"SBBreakpointLocation_IsEnabled(SBBreakpointLocation self) -> bool"},
	 { (char *)"SBBreakpointLocation_GetHitCount", _wrap_SBBreakpointLocation_GetHitCount, METH_VARARGS, (char *)"SBBreakpointLocation_GetHitCount(SBBreakpointLocation self) -> uint32_t"},
	 { (char *)"SBBreakpointLocation_GetIgnoreCount", _wrap_SBBreakpointLocation_GetIgnoreCount, METH_VARARGS, (char *)"SBBreakpointLocation_GetIgnoreCount(SBBreakpointLocation self) -> uint32_t"},
	 { (char *)"SBBreakpointLocation_SetIgnoreCount", _wrap_SBBreakpointLocation_SetIgnoreCount, METH_VARARGS, (char *)"SBBreakpointLocation_SetIgnoreCount(SBBreakpointLocation self, uint32_t n)"},
	 { (char *)"SBBreakpointLocation_SetCondition", _wrap_SBBreakpointLocation_SetCondition, METH_VARARGS, (char *)"\n"
		"SBBreakpointLocation_SetCondition(SBBreakpointLocation self, char condition)\n"
		"\n"
		"//--------------------------------------------------------------------------\n"
		"/// The breakpoint location stops only if the condition expression evaluates\n"
		"/// to true.\n"
		"//--------------------------------------------------------------------------\n"
		"\n"
		""},
	 { (char *)"SBBreakpointLocation_GetCondition", _wrap_SBBreakpointLocation_GetCondition, METH_VARARGS, (char *)"\n"
		"SBBreakpointLocation_GetCondition(SBBreakpointLocation self) -> char\n"
		"\n"
		"//------------------------------------------------------------------\n"
		"/// Get the condition expression for the breakpoint location.\n"
		"//------------------------------------------------------------------\n"
		"\n"
		""},
	 { (char *)"SBBreakpointLocation_GetAutoContinue", _wrap_SBBreakpointLocation_GetAutoContinue, METH_VARARGS, (char *)"SBBreakpointLocation_GetAutoContinue(SBBreakpointLocation self) -> bool"},
	 { (char *)"SBBreakpointLocation_SetAutoContinue", _wrap_SBBreakpointLocation_SetAutoContinue, METH_VARARGS, (char *)"SBBreakpointLocation_SetAutoContinue(SBBreakpointLocation self, bool auto_continue)"},
	 { (char *)"SBBreakpointLocation_SetScriptCallbackFunction", _wrap_SBBreakpointLocation_SetScriptCallbackFunction, METH_VARARGS, (char *)"\n"
		"SBBreakpointLocation_SetScriptCallbackFunction(SBBreakpointLocation self, char callback_function_name)\n"
		"\n"
		"//------------------------------------------------------------------\n"
		"/// Set the callback to the given Python function name.\n"
		"//------------------------------------------------------------------\n"
		"\n"
		""},
	 { (char *)"SBBreakpointLocation_SetScriptCallbackBody", _wrap_SBBreakpointLocation_SetScriptCallbackBody, METH_VARARGS, (char *)"\n"
		"SBBreakpointLocation_SetScriptCallbackBody(SBBreakpointLocation self, char script_body_text) -> SBError\n"
		"\n"
		"//------------------------------------------------------------------\n"
		"/// Provide the body for the script function to be called when the breakpoint location is hit.\n"
		"/// The body will be wrapped in a function, which be passed two arguments:\n"
		"/// 'frame' - which holds the bottom-most SBFrame of the thread that hit the breakpoint\n"
		"/// 'bpno'  - which is the SBBreakpointLocation to which the callback was attached.\n"
		"///\n"
		"/// The error parameter is currently ignored, but will at some point hold the Python\n"
		"/// compilation diagnostics.\n"
		"/// Returns true if the body compiles successfully, false if not.\n"
		"//------------------------------------------------------------------\n"
		"\n"
		""},
	 { (char *)"SBBreakpointLocation_SetCommandLineCommands", _wrap_SBBreakpointLocation_SetCommandLineCommands, METH_VARARGS, (char *)"SBBreakpointLocation_SetCommandLineCommands(SBBreakpointLocation self, SBStringList commands)"},
	 { (char *)"SBBreakpointLocation_GetCommandLineCommands", _wrap_SBBreakpointLocation_GetCommandLineCommands, METH_VARARGS, (char *)"SBBreakpointLocation_GetCommandLineCommands(SBBreakpointLocation self, SBStringList commands) -> bool"},
	 { (char *)"SBBreakpointLocation_SetThreadID", _wrap_SBBreakpointLocation_SetThreadID, METH_VARARGS, (char *)"SBBreakpointLocation_SetThreadID(SBBreakpointLocation self, tid_t sb_thread_id)"},
	 { (char *)"SBBreakpointLocation_GetThreadID", _wrap_SBBreakpointLocation_GetThreadID, METH_VARARGS, (char *)"SBBreakpointLocation_GetThreadID(SBBreakpointLocation self) -> tid_t"},
	 { (char *)"SBBreakpointLocation_SetThreadIndex", _wrap_SBBreakpointLocation_SetThreadIndex, METH_VARARGS, (char *)"SBBreakpointLocation_SetThreadIndex(SBBreakpointLocation self, uint32_t index)"},
	 { (char *)"SBBreakpointLocation_GetThreadIndex", _wrap_SBBreakpointLocation_GetThreadIndex, METH_VARARGS, (char *)"SBBreakpointLocation_GetThreadIndex(SBBreakpointLocation self) -> uint32_t"},
	 { (char *)"SBBreakpointLocation_SetThreadName", _wrap_SBBreakpointLocation_SetThreadName, METH_VARARGS, (char *)"SBBreakpointLocation_SetThreadName(SBBreakpointLocation self, char thread_name)"},
	 { (char *)"SBBreakpointLocation_GetThreadName", _wrap_SBBreakpointLocation_GetThreadName, METH_VARARGS, (char *)"SBBreakpointLocation_GetThreadName(SBBreakpointLocation self) -> char"},
	 { (char *)"SBBreakpointLocation_SetQueueName", _wrap_SBBreakpointLocation_SetQueueName, METH_VARARGS, (char *)"SBBreakpointLocation_SetQueueName(SBBreakpointLocation self, char queue_name)"},
	 { (char *)"SBBreakpointLocation_GetQueueName", _wrap_SBBreakpointLocation_GetQueueName, METH_VARARGS, (char *)"SBBreakpointLocation_GetQueueName(SBBreakpointLocation self) -> char"},
	 { (char *)"SBBreakpointLocation_IsResolved", _wrap_SBBreakpointLocation_IsResolved, METH_VARARGS, (char *)"SBBreakpointLocation_IsResolved(SBBreakpointLocation self) -> bool"},
	 { (char *)"SBBreakpointLocation_GetDescription", _wrap_SBBreakpointLocation_GetDescription, METH_VARARGS, (char *)"SBBreakpointLocation_GetDescription(SBBreakpointLocation self, SBStream description, DescriptionLevel level) -> bool"},
	 { (char *)"SBBreakpointLocation_GetBreakpoint", _wrap_SBBreakpointLocation_GetBreakpoint, METH_VARARGS, (char *)"SBBreakpointLocation_GetBreakpoint(SBBreakpointLocation self) -> SBBreakpoint"},
	 { (char *)"SBBreakpointLocation___str__", _wrap_SBBreakpointLocation___str__, METH_VARARGS, (char *)"SBBreakpointLocation___str__(SBBreakpointLocation self) -> PyObject"},
	 { (char *)"SBBreakpointLocation_swigregister", SBBreakpointLocation_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBBreakpointName", _wrap_new_SBBreakpointName, METH_VARARGS, (char *)"\n"
		"SBBreakpointName()\n"
		"SBBreakpointName(SBTarget target, char name)\n"
		"SBBreakpointName(SBBreakpoint bkpt, char name)\n"
		"new_SBBreakpointName(SBBreakpointName rhs) -> SBBreakpointName\n"
		""},
	 { (char *)"delete_SBBreakpointName", _wrap_delete_SBBreakpointName, METH_VARARGS, (char *)"delete_SBBreakpointName(SBBreakpointName self)"},
	 { (char *)"SBBreakpointName___eq__", _wrap_SBBreakpointName___eq__, METH_VARARGS, (char *)"SBBreakpointName___eq__(SBBreakpointName self, SBBreakpointName rhs) -> bool"},
	 { (char *)"SBBreakpointName___ne__", _wrap_SBBreakpointName___ne__, METH_VARARGS, (char *)"SBBreakpointName___ne__(SBBreakpointName self, SBBreakpointName rhs) -> bool"},
	 { (char *)"SBBreakpointName_IsValid", _wrap_SBBreakpointName_IsValid, METH_VARARGS, (char *)"SBBreakpointName_IsValid(SBBreakpointName self) -> bool"},
	 { (char *)"SBBreakpointName_GetName", _wrap_SBBreakpointName_GetName, METH_VARARGS, (char *)"SBBreakpointName_GetName(SBBreakpointName self) -> char"},
	 { (char *)"SBBreakpointName_SetEnabled", _wrap_SBBreakpointName_SetEnabled, METH_VARARGS, (char *)"SBBreakpointName_SetEnabled(SBBreakpointName self, bool enable)"},
	 { (char *)"SBBreakpointName_IsEnabled", _wrap_SBBreakpointName_IsEnabled, METH_VARARGS, (char *)"SBBreakpointName_IsEnabled(SBBreakpointName self) -> bool"},
	 { (char *)"SBBreakpointName_SetOneShot", _wrap_SBBreakpointName_SetOneShot, METH_VARARGS, (char *)"SBBreakpointName_SetOneShot(SBBreakpointName self, bool one_shot)"},
	 { (char *)"SBBreakpointName_IsOneShot", _wrap_SBBreakpointName_IsOneShot, METH_VARARGS, (char *)"SBBreakpointName_IsOneShot(SBBreakpointName self) -> bool"},
	 { (char *)"SBBreakpointName_SetIgnoreCount", _wrap_SBBreakpointName_SetIgnoreCount, METH_VARARGS, (char *)"SBBreakpointName_SetIgnoreCount(SBBreakpointName self, uint32_t count)"},
	 { (char *)"SBBreakpointName_GetIgnoreCount", _wrap_SBBreakpointName_GetIgnoreCount, METH_VARARGS, (char *)"SBBreakpointName_GetIgnoreCount(SBBreakpointName self) -> uint32_t"},
	 { (char *)"SBBreakpointName_SetCondition", _wrap_SBBreakpointName_SetCondition, METH_VARARGS, (char *)"SBBreakpointName_SetCondition(SBBreakpointName self, char condition)"},
	 { (char *)"SBBreakpointName_GetCondition", _wrap_SBBreakpointName_GetCondition, METH_VARARGS, (char *)"SBBreakpointName_GetCondition(SBBreakpointName self) -> char"},
	 { (char *)"SBBreakpointName_SetAutoContinue", _wrap_SBBreakpointName_SetAutoContinue, METH_VARARGS, (char *)"SBBreakpointName_SetAutoContinue(SBBreakpointName self, bool auto_continue)"},
	 { (char *)"SBBreakpointName_GetAutoContinue", _wrap_SBBreakpointName_GetAutoContinue, METH_VARARGS, (char *)"SBBreakpointName_GetAutoContinue(SBBreakpointName self) -> bool"},
	 { (char *)"SBBreakpointName_SetThreadID", _wrap_SBBreakpointName_SetThreadID, METH_VARARGS, (char *)"SBBreakpointName_SetThreadID(SBBreakpointName self, tid_t sb_thread_id)"},
	 { (char *)"SBBreakpointName_GetThreadID", _wrap_SBBreakpointName_GetThreadID, METH_VARARGS, (char *)"SBBreakpointName_GetThreadID(SBBreakpointName self) -> tid_t"},
	 { (char *)"SBBreakpointName_SetThreadIndex", _wrap_SBBreakpointName_SetThreadIndex, METH_VARARGS, (char *)"SBBreakpointName_SetThreadIndex(SBBreakpointName self, uint32_t index)"},
	 { (char *)"SBBreakpointName_GetThreadIndex", _wrap_SBBreakpointName_GetThreadIndex, METH_VARARGS, (char *)"SBBreakpointName_GetThreadIndex(SBBreakpointName self) -> uint32_t"},
	 { (char *)"SBBreakpointName_SetThreadName", _wrap_SBBreakpointName_SetThreadName, METH_VARARGS, (char *)"SBBreakpointName_SetThreadName(SBBreakpointName self, char thread_name)"},
	 { (char *)"SBBreakpointName_GetThreadName", _wrap_SBBreakpointName_GetThreadName, METH_VARARGS, (char *)"SBBreakpointName_GetThreadName(SBBreakpointName self) -> char"},
	 { (char *)"SBBreakpointName_SetQueueName", _wrap_SBBreakpointName_SetQueueName, METH_VARARGS, (char *)"SBBreakpointName_SetQueueName(SBBreakpointName self, char queue_name)"},
	 { (char *)"SBBreakpointName_GetQueueName", _wrap_SBBreakpointName_GetQueueName, METH_VARARGS, (char *)"SBBreakpointName_GetQueueName(SBBreakpointName self) -> char"},
	 { (char *)"SBBreakpointName_SetScriptCallbackFunction", _wrap_SBBreakpointName_SetScriptCallbackFunction, METH_VARARGS, (char *)"SBBreakpointName_SetScriptCallbackFunction(SBBreakpointName self, char callback_function_name)"},
	 { (char *)"SBBreakpointName_SetCommandLineCommands", _wrap_SBBreakpointName_SetCommandLineCommands, METH_VARARGS, (char *)"SBBreakpointName_SetCommandLineCommands(SBBreakpointName self, SBStringList commands)"},
	 { (char *)"SBBreakpointName_GetCommandLineCommands", _wrap_SBBreakpointName_GetCommandLineCommands, METH_VARARGS, (char *)"SBBreakpointName_GetCommandLineCommands(SBBreakpointName self, SBStringList commands) -> bool"},
	 { (char *)"SBBreakpointName_SetScriptCallbackBody", _wrap_SBBreakpointName_SetScriptCallbackBody, METH_VARARGS, (char *)"SBBreakpointName_SetScriptCallbackBody(SBBreakpointName self, char script_body_text) -> SBError"},
	 { (char *)"SBBreakpointName_GetHelpString", _wrap_SBBreakpointName_GetHelpString, METH_VARARGS, (char *)"SBBreakpointName_GetHelpString(SBBreakpointName self) -> char"},
	 { (char *)"SBBreakpointName_SetHelpString", _wrap_SBBreakpointName_SetHelpString, METH_VARARGS, (char *)"SBBreakpointName_SetHelpString(SBBreakpointName self, char help_string)"},
	 { (char *)"SBBreakpointName_GetAllowList", _wrap_SBBreakpointName_GetAllowList, METH_VARARGS, (char *)"SBBreakpointName_GetAllowList(SBBreakpointName self) -> bool"},
	 { (char *)"SBBreakpointName_SetAllowList", _wrap_SBBreakpointName_SetAllowList, METH_VARARGS, (char *)"SBBreakpointName_SetAllowList(SBBreakpointName self, bool value)"},
	 { (char *)"SBBreakpointName_GetAllowDelete", _wrap_SBBreakpointName_GetAllowDelete, METH_VARARGS, (char *)"SBBreakpointName_GetAllowDelete(SBBreakpointName self) -> bool"},
	 { (char *)"SBBreakpointName_SetAllowDelete", _wrap_SBBreakpointName_SetAllowDelete, METH_VARARGS, (char *)"SBBreakpointName_SetAllowDelete(SBBreakpointName self, bool value)"},
	 { (char *)"SBBreakpointName_GetAllowDisable", _wrap_SBBreakpointName_GetAllowDisable, METH_VARARGS, (char *)"SBBreakpointName_GetAllowDisable(SBBreakpointName self) -> bool"},
	 { (char *)"SBBreakpointName_SetAllowDisable", _wrap_SBBreakpointName_SetAllowDisable, METH_VARARGS, (char *)"SBBreakpointName_SetAllowDisable(SBBreakpointName self, bool value)"},
	 { (char *)"SBBreakpointName_GetDescription", _wrap_SBBreakpointName_GetDescription, METH_VARARGS, (char *)"SBBreakpointName_GetDescription(SBBreakpointName self, SBStream description) -> bool"},
	 { (char *)"SBBreakpointName___str__", _wrap_SBBreakpointName___str__, METH_VARARGS, (char *)"SBBreakpointName___str__(SBBreakpointName self) -> PyObject"},
	 { (char *)"SBBreakpointName_swigregister", SBBreakpointName_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBBroadcaster", _wrap_new_SBBroadcaster, METH_VARARGS, (char *)"\n"
		"SBBroadcaster()\n"
		"SBBroadcaster(char name)\n"
		"new_SBBroadcaster(SBBroadcaster rhs) -> SBBroadcaster\n"
		""},
	 { (char *)"delete_SBBroadcaster", _wrap_delete_SBBroadcaster, METH_VARARGS, (char *)"delete_SBBroadcaster(SBBroadcaster self)"},
	 { (char *)"SBBroadcaster_IsValid", _wrap_SBBroadcaster_IsValid, METH_VARARGS, (char *)"SBBroadcaster_IsValid(SBBroadcaster self) -> bool"},
	 { (char *)"SBBroadcaster_Clear", _wrap_SBBroadcaster_Clear, METH_VARARGS, (char *)"SBBroadcaster_Clear(SBBroadcaster self)"},
	 { (char *)"SBBroadcaster_BroadcastEventByType", _wrap_SBBroadcaster_BroadcastEventByType, METH_VARARGS, (char *)"\n"
		"BroadcastEventByType(uint32_t event_type, bool unique = False)\n"
		"SBBroadcaster_BroadcastEventByType(SBBroadcaster self, uint32_t event_type)\n"
		""},
	 { (char *)"SBBroadcaster_BroadcastEvent", _wrap_SBBroadcaster_BroadcastEvent, METH_VARARGS, (char *)"\n"
		"BroadcastEvent(SBEvent event, bool unique = False)\n"
		"SBBroadcaster_BroadcastEvent(SBBroadcaster self, SBEvent event)\n"
		""},
	 { (char *)"SBBroadcaster_AddInitialEventsToListener", _wrap_SBBroadcaster_AddInitialEventsToListener, METH_VARARGS, (char *)"SBBroadcaster_AddInitialEventsToListener(SBBroadcaster self, SBListener listener, uint32_t requested_events)"},
	 { (char *)"SBBroadcaster_AddListener", _wrap_SBBroadcaster_AddListener, METH_VARARGS, (char *)"SBBroadcaster_AddListener(SBBroadcaster self, SBListener listener, uint32_t event_mask) -> uint32_t"},
	 { (char *)"SBBroadcaster_GetName", _wrap_SBBroadcaster_GetName, METH_VARARGS, (char *)"SBBroadcaster_GetName(SBBroadcaster self) -> char"},
	 { (char *)"SBBroadcaster_EventTypeHasListeners", _wrap_SBBroadcaster_EventTypeHasListeners, METH_VARARGS, (char *)"SBBroadcaster_EventTypeHasListeners(SBBroadcaster self, uint32_t event_type) -> bool"},
	 { (char *)"SBBroadcaster_RemoveListener", _wrap_SBBroadcaster_RemoveListener, METH_VARARGS, (char *)"\n"
		"RemoveListener(SBListener listener, uint32_t event_mask = 4294967295U) -> bool\n"
		"SBBroadcaster_RemoveListener(SBBroadcaster self, SBListener listener) -> bool\n"
		""},
	 { (char *)"SBBroadcaster___eq__", _wrap_SBBroadcaster___eq__, METH_VARARGS, (char *)"SBBroadcaster___eq__(SBBroadcaster self, SBBroadcaster rhs) -> bool"},
	 { (char *)"SBBroadcaster___ne__", _wrap_SBBroadcaster___ne__, METH_VARARGS, (char *)"SBBroadcaster___ne__(SBBroadcaster self, SBBroadcaster rhs) -> bool"},
	 { (char *)"SBBroadcaster_swigregister", SBBroadcaster_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBCommandInterpreterRunOptions", _wrap_new_SBCommandInterpreterRunOptions, METH_VARARGS, (char *)"new_SBCommandInterpreterRunOptions() -> SBCommandInterpreterRunOptions"},
	 { (char *)"delete_SBCommandInterpreterRunOptions", _wrap_delete_SBCommandInterpreterRunOptions, METH_VARARGS, (char *)"delete_SBCommandInterpreterRunOptions(SBCommandInterpreterRunOptions self)"},
	 { (char *)"SBCommandInterpreterRunOptions_GetStopOnContinue", _wrap_SBCommandInterpreterRunOptions_GetStopOnContinue, METH_VARARGS, (char *)"SBCommandInterpreterRunOptions_GetStopOnContinue(SBCommandInterpreterRunOptions self) -> bool"},
	 { (char *)"SBCommandInterpreterRunOptions_SetStopOnContinue", _wrap_SBCommandInterpreterRunOptions_SetStopOnContinue, METH_VARARGS, (char *)"SBCommandInterpreterRunOptions_SetStopOnContinue(SBCommandInterpreterRunOptions self, bool arg1)"},
	 { (char *)"SBCommandInterpreterRunOptions_GetStopOnError", _wrap_SBCommandInterpreterRunOptions_GetStopOnError, METH_VARARGS, (char *)"SBCommandInterpreterRunOptions_GetStopOnError(SBCommandInterpreterRunOptions self) -> bool"},
	 { (char *)"SBCommandInterpreterRunOptions_SetStopOnError", _wrap_SBCommandInterpreterRunOptions_SetStopOnError, METH_VARARGS, (char *)"SBCommandInterpreterRunOptions_SetStopOnError(SBCommandInterpreterRunOptions self, bool arg1)"},
	 { (char *)"SBCommandInterpreterRunOptions_GetStopOnCrash", _wrap_SBCommandInterpreterRunOptions_GetStopOnCrash, METH_VARARGS, (char *)"SBCommandInterpreterRunOptions_GetStopOnCrash(SBCommandInterpreterRunOptions self) -> bool"},
	 { (char *)"SBCommandInterpreterRunOptions_SetStopOnCrash", _wrap_SBCommandInterpreterRunOptions_SetStopOnCrash, METH_VARARGS, (char *)"SBCommandInterpreterRunOptions_SetStopOnCrash(SBCommandInterpreterRunOptions self, bool arg1)"},
	 { (char *)"SBCommandInterpreterRunOptions_GetEchoCommands", _wrap_SBCommandInterpreterRunOptions_GetEchoCommands, METH_VARARGS, (char *)"SBCommandInterpreterRunOptions_GetEchoCommands(SBCommandInterpreterRunOptions self) -> bool"},
	 { (char *)"SBCommandInterpreterRunOptions_SetEchoCommands", _wrap_SBCommandInterpreterRunOptions_SetEchoCommands, METH_VARARGS, (char *)"SBCommandInterpreterRunOptions_SetEchoCommands(SBCommandInterpreterRunOptions self, bool arg1)"},
	 { (char *)"SBCommandInterpreterRunOptions_GetPrintResults", _wrap_SBCommandInterpreterRunOptions_GetPrintResults, METH_VARARGS, (char *)"SBCommandInterpreterRunOptions_GetPrintResults(SBCommandInterpreterRunOptions self) -> bool"},
	 { (char *)"SBCommandInterpreterRunOptions_SetPrintResults", _wrap_SBCommandInterpreterRunOptions_SetPrintResults, METH_VARARGS, (char *)"SBCommandInterpreterRunOptions_SetPrintResults(SBCommandInterpreterRunOptions self, bool arg1)"},
	 { (char *)"SBCommandInterpreterRunOptions_GetAddToHistory", _wrap_SBCommandInterpreterRunOptions_GetAddToHistory, METH_VARARGS, (char *)"SBCommandInterpreterRunOptions_GetAddToHistory(SBCommandInterpreterRunOptions self) -> bool"},
	 { (char *)"SBCommandInterpreterRunOptions_SetAddToHistory", _wrap_SBCommandInterpreterRunOptions_SetAddToHistory, METH_VARARGS, (char *)"SBCommandInterpreterRunOptions_SetAddToHistory(SBCommandInterpreterRunOptions self, bool arg1)"},
	 { (char *)"SBCommandInterpreterRunOptions_swigregister", SBCommandInterpreterRunOptions_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBCommandInterpreter", _wrap_new_SBCommandInterpreter, METH_VARARGS, (char *)"new_SBCommandInterpreter(SBCommandInterpreter rhs) -> SBCommandInterpreter"},
	 { (char *)"delete_SBCommandInterpreter", _wrap_delete_SBCommandInterpreter, METH_VARARGS, (char *)"delete_SBCommandInterpreter(SBCommandInterpreter self)"},
	 { (char *)"SBCommandInterpreter_GetArgumentTypeAsCString", _wrap_SBCommandInterpreter_GetArgumentTypeAsCString, METH_VARARGS, (char *)"SBCommandInterpreter_GetArgumentTypeAsCString(CommandArgumentType arg_type) -> char"},
	 { (char *)"SBCommandInterpreter_GetArgumentDescriptionAsCString", _wrap_SBCommandInterpreter_GetArgumentDescriptionAsCString, METH_VARARGS, (char *)"SBCommandInterpreter_GetArgumentDescriptionAsCString(CommandArgumentType arg_type) -> char"},
	 { (char *)"SBCommandInterpreter_EventIsCommandInterpreterEvent", _wrap_SBCommandInterpreter_EventIsCommandInterpreterEvent, METH_VARARGS, (char *)"SBCommandInterpreter_EventIsCommandInterpreterEvent(SBEvent event) -> bool"},
	 { (char *)"SBCommandInterpreter_IsValid", _wrap_SBCommandInterpreter_IsValid, METH_VARARGS, (char *)"SBCommandInterpreter_IsValid(SBCommandInterpreter self) -> bool"},
	 { (char *)"SBCommandInterpreter_GetIOHandlerControlSequence", _wrap_SBCommandInterpreter_GetIOHandlerControlSequence, METH_VARARGS, (char *)"SBCommandInterpreter_GetIOHandlerControlSequence(SBCommandInterpreter self, char ch) -> char"},
	 { (char *)"SBCommandInterpreter_GetPromptOnQuit", _wrap_SBCommandInterpreter_GetPromptOnQuit, METH_VARARGS, (char *)"SBCommandInterpreter_GetPromptOnQuit(SBCommandInterpreter self) -> bool"},
	 { (char *)"SBCommandInterpreter_SetPromptOnQuit", _wrap_SBCommandInterpreter_SetPromptOnQuit, METH_VARARGS, (char *)"SBCommandInterpreter_SetPromptOnQuit(SBCommandInterpreter self, bool b)"},
	 { (char *)"SBCommandInterpreter_ResolveCommand", _wrap_SBCommandInterpreter_ResolveCommand, METH_VARARGS, (char *)"SBCommandInterpreter_ResolveCommand(SBCommandInterpreter self, char command_line, SBCommandReturnObject result)"},
	 { (char *)"SBCommandInterpreter_CommandExists", _wrap_SBCommandInterpreter_CommandExists, METH_VARARGS, (char *)"SBCommandInterpreter_CommandExists(SBCommandInterpreter self, char cmd) -> bool"},
	 { (char *)"SBCommandInterpreter_AliasExists", _wrap_SBCommandInterpreter_AliasExists, METH_VARARGS, (char *)"SBCommandInterpreter_AliasExists(SBCommandInterpreter self, char cmd) -> bool"},
	 { (char *)"SBCommandInterpreter_GetBroadcaster", _wrap_SBCommandInterpreter_GetBroadcaster, METH_VARARGS, (char *)"SBCommandInterpreter_GetBroadcaster(SBCommandInterpreter self) -> SBBroadcaster"},
	 { (char *)"SBCommandInterpreter_GetBroadcasterClass", _wrap_SBCommandInterpreter_GetBroadcasterClass, METH_VARARGS, (char *)"SBCommandInterpreter_GetBroadcasterClass() -> char"},
	 { (char *)"SBCommandInterpreter_HasCommands", _wrap_SBCommandInterpreter_HasCommands, METH_VARARGS, (char *)"SBCommandInterpreter_HasCommands(SBCommandInterpreter self) -> bool"},
	 { (char *)"SBCommandInterpreter_HasAliases", _wrap_SBCommandInterpreter_HasAliases, METH_VARARGS, (char *)"SBCommandInterpreter_HasAliases(SBCommandInterpreter self) -> bool"},
	 { (char *)"SBCommandInterpreter_HasAliasOptions", _wrap_SBCommandInterpreter_HasAliasOptions, METH_VARARGS, (char *)"SBCommandInterpreter_HasAliasOptions(SBCommandInterpreter self) -> bool"},
	 { (char *)"SBCommandInterpreter_GetProcess", _wrap_SBCommandInterpreter_GetProcess, METH_VARARGS, (char *)"SBCommandInterpreter_GetProcess(SBCommandInterpreter self) -> SBProcess"},
	 { (char *)"SBCommandInterpreter_GetDebugger", _wrap_SBCommandInterpreter_GetDebugger, METH_VARARGS, (char *)"SBCommandInterpreter_GetDebugger(SBCommandInterpreter self) -> SBDebugger"},
	 { (char *)"SBCommandInterpreter_SourceInitFileInHomeDirectory", _wrap_SBCommandInterpreter_SourceInitFileInHomeDirectory, METH_VARARGS, (char *)"SBCommandInterpreter_SourceInitFileInHomeDirectory(SBCommandInterpreter self, SBCommandReturnObject result)"},
	 { (char *)"SBCommandInterpreter_SourceInitFileInCurrentWorkingDirectory", _wrap_SBCommandInterpreter_SourceInitFileInCurrentWorkingDirectory, METH_VARARGS, (char *)"SBCommandInterpreter_SourceInitFileInCurrentWorkingDirectory(SBCommandInterpreter self, SBCommandReturnObject result)"},
	 { (char *)"SBCommandInterpreter_HandleCommand", _wrap_SBCommandInterpreter_HandleCommand, METH_VARARGS, (char *)"\n"
		"HandleCommand(char command_line, SBCommandReturnObject result, bool add_to_history = False) -> ReturnStatus\n"
		"HandleCommand(char command_line, SBCommandReturnObject result) -> ReturnStatus\n"
		"HandleCommand(char command_line, SBExecutionContext exe_ctx, SBCommandReturnObject result, \n"
		"    bool add_to_history = False) -> ReturnStatus\n"
		"SBCommandInterpreter_HandleCommand(SBCommandInterpreter self, char command_line, SBExecutionContext exe_ctx, \n"
		"    SBCommandReturnObject result) -> ReturnStatus\n"
		""},
	 { (char *)"SBCommandInterpreter_HandleCommandsFromFile", _wrap_SBCommandInterpreter_HandleCommandsFromFile, METH_VARARGS, (char *)"\n"
		"SBCommandInterpreter_HandleCommandsFromFile(SBCommandInterpreter self, SBFileSpec file, SBExecutionContext override_context, \n"
		"    SBCommandInterpreterRunOptions options, \n"
		"    SBCommandReturnObject result)\n"
		""},
	 { (char *)"SBCommandInterpreter_HandleCompletion", _wrap_SBCommandInterpreter_HandleCompletion, METH_VARARGS, (char *)"\n"
		"SBCommandInterpreter_HandleCompletion(SBCommandInterpreter self, char current_line, uint32_t cursor_pos, \n"
		"    int match_start_point, int max_return_elements, \n"
		"    SBStringList matches) -> int\n"
		""},
	 { (char *)"SBCommandInterpreter_IsActive", _wrap_SBCommandInterpreter_IsActive, METH_VARARGS, (char *)"SBCommandInterpreter_IsActive(SBCommandInterpreter self) -> bool"},
	 { (char *)"SBCommandInterpreter_WasInterrupted", _wrap_SBCommandInterpreter_WasInterrupted, METH_VARARGS, (char *)"SBCommandInterpreter_WasInterrupted(SBCommandInterpreter self) -> bool"},
	 { (char *)"SBCommandInterpreter_swigregister", SBCommandInterpreter_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBCommandReturnObject", _wrap_new_SBCommandReturnObject, METH_VARARGS, (char *)"\n"
		"SBCommandReturnObject()\n"
		"new_SBCommandReturnObject(SBCommandReturnObject rhs) -> SBCommandReturnObject\n"
		""},
	 { (char *)"delete_SBCommandReturnObject", _wrap_delete_SBCommandReturnObject, METH_VARARGS, (char *)"delete_SBCommandReturnObject(SBCommandReturnObject self)"},
	 { (char *)"SBCommandReturnObject_IsValid", _wrap_SBCommandReturnObject_IsValid, METH_VARARGS, (char *)"SBCommandReturnObject_IsValid(SBCommandReturnObject self) -> bool"},
	 { (char *)"SBCommandReturnObject_GetOutputSize", _wrap_SBCommandReturnObject_GetOutputSize, METH_VARARGS, (char *)"SBCommandReturnObject_GetOutputSize(SBCommandReturnObject self) -> size_t"},
	 { (char *)"SBCommandReturnObject_GetErrorSize", _wrap_SBCommandReturnObject_GetErrorSize, METH_VARARGS, (char *)"SBCommandReturnObject_GetErrorSize(SBCommandReturnObject self) -> size_t"},
	 { (char *)"SBCommandReturnObject_GetOutput", _wrap_SBCommandReturnObject_GetOutput, METH_VARARGS, (char *)"\n"
		"GetOutput() -> char\n"
		"SBCommandReturnObject_GetOutput(SBCommandReturnObject self, bool only_if_no_immediate) -> char\n"
		""},
	 { (char *)"SBCommandReturnObject_GetError", _wrap_SBCommandReturnObject_GetError, METH_VARARGS, (char *)"\n"
		"GetError() -> char\n"
		"SBCommandReturnObject_GetError(SBCommandReturnObject self, bool if_no_immediate) -> char\n"
		""},
	 { (char *)"SBCommandReturnObject_PutOutput", _wrap_SBCommandReturnObject_PutOutput, METH_VARARGS, (char *)"SBCommandReturnObject_PutOutput(SBCommandReturnObject self, FILE fh) -> size_t"},
	 { (char *)"SBCommandReturnObject_PutError", _wrap_SBCommandReturnObject_PutError, METH_VARARGS, (char *)"SBCommandReturnObject_PutError(SBCommandReturnObject self, FILE fh) -> size_t"},
	 { (char *)"SBCommandReturnObject_Clear", _wrap_SBCommandReturnObject_Clear, METH_VARARGS, (char *)"SBCommandReturnObject_Clear(SBCommandReturnObject self)"},
	 { (char *)"SBCommandReturnObject_SetStatus", _wrap_SBCommandReturnObject_SetStatus, METH_VARARGS, (char *)"SBCommandReturnObject_SetStatus(SBCommandReturnObject self, ReturnStatus status)"},
	 { (char *)"SBCommandReturnObject_SetError", _wrap_SBCommandReturnObject_SetError, METH_VARARGS, (char *)"\n"
		"SetError(SBError error, char fallback_error_cstr = None)\n"
		"SetError(SBError error)\n"
		"SBCommandReturnObject_SetError(SBCommandReturnObject self, char error_cstr)\n"
		""},
	 { (char *)"SBCommandReturnObject_GetStatus", _wrap_SBCommandReturnObject_GetStatus, METH_VARARGS, (char *)"SBCommandReturnObject_GetStatus(SBCommandReturnObject self) -> ReturnStatus"},
	 { (char *)"SBCommandReturnObject_Succeeded", _wrap_SBCommandReturnObject_Succeeded, METH_VARARGS, (char *)"SBCommandReturnObject_Succeeded(SBCommandReturnObject self) -> bool"},
	 { (char *)"SBCommandReturnObject_HasResult", _wrap_SBCommandReturnObject_HasResult, METH_VARARGS, (char *)"SBCommandReturnObject_HasResult(SBCommandReturnObject self) -> bool"},
	 { (char *)"SBCommandReturnObject_AppendMessage", _wrap_SBCommandReturnObject_AppendMessage, METH_VARARGS, (char *)"SBCommandReturnObject_AppendMessage(SBCommandReturnObject self, char message)"},
	 { (char *)"SBCommandReturnObject_AppendWarning", _wrap_SBCommandReturnObject_AppendWarning, METH_VARARGS, (char *)"SBCommandReturnObject_AppendWarning(SBCommandReturnObject self, char message)"},
	 { (char *)"SBCommandReturnObject_GetDescription", _wrap_SBCommandReturnObject_GetDescription, METH_VARARGS, (char *)"SBCommandReturnObject_GetDescription(SBCommandReturnObject self, SBStream description) -> bool"},
	 { (char *)"SBCommandReturnObject_SetImmediateOutputFile", _wrap_SBCommandReturnObject_SetImmediateOutputFile, METH_VARARGS, (char *)"SBCommandReturnObject_SetImmediateOutputFile(SBCommandReturnObject self, FILE fh)"},
	 { (char *)"SBCommandReturnObject_SetImmediateErrorFile", _wrap_SBCommandReturnObject_SetImmediateErrorFile, METH_VARARGS, (char *)"SBCommandReturnObject_SetImmediateErrorFile(SBCommandReturnObject self, FILE fh)"},
	 { (char *)"SBCommandReturnObject_PutCString", _wrap_SBCommandReturnObject_PutCString, METH_VARARGS, (char *)"SBCommandReturnObject_PutCString(SBCommandReturnObject self, char string)"},
	 { (char *)"SBCommandReturnObject_Print", _wrap_SBCommandReturnObject_Print, METH_VARARGS, (char *)"SBCommandReturnObject_Print(SBCommandReturnObject self, char str)"},
	 { (char *)"SBCommandReturnObject___str__", _wrap_SBCommandReturnObject___str__, METH_VARARGS, (char *)"SBCommandReturnObject___str__(SBCommandReturnObject self) -> PyObject"},
	 { (char *)"SBCommandReturnObject_write", _wrap_SBCommandReturnObject_write, METH_VARARGS, (char *)"SBCommandReturnObject_write(SBCommandReturnObject self, char str)"},
	 { (char *)"SBCommandReturnObject_flush", _wrap_SBCommandReturnObject_flush, METH_VARARGS, (char *)"SBCommandReturnObject_flush(SBCommandReturnObject self)"},
	 { (char *)"SBCommandReturnObject_swigregister", SBCommandReturnObject_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBCommunication", _wrap_new_SBCommunication, METH_VARARGS, (char *)"\n"
		"SBCommunication()\n"
		"new_SBCommunication(char broadcaster_name) -> SBCommunication\n"
		""},
	 { (char *)"delete_SBCommunication", _wrap_delete_SBCommunication, METH_VARARGS, (char *)"delete_SBCommunication(SBCommunication self)"},
	 { (char *)"SBCommunication_IsValid", _wrap_SBCommunication_IsValid, METH_VARARGS, (char *)"SBCommunication_IsValid(SBCommunication self) -> bool"},
	 { (char *)"SBCommunication_GetBroadcaster", _wrap_SBCommunication_GetBroadcaster, METH_VARARGS, (char *)"SBCommunication_GetBroadcaster(SBCommunication self) -> SBBroadcaster"},
	 { (char *)"SBCommunication_GetBroadcasterClass", _wrap_SBCommunication_GetBroadcasterClass, METH_VARARGS, (char *)"SBCommunication_GetBroadcasterClass() -> char"},
	 { (char *)"SBCommunication_AdoptFileDesriptor", _wrap_SBCommunication_AdoptFileDesriptor, METH_VARARGS, (char *)"SBCommunication_AdoptFileDesriptor(SBCommunication self, int fd, bool owns_fd) -> ConnectionStatus"},
	 { (char *)"SBCommunication_Connect", _wrap_SBCommunication_Connect, METH_VARARGS, (char *)"SBCommunication_Connect(SBCommunication self, char url) -> ConnectionStatus"},
	 { (char *)"SBCommunication_Disconnect", _wrap_SBCommunication_Disconnect, METH_VARARGS, (char *)"SBCommunication_Disconnect(SBCommunication self) -> ConnectionStatus"},
	 { (char *)"SBCommunication_IsConnected", _wrap_SBCommunication_IsConnected, METH_VARARGS, (char *)"SBCommunication_IsConnected(SBCommunication self) -> bool"},
	 { (char *)"SBCommunication_GetCloseOnEOF", _wrap_SBCommunication_GetCloseOnEOF, METH_VARARGS, (char *)"SBCommunication_GetCloseOnEOF(SBCommunication self) -> bool"},
	 { (char *)"SBCommunication_SetCloseOnEOF", _wrap_SBCommunication_SetCloseOnEOF, METH_VARARGS, (char *)"SBCommunication_SetCloseOnEOF(SBCommunication self, bool b)"},
	 { (char *)"SBCommunication_Read", _wrap_SBCommunication_Read, METH_VARARGS, (char *)"\n"
		"SBCommunication_Read(SBCommunication self, void dst, size_t dst_len, uint32_t timeout_usec, \n"
		"    ConnectionStatus status) -> size_t\n"
		""},
	 { (char *)"SBCommunication_Write", _wrap_SBCommunication_Write, METH_VARARGS, (char *)"SBCommunication_Write(SBCommunication self, void src, size_t src_len, ConnectionStatus status) -> size_t"},
	 { (char *)"SBCommunication_ReadThreadStart", _wrap_SBCommunication_ReadThreadStart, METH_VARARGS, (char *)"SBCommunication_ReadThreadStart(SBCommunication self) -> bool"},
	 { (char *)"SBCommunication_ReadThreadStop", _wrap_SBCommunication_ReadThreadStop, METH_VARARGS, (char *)"SBCommunication_ReadThreadStop(SBCommunication self) -> bool"},
	 { (char *)"SBCommunication_ReadThreadIsRunning", _wrap_SBCommunication_ReadThreadIsRunning, METH_VARARGS, (char *)"SBCommunication_ReadThreadIsRunning(SBCommunication self) -> bool"},
	 { (char *)"SBCommunication_SetReadThreadBytesReceivedCallback", _wrap_SBCommunication_SetReadThreadBytesReceivedCallback, METH_VARARGS, (char *)"\n"
		"SBCommunication_SetReadThreadBytesReceivedCallback(SBCommunication self, ReadThreadBytesReceived callback, \n"
		"    void callback_baton) -> bool\n"
		""},
	 { (char *)"SBCommunication_swigregister", SBCommunication_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBCompileUnit", _wrap_new_SBCompileUnit, METH_VARARGS, (char *)"\n"
		"SBCompileUnit()\n"
		"new_SBCompileUnit(SBCompileUnit rhs) -> SBCompileUnit\n"
		""},
	 { (char *)"delete_SBCompileUnit", _wrap_delete_SBCompileUnit, METH_VARARGS, (char *)"delete_SBCompileUnit(SBCompileUnit self)"},
	 { (char *)"SBCompileUnit_IsValid", _wrap_SBCompileUnit_IsValid, METH_VARARGS, (char *)"SBCompileUnit_IsValid(SBCompileUnit self) -> bool"},
	 { (char *)"SBCompileUnit_GetFileSpec", _wrap_SBCompileUnit_GetFileSpec, METH_VARARGS, (char *)"SBCompileUnit_GetFileSpec(SBCompileUnit self) -> SBFileSpec"},
	 { (char *)"SBCompileUnit_GetNumLineEntries", _wrap_SBCompileUnit_GetNumLineEntries, METH_VARARGS, (char *)"SBCompileUnit_GetNumLineEntries(SBCompileUnit self) -> uint32_t"},
	 { (char *)"SBCompileUnit_GetLineEntryAtIndex", _wrap_SBCompileUnit_GetLineEntryAtIndex, METH_VARARGS, (char *)"SBCompileUnit_GetLineEntryAtIndex(SBCompileUnit self, uint32_t idx) -> SBLineEntry"},
	 { (char *)"SBCompileUnit_FindLineEntryIndex", _wrap_SBCompileUnit_FindLineEntryIndex, METH_VARARGS, (char *)"\n"
		"FindLineEntryIndex(uint32_t start_idx, uint32_t line, SBFileSpec inline_file_spec) -> uint32_t\n"
		"SBCompileUnit_FindLineEntryIndex(SBCompileUnit self, uint32_t start_idx, uint32_t line, \n"
		"    SBFileSpec inline_file_spec, bool exact) -> uint32_t\n"
		""},
	 { (char *)"SBCompileUnit_GetSupportFileAtIndex", _wrap_SBCompileUnit_GetSupportFileAtIndex, METH_VARARGS, (char *)"SBCompileUnit_GetSupportFileAtIndex(SBCompileUnit self, uint32_t idx) -> SBFileSpec"},
	 { (char *)"SBCompileUnit_GetNumSupportFiles", _wrap_SBCompileUnit_GetNumSupportFiles, METH_VARARGS, (char *)"SBCompileUnit_GetNumSupportFiles(SBCompileUnit self) -> uint32_t"},
	 { (char *)"SBCompileUnit_FindSupportFileIndex", _wrap_SBCompileUnit_FindSupportFileIndex, METH_VARARGS, (char *)"\n"
		"SBCompileUnit_FindSupportFileIndex(SBCompileUnit self, uint32_t start_idx, SBFileSpec sb_file, \n"
		"    bool full) -> uint32_t\n"
		""},
	 { (char *)"SBCompileUnit_GetTypes", _wrap_SBCompileUnit_GetTypes, METH_VARARGS, (char *)"\n"
		"GetTypes(uint32_t type_mask = eTypeClassAny) -> SBTypeList\n"
		"SBCompileUnit_GetTypes(SBCompileUnit self) -> SBTypeList\n"
		"\n"
		"//------------------------------------------------------------------\n"
		"/// Get all types matching  type_mask from debug info in this\n"
		"/// compile unit.\n"
		"///\n"
		"/// @param[in] type_mask\n"
		"///    A bitfield that consists of one or more bits logically OR'ed\n"
		"///    together from the lldb::TypeClass enumeration. This allows\n"
		"///    you to request only structure types, or only class, struct\n"
		"///    and union types. Passing in lldb::eTypeClassAny will return\n"
		"///    all types found in the debug information for this compile\n"
		"///    unit.\n"
		"///\n"
		"/// @return\n"
		"///    A list of types in this compile unit that match  type_mask\n"
		"//------------------------------------------------------------------\n"
		"\n"
		""},
	 { (char *)"SBCompileUnit_GetLanguage", _wrap_SBCompileUnit_GetLanguage, METH_VARARGS, (char *)"SBCompileUnit_GetLanguage(SBCompileUnit self) -> LanguageType"},
	 { (char *)"SBCompileUnit_GetDescription", _wrap_SBCompileUnit_GetDescription, METH_VARARGS, (char *)"SBCompileUnit_GetDescription(SBCompileUnit self, SBStream description) -> bool"},
	 { (char *)"SBCompileUnit___eq__", _wrap_SBCompileUnit___eq__, METH_VARARGS, (char *)"SBCompileUnit___eq__(SBCompileUnit self, SBCompileUnit rhs) -> bool"},
	 { (char *)"SBCompileUnit___ne__", _wrap_SBCompileUnit___ne__, METH_VARARGS, (char *)"SBCompileUnit___ne__(SBCompileUnit self, SBCompileUnit rhs) -> bool"},
	 { (char *)"SBCompileUnit___str__", _wrap_SBCompileUnit___str__, METH_VARARGS, (char *)"SBCompileUnit___str__(SBCompileUnit self) -> PyObject"},
	 { (char *)"SBCompileUnit_swigregister", SBCompileUnit_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBData", _wrap_new_SBData, METH_VARARGS, (char *)"\n"
		"SBData()\n"
		"new_SBData(SBData rhs) -> SBData\n"
		""},
	 { (char *)"delete_SBData", _wrap_delete_SBData, METH_VARARGS, (char *)"delete_SBData(SBData self)"},
	 { (char *)"SBData_GetAddressByteSize", _wrap_SBData_GetAddressByteSize, METH_VARARGS, (char *)"SBData_GetAddressByteSize(SBData self) -> uint8_t"},
	 { (char *)"SBData_SetAddressByteSize", _wrap_SBData_SetAddressByteSize, METH_VARARGS, (char *)"SBData_SetAddressByteSize(SBData self, uint8_t addr_byte_size)"},
	 { (char *)"SBData_Clear", _wrap_SBData_Clear, METH_VARARGS, (char *)"SBData_Clear(SBData self)"},
	 { (char *)"SBData_IsValid", _wrap_SBData_IsValid, METH_VARARGS, (char *)"SBData_IsValid(SBData self) -> bool"},
	 { (char *)"SBData_GetByteSize", _wrap_SBData_GetByteSize, METH_VARARGS, (char *)"SBData_GetByteSize(SBData self) -> size_t"},
	 { (char *)"SBData_GetByteOrder", _wrap_SBData_GetByteOrder, METH_VARARGS, (char *)"SBData_GetByteOrder(SBData self) -> ByteOrder"},
	 { (char *)"SBData_SetByteOrder", _wrap_SBData_SetByteOrder, METH_VARARGS, (char *)"SBData_SetByteOrder(SBData self, ByteOrder endian)"},
	 { (char *)"SBData_GetFloat", _wrap_SBData_GetFloat, METH_VARARGS, (char *)"SBData_GetFloat(SBData self, SBError error, offset_t offset) -> float"},
	 { (char *)"SBData_GetDouble", _wrap_SBData_GetDouble, METH_VARARGS, (char *)"SBData_GetDouble(SBData self, SBError error, offset_t offset) -> double"},
	 { (char *)"SBData_GetLongDouble", _wrap_SBData_GetLongDouble, METH_VARARGS, (char *)"SBData_GetLongDouble(SBData self, SBError error, offset_t offset) -> long double"},
	 { (char *)"SBData_GetAddress", _wrap_SBData_GetAddress, METH_VARARGS, (char *)"SBData_GetAddress(SBData self, SBError error, offset_t offset) -> addr_t"},
	 { (char *)"SBData_GetUnsignedInt8", _wrap_SBData_GetUnsignedInt8, METH_VARARGS, (char *)"SBData_GetUnsignedInt8(SBData self, SBError error, offset_t offset) -> uint8_t"},
	 { (char *)"SBData_GetUnsignedInt16", _wrap_SBData_GetUnsignedInt16, METH_VARARGS, (char *)"SBData_GetUnsignedInt16(SBData self, SBError error, offset_t offset) -> uint16_t"},
	 { (char *)"SBData_GetUnsignedInt32", _wrap_SBData_GetUnsignedInt32, METH_VARARGS, (char *)"SBData_GetUnsignedInt32(SBData self, SBError error, offset_t offset) -> uint32_t"},
	 { (char *)"SBData_GetUnsignedInt64", _wrap_SBData_GetUnsignedInt64, METH_VARARGS, (char *)"SBData_GetUnsignedInt64(SBData self, SBError error, offset_t offset) -> uint64_t"},
	 { (char *)"SBData_GetSignedInt8", _wrap_SBData_GetSignedInt8, METH_VARARGS, (char *)"SBData_GetSignedInt8(SBData self, SBError error, offset_t offset) -> int8_t"},
	 { (char *)"SBData_GetSignedInt16", _wrap_SBData_GetSignedInt16, METH_VARARGS, (char *)"SBData_GetSignedInt16(SBData self, SBError error, offset_t offset) -> int16_t"},
	 { (char *)"SBData_GetSignedInt32", _wrap_SBData_GetSignedInt32, METH_VARARGS, (char *)"SBData_GetSignedInt32(SBData self, SBError error, offset_t offset) -> int32_t"},
	 { (char *)"SBData_GetSignedInt64", _wrap_SBData_GetSignedInt64, METH_VARARGS, (char *)"SBData_GetSignedInt64(SBData self, SBError error, offset_t offset) -> int64_t"},
	 { (char *)"SBData_GetString", _wrap_SBData_GetString, METH_VARARGS, (char *)"SBData_GetString(SBData self, SBError error, offset_t offset) -> char"},
	 { (char *)"SBData_GetDescription", _wrap_SBData_GetDescription, METH_VARARGS, (char *)"SBData_GetDescription(SBData self, SBStream description, addr_t base_addr) -> bool"},
	 { (char *)"SBData_ReadRawData", _wrap_SBData_ReadRawData, METH_VARARGS, (char *)"SBData_ReadRawData(SBData self, SBError error, offset_t offset, void buf) -> size_t"},
	 { (char *)"SBData_SetData", _wrap_SBData_SetData, METH_VARARGS, (char *)"\n"
		"SBData_SetData(SBData self, SBError error, void buf, ByteOrder endian, \n"
		"    uint8_t addr_size)\n"
		""},
	 { (char *)"SBData_Append", _wrap_SBData_Append, METH_VARARGS, (char *)"SBData_Append(SBData self, SBData rhs) -> bool"},
	 { (char *)"SBData_CreateDataFromCString", _wrap_SBData_CreateDataFromCString, METH_VARARGS, (char *)"SBData_CreateDataFromCString(ByteOrder endian, uint32_t addr_byte_size, char data) -> SBData"},
	 { (char *)"SBData_CreateDataFromUInt64Array", _wrap_SBData_CreateDataFromUInt64Array, METH_VARARGS, (char *)"SBData_CreateDataFromUInt64Array(ByteOrder endian, uint32_t addr_byte_size, uint64_t array) -> SBData"},
	 { (char *)"SBData_CreateDataFromUInt32Array", _wrap_SBData_CreateDataFromUInt32Array, METH_VARARGS, (char *)"SBData_CreateDataFromUInt32Array(ByteOrder endian, uint32_t addr_byte_size, uint32_t array) -> SBData"},
	 { (char *)"SBData_CreateDataFromSInt64Array", _wrap_SBData_CreateDataFromSInt64Array, METH_VARARGS, (char *)"SBData_CreateDataFromSInt64Array(ByteOrder endian, uint32_t addr_byte_size, int64_t array) -> SBData"},
	 { (char *)"SBData_CreateDataFromSInt32Array", _wrap_SBData_CreateDataFromSInt32Array, METH_VARARGS, (char *)"SBData_CreateDataFromSInt32Array(ByteOrder endian, uint32_t addr_byte_size, int32_t array) -> SBData"},
	 { (char *)"SBData_CreateDataFromDoubleArray", _wrap_SBData_CreateDataFromDoubleArray, METH_VARARGS, (char *)"SBData_CreateDataFromDoubleArray(ByteOrder endian, uint32_t addr_byte_size, double array) -> SBData"},
	 { (char *)"SBData_SetDataFromCString", _wrap_SBData_SetDataFromCString, METH_VARARGS, (char *)"SBData_SetDataFromCString(SBData self, char data) -> bool"},
	 { (char *)"SBData_SetDataFromUInt64Array", _wrap_SBData_SetDataFromUInt64Array, METH_VARARGS, (char *)"SBData_SetDataFromUInt64Array(SBData self, uint64_t array) -> bool"},
	 { (char *)"SBData_SetDataFromUInt32Array", _wrap_SBData_SetDataFromUInt32Array, METH_VARARGS, (char *)"SBData_SetDataFromUInt32Array(SBData self, uint32_t array) -> bool"},
	 { (char *)"SBData_SetDataFromSInt64Array", _wrap_SBData_SetDataFromSInt64Array, METH_VARARGS, (char *)"SBData_SetDataFromSInt64Array(SBData self, int64_t array) -> bool"},
	 { (char *)"SBData_SetDataFromSInt32Array", _wrap_SBData_SetDataFromSInt32Array, METH_VARARGS, (char *)"SBData_SetDataFromSInt32Array(SBData self, int32_t array) -> bool"},
	 { (char *)"SBData_SetDataFromDoubleArray", _wrap_SBData_SetDataFromDoubleArray, METH_VARARGS, (char *)"SBData_SetDataFromDoubleArray(SBData self, double array) -> bool"},
	 { (char *)"SBData___str__", _wrap_SBData___str__, METH_VARARGS, (char *)"SBData___str__(SBData self) -> PyObject"},
	 { (char *)"SBData_swigregister", SBData_swigregister, METH_VARARGS, NULL},
	 { (char *)"SBDebugger_Initialize", _wrap_SBDebugger_Initialize, METH_VARARGS, (char *)"SBDebugger_Initialize()"},
	 { (char *)"SBDebugger_Terminate", _wrap_SBDebugger_Terminate, METH_VARARGS, (char *)"SBDebugger_Terminate()"},
	 { (char *)"SBDebugger_Create", _wrap_SBDebugger_Create, METH_VARARGS, (char *)"\n"
		"Create() -> SBDebugger\n"
		"Create(bool source_init_files) -> SBDebugger\n"
		"SBDebugger_Create(bool source_init_files, LogOutputCallback log_callback) -> SBDebugger\n"
		""},
	 { (char *)"SBDebugger_Destroy", _wrap_SBDebugger_Destroy, METH_VARARGS, (char *)"SBDebugger_Destroy(SBDebugger debugger)"},
	 { (char *)"SBDebugger_MemoryPressureDetected", _wrap_SBDebugger_MemoryPressureDetected, METH_VARARGS, (char *)"SBDebugger_MemoryPressureDetected()"},
	 { (char *)"new_SBDebugger", _wrap_new_SBDebugger, METH_VARARGS, (char *)"\n"
		"SBDebugger()\n"
		"new_SBDebugger(SBDebugger rhs) -> SBDebugger\n"
		""},
	 { (char *)"delete_SBDebugger", _wrap_delete_SBDebugger, METH_VARARGS, (char *)"delete_SBDebugger(SBDebugger self)"},
	 { (char *)"SBDebugger_IsValid", _wrap_SBDebugger_IsValid, METH_VARARGS, (char *)"SBDebugger_IsValid(SBDebugger self) -> bool"},
	 { (char *)"SBDebugger_Clear", _wrap_SBDebugger_Clear, METH_VARARGS, (char *)"SBDebugger_Clear(SBDebugger self)"},
	 { (char *)"SBDebugger_SetAsync", _wrap_SBDebugger_SetAsync, METH_VARARGS, (char *)"SBDebugger_SetAsync(SBDebugger self, bool b)"},
	 { (char *)"SBDebugger_GetAsync", _wrap_SBDebugger_GetAsync, METH_VARARGS, (char *)"SBDebugger_GetAsync(SBDebugger self) -> bool"},
	 { (char *)"SBDebugger_SkipLLDBInitFiles", _wrap_SBDebugger_SkipLLDBInitFiles, METH_VARARGS, (char *)"SBDebugger_SkipLLDBInitFiles(SBDebugger self, bool b)"},
	 { (char *)"SBDebugger_SetInputFileHandle", _wrap_SBDebugger_SetInputFileHandle, METH_VARARGS, (char *)"SBDebugger_SetInputFileHandle(SBDebugger self, FILE f, bool transfer_ownership)"},
	 { (char *)"SBDebugger_SetOutputFileHandle", _wrap_SBDebugger_SetOutputFileHandle, METH_VARARGS, (char *)"SBDebugger_SetOutputFileHandle(SBDebugger self, FILE f, bool transfer_ownership)"},
	 { (char *)"SBDebugger_SetErrorFileHandle", _wrap_SBDebugger_SetErrorFileHandle, METH_VARARGS, (char *)"SBDebugger_SetErrorFileHandle(SBDebugger self, FILE f, bool transfer_ownership)"},
	 { (char *)"SBDebugger_GetInputFileHandle", _wrap_SBDebugger_GetInputFileHandle, METH_VARARGS, (char *)"SBDebugger_GetInputFileHandle(SBDebugger self) -> FILE"},
	 { (char *)"SBDebugger_GetOutputFileHandle", _wrap_SBDebugger_GetOutputFileHandle, METH_VARARGS, (char *)"SBDebugger_GetOutputFileHandle(SBDebugger self) -> FILE"},
	 { (char *)"SBDebugger_GetErrorFileHandle", _wrap_SBDebugger_GetErrorFileHandle, METH_VARARGS, (char *)"SBDebugger_GetErrorFileHandle(SBDebugger self) -> FILE"},
	 { (char *)"SBDebugger_GetCommandInterpreter", _wrap_SBDebugger_GetCommandInterpreter, METH_VARARGS, (char *)"SBDebugger_GetCommandInterpreter(SBDebugger self) -> SBCommandInterpreter"},
	 { (char *)"SBDebugger_HandleCommand", _wrap_SBDebugger_HandleCommand, METH_VARARGS, (char *)"SBDebugger_HandleCommand(SBDebugger self, char command)"},
	 { (char *)"SBDebugger_GetListener", _wrap_SBDebugger_GetListener, METH_VARARGS, (char *)"SBDebugger_GetListener(SBDebugger self) -> SBListener"},
	 { (char *)"SBDebugger_HandleProcessEvent", _wrap_SBDebugger_HandleProcessEvent, METH_VARARGS, (char *)"\n"
		"SBDebugger_HandleProcessEvent(SBDebugger self, SBProcess process, SBEvent event, \n"
		"    FILE out, FILE err)\n"
		""},
	 { (char *)"SBDebugger_CreateTargetWithFileAndTargetTriple", _wrap_SBDebugger_CreateTargetWithFileAndTargetTriple, METH_VARARGS, (char *)"SBDebugger_CreateTargetWithFileAndTargetTriple(SBDebugger self, char filename, char target_triple) -> SBTarget"},
	 { (char *)"SBDebugger_CreateTargetWithFileAndArch", _wrap_SBDebugger_CreateTargetWithFileAndArch, METH_VARARGS, (char *)"SBDebugger_CreateTargetWithFileAndArch(SBDebugger self, char filename, char archname) -> SBTarget"},
	 { (char *)"SBDebugger_CreateTarget", _wrap_SBDebugger_CreateTarget, METH_VARARGS, (char *)"\n"
		"CreateTarget(char filename, char target_triple, char platform_name, \n"
		"    bool add_dependent_modules, SBError sb_error) -> SBTarget\n"
		"SBDebugger_CreateTarget(SBDebugger self, char filename) -> SBTarget\n"
		""},
	 { (char *)"SBDebugger_GetDummyTarget", _wrap_SBDebugger_GetDummyTarget, METH_VARARGS, (char *)"\n"
		"SBDebugger_GetDummyTarget(SBDebugger self) -> SBTarget\n"
		"\n"
		"The dummy target holds breakpoints and breakpoint names that will prime newly created targets.\n"
		""},
	 { (char *)"SBDebugger_DeleteTarget", _wrap_SBDebugger_DeleteTarget, METH_VARARGS, (char *)"\n"
		"SBDebugger_DeleteTarget(SBDebugger self, SBTarget target) -> bool\n"
		"\n"
		"Return true if target is deleted from the target list of the debugger.\n"
		""},
	 { (char *)"SBDebugger_GetTargetAtIndex", _wrap_SBDebugger_GetTargetAtIndex, METH_VARARGS, (char *)"SBDebugger_GetTargetAtIndex(SBDebugger self, uint32_t idx) -> SBTarget"},
	 { (char *)"SBDebugger_GetIndexOfTarget", _wrap_SBDebugger_GetIndexOfTarget, METH_VARARGS, (char *)"SBDebugger_GetIndexOfTarget(SBDebugger self, SBTarget target) -> uint32_t"},
	 { (char *)"SBDebugger_FindTargetWithProcessID", _wrap_SBDebugger_FindTargetWithProcessID, METH_VARARGS, (char *)"SBDebugger_FindTargetWithProcessID(SBDebugger self, pid_t pid) -> SBTarget"},
	 { (char *)"SBDebugger_FindTargetWithFileAndArch", _wrap_SBDebugger_FindTargetWithFileAndArch, METH_VARARGS, (char *)"SBDebugger_FindTargetWithFileAndArch(SBDebugger self, char filename, char arch) -> SBTarget"},
	 { (char *)"SBDebugger_GetNumTargets", _wrap_SBDebugger_GetNumTargets, METH_VARARGS, (char *)"SBDebugger_GetNumTargets(SBDebugger self) -> uint32_t"},
	 { (char *)"SBDebugger_GetSelectedTarget", _wrap_SBDebugger_GetSelectedTarget, METH_VARARGS, (char *)"SBDebugger_GetSelectedTarget(SBDebugger self) -> SBTarget"},
	 { (char *)"SBDebugger_SetSelectedTarget", _wrap_SBDebugger_SetSelectedTarget, METH_VARARGS, (char *)"SBDebugger_SetSelectedTarget(SBDebugger self, SBTarget target)"},
	 { (char *)"SBDebugger_GetSelectedPlatform", _wrap_SBDebugger_GetSelectedPlatform, METH_VARARGS, (char *)"SBDebugger_GetSelectedPlatform(SBDebugger self) -> SBPlatform"},
	 { (char *)"SBDebugger_SetSelectedPlatform", _wrap_SBDebugger_SetSelectedPlatform, METH_VARARGS, (char *)"SBDebugger_SetSelectedPlatform(SBDebugger self, SBPlatform platform)"},
	 { (char *)"SBDebugger_GetNumPlatforms", _wrap_SBDebugger_GetNumPlatforms, METH_VARARGS, (char *)"\n"
		"SBDebugger_GetNumPlatforms(SBDebugger self) -> uint32_t\n"
		"\n"
		"Get the number of currently active platforms.\n"
		""},
	 { (char *)"SBDebugger_GetPlatformAtIndex", _wrap_SBDebugger_GetPlatformAtIndex, METH_VARARGS, (char *)"\n"
		"SBDebugger_GetPlatformAtIndex(SBDebugger self, uint32_t idx) -> SBPlatform\n"
		"\n"
		"Get one of the currently active platforms.\n"
		""},
	 { (char *)"SBDebugger_GetNumAvailablePlatforms", _wrap_SBDebugger_GetNumAvailablePlatforms, METH_VARARGS, (char *)"\n"
		"SBDebugger_GetNumAvailablePlatforms(SBDebugger self) -> uint32_t\n"
		"\n"
		"Get the number of available platforms.\n"
		""},
	 { (char *)"SBDebugger_GetAvailablePlatformInfoAtIndex", _wrap_SBDebugger_GetAvailablePlatformInfoAtIndex, METH_VARARGS, (char *)"\n"
		"SBDebugger_GetAvailablePlatformInfoAtIndex(SBDebugger self, uint32_t idx) -> SBStructuredData\n"
		"\n"
		"Get the name and description of one of the available platforms.\n"
		"\n"
		"@param idx Zero-based index of the platform for which info should be\n"
		"           retrieved, must be less than the value returned by\n"
		"           GetNumAvailablePlatforms().\n"
		"\n"
		""},
	 { (char *)"SBDebugger_GetSourceManager", _wrap_SBDebugger_GetSourceManager, METH_VARARGS, (char *)"SBDebugger_GetSourceManager(SBDebugger self) -> SBSourceManager"},
	 { (char *)"SBDebugger_SetCurrentPlatform", _wrap_SBDebugger_SetCurrentPlatform, METH_VARARGS, (char *)"SBDebugger_SetCurrentPlatform(SBDebugger self, char platform_name) -> SBError"},
	 { (char *)"SBDebugger_SetCurrentPlatformSDKRoot", _wrap_SBDebugger_SetCurrentPlatformSDKRoot, METH_VARARGS, (char *)"SBDebugger_SetCurrentPlatformSDKRoot(SBDebugger self, char sysroot) -> bool"},
	 { (char *)"SBDebugger_SetUseExternalEditor", _wrap_SBDebugger_SetUseExternalEditor, METH_VARARGS, (char *)"SBDebugger_SetUseExternalEditor(SBDebugger self, bool input) -> bool"},
	 { (char *)"SBDebugger_GetUseExternalEditor", _wrap_SBDebugger_GetUseExternalEditor, METH_VARARGS, (char *)"SBDebugger_GetUseExternalEditor(SBDebugger self) -> bool"},
	 { (char *)"SBDebugger_SetUseColor", _wrap_SBDebugger_SetUseColor, METH_VARARGS, (char *)"SBDebugger_SetUseColor(SBDebugger self, bool use_color) -> bool"},
	 { (char *)"SBDebugger_GetUseColor", _wrap_SBDebugger_GetUseColor, METH_VARARGS, (char *)"SBDebugger_GetUseColor(SBDebugger self) -> bool"},
	 { (char *)"SBDebugger_GetDefaultArchitecture", _wrap_SBDebugger_GetDefaultArchitecture, METH_VARARGS, (char *)"SBDebugger_GetDefaultArchitecture(char arch_name, size_t arch_name_len) -> bool"},
	 { (char *)"SBDebugger_SetDefaultArchitecture", _wrap_SBDebugger_SetDefaultArchitecture, METH_VARARGS, (char *)"SBDebugger_SetDefaultArchitecture(char arch_name) -> bool"},
	 { (char *)"SBDebugger_GetScriptingLanguage", _wrap_SBDebugger_GetScriptingLanguage, METH_VARARGS, (char *)"SBDebugger_GetScriptingLanguage(SBDebugger self, char script_language_name) -> ScriptLanguage"},
	 { (char *)"SBDebugger_GetVersionString", _wrap_SBDebugger_GetVersionString, METH_VARARGS, (char *)"SBDebugger_GetVersionString() -> char"},
	 { (char *)"SBDebugger_StateAsCString", _wrap_SBDebugger_StateAsCString, METH_VARARGS, (char *)"SBDebugger_StateAsCString(StateType state) -> char"},
	 { (char *)"SBDebugger_StateIsRunningState", _wrap_SBDebugger_StateIsRunningState, METH_VARARGS, (char *)"SBDebugger_StateIsRunningState(StateType state) -> bool"},
	 { (char *)"SBDebugger_StateIsStoppedState", _wrap_SBDebugger_StateIsStoppedState, METH_VARARGS, (char *)"SBDebugger_StateIsStoppedState(StateType state) -> bool"},
	 { (char *)"SBDebugger_EnableLog", _wrap_SBDebugger_EnableLog, METH_VARARGS, (char *)"SBDebugger_EnableLog(SBDebugger self, char channel, char types) -> bool"},
	 { (char *)"SBDebugger_SetLoggingCallback", _wrap_SBDebugger_SetLoggingCallback, METH_VARARGS, (char *)"SBDebugger_SetLoggingCallback(SBDebugger self, LogOutputCallback log_callback)"},
	 { (char *)"SBDebugger_DispatchInput", _wrap_SBDebugger_DispatchInput, METH_VARARGS, (char *)"SBDebugger_DispatchInput(SBDebugger self, void data)"},
	 { (char *)"SBDebugger_DispatchInputInterrupt", _wrap_SBDebugger_DispatchInputInterrupt, METH_VARARGS, (char *)"SBDebugger_DispatchInputInterrupt(SBDebugger self)"},
	 { (char *)"SBDebugger_DispatchInputEndOfFile", _wrap_SBDebugger_DispatchInputEndOfFile, METH_VARARGS, (char *)"SBDebugger_DispatchInputEndOfFile(SBDebugger self)"},
	 { (char *)"SBDebugger_GetInstanceName", _wrap_SBDebugger_GetInstanceName, METH_VARARGS, (char *)"SBDebugger_GetInstanceName(SBDebugger self) -> char"},
	 { (char *)"SBDebugger_FindDebuggerWithID", _wrap_SBDebugger_FindDebuggerWithID, METH_VARARGS, (char *)"SBDebugger_FindDebuggerWithID(int id) -> SBDebugger"},
	 { (char *)"SBDebugger_SetInternalVariable", _wrap_SBDebugger_SetInternalVariable, METH_VARARGS, (char *)"SBDebugger_SetInternalVariable(char var_name, char value, char debugger_instance_name) -> SBError"},
	 { (char *)"SBDebugger_GetInternalVariableValue", _wrap_SBDebugger_GetInternalVariableValue, METH_VARARGS, (char *)"SBDebugger_GetInternalVariableValue(char var_name, char debugger_instance_name) -> SBStringList"},
	 { (char *)"SBDebugger_GetDescription", _wrap_SBDebugger_GetDescription, METH_VARARGS, (char *)"SBDebugger_GetDescription(SBDebugger self, SBStream description) -> bool"},
	 { (char *)"SBDebugger_GetTerminalWidth", _wrap_SBDebugger_GetTerminalWidth, METH_VARARGS, (char *)"SBDebugger_GetTerminalWidth(SBDebugger self) -> uint32_t"},
	 { (char *)"SBDebugger_SetTerminalWidth", _wrap_SBDebugger_SetTerminalWidth, METH_VARARGS, (char *)"SBDebugger_SetTerminalWidth(SBDebugger self, uint32_t term_width)"},
	 { (char *)"SBDebugger_GetID", _wrap_SBDebugger_GetID, METH_VARARGS, (char *)"SBDebugger_GetID(SBDebugger self) -> user_id_t"},
	 { (char *)"SBDebugger_GetPrompt", _wrap_SBDebugger_GetPrompt, METH_VARARGS, (char *)"SBDebugger_GetPrompt(SBDebugger self) -> char"},
	 { (char *)"SBDebugger_SetPrompt", _wrap_SBDebugger_SetPrompt, METH_VARARGS, (char *)"SBDebugger_SetPrompt(SBDebugger self, char prompt)"},
	 { (char *)"SBDebugger_GetScriptLanguage", _wrap_SBDebugger_GetScriptLanguage, METH_VARARGS, (char *)"SBDebugger_GetScriptLanguage(SBDebugger self) -> ScriptLanguage"},
	 { (char *)"SBDebugger_SetScriptLanguage", _wrap_SBDebugger_SetScriptLanguage, METH_VARARGS, (char *)"SBDebugger_SetScriptLanguage(SBDebugger self, ScriptLanguage script_lang)"},
	 { (char *)"SBDebugger_GetCloseInputOnEOF", _wrap_SBDebugger_GetCloseInputOnEOF, METH_VARARGS, (char *)"SBDebugger_GetCloseInputOnEOF(SBDebugger self) -> bool"},
	 { (char *)"SBDebugger_SetCloseInputOnEOF", _wrap_SBDebugger_SetCloseInputOnEOF, METH_VARARGS, (char *)"SBDebugger_SetCloseInputOnEOF(SBDebugger self, bool b)"},
	 { (char *)"SBDebugger_GetCategory", _wrap_SBDebugger_GetCategory, METH_VARARGS, (char *)"\n"
		"GetCategory(char category_name) -> SBTypeCategory\n"
		"SBDebugger_GetCategory(SBDebugger self, LanguageType lang_type) -> SBTypeCategory\n"
		""},
	 { (char *)"SBDebugger_CreateCategory", _wrap_SBDebugger_CreateCategory, METH_VARARGS, (char *)"SBDebugger_CreateCategory(SBDebugger self, char category_name) -> SBTypeCategory"},
	 { (char *)"SBDebugger_DeleteCategory", _wrap_SBDebugger_DeleteCategory, METH_VARARGS, (char *)"SBDebugger_DeleteCategory(SBDebugger self, char category_name) -> bool"},
	 { (char *)"SBDebugger_GetNumCategories", _wrap_SBDebugger_GetNumCategories, METH_VARARGS, (char *)"SBDebugger_GetNumCategories(SBDebugger self) -> uint32_t"},
	 { (char *)"SBDebugger_GetCategoryAtIndex", _wrap_SBDebugger_GetCategoryAtIndex, METH_VARARGS, (char *)"SBDebugger_GetCategoryAtIndex(SBDebugger self, uint32_t arg1) -> SBTypeCategory"},
	 { (char *)"SBDebugger_GetDefaultCategory", _wrap_SBDebugger_GetDefaultCategory, METH_VARARGS, (char *)"SBDebugger_GetDefaultCategory(SBDebugger self) -> SBTypeCategory"},
	 { (char *)"SBDebugger_GetFormatForType", _wrap_SBDebugger_GetFormatForType, METH_VARARGS, (char *)"SBDebugger_GetFormatForType(SBDebugger self, SBTypeNameSpecifier arg1) -> SBTypeFormat"},
	 { (char *)"SBDebugger_GetSummaryForType", _wrap_SBDebugger_GetSummaryForType, METH_VARARGS, (char *)"SBDebugger_GetSummaryForType(SBDebugger self, SBTypeNameSpecifier arg1) -> SBTypeSummary"},
	 { (char *)"SBDebugger_GetFilterForType", _wrap_SBDebugger_GetFilterForType, METH_VARARGS, (char *)"SBDebugger_GetFilterForType(SBDebugger self, SBTypeNameSpecifier arg1) -> SBTypeFilter"},
	 { (char *)"SBDebugger_GetSyntheticForType", _wrap_SBDebugger_GetSyntheticForType, METH_VARARGS, (char *)"SBDebugger_GetSyntheticForType(SBDebugger self, SBTypeNameSpecifier arg1) -> SBTypeSynthetic"},
	 { (char *)"SBDebugger_RunCommandInterpreter", _wrap_SBDebugger_RunCommandInterpreter, METH_VARARGS, (char *)"\n"
		"SBDebugger_RunCommandInterpreter(SBDebugger self, bool auto_handle_events, bool spawn_thread, \n"
		"    SBCommandInterpreterRunOptions options, \n"
		"    int num_errors, bool quit_requested, bool stopped_for_crash)\n"
		""},
	 { (char *)"SBDebugger_RunREPL", _wrap_SBDebugger_RunREPL, METH_VARARGS, (char *)"SBDebugger_RunREPL(SBDebugger self, LanguageType language, char repl_options) -> SBError"},
	 { (char *)"SBDebugger___str__", _wrap_SBDebugger___str__, METH_VARARGS, (char *)"SBDebugger___str__(SBDebugger self) -> PyObject"},
	 { (char *)"SBDebugger_swigregister", SBDebugger_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBDeclaration", _wrap_new_SBDeclaration, METH_VARARGS, (char *)"\n"
		"SBDeclaration()\n"
		"new_SBDeclaration(SBDeclaration rhs) -> SBDeclaration\n"
		""},
	 { (char *)"delete_SBDeclaration", _wrap_delete_SBDeclaration, METH_VARARGS, (char *)"delete_SBDeclaration(SBDeclaration self)"},
	 { (char *)"SBDeclaration_IsValid", _wrap_SBDeclaration_IsValid, METH_VARARGS, (char *)"SBDeclaration_IsValid(SBDeclaration self) -> bool"},
	 { (char *)"SBDeclaration_GetFileSpec", _wrap_SBDeclaration_GetFileSpec, METH_VARARGS, (char *)"SBDeclaration_GetFileSpec(SBDeclaration self) -> SBFileSpec"},
	 { (char *)"SBDeclaration_GetLine", _wrap_SBDeclaration_GetLine, METH_VARARGS, (char *)"SBDeclaration_GetLine(SBDeclaration self) -> uint32_t"},
	 { (char *)"SBDeclaration_GetColumn", _wrap_SBDeclaration_GetColumn, METH_VARARGS, (char *)"SBDeclaration_GetColumn(SBDeclaration self) -> uint32_t"},
	 { (char *)"SBDeclaration_GetDescription", _wrap_SBDeclaration_GetDescription, METH_VARARGS, (char *)"SBDeclaration_GetDescription(SBDeclaration self, SBStream description) -> bool"},
	 { (char *)"SBDeclaration_SetFileSpec", _wrap_SBDeclaration_SetFileSpec, METH_VARARGS, (char *)"SBDeclaration_SetFileSpec(SBDeclaration self, SBFileSpec filespec)"},
	 { (char *)"SBDeclaration_SetLine", _wrap_SBDeclaration_SetLine, METH_VARARGS, (char *)"SBDeclaration_SetLine(SBDeclaration self, uint32_t line)"},
	 { (char *)"SBDeclaration_SetColumn", _wrap_SBDeclaration_SetColumn, METH_VARARGS, (char *)"SBDeclaration_SetColumn(SBDeclaration self, uint32_t column)"},
	 { (char *)"SBDeclaration___eq__", _wrap_SBDeclaration___eq__, METH_VARARGS, (char *)"SBDeclaration___eq__(SBDeclaration self, SBDeclaration rhs) -> bool"},
	 { (char *)"SBDeclaration___ne__", _wrap_SBDeclaration___ne__, METH_VARARGS, (char *)"SBDeclaration___ne__(SBDeclaration self, SBDeclaration rhs) -> bool"},
	 { (char *)"SBDeclaration___str__", _wrap_SBDeclaration___str__, METH_VARARGS, (char *)"SBDeclaration___str__(SBDeclaration self) -> PyObject"},
	 { (char *)"SBDeclaration_swigregister", SBDeclaration_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBError", _wrap_new_SBError, METH_VARARGS, (char *)"\n"
		"SBError()\n"
		"new_SBError(SBError rhs) -> SBError\n"
		""},
	 { (char *)"delete_SBError", _wrap_delete_SBError, METH_VARARGS, (char *)"delete_SBError(SBError self)"},
	 { (char *)"SBError_GetCString", _wrap_SBError_GetCString, METH_VARARGS, (char *)"SBError_GetCString(SBError self) -> char"},
	 { (char *)"SBError_Clear", _wrap_SBError_Clear, METH_VARARGS, (char *)"SBError_Clear(SBError self)"},
	 { (char *)"SBError_Fail", _wrap_SBError_Fail, METH_VARARGS, (char *)"SBError_Fail(SBError self) -> bool"},
	 { (char *)"SBError_Success", _wrap_SBError_Success, METH_VARARGS, (char *)"SBError_Success(SBError self) -> bool"},
	 { (char *)"SBError_GetError", _wrap_SBError_GetError, METH_VARARGS, (char *)"SBError_GetError(SBError self) -> uint32_t"},
	 { (char *)"SBError_GetType", _wrap_SBError_GetType, METH_VARARGS, (char *)"SBError_GetType(SBError self) -> ErrorType"},
	 { (char *)"SBError_SetError", _wrap_SBError_SetError, METH_VARARGS, (char *)"SBError_SetError(SBError self, uint32_t err, ErrorType type)"},
	 { (char *)"SBError_SetErrorToErrno", _wrap_SBError_SetErrorToErrno, METH_VARARGS, (char *)"SBError_SetErrorToErrno(SBError self)"},
	 { (char *)"SBError_SetErrorToGenericError", _wrap_SBError_SetErrorToGenericError, METH_VARARGS, (char *)"SBError_SetErrorToGenericError(SBError self)"},
	 { (char *)"SBError_SetErrorString", _wrap_SBError_SetErrorString, METH_VARARGS, (char *)"SBError_SetErrorString(SBError self, char err_str)"},
	 { (char *)"SBError_SetErrorStringWithFormat", _wrap_SBError_SetErrorStringWithFormat, METH_VARARGS, (char *)"\n"
		"SetErrorStringWithFormat(char format, char arg1 = None, char arg2 = None, char str = None, \n"
		"    char VARARGS_SENTINEL = None) -> int\n"
		"SetErrorStringWithFormat(char format, char arg1 = None, char arg2 = None, char str = None) -> int\n"
		"SetErrorStringWithFormat(char format, char arg1 = None, char str = None) -> int\n"
		"SetErrorStringWithFormat(char format, char str = None) -> int\n"
		"SBError_SetErrorStringWithFormat(SBError self, char format) -> int\n"
		""},
	 { (char *)"SBError_IsValid", _wrap_SBError_IsValid, METH_VARARGS, (char *)"SBError_IsValid(SBError self) -> bool"},
	 { (char *)"SBError_GetDescription", _wrap_SBError_GetDescription, METH_VARARGS, (char *)"SBError_GetDescription(SBError self, SBStream description) -> bool"},
	 { (char *)"SBError___str__", _wrap_SBError___str__, METH_VARARGS, (char *)"SBError___str__(SBError self) -> PyObject"},
	 { (char *)"SBError_swigregister", SBError_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBEvent", _wrap_new_SBEvent, METH_VARARGS, (char *)"\n"
		"SBEvent()\n"
		"SBEvent(SBEvent rhs)\n"
		"__init__(self, int type, str data) -> SBEvent (make an event that contains a C string)\n"
		""},
	 { (char *)"delete_SBEvent", _wrap_delete_SBEvent, METH_VARARGS, (char *)"delete_SBEvent(SBEvent self)"},
	 { (char *)"SBEvent_IsValid", _wrap_SBEvent_IsValid, METH_VARARGS, (char *)"SBEvent_IsValid(SBEvent self) -> bool"},
	 { (char *)"SBEvent_GetDataFlavor", _wrap_SBEvent_GetDataFlavor, METH_VARARGS, (char *)"SBEvent_GetDataFlavor(SBEvent self) -> char"},
	 { (char *)"SBEvent_GetType", _wrap_SBEvent_GetType, METH_VARARGS, (char *)"SBEvent_GetType(SBEvent self) -> uint32_t"},
	 { (char *)"SBEvent_GetBroadcaster", _wrap_SBEvent_GetBroadcaster, METH_VARARGS, (char *)"SBEvent_GetBroadcaster(SBEvent self) -> SBBroadcaster"},
	 { (char *)"SBEvent_GetBroadcasterClass", _wrap_SBEvent_GetBroadcasterClass, METH_VARARGS, (char *)"SBEvent_GetBroadcasterClass(SBEvent self) -> char"},
	 { (char *)"SBEvent_BroadcasterMatchesRef", _wrap_SBEvent_BroadcasterMatchesRef, METH_VARARGS, (char *)"SBEvent_BroadcasterMatchesRef(SBEvent self, SBBroadcaster broadcaster) -> bool"},
	 { (char *)"SBEvent_Clear", _wrap_SBEvent_Clear, METH_VARARGS, (char *)"SBEvent_Clear(SBEvent self)"},
	 { (char *)"SBEvent_GetCStringFromEvent", _wrap_SBEvent_GetCStringFromEvent, METH_VARARGS, (char *)"SBEvent_GetCStringFromEvent(SBEvent event) -> char"},
	 { (char *)"SBEvent_GetDescription", _wrap_SBEvent_GetDescription, METH_VARARGS, (char *)"SBEvent_GetDescription(SBEvent self, SBStream description) -> bool"},
	 { (char *)"SBEvent_swigregister", SBEvent_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBExecutionContext", _wrap_new_SBExecutionContext, METH_VARARGS, (char *)"\n"
		"SBExecutionContext()\n"
		"SBExecutionContext(SBExecutionContext rhs)\n"
		"SBExecutionContext(SBTarget target)\n"
		"SBExecutionContext(SBProcess process)\n"
		"SBExecutionContext(SBThread thread)\n"
		"new_SBExecutionContext(SBFrame frame) -> SBExecutionContext\n"
		""},
	 { (char *)"delete_SBExecutionContext", _wrap_delete_SBExecutionContext, METH_VARARGS, (char *)"delete_SBExecutionContext(SBExecutionContext self)"},
	 { (char *)"SBExecutionContext_GetTarget", _wrap_SBExecutionContext_GetTarget, METH_VARARGS, (char *)"SBExecutionContext_GetTarget(SBExecutionContext self) -> SBTarget"},
	 { (char *)"SBExecutionContext_GetProcess", _wrap_SBExecutionContext_GetProcess, METH_VARARGS, (char *)"SBExecutionContext_GetProcess(SBExecutionContext self) -> SBProcess"},
	 { (char *)"SBExecutionContext_GetThread", _wrap_SBExecutionContext_GetThread, METH_VARARGS, (char *)"SBExecutionContext_GetThread(SBExecutionContext self) -> SBThread"},
	 { (char *)"SBExecutionContext_GetFrame", _wrap_SBExecutionContext_GetFrame, METH_VARARGS, (char *)"SBExecutionContext_GetFrame(SBExecutionContext self) -> SBFrame"},
	 { (char *)"SBExecutionContext_swigregister", SBExecutionContext_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBExpressionOptions", _wrap_new_SBExpressionOptions, METH_VARARGS, (char *)"\n"
		"SBExpressionOptions()\n"
		"new_SBExpressionOptions(SBExpressionOptions rhs) -> SBExpressionOptions\n"
		""},
	 { (char *)"delete_SBExpressionOptions", _wrap_delete_SBExpressionOptions, METH_VARARGS, (char *)"delete_SBExpressionOptions(SBExpressionOptions self)"},
	 { (char *)"SBExpressionOptions_GetCoerceResultToId", _wrap_SBExpressionOptions_GetCoerceResultToId, METH_VARARGS, (char *)"SBExpressionOptions_GetCoerceResultToId(SBExpressionOptions self) -> bool"},
	 { (char *)"SBExpressionOptions_SetCoerceResultToId", _wrap_SBExpressionOptions_SetCoerceResultToId, METH_VARARGS, (char *)"\n"
		"SetCoerceResultToId(bool coerce = True)\n"
		"SBExpressionOptions_SetCoerceResultToId(SBExpressionOptions self)\n"
		"\n"
		"Sets whether to coerce the expression result to ObjC id type after evaluation.\n"
		""},
	 { (char *)"SBExpressionOptions_GetUnwindOnError", _wrap_SBExpressionOptions_GetUnwindOnError, METH_VARARGS, (char *)"SBExpressionOptions_GetUnwindOnError(SBExpressionOptions self) -> bool"},
	 { (char *)"SBExpressionOptions_SetUnwindOnError", _wrap_SBExpressionOptions_SetUnwindOnError, METH_VARARGS, (char *)"\n"
		"SetUnwindOnError(bool unwind = True)\n"
		"SBExpressionOptions_SetUnwindOnError(SBExpressionOptions self)\n"
		"\n"
		"Sets whether to unwind the expression stack on error.\n"
		""},
	 { (char *)"SBExpressionOptions_GetIgnoreBreakpoints", _wrap_SBExpressionOptions_GetIgnoreBreakpoints, METH_VARARGS, (char *)"SBExpressionOptions_GetIgnoreBreakpoints(SBExpressionOptions self) -> bool"},
	 { (char *)"SBExpressionOptions_SetIgnoreBreakpoints", _wrap_SBExpressionOptions_SetIgnoreBreakpoints, METH_VARARGS, (char *)"\n"
		"SetIgnoreBreakpoints(bool ignore = True)\n"
		"SBExpressionOptions_SetIgnoreBreakpoints(SBExpressionOptions self)\n"
		""},
	 { (char *)"SBExpressionOptions_GetFetchDynamicValue", _wrap_SBExpressionOptions_GetFetchDynamicValue, METH_VARARGS, (char *)"SBExpressionOptions_GetFetchDynamicValue(SBExpressionOptions self) -> DynamicValueType"},
	 { (char *)"SBExpressionOptions_SetFetchDynamicValue", _wrap_SBExpressionOptions_SetFetchDynamicValue, METH_VARARGS, (char *)"\n"
		"SetFetchDynamicValue(DynamicValueType dynamic = eDynamicCanRunTarget)\n"
		"SBExpressionOptions_SetFetchDynamicValue(SBExpressionOptions self)\n"
		"\n"
		"Sets whether to cast the expression result to its dynamic type.\n"
		""},
	 { (char *)"SBExpressionOptions_GetTimeoutInMicroSeconds", _wrap_SBExpressionOptions_GetTimeoutInMicroSeconds, METH_VARARGS, (char *)"SBExpressionOptions_GetTimeoutInMicroSeconds(SBExpressionOptions self) -> uint32_t"},
	 { (char *)"SBExpressionOptions_SetTimeoutInMicroSeconds", _wrap_SBExpressionOptions_SetTimeoutInMicroSeconds, METH_VARARGS, (char *)"\n"
		"SetTimeoutInMicroSeconds(uint32_t timeout = 0)\n"
		"SBExpressionOptions_SetTimeoutInMicroSeconds(SBExpressionOptions self)\n"
		"\n"
		"Sets the timeout in microseconds to run the expression for. If try all threads is set to true and the expression doesn't complete within the specified timeout, all threads will be resumed for the same timeout to see if the expresson will finish.\n"
		""},
	 { (char *)"SBExpressionOptions_GetOneThreadTimeoutInMicroSeconds", _wrap_SBExpressionOptions_GetOneThreadTimeoutInMicroSeconds, METH_VARARGS, (char *)"SBExpressionOptions_GetOneThreadTimeoutInMicroSeconds(SBExpressionOptions self) -> uint32_t"},
	 { (char *)"SBExpressionOptions_SetOneThreadTimeoutInMicroSeconds", _wrap_SBExpressionOptions_SetOneThreadTimeoutInMicroSeconds, METH_VARARGS, (char *)"\n"
		"SetOneThreadTimeoutInMicroSeconds(uint32_t timeout = 0)\n"
		"SBExpressionOptions_SetOneThreadTimeoutInMicroSeconds(SBExpressionOptions self)\n"
		""},
	 { (char *)"SBExpressionOptions_GetTryAllThreads", _wrap_SBExpressionOptions_GetTryAllThreads, METH_VARARGS, (char *)"SBExpressionOptions_GetTryAllThreads(SBExpressionOptions self) -> bool"},
	 { (char *)"SBExpressionOptions_SetTryAllThreads", _wrap_SBExpressionOptions_SetTryAllThreads, METH_VARARGS, (char *)"\n"
		"SetTryAllThreads(bool run_others = True)\n"
		"SBExpressionOptions_SetTryAllThreads(SBExpressionOptions self)\n"
		"\n"
		"Sets whether to run all threads if the expression does not complete on one thread.\n"
		""},
	 { (char *)"SBExpressionOptions_GetStopOthers", _wrap_SBExpressionOptions_GetStopOthers, METH_VARARGS, (char *)"SBExpressionOptions_GetStopOthers(SBExpressionOptions self) -> bool"},
	 { (char *)"SBExpressionOptions_SetStopOthers", _wrap_SBExpressionOptions_SetStopOthers, METH_VARARGS, (char *)"\n"
		"SetStopOthers(bool stop_others = True)\n"
		"SBExpressionOptions_SetStopOthers(SBExpressionOptions self)\n"
		""},
	 { (char *)"SBExpressionOptions_GetTrapExceptions", _wrap_SBExpressionOptions_GetTrapExceptions, METH_VARARGS, (char *)"SBExpressionOptions_GetTrapExceptions(SBExpressionOptions self) -> bool"},
	 { (char *)"SBExpressionOptions_SetTrapExceptions", _wrap_SBExpressionOptions_SetTrapExceptions, METH_VARARGS, (char *)"\n"
		"SetTrapExceptions(bool trap_exceptions = True)\n"
		"SBExpressionOptions_SetTrapExceptions(SBExpressionOptions self)\n"
		""},
	 { (char *)"SBExpressionOptions_GetPlaygroundTransformEnabled", _wrap_SBExpressionOptions_GetPlaygroundTransformEnabled, METH_VARARGS, (char *)"SBExpressionOptions_GetPlaygroundTransformEnabled(SBExpressionOptions self) -> bool"},
	 { (char *)"SBExpressionOptions_SetPlaygroundTransformEnabled", _wrap_SBExpressionOptions_SetPlaygroundTransformEnabled, METH_VARARGS, (char *)"\n"
		"SetPlaygroundTransformEnabled(bool enable_playground_transform = True)\n"
		"SBExpressionOptions_SetPlaygroundTransformEnabled(SBExpressionOptions self)\n"
		""},
	 { (char *)"SBExpressionOptions_GetREPLMode", _wrap_SBExpressionOptions_GetREPLMode, METH_VARARGS, (char *)"SBExpressionOptions_GetREPLMode(SBExpressionOptions self) -> bool"},
	 { (char *)"SBExpressionOptions_SetREPLMode", _wrap_SBExpressionOptions_SetREPLMode, METH_VARARGS, (char *)"\n"
		"SetREPLMode(bool enable_repl = True)\n"
		"SBExpressionOptions_SetREPLMode(SBExpressionOptions self)\n"
		""},
	 { (char *)"SBExpressionOptions_SetLanguage", _wrap_SBExpressionOptions_SetLanguage, METH_VARARGS, (char *)"\n"
		"SBExpressionOptions_SetLanguage(SBExpressionOptions self, LanguageType language)\n"
		"\n"
		"Sets the language that LLDB should assume the expression is written in\n"
		""},
	 { (char *)"SBExpressionOptions_GetGenerateDebugInfo", _wrap_SBExpressionOptions_GetGenerateDebugInfo, METH_VARARGS, (char *)"SBExpressionOptions_GetGenerateDebugInfo(SBExpressionOptions self) -> bool"},
	 { (char *)"SBExpressionOptions_SetGenerateDebugInfo", _wrap_SBExpressionOptions_SetGenerateDebugInfo, METH_VARARGS, (char *)"\n"
		"SetGenerateDebugInfo(bool b = True)\n"
		"SBExpressionOptions_SetGenerateDebugInfo(SBExpressionOptions self)\n"
		"\n"
		"Sets whether to generate debug information for the expression and also controls if a SBModule is generated.\n"
		""},
	 { (char *)"SBExpressionOptions_GetSuppressPersistentResult", _wrap_SBExpressionOptions_GetSuppressPersistentResult, METH_VARARGS, (char *)"SBExpressionOptions_GetSuppressPersistentResult(SBExpressionOptions self) -> bool"},
	 { (char *)"SBExpressionOptions_SetSuppressPersistentResult", _wrap_SBExpressionOptions_SetSuppressPersistentResult, METH_VARARGS, (char *)"\n"
		"SetSuppressPersistentResult(bool b = False)\n"
		"SBExpressionOptions_SetSuppressPersistentResult(SBExpressionOptions self)\n"
		"\n"
		"Sets whether to produce a persistent result that can be used in future expressions.\n"
		""},
	 { (char *)"SBExpressionOptions_GetPrefix", _wrap_SBExpressionOptions_GetPrefix, METH_VARARGS, (char *)"\n"
		"SBExpressionOptions_GetPrefix(SBExpressionOptions self) -> char\n"
		"\n"
		"Gets the prefix to use for this expression.\n"
		""},
	 { (char *)"SBExpressionOptions_SetPrefix", _wrap_SBExpressionOptions_SetPrefix, METH_VARARGS, (char *)"\n"
		"SBExpressionOptions_SetPrefix(SBExpressionOptions self, char prefix)\n"
		"\n"
		"Sets the prefix to use for this expression. This prefix gets inserted after the 'target.expr-prefix' prefix contents, but before the wrapped expression function body.\n"
		""},
	 { (char *)"SBExpressionOptions_SetAutoApplyFixIts", _wrap_SBExpressionOptions_SetAutoApplyFixIts, METH_VARARGS, (char *)"\n"
		"SetAutoApplyFixIts(bool b = True)\n"
		"SBExpressionOptions_SetAutoApplyFixIts(SBExpressionOptions self)\n"
		"\n"
		"Sets whether to auto-apply fix-it hints to the expression being evaluated.\n"
		""},
	 { (char *)"SBExpressionOptions_GetAutoApplyFixIts", _wrap_SBExpressionOptions_GetAutoApplyFixIts, METH_VARARGS, (char *)"\n"
		"SBExpressionOptions_GetAutoApplyFixIts(SBExpressionOptions self) -> bool\n"
		"\n"
		"Gets whether to auto-apply fix-it hints to an expression.\n"
		""},
	 { (char *)"SBExpressionOptions_GetTopLevel", _wrap_SBExpressionOptions_GetTopLevel, METH_VARARGS, (char *)"SBExpressionOptions_GetTopLevel(SBExpressionOptions self) -> bool"},
	 { (char *)"SBExpressionOptions_SetTopLevel", _wrap_SBExpressionOptions_SetTopLevel, METH_VARARGS, (char *)"\n"
		"SetTopLevel(bool b = True)\n"
		"SBExpressionOptions_SetTopLevel(SBExpressionOptions self)\n"
		""},
	 { (char *)"SBExpressionOptions_swigregister", SBExpressionOptions_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBFileSpec", _wrap_new_SBFileSpec, METH_VARARGS, (char *)"\n"
		"SBFileSpec()\n"
		"SBFileSpec(SBFileSpec rhs)\n"
		"SBFileSpec(char path)\n"
		"new_SBFileSpec(char path, bool resolve) -> SBFileSpec\n"
		""},
	 { (char *)"delete_SBFileSpec", _wrap_delete_SBFileSpec, METH_VARARGS, (char *)"delete_SBFileSpec(SBFileSpec self)"},
	 { (char *)"SBFileSpec_IsValid", _wrap_SBFileSpec_IsValid, METH_VARARGS, (char *)"SBFileSpec_IsValid(SBFileSpec self) -> bool"},
	 { (char *)"SBFileSpec_Exists", _wrap_SBFileSpec_Exists, METH_VARARGS, (char *)"SBFileSpec_Exists(SBFileSpec self) -> bool"},
	 { (char *)"SBFileSpec_ResolveExecutableLocation", _wrap_SBFileSpec_ResolveExecutableLocation, METH_VARARGS, (char *)"SBFileSpec_ResolveExecutableLocation(SBFileSpec self) -> bool"},
	 { (char *)"SBFileSpec_GetFilename", _wrap_SBFileSpec_GetFilename, METH_VARARGS, (char *)"SBFileSpec_GetFilename(SBFileSpec self) -> char"},
	 { (char *)"SBFileSpec_GetDirectory", _wrap_SBFileSpec_GetDirectory, METH_VARARGS, (char *)"SBFileSpec_GetDirectory(SBFileSpec self) -> char"},
	 { (char *)"SBFileSpec_SetFilename", _wrap_SBFileSpec_SetFilename, METH_VARARGS, (char *)"SBFileSpec_SetFilename(SBFileSpec self, char filename)"},
	 { (char *)"SBFileSpec_SetDirectory", _wrap_SBFileSpec_SetDirectory, METH_VARARGS, (char *)"SBFileSpec_SetDirectory(SBFileSpec self, char directory)"},
	 { (char *)"SBFileSpec_GetPath", _wrap_SBFileSpec_GetPath, METH_VARARGS, (char *)"SBFileSpec_GetPath(SBFileSpec self, char dst_path, size_t dst_len) -> uint32_t"},
	 { (char *)"SBFileSpec_ResolvePath", _wrap_SBFileSpec_ResolvePath, METH_VARARGS, (char *)"SBFileSpec_ResolvePath(char src_path, char dst_path, size_t dst_len) -> int"},
	 { (char *)"SBFileSpec_GetDescription", _wrap_SBFileSpec_GetDescription, METH_VARARGS, (char *)"SBFileSpec_GetDescription(SBFileSpec self, SBStream description) -> bool"},
	 { (char *)"SBFileSpec_AppendPathComponent", _wrap_SBFileSpec_AppendPathComponent, METH_VARARGS, (char *)"SBFileSpec_AppendPathComponent(SBFileSpec self, char file_or_directory)"},
	 { (char *)"SBFileSpec___str__", _wrap_SBFileSpec___str__, METH_VARARGS, (char *)"SBFileSpec___str__(SBFileSpec self) -> PyObject"},
	 { (char *)"SBFileSpec_swigregister", SBFileSpec_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBFileSpecList", _wrap_new_SBFileSpecList, METH_VARARGS, (char *)"\n"
		"SBFileSpecList()\n"
		"new_SBFileSpecList(SBFileSpecList rhs) -> SBFileSpecList\n"
		""},
	 { (char *)"delete_SBFileSpecList", _wrap_delete_SBFileSpecList, METH_VARARGS, (char *)"delete_SBFileSpecList(SBFileSpecList self)"},
	 { (char *)"SBFileSpecList_GetSize", _wrap_SBFileSpecList_GetSize, METH_VARARGS, (char *)"SBFileSpecList_GetSize(SBFileSpecList self) -> uint32_t"},
	 { (char *)"SBFileSpecList_GetDescription", _wrap_SBFileSpecList_GetDescription, METH_VARARGS, (char *)"SBFileSpecList_GetDescription(SBFileSpecList self, SBStream description) -> bool"},
	 { (char *)"SBFileSpecList_Append", _wrap_SBFileSpecList_Append, METH_VARARGS, (char *)"SBFileSpecList_Append(SBFileSpecList self, SBFileSpec sb_file)"},
	 { (char *)"SBFileSpecList_AppendIfUnique", _wrap_SBFileSpecList_AppendIfUnique, METH_VARARGS, (char *)"SBFileSpecList_AppendIfUnique(SBFileSpecList self, SBFileSpec sb_file) -> bool"},
	 { (char *)"SBFileSpecList_Clear", _wrap_SBFileSpecList_Clear, METH_VARARGS, (char *)"SBFileSpecList_Clear(SBFileSpecList self)"},
	 { (char *)"SBFileSpecList_FindFileIndex", _wrap_SBFileSpecList_FindFileIndex, METH_VARARGS, (char *)"\n"
		"SBFileSpecList_FindFileIndex(SBFileSpecList self, uint32_t idx, SBFileSpec sb_file, \n"
		"    bool full) -> uint32_t\n"
		""},
	 { (char *)"SBFileSpecList_GetFileSpecAtIndex", _wrap_SBFileSpecList_GetFileSpecAtIndex, METH_VARARGS, (char *)"SBFileSpecList_GetFileSpecAtIndex(SBFileSpecList self, uint32_t idx) -> SBFileSpec"},
	 { (char *)"SBFileSpecList_swigregister", SBFileSpecList_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBFrame", _wrap_new_SBFrame, METH_VARARGS, (char *)"\n"
		"SBFrame()\n"
		"new_SBFrame(SBFrame rhs) -> SBFrame\n"
		""},
	 { (char *)"delete_SBFrame", _wrap_delete_SBFrame, METH_VARARGS, (char *)"delete_SBFrame(SBFrame self)"},
	 { (char *)"SBFrame_IsEqual", _wrap_SBFrame_IsEqual, METH_VARARGS, (char *)"SBFrame_IsEqual(SBFrame self, SBFrame rhs) -> bool"},
	 { (char *)"SBFrame_IsValid", _wrap_SBFrame_IsValid, METH_VARARGS, (char *)"SBFrame_IsValid(SBFrame self) -> bool"},
	 { (char *)"SBFrame_GetFrameID", _wrap_SBFrame_GetFrameID, METH_VARARGS, (char *)"SBFrame_GetFrameID(SBFrame self) -> uint32_t"},
	 { (char *)"SBFrame_GetCFA", _wrap_SBFrame_GetCFA, METH_VARARGS, (char *)"\n"
		"SBFrame_GetCFA(SBFrame self) -> addr_t\n"
		"\n"
		"Get the Canonical Frame Address for this stack frame.\n"
		"This is the DWARF standard's definition of a CFA, a stack address\n"
		"that remains constant throughout the lifetime of the function.\n"
		"Returns an lldb::addr_t stack address, or LLDB_INVALID_ADDRESS if\n"
		"the CFA cannot be determined.\n"
		""},
	 { (char *)"SBFrame_GetPC", _wrap_SBFrame_GetPC, METH_VARARGS, (char *)"SBFrame_GetPC(SBFrame self) -> addr_t"},
	 { (char *)"SBFrame_SetPC", _wrap_SBFrame_SetPC, METH_VARARGS, (char *)"SBFrame_SetPC(SBFrame self, addr_t new_pc) -> bool"},
	 { (char *)"SBFrame_GetSP", _wrap_SBFrame_GetSP, METH_VARARGS, (char *)"SBFrame_GetSP(SBFrame self) -> addr_t"},
	 { (char *)"SBFrame_GetFP", _wrap_SBFrame_GetFP, METH_VARARGS, (char *)"SBFrame_GetFP(SBFrame self) -> addr_t"},
	 { (char *)"SBFrame_GetPCAddress", _wrap_SBFrame_GetPCAddress, METH_VARARGS, (char *)"SBFrame_GetPCAddress(SBFrame self) -> SBAddress"},
	 { (char *)"SBFrame_GetSymbolContext", _wrap_SBFrame_GetSymbolContext, METH_VARARGS, (char *)"SBFrame_GetSymbolContext(SBFrame self, uint32_t resolve_scope) -> SBSymbolContext"},
	 { (char *)"SBFrame_GetModule", _wrap_SBFrame_GetModule, METH_VARARGS, (char *)"SBFrame_GetModule(SBFrame self) -> SBModule"},
	 { (char *)"SBFrame_GetCompileUnit", _wrap_SBFrame_GetCompileUnit, METH_VARARGS, (char *)"SBFrame_GetCompileUnit(SBFrame self) -> SBCompileUnit"},
	 { (char *)"SBFrame_GetFunction", _wrap_SBFrame_GetFunction, METH_VARARGS, (char *)"SBFrame_GetFunction(SBFrame self) -> SBFunction"},
	 { (char *)"SBFrame_GetSymbol", _wrap_SBFrame_GetSymbol, METH_VARARGS, (char *)"SBFrame_GetSymbol(SBFrame self) -> SBSymbol"},
	 { (char *)"SBFrame_GetBlock", _wrap_SBFrame_GetBlock, METH_VARARGS, (char *)"\n"
		"SBFrame_GetBlock(SBFrame self) -> SBBlock\n"
		"\n"
		"/// Gets the deepest block that contains the frame PC.\n"
		"///\n"
		"/// See also GetFrameBlock().\n"
		"\n"
		""},
	 { (char *)"SBFrame_GetDisplayFunctionName", _wrap_SBFrame_GetDisplayFunctionName, METH_VARARGS, (char *)"SBFrame_GetDisplayFunctionName(SBFrame self) -> char"},
	 { (char *)"SBFrame_GetFunctionName", _wrap_SBFrame_GetFunctionName, METH_VARARGS, (char *)"\n"
		"GetFunctionName() -> char\n"
		"SBFrame_GetFunctionName(SBFrame self) -> char\n"
		"\n"
		"/// Get the appropriate function name for this frame. Inlined functions in\n"
		"/// LLDB are represented by Blocks that have inlined function information, so\n"
		"/// just looking at the SBFunction or SBSymbol for a frame isn't enough.\n"
		"/// This function will return the appropriate function, symbol or inlined\n"
		"/// function name for the frame.\n"
		"///\n"
		"/// This function returns:\n"
		"/// - the name of the inlined function (if there is one)\n"
		"/// - the name of the concrete function (if there is one)\n"
		"/// - the name of the symbol (if there is one)\n"
		"/// - NULL\n"
		"///\n"
		"/// See also IsInlined().\n"
		"\n"
		""},
	 { (char *)"SBFrame_GuessLanguage", _wrap_SBFrame_GuessLanguage, METH_VARARGS, (char *)"\n"
		"SBFrame_GuessLanguage(SBFrame self) -> LanguageType\n"
		"\n"
		"/// Returns the language of the frame's SBFunction, or if there.\n"
		"/// is no SBFunction, guess the language from the mangled name.\n"
		"/// .\n"
		"\n"
		""},
	 { (char *)"SBFrame_IsSwiftThunk", _wrap_SBFrame_IsSwiftThunk, METH_VARARGS, (char *)"SBFrame_IsSwiftThunk(SBFrame self) -> bool"},
	 { (char *)"SBFrame_IsInlined", _wrap_SBFrame_IsInlined, METH_VARARGS, (char *)"\n"
		"IsInlined() -> bool\n"
		"SBFrame_IsInlined(SBFrame self) -> bool\n"
		"\n"
		"/// Return true if this frame represents an inlined function.\n"
		"///\n"
		"/// See also GetFunctionName().\n"
		"\n"
		""},
	 { (char *)"SBFrame_EvaluateExpression", _wrap_SBFrame_EvaluateExpression, METH_VARARGS, (char *)"\n"
		"EvaluateExpression(char expr) -> SBValue\n"
		"EvaluateExpression(char expr, DynamicValueType use_dynamic) -> SBValue\n"
		"EvaluateExpression(char expr, DynamicValueType use_dynamic, bool unwind_on_error) -> SBValue\n"
		"SBFrame_EvaluateExpression(SBFrame self, char expr, SBExpressionOptions options) -> SBValue\n"
		"\n"
		"/// The version that doesn't supply a 'use_dynamic' value will use the\n"
		"/// target's default.\n"
		"\n"
		""},
	 { (char *)"SBFrame_GetFrameBlock", _wrap_SBFrame_GetFrameBlock, METH_VARARGS, (char *)"\n"
		"SBFrame_GetFrameBlock(SBFrame self) -> SBBlock\n"
		"\n"
		"/// Gets the lexical block that defines the stack frame. Another way to think\n"
		"/// of this is it will return the block that contains all of the variables\n"
		"/// for a stack frame. Inlined functions are represented as SBBlock objects\n"
		"/// that have inlined function information: the name of the inlined function,\n"
		"/// where it was called from. The block that is returned will be the first \n"
		"/// block at or above the block for the PC (SBFrame::GetBlock()) that defines\n"
		"/// the scope of the frame. When a function contains no inlined functions,\n"
		"/// this will be the top most lexical block that defines the function. \n"
		"/// When a function has inlined functions and the PC is currently\n"
		"/// in one of those inlined functions, this method will return the inlined\n"
		"/// block that defines this frame. If the PC isn't currently in an inlined\n"
		"/// function, the lexical block that defines the function is returned.\n"
		"\n"
		""},
	 { (char *)"SBFrame_GetLineEntry", _wrap_SBFrame_GetLineEntry, METH_VARARGS, (char *)"SBFrame_GetLineEntry(SBFrame self) -> SBLineEntry"},
	 { (char *)"SBFrame_GetThread", _wrap_SBFrame_GetThread, METH_VARARGS, (char *)"SBFrame_GetThread(SBFrame self) -> SBThread"},
	 { (char *)"SBFrame_Disassemble", _wrap_SBFrame_Disassemble, METH_VARARGS, (char *)"SBFrame_Disassemble(SBFrame self) -> char"},
	 { (char *)"SBFrame_Clear", _wrap_SBFrame_Clear, METH_VARARGS, (char *)"SBFrame_Clear(SBFrame self)"},
	 { (char *)"SBFrame_GetVariables", _wrap_SBFrame_GetVariables, METH_VARARGS, (char *)"\n"
		"GetVariables(bool arguments, bool locals, bool statics, bool in_scope_only) -> SBValueList\n"
		"GetVariables(bool arguments, bool locals, bool statics, bool in_scope_only, \n"
		"    DynamicValueType use_dynamic) -> SBValueList\n"
		"SBFrame_GetVariables(SBFrame self, SBVariablesOptions options) -> SBValueList\n"
		"\n"
		"/// The version that doesn't supply a 'use_dynamic' value will use the\n"
		"/// target's default.\n"
		"\n"
		""},
	 { (char *)"SBFrame_GetRegisters", _wrap_SBFrame_GetRegisters, METH_VARARGS, (char *)"SBFrame_GetRegisters(SBFrame self) -> SBValueList"},
	 { (char *)"SBFrame_FindVariable", _wrap_SBFrame_FindVariable, METH_VARARGS, (char *)"\n"
		"FindVariable(char var_name) -> SBValue\n"
		"SBFrame_FindVariable(SBFrame self, char var_name, DynamicValueType use_dynamic) -> SBValue\n"
		"\n"
		"/// The version that doesn't supply a 'use_dynamic' value will use the\n"
		"/// target's default.\n"
		"\n"
		""},
	 { (char *)"SBFrame_FindRegister", _wrap_SBFrame_FindRegister, METH_VARARGS, (char *)"SBFrame_FindRegister(SBFrame self, char name) -> SBValue"},
	 { (char *)"SBFrame_GetValueForVariablePath", _wrap_SBFrame_GetValueForVariablePath, METH_VARARGS, (char *)"\n"
		"GetValueForVariablePath(char var_path) -> SBValue\n"
		"SBFrame_GetValueForVariablePath(SBFrame self, char var_path, DynamicValueType use_dynamic) -> SBValue\n"
		"\n"
		"/// Get a lldb.SBValue for a variable path. \n"
		"///\n"
		"/// Variable paths can include access to pointer or instance members:\n"
		"///     rect_ptr->origin.y\n"
		"///     pt.x\n"
		"/// Pointer dereferences:\n"
		"///     *this->foo_ptr\n"
		"///     **argv\n"
		"/// Address of:\n"
		"///     &pt\n"
		"///     &my_array[3].x\n"
		"/// Array accesses and treating pointers as arrays:\n"
		"///     int_array[1]\n"
		"///     pt_ptr[22].x\n"
		"///\n"
		"/// Unlike EvaluateExpression() which returns lldb.SBValue objects\n"
		"/// with constant copies of the values at the time of evaluation,\n"
		"/// the result of this function is a value that will continue to\n"
		"/// track the current value of the value as execution progresses\n"
		"/// in the current frame.\n"
		"\n"
		""},
	 { (char *)"SBFrame_FindValue", _wrap_SBFrame_FindValue, METH_VARARGS, (char *)"\n"
		"FindValue(char name, ValueType value_type) -> SBValue\n"
		"SBFrame_FindValue(SBFrame self, char name, ValueType value_type, DynamicValueType use_dynamic) -> SBValue\n"
		"\n"
		"/// Find variables, register sets, registers, or persistent variables using\n"
		"/// the frame as the scope.\n"
		"///\n"
		"/// The version that doesn't supply a 'use_dynamic' value will use the\n"
		"/// target's default.\n"
		"\n"
		""},
	 { (char *)"SBFrame_GetDescription", _wrap_SBFrame_GetDescription, METH_VARARGS, (char *)"SBFrame_GetDescription(SBFrame self, SBStream description) -> bool"},
	 { (char *)"SBFrame___str__", _wrap_SBFrame___str__, METH_VARARGS, (char *)"SBFrame___str__(SBFrame self) -> PyObject"},
	 { (char *)"SBFrame_swigregister", SBFrame_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBFunction", _wrap_new_SBFunction, METH_VARARGS, (char *)"\n"
		"SBFunction()\n"
		"new_SBFunction(SBFunction rhs) -> SBFunction\n"
		""},
	 { (char *)"delete_SBFunction", _wrap_delete_SBFunction, METH_VARARGS, (char *)"delete_SBFunction(SBFunction self)"},
	 { (char *)"SBFunction_IsValid", _wrap_SBFunction_IsValid, METH_VARARGS, (char *)"SBFunction_IsValid(SBFunction self) -> bool"},
	 { (char *)"SBFunction_GetName", _wrap_SBFunction_GetName, METH_VARARGS, (char *)"SBFunction_GetName(SBFunction self) -> char"},
	 { (char *)"SBFunction_GetDisplayName", _wrap_SBFunction_GetDisplayName, METH_VARARGS, (char *)"SBFunction_GetDisplayName(SBFunction self) -> char"},
	 { (char *)"SBFunction_GetMangledName", _wrap_SBFunction_GetMangledName, METH_VARARGS, (char *)"SBFunction_GetMangledName(SBFunction self) -> char"},
	 { (char *)"SBFunction_GetInstructions", _wrap_SBFunction_GetInstructions, METH_VARARGS, (char *)"\n"
		"GetInstructions(SBTarget target) -> SBInstructionList\n"
		"SBFunction_GetInstructions(SBFunction self, SBTarget target, char flavor) -> SBInstructionList\n"
		""},
	 { (char *)"SBFunction_GetStartAddress", _wrap_SBFunction_GetStartAddress, METH_VARARGS, (char *)"SBFunction_GetStartAddress(SBFunction self) -> SBAddress"},
	 { (char *)"SBFunction_GetEndAddress", _wrap_SBFunction_GetEndAddress, METH_VARARGS, (char *)"SBFunction_GetEndAddress(SBFunction self) -> SBAddress"},
	 { (char *)"SBFunction_GetArgumentName", _wrap_SBFunction_GetArgumentName, METH_VARARGS, (char *)"SBFunction_GetArgumentName(SBFunction self, uint32_t arg_idx) -> char"},
	 { (char *)"SBFunction_GetPrologueByteSize", _wrap_SBFunction_GetPrologueByteSize, METH_VARARGS, (char *)"SBFunction_GetPrologueByteSize(SBFunction self) -> uint32_t"},
	 { (char *)"SBFunction_GetType", _wrap_SBFunction_GetType, METH_VARARGS, (char *)"SBFunction_GetType(SBFunction self) -> SBType"},
	 { (char *)"SBFunction_GetBlock", _wrap_SBFunction_GetBlock, METH_VARARGS, (char *)"SBFunction_GetBlock(SBFunction self) -> SBBlock"},
	 { (char *)"SBFunction_GetLanguage", _wrap_SBFunction_GetLanguage, METH_VARARGS, (char *)"SBFunction_GetLanguage(SBFunction self) -> LanguageType"},
	 { (char *)"SBFunction_GetIsOptimized", _wrap_SBFunction_GetIsOptimized, METH_VARARGS, (char *)"\n"
		"SBFunction_GetIsOptimized(SBFunction self) -> bool\n"
		"\n"
		"Returns true if the function was compiled with optimization.\n"
		"Optimization, in this case, is meant to indicate that the debugger\n"
		"experience may be confusing for the user -- variables optimized away,\n"
		"stepping jumping between source lines -- and the driver may want to \n"
		"provide some guidance to the user about this.\n"
		"Returns false if unoptimized, or unknown.\n"
		""},
	 { (char *)"SBFunction_GetCanThrow", _wrap_SBFunction_GetCanThrow, METH_VARARGS, (char *)"SBFunction_GetCanThrow(SBFunction self) -> bool"},
	 { (char *)"SBFunction_GetDescription", _wrap_SBFunction_GetDescription, METH_VARARGS, (char *)"SBFunction_GetDescription(SBFunction self, SBStream description) -> bool"},
	 { (char *)"SBFunction___eq__", _wrap_SBFunction___eq__, METH_VARARGS, (char *)"SBFunction___eq__(SBFunction self, SBFunction rhs) -> bool"},
	 { (char *)"SBFunction___ne__", _wrap_SBFunction___ne__, METH_VARARGS, (char *)"SBFunction___ne__(SBFunction self, SBFunction rhs) -> bool"},
	 { (char *)"SBFunction___str__", _wrap_SBFunction___str__, METH_VARARGS, (char *)"SBFunction___str__(SBFunction self) -> PyObject"},
	 { (char *)"SBFunction_swigregister", SBFunction_swigregister, METH_VARARGS, NULL},
	 { (char *)"SBHostOS_GetProgramFileSpec", _wrap_SBHostOS_GetProgramFileSpec, METH_VARARGS, (char *)"SBHostOS_GetProgramFileSpec() -> SBFileSpec"},
	 { (char *)"SBHostOS_GetLLDBPythonPath", _wrap_SBHostOS_GetLLDBPythonPath, METH_VARARGS, (char *)"SBHostOS_GetLLDBPythonPath() -> SBFileSpec"},
	 { (char *)"SBHostOS_GetLLDBPath", _wrap_SBHostOS_GetLLDBPath, METH_VARARGS, (char *)"SBHostOS_GetLLDBPath(PathType path_type) -> SBFileSpec"},
	 { (char *)"SBHostOS_GetUserHomeDirectory", _wrap_SBHostOS_GetUserHomeDirectory, METH_VARARGS, (char *)"SBHostOS_GetUserHomeDirectory() -> SBFileSpec"},
	 { (char *)"SBHostOS_ThreadCreated", _wrap_SBHostOS_ThreadCreated, METH_VARARGS, (char *)"SBHostOS_ThreadCreated(char name)"},
	 { (char *)"SBHostOS_ThreadCreate", _wrap_SBHostOS_ThreadCreate, METH_VARARGS, (char *)"SBHostOS_ThreadCreate(char name, thread_func_t arg1, void thread_arg, SBError err) -> thread_t"},
	 { (char *)"SBHostOS_ThreadCancel", _wrap_SBHostOS_ThreadCancel, METH_VARARGS, (char *)"SBHostOS_ThreadCancel(thread_t thread, SBError err) -> bool"},
	 { (char *)"SBHostOS_ThreadDetach", _wrap_SBHostOS_ThreadDetach, METH_VARARGS, (char *)"SBHostOS_ThreadDetach(thread_t thread, SBError err) -> bool"},
	 { (char *)"SBHostOS_ThreadJoin", _wrap_SBHostOS_ThreadJoin, METH_VARARGS, (char *)"SBHostOS_ThreadJoin(thread_t thread, thread_result_t result, SBError err) -> bool"},
	 { (char *)"new_SBHostOS", _wrap_new_SBHostOS, METH_VARARGS, (char *)"new_SBHostOS() -> SBHostOS"},
	 { (char *)"delete_SBHostOS", _wrap_delete_SBHostOS, METH_VARARGS, (char *)"delete_SBHostOS(SBHostOS self)"},
	 { (char *)"SBHostOS_swigregister", SBHostOS_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBInstruction", _wrap_new_SBInstruction, METH_VARARGS, (char *)"\n"
		"SBInstruction()\n"
		"new_SBInstruction(SBInstruction rhs) -> SBInstruction\n"
		""},
	 { (char *)"delete_SBInstruction", _wrap_delete_SBInstruction, METH_VARARGS, (char *)"delete_SBInstruction(SBInstruction self)"},
	 { (char *)"SBInstruction_IsValid", _wrap_SBInstruction_IsValid, METH_VARARGS, (char *)"SBInstruction_IsValid(SBInstruction self) -> bool"},
	 { (char *)"SBInstruction_GetAddress", _wrap_SBInstruction_GetAddress, METH_VARARGS, (char *)"SBInstruction_GetAddress(SBInstruction self) -> SBAddress"},
	 { (char *)"SBInstruction_GetAddressClass", _wrap_SBInstruction_GetAddressClass, METH_VARARGS, (char *)"SBInstruction_GetAddressClass(SBInstruction self) -> AddressClass"},
	 { (char *)"SBInstruction_GetMnemonic", _wrap_SBInstruction_GetMnemonic, METH_VARARGS, (char *)"SBInstruction_GetMnemonic(SBInstruction self, SBTarget target) -> char"},
	 { (char *)"SBInstruction_GetOperands", _wrap_SBInstruction_GetOperands, METH_VARARGS, (char *)"SBInstruction_GetOperands(SBInstruction self, SBTarget target) -> char"},
	 { (char *)"SBInstruction_GetComment", _wrap_SBInstruction_GetComment, METH_VARARGS, (char *)"SBInstruction_GetComment(SBInstruction self, SBTarget target) -> char"},
	 { (char *)"SBInstruction_GetData", _wrap_SBInstruction_GetData, METH_VARARGS, (char *)"SBInstruction_GetData(SBInstruction self, SBTarget target) -> SBData"},
	 { (char *)"SBInstruction_GetByteSize", _wrap_SBInstruction_GetByteSize, METH_VARARGS, (char *)"SBInstruction_GetByteSize(SBInstruction self) -> size_t"},
	 { (char *)"SBInstruction_DoesBranch", _wrap_SBInstruction_DoesBranch, METH_VARARGS, (char *)"SBInstruction_DoesBranch(SBInstruction self) -> bool"},
	 { (char *)"SBInstruction_HasDelaySlot", _wrap_SBInstruction_HasDelaySlot, METH_VARARGS, (char *)"SBInstruction_HasDelaySlot(SBInstruction self) -> bool"},
	 { (char *)"SBInstruction_CanSetBreakpoint", _wrap_SBInstruction_CanSetBreakpoint, METH_VARARGS, (char *)"SBInstruction_CanSetBreakpoint(SBInstruction self) -> bool"},
	 { (char *)"SBInstruction_Print", _wrap_SBInstruction_Print, METH_VARARGS, (char *)"SBInstruction_Print(SBInstruction self, FILE out)"},
	 { (char *)"SBInstruction_GetDescription", _wrap_SBInstruction_GetDescription, METH_VARARGS, (char *)"SBInstruction_GetDescription(SBInstruction self, SBStream description) -> bool"},
	 { (char *)"SBInstruction_EmulateWithFrame", _wrap_SBInstruction_EmulateWithFrame, METH_VARARGS, (char *)"SBInstruction_EmulateWithFrame(SBInstruction self, SBFrame frame, uint32_t evaluate_options) -> bool"},
	 { (char *)"SBInstruction_DumpEmulation", _wrap_SBInstruction_DumpEmulation, METH_VARARGS, (char *)"SBInstruction_DumpEmulation(SBInstruction self, char triple) -> bool"},
	 { (char *)"SBInstruction_TestEmulation", _wrap_SBInstruction_TestEmulation, METH_VARARGS, (char *)"SBInstruction_TestEmulation(SBInstruction self, SBStream output_stream, char test_file) -> bool"},
	 { (char *)"SBInstruction___str__", _wrap_SBInstruction___str__, METH_VARARGS, (char *)"SBInstruction___str__(SBInstruction self) -> PyObject"},
	 { (char *)"SBInstruction_swigregister", SBInstruction_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBInstructionList", _wrap_new_SBInstructionList, METH_VARARGS, (char *)"\n"
		"SBInstructionList()\n"
		"new_SBInstructionList(SBInstructionList rhs) -> SBInstructionList\n"
		""},
	 { (char *)"delete_SBInstructionList", _wrap_delete_SBInstructionList, METH_VARARGS, (char *)"delete_SBInstructionList(SBInstructionList self)"},
	 { (char *)"SBInstructionList_IsValid", _wrap_SBInstructionList_IsValid, METH_VARARGS, (char *)"SBInstructionList_IsValid(SBInstructionList self) -> bool"},
	 { (char *)"SBInstructionList_GetSize", _wrap_SBInstructionList_GetSize, METH_VARARGS, (char *)"SBInstructionList_GetSize(SBInstructionList self) -> size_t"},
	 { (char *)"SBInstructionList_GetInstructionAtIndex", _wrap_SBInstructionList_GetInstructionAtIndex, METH_VARARGS, (char *)"SBInstructionList_GetInstructionAtIndex(SBInstructionList self, uint32_t idx) -> SBInstruction"},
	 { (char *)"SBInstructionList_GetInstructionsCount", _wrap_SBInstructionList_GetInstructionsCount, METH_VARARGS, (char *)"\n"
		"SBInstructionList_GetInstructionsCount(SBInstructionList self, SBAddress start, SBAddress end, \n"
		"    bool canSetBreakpoint) -> size_t\n"
		""},
	 { (char *)"SBInstructionList_Clear", _wrap_SBInstructionList_Clear, METH_VARARGS, (char *)"SBInstructionList_Clear(SBInstructionList self)"},
	 { (char *)"SBInstructionList_AppendInstruction", _wrap_SBInstructionList_AppendInstruction, METH_VARARGS, (char *)"SBInstructionList_AppendInstruction(SBInstructionList self, SBInstruction inst)"},
	 { (char *)"SBInstructionList_Print", _wrap_SBInstructionList_Print, METH_VARARGS, (char *)"SBInstructionList_Print(SBInstructionList self, FILE out)"},
	 { (char *)"SBInstructionList_GetDescription", _wrap_SBInstructionList_GetDescription, METH_VARARGS, (char *)"SBInstructionList_GetDescription(SBInstructionList self, SBStream description) -> bool"},
	 { (char *)"SBInstructionList_DumpEmulationForAllInstructions", _wrap_SBInstructionList_DumpEmulationForAllInstructions, METH_VARARGS, (char *)"SBInstructionList_DumpEmulationForAllInstructions(SBInstructionList self, char triple) -> bool"},
	 { (char *)"SBInstructionList___str__", _wrap_SBInstructionList___str__, METH_VARARGS, (char *)"SBInstructionList___str__(SBInstructionList self) -> PyObject"},
	 { (char *)"SBInstructionList_swigregister", SBInstructionList_swigregister, METH_VARARGS, NULL},
	 { (char *)"SBLanguageRuntime_GetLanguageTypeFromString", _wrap_SBLanguageRuntime_GetLanguageTypeFromString, METH_VARARGS, (char *)"SBLanguageRuntime_GetLanguageTypeFromString(char string) -> LanguageType"},
	 { (char *)"SBLanguageRuntime_GetNameForLanguageType", _wrap_SBLanguageRuntime_GetNameForLanguageType, METH_VARARGS, (char *)"SBLanguageRuntime_GetNameForLanguageType(LanguageType language) -> char"},
	 { (char *)"new_SBLanguageRuntime", _wrap_new_SBLanguageRuntime, METH_VARARGS, (char *)"new_SBLanguageRuntime() -> SBLanguageRuntime"},
	 { (char *)"delete_SBLanguageRuntime", _wrap_delete_SBLanguageRuntime, METH_VARARGS, (char *)"delete_SBLanguageRuntime(SBLanguageRuntime self)"},
	 { (char *)"SBLanguageRuntime_swigregister", SBLanguageRuntime_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBLaunchInfo", _wrap_new_SBLaunchInfo, METH_VARARGS, (char *)"new_SBLaunchInfo(char argv) -> SBLaunchInfo"},
	 { (char *)"SBLaunchInfo_GetProcessID", _wrap_SBLaunchInfo_GetProcessID, METH_VARARGS, (char *)"SBLaunchInfo_GetProcessID(SBLaunchInfo self) -> pid_t"},
	 { (char *)"SBLaunchInfo_GetUserID", _wrap_SBLaunchInfo_GetUserID, METH_VARARGS, (char *)"SBLaunchInfo_GetUserID(SBLaunchInfo self) -> uint32_t"},
	 { (char *)"SBLaunchInfo_GetGroupID", _wrap_SBLaunchInfo_GetGroupID, METH_VARARGS, (char *)"SBLaunchInfo_GetGroupID(SBLaunchInfo self) -> uint32_t"},
	 { (char *)"SBLaunchInfo_UserIDIsValid", _wrap_SBLaunchInfo_UserIDIsValid, METH_VARARGS, (char *)"SBLaunchInfo_UserIDIsValid(SBLaunchInfo self) -> bool"},
	 { (char *)"SBLaunchInfo_GroupIDIsValid", _wrap_SBLaunchInfo_GroupIDIsValid, METH_VARARGS, (char *)"SBLaunchInfo_GroupIDIsValid(SBLaunchInfo self) -> bool"},
	 { (char *)"SBLaunchInfo_SetUserID", _wrap_SBLaunchInfo_SetUserID, METH_VARARGS, (char *)"SBLaunchInfo_SetUserID(SBLaunchInfo self, uint32_t uid)"},
	 { (char *)"SBLaunchInfo_SetGroupID", _wrap_SBLaunchInfo_SetGroupID, METH_VARARGS, (char *)"SBLaunchInfo_SetGroupID(SBLaunchInfo self, uint32_t gid)"},
	 { (char *)"SBLaunchInfo_GetExecutableFile", _wrap_SBLaunchInfo_GetExecutableFile, METH_VARARGS, (char *)"SBLaunchInfo_GetExecutableFile(SBLaunchInfo self) -> SBFileSpec"},
	 { (char *)"SBLaunchInfo_SetExecutableFile", _wrap_SBLaunchInfo_SetExecutableFile, METH_VARARGS, (char *)"SBLaunchInfo_SetExecutableFile(SBLaunchInfo self, SBFileSpec exe_file, bool add_as_first_arg)"},
	 { (char *)"SBLaunchInfo_GetListener", _wrap_SBLaunchInfo_GetListener, METH_VARARGS, (char *)"SBLaunchInfo_GetListener(SBLaunchInfo self) -> SBListener"},
	 { (char *)"SBLaunchInfo_SetListener", _wrap_SBLaunchInfo_SetListener, METH_VARARGS, (char *)"SBLaunchInfo_SetListener(SBLaunchInfo self, SBListener listener)"},
	 { (char *)"SBLaunchInfo_GetNumArguments", _wrap_SBLaunchInfo_GetNumArguments, METH_VARARGS, (char *)"SBLaunchInfo_GetNumArguments(SBLaunchInfo self) -> uint32_t"},
	 { (char *)"SBLaunchInfo_GetArgumentAtIndex", _wrap_SBLaunchInfo_GetArgumentAtIndex, METH_VARARGS, (char *)"SBLaunchInfo_GetArgumentAtIndex(SBLaunchInfo self, uint32_t idx) -> char"},
	 { (char *)"SBLaunchInfo_SetArguments", _wrap_SBLaunchInfo_SetArguments, METH_VARARGS, (char *)"SBLaunchInfo_SetArguments(SBLaunchInfo self, char argv, bool append)"},
	 { (char *)"SBLaunchInfo_GetNumEnvironmentEntries", _wrap_SBLaunchInfo_GetNumEnvironmentEntries, METH_VARARGS, (char *)"SBLaunchInfo_GetNumEnvironmentEntries(SBLaunchInfo self) -> uint32_t"},
	 { (char *)"SBLaunchInfo_GetEnvironmentEntryAtIndex", _wrap_SBLaunchInfo_GetEnvironmentEntryAtIndex, METH_VARARGS, (char *)"SBLaunchInfo_GetEnvironmentEntryAtIndex(SBLaunchInfo self, uint32_t idx) -> char"},
	 { (char *)"SBLaunchInfo_SetEnvironmentEntries", _wrap_SBLaunchInfo_SetEnvironmentEntries, METH_VARARGS, (char *)"SBLaunchInfo_SetEnvironmentEntries(SBLaunchInfo self, char envp, bool append)"},
	 { (char *)"SBLaunchInfo_Clear", _wrap_SBLaunchInfo_Clear, METH_VARARGS, (char *)"SBLaunchInfo_Clear(SBLaunchInfo self)"},
	 { (char *)"SBLaunchInfo_GetWorkingDirectory", _wrap_SBLaunchInfo_GetWorkingDirectory, METH_VARARGS, (char *)"SBLaunchInfo_GetWorkingDirectory(SBLaunchInfo self) -> char"},
	 { (char *)"SBLaunchInfo_SetWorkingDirectory", _wrap_SBLaunchInfo_SetWorkingDirectory, METH_VARARGS, (char *)"SBLaunchInfo_SetWorkingDirectory(SBLaunchInfo self, char working_dir)"},
	 { (char *)"SBLaunchInfo_GetLaunchFlags", _wrap_SBLaunchInfo_GetLaunchFlags, METH_VARARGS, (char *)"SBLaunchInfo_GetLaunchFlags(SBLaunchInfo self) -> uint32_t"},
	 { (char *)"SBLaunchInfo_SetLaunchFlags", _wrap_SBLaunchInfo_SetLaunchFlags, METH_VARARGS, (char *)"SBLaunchInfo_SetLaunchFlags(SBLaunchInfo self, uint32_t flags)"},
	 { (char *)"SBLaunchInfo_GetProcessPluginName", _wrap_SBLaunchInfo_GetProcessPluginName, METH_VARARGS, (char *)"SBLaunchInfo_GetProcessPluginName(SBLaunchInfo self) -> char"},
	 { (char *)"SBLaunchInfo_SetProcessPluginName", _wrap_SBLaunchInfo_SetProcessPluginName, METH_VARARGS, (char *)"SBLaunchInfo_SetProcessPluginName(SBLaunchInfo self, char plugin_name)"},
	 { (char *)"SBLaunchInfo_GetShell", _wrap_SBLaunchInfo_GetShell, METH_VARARGS, (char *)"SBLaunchInfo_GetShell(SBLaunchInfo self) -> char"},
	 { (char *)"SBLaunchInfo_SetShell", _wrap_SBLaunchInfo_SetShell, METH_VARARGS, (char *)"SBLaunchInfo_SetShell(SBLaunchInfo self, char path)"},
	 { (char *)"SBLaunchInfo_GetShellExpandArguments", _wrap_SBLaunchInfo_GetShellExpandArguments, METH_VARARGS, (char *)"SBLaunchInfo_GetShellExpandArguments(SBLaunchInfo self) -> bool"},
	 { (char *)"SBLaunchInfo_SetShellExpandArguments", _wrap_SBLaunchInfo_SetShellExpandArguments, METH_VARARGS, (char *)"SBLaunchInfo_SetShellExpandArguments(SBLaunchInfo self, bool expand)"},
	 { (char *)"SBLaunchInfo_GetResumeCount", _wrap_SBLaunchInfo_GetResumeCount, METH_VARARGS, (char *)"SBLaunchInfo_GetResumeCount(SBLaunchInfo self) -> uint32_t"},
	 { (char *)"SBLaunchInfo_SetResumeCount", _wrap_SBLaunchInfo_SetResumeCount, METH_VARARGS, (char *)"SBLaunchInfo_SetResumeCount(SBLaunchInfo self, uint32_t c)"},
	 { (char *)"SBLaunchInfo_AddCloseFileAction", _wrap_SBLaunchInfo_AddCloseFileAction, METH_VARARGS, (char *)"SBLaunchInfo_AddCloseFileAction(SBLaunchInfo self, int fd) -> bool"},
	 { (char *)"SBLaunchInfo_AddDuplicateFileAction", _wrap_SBLaunchInfo_AddDuplicateFileAction, METH_VARARGS, (char *)"SBLaunchInfo_AddDuplicateFileAction(SBLaunchInfo self, int fd, int dup_fd) -> bool"},
	 { (char *)"SBLaunchInfo_AddOpenFileAction", _wrap_SBLaunchInfo_AddOpenFileAction, METH_VARARGS, (char *)"SBLaunchInfo_AddOpenFileAction(SBLaunchInfo self, int fd, char path, bool read, bool write) -> bool"},
	 { (char *)"SBLaunchInfo_AddSuppressFileAction", _wrap_SBLaunchInfo_AddSuppressFileAction, METH_VARARGS, (char *)"SBLaunchInfo_AddSuppressFileAction(SBLaunchInfo self, int fd, bool read, bool write) -> bool"},
	 { (char *)"SBLaunchInfo_SetLaunchEventData", _wrap_SBLaunchInfo_SetLaunchEventData, METH_VARARGS, (char *)"SBLaunchInfo_SetLaunchEventData(SBLaunchInfo self, char data)"},
	 { (char *)"SBLaunchInfo_GetLaunchEventData", _wrap_SBLaunchInfo_GetLaunchEventData, METH_VARARGS, (char *)"SBLaunchInfo_GetLaunchEventData(SBLaunchInfo self) -> char"},
	 { (char *)"SBLaunchInfo_GetDetachOnError", _wrap_SBLaunchInfo_GetDetachOnError, METH_VARARGS, (char *)"SBLaunchInfo_GetDetachOnError(SBLaunchInfo self) -> bool"},
	 { (char *)"SBLaunchInfo_SetDetachOnError", _wrap_SBLaunchInfo_SetDetachOnError, METH_VARARGS, (char *)"SBLaunchInfo_SetDetachOnError(SBLaunchInfo self, bool enable)"},
	 { (char *)"delete_SBLaunchInfo", _wrap_delete_SBLaunchInfo, METH_VARARGS, (char *)"delete_SBLaunchInfo(SBLaunchInfo self)"},
	 { (char *)"SBLaunchInfo_swigregister", SBLaunchInfo_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBLineEntry", _wrap_new_SBLineEntry, METH_VARARGS, (char *)"\n"
		"SBLineEntry()\n"
		"new_SBLineEntry(SBLineEntry rhs) -> SBLineEntry\n"
		""},
	 { (char *)"delete_SBLineEntry", _wrap_delete_SBLineEntry, METH_VARARGS, (char *)"delete_SBLineEntry(SBLineEntry self)"},
	 { (char *)"SBLineEntry_GetStartAddress", _wrap_SBLineEntry_GetStartAddress, METH_VARARGS, (char *)"SBLineEntry_GetStartAddress(SBLineEntry self) -> SBAddress"},
	 { (char *)"SBLineEntry_GetEndAddress", _wrap_SBLineEntry_GetEndAddress, METH_VARARGS, (char *)"SBLineEntry_GetEndAddress(SBLineEntry self) -> SBAddress"},
	 { (char *)"SBLineEntry_IsValid", _wrap_SBLineEntry_IsValid, METH_VARARGS, (char *)"SBLineEntry_IsValid(SBLineEntry self) -> bool"},
	 { (char *)"SBLineEntry_GetFileSpec", _wrap_SBLineEntry_GetFileSpec, METH_VARARGS, (char *)"SBLineEntry_GetFileSpec(SBLineEntry self) -> SBFileSpec"},
	 { (char *)"SBLineEntry_GetLine", _wrap_SBLineEntry_GetLine, METH_VARARGS, (char *)"SBLineEntry_GetLine(SBLineEntry self) -> uint32_t"},
	 { (char *)"SBLineEntry_GetColumn", _wrap_SBLineEntry_GetColumn, METH_VARARGS, (char *)"SBLineEntry_GetColumn(SBLineEntry self) -> uint32_t"},
	 { (char *)"SBLineEntry_GetDescription", _wrap_SBLineEntry_GetDescription, METH_VARARGS, (char *)"SBLineEntry_GetDescription(SBLineEntry self, SBStream description) -> bool"},
	 { (char *)"SBLineEntry_SetFileSpec", _wrap_SBLineEntry_SetFileSpec, METH_VARARGS, (char *)"SBLineEntry_SetFileSpec(SBLineEntry self, SBFileSpec filespec)"},
	 { (char *)"SBLineEntry_SetLine", _wrap_SBLineEntry_SetLine, METH_VARARGS, (char *)"SBLineEntry_SetLine(SBLineEntry self, uint32_t line)"},
	 { (char *)"SBLineEntry_SetColumn", _wrap_SBLineEntry_SetColumn, METH_VARARGS, (char *)"SBLineEntry_SetColumn(SBLineEntry self, uint32_t column)"},
	 { (char *)"SBLineEntry___eq__", _wrap_SBLineEntry___eq__, METH_VARARGS, (char *)"SBLineEntry___eq__(SBLineEntry self, SBLineEntry rhs) -> bool"},
	 { (char *)"SBLineEntry___ne__", _wrap_SBLineEntry___ne__, METH_VARARGS, (char *)"SBLineEntry___ne__(SBLineEntry self, SBLineEntry rhs) -> bool"},
	 { (char *)"SBLineEntry___str__", _wrap_SBLineEntry___str__, METH_VARARGS, (char *)"SBLineEntry___str__(SBLineEntry self) -> PyObject"},
	 { (char *)"SBLineEntry_swigregister", SBLineEntry_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBListener", _wrap_new_SBListener, METH_VARARGS, (char *)"\n"
		"SBListener()\n"
		"SBListener(char name)\n"
		"new_SBListener(SBListener rhs) -> SBListener\n"
		""},
	 { (char *)"delete_SBListener", _wrap_delete_SBListener, METH_VARARGS, (char *)"delete_SBListener(SBListener self)"},
	 { (char *)"SBListener_AddEvent", _wrap_SBListener_AddEvent, METH_VARARGS, (char *)"SBListener_AddEvent(SBListener self, SBEvent event)"},
	 { (char *)"SBListener_Clear", _wrap_SBListener_Clear, METH_VARARGS, (char *)"SBListener_Clear(SBListener self)"},
	 { (char *)"SBListener_IsValid", _wrap_SBListener_IsValid, METH_VARARGS, (char *)"SBListener_IsValid(SBListener self) -> bool"},
	 { (char *)"SBListener_StartListeningForEventClass", _wrap_SBListener_StartListeningForEventClass, METH_VARARGS, (char *)"\n"
		"SBListener_StartListeningForEventClass(SBListener self, SBDebugger debugger, char broadcaster_class, \n"
		"    uint32_t event_mask) -> uint32_t\n"
		""},
	 { (char *)"SBListener_StopListeningForEventClass", _wrap_SBListener_StopListeningForEventClass, METH_VARARGS, (char *)"\n"
		"SBListener_StopListeningForEventClass(SBListener self, SBDebugger debugger, char broadcaster_class, \n"
		"    uint32_t event_mask) -> uint32_t\n"
		""},
	 { (char *)"SBListener_StartListeningForEvents", _wrap_SBListener_StartListeningForEvents, METH_VARARGS, (char *)"SBListener_StartListeningForEvents(SBListener self, SBBroadcaster broadcaster, uint32_t event_mask) -> uint32_t"},
	 { (char *)"SBListener_StopListeningForEvents", _wrap_SBListener_StopListeningForEvents, METH_VARARGS, (char *)"SBListener_StopListeningForEvents(SBListener self, SBBroadcaster broadcaster, uint32_t event_mask) -> bool"},
	 { (char *)"SBListener_WaitForEvent", _wrap_SBListener_WaitForEvent, METH_VARARGS, (char *)"SBListener_WaitForEvent(SBListener self, uint32_t num_seconds, SBEvent event) -> bool"},
	 { (char *)"SBListener_WaitForEventForBroadcaster", _wrap_SBListener_WaitForEventForBroadcaster, METH_VARARGS, (char *)"\n"
		"SBListener_WaitForEventForBroadcaster(SBListener self, uint32_t num_seconds, SBBroadcaster broadcaster, \n"
		"    SBEvent sb_event) -> bool\n"
		""},
	 { (char *)"SBListener_WaitForEventForBroadcasterWithType", _wrap_SBListener_WaitForEventForBroadcasterWithType, METH_VARARGS, (char *)"\n"
		"SBListener_WaitForEventForBroadcasterWithType(SBListener self, uint32_t num_seconds, SBBroadcaster broadcaster, \n"
		"    uint32_t event_type_mask, SBEvent sb_event) -> bool\n"
		""},
	 { (char *)"SBListener_PeekAtNextEvent", _wrap_SBListener_PeekAtNextEvent, METH_VARARGS, (char *)"SBListener_PeekAtNextEvent(SBListener self, SBEvent sb_event) -> bool"},
	 { (char *)"SBListener_PeekAtNextEventForBroadcaster", _wrap_SBListener_PeekAtNextEventForBroadcaster, METH_VARARGS, (char *)"SBListener_PeekAtNextEventForBroadcaster(SBListener self, SBBroadcaster broadcaster, SBEvent sb_event) -> bool"},
	 { (char *)"SBListener_PeekAtNextEventForBroadcasterWithType", _wrap_SBListener_PeekAtNextEventForBroadcasterWithType, METH_VARARGS, (char *)"\n"
		"SBListener_PeekAtNextEventForBroadcasterWithType(SBListener self, SBBroadcaster broadcaster, uint32_t event_type_mask, \n"
		"    SBEvent sb_event) -> bool\n"
		""},
	 { (char *)"SBListener_GetNextEvent", _wrap_SBListener_GetNextEvent, METH_VARARGS, (char *)"SBListener_GetNextEvent(SBListener self, SBEvent sb_event) -> bool"},
	 { (char *)"SBListener_GetNextEventForBroadcaster", _wrap_SBListener_GetNextEventForBroadcaster, METH_VARARGS, (char *)"SBListener_GetNextEventForBroadcaster(SBListener self, SBBroadcaster broadcaster, SBEvent sb_event) -> bool"},
	 { (char *)"SBListener_GetNextEventForBroadcasterWithType", _wrap_SBListener_GetNextEventForBroadcasterWithType, METH_VARARGS, (char *)"\n"
		"SBListener_GetNextEventForBroadcasterWithType(SBListener self, SBBroadcaster broadcaster, uint32_t event_type_mask, \n"
		"    SBEvent sb_event) -> bool\n"
		""},
	 { (char *)"SBListener_HandleBroadcastEvent", _wrap_SBListener_HandleBroadcastEvent, METH_VARARGS, (char *)"SBListener_HandleBroadcastEvent(SBListener self, SBEvent event) -> bool"},
	 { (char *)"SBListener_swigregister", SBListener_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBMemoryRegionInfo", _wrap_new_SBMemoryRegionInfo, METH_VARARGS, (char *)"\n"
		"SBMemoryRegionInfo()\n"
		"new_SBMemoryRegionInfo(SBMemoryRegionInfo rhs) -> SBMemoryRegionInfo\n"
		""},
	 { (char *)"delete_SBMemoryRegionInfo", _wrap_delete_SBMemoryRegionInfo, METH_VARARGS, (char *)"delete_SBMemoryRegionInfo(SBMemoryRegionInfo self)"},
	 { (char *)"SBMemoryRegionInfo_Clear", _wrap_SBMemoryRegionInfo_Clear, METH_VARARGS, (char *)"SBMemoryRegionInfo_Clear(SBMemoryRegionInfo self)"},
	 { (char *)"SBMemoryRegionInfo_GetRegionBase", _wrap_SBMemoryRegionInfo_GetRegionBase, METH_VARARGS, (char *)"SBMemoryRegionInfo_GetRegionBase(SBMemoryRegionInfo self) -> addr_t"},
	 { (char *)"SBMemoryRegionInfo_GetRegionEnd", _wrap_SBMemoryRegionInfo_GetRegionEnd, METH_VARARGS, (char *)"SBMemoryRegionInfo_GetRegionEnd(SBMemoryRegionInfo self) -> addr_t"},
	 { (char *)"SBMemoryRegionInfo_IsReadable", _wrap_SBMemoryRegionInfo_IsReadable, METH_VARARGS, (char *)"SBMemoryRegionInfo_IsReadable(SBMemoryRegionInfo self) -> bool"},
	 { (char *)"SBMemoryRegionInfo_IsWritable", _wrap_SBMemoryRegionInfo_IsWritable, METH_VARARGS, (char *)"SBMemoryRegionInfo_IsWritable(SBMemoryRegionInfo self) -> bool"},
	 { (char *)"SBMemoryRegionInfo_IsExecutable", _wrap_SBMemoryRegionInfo_IsExecutable, METH_VARARGS, (char *)"SBMemoryRegionInfo_IsExecutable(SBMemoryRegionInfo self) -> bool"},
	 { (char *)"SBMemoryRegionInfo_IsMapped", _wrap_SBMemoryRegionInfo_IsMapped, METH_VARARGS, (char *)"SBMemoryRegionInfo_IsMapped(SBMemoryRegionInfo self) -> bool"},
	 { (char *)"SBMemoryRegionInfo___eq__", _wrap_SBMemoryRegionInfo___eq__, METH_VARARGS, (char *)"SBMemoryRegionInfo___eq__(SBMemoryRegionInfo self, SBMemoryRegionInfo rhs) -> bool"},
	 { (char *)"SBMemoryRegionInfo___ne__", _wrap_SBMemoryRegionInfo___ne__, METH_VARARGS, (char *)"SBMemoryRegionInfo___ne__(SBMemoryRegionInfo self, SBMemoryRegionInfo rhs) -> bool"},
	 { (char *)"SBMemoryRegionInfo_GetDescription", _wrap_SBMemoryRegionInfo_GetDescription, METH_VARARGS, (char *)"SBMemoryRegionInfo_GetDescription(SBMemoryRegionInfo self, SBStream description) -> bool"},
	 { (char *)"SBMemoryRegionInfo___str__", _wrap_SBMemoryRegionInfo___str__, METH_VARARGS, (char *)"SBMemoryRegionInfo___str__(SBMemoryRegionInfo self) -> PyObject"},
	 { (char *)"SBMemoryRegionInfo_swigregister", SBMemoryRegionInfo_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBMemoryRegionInfoList", _wrap_new_SBMemoryRegionInfoList, METH_VARARGS, (char *)"\n"
		"SBMemoryRegionInfoList()\n"
		"new_SBMemoryRegionInfoList(SBMemoryRegionInfoList rhs) -> SBMemoryRegionInfoList\n"
		""},
	 { (char *)"delete_SBMemoryRegionInfoList", _wrap_delete_SBMemoryRegionInfoList, METH_VARARGS, (char *)"delete_SBMemoryRegionInfoList(SBMemoryRegionInfoList self)"},
	 { (char *)"SBMemoryRegionInfoList_GetSize", _wrap_SBMemoryRegionInfoList_GetSize, METH_VARARGS, (char *)"SBMemoryRegionInfoList_GetSize(SBMemoryRegionInfoList self) -> uint32_t"},
	 { (char *)"SBMemoryRegionInfoList_GetMemoryRegionAtIndex", _wrap_SBMemoryRegionInfoList_GetMemoryRegionAtIndex, METH_VARARGS, (char *)"SBMemoryRegionInfoList_GetMemoryRegionAtIndex(SBMemoryRegionInfoList self, uint32_t idx, SBMemoryRegionInfo region_info) -> bool"},
	 { (char *)"SBMemoryRegionInfoList_Append", _wrap_SBMemoryRegionInfoList_Append, METH_VARARGS, (char *)"\n"
		"Append(SBMemoryRegionInfo region)\n"
		"SBMemoryRegionInfoList_Append(SBMemoryRegionInfoList self, SBMemoryRegionInfoList region_list)\n"
		""},
	 { (char *)"SBMemoryRegionInfoList_Clear", _wrap_SBMemoryRegionInfoList_Clear, METH_VARARGS, (char *)"SBMemoryRegionInfoList_Clear(SBMemoryRegionInfoList self)"},
	 { (char *)"SBMemoryRegionInfoList_swigregister", SBMemoryRegionInfoList_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBModule", _wrap_new_SBModule, METH_VARARGS, (char *)"\n"
		"SBModule()\n"
		"SBModule(SBModule rhs)\n"
		"SBModule(SBModuleSpec module_spec)\n"
		"new_SBModule(SBProcess process, addr_t header_addr) -> SBModule\n"
		""},
	 { (char *)"delete_SBModule", _wrap_delete_SBModule, METH_VARARGS, (char *)"delete_SBModule(SBModule self)"},
	 { (char *)"SBModule_IsValid", _wrap_SBModule_IsValid, METH_VARARGS, (char *)"SBModule_IsValid(SBModule self) -> bool"},
	 { (char *)"SBModule_Clear", _wrap_SBModule_Clear, METH_VARARGS, (char *)"SBModule_Clear(SBModule self)"},
	 { (char *)"SBModule_GetFileSpec", _wrap_SBModule_GetFileSpec, METH_VARARGS, (char *)"\n"
		"SBModule_GetFileSpec(SBModule self) -> SBFileSpec\n"
		"\n"
		"//------------------------------------------------------------------\n"
		"/// Get const accessor for the module file specification.\n"
		"///\n"
		"/// This function returns the file for the module on the host system\n"
		"/// that is running LLDB. This can differ from the path on the \n"
		"/// platform since we might be doing remote debugging.\n"
		"///\n"
		"/// @return\n"
		"///     A const reference to the file specification object.\n"
		"//------------------------------------------------------------------\n"
		"\n"
		""},
	 { (char *)"SBModule_GetPlatformFileSpec", _wrap_SBModule_GetPlatformFileSpec, METH_VARARGS, (char *)"\n"
		"SBModule_GetPlatformFileSpec(SBModule self) -> SBFileSpec\n"
		"\n"
		"//------------------------------------------------------------------\n"
		"/// Get accessor for the module platform file specification.\n"
		"///\n"
		"/// Platform file refers to the path of the module as it is known on\n"
		"/// the remote system on which it is being debugged. For local \n"
		"/// debugging this is always the same as Module::GetFileSpec(). But\n"
		"/// remote debugging might mention a file '/usr/lib/liba.dylib'\n"
		"/// which might be locally downloaded and cached. In this case the\n"
		"/// platform file could be something like:\n"
		"/// '/tmp/lldb/platform-cache/remote.host.computer/usr/lib/liba.dylib'\n"
		"/// The file could also be cached in a local developer kit directory.\n"
		"///\n"
		"/// @return\n"
		"///     A const reference to the file specification object.\n"
		"//------------------------------------------------------------------\n"
		"\n"
		""},
	 { (char *)"SBModule_SetPlatformFileSpec", _wrap_SBModule_SetPlatformFileSpec, METH_VARARGS, (char *)"SBModule_SetPlatformFileSpec(SBModule self, SBFileSpec platform_file) -> bool"},
	 { (char *)"SBModule_GetRemoteInstallFileSpec", _wrap_SBModule_GetRemoteInstallFileSpec, METH_VARARGS, (char *)"SBModule_GetRemoteInstallFileSpec(SBModule self) -> SBFileSpec"},
	 { (char *)"SBModule_SetRemoteInstallFileSpec", _wrap_SBModule_SetRemoteInstallFileSpec, METH_VARARGS, (char *)"SBModule_SetRemoteInstallFileSpec(SBModule self, SBFileSpec file) -> bool"},
	 { (char *)"SBModule_GetUUIDString", _wrap_SBModule_GetUUIDString, METH_VARARGS, (char *)"\n"
		"SBModule_GetUUIDString(SBModule self) -> char\n"
		"\n"
		"Returns the UUID of the module as a Python string.\n"
		""},
	 { (char *)"SBModule_FindSection", _wrap_SBModule_FindSection, METH_VARARGS, (char *)"SBModule_FindSection(SBModule self, char sect_name) -> SBSection"},
	 { (char *)"SBModule_ResolveFileAddress", _wrap_SBModule_ResolveFileAddress, METH_VARARGS, (char *)"SBModule_ResolveFileAddress(SBModule self, addr_t vm_addr) -> SBAddress"},
	 { (char *)"SBModule_ResolveSymbolContextForAddress", _wrap_SBModule_ResolveSymbolContextForAddress, METH_VARARGS, (char *)"SBModule_ResolveSymbolContextForAddress(SBModule self, SBAddress addr, uint32_t resolve_scope) -> SBSymbolContext"},
	 { (char *)"SBModule_GetDescription", _wrap_SBModule_GetDescription, METH_VARARGS, (char *)"SBModule_GetDescription(SBModule self, SBStream description) -> bool"},
	 { (char *)"SBModule_GetNumCompileUnits", _wrap_SBModule_GetNumCompileUnits, METH_VARARGS, (char *)"SBModule_GetNumCompileUnits(SBModule self) -> uint32_t"},
	 { (char *)"SBModule_GetCompileUnitAtIndex", _wrap_SBModule_GetCompileUnitAtIndex, METH_VARARGS, (char *)"SBModule_GetCompileUnitAtIndex(SBModule self, uint32_t arg1) -> SBCompileUnit"},
	 { (char *)"SBModule_GetNumSymbols", _wrap_SBModule_GetNumSymbols, METH_VARARGS, (char *)"SBModule_GetNumSymbols(SBModule self) -> size_t"},
	 { (char *)"SBModule_GetSymbolAtIndex", _wrap_SBModule_GetSymbolAtIndex, METH_VARARGS, (char *)"SBModule_GetSymbolAtIndex(SBModule self, size_t idx) -> SBSymbol"},
	 { (char *)"SBModule_FindSymbol", _wrap_SBModule_FindSymbol, METH_VARARGS, (char *)"\n"
		"FindSymbol(char name, SymbolType type = eSymbolTypeAny) -> SBSymbol\n"
		"SBModule_FindSymbol(SBModule self, char name) -> SBSymbol\n"
		""},
	 { (char *)"SBModule_FindSymbols", _wrap_SBModule_FindSymbols, METH_VARARGS, (char *)"\n"
		"FindSymbols(char name, SymbolType type = eSymbolTypeAny) -> SBSymbolContextList\n"
		"SBModule_FindSymbols(SBModule self, char name) -> SBSymbolContextList\n"
		""},
	 { (char *)"SBModule_GetNumSections", _wrap_SBModule_GetNumSections, METH_VARARGS, (char *)"SBModule_GetNumSections(SBModule self) -> size_t"},
	 { (char *)"SBModule_GetSectionAtIndex", _wrap_SBModule_GetSectionAtIndex, METH_VARARGS, (char *)"SBModule_GetSectionAtIndex(SBModule self, size_t idx) -> SBSection"},
	 { (char *)"SBModule_FindFunctions", _wrap_SBModule_FindFunctions, METH_VARARGS, (char *)"\n"
		"FindFunctions(char name, uint32_t name_type_mask = eFunctionNameTypeAny) -> SBSymbolContextList\n"
		"SBModule_FindFunctions(SBModule self, char name) -> SBSymbolContextList\n"
		"\n"
		"//------------------------------------------------------------------\n"
		"/// Find functions by name.\n"
		"///\n"
		"/// @param[in] name\n"
		"///     The name of the function we are looking for.\n"
		"///\n"
		"/// @param[in] name_type_mask\n"
		"///     A logical OR of one or more FunctionNameType enum bits that\n"
		"///     indicate what kind of names should be used when doing the\n"
		"///     lookup. Bits include fully qualified names, base names,\n"
		"///     C++ methods, or ObjC selectors. \n"
		"///     See FunctionNameType for more details.\n"
		"///\n"
		"/// @return\n"
		"///     A symbol context list that gets filled in with all of the\n"
		"///     matches.\n"
		"//------------------------------------------------------------------\n"
		"\n"
		""},
	 { (char *)"SBModule_FindFirstType", _wrap_SBModule_FindFirstType, METH_VARARGS, (char *)"SBModule_FindFirstType(SBModule self, char name) -> SBType"},
	 { (char *)"SBModule_FindTypes", _wrap_SBModule_FindTypes, METH_VARARGS, (char *)"SBModule_FindTypes(SBModule self, char type) -> SBTypeList"},
	 { (char *)"SBModule_GetTypeByID", _wrap_SBModule_GetTypeByID, METH_VARARGS, (char *)"SBModule_GetTypeByID(SBModule self, user_id_t uid) -> SBType"},
	 { (char *)"SBModule_GetBasicType", _wrap_SBModule_GetBasicType, METH_VARARGS, (char *)"SBModule_GetBasicType(SBModule self, BasicType type) -> SBType"},
	 { (char *)"SBModule_GetTypes", _wrap_SBModule_GetTypes, METH_VARARGS, (char *)"\n"
		"GetTypes(uint32_t type_mask = eTypeClassAny) -> SBTypeList\n"
		"SBModule_GetTypes(SBModule self) -> SBTypeList\n"
		"\n"
		"//------------------------------------------------------------------\n"
		"/// Get all types matching  type_mask from debug info in this\n"
		"/// module.\n"
		"///\n"
		"/// @param[in] type_mask\n"
		"///     A bitfield that consists of one or more bits logically OR'ed\n"
		"///     together from the lldb::TypeClass enumeration. This allows\n"
		"///     you to request only structure types, or only class, struct\n"
		"///     and union types. Passing in lldb::eTypeClassAny will return\n"
		"///     all types found in the debug information for this module.\n"
		"///\n"
		"/// @return\n"
		"///     A list of types in this module that match  type_mask\n"
		"//------------------------------------------------------------------\n"
		"\n"
		""},
	 { (char *)"SBModule_FindGlobalVariables", _wrap_SBModule_FindGlobalVariables, METH_VARARGS, (char *)"\n"
		"SBModule_FindGlobalVariables(SBModule self, SBTarget target, char name, uint32_t max_matches) -> SBValueList\n"
		"\n"
		"//------------------------------------------------------------------\n"
		"/// Find global and static variables by name.\n"
		"///\n"
		"/// @param[in] target\n"
		"///     A valid SBTarget instance representing the debuggee.\n"
		"///\n"
		"/// @param[in] name\n"
		"///     The name of the global or static variable we are looking\n"
		"///     for.\n"
		"///\n"
		"/// @param[in] max_matches\n"
		"///     Allow the number of matches to be limited to  max_matches.\n"
		"///\n"
		"/// @return\n"
		"///     A list of matched variables in an SBValueList.\n"
		"//------------------------------------------------------------------\n"
		"\n"
		""},
	 { (char *)"SBModule_FindFirstGlobalVariable", _wrap_SBModule_FindFirstGlobalVariable, METH_VARARGS, (char *)"\n"
		"SBModule_FindFirstGlobalVariable(SBModule self, SBTarget target, char name) -> SBValue\n"
		"\n"
		"//------------------------------------------------------------------\n"
		"/// Find the first global (or static) variable by name.\n"
		"///\n"
		"/// @param[in] target\n"
		"///     A valid SBTarget instance representing the debuggee.\n"
		"///\n"
		"/// @param[in] name\n"
		"///     The name of the global or static variable we are looking\n"
		"///     for.\n"
		"///\n"
		"/// @return\n"
		"///     An SBValue that gets filled in with the found variable (if any).\n"
		"//------------------------------------------------------------------\n"
		"\n"
		""},
	 { (char *)"SBModule_GetByteOrder", _wrap_SBModule_GetByteOrder, METH_VARARGS, (char *)"SBModule_GetByteOrder(SBModule self) -> ByteOrder"},
	 { (char *)"SBModule_GetAddressByteSize", _wrap_SBModule_GetAddressByteSize, METH_VARARGS, (char *)"SBModule_GetAddressByteSize(SBModule self) -> uint32_t"},
	 { (char *)"SBModule_GetTriple", _wrap_SBModule_GetTriple, METH_VARARGS, (char *)"SBModule_GetTriple(SBModule self) -> char"},
	 { (char *)"SBModule_GetVersion", _wrap_SBModule_GetVersion, METH_VARARGS, (char *)"SBModule_GetVersion(SBModule self) -> uint32_t"},
	 { (char *)"SBModule_GetSymbolFileSpec", _wrap_SBModule_GetSymbolFileSpec, METH_VARARGS, (char *)"SBModule_GetSymbolFileSpec(SBModule self) -> SBFileSpec"},
	 { (char *)"SBModule_GetObjectFileHeaderAddress", _wrap_SBModule_GetObjectFileHeaderAddress, METH_VARARGS, (char *)"SBModule_GetObjectFileHeaderAddress(SBModule self) -> SBAddress"},
	 { (char *)"SBModule_IsTypeSystemCompatible", _wrap_SBModule_IsTypeSystemCompatible, METH_VARARGS, (char *)"SBModule_IsTypeSystemCompatible(SBModule self, LanguageType language) -> SBError"},
	 { (char *)"SBModule___eq__", _wrap_SBModule___eq__, METH_VARARGS, (char *)"SBModule___eq__(SBModule self, SBModule rhs) -> bool"},
	 { (char *)"SBModule___ne__", _wrap_SBModule___ne__, METH_VARARGS, (char *)"SBModule___ne__(SBModule self, SBModule rhs) -> bool"},
	 { (char *)"SBModule___str__", _wrap_SBModule___str__, METH_VARARGS, (char *)"SBModule___str__(SBModule self) -> PyObject"},
	 { (char *)"SBModule_swigregister", SBModule_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBModuleSpec", _wrap_new_SBModuleSpec, METH_VARARGS, (char *)"\n"
		"SBModuleSpec()\n"
		"new_SBModuleSpec(SBModuleSpec rhs) -> SBModuleSpec\n"
		""},
	 { (char *)"delete_SBModuleSpec", _wrap_delete_SBModuleSpec, METH_VARARGS, (char *)"delete_SBModuleSpec(SBModuleSpec self)"},
	 { (char *)"SBModuleSpec_IsValid", _wrap_SBModuleSpec_IsValid, METH_VARARGS, (char *)"SBModuleSpec_IsValid(SBModuleSpec self) -> bool"},
	 { (char *)"SBModuleSpec_Clear", _wrap_SBModuleSpec_Clear, METH_VARARGS, (char *)"SBModuleSpec_Clear(SBModuleSpec self)"},
	 { (char *)"SBModuleSpec_GetFileSpec", _wrap_SBModuleSpec_GetFileSpec, METH_VARARGS, (char *)"SBModuleSpec_GetFileSpec(SBModuleSpec self) -> SBFileSpec"},
	 { (char *)"SBModuleSpec_SetFileSpec", _wrap_SBModuleSpec_SetFileSpec, METH_VARARGS, (char *)"SBModuleSpec_SetFileSpec(SBModuleSpec self, SBFileSpec fspec)"},
	 { (char *)"SBModuleSpec_GetPlatformFileSpec", _wrap_SBModuleSpec_GetPlatformFileSpec, METH_VARARGS, (char *)"SBModuleSpec_GetPlatformFileSpec(SBModuleSpec self) -> SBFileSpec"},
	 { (char *)"SBModuleSpec_SetPlatformFileSpec", _wrap_SBModuleSpec_SetPlatformFileSpec, METH_VARARGS, (char *)"SBModuleSpec_SetPlatformFileSpec(SBModuleSpec self, SBFileSpec fspec)"},
	 { (char *)"SBModuleSpec_GetSymbolFileSpec", _wrap_SBModuleSpec_GetSymbolFileSpec, METH_VARARGS, (char *)"SBModuleSpec_GetSymbolFileSpec(SBModuleSpec self) -> SBFileSpec"},
	 { (char *)"SBModuleSpec_SetSymbolFileSpec", _wrap_SBModuleSpec_SetSymbolFileSpec, METH_VARARGS, (char *)"SBModuleSpec_SetSymbolFileSpec(SBModuleSpec self, SBFileSpec fspec)"},
	 { (char *)"SBModuleSpec_GetObjectName", _wrap_SBModuleSpec_GetObjectName, METH_VARARGS, (char *)"SBModuleSpec_GetObjectName(SBModuleSpec self) -> char"},
	 { (char *)"SBModuleSpec_SetObjectName", _wrap_SBModuleSpec_SetObjectName, METH_VARARGS, (char *)"SBModuleSpec_SetObjectName(SBModuleSpec self, char name)"},
	 { (char *)"SBModuleSpec_GetTriple", _wrap_SBModuleSpec_GetTriple, METH_VARARGS, (char *)"SBModuleSpec_GetTriple(SBModuleSpec self) -> char"},
	 { (char *)"SBModuleSpec_SetTriple", _wrap_SBModuleSpec_SetTriple, METH_VARARGS, (char *)"SBModuleSpec_SetTriple(SBModuleSpec self, char triple)"},
	 { (char *)"SBModuleSpec_GetUUIDBytes", _wrap_SBModuleSpec_GetUUIDBytes, METH_VARARGS, (char *)"SBModuleSpec_GetUUIDBytes(SBModuleSpec self) -> uint8_t"},
	 { (char *)"SBModuleSpec_GetUUIDLength", _wrap_SBModuleSpec_GetUUIDLength, METH_VARARGS, (char *)"SBModuleSpec_GetUUIDLength(SBModuleSpec self) -> size_t"},
	 { (char *)"SBModuleSpec_SetUUIDBytes", _wrap_SBModuleSpec_SetUUIDBytes, METH_VARARGS, (char *)"SBModuleSpec_SetUUIDBytes(SBModuleSpec self, uint8_t uuid, size_t uuid_len) -> bool"},
	 { (char *)"SBModuleSpec_GetDescription", _wrap_SBModuleSpec_GetDescription, METH_VARARGS, (char *)"SBModuleSpec_GetDescription(SBModuleSpec self, SBStream description) -> bool"},
	 { (char *)"SBModuleSpec___str__", _wrap_SBModuleSpec___str__, METH_VARARGS, (char *)"SBModuleSpec___str__(SBModuleSpec self) -> PyObject"},
	 { (char *)"SBModuleSpec_swigregister", SBModuleSpec_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBModuleSpecList", _wrap_new_SBModuleSpecList, METH_VARARGS, (char *)"\n"
		"SBModuleSpecList()\n"
		"new_SBModuleSpecList(SBModuleSpecList rhs) -> SBModuleSpecList\n"
		""},
	 { (char *)"delete_SBModuleSpecList", _wrap_delete_SBModuleSpecList, METH_VARARGS, (char *)"delete_SBModuleSpecList(SBModuleSpecList self)"},
	 { (char *)"SBModuleSpecList_GetModuleSpecifications", _wrap_SBModuleSpecList_GetModuleSpecifications, METH_VARARGS, (char *)"SBModuleSpecList_GetModuleSpecifications(char path) -> SBModuleSpecList"},
	 { (char *)"SBModuleSpecList_Append", _wrap_SBModuleSpecList_Append, METH_VARARGS, (char *)"\n"
		"Append(SBModuleSpec spec)\n"
		"SBModuleSpecList_Append(SBModuleSpecList self, SBModuleSpecList spec_list)\n"
		""},
	 { (char *)"SBModuleSpecList_FindFirstMatchingSpec", _wrap_SBModuleSpecList_FindFirstMatchingSpec, METH_VARARGS, (char *)"SBModuleSpecList_FindFirstMatchingSpec(SBModuleSpecList self, SBModuleSpec match_spec) -> SBModuleSpec"},
	 { (char *)"SBModuleSpecList_FindMatchingSpecs", _wrap_SBModuleSpecList_FindMatchingSpecs, METH_VARARGS, (char *)"SBModuleSpecList_FindMatchingSpecs(SBModuleSpecList self, SBModuleSpec match_spec) -> SBModuleSpecList"},
	 { (char *)"SBModuleSpecList_GetSize", _wrap_SBModuleSpecList_GetSize, METH_VARARGS, (char *)"SBModuleSpecList_GetSize(SBModuleSpecList self) -> size_t"},
	 { (char *)"SBModuleSpecList_GetSpecAtIndex", _wrap_SBModuleSpecList_GetSpecAtIndex, METH_VARARGS, (char *)"SBModuleSpecList_GetSpecAtIndex(SBModuleSpecList self, size_t i) -> SBModuleSpec"},
	 { (char *)"SBModuleSpecList_GetDescription", _wrap_SBModuleSpecList_GetDescription, METH_VARARGS, (char *)"SBModuleSpecList_GetDescription(SBModuleSpecList self, SBStream description) -> bool"},
	 { (char *)"SBModuleSpecList___str__", _wrap_SBModuleSpecList___str__, METH_VARARGS, (char *)"SBModuleSpecList___str__(SBModuleSpecList self) -> PyObject"},
	 { (char *)"SBModuleSpecList_swigregister", SBModuleSpecList_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBPlatformConnectOptions", _wrap_new_SBPlatformConnectOptions, METH_VARARGS, (char *)"\n"
		"SBPlatformConnectOptions(char url)\n"
		"new_SBPlatformConnectOptions(SBPlatformConnectOptions rhs) -> SBPlatformConnectOptions\n"
		""},
	 { (char *)"delete_SBPlatformConnectOptions", _wrap_delete_SBPlatformConnectOptions, METH_VARARGS, (char *)"delete_SBPlatformConnectOptions(SBPlatformConnectOptions self)"},
	 { (char *)"SBPlatformConnectOptions_GetURL", _wrap_SBPlatformConnectOptions_GetURL, METH_VARARGS, (char *)"SBPlatformConnectOptions_GetURL(SBPlatformConnectOptions self) -> char"},
	 { (char *)"SBPlatformConnectOptions_SetURL", _wrap_SBPlatformConnectOptions_SetURL, METH_VARARGS, (char *)"SBPlatformConnectOptions_SetURL(SBPlatformConnectOptions self, char url)"},
	 { (char *)"SBPlatformConnectOptions_GetRsyncEnabled", _wrap_SBPlatformConnectOptions_GetRsyncEnabled, METH_VARARGS, (char *)"SBPlatformConnectOptions_GetRsyncEnabled(SBPlatformConnectOptions self) -> bool"},
	 { (char *)"SBPlatformConnectOptions_EnableRsync", _wrap_SBPlatformConnectOptions_EnableRsync, METH_VARARGS, (char *)"\n"
		"SBPlatformConnectOptions_EnableRsync(SBPlatformConnectOptions self, char options, char remote_path_prefix, \n"
		"    bool omit_remote_hostname)\n"
		""},
	 { (char *)"SBPlatformConnectOptions_DisableRsync", _wrap_SBPlatformConnectOptions_DisableRsync, METH_VARARGS, (char *)"SBPlatformConnectOptions_DisableRsync(SBPlatformConnectOptions self)"},
	 { (char *)"SBPlatformConnectOptions_GetLocalCacheDirectory", _wrap_SBPlatformConnectOptions_GetLocalCacheDirectory, METH_VARARGS, (char *)"SBPlatformConnectOptions_GetLocalCacheDirectory(SBPlatformConnectOptions self) -> char"},
	 { (char *)"SBPlatformConnectOptions_SetLocalCacheDirectory", _wrap_SBPlatformConnectOptions_SetLocalCacheDirectory, METH_VARARGS, (char *)"SBPlatformConnectOptions_SetLocalCacheDirectory(SBPlatformConnectOptions self, char path)"},
	 { (char *)"SBPlatformConnectOptions_swigregister", SBPlatformConnectOptions_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBPlatformShellCommand", _wrap_new_SBPlatformShellCommand, METH_VARARGS, (char *)"\n"
		"SBPlatformShellCommand(char shell_command)\n"
		"new_SBPlatformShellCommand(SBPlatformShellCommand rhs) -> SBPlatformShellCommand\n"
		""},
	 { (char *)"delete_SBPlatformShellCommand", _wrap_delete_SBPlatformShellCommand, METH_VARARGS, (char *)"delete_SBPlatformShellCommand(SBPlatformShellCommand self)"},
	 { (char *)"SBPlatformShellCommand_Clear", _wrap_SBPlatformShellCommand_Clear, METH_VARARGS, (char *)"SBPlatformShellCommand_Clear(SBPlatformShellCommand self)"},
	 { (char *)"SBPlatformShellCommand_GetCommand", _wrap_SBPlatformShellCommand_GetCommand, METH_VARARGS, (char *)"SBPlatformShellCommand_GetCommand(SBPlatformShellCommand self) -> char"},
	 { (char *)"SBPlatformShellCommand_SetCommand", _wrap_SBPlatformShellCommand_SetCommand, METH_VARARGS, (char *)"SBPlatformShellCommand_SetCommand(SBPlatformShellCommand self, char shell_command)"},
	 { (char *)"SBPlatformShellCommand_GetWorkingDirectory", _wrap_SBPlatformShellCommand_GetWorkingDirectory, METH_VARARGS, (char *)"SBPlatformShellCommand_GetWorkingDirectory(SBPlatformShellCommand self) -> char"},
	 { (char *)"SBPlatformShellCommand_SetWorkingDirectory", _wrap_SBPlatformShellCommand_SetWorkingDirectory, METH_VARARGS, (char *)"SBPlatformShellCommand_SetWorkingDirectory(SBPlatformShellCommand self, char path)"},
	 { (char *)"SBPlatformShellCommand_GetTimeoutSeconds", _wrap_SBPlatformShellCommand_GetTimeoutSeconds, METH_VARARGS, (char *)"SBPlatformShellCommand_GetTimeoutSeconds(SBPlatformShellCommand self) -> uint32_t"},
	 { (char *)"SBPlatformShellCommand_SetTimeoutSeconds", _wrap_SBPlatformShellCommand_SetTimeoutSeconds, METH_VARARGS, (char *)"SBPlatformShellCommand_SetTimeoutSeconds(SBPlatformShellCommand self, uint32_t sec)"},
	 { (char *)"SBPlatformShellCommand_GetSignal", _wrap_SBPlatformShellCommand_GetSignal, METH_VARARGS, (char *)"SBPlatformShellCommand_GetSignal(SBPlatformShellCommand self) -> int"},
	 { (char *)"SBPlatformShellCommand_GetStatus", _wrap_SBPlatformShellCommand_GetStatus, METH_VARARGS, (char *)"SBPlatformShellCommand_GetStatus(SBPlatformShellCommand self) -> int"},
	 { (char *)"SBPlatformShellCommand_GetOutput", _wrap_SBPlatformShellCommand_GetOutput, METH_VARARGS, (char *)"SBPlatformShellCommand_GetOutput(SBPlatformShellCommand self) -> char"},
	 { (char *)"SBPlatformShellCommand_swigregister", SBPlatformShellCommand_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBPlatform", _wrap_new_SBPlatform, METH_VARARGS, (char *)"\n"
		"SBPlatform()\n"
		"new_SBPlatform(char arg0) -> SBPlatform\n"
		""},
	 { (char *)"delete_SBPlatform", _wrap_delete_SBPlatform, METH_VARARGS, (char *)"delete_SBPlatform(SBPlatform self)"},
	 { (char *)"SBPlatform_IsValid", _wrap_SBPlatform_IsValid, METH_VARARGS, (char *)"SBPlatform_IsValid(SBPlatform self) -> bool"},
	 { (char *)"SBPlatform_Clear", _wrap_SBPlatform_Clear, METH_VARARGS, (char *)"SBPlatform_Clear(SBPlatform self)"},
	 { (char *)"SBPlatform_GetWorkingDirectory", _wrap_SBPlatform_GetWorkingDirectory, METH_VARARGS, (char *)"SBPlatform_GetWorkingDirectory(SBPlatform self) -> char"},
	 { (char *)"SBPlatform_SetWorkingDirectory", _wrap_SBPlatform_SetWorkingDirectory, METH_VARARGS, (char *)"SBPlatform_SetWorkingDirectory(SBPlatform self, char arg1) -> bool"},
	 { (char *)"SBPlatform_GetName", _wrap_SBPlatform_GetName, METH_VARARGS, (char *)"SBPlatform_GetName(SBPlatform self) -> char"},
	 { (char *)"SBPlatform_ConnectRemote", _wrap_SBPlatform_ConnectRemote, METH_VARARGS, (char *)"SBPlatform_ConnectRemote(SBPlatform self, SBPlatformConnectOptions connect_options) -> SBError"},
	 { (char *)"SBPlatform_DisconnectRemote", _wrap_SBPlatform_DisconnectRemote, METH_VARARGS, (char *)"SBPlatform_DisconnectRemote(SBPlatform self)"},
	 { (char *)"SBPlatform_IsConnected", _wrap_SBPlatform_IsConnected, METH_VARARGS, (char *)"SBPlatform_IsConnected(SBPlatform self) -> bool"},
	 { (char *)"SBPlatform_GetTriple", _wrap_SBPlatform_GetTriple, METH_VARARGS, (char *)"SBPlatform_GetTriple(SBPlatform self) -> char"},
	 { (char *)"SBPlatform_GetHostname", _wrap_SBPlatform_GetHostname, METH_VARARGS, (char *)"SBPlatform_GetHostname(SBPlatform self) -> char"},
	 { (char *)"SBPlatform_GetOSBuild", _wrap_SBPlatform_GetOSBuild, METH_VARARGS, (char *)"SBPlatform_GetOSBuild(SBPlatform self) -> char"},
	 { (char *)"SBPlatform_GetOSDescription", _wrap_SBPlatform_GetOSDescription, METH_VARARGS, (char *)"SBPlatform_GetOSDescription(SBPlatform self) -> char"},
	 { (char *)"SBPlatform_GetOSMajorVersion", _wrap_SBPlatform_GetOSMajorVersion, METH_VARARGS, (char *)"SBPlatform_GetOSMajorVersion(SBPlatform self) -> uint32_t"},
	 { (char *)"SBPlatform_GetOSMinorVersion", _wrap_SBPlatform_GetOSMinorVersion, METH_VARARGS, (char *)"SBPlatform_GetOSMinorVersion(SBPlatform self) -> uint32_t"},
	 { (char *)"SBPlatform_GetOSUpdateVersion", _wrap_SBPlatform_GetOSUpdateVersion, METH_VARARGS, (char *)"SBPlatform_GetOSUpdateVersion(SBPlatform self) -> uint32_t"},
	 { (char *)"SBPlatform_Get", _wrap_SBPlatform_Get, METH_VARARGS, (char *)"SBPlatform_Get(SBPlatform self, SBFileSpec src, SBFileSpec dst) -> SBError"},
	 { (char *)"SBPlatform_Put", _wrap_SBPlatform_Put, METH_VARARGS, (char *)"SBPlatform_Put(SBPlatform self, SBFileSpec src, SBFileSpec dst) -> SBError"},
	 { (char *)"SBPlatform_Install", _wrap_SBPlatform_Install, METH_VARARGS, (char *)"SBPlatform_Install(SBPlatform self, SBFileSpec src, SBFileSpec dst) -> SBError"},
	 { (char *)"SBPlatform_Run", _wrap_SBPlatform_Run, METH_VARARGS, (char *)"SBPlatform_Run(SBPlatform self, SBPlatformShellCommand shell_command) -> SBError"},
	 { (char *)"SBPlatform_Launch", _wrap_SBPlatform_Launch, METH_VARARGS, (char *)"SBPlatform_Launch(SBPlatform self, SBLaunchInfo launch_info) -> SBError"},
	 { (char *)"SBPlatform_Kill", _wrap_SBPlatform_Kill, METH_VARARGS, (char *)"SBPlatform_Kill(SBPlatform self, pid_t pid) -> SBError"},
	 { (char *)"SBPlatform_MakeDirectory", _wrap_SBPlatform_MakeDirectory, METH_VARARGS, (char *)"\n"
		"MakeDirectory(char path, uint32_t file_permissions = eFilePermissionsDirectoryDefault) -> SBError\n"
		"SBPlatform_MakeDirectory(SBPlatform self, char path) -> SBError\n"
		""},
	 { (char *)"SBPlatform_GetFilePermissions", _wrap_SBPlatform_GetFilePermissions, METH_VARARGS, (char *)"SBPlatform_GetFilePermissions(SBPlatform self, char path) -> uint32_t"},
	 { (char *)"SBPlatform_SetFilePermissions", _wrap_SBPlatform_SetFilePermissions, METH_VARARGS, (char *)"SBPlatform_SetFilePermissions(SBPlatform self, char path, uint32_t file_permissions) -> SBError"},
	 { (char *)"SBPlatform_GetUnixSignals", _wrap_SBPlatform_GetUnixSignals, METH_VARARGS, (char *)"SBPlatform_GetUnixSignals(SBPlatform self) -> SBUnixSignals"},
	 { (char *)"SBPlatform_swigregister", SBPlatform_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBProcess", _wrap_new_SBProcess, METH_VARARGS, (char *)"\n"
		"SBProcess()\n"
		"new_SBProcess(SBProcess rhs) -> SBProcess\n"
		""},
	 { (char *)"delete_SBProcess", _wrap_delete_SBProcess, METH_VARARGS, (char *)"delete_SBProcess(SBProcess self)"},
	 { (char *)"SBProcess_GetBroadcasterClassName", _wrap_SBProcess_GetBroadcasterClassName, METH_VARARGS, (char *)"SBProcess_GetBroadcasterClassName() -> char"},
	 { (char *)"SBProcess_GetPluginName", _wrap_SBProcess_GetPluginName, METH_VARARGS, (char *)"SBProcess_GetPluginName(SBProcess self) -> char"},
	 { (char *)"SBProcess_GetShortPluginName", _wrap_SBProcess_GetShortPluginName, METH_VARARGS, (char *)"SBProcess_GetShortPluginName(SBProcess self) -> char"},
	 { (char *)"SBProcess_Clear", _wrap_SBProcess_Clear, METH_VARARGS, (char *)"SBProcess_Clear(SBProcess self)"},
	 { (char *)"SBProcess_IsValid", _wrap_SBProcess_IsValid, METH_VARARGS, (char *)"SBProcess_IsValid(SBProcess self) -> bool"},
	 { (char *)"SBProcess_GetTarget", _wrap_SBProcess_GetTarget, METH_VARARGS, (char *)"SBProcess_GetTarget(SBProcess self) -> SBTarget"},
	 { (char *)"SBProcess_GetByteOrder", _wrap_SBProcess_GetByteOrder, METH_VARARGS, (char *)"SBProcess_GetByteOrder(SBProcess self) -> ByteOrder"},
	 { (char *)"SBProcess_PutSTDIN", _wrap_SBProcess_PutSTDIN, METH_VARARGS, (char *)"\n"
		"Writes data into the current process's stdin. API client specifies a Python\n"
		"string as the only argument.\n"
		"\n"
		""},
	 { (char *)"SBProcess_GetSTDOUT", _wrap_SBProcess_GetSTDOUT, METH_VARARGS, (char *)"\n"
		"Reads data from the current process's stdout stream. API client specifies\n"
		"the size of the buffer to read data into. It returns the byte buffer in a\n"
		"Python string.\n"
		"\n"
		""},
	 { (char *)"SBProcess_GetSTDERR", _wrap_SBProcess_GetSTDERR, METH_VARARGS, (char *)"\n"
		"Reads data from the current process's stderr stream. API client specifies\n"
		"the size of the buffer to read data into. It returns the byte buffer in a\n"
		"Python string.\n"
		"\n"
		""},
	 { (char *)"SBProcess_GetAsyncProfileData", _wrap_SBProcess_GetAsyncProfileData, METH_VARARGS, (char *)"SBProcess_GetAsyncProfileData(SBProcess self, char dst) -> size_t"},
	 { (char *)"SBProcess_ReportEventState", _wrap_SBProcess_ReportEventState, METH_VARARGS, (char *)"SBProcess_ReportEventState(SBProcess self, SBEvent event, FILE out)"},
	 { (char *)"SBProcess_AppendEventStateReport", _wrap_SBProcess_AppendEventStateReport, METH_VARARGS, (char *)"SBProcess_AppendEventStateReport(SBProcess self, SBEvent event, SBCommandReturnObject result)"},
	 { (char *)"SBProcess_RemoteAttachToProcessWithID", _wrap_SBProcess_RemoteAttachToProcessWithID, METH_VARARGS, (char *)"\n"
		"SBProcess_RemoteAttachToProcessWithID(SBProcess self, pid_t pid, SBError error) -> bool\n"
		"\n"
		"//------------------------------------------------------------------\n"
		"/// Remote connection related functions. These will fail if the\n"
		"/// process is not in eStateConnected. They are intended for use\n"
		"/// when connecting to an externally managed debugserver instance.\n"
		"//------------------------------------------------------------------\n"
		"\n"
		""},
	 { (char *)"SBProcess_RemoteLaunch", _wrap_SBProcess_RemoteLaunch, METH_VARARGS, (char *)"\n"
		"SBProcess_RemoteLaunch(SBProcess self, char argv, char envp, char stdin_path, \n"
		"    char stdout_path, char stderr_path, char working_directory, \n"
		"    uint32_t launch_flags, bool stop_at_entry, \n"
		"    SBError error) -> bool\n"
		"\n"
		"See SBTarget.Launch for argument description and usage.\n"
		""},
	 { (char *)"SBProcess_GetNumThreads", _wrap_SBProcess_GetNumThreads, METH_VARARGS, (char *)"SBProcess_GetNumThreads(SBProcess self) -> uint32_t"},
	 { (char *)"SBProcess_GetThreadAtIndex", _wrap_SBProcess_GetThreadAtIndex, METH_VARARGS, (char *)"\n"
		"Returns the INDEX'th thread from the list of current threads.  The index\n"
		"of a thread is only valid for the current stop.  For a persistent thread\n"
		"identifier use either the thread ID or the IndexID.  See help on SBThread\n"
		"for more details.\n"
		"\n"
		""},
	 { (char *)"SBProcess_GetThreadByID", _wrap_SBProcess_GetThreadByID, METH_VARARGS, (char *)"\n"
		"Returns the thread with the given thread ID.\n"
		"\n"
		""},
	 { (char *)"SBProcess_GetThreadByIndexID", _wrap_SBProcess_GetThreadByIndexID, METH_VARARGS, (char *)"\n"
		"Returns the thread with the given thread IndexID.\n"
		"\n"
		""},
	 { (char *)"SBProcess_GetSelectedThread", _wrap_SBProcess_GetSelectedThread, METH_VARARGS, (char *)"\n"
		"Returns the currently selected thread.\n"
		"\n"
		""},
	 { (char *)"SBProcess_CreateOSPluginThread", _wrap_SBProcess_CreateOSPluginThread, METH_VARARGS, (char *)"\n"
		"Lazily create a thread on demand through the current OperatingSystem plug-in, if the current OperatingSystem plug-in supports it.\n"
		"\n"
		""},
	 { (char *)"SBProcess_SetSelectedThread", _wrap_SBProcess_SetSelectedThread, METH_VARARGS, (char *)"SBProcess_SetSelectedThread(SBProcess self, SBThread thread) -> bool"},
	 { (char *)"SBProcess_SetSelectedThreadByID", _wrap_SBProcess_SetSelectedThreadByID, METH_VARARGS, (char *)"SBProcess_SetSelectedThreadByID(SBProcess self, tid_t tid) -> bool"},
	 { (char *)"SBProcess_SetSelectedThreadByIndexID", _wrap_SBProcess_SetSelectedThreadByIndexID, METH_VARARGS, (char *)"SBProcess_SetSelectedThreadByIndexID(SBProcess self, uint32_t index_id) -> bool"},
	 { (char *)"SBProcess_GetNumQueues", _wrap_SBProcess_GetNumQueues, METH_VARARGS, (char *)"SBProcess_GetNumQueues(SBProcess self) -> uint32_t"},
	 { (char *)"SBProcess_GetQueueAtIndex", _wrap_SBProcess_GetQueueAtIndex, METH_VARARGS, (char *)"SBProcess_GetQueueAtIndex(SBProcess self, uint32_t index) -> SBQueue"},
	 { (char *)"SBProcess_GetState", _wrap_SBProcess_GetState, METH_VARARGS, (char *)"SBProcess_GetState(SBProcess self) -> StateType"},
	 { (char *)"SBProcess_GetExitStatus", _wrap_SBProcess_GetExitStatus, METH_VARARGS, (char *)"SBProcess_GetExitStatus(SBProcess self) -> int"},
	 { (char *)"SBProcess_GetExitDescription", _wrap_SBProcess_GetExitDescription, METH_VARARGS, (char *)"SBProcess_GetExitDescription(SBProcess self) -> char"},
	 { (char *)"SBProcess_GetProcessID", _wrap_SBProcess_GetProcessID, METH_VARARGS, (char *)"\n"
		"Returns the process ID of the process.\n"
		"\n"
		""},
	 { (char *)"SBProcess_GetUniqueID", _wrap_SBProcess_GetUniqueID, METH_VARARGS, (char *)"\n"
		"Returns an integer ID that is guaranteed to be unique across all process instances. This is not the process ID, just a unique integer for comparison and caching purposes.\n"
		"\n"
		""},
	 { (char *)"SBProcess_GetAddressByteSize", _wrap_SBProcess_GetAddressByteSize, METH_VARARGS, (char *)"SBProcess_GetAddressByteSize(SBProcess self) -> uint32_t"},
	 { (char *)"SBProcess_Destroy", _wrap_SBProcess_Destroy, METH_VARARGS, (char *)"\n"
		"SBProcess_Destroy(SBProcess self) -> SBError\n"
		"\n"
		"Kills the process and shuts down all threads that were spawned to\n"
		"track and monitor process.\n"
		"\n"
		""},
	 { (char *)"SBProcess_Continue", _wrap_SBProcess_Continue, METH_VARARGS, (char *)"SBProcess_Continue(SBProcess self) -> SBError"},
	 { (char *)"SBProcess_Stop", _wrap_SBProcess_Stop, METH_VARARGS, (char *)"SBProcess_Stop(SBProcess self) -> SBError"},
	 { (char *)"SBProcess_Kill", _wrap_SBProcess_Kill, METH_VARARGS, (char *)"SBProcess_Kill(SBProcess self) -> SBError"},
	 { (char *)"SBProcess_Detach", _wrap_SBProcess_Detach, METH_VARARGS, (char *)"SBProcess_Detach(SBProcess self) -> SBError"},
	 { (char *)"SBProcess_Signal", _wrap_SBProcess_Signal, METH_VARARGS, (char *)"\n"
		"SBProcess_Signal(SBProcess self, int signal) -> SBError\n"
		"\n"
		"Sends the process a unix signal.\n"
		""},
	 { (char *)"SBProcess_GetUnixSignals", _wrap_SBProcess_GetUnixSignals, METH_VARARGS, (char *)"SBProcess_GetUnixSignals(SBProcess self) -> SBUnixSignals"},
	 { (char *)"SBProcess_GetStopID", _wrap_SBProcess_GetStopID, METH_VARARGS, (char *)"\n"
		"GetStopID(bool include_expression_stops = False) -> uint32_t\n"
		"SBProcess_GetStopID(SBProcess self) -> uint32_t\n"
		"\n"
		"Returns a stop id that will increase every time the process executes.  If\n"
		"include_expression_stops is true, then stops caused by expression evaluation\n"
		"will cause the returned value to increase, otherwise the counter returned will\n"
		"only increase when execution is continued explicitly by the user.  Note, the value\n"
		"will always increase, but may increase by more than one per stop.\n"
		"\n"
		""},
	 { (char *)"SBProcess_SendAsyncInterrupt", _wrap_SBProcess_SendAsyncInterrupt, METH_VARARGS, (char *)"SBProcess_SendAsyncInterrupt(SBProcess self)"},
	 { (char *)"SBProcess_ReadMemory", _wrap_SBProcess_ReadMemory, METH_VARARGS, (char *)"\n"
		"Reads memory from the current process's address space and removes any\n"
		"traps that may have been inserted into the memory. It returns the byte\n"
		"buffer in a Python string. Example:\n"
		"\n"
		"# Read 4 bytes from address 'addr' and assume error.Success() is True.\n"
		"content = process.ReadMemory(addr, 4, error)\n"
		"new_bytes = bytearray(content)\n"
		"\n"
		""},
	 { (char *)"SBProcess_WriteMemory", _wrap_SBProcess_WriteMemory, METH_VARARGS, (char *)"\n"
		"Writes memory to the current process's address space and maintains any\n"
		"traps that might be present due to software breakpoints. Example:\n"
		"\n"
		"# Create a Python string from the byte array.\n"
		"new_value = str(bytes)\n"
		"result = process.WriteMemory(addr, new_value, error)\n"
		"if not error.Success() or result != len(bytes):\n"
		"    print('SBProcess.WriteMemory() failed!')\n"
		"\n"
		""},
	 { (char *)"SBProcess_ReadCStringFromMemory", _wrap_SBProcess_ReadCStringFromMemory, METH_VARARGS, (char *)"\n"
		"Reads a NULL terminated C string from the current process's address space.\n"
		"It returns a python string of the exact length, or truncates the string if\n"
		"the maximum character limit is reached. Example:\n"
		"\n"
		"# Read a C string of at most 256 bytes from address '0x1000' \n"
		"error = lldb.SBError()\n"
		"cstring = process.ReadCStringFromMemory(0x1000, 256, error)\n"
		"if error.Success():\n"
		"    print('cstring: ', cstring)\n"
		"else\n"
		"    print('error: ', error)\n"
		"\n"
		""},
	 { (char *)"SBProcess_ReadUnsignedFromMemory", _wrap_SBProcess_ReadUnsignedFromMemory, METH_VARARGS, (char *)"\n"
		"Reads an unsigned integer from memory given a byte size and an address. \n"
		"Returns the unsigned integer that was read. Example:\n"
		"\n"
		"# Read a 4 byte unsigned integer from address 0x1000\n"
		"error = lldb.SBError()\n"
		"uint = ReadUnsignedFromMemory(0x1000, 4, error)\n"
		"if error.Success():\n"
		"    print('integer: %u' % uint)\n"
		"else\n"
		"    print('error: ', error)\n"
		"\n"
		"\n"
		""},
	 { (char *)"SBProcess_ReadPointerFromMemory", _wrap_SBProcess_ReadPointerFromMemory, METH_VARARGS, (char *)"\n"
		"Reads a pointer from memory from an address and returns the value. Example:\n"
		"\n"
		"# Read a pointer from address 0x1000\n"
		"error = lldb.SBError()\n"
		"ptr = ReadPointerFromMemory(0x1000, error)\n"
		"if error.Success():\n"
		"    print('pointer: 0x%x' % ptr)\n"
		"else\n"
		"    print('error: ', error)\n"
		"\n"
		"\n"
		""},
	 { (char *)"SBProcess_GetStateFromEvent", _wrap_SBProcess_GetStateFromEvent, METH_VARARGS, (char *)"SBProcess_GetStateFromEvent(SBEvent event) -> StateType"},
	 { (char *)"SBProcess_GetRestartedFromEvent", _wrap_SBProcess_GetRestartedFromEvent, METH_VARARGS, (char *)"SBProcess_GetRestartedFromEvent(SBEvent event) -> bool"},
	 { (char *)"SBProcess_GetNumRestartedReasonsFromEvent", _wrap_SBProcess_GetNumRestartedReasonsFromEvent, METH_VARARGS, (char *)"SBProcess_GetNumRestartedReasonsFromEvent(SBEvent event) -> size_t"},
	 { (char *)"SBProcess_GetRestartedReasonAtIndexFromEvent", _wrap_SBProcess_GetRestartedReasonAtIndexFromEvent, METH_VARARGS, (char *)"SBProcess_GetRestartedReasonAtIndexFromEvent(SBEvent event, size_t idx) -> char"},
	 { (char *)"SBProcess_GetProcessFromEvent", _wrap_SBProcess_GetProcessFromEvent, METH_VARARGS, (char *)"SBProcess_GetProcessFromEvent(SBEvent event) -> SBProcess"},
	 { (char *)"SBProcess_GetInterruptedFromEvent", _wrap_SBProcess_GetInterruptedFromEvent, METH_VARARGS, (char *)"SBProcess_GetInterruptedFromEvent(SBEvent event) -> bool"},
	 { (char *)"SBProcess_GetStructuredDataFromEvent", _wrap_SBProcess_GetStructuredDataFromEvent, METH_VARARGS, (char *)"SBProcess_GetStructuredDataFromEvent(SBEvent event) -> SBStructuredData"},
	 { (char *)"SBProcess_EventIsProcessEvent", _wrap_SBProcess_EventIsProcessEvent, METH_VARARGS, (char *)"SBProcess_EventIsProcessEvent(SBEvent event) -> bool"},
	 { (char *)"SBProcess_EventIsStructuredDataEvent", _wrap_SBProcess_EventIsStructuredDataEvent, METH_VARARGS, (char *)"SBProcess_EventIsStructuredDataEvent(SBEvent event) -> bool"},
	 { (char *)"SBProcess_GetBroadcaster", _wrap_SBProcess_GetBroadcaster, METH_VARARGS, (char *)"SBProcess_GetBroadcaster(SBProcess self) -> SBBroadcaster"},
	 { (char *)"SBProcess_GetDescription", _wrap_SBProcess_GetDescription, METH_VARARGS, (char *)"SBProcess_GetDescription(SBProcess self, SBStream description) -> bool"},
	 { (char *)"SBProcess_GetNumSupportedHardwareWatchpoints", _wrap_SBProcess_GetNumSupportedHardwareWatchpoints, METH_VARARGS, (char *)"SBProcess_GetNumSupportedHardwareWatchpoints(SBProcess self, SBError error) -> uint32_t"},
	 { (char *)"SBProcess_LoadImage", _wrap_SBProcess_LoadImage, METH_VARARGS, (char *)"SBProcess_LoadImage(SBProcess self, SBFileSpec image_spec, SBError error) -> uint32_t"},
	 { (char *)"SBProcess_UnloadImage", _wrap_SBProcess_UnloadImage, METH_VARARGS, (char *)"SBProcess_UnloadImage(SBProcess self, uint32_t image_token) -> SBError"},
	 { (char *)"SBProcess_SendEventData", _wrap_SBProcess_SendEventData, METH_VARARGS, (char *)"SBProcess_SendEventData(SBProcess self, char event_data) -> SBError"},
	 { (char *)"SBProcess_GetNumExtendedBacktraceTypes", _wrap_SBProcess_GetNumExtendedBacktraceTypes, METH_VARARGS, (char *)"\n"
		"Return the number of different thread-origin extended backtraces\n"
		"this process can support as a uint32_t.\n"
		"When the process is stopped and you have an SBThread, lldb may be\n"
		"able to show a backtrace of when that thread was originally created,\n"
		"or the work item was enqueued to it (in the case of a libdispatch \n"
		"queue).\n"
		"\n"
		""},
	 { (char *)"SBProcess_GetExtendedBacktraceTypeAtIndex", _wrap_SBProcess_GetExtendedBacktraceTypeAtIndex, METH_VARARGS, (char *)"\n"
		"Takes an index argument, returns the name of one of the thread-origin \n"
		"extended backtrace methods as a str.\n"
		"\n"
		""},
	 { (char *)"SBProcess_GetHistoryThreads", _wrap_SBProcess_GetHistoryThreads, METH_VARARGS, (char *)"SBProcess_GetHistoryThreads(SBProcess self, addr_t addr) -> SBThreadCollection"},
	 { (char *)"SBProcess_IsInstrumentationRuntimePresent", _wrap_SBProcess_IsInstrumentationRuntimePresent, METH_VARARGS, (char *)"SBProcess_IsInstrumentationRuntimePresent(SBProcess self, InstrumentationRuntimeType type) -> bool"},
	 { (char *)"SBProcess_SaveCore", _wrap_SBProcess_SaveCore, METH_VARARGS, (char *)"SBProcess_SaveCore(SBProcess self, char file_name) -> SBError"},
	 { (char *)"SBProcess_StartTrace", _wrap_SBProcess_StartTrace, METH_VARARGS, (char *)"SBProcess_StartTrace(SBProcess self, SBTraceOptions options, SBError error) -> SBTrace"},
	 { (char *)"SBProcess_GetMemoryRegionInfo", _wrap_SBProcess_GetMemoryRegionInfo, METH_VARARGS, (char *)"SBProcess_GetMemoryRegionInfo(SBProcess self, addr_t load_addr, SBMemoryRegionInfo region_info) -> SBError"},
	 { (char *)"SBProcess_GetMemoryRegions", _wrap_SBProcess_GetMemoryRegions, METH_VARARGS, (char *)"SBProcess_GetMemoryRegions(SBProcess self) -> SBMemoryRegionInfoList"},
	 { (char *)"SBProcess_GetProcessInfo", _wrap_SBProcess_GetProcessInfo, METH_VARARGS, (char *)"\n"
		"Get information about the process.\n"
		"Valid process info will only be returned when the process is alive,\n"
		"use IsValid() to check if the info returned is valid.\n"
		"\n"
		"process_info = process.GetProcessInfo()\n"
		"if process_info.IsValid():\n"
		"    process_info.GetProcessID()\n"
		"\n"
		""},
	 { (char *)"SBProcess___str__", _wrap_SBProcess___str__, METH_VARARGS, (char *)"SBProcess___str__(SBProcess self) -> PyObject"},
	 { (char *)"SBProcess_swigregister", SBProcess_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBProcessInfo", _wrap_new_SBProcessInfo, METH_VARARGS, (char *)"\n"
		"SBProcessInfo()\n"
		"new_SBProcessInfo(SBProcessInfo rhs) -> SBProcessInfo\n"
		""},
	 { (char *)"delete_SBProcessInfo", _wrap_delete_SBProcessInfo, METH_VARARGS, (char *)"delete_SBProcessInfo(SBProcessInfo self)"},
	 { (char *)"SBProcessInfo_IsValid", _wrap_SBProcessInfo_IsValid, METH_VARARGS, (char *)"SBProcessInfo_IsValid(SBProcessInfo self) -> bool"},
	 { (char *)"SBProcessInfo_GetName", _wrap_SBProcessInfo_GetName, METH_VARARGS, (char *)"SBProcessInfo_GetName(SBProcessInfo self) -> char"},
	 { (char *)"SBProcessInfo_GetExecutableFile", _wrap_SBProcessInfo_GetExecutableFile, METH_VARARGS, (char *)"SBProcessInfo_GetExecutableFile(SBProcessInfo self) -> SBFileSpec"},
	 { (char *)"SBProcessInfo_GetProcessID", _wrap_SBProcessInfo_GetProcessID, METH_VARARGS, (char *)"SBProcessInfo_GetProcessID(SBProcessInfo self) -> pid_t"},
	 { (char *)"SBProcessInfo_GetUserID", _wrap_SBProcessInfo_GetUserID, METH_VARARGS, (char *)"SBProcessInfo_GetUserID(SBProcessInfo self) -> uint32_t"},
	 { (char *)"SBProcessInfo_GetGroupID", _wrap_SBProcessInfo_GetGroupID, METH_VARARGS, (char *)"SBProcessInfo_GetGroupID(SBProcessInfo self) -> uint32_t"},
	 { (char *)"SBProcessInfo_UserIDIsValid", _wrap_SBProcessInfo_UserIDIsValid, METH_VARARGS, (char *)"SBProcessInfo_UserIDIsValid(SBProcessInfo self) -> bool"},
	 { (char *)"SBProcessInfo_GroupIDIsValid", _wrap_SBProcessInfo_GroupIDIsValid, METH_VARARGS, (char *)"SBProcessInfo_GroupIDIsValid(SBProcessInfo self) -> bool"},
	 { (char *)"SBProcessInfo_GetEffectiveUserID", _wrap_SBProcessInfo_GetEffectiveUserID, METH_VARARGS, (char *)"SBProcessInfo_GetEffectiveUserID(SBProcessInfo self) -> uint32_t"},
	 { (char *)"SBProcessInfo_GetEffectiveGroupID", _wrap_SBProcessInfo_GetEffectiveGroupID, METH_VARARGS, (char *)"SBProcessInfo_GetEffectiveGroupID(SBProcessInfo self) -> uint32_t"},
	 { (char *)"SBProcessInfo_EffectiveUserIDIsValid", _wrap_SBProcessInfo_EffectiveUserIDIsValid, METH_VARARGS, (char *)"SBProcessInfo_EffectiveUserIDIsValid(SBProcessInfo self) -> bool"},
	 { (char *)"SBProcessInfo_EffectiveGroupIDIsValid", _wrap_SBProcessInfo_EffectiveGroupIDIsValid, METH_VARARGS, (char *)"SBProcessInfo_EffectiveGroupIDIsValid(SBProcessInfo self) -> bool"},
	 { (char *)"SBProcessInfo_GetParentProcessID", _wrap_SBProcessInfo_GetParentProcessID, METH_VARARGS, (char *)"SBProcessInfo_GetParentProcessID(SBProcessInfo self) -> pid_t"},
	 { (char *)"SBProcessInfo_swigregister", SBProcessInfo_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBQueue", _wrap_new_SBQueue, METH_VARARGS, (char *)"\n"
		"SBQueue()\n"
		"new_SBQueue(QueueSP queue_sp) -> SBQueue\n"
		""},
	 { (char *)"delete_SBQueue", _wrap_delete_SBQueue, METH_VARARGS, (char *)"delete_SBQueue(SBQueue self)"},
	 { (char *)"SBQueue_IsValid", _wrap_SBQueue_IsValid, METH_VARARGS, (char *)"SBQueue_IsValid(SBQueue self) -> bool"},
	 { (char *)"SBQueue_Clear", _wrap_SBQueue_Clear, METH_VARARGS, (char *)"SBQueue_Clear(SBQueue self)"},
	 { (char *)"SBQueue_GetProcess", _wrap_SBQueue_GetProcess, METH_VARARGS, (char *)"SBQueue_GetProcess(SBQueue self) -> SBProcess"},
	 { (char *)"SBQueue_GetQueueID", _wrap_SBQueue_GetQueueID, METH_VARARGS, (char *)"\n"
		"Returns an lldb::queue_id_t type unique identifier number for this\n"
		"queue that will not be used by any other queue during this process'\n"
		"execution.  These ID numbers often start at 1 with the first\n"
		"system-created queues and increment from there.\n"
		"\n"
		""},
	 { (char *)"SBQueue_GetName", _wrap_SBQueue_GetName, METH_VARARGS, (char *)"SBQueue_GetName(SBQueue self) -> char"},
	 { (char *)"SBQueue_GetKind", _wrap_SBQueue_GetKind, METH_VARARGS, (char *)"\n"
		"Returns an lldb::QueueKind enumerated value (e.g. eQueueKindUnknown, \n"
		"eQueueKindSerial, eQueueKindConcurrent) describing the type of this\n"
		"queue.\n"
		"\n"
		""},
	 { (char *)"SBQueue_GetIndexID", _wrap_SBQueue_GetIndexID, METH_VARARGS, (char *)"SBQueue_GetIndexID(SBQueue self) -> uint32_t"},
	 { (char *)"SBQueue_GetNumThreads", _wrap_SBQueue_GetNumThreads, METH_VARARGS, (char *)"SBQueue_GetNumThreads(SBQueue self) -> uint32_t"},
	 { (char *)"SBQueue_GetThreadAtIndex", _wrap_SBQueue_GetThreadAtIndex, METH_VARARGS, (char *)"SBQueue_GetThreadAtIndex(SBQueue self, uint32_t arg1) -> SBThread"},
	 { (char *)"SBQueue_GetNumPendingItems", _wrap_SBQueue_GetNumPendingItems, METH_VARARGS, (char *)"SBQueue_GetNumPendingItems(SBQueue self) -> uint32_t"},
	 { (char *)"SBQueue_GetPendingItemAtIndex", _wrap_SBQueue_GetPendingItemAtIndex, METH_VARARGS, (char *)"SBQueue_GetPendingItemAtIndex(SBQueue self, uint32_t arg1) -> SBQueueItem"},
	 { (char *)"SBQueue_GetNumRunningItems", _wrap_SBQueue_GetNumRunningItems, METH_VARARGS, (char *)"SBQueue_GetNumRunningItems(SBQueue self) -> uint32_t"},
	 { (char *)"SBQueue_swigregister", SBQueue_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBQueueItem", _wrap_new_SBQueueItem, METH_VARARGS, (char *)"\n"
		"SBQueueItem()\n"
		"new_SBQueueItem(QueueItemSP queue_item_sp) -> SBQueueItem\n"
		""},
	 { (char *)"delete_SBQueueItem", _wrap_delete_SBQueueItem, METH_VARARGS, (char *)"delete_SBQueueItem(SBQueueItem self)"},
	 { (char *)"SBQueueItem_IsValid", _wrap_SBQueueItem_IsValid, METH_VARARGS, (char *)"SBQueueItem_IsValid(SBQueueItem self) -> bool"},
	 { (char *)"SBQueueItem_Clear", _wrap_SBQueueItem_Clear, METH_VARARGS, (char *)"SBQueueItem_Clear(SBQueueItem self)"},
	 { (char *)"SBQueueItem_GetKind", _wrap_SBQueueItem_GetKind, METH_VARARGS, (char *)"SBQueueItem_GetKind(SBQueueItem self) -> QueueItemKind"},
	 { (char *)"SBQueueItem_SetKind", _wrap_SBQueueItem_SetKind, METH_VARARGS, (char *)"SBQueueItem_SetKind(SBQueueItem self, QueueItemKind kind)"},
	 { (char *)"SBQueueItem_GetAddress", _wrap_SBQueueItem_GetAddress, METH_VARARGS, (char *)"SBQueueItem_GetAddress(SBQueueItem self) -> SBAddress"},
	 { (char *)"SBQueueItem_SetAddress", _wrap_SBQueueItem_SetAddress, METH_VARARGS, (char *)"SBQueueItem_SetAddress(SBQueueItem self, SBAddress addr)"},
	 { (char *)"SBQueueItem_SetQueueItem", _wrap_SBQueueItem_SetQueueItem, METH_VARARGS, (char *)"SBQueueItem_SetQueueItem(SBQueueItem self, QueueItemSP queue_item_sp)"},
	 { (char *)"SBQueueItem_GetExtendedBacktraceThread", _wrap_SBQueueItem_GetExtendedBacktraceThread, METH_VARARGS, (char *)"SBQueueItem_GetExtendedBacktraceThread(SBQueueItem self, char type) -> SBThread"},
	 { (char *)"SBQueueItem_swigregister", SBQueueItem_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBSection", _wrap_new_SBSection, METH_VARARGS, (char *)"\n"
		"SBSection()\n"
		"new_SBSection(SBSection rhs) -> SBSection\n"
		""},
	 { (char *)"delete_SBSection", _wrap_delete_SBSection, METH_VARARGS, (char *)"delete_SBSection(SBSection self)"},
	 { (char *)"SBSection_IsValid", _wrap_SBSection_IsValid, METH_VARARGS, (char *)"SBSection_IsValid(SBSection self) -> bool"},
	 { (char *)"SBSection_GetName", _wrap_SBSection_GetName, METH_VARARGS, (char *)"SBSection_GetName(SBSection self) -> char"},
	 { (char *)"SBSection_GetParent", _wrap_SBSection_GetParent, METH_VARARGS, (char *)"SBSection_GetParent(SBSection self) -> SBSection"},
	 { (char *)"SBSection_FindSubSection", _wrap_SBSection_FindSubSection, METH_VARARGS, (char *)"SBSection_FindSubSection(SBSection self, char sect_name) -> SBSection"},
	 { (char *)"SBSection_GetNumSubSections", _wrap_SBSection_GetNumSubSections, METH_VARARGS, (char *)"SBSection_GetNumSubSections(SBSection self) -> size_t"},
	 { (char *)"SBSection_GetSubSectionAtIndex", _wrap_SBSection_GetSubSectionAtIndex, METH_VARARGS, (char *)"SBSection_GetSubSectionAtIndex(SBSection self, size_t idx) -> SBSection"},
	 { (char *)"SBSection_GetFileAddress", _wrap_SBSection_GetFileAddress, METH_VARARGS, (char *)"SBSection_GetFileAddress(SBSection self) -> addr_t"},
	 { (char *)"SBSection_GetLoadAddress", _wrap_SBSection_GetLoadAddress, METH_VARARGS, (char *)"SBSection_GetLoadAddress(SBSection self, SBTarget target) -> addr_t"},
	 { (char *)"SBSection_GetByteSize", _wrap_SBSection_GetByteSize, METH_VARARGS, (char *)"SBSection_GetByteSize(SBSection self) -> addr_t"},
	 { (char *)"SBSection_GetFileOffset", _wrap_SBSection_GetFileOffset, METH_VARARGS, (char *)"SBSection_GetFileOffset(SBSection self) -> uint64_t"},
	 { (char *)"SBSection_GetFileByteSize", _wrap_SBSection_GetFileByteSize, METH_VARARGS, (char *)"SBSection_GetFileByteSize(SBSection self) -> uint64_t"},
	 { (char *)"SBSection_GetSectionData", _wrap_SBSection_GetSectionData, METH_VARARGS, (char *)"\n"
		"GetSectionData() -> SBData\n"
		"SBSection_GetSectionData(SBSection self, uint64_t offset, uint64_t size) -> SBData\n"
		""},
	 { (char *)"SBSection_GetSectionType", _wrap_SBSection_GetSectionType, METH_VARARGS, (char *)"SBSection_GetSectionType(SBSection self) -> SectionType"},
	 { (char *)"SBSection_GetPermissions", _wrap_SBSection_GetPermissions, METH_VARARGS, (char *)"SBSection_GetPermissions(SBSection self) -> uint32_t"},
	 { (char *)"SBSection_GetTargetByteSize", _wrap_SBSection_GetTargetByteSize, METH_VARARGS, (char *)"\n"
		"SBSection_GetTargetByteSize(SBSection self) -> uint32_t\n"
		"\n"
		"//------------------------------------------------------------------\n"
		"/// Return the size of a target's byte represented by this section\n"
		"/// in numbers of host bytes. Note that certain architectures have\n"
		"/// varying minimum addressable unit (i.e. byte) size for their \n"
		"/// CODE or DATA buses.\n"
		"///\n"
		"/// @return\n"
		"///     The number of host (8-bit) bytes needed to hold a target byte\n"
		"//------------------------------------------------------------------\n"
		"\n"
		""},
	 { (char *)"SBSection_GetDescription", _wrap_SBSection_GetDescription, METH_VARARGS, (char *)"SBSection_GetDescription(SBSection self, SBStream description) -> bool"},
	 { (char *)"SBSection___eq__", _wrap_SBSection___eq__, METH_VARARGS, (char *)"SBSection___eq__(SBSection self, SBSection rhs) -> bool"},
	 { (char *)"SBSection___ne__", _wrap_SBSection___ne__, METH_VARARGS, (char *)"SBSection___ne__(SBSection self, SBSection rhs) -> bool"},
	 { (char *)"SBSection___str__", _wrap_SBSection___str__, METH_VARARGS, (char *)"SBSection___str__(SBSection self) -> PyObject"},
	 { (char *)"SBSection_swigregister", SBSection_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBSourceManager", _wrap_new_SBSourceManager, METH_VARARGS, (char *)"new_SBSourceManager(SBSourceManager rhs) -> SBSourceManager"},
	 { (char *)"delete_SBSourceManager", _wrap_delete_SBSourceManager, METH_VARARGS, (char *)"delete_SBSourceManager(SBSourceManager self)"},
	 { (char *)"SBSourceManager_DisplaySourceLinesWithLineNumbers", _wrap_SBSourceManager_DisplaySourceLinesWithLineNumbers, METH_VARARGS, (char *)"\n"
		"SBSourceManager_DisplaySourceLinesWithLineNumbers(SBSourceManager self, SBFileSpec file, uint32_t line, \n"
		"    uint32_t context_before, uint32_t context_after, \n"
		"    char current_line_cstr, SBStream s) -> size_t\n"
		""},
	 { (char *)"SBSourceManager_DisplaySourceLinesWithLineNumbersAndColumn", _wrap_SBSourceManager_DisplaySourceLinesWithLineNumbersAndColumn, METH_VARARGS, (char *)"\n"
		"SBSourceManager_DisplaySourceLinesWithLineNumbersAndColumn(SBSourceManager self, SBFileSpec file, uint32_t line, \n"
		"    uint32_t column, uint32_t context_before, \n"
		"    uint32_t context_after, char current_line_cstr, \n"
		"    SBStream s) -> size_t\n"
		""},
	 { (char *)"SBSourceManager_swigregister", SBSourceManager_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBStream", _wrap_new_SBStream, METH_VARARGS, (char *)"new_SBStream() -> SBStream"},
	 { (char *)"delete_SBStream", _wrap_delete_SBStream, METH_VARARGS, (char *)"delete_SBStream(SBStream self)"},
	 { (char *)"SBStream_IsValid", _wrap_SBStream_IsValid, METH_VARARGS, (char *)"SBStream_IsValid(SBStream self) -> bool"},
	 { (char *)"SBStream_GetData", _wrap_SBStream_GetData, METH_VARARGS, (char *)"\n"
		"SBStream_GetData(SBStream self) -> char\n"
		"\n"
		"//--------------------------------------------------------------------------\n"
		"/// If this stream is not redirected to a file, it will maintain a local\n"
		"/// cache for the stream data which can be accessed using this accessor.\n"
		"//--------------------------------------------------------------------------\n"
		"\n"
		""},
	 { (char *)"SBStream_GetSize", _wrap_SBStream_GetSize, METH_VARARGS, (char *)"\n"
		"SBStream_GetSize(SBStream self) -> size_t\n"
		"\n"
		"//--------------------------------------------------------------------------\n"
		"/// If this stream is not redirected to a file, it will maintain a local\n"
		"/// cache for the stream output whose length can be accessed using this \n"
		"/// accessor.\n"
		"//--------------------------------------------------------------------------\n"
		"\n"
		""},
	 { (char *)"SBStream_Print", _wrap_SBStream_Print, METH_VARARGS, (char *)"SBStream_Print(SBStream self, char str)"},
	 { (char *)"SBStream_RedirectToFile", _wrap_SBStream_RedirectToFile, METH_VARARGS, (char *)"SBStream_RedirectToFile(SBStream self, char path, bool append)"},
	 { (char *)"SBStream_RedirectToFileHandle", _wrap_SBStream_RedirectToFileHandle, METH_VARARGS, (char *)"SBStream_RedirectToFileHandle(SBStream self, FILE fh, bool transfer_fh_ownership)"},
	 { (char *)"SBStream_RedirectToFileDescriptor", _wrap_SBStream_RedirectToFileDescriptor, METH_VARARGS, (char *)"SBStream_RedirectToFileDescriptor(SBStream self, int fd, bool transfer_fh_ownership)"},
	 { (char *)"SBStream_Clear", _wrap_SBStream_Clear, METH_VARARGS, (char *)"\n"
		"SBStream_Clear(SBStream self)\n"
		"\n"
		"//--------------------------------------------------------------------------\n"
		"/// If the stream is redirected to a file, forget about the file and if\n"
		"/// ownership of the file was transferred to this object, close the file.\n"
		"/// If the stream is backed by a local cache, clear this cache.\n"
		"//--------------------------------------------------------------------------\n"
		"\n"
		""},
	 { (char *)"SBStream_write", _wrap_SBStream_write, METH_VARARGS, (char *)"SBStream_write(SBStream self, char str)"},
	 { (char *)"SBStream_flush", _wrap_SBStream_flush, METH_VARARGS, (char *)"SBStream_flush(SBStream self)"},
	 { (char *)"SBStream_swigregister", SBStream_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBStringList", _wrap_new_SBStringList, METH_VARARGS, (char *)"\n"
		"SBStringList()\n"
		"new_SBStringList(SBStringList rhs) -> SBStringList\n"
		""},
	 { (char *)"delete_SBStringList", _wrap_delete_SBStringList, METH_VARARGS, (char *)"delete_SBStringList(SBStringList self)"},
	 { (char *)"SBStringList_IsValid", _wrap_SBStringList_IsValid, METH_VARARGS, (char *)"SBStringList_IsValid(SBStringList self) -> bool"},
	 { (char *)"SBStringList_AppendString", _wrap_SBStringList_AppendString, METH_VARARGS, (char *)"SBStringList_AppendString(SBStringList self, char str)"},
	 { (char *)"SBStringList_AppendList", _wrap_SBStringList_AppendList, METH_VARARGS, (char *)"\n"
		"AppendList(char strv, int strc)\n"
		"SBStringList_AppendList(SBStringList self, SBStringList strings)\n"
		""},
	 { (char *)"SBStringList_GetSize", _wrap_SBStringList_GetSize, METH_VARARGS, (char *)"SBStringList_GetSize(SBStringList self) -> uint32_t"},
	 { (char *)"SBStringList_GetStringAtIndex", _wrap_SBStringList_GetStringAtIndex, METH_VARARGS, (char *)"SBStringList_GetStringAtIndex(SBStringList self, size_t idx) -> char"},
	 { (char *)"SBStringList_Clear", _wrap_SBStringList_Clear, METH_VARARGS, (char *)"SBStringList_Clear(SBStringList self)"},
	 { (char *)"SBStringList_swigregister", SBStringList_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBStructuredData", _wrap_new_SBStructuredData, METH_VARARGS, (char *)"\n"
		"SBStructuredData()\n"
		"SBStructuredData(SBStructuredData rhs)\n"
		"new_SBStructuredData(EventSP event_sp) -> SBStructuredData\n"
		""},
	 { (char *)"delete_SBStructuredData", _wrap_delete_SBStructuredData, METH_VARARGS, (char *)"delete_SBStructuredData(SBStructuredData self)"},
	 { (char *)"SBStructuredData_IsValid", _wrap_SBStructuredData_IsValid, METH_VARARGS, (char *)"SBStructuredData_IsValid(SBStructuredData self) -> bool"},
	 { (char *)"SBStructuredData_Clear", _wrap_SBStructuredData_Clear, METH_VARARGS, (char *)"SBStructuredData_Clear(SBStructuredData self)"},
	 { (char *)"SBStructuredData_GetType", _wrap_SBStructuredData_GetType, METH_VARARGS, (char *)"SBStructuredData_GetType(SBStructuredData self) -> StructuredDataType"},
	 { (char *)"SBStructuredData_GetSize", _wrap_SBStructuredData_GetSize, METH_VARARGS, (char *)"SBStructuredData_GetSize(SBStructuredData self) -> size_t"},
	 { (char *)"SBStructuredData_GetValueForKey", _wrap_SBStructuredData_GetValueForKey, METH_VARARGS, (char *)"SBStructuredData_GetValueForKey(SBStructuredData self, char key) -> SBStructuredData"},
	 { (char *)"SBStructuredData_GetItemAtIndex", _wrap_SBStructuredData_GetItemAtIndex, METH_VARARGS, (char *)"SBStructuredData_GetItemAtIndex(SBStructuredData self, size_t idx) -> SBStructuredData"},
	 { (char *)"SBStructuredData_GetIntegerValue", _wrap_SBStructuredData_GetIntegerValue, METH_VARARGS, (char *)"\n"
		"GetIntegerValue(uint64_t fail_value = 0) -> uint64_t\n"
		"SBStructuredData_GetIntegerValue(SBStructuredData self) -> uint64_t\n"
		""},
	 { (char *)"SBStructuredData_GetFloatValue", _wrap_SBStructuredData_GetFloatValue, METH_VARARGS, (char *)"\n"
		"GetFloatValue(double fail_value = 0.0) -> double\n"
		"SBStructuredData_GetFloatValue(SBStructuredData self) -> double\n"
		""},
	 { (char *)"SBStructuredData_GetBooleanValue", _wrap_SBStructuredData_GetBooleanValue, METH_VARARGS, (char *)"\n"
		"GetBooleanValue(bool fail_value = False) -> bool\n"
		"SBStructuredData_GetBooleanValue(SBStructuredData self) -> bool\n"
		""},
	 { (char *)"SBStructuredData_GetStringValue", _wrap_SBStructuredData_GetStringValue, METH_VARARGS, (char *)"SBStructuredData_GetStringValue(SBStructuredData self, char dst) -> size_t"},
	 { (char *)"SBStructuredData_GetAsJSON", _wrap_SBStructuredData_GetAsJSON, METH_VARARGS, (char *)"SBStructuredData_GetAsJSON(SBStructuredData self, SBStream stream) -> SBError"},
	 { (char *)"SBStructuredData_GetDescription", _wrap_SBStructuredData_GetDescription, METH_VARARGS, (char *)"SBStructuredData_GetDescription(SBStructuredData self, SBStream stream) -> SBError"},
	 { (char *)"SBStructuredData_SetFromJSON", _wrap_SBStructuredData_SetFromJSON, METH_VARARGS, (char *)"SBStructuredData_SetFromJSON(SBStructuredData self, SBStream stream) -> SBError"},
	 { (char *)"SBStructuredData_swigregister", SBStructuredData_swigregister, METH_VARARGS, NULL},
	 { (char *)"delete_SBSymbol", _wrap_delete_SBSymbol, METH_VARARGS, (char *)"delete_SBSymbol(SBSymbol self)"},
	 { (char *)"new_SBSymbol", _wrap_new_SBSymbol, METH_VARARGS, (char *)"\n"
		"SBSymbol()\n"
		"new_SBSymbol(SBSymbol rhs) -> SBSymbol\n"
		""},
	 { (char *)"SBSymbol_IsValid", _wrap_SBSymbol_IsValid, METH_VARARGS, (char *)"SBSymbol_IsValid(SBSymbol self) -> bool"},
	 { (char *)"SBSymbol_GetName", _wrap_SBSymbol_GetName, METH_VARARGS, (char *)"SBSymbol_GetName(SBSymbol self) -> char"},
	 { (char *)"SBSymbol_GetDisplayName", _wrap_SBSymbol_GetDisplayName, METH_VARARGS, (char *)"SBSymbol_GetDisplayName(SBSymbol self) -> char"},
	 { (char *)"SBSymbol_GetMangledName", _wrap_SBSymbol_GetMangledName, METH_VARARGS, (char *)"SBSymbol_GetMangledName(SBSymbol self) -> char"},
	 { (char *)"SBSymbol_GetInstructions", _wrap_SBSymbol_GetInstructions, METH_VARARGS, (char *)"\n"
		"GetInstructions(SBTarget target) -> SBInstructionList\n"
		"SBSymbol_GetInstructions(SBSymbol self, SBTarget target, char flavor_string) -> SBInstructionList\n"
		""},
	 { (char *)"SBSymbol_GetStartAddress", _wrap_SBSymbol_GetStartAddress, METH_VARARGS, (char *)"SBSymbol_GetStartAddress(SBSymbol self) -> SBAddress"},
	 { (char *)"SBSymbol_GetEndAddress", _wrap_SBSymbol_GetEndAddress, METH_VARARGS, (char *)"SBSymbol_GetEndAddress(SBSymbol self) -> SBAddress"},
	 { (char *)"SBSymbol_GetPrologueByteSize", _wrap_SBSymbol_GetPrologueByteSize, METH_VARARGS, (char *)"SBSymbol_GetPrologueByteSize(SBSymbol self) -> uint32_t"},
	 { (char *)"SBSymbol_GetType", _wrap_SBSymbol_GetType, METH_VARARGS, (char *)"SBSymbol_GetType(SBSymbol self) -> SymbolType"},
	 { (char *)"SBSymbol_GetDescription", _wrap_SBSymbol_GetDescription, METH_VARARGS, (char *)"SBSymbol_GetDescription(SBSymbol self, SBStream description) -> bool"},
	 { (char *)"SBSymbol_IsExternal", _wrap_SBSymbol_IsExternal, METH_VARARGS, (char *)"SBSymbol_IsExternal(SBSymbol self) -> bool"},
	 { (char *)"SBSymbol_IsSynthetic", _wrap_SBSymbol_IsSynthetic, METH_VARARGS, (char *)"SBSymbol_IsSynthetic(SBSymbol self) -> bool"},
	 { (char *)"SBSymbol___eq__", _wrap_SBSymbol___eq__, METH_VARARGS, (char *)"SBSymbol___eq__(SBSymbol self, SBSymbol rhs) -> bool"},
	 { (char *)"SBSymbol___ne__", _wrap_SBSymbol___ne__, METH_VARARGS, (char *)"SBSymbol___ne__(SBSymbol self, SBSymbol rhs) -> bool"},
	 { (char *)"SBSymbol___str__", _wrap_SBSymbol___str__, METH_VARARGS, (char *)"SBSymbol___str__(SBSymbol self) -> PyObject"},
	 { (char *)"SBSymbol_swigregister", SBSymbol_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBSymbolContext", _wrap_new_SBSymbolContext, METH_VARARGS, (char *)"\n"
		"SBSymbolContext()\n"
		"new_SBSymbolContext(SBSymbolContext rhs) -> SBSymbolContext\n"
		""},
	 { (char *)"delete_SBSymbolContext", _wrap_delete_SBSymbolContext, METH_VARARGS, (char *)"delete_SBSymbolContext(SBSymbolContext self)"},
	 { (char *)"SBSymbolContext_IsValid", _wrap_SBSymbolContext_IsValid, METH_VARARGS, (char *)"SBSymbolContext_IsValid(SBSymbolContext self) -> bool"},
	 { (char *)"SBSymbolContext_GetModule", _wrap_SBSymbolContext_GetModule, METH_VARARGS, (char *)"SBSymbolContext_GetModule(SBSymbolContext self) -> SBModule"},
	 { (char *)"SBSymbolContext_GetCompileUnit", _wrap_SBSymbolContext_GetCompileUnit, METH_VARARGS, (char *)"SBSymbolContext_GetCompileUnit(SBSymbolContext self) -> SBCompileUnit"},
	 { (char *)"SBSymbolContext_GetFunction", _wrap_SBSymbolContext_GetFunction, METH_VARARGS, (char *)"SBSymbolContext_GetFunction(SBSymbolContext self) -> SBFunction"},
	 { (char *)"SBSymbolContext_GetBlock", _wrap_SBSymbolContext_GetBlock, METH_VARARGS, (char *)"SBSymbolContext_GetBlock(SBSymbolContext self) -> SBBlock"},
	 { (char *)"SBSymbolContext_GetLineEntry", _wrap_SBSymbolContext_GetLineEntry, METH_VARARGS, (char *)"SBSymbolContext_GetLineEntry(SBSymbolContext self) -> SBLineEntry"},
	 { (char *)"SBSymbolContext_GetSymbol", _wrap_SBSymbolContext_GetSymbol, METH_VARARGS, (char *)"SBSymbolContext_GetSymbol(SBSymbolContext self) -> SBSymbol"},
	 { (char *)"SBSymbolContext_SetModule", _wrap_SBSymbolContext_SetModule, METH_VARARGS, (char *)"SBSymbolContext_SetModule(SBSymbolContext self, SBModule module)"},
	 { (char *)"SBSymbolContext_SetCompileUnit", _wrap_SBSymbolContext_SetCompileUnit, METH_VARARGS, (char *)"SBSymbolContext_SetCompileUnit(SBSymbolContext self, SBCompileUnit compile_unit)"},
	 { (char *)"SBSymbolContext_SetFunction", _wrap_SBSymbolContext_SetFunction, METH_VARARGS, (char *)"SBSymbolContext_SetFunction(SBSymbolContext self, SBFunction function)"},
	 { (char *)"SBSymbolContext_SetBlock", _wrap_SBSymbolContext_SetBlock, METH_VARARGS, (char *)"SBSymbolContext_SetBlock(SBSymbolContext self, SBBlock block)"},
	 { (char *)"SBSymbolContext_SetLineEntry", _wrap_SBSymbolContext_SetLineEntry, METH_VARARGS, (char *)"SBSymbolContext_SetLineEntry(SBSymbolContext self, SBLineEntry line_entry)"},
	 { (char *)"SBSymbolContext_SetSymbol", _wrap_SBSymbolContext_SetSymbol, METH_VARARGS, (char *)"SBSymbolContext_SetSymbol(SBSymbolContext self, SBSymbol symbol)"},
	 { (char *)"SBSymbolContext_GetParentOfInlinedScope", _wrap_SBSymbolContext_GetParentOfInlinedScope, METH_VARARGS, (char *)"SBSymbolContext_GetParentOfInlinedScope(SBSymbolContext self, SBAddress curr_frame_pc, SBAddress parent_frame_addr) -> SBSymbolContext"},
	 { (char *)"SBSymbolContext_GetDescription", _wrap_SBSymbolContext_GetDescription, METH_VARARGS, (char *)"SBSymbolContext_GetDescription(SBSymbolContext self, SBStream description) -> bool"},
	 { (char *)"SBSymbolContext___str__", _wrap_SBSymbolContext___str__, METH_VARARGS, (char *)"SBSymbolContext___str__(SBSymbolContext self) -> PyObject"},
	 { (char *)"SBSymbolContext_swigregister", SBSymbolContext_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBSymbolContextList", _wrap_new_SBSymbolContextList, METH_VARARGS, (char *)"\n"
		"SBSymbolContextList()\n"
		"new_SBSymbolContextList(SBSymbolContextList rhs) -> SBSymbolContextList\n"
		""},
	 { (char *)"delete_SBSymbolContextList", _wrap_delete_SBSymbolContextList, METH_VARARGS, (char *)"delete_SBSymbolContextList(SBSymbolContextList self)"},
	 { (char *)"SBSymbolContextList_IsValid", _wrap_SBSymbolContextList_IsValid, METH_VARARGS, (char *)"SBSymbolContextList_IsValid(SBSymbolContextList self) -> bool"},
	 { (char *)"SBSymbolContextList_GetSize", _wrap_SBSymbolContextList_GetSize, METH_VARARGS, (char *)"SBSymbolContextList_GetSize(SBSymbolContextList self) -> uint32_t"},
	 { (char *)"SBSymbolContextList_GetContextAtIndex", _wrap_SBSymbolContextList_GetContextAtIndex, METH_VARARGS, (char *)"SBSymbolContextList_GetContextAtIndex(SBSymbolContextList self, uint32_t idx) -> SBSymbolContext"},
	 { (char *)"SBSymbolContextList_Append", _wrap_SBSymbolContextList_Append, METH_VARARGS, (char *)"\n"
		"Append(SBSymbolContext sc)\n"
		"SBSymbolContextList_Append(SBSymbolContextList self, SBSymbolContextList sc_list)\n"
		""},
	 { (char *)"SBSymbolContextList_GetDescription", _wrap_SBSymbolContextList_GetDescription, METH_VARARGS, (char *)"SBSymbolContextList_GetDescription(SBSymbolContextList self, SBStream description) -> bool"},
	 { (char *)"SBSymbolContextList_Clear", _wrap_SBSymbolContextList_Clear, METH_VARARGS, (char *)"SBSymbolContextList_Clear(SBSymbolContextList self)"},
	 { (char *)"SBSymbolContextList___str__", _wrap_SBSymbolContextList___str__, METH_VARARGS, (char *)"SBSymbolContextList___str__(SBSymbolContextList self) -> PyObject"},
	 { (char *)"SBSymbolContextList_swigregister", SBSymbolContextList_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBTarget", _wrap_new_SBTarget, METH_VARARGS, (char *)"\n"
		"SBTarget()\n"
		"new_SBTarget(SBTarget rhs) -> SBTarget\n"
		""},
	 { (char *)"delete_SBTarget", _wrap_delete_SBTarget, METH_VARARGS, (char *)"delete_SBTarget(SBTarget self)"},
	 { (char *)"SBTarget_GetBroadcasterClassName", _wrap_SBTarget_GetBroadcasterClassName, METH_VARARGS, (char *)"SBTarget_GetBroadcasterClassName() -> char"},
	 { (char *)"SBTarget_IsValid", _wrap_SBTarget_IsValid, METH_VARARGS, (char *)"SBTarget_IsValid(SBTarget self) -> bool"},
	 { (char *)"SBTarget_EventIsTargetEvent", _wrap_SBTarget_EventIsTargetEvent, METH_VARARGS, (char *)"SBTarget_EventIsTargetEvent(SBEvent event) -> bool"},
	 { (char *)"SBTarget_GetTargetFromEvent", _wrap_SBTarget_GetTargetFromEvent, METH_VARARGS, (char *)"SBTarget_GetTargetFromEvent(SBEvent event) -> SBTarget"},
	 { (char *)"SBTarget_GetNumModulesFromEvent", _wrap_SBTarget_GetNumModulesFromEvent, METH_VARARGS, (char *)"SBTarget_GetNumModulesFromEvent(SBEvent event) -> uint32_t"},
	 { (char *)"SBTarget_GetModuleAtIndexFromEvent", _wrap_SBTarget_GetModuleAtIndexFromEvent, METH_VARARGS, (char *)"SBTarget_GetModuleAtIndexFromEvent(uint32_t idx, SBEvent event) -> SBModule"},
	 { (char *)"SBTarget_GetProcess", _wrap_SBTarget_GetProcess, METH_VARARGS, (char *)"SBTarget_GetProcess(SBTarget self) -> SBProcess"},
	 { (char *)"SBTarget_GetPlatform", _wrap_SBTarget_GetPlatform, METH_VARARGS, (char *)"\n"
		"SBTarget_GetPlatform(SBTarget self) -> SBPlatform\n"
		"\n"
		"//------------------------------------------------------------------\n"
		"/// Return the platform object associated with the target.\n"
		"///\n"
		"/// After return, the platform object should be checked for\n"
		"/// validity.\n"
		"///\n"
		"/// @return\n"
		"///     A platform object.\n"
		"//------------------------------------------------------------------\n"
		"\n"
		""},
	 { (char *)"SBTarget_Install", _wrap_SBTarget_Install, METH_VARARGS, (char *)"\n"
		"SBTarget_Install(SBTarget self) -> SBError\n"
		"\n"
		"//------------------------------------------------------------------\n"
		"/// Install any binaries that need to be installed.\n"
		"///\n"
		"/// This function does nothing when debugging on the host system.\n"
		"/// When connected to remote platforms, the target's main executable\n"
		"/// and any modules that have their install path set will be\n"
		"/// installed on the remote platform. If the main executable doesn't\n"
		"/// have an install location set, it will be installed in the remote\n"
		"/// platform's working directory.\n"
		"///\n"
		"/// @return\n"
		"///     An error describing anything that went wrong during\n"
		"///     installation.\n"
		"//------------------------------------------------------------------\n"
		"\n"
		""},
	 { (char *)"SBTarget_LaunchSimple", _wrap_SBTarget_LaunchSimple, METH_VARARGS, (char *)"\n"
		"SBTarget_LaunchSimple(SBTarget self, char argv, char envp, char working_directory) -> SBProcess\n"
		"\n"
		"//------------------------------------------------------------------\n"
		"/// Launch a new process with sensible defaults.\n"
		"///\n"
		"/// @param[in] argv\n"
		"///     The argument array.\n"
		"///\n"
		"/// @param[in] envp\n"
		"///     The environment array.\n"
		"///\n"
		"/// @param[in] working_directory\n"
		"///     The working directory to have the child process run in\n"
		"///\n"
		"/// Default: listener\n"
		"///     Set to the target's debugger (SBTarget::GetDebugger())\n"
		"///\n"
		"/// Default: launch_flags\n"
		"///     Empty launch flags\n"
		"///\n"
		"/// Default: stdin_path\n"
		"/// Default: stdout_path\n"
		"/// Default: stderr_path\n"
		"///     A pseudo terminal will be used.\n"
		"///\n"
		"/// @return\n"
		"///      A process object for the newly created process.\n"
		"//------------------------------------------------------------------\n"
		"\n"
		"For example,\n"
		"\n"
		"    process = target.LaunchSimple(['X', 'Y', 'Z'], None, os.getcwd())\n"
		"\n"
		"launches a new process by passing 'X', 'Y', 'Z' as the args to the\n"
		"executable.\n"
		"\n"
		""},
	 { (char *)"SBTarget_Launch", _wrap_SBTarget_Launch, METH_VARARGS, (char *)"\n"
		"Launch(SBListener listener, char argv, char envp, char stdin_path, \n"
		"    char stdout_path, char stderr_path, \n"
		"    char working_directory, uint32_t launch_flags, \n"
		"    bool stop_at_entry, SBError error) -> SBProcess\n"
		"SBTarget_Launch(SBTarget self, SBLaunchInfo launch_info, SBError error) -> SBProcess\n"
		"\n"
		"//------------------------------------------------------------------\n"
		"/// Launch a new process.\n"
		"///\n"
		"/// Launch a new process by spawning a new process using the\n"
		"/// target object's executable module's file as the file to launch.\n"
		"/// Arguments are given in  argv, and the environment variables\n"
		"/// are in  envp. Standard input and output files can be\n"
		"/// optionally re-directed to  stdin_path,  stdout_path, and\n"
		"///  stderr_path.\n"
		"///\n"
		"/// @param[in] listener\n"
		"///     An optional listener that will receive all process events.\n"
		"///     If  listener is valid then  listener will listen to all\n"
		"///     process events. If not valid, then this target's debugger\n"
		"///     (SBTarget::GetDebugger()) will listen to all process events. \n"
		"///\n"
		"/// @param[in] argv\n"
		"///     The argument array.\n"
		"///\n"
		"/// @param[in] envp\n"
		"///     The environment array.\n"
		"///\n"
		"/// @param[in] launch_flags\n"
		"///     Flags to modify the launch (@see lldb::LaunchFlags)\n"
		"///\n"
		"/// @param[in] stdin_path\n"
		"///     The path to use when re-directing the STDIN of the new\n"
		"///     process. If all stdXX_path arguments are NULL, a pseudo\n"
		"///     terminal will be used.\n"
		"///\n"
		"/// @param[in] stdout_path\n"
		"///     The path to use when re-directing the STDOUT of the new\n"
		"///     process. If all stdXX_path arguments are NULL, a pseudo\n"
		"///     terminal will be used.\n"
		"///\n"
		"/// @param[in] stderr_path\n"
		"///     The path to use when re-directing the STDERR of the new\n"
		"///     process. If all stdXX_path arguments are NULL, a pseudo\n"
		"///     terminal will be used.\n"
		"///\n"
		"/// @param[in] working_directory\n"
		"///     The working directory to have the child process run in\n"
		"///\n"
		"/// @param[in] launch_flags\n"
		"///     Some launch options specified by logical OR'ing \n"
		"///     lldb::LaunchFlags enumeration values together.\n"
		"///\n"
		"/// @param[in] stop_at_entry\n"
		"///     If false do not stop the inferior at the entry point.\n"
		"///\n"
		"/// @param[out]\n"
		"///     An error object. Contains the reason if there is some failure.\n"
		"///\n"
		"/// @return\n"
		"///      A process object for the newly created process.\n"
		"//------------------------------------------------------------------\n"
		"\n"
		"For example,\n"
		"\n"
		"    process = target.Launch(self.dbg.GetListener(), None, None,\n"
		"                            None, '/tmp/stdout.txt', None,\n"
		"                            None, 0, False, error)\n"
		"\n"
		"launches a new process by passing nothing for both the args and the envs\n"
		"and redirect the standard output of the inferior to the /tmp/stdout.txt\n"
		"file. It does not specify a working directory so that the debug server\n"
		"will use its idea of what the current working directory is for the\n"
		"inferior. Also, we ask the debugger not to stop the inferior at the\n"
		"entry point. If no breakpoint is specified for the inferior, it should\n"
		"run to completion if no user interaction is required.\n"
		"\n"
		""},
	 { (char *)"SBTarget_LoadCore", _wrap_SBTarget_LoadCore, METH_VARARGS, (char *)"\n"
		"SBTarget_LoadCore(SBTarget self, char core_file) -> SBProcess\n"
		"\n"
		"//------------------------------------------------------------------\n"
		"/// Load a core file\n"
		"///\n"
		"/// @param[in] core_file\n"
		"///     File path of the core dump.\n"
		"///\n"
		"/// @return\n"
		"///      A process object for the newly created core file.\n"
		"//------------------------------------------------------------------\n"
		"\n"
		"For example,\n"
		"\n"
		"    process = target.LoadCore('./a.out.core')\n"
		"\n"
		"loads a new core file and returns the process object.\n"
		"\n"
		""},
	 { (char *)"SBTarget_Attach", _wrap_SBTarget_Attach, METH_VARARGS, (char *)"SBTarget_Attach(SBTarget self, SBAttachInfo attach_info, SBError error) -> SBProcess"},
	 { (char *)"SBTarget_AttachToProcessWithID", _wrap_SBTarget_AttachToProcessWithID, METH_VARARGS, (char *)"\n"
		"SBTarget_AttachToProcessWithID(SBTarget self, SBListener listener, pid_t pid, SBError error) -> SBProcess\n"
		"\n"
		"//------------------------------------------------------------------\n"
		"/// Attach to process with pid.\n"
		"///\n"
		"/// @param[in] listener\n"
		"///     An optional listener that will receive all process events.\n"
		"///     If  listener is valid then  listener will listen to all\n"
		"///     process events. If not valid, then this target's debugger\n"
		"///     (SBTarget::GetDebugger()) will listen to all process events.\n"
		"///\n"
		"/// @param[in] pid\n"
		"///     The process ID to attach to.\n"
		"///\n"
		"/// @param[out]\n"
		"///     An error explaining what went wrong if attach fails.\n"
		"///\n"
		"/// @return\n"
		"///      A process object for the attached process.\n"
		"//------------------------------------------------------------------\n"
		"\n"
		""},
	 { (char *)"SBTarget_AttachToProcessWithName", _wrap_SBTarget_AttachToProcessWithName, METH_VARARGS, (char *)"\n"
		"SBTarget_AttachToProcessWithName(SBTarget self, SBListener listener, char name, bool wait_for, \n"
		"    SBError error) -> SBProcess\n"
		"\n"
		"//------------------------------------------------------------------\n"
		"/// Attach to process with name.\n"
		"///\n"
		"/// @param[in] listener\n"
		"///     An optional listener that will receive all process events.\n"
		"///     If  listener is valid then  listener will listen to all\n"
		"///     process events. If not valid, then this target's debugger\n"
		"///     (SBTarget::GetDebugger()) will listen to all process events.\n"
		"///\n"
		"/// @param[in] name\n"
		"///     Basename of process to attach to.\n"
		"///\n"
		"/// @param[in] wait_for\n"
		"///     If true wait for a new instance of 'name' to be launched.\n"
		"///\n"
		"/// @param[out]\n"
		"///     An error explaining what went wrong if attach fails.\n"
		"///\n"
		"/// @return\n"
		"///      A process object for the attached process.\n"
		"//------------------------------------------------------------------\n"
		"\n"
		""},
	 { (char *)"SBTarget_ConnectRemote", _wrap_SBTarget_ConnectRemote, METH_VARARGS, (char *)"\n"
		"SBTarget_ConnectRemote(SBTarget self, SBListener listener, char url, char plugin_name, \n"
		"    SBError error) -> SBProcess\n"
		"\n"
		"//------------------------------------------------------------------\n"
		"/// Connect to a remote debug server with url.\n"
		"///\n"
		"/// @param[in] listener\n"
		"///     An optional listener that will receive all process events.\n"
		"///     If  listener is valid then  listener will listen to all\n"
		"///     process events. If not valid, then this target's debugger\n"
		"///     (SBTarget::GetDebugger()) will listen to all process events.\n"
		"///\n"
		"/// @param[in] url\n"
		"///     The url to connect to, e.g., 'connect://localhost:12345'.\n"
		"///\n"
		"/// @param[in] plugin_name\n"
		"///     The plugin name to be used; can be NULL.\n"
		"///\n"
		"/// @param[out]\n"
		"///     An error explaining what went wrong if the connect fails.\n"
		"///\n"
		"/// @return\n"
		"///      A process object for the connected process.\n"
		"//------------------------------------------------------------------\n"
		"\n"
		""},
	 { (char *)"SBTarget_GetExecutable", _wrap_SBTarget_GetExecutable, METH_VARARGS, (char *)"SBTarget_GetExecutable(SBTarget self) -> SBFileSpec"},
	 { (char *)"SBTarget_AddModule", _wrap_SBTarget_AddModule, METH_VARARGS, (char *)"\n"
		"AddModule(SBModule module) -> bool\n"
		"AddModule(char path, char triple, char uuid) -> SBModule\n"
		"AddModule(char path, char triple, char uuid_cstr, char symfile) -> SBModule\n"
		"SBTarget_AddModule(SBTarget self, SBModuleSpec module_spec) -> SBModule\n"
		""},
	 { (char *)"SBTarget_GetNumModules", _wrap_SBTarget_GetNumModules, METH_VARARGS, (char *)"SBTarget_GetNumModules(SBTarget self) -> uint32_t"},
	 { (char *)"SBTarget_GetModuleAtIndex", _wrap_SBTarget_GetModuleAtIndex, METH_VARARGS, (char *)"SBTarget_GetModuleAtIndex(SBTarget self, uint32_t idx) -> SBModule"},
	 { (char *)"SBTarget_RemoveModule", _wrap_SBTarget_RemoveModule, METH_VARARGS, (char *)"SBTarget_RemoveModule(SBTarget self, SBModule module) -> bool"},
	 { (char *)"SBTarget_GetDebugger", _wrap_SBTarget_GetDebugger, METH_VARARGS, (char *)"SBTarget_GetDebugger(SBTarget self) -> SBDebugger"},
	 { (char *)"SBTarget_FindModule", _wrap_SBTarget_FindModule, METH_VARARGS, (char *)"SBTarget_FindModule(SBTarget self, SBFileSpec file_spec) -> SBModule"},
	 { (char *)"SBTarget_GetByteOrder", _wrap_SBTarget_GetByteOrder, METH_VARARGS, (char *)"SBTarget_GetByteOrder(SBTarget self) -> ByteOrder"},
	 { (char *)"SBTarget_GetAddressByteSize", _wrap_SBTarget_GetAddressByteSize, METH_VARARGS, (char *)"SBTarget_GetAddressByteSize(SBTarget self) -> uint32_t"},
	 { (char *)"SBTarget_GetTriple", _wrap_SBTarget_GetTriple, METH_VARARGS, (char *)"SBTarget_GetTriple(SBTarget self) -> char"},
	 { (char *)"SBTarget_GetDataByteSize", _wrap_SBTarget_GetDataByteSize, METH_VARARGS, (char *)"\n"
		"SBTarget_GetDataByteSize(SBTarget self) -> uint32_t\n"
		"\n"
		"//------------------------------------------------------------------\n"
		"/// Architecture data byte width accessor\n"
		"///\n"
		"/// @return\n"
		"/// The size in 8-bit (host) bytes of a minimum addressable\n"
		"/// unit from the Architecture's data bus\n"
		"//------------------------------------------------------------------\n"
		"\n"
		""},
	 { (char *)"SBTarget_GetCodeByteSize", _wrap_SBTarget_GetCodeByteSize, METH_VARARGS, (char *)"\n"
		"SBTarget_GetCodeByteSize(SBTarget self) -> uint32_t\n"
		"\n"
		"//------------------------------------------------------------------\n"
		"/// Architecture code byte width accessor\n"
		"///\n"
		"/// @return\n"
		"/// The size in 8-bit (host) bytes of a minimum addressable\n"
		"/// unit from the Architecture's code bus\n"
		"//------------------------------------------------------------------\n"
		"\n"
		""},
	 { (char *)"SBTarget_SetSectionLoadAddress", _wrap_SBTarget_SetSectionLoadAddress, METH_VARARGS, (char *)"SBTarget_SetSectionLoadAddress(SBTarget self, SBSection section, addr_t section_base_addr) -> SBError"},
	 { (char *)"SBTarget_ClearSectionLoadAddress", _wrap_SBTarget_ClearSectionLoadAddress, METH_VARARGS, (char *)"SBTarget_ClearSectionLoadAddress(SBTarget self, SBSection section) -> SBError"},
	 { (char *)"SBTarget_SetModuleLoadAddress", _wrap_SBTarget_SetModuleLoadAddress, METH_VARARGS, (char *)"SBTarget_SetModuleLoadAddress(SBTarget self, SBModule module, int64_t sections_offset) -> SBError"},
	 { (char *)"SBTarget_ClearModuleLoadAddress", _wrap_SBTarget_ClearModuleLoadAddress, METH_VARARGS, (char *)"SBTarget_ClearModuleLoadAddress(SBTarget self, SBModule module) -> SBError"},
	 { (char *)"SBTarget_FindFunctions", _wrap_SBTarget_FindFunctions, METH_VARARGS, (char *)"\n"
		"FindFunctions(char name, uint32_t name_type_mask = eFunctionNameTypeAny) -> SBSymbolContextList\n"
		"SBTarget_FindFunctions(SBTarget self, char name) -> SBSymbolContextList\n"
		"\n"
		"//------------------------------------------------------------------\n"
		"/// Find functions by name.\n"
		"///\n"
		"/// @param[in] name\n"
		"///     The name of the function we are looking for.\n"
		"///\n"
		"/// @param[in] name_type_mask\n"
		"///     A logical OR of one or more FunctionNameType enum bits that\n"
		"///     indicate what kind of names should be used when doing the\n"
		"///     lookup. Bits include fully qualified names, base names,\n"
		"///     C++ methods, or ObjC selectors. \n"
		"///     See FunctionNameType for more details.\n"
		"///\n"
		"/// @return\n"
		"///     A lldb::SBSymbolContextList that gets filled in with all of \n"
		"///     the symbol contexts for all the matches.\n"
		"//------------------------------------------------------------------\n"
		"\n"
		""},
	 { (char *)"SBTarget_FindFirstType", _wrap_SBTarget_FindFirstType, METH_VARARGS, (char *)"SBTarget_FindFirstType(SBTarget self, char type) -> SBType"},
	 { (char *)"SBTarget_FindTypes", _wrap_SBTarget_FindTypes, METH_VARARGS, (char *)"SBTarget_FindTypes(SBTarget self, char type) -> SBTypeList"},
	 { (char *)"SBTarget_GetBasicType", _wrap_SBTarget_GetBasicType, METH_VARARGS, (char *)"SBTarget_GetBasicType(SBTarget self, BasicType type) -> SBType"},
	 { (char *)"SBTarget_GetSourceManager", _wrap_SBTarget_GetSourceManager, METH_VARARGS, (char *)"SBTarget_GetSourceManager(SBTarget self) -> SBSourceManager"},
	 { (char *)"SBTarget_FindFirstGlobalVariable", _wrap_SBTarget_FindFirstGlobalVariable, METH_VARARGS, (char *)"\n"
		"SBTarget_FindFirstGlobalVariable(SBTarget self, char name) -> SBValue\n"
		"\n"
		"//------------------------------------------------------------------\n"
		"/// Find the first global (or static) variable by name.\n"
		"///\n"
		"/// @param[in] name\n"
		"///     The name of the global or static variable we are looking\n"
		"///     for.\n"
		"///\n"
		"/// @return\n"
		"///     An SBValue that gets filled in with the found variable (if any).\n"
		"//------------------------------------------------------------------\n"
		"\n"
		""},
	 { (char *)"SBTarget_FindGlobalVariables", _wrap_SBTarget_FindGlobalVariables, METH_VARARGS, (char *)"\n"
		"FindGlobalVariables(char name, uint32_t max_matches) -> SBValueList\n"
		"SBTarget_FindGlobalVariables(SBTarget self, char name, uint32_t max_matches, MatchType matchtype) -> SBValueList\n"
		"\n"
		"//------------------------------------------------------------------\n"
		"/// Find global and static variables by name.\n"
		"///\n"
		"/// @param[in] name\n"
		"///     The name of the global or static variable we are looking\n"
		"///     for.\n"
		"///\n"
		"/// @param[in] max_matches\n"
		"///     Allow the number of matches to be limited to  max_matches.\n"
		"///\n"
		"/// @return\n"
		"///     A list of matched variables in an SBValueList.\n"
		"//------------------------------------------------------------------\n"
		"\n"
		""},
	 { (char *)"SBTarget_FindGlobalFunctions", _wrap_SBTarget_FindGlobalFunctions, METH_VARARGS, (char *)"SBTarget_FindGlobalFunctions(SBTarget self, char name, uint32_t max_matches, MatchType matchtype) -> SBSymbolContextList"},
	 { (char *)"SBTarget_Clear", _wrap_SBTarget_Clear, METH_VARARGS, (char *)"SBTarget_Clear(SBTarget self)"},
	 { (char *)"SBTarget_ResolveFileAddress", _wrap_SBTarget_ResolveFileAddress, METH_VARARGS, (char *)"\n"
		"SBTarget_ResolveFileAddress(SBTarget self, addr_t file_addr) -> SBAddress\n"
		"\n"
		"//------------------------------------------------------------------\n"
		"/// Resolve a current file address into a section offset address.\n"
		"///\n"
		"/// @param[in] file_addr\n"
		"///\n"
		"/// @return\n"
		"///     An SBAddress which will be valid if...\n"
		"//------------------------------------------------------------------\n"
		"\n"
		""},
	 { (char *)"SBTarget_ResolveLoadAddress", _wrap_SBTarget_ResolveLoadAddress, METH_VARARGS, (char *)"SBTarget_ResolveLoadAddress(SBTarget self, addr_t vm_addr) -> SBAddress"},
	 { (char *)"SBTarget_ResolvePastLoadAddress", _wrap_SBTarget_ResolvePastLoadAddress, METH_VARARGS, (char *)"SBTarget_ResolvePastLoadAddress(SBTarget self, uint32_t stop_id, addr_t vm_addr) -> SBAddress"},
	 { (char *)"SBTarget_ResolveSymbolContextForAddress", _wrap_SBTarget_ResolveSymbolContextForAddress, METH_VARARGS, (char *)"SBTarget_ResolveSymbolContextForAddress(SBTarget self, SBAddress addr, uint32_t resolve_scope) -> SBSymbolContext"},
	 { (char *)"SBTarget_ReadMemory", _wrap_SBTarget_ReadMemory, METH_VARARGS, (char *)"\n"
		"SBTarget_ReadMemory(SBTarget self, SBAddress addr, void buf, SBError error) -> size_t\n"
		"\n"
		"//------------------------------------------------------------------\n"
		"/// Read target memory. If a target process is running then memory  \n"
		"/// is read from here. Otherwise the memory is read from the object\n"
		"/// files. For a target whose bytes are sized as a multiple of host\n"
		"/// bytes, the data read back will preserve the target's byte order.\n"
		"///\n"
		"/// @param[in] addr\n"
		"///     A target address to read from. \n"
		"///\n"
		"/// @param[out] buf\n"
		"///     The buffer to read memory into. \n"
		"///\n"
		"/// @param[in] size\n"
		"///     The maximum number of host bytes to read in the buffer passed\n"
		"///     into this call\n"
		"///\n"
		"/// @param[out] error\n"
		"///     Error information is written here if the memory read fails.\n"
		"///\n"
		"/// @return\n"
		"///     The amount of data read in host bytes.\n"
		"//------------------------------------------------------------------\n"
		"\n"
		""},
	 { (char *)"SBTarget_BreakpointCreateByLocation", _wrap_SBTarget_BreakpointCreateByLocation, METH_VARARGS, (char *)"\n"
		"BreakpointCreateByLocation(char file, uint32_t line) -> SBBreakpoint\n"
		"BreakpointCreateByLocation(SBFileSpec file_spec, uint32_t line) -> SBBreakpoint\n"
		"BreakpointCreateByLocation(SBFileSpec file_spec, uint32_t line, addr_t offset) -> SBBreakpoint\n"
		"SBTarget_BreakpointCreateByLocation(SBTarget self, SBFileSpec file_spec, uint32_t line, \n"
		"    addr_t offset, SBFileSpecList module_list) -> SBBreakpoint\n"
		""},
	 { (char *)"SBTarget_BreakpointCreateByName", _wrap_SBTarget_BreakpointCreateByName, METH_VARARGS, (char *)"\n"
		"BreakpointCreateByName(char symbol_name, char module_name = None) -> SBBreakpoint\n"
		"BreakpointCreateByName(char symbol_name) -> SBBreakpoint\n"
		"BreakpointCreateByName(char symbol_name, uint32_t func_name_type, SBFileSpecList module_list, \n"
		"    SBFileSpecList comp_unit_list) -> SBBreakpoint\n"
		"SBTarget_BreakpointCreateByName(SBTarget self, char symbol_name, uint32_t func_name_type, \n"
		"    LanguageType symbol_language, SBFileSpecList module_list, \n"
		"    SBFileSpecList comp_unit_list) -> SBBreakpoint\n"
		""},
	 { (char *)"SBTarget_BreakpointCreateByNames", _wrap_SBTarget_BreakpointCreateByNames, METH_VARARGS, (char *)"\n"
		"BreakpointCreateByNames(char symbol_name, uint32_t name_type_mask, SBFileSpecList module_list, \n"
		"    SBFileSpecList comp_unit_list) -> SBBreakpoint\n"
		"BreakpointCreateByNames(char symbol_name, uint32_t name_type_mask, LanguageType symbol_language, \n"
		"    SBFileSpecList module_list, \n"
		"    SBFileSpecList comp_unit_list) -> SBBreakpoint\n"
		"SBTarget_BreakpointCreateByNames(SBTarget self, char symbol_name, uint32_t name_type_mask, \n"
		"    LanguageType symbol_language, addr_t offset, \n"
		"    SBFileSpecList module_list, SBFileSpecList comp_unit_list) -> SBBreakpoint\n"
		""},
	 { (char *)"SBTarget_BreakpointCreateByRegex", _wrap_SBTarget_BreakpointCreateByRegex, METH_VARARGS, (char *)"\n"
		"BreakpointCreateByRegex(char symbol_name_regex, char module_name = None) -> SBBreakpoint\n"
		"BreakpointCreateByRegex(char symbol_name_regex) -> SBBreakpoint\n"
		"SBTarget_BreakpointCreateByRegex(SBTarget self, char symbol_name_regex, LanguageType symbol_language, \n"
		"    SBFileSpecList module_list, \n"
		"    SBFileSpecList comp_unit_list) -> SBBreakpoint\n"
		""},
	 { (char *)"SBTarget_BreakpointCreateBySourceRegex", _wrap_SBTarget_BreakpointCreateBySourceRegex, METH_VARARGS, (char *)"\n"
		"BreakpointCreateBySourceRegex(char source_regex, SBFileSpec source_file, char module_name = None) -> SBBreakpoint\n"
		"BreakpointCreateBySourceRegex(char source_regex, SBFileSpec source_file) -> SBBreakpoint\n"
		"BreakpointCreateBySourceRegex(char source_regex, SBFileSpecList module_list, SBFileSpecList file_list) -> SBBreakpoint\n"
		"SBTarget_BreakpointCreateBySourceRegex(SBTarget self, char source_regex, SBFileSpecList module_list, \n"
		"    SBFileSpecList source_file, SBStringList func_names) -> SBBreakpoint\n"
		""},
	 { (char *)"SBTarget_BreakpointCreateForException", _wrap_SBTarget_BreakpointCreateForException, METH_VARARGS, (char *)"\n"
		"BreakpointCreateForException(LanguageType language, bool catch_bp, bool throw_bp) -> SBBreakpoint\n"
		"SBTarget_BreakpointCreateForException(SBTarget self, LanguageType language, bool catch_bp, \n"
		"    bool throw_bp, SBStringList extra_args) -> SBBreakpoint\n"
		""},
	 { (char *)"SBTarget_BreakpointCreateByAddress", _wrap_SBTarget_BreakpointCreateByAddress, METH_VARARGS, (char *)"SBTarget_BreakpointCreateByAddress(SBTarget self, addr_t address) -> SBBreakpoint"},
	 { (char *)"SBTarget_BreakpointCreateBySBAddress", _wrap_SBTarget_BreakpointCreateBySBAddress, METH_VARARGS, (char *)"SBTarget_BreakpointCreateBySBAddress(SBTarget self, SBAddress sb_address) -> SBBreakpoint"},
	 { (char *)"SBTarget_GetNumBreakpoints", _wrap_SBTarget_GetNumBreakpoints, METH_VARARGS, (char *)"SBTarget_GetNumBreakpoints(SBTarget self) -> uint32_t"},
	 { (char *)"SBTarget_GetBreakpointAtIndex", _wrap_SBTarget_GetBreakpointAtIndex, METH_VARARGS, (char *)"SBTarget_GetBreakpointAtIndex(SBTarget self, uint32_t idx) -> SBBreakpoint"},
	 { (char *)"SBTarget_BreakpointDelete", _wrap_SBTarget_BreakpointDelete, METH_VARARGS, (char *)"SBTarget_BreakpointDelete(SBTarget self, break_id_t break_id) -> bool"},
	 { (char *)"SBTarget_FindBreakpointByID", _wrap_SBTarget_FindBreakpointByID, METH_VARARGS, (char *)"SBTarget_FindBreakpointByID(SBTarget self, break_id_t break_id) -> SBBreakpoint"},
	 { (char *)"SBTarget_FindBreakpointsByName", _wrap_SBTarget_FindBreakpointsByName, METH_VARARGS, (char *)"SBTarget_FindBreakpointsByName(SBTarget self, char name, SBBreakpointList bkpt_list) -> bool"},
	 { (char *)"SBTarget_DeleteBreakpointName", _wrap_SBTarget_DeleteBreakpointName, METH_VARARGS, (char *)"SBTarget_DeleteBreakpointName(SBTarget self, char name)"},
	 { (char *)"SBTarget_GetBreakpointNames", _wrap_SBTarget_GetBreakpointNames, METH_VARARGS, (char *)"SBTarget_GetBreakpointNames(SBTarget self, SBStringList names)"},
	 { (char *)"SBTarget_EnableAllBreakpoints", _wrap_SBTarget_EnableAllBreakpoints, METH_VARARGS, (char *)"SBTarget_EnableAllBreakpoints(SBTarget self) -> bool"},
	 { (char *)"SBTarget_DisableAllBreakpoints", _wrap_SBTarget_DisableAllBreakpoints, METH_VARARGS, (char *)"SBTarget_DisableAllBreakpoints(SBTarget self) -> bool"},
	 { (char *)"SBTarget_DeleteAllBreakpoints", _wrap_SBTarget_DeleteAllBreakpoints, METH_VARARGS, (char *)"SBTarget_DeleteAllBreakpoints(SBTarget self) -> bool"},
	 { (char *)"SBTarget_BreakpointsCreateFromFile", _wrap_SBTarget_BreakpointsCreateFromFile, METH_VARARGS, (char *)"\n"
		"BreakpointsCreateFromFile(SBFileSpec source_file, SBBreakpointList bkpt_list) -> SBError\n"
		"SBTarget_BreakpointsCreateFromFile(SBTarget self, SBFileSpec source_file, SBStringList matching_names, \n"
		"    SBBreakpointList new_bps) -> SBError\n"
		"\n"
		"//------------------------------------------------------------------\n"
		"/// Read breakpoints from source_file and return the newly created \n"
		"/// breakpoints in bkpt_list.\n"
		"///\n"
		"/// @param[in] source_file\n"
		"///    The file from which to read the breakpoints\n"
		"/// \n"
		"/// @param[out] bkpt_list\n"
		"///    A list of the newly created breakpoints.\n"
		"///\n"
		"/// @return\n"
		"///     An SBError detailing any errors in reading in the breakpoints.\n"
		"//------------------------------------------------------------------\n"
		"\n"
		""},
	 { (char *)"SBTarget_BreakpointsWriteToFile", _wrap_SBTarget_BreakpointsWriteToFile, METH_VARARGS, (char *)"\n"
		"BreakpointsWriteToFile(SBFileSpec dest_file) -> SBError\n"
		"BreakpointsWriteToFile(SBFileSpec dest_file, SBBreakpointList bkpt_list, bool append = False) -> SBError\n"
		"SBTarget_BreakpointsWriteToFile(SBTarget self, SBFileSpec dest_file, SBBreakpointList bkpt_list) -> SBError\n"
		""},
	 { (char *)"SBTarget_GetNumWatchpoints", _wrap_SBTarget_GetNumWatchpoints, METH_VARARGS, (char *)"SBTarget_GetNumWatchpoints(SBTarget self) -> uint32_t"},
	 { (char *)"SBTarget_GetWatchpointAtIndex", _wrap_SBTarget_GetWatchpointAtIndex, METH_VARARGS, (char *)"SBTarget_GetWatchpointAtIndex(SBTarget self, uint32_t idx) -> SBWatchpoint"},
	 { (char *)"SBTarget_DeleteWatchpoint", _wrap_SBTarget_DeleteWatchpoint, METH_VARARGS, (char *)"SBTarget_DeleteWatchpoint(SBTarget self, watch_id_t watch_id) -> bool"},
	 { (char *)"SBTarget_FindWatchpointByID", _wrap_SBTarget_FindWatchpointByID, METH_VARARGS, (char *)"SBTarget_FindWatchpointByID(SBTarget self, watch_id_t watch_id) -> SBWatchpoint"},
	 { (char *)"SBTarget_EnableAllWatchpoints", _wrap_SBTarget_EnableAllWatchpoints, METH_VARARGS, (char *)"SBTarget_EnableAllWatchpoints(SBTarget self) -> bool"},
	 { (char *)"SBTarget_DisableAllWatchpoints", _wrap_SBTarget_DisableAllWatchpoints, METH_VARARGS, (char *)"SBTarget_DisableAllWatchpoints(SBTarget self) -> bool"},
	 { (char *)"SBTarget_DeleteAllWatchpoints", _wrap_SBTarget_DeleteAllWatchpoints, METH_VARARGS, (char *)"SBTarget_DeleteAllWatchpoints(SBTarget self) -> bool"},
	 { (char *)"SBTarget_WatchAddress", _wrap_SBTarget_WatchAddress, METH_VARARGS, (char *)"\n"
		"SBTarget_WatchAddress(SBTarget self, addr_t addr, size_t size, bool read, \n"
		"    bool write, SBError error) -> SBWatchpoint\n"
		""},
	 { (char *)"SBTarget_GetBroadcaster", _wrap_SBTarget_GetBroadcaster, METH_VARARGS, (char *)"SBTarget_GetBroadcaster(SBTarget self) -> SBBroadcaster"},
	 { (char *)"SBTarget_CreateValueFromAddress", _wrap_SBTarget_CreateValueFromAddress, METH_VARARGS, (char *)"\n"
		"SBTarget_CreateValueFromAddress(SBTarget self, char name, SBAddress addr, SBType type) -> SBValue\n"
		"\n"
		"//------------------------------------------------------------------\n"
		"/// Create an SBValue with the given name by treating the memory starting at addr as an entity of type.\n"
		"///\n"
		"/// @param[in] name\n"
		"///     The name of the resultant SBValue\n"
		"///\n"
		"/// @param[in] addr\n"
		"///     The address of the start of the memory region to be used.\n"
		"///\n"
		"/// @param[in] type\n"
		"///     The type to use to interpret the memory starting at addr.\n"
		"///\n"
		"/// @return\n"
		"///     An SBValue of the given type, may be invalid if there was an error reading\n"
		"///     the underlying memory.\n"
		"//------------------------------------------------------------------\n"
		"\n"
		""},
	 { (char *)"SBTarget_CreateValueFromData", _wrap_SBTarget_CreateValueFromData, METH_VARARGS, (char *)"SBTarget_CreateValueFromData(SBTarget self, char name, SBData data, SBType type) -> SBValue"},
	 { (char *)"SBTarget_CreateValueFromExpression", _wrap_SBTarget_CreateValueFromExpression, METH_VARARGS, (char *)"SBTarget_CreateValueFromExpression(SBTarget self, char name, char expr) -> SBValue"},
	 { (char *)"SBTarget_ReadInstructions", _wrap_SBTarget_ReadInstructions, METH_VARARGS, (char *)"\n"
		"ReadInstructions(SBAddress base_addr, uint32_t count) -> SBInstructionList\n"
		"SBTarget_ReadInstructions(SBTarget self, SBAddress base_addr, uint32_t count, \n"
		"    char flavor_string) -> SBInstructionList\n"
		"\n"
		"Disassemble a specified number of instructions starting at an address.\n"
		"Parameters:\n"
		"   base_addr       -- the address to start disassembly from\n"
		"   count           -- the number of instructions to disassemble\n"
		"   flavor_string   -- may be 'intel' or 'att' on x86 targets to specify that style of disassembly\n"
		"Returns an SBInstructionList.\n"
		""},
	 { (char *)"SBTarget_GetInstructions", _wrap_SBTarget_GetInstructions, METH_VARARGS, (char *)"\n"
		"SBTarget_GetInstructions(SBTarget self, SBAddress base_addr, void buf) -> SBInstructionList\n"
		"\n"
		"Disassemble the bytes in a buffer and return them in an SBInstructionList.\n"
		"Parameters:\n"
		"   base_addr -- used for symbolicating the offsets in the byte stream when disassembling\n"
		"   buf       -- bytes to be disassembled\n"
		"   size      -- (C++) size of the buffer\n"
		"Returns an SBInstructionList.\n"
		""},
	 { (char *)"SBTarget_GetInstructionsWithFlavor", _wrap_SBTarget_GetInstructionsWithFlavor, METH_VARARGS, (char *)"\n"
		"SBTarget_GetInstructionsWithFlavor(SBTarget self, SBAddress base_addr, char flavor_string, \n"
		"    void buf) -> SBInstructionList\n"
		"\n"
		"Disassemble the bytes in a buffer and return them in an SBInstructionList, with a supplied flavor.\n"
		"Parameters:\n"
		"   base_addr -- used for symbolicating the offsets in the byte stream when disassembling\n"
		"   flavor    -- may be 'intel' or 'att' on x86 targets to specify that style of disassembly\n"
		"   buf       -- bytes to be disassembled\n"
		"   size      -- (C++) size of the buffer\n"
		"Returns an SBInstructionList.\n"
		""},
	 { (char *)"SBTarget_FindSymbols", _wrap_SBTarget_FindSymbols, METH_VARARGS, (char *)"\n"
		"FindSymbols(char name, SymbolType type = eSymbolTypeAny) -> SBSymbolContextList\n"
		"SBTarget_FindSymbols(SBTarget self, char name) -> SBSymbolContextList\n"
		""},
	 { (char *)"SBTarget_GetDescription", _wrap_SBTarget_GetDescription, METH_VARARGS, (char *)"SBTarget_GetDescription(SBTarget self, SBStream description, DescriptionLevel description_level) -> bool"},
	 { (char *)"SBTarget_GetStackRedZoneSize", _wrap_SBTarget_GetStackRedZoneSize, METH_VARARGS, (char *)"SBTarget_GetStackRedZoneSize(SBTarget self) -> addr_t"},
	 { (char *)"SBTarget_GetLaunchInfo", _wrap_SBTarget_GetLaunchInfo, METH_VARARGS, (char *)"SBTarget_GetLaunchInfo(SBTarget self) -> SBLaunchInfo"},
	 { (char *)"SBTarget_SetLaunchInfo", _wrap_SBTarget_SetLaunchInfo, METH_VARARGS, (char *)"SBTarget_SetLaunchInfo(SBTarget self, SBLaunchInfo launch_info)"},
	 { (char *)"SBTarget___eq__", _wrap_SBTarget___eq__, METH_VARARGS, (char *)"SBTarget___eq__(SBTarget self, SBTarget rhs) -> bool"},
	 { (char *)"SBTarget___ne__", _wrap_SBTarget___ne__, METH_VARARGS, (char *)"SBTarget___ne__(SBTarget self, SBTarget rhs) -> bool"},
	 { (char *)"SBTarget_EvaluateExpression", _wrap_SBTarget_EvaluateExpression, METH_VARARGS, (char *)"\n"
		"EvaluateExpression(char expr) -> SBValue\n"
		"SBTarget_EvaluateExpression(SBTarget self, char expr, SBExpressionOptions options) -> SBValue\n"
		""},
	 { (char *)"SBTarget___str__", _wrap_SBTarget___str__, METH_VARARGS, (char *)"SBTarget___str__(SBTarget self) -> PyObject"},
	 { (char *)"SBTarget_swigregister", SBTarget_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBThread", _wrap_new_SBThread, METH_VARARGS, (char *)"\n"
		"SBThread()\n"
		"new_SBThread(SBThread thread) -> SBThread\n"
		""},
	 { (char *)"delete_SBThread", _wrap_delete_SBThread, METH_VARARGS, (char *)"delete_SBThread(SBThread self)"},
	 { (char *)"SBThread_GetBroadcasterClassName", _wrap_SBThread_GetBroadcasterClassName, METH_VARARGS, (char *)"SBThread_GetBroadcasterClassName() -> char"},
	 { (char *)"SBThread_EventIsThreadEvent", _wrap_SBThread_EventIsThreadEvent, METH_VARARGS, (char *)"SBThread_EventIsThreadEvent(SBEvent event) -> bool"},
	 { (char *)"SBThread_GetStackFrameFromEvent", _wrap_SBThread_GetStackFrameFromEvent, METH_VARARGS, (char *)"SBThread_GetStackFrameFromEvent(SBEvent event) -> SBFrame"},
	 { (char *)"SBThread_GetThreadFromEvent", _wrap_SBThread_GetThreadFromEvent, METH_VARARGS, (char *)"SBThread_GetThreadFromEvent(SBEvent event) -> SBThread"},
	 { (char *)"SBThread_IsValid", _wrap_SBThread_IsValid, METH_VARARGS, (char *)"SBThread_IsValid(SBThread self) -> bool"},
	 { (char *)"SBThread_Clear", _wrap_SBThread_Clear, METH_VARARGS, (char *)"SBThread_Clear(SBThread self)"},
	 { (char *)"SBThread_GetStopReason", _wrap_SBThread_GetStopReason, METH_VARARGS, (char *)"SBThread_GetStopReason(SBThread self) -> StopReason"},
	 { (char *)"SBThread_GetStopReasonDataCount", _wrap_SBThread_GetStopReasonDataCount, METH_VARARGS, (char *)"\n"
		"SBThread_GetStopReasonDataCount(SBThread self) -> size_t\n"
		"\n"
		"/// Get the number of words associated with the stop reason.\n"
		"/// See also GetStopReasonDataAtIndex().\n"
		"\n"
		""},
	 { (char *)"SBThread_GetStopReasonDataAtIndex", _wrap_SBThread_GetStopReasonDataAtIndex, METH_VARARGS, (char *)"\n"
		"SBThread_GetStopReasonDataAtIndex(SBThread self, uint32_t idx) -> uint64_t\n"
		"\n"
		"//--------------------------------------------------------------------------\n"
		"/// Get information associated with a stop reason.\n"
		"///\n"
		"/// Breakpoint stop reasons will have data that consists of pairs of \n"
		"/// breakpoint IDs followed by the breakpoint location IDs (they always come\n"
		"/// in pairs).\n"
		"///\n"
		"/// Stop Reason              Count Data Type\n"
		"/// ======================== ===== =========================================\n"
		"/// eStopReasonNone          0\n"
		"/// eStopReasonTrace         0\n"
		"/// eStopReasonBreakpoint    N     duple: {breakpoint id, location id}\n"
		"/// eStopReasonWatchpoint    1     watchpoint id\n"
		"/// eStopReasonSignal        1     unix signal number\n"
		"/// eStopReasonException     N     exception data\n"
		"/// eStopReasonExec          0\n"
		"/// eStopReasonPlanComplete  0\n"
		"//--------------------------------------------------------------------------\n"
		"\n"
		""},
	 { (char *)"SBThread_GetStopReasonExtendedInfoAsJSON", _wrap_SBThread_GetStopReasonExtendedInfoAsJSON, METH_VARARGS, (char *)"\n"
		"Collects a thread's stop reason extended information dictionary and prints it\n"
		"into the SBStream in a JSON format. The format of this JSON dictionary depends\n"
		"on the stop reason and is currently used only for instrumentation plugins.\n"
		"\n"
		""},
	 { (char *)"SBThread_GetStopReasonExtendedBacktraces", _wrap_SBThread_GetStopReasonExtendedBacktraces, METH_VARARGS, (char *)"\n"
		"Returns a collection of historical stack traces that are significant to the\n"
		"current stop reason. Used by ThreadSanitizer, where we provide various stack\n"
		"traces that were involved in a data race or other type of detected issue.\n"
		"\n"
		""},
	 { (char *)"SBThread_GetStopDescription", _wrap_SBThread_GetStopDescription, METH_VARARGS, (char *)"\n"
		"Pass only an (int)length and expect to get a Python string describing the\n"
		"stop reason.\n"
		"\n"
		""},
	 { (char *)"SBThread_GetStopReturnValue", _wrap_SBThread_GetStopReturnValue, METH_VARARGS, (char *)"\n"
		"If the last stop on this thread was a thread plan that gathered a return value from the stop,\n"
		"this function will fetch that stop result.  At present only the \"step-out\" thread plan gathers\n"
		"stop return values.\n"
		"\n"
		""},
	 { (char *)"SBThread_GetStopErrorValue", _wrap_SBThread_GetStopErrorValue, METH_VARARGS, (char *)"\n"
		"If the last stop on this thread was a thread plan that gathered an error value from the stop,\n"
		"this function will fetch that stop result.  At present only the \"step-out\" thread plan gathers\n"
		"stop error values, and that only for stepping out of Swift functions.\n"
		"\n"
		""},
	 { (char *)"SBThread_GetThreadID", _wrap_SBThread_GetThreadID, METH_VARARGS, (char *)"\n"
		"Returns a unique thread identifier (type lldb::tid_t, typically a 64-bit type)\n"
		"for the current SBThread that will remain constant throughout the thread's\n"
		"lifetime in this process and will not be reused by another thread during this\n"
		"process lifetime.  On Mac OS X systems, this is a system-wide unique thread\n"
		"identifier; this identifier is also used by other tools like sample which helps\n"
		"to associate data from those tools with lldb.  See related GetIndexID.\n"
		"\n"
		""},
	 { (char *)"SBThread_GetIndexID", _wrap_SBThread_GetIndexID, METH_VARARGS, (char *)"\n"
		"Return the index number for this SBThread.  The index number is the same thing\n"
		"that a user gives as an argument to 'thread select' in the command line lldb.\n"
		"These numbers start at 1 (for the first thread lldb sees in a debug session)\n"
		"and increments up throughout the process lifetime.  An index number will not be\n"
		"reused for a different thread later in a process - thread 1 will always be\n"
		"associated with the same thread.  See related GetThreadID.\n"
		"This method returns a uint32_t index number, takes no arguments.\n"
		"\n"
		""},
	 { (char *)"SBThread_GetName", _wrap_SBThread_GetName, METH_VARARGS, (char *)"SBThread_GetName(SBThread self) -> char"},
	 { (char *)"SBThread_GetQueueName", _wrap_SBThread_GetQueueName, METH_VARARGS, (char *)"\n"
		"Return the queue name associated with this thread, if any, as a str.\n"
		"For example, with a libdispatch (aka Grand Central Dispatch) queue.\n"
		"\n"
		""},
	 { (char *)"SBThread_GetQueueID", _wrap_SBThread_GetQueueID, METH_VARARGS, (char *)"\n"
		"Return the dispatch_queue_id for this thread, if any, as a lldb::queue_id_t.\n"
		"For example, with a libdispatch (aka Grand Central Dispatch) queue.\n"
		"\n"
		""},
	 { (char *)"SBThread_GetInfoItemByPathAsString", _wrap_SBThread_GetInfoItemByPathAsString, METH_VARARGS, (char *)"\n"
		"SBThread_GetInfoItemByPathAsString(SBThread self, char path, SBStream strm) -> bool\n"
		"\n"
		"//--------------------------------------------------------------------------\n"
		"/// Takes a path string and a SBStream reference as parameters, returns a bool.  \n"
		"/// Collects the thread's 'info' dictionary from the remote system, uses the path\n"
		"/// argument to descend into the dictionary to an item of interest, and prints\n"
		"/// it into the SBStream in a natural format.  Return bool is to indicate if\n"
		"/// anything was printed into the stream (true) or not (false).\n"
		"//--------------------------------------------------------------------------\n"
		"\n"
		""},
	 { (char *)"SBThread_GetQueue", _wrap_SBThread_GetQueue, METH_VARARGS, (char *)"\n"
		"Return the SBQueue for this thread.  If this thread is not currently associated\n"
		"with a libdispatch queue, the SBQueue object's IsValid() method will return false.\n"
		"If this SBThread is actually a HistoryThread, we may be able to provide QueueID\n"
		"and QueueName, but not provide an SBQueue.  Those individual attributes may have\n"
		"been saved for the HistoryThread without enough information to reconstitute the\n"
		"entire SBQueue at that time.\n"
		"This method takes no arguments, returns an SBQueue.\n"
		"\n"
		""},
	 { (char *)"SBThread_StepOver", _wrap_SBThread_StepOver, METH_VARARGS, (char *)"\n"
		"StepOver(RunMode stop_other_threads = eOnlyDuringStepping)\n"
		"SBThread_StepOver(SBThread self)\n"
		""},
	 { (char *)"SBThread_StepInto", _wrap_SBThread_StepInto, METH_VARARGS, (char *)"\n"
		"StepInto(RunMode stop_other_threads = eOnlyDuringStepping)\n"
		"StepInto()\n"
		"StepInto(char target_name, RunMode stop_other_threads = eOnlyDuringStepping)\n"
		"StepInto(char target_name)\n"
		"\n"
		"    Step  the current thread from the current source line to the line given by end_line, stopping if\n"
		"    the thread steps into the function given by target_name.  If target_name is None, then stepping will stop\n"
		"    in any of the places we would normally stop.\n"
		"    \n"
		"\n"
		"    Step  the current thread from the current source line to the line given by end_line, stopping if\n"
		"    the thread steps into the function given by target_name.  If target_name is None, then stepping will stop\n"
		"    in any of the places we would normally stop.\n"
		"    \n"
		""},
	 { (char *)"SBThread_StepOut", _wrap_SBThread_StepOut, METH_VARARGS, (char *)"SBThread_StepOut(SBThread self)"},
	 { (char *)"SBThread_StepOutOfFrame", _wrap_SBThread_StepOutOfFrame, METH_VARARGS, (char *)"SBThread_StepOutOfFrame(SBThread self, SBFrame frame)"},
	 { (char *)"SBThread_StepInstruction", _wrap_SBThread_StepInstruction, METH_VARARGS, (char *)"SBThread_StepInstruction(SBThread self, bool step_over)"},
	 { (char *)"SBThread_StepOverUntil", _wrap_SBThread_StepOverUntil, METH_VARARGS, (char *)"\n"
		"SBThread_StepOverUntil(SBThread self, SBFrame frame, SBFileSpec file_spec, \n"
		"    uint32_t line) -> SBError\n"
		""},
	 { (char *)"SBThread_StepUsingScriptedThreadPlan", _wrap_SBThread_StepUsingScriptedThreadPlan, METH_VARARGS, (char *)"\n"
		"StepUsingScriptedThreadPlan(char script_class_name) -> SBError\n"
		"SBThread_StepUsingScriptedThreadPlan(SBThread self, char script_class_name, bool resume_immediately) -> SBError\n"
		""},
	 { (char *)"SBThread_JumpToLine", _wrap_SBThread_JumpToLine, METH_VARARGS, (char *)"SBThread_JumpToLine(SBThread self, SBFileSpec file_spec, uint32_t line) -> SBError"},
	 { (char *)"SBThread_RunToAddress", _wrap_SBThread_RunToAddress, METH_VARARGS, (char *)"SBThread_RunToAddress(SBThread self, addr_t addr)"},
	 { (char *)"SBThread_ReturnFromFrame", _wrap_SBThread_ReturnFromFrame, METH_VARARGS, (char *)"\n"
		"Force a return from the frame passed in (and any frames younger than it)\n"
		"without executing any more code in those frames.  If return_value contains\n"
		"a valid SBValue, that will be set as the return value from frame.  Note, at\n"
		"present only scalar return values are supported.\n"
		"\n"
		""},
	 { (char *)"SBThread_UnwindInnermostExpression", _wrap_SBThread_UnwindInnermostExpression, METH_VARARGS, (char *)"\n"
		"Unwind the stack frames from the innermost expression evaluation.\n"
		"This API is equivalent to 'thread return -x'.\n"
		"\n"
		""},
	 { (char *)"SBThread_Suspend", _wrap_SBThread_Suspend, METH_VARARGS, (char *)"\n"
		"SBThread_Suspend(SBThread self) -> bool\n"
		"\n"
		"//--------------------------------------------------------------------------\n"
		"/// LLDB currently supports process centric debugging which means when any\n"
		"/// thread in a process stops, all other threads are stopped. The Suspend()\n"
		"/// call here tells our process to suspend a thread and not let it run when\n"
		"/// the other threads in a process are allowed to run. So when \n"
		"/// SBProcess::Continue() is called, any threads that aren't suspended will\n"
		"/// be allowed to run. If any of the SBThread functions for stepping are \n"
		"/// called (StepOver, StepInto, StepOut, StepInstruction, RunToAddres), the\n"
		"/// thread will now be allowed to run and these functions will simply return.\n"
		"///\n"
		"/// Eventually we plan to add support for thread centric debugging where\n"
		"/// each thread is controlled individually and each thread would broadcast\n"
		"/// its state, but we haven't implemented this yet.\n"
		"/// \n"
		"/// Likewise the SBThread::Resume() call will again allow the thread to run\n"
		"/// when the process is continued.\n"
		"///\n"
		"/// Suspend() and Resume() functions are not currently reference counted, if\n"
		"/// anyone has the need for them to be reference counted, please let us\n"
		"/// know.\n"
		"//--------------------------------------------------------------------------\n"
		"\n"
		""},
	 { (char *)"SBThread_Resume", _wrap_SBThread_Resume, METH_VARARGS, (char *)"SBThread_Resume(SBThread self) -> bool"},
	 { (char *)"SBThread_IsSuspended", _wrap_SBThread_IsSuspended, METH_VARARGS, (char *)"SBThread_IsSuspended(SBThread self) -> bool"},
	 { (char *)"SBThread_IsStopped", _wrap_SBThread_IsStopped, METH_VARARGS, (char *)"SBThread_IsStopped(SBThread self) -> bool"},
	 { (char *)"SBThread_GetNumFrames", _wrap_SBThread_GetNumFrames, METH_VARARGS, (char *)"SBThread_GetNumFrames(SBThread self) -> uint32_t"},
	 { (char *)"SBThread_GetFrameAtIndex", _wrap_SBThread_GetFrameAtIndex, METH_VARARGS, (char *)"SBThread_GetFrameAtIndex(SBThread self, uint32_t idx) -> SBFrame"},
	 { (char *)"SBThread_GetSelectedFrame", _wrap_SBThread_GetSelectedFrame, METH_VARARGS, (char *)"SBThread_GetSelectedFrame(SBThread self) -> SBFrame"},
	 { (char *)"SBThread_SetSelectedFrame", _wrap_SBThread_SetSelectedFrame, METH_VARARGS, (char *)"SBThread_SetSelectedFrame(SBThread self, uint32_t frame_idx) -> SBFrame"},
	 { (char *)"SBThread_GetProcess", _wrap_SBThread_GetProcess, METH_VARARGS, (char *)"SBThread_GetProcess(SBThread self) -> SBProcess"},
	 { (char *)"SBThread_GetDescription", _wrap_SBThread_GetDescription, METH_VARARGS, (char *)"\n"
		"GetDescription(SBStream description) -> bool\n"
		"SBThread_GetDescription(SBThread self, SBStream description, bool stop_format) -> bool\n"
		""},
	 { (char *)"SBThread_GetStatus", _wrap_SBThread_GetStatus, METH_VARARGS, (char *)"SBThread_GetStatus(SBThread self, SBStream status) -> bool"},
	 { (char *)"SBThread___eq__", _wrap_SBThread___eq__, METH_VARARGS, (char *)"SBThread___eq__(SBThread self, SBThread rhs) -> bool"},
	 { (char *)"SBThread___ne__", _wrap_SBThread___ne__, METH_VARARGS, (char *)"SBThread___ne__(SBThread self, SBThread rhs) -> bool"},
	 { (char *)"SBThread_GetExtendedBacktraceThread", _wrap_SBThread_GetExtendedBacktraceThread, METH_VARARGS, (char *)"\n"
		"Given an argument of str to specify the type of thread-origin extended\n"
		"backtrace to retrieve, query whether the origin of this thread is \n"
		"available.  An SBThread is retured; SBThread.IsValid will return true\n"
		"if an extended backtrace was available.  The returned SBThread is not\n"
		"a part of the SBProcess' thread list and it cannot be manipulated like\n"
		"normal threads -- you cannot step or resume it, for instance -- it is\n"
		"intended to used primarily for generating a backtrace.  You may request\n"
		"the returned thread's own thread origin in turn.\n"
		"\n"
		""},
	 { (char *)"SBThread_GetExtendedBacktraceOriginatingIndexID", _wrap_SBThread_GetExtendedBacktraceOriginatingIndexID, METH_VARARGS, (char *)"\n"
		"Takes no arguments, returns a uint32_t.\n"
		"If this SBThread is an ExtendedBacktrace thread, get the IndexID of the\n"
		"original thread that this ExtendedBacktrace thread represents, if \n"
		"available.  The thread that was running this backtrace in the past may\n"
		"not have been registered with lldb's thread index (if it was created,\n"
		"did its work, and was destroyed without lldb ever stopping execution).\n"
		"In that case, this ExtendedBacktrace thread's IndexID will be returned.\n"
		"\n"
		""},
	 { (char *)"SBThread_SafeToCallFunctions", _wrap_SBThread_SafeToCallFunctions, METH_VARARGS, (char *)"\n"
		"Takes no arguments, returns a bool.\n"
		"lldb may be able to detect that function calls should not be executed\n"
		"on a given thread at a particular point in time.  It is recommended that\n"
		"this is checked before performing an inferior function call on a given\n"
		"thread.\n"
		"\n"
		""},
	 { (char *)"SBThread___str__", _wrap_SBThread___str__, METH_VARARGS, (char *)"SBThread___str__(SBThread self) -> PyObject"},
	 { (char *)"SBThread_swigregister", SBThread_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBThreadCollection", _wrap_new_SBThreadCollection, METH_VARARGS, (char *)"\n"
		"SBThreadCollection()\n"
		"new_SBThreadCollection(SBThreadCollection rhs) -> SBThreadCollection\n"
		""},
	 { (char *)"delete_SBThreadCollection", _wrap_delete_SBThreadCollection, METH_VARARGS, (char *)"delete_SBThreadCollection(SBThreadCollection self)"},
	 { (char *)"SBThreadCollection_IsValid", _wrap_SBThreadCollection_IsValid, METH_VARARGS, (char *)"SBThreadCollection_IsValid(SBThreadCollection self) -> bool"},
	 { (char *)"SBThreadCollection_GetSize", _wrap_SBThreadCollection_GetSize, METH_VARARGS, (char *)"SBThreadCollection_GetSize(SBThreadCollection self) -> size_t"},
	 { (char *)"SBThreadCollection_GetThreadAtIndex", _wrap_SBThreadCollection_GetThreadAtIndex, METH_VARARGS, (char *)"SBThreadCollection_GetThreadAtIndex(SBThreadCollection self, size_t idx) -> SBThread"},
	 { (char *)"SBThreadCollection_swigregister", SBThreadCollection_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBThreadPlan", _wrap_new_SBThreadPlan, METH_VARARGS, (char *)"\n"
		"SBThreadPlan()\n"
		"SBThreadPlan(SBThreadPlan threadPlan)\n"
		"SBThreadPlan(ThreadPlanSP lldb_object_sp)\n"
		"new_SBThreadPlan(SBThread thread, char class_name) -> SBThreadPlan\n"
		""},
	 { (char *)"delete_SBThreadPlan", _wrap_delete_SBThreadPlan, METH_VARARGS, (char *)"delete_SBThreadPlan(SBThreadPlan self)"},
	 { (char *)"SBThreadPlan_Clear", _wrap_SBThreadPlan_Clear, METH_VARARGS, (char *)"SBThreadPlan_Clear(SBThreadPlan self)"},
	 { (char *)"SBThreadPlan_GetStopReason", _wrap_SBThreadPlan_GetStopReason, METH_VARARGS, (char *)"SBThreadPlan_GetStopReason(SBThreadPlan self) -> StopReason"},
	 { (char *)"SBThreadPlan_GetStopReasonDataCount", _wrap_SBThreadPlan_GetStopReasonDataCount, METH_VARARGS, (char *)"SBThreadPlan_GetStopReasonDataCount(SBThreadPlan self) -> size_t"},
	 { (char *)"SBThreadPlan_GetStopReasonDataAtIndex", _wrap_SBThreadPlan_GetStopReasonDataAtIndex, METH_VARARGS, (char *)"SBThreadPlan_GetStopReasonDataAtIndex(SBThreadPlan self, uint32_t idx) -> uint64_t"},
	 { (char *)"SBThreadPlan_GetThread", _wrap_SBThreadPlan_GetThread, METH_VARARGS, (char *)"SBThreadPlan_GetThread(SBThreadPlan self) -> SBThread"},
	 { (char *)"SBThreadPlan_GetDescription", _wrap_SBThreadPlan_GetDescription, METH_VARARGS, (char *)"SBThreadPlan_GetDescription(SBThreadPlan self, SBStream description) -> bool"},
	 { (char *)"SBThreadPlan_SetPlanComplete", _wrap_SBThreadPlan_SetPlanComplete, METH_VARARGS, (char *)"SBThreadPlan_SetPlanComplete(SBThreadPlan self, bool success)"},
	 { (char *)"SBThreadPlan_IsPlanComplete", _wrap_SBThreadPlan_IsPlanComplete, METH_VARARGS, (char *)"SBThreadPlan_IsPlanComplete(SBThreadPlan self) -> bool"},
	 { (char *)"SBThreadPlan_IsPlanStale", _wrap_SBThreadPlan_IsPlanStale, METH_VARARGS, (char *)"SBThreadPlan_IsPlanStale(SBThreadPlan self) -> bool"},
	 { (char *)"SBThreadPlan_IsValid", _wrap_SBThreadPlan_IsValid, METH_VARARGS, (char *)"\n"
		"IsValid() -> bool\n"
		"SBThreadPlan_IsValid(SBThreadPlan self) -> bool\n"
		""},
	 { (char *)"SBThreadPlan_QueueThreadPlanForStepOverRange", _wrap_SBThreadPlan_QueueThreadPlanForStepOverRange, METH_VARARGS, (char *)"SBThreadPlan_QueueThreadPlanForStepOverRange(SBThreadPlan self, SBAddress start_address, addr_t range_size) -> SBThreadPlan"},
	 { (char *)"SBThreadPlan_QueueThreadPlanForStepInRange", _wrap_SBThreadPlan_QueueThreadPlanForStepInRange, METH_VARARGS, (char *)"SBThreadPlan_QueueThreadPlanForStepInRange(SBThreadPlan self, SBAddress start_address, addr_t range_size) -> SBThreadPlan"},
	 { (char *)"SBThreadPlan_QueueThreadPlanForStepOut", _wrap_SBThreadPlan_QueueThreadPlanForStepOut, METH_VARARGS, (char *)"\n"
		"QueueThreadPlanForStepOut(uint32_t frame_idx_to_step_to, bool first_insn = False) -> SBThreadPlan\n"
		"SBThreadPlan_QueueThreadPlanForStepOut(SBThreadPlan self, uint32_t frame_idx_to_step_to) -> SBThreadPlan\n"
		""},
	 { (char *)"SBThreadPlan_QueueThreadPlanForRunToAddress", _wrap_SBThreadPlan_QueueThreadPlanForRunToAddress, METH_VARARGS, (char *)"SBThreadPlan_QueueThreadPlanForRunToAddress(SBThreadPlan self, SBAddress address) -> SBThreadPlan"},
	 { (char *)"SBThreadPlan_swigregister", SBThreadPlan_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBTrace", _wrap_new_SBTrace, METH_VARARGS, (char *)"new_SBTrace() -> SBTrace"},
	 { (char *)"SBTrace_GetTraceData", _wrap_SBTrace_GetTraceData, METH_VARARGS, (char *)"\n"
		"SBTrace_GetTraceData(SBTrace self, SBError error, void buf, size_t offset, \n"
		"    tid_t thread_id) -> size_t\n"
		""},
	 { (char *)"SBTrace_GetMetaData", _wrap_SBTrace_GetMetaData, METH_VARARGS, (char *)"\n"
		"SBTrace_GetMetaData(SBTrace self, SBError error, void buf, size_t offset, \n"
		"    tid_t thread_id) -> size_t\n"
		""},
	 { (char *)"SBTrace_StopTrace", _wrap_SBTrace_StopTrace, METH_VARARGS, (char *)"SBTrace_StopTrace(SBTrace self, SBError error, tid_t thread_id)"},
	 { (char *)"SBTrace_GetTraceConfig", _wrap_SBTrace_GetTraceConfig, METH_VARARGS, (char *)"SBTrace_GetTraceConfig(SBTrace self, SBTraceOptions options, SBError error)"},
	 { (char *)"SBTrace_GetTraceUID", _wrap_SBTrace_GetTraceUID, METH_VARARGS, (char *)"SBTrace_GetTraceUID(SBTrace self) -> user_id_t"},
	 { (char *)"SBTrace_IsValid", _wrap_SBTrace_IsValid, METH_VARARGS, (char *)"SBTrace_IsValid(SBTrace self) -> bool"},
	 { (char *)"delete_SBTrace", _wrap_delete_SBTrace, METH_VARARGS, (char *)"delete_SBTrace(SBTrace self)"},
	 { (char *)"SBTrace_swigregister", SBTrace_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBTraceOptions", _wrap_new_SBTraceOptions, METH_VARARGS, (char *)"new_SBTraceOptions() -> SBTraceOptions"},
	 { (char *)"SBTraceOptions_getType", _wrap_SBTraceOptions_getType, METH_VARARGS, (char *)"SBTraceOptions_getType(SBTraceOptions self) -> TraceType"},
	 { (char *)"SBTraceOptions_getTraceBufferSize", _wrap_SBTraceOptions_getTraceBufferSize, METH_VARARGS, (char *)"SBTraceOptions_getTraceBufferSize(SBTraceOptions self) -> uint64_t"},
	 { (char *)"SBTraceOptions_getTraceParams", _wrap_SBTraceOptions_getTraceParams, METH_VARARGS, (char *)"SBTraceOptions_getTraceParams(SBTraceOptions self, SBError error) -> SBStructuredData"},
	 { (char *)"SBTraceOptions_getMetaDataBufferSize", _wrap_SBTraceOptions_getMetaDataBufferSize, METH_VARARGS, (char *)"SBTraceOptions_getMetaDataBufferSize(SBTraceOptions self) -> uint64_t"},
	 { (char *)"SBTraceOptions_setTraceParams", _wrap_SBTraceOptions_setTraceParams, METH_VARARGS, (char *)"SBTraceOptions_setTraceParams(SBTraceOptions self, SBStructuredData params)"},
	 { (char *)"SBTraceOptions_setType", _wrap_SBTraceOptions_setType, METH_VARARGS, (char *)"SBTraceOptions_setType(SBTraceOptions self, TraceType type)"},
	 { (char *)"SBTraceOptions_setTraceBufferSize", _wrap_SBTraceOptions_setTraceBufferSize, METH_VARARGS, (char *)"SBTraceOptions_setTraceBufferSize(SBTraceOptions self, uint64_t size)"},
	 { (char *)"SBTraceOptions_setMetaDataBufferSize", _wrap_SBTraceOptions_setMetaDataBufferSize, METH_VARARGS, (char *)"SBTraceOptions_setMetaDataBufferSize(SBTraceOptions self, uint64_t size)"},
	 { (char *)"SBTraceOptions_setThreadID", _wrap_SBTraceOptions_setThreadID, METH_VARARGS, (char *)"SBTraceOptions_setThreadID(SBTraceOptions self, tid_t thread_id)"},
	 { (char *)"SBTraceOptions_getThreadID", _wrap_SBTraceOptions_getThreadID, METH_VARARGS, (char *)"SBTraceOptions_getThreadID(SBTraceOptions self) -> tid_t"},
	 { (char *)"SBTraceOptions_IsValid", _wrap_SBTraceOptions_IsValid, METH_VARARGS, (char *)"SBTraceOptions_IsValid(SBTraceOptions self) -> bool"},
	 { (char *)"delete_SBTraceOptions", _wrap_delete_SBTraceOptions, METH_VARARGS, (char *)"delete_SBTraceOptions(SBTraceOptions self)"},
	 { (char *)"SBTraceOptions_swigregister", SBTraceOptions_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBTypeMember", _wrap_new_SBTypeMember, METH_VARARGS, (char *)"\n"
		"SBTypeMember()\n"
		"new_SBTypeMember(SBTypeMember rhs) -> SBTypeMember\n"
		""},
	 { (char *)"delete_SBTypeMember", _wrap_delete_SBTypeMember, METH_VARARGS, (char *)"delete_SBTypeMember(SBTypeMember self)"},
	 { (char *)"SBTypeMember_IsValid", _wrap_SBTypeMember_IsValid, METH_VARARGS, (char *)"SBTypeMember_IsValid(SBTypeMember self) -> bool"},
	 { (char *)"SBTypeMember_GetName", _wrap_SBTypeMember_GetName, METH_VARARGS, (char *)"SBTypeMember_GetName(SBTypeMember self) -> char"},
	 { (char *)"SBTypeMember_GetType", _wrap_SBTypeMember_GetType, METH_VARARGS, (char *)"SBTypeMember_GetType(SBTypeMember self) -> SBType"},
	 { (char *)"SBTypeMember_GetOffsetInBytes", _wrap_SBTypeMember_GetOffsetInBytes, METH_VARARGS, (char *)"SBTypeMember_GetOffsetInBytes(SBTypeMember self) -> uint64_t"},
	 { (char *)"SBTypeMember_GetOffsetInBits", _wrap_SBTypeMember_GetOffsetInBits, METH_VARARGS, (char *)"SBTypeMember_GetOffsetInBits(SBTypeMember self) -> uint64_t"},
	 { (char *)"SBTypeMember_IsBitfield", _wrap_SBTypeMember_IsBitfield, METH_VARARGS, (char *)"SBTypeMember_IsBitfield(SBTypeMember self) -> bool"},
	 { (char *)"SBTypeMember_GetBitfieldSizeInBits", _wrap_SBTypeMember_GetBitfieldSizeInBits, METH_VARARGS, (char *)"SBTypeMember_GetBitfieldSizeInBits(SBTypeMember self) -> uint32_t"},
	 { (char *)"SBTypeMember___str__", _wrap_SBTypeMember___str__, METH_VARARGS, (char *)"SBTypeMember___str__(SBTypeMember self) -> PyObject"},
	 { (char *)"SBTypeMember_swigregister", SBTypeMember_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBTypeMemberFunction", _wrap_new_SBTypeMemberFunction, METH_VARARGS, (char *)"\n"
		"SBTypeMemberFunction()\n"
		"new_SBTypeMemberFunction(SBTypeMemberFunction rhs) -> SBTypeMemberFunction\n"
		""},
	 { (char *)"delete_SBTypeMemberFunction", _wrap_delete_SBTypeMemberFunction, METH_VARARGS, (char *)"delete_SBTypeMemberFunction(SBTypeMemberFunction self)"},
	 { (char *)"SBTypeMemberFunction_IsValid", _wrap_SBTypeMemberFunction_IsValid, METH_VARARGS, (char *)"SBTypeMemberFunction_IsValid(SBTypeMemberFunction self) -> bool"},
	 { (char *)"SBTypeMemberFunction_GetName", _wrap_SBTypeMemberFunction_GetName, METH_VARARGS, (char *)"SBTypeMemberFunction_GetName(SBTypeMemberFunction self) -> char"},
	 { (char *)"SBTypeMemberFunction_GetDemangledName", _wrap_SBTypeMemberFunction_GetDemangledName, METH_VARARGS, (char *)"SBTypeMemberFunction_GetDemangledName(SBTypeMemberFunction self) -> char"},
	 { (char *)"SBTypeMemberFunction_GetMangledName", _wrap_SBTypeMemberFunction_GetMangledName, METH_VARARGS, (char *)"SBTypeMemberFunction_GetMangledName(SBTypeMemberFunction self) -> char"},
	 { (char *)"SBTypeMemberFunction_GetType", _wrap_SBTypeMemberFunction_GetType, METH_VARARGS, (char *)"SBTypeMemberFunction_GetType(SBTypeMemberFunction self) -> SBType"},
	 { (char *)"SBTypeMemberFunction_GetReturnType", _wrap_SBTypeMemberFunction_GetReturnType, METH_VARARGS, (char *)"SBTypeMemberFunction_GetReturnType(SBTypeMemberFunction self) -> SBType"},
	 { (char *)"SBTypeMemberFunction_GetNumberOfArguments", _wrap_SBTypeMemberFunction_GetNumberOfArguments, METH_VARARGS, (char *)"SBTypeMemberFunction_GetNumberOfArguments(SBTypeMemberFunction self) -> uint32_t"},
	 { (char *)"SBTypeMemberFunction_GetArgumentTypeAtIndex", _wrap_SBTypeMemberFunction_GetArgumentTypeAtIndex, METH_VARARGS, (char *)"SBTypeMemberFunction_GetArgumentTypeAtIndex(SBTypeMemberFunction self, uint32_t arg1) -> SBType"},
	 { (char *)"SBTypeMemberFunction_GetKind", _wrap_SBTypeMemberFunction_GetKind, METH_VARARGS, (char *)"SBTypeMemberFunction_GetKind(SBTypeMemberFunction self) -> MemberFunctionKind"},
	 { (char *)"SBTypeMemberFunction_GetDescription", _wrap_SBTypeMemberFunction_GetDescription, METH_VARARGS, (char *)"SBTypeMemberFunction_GetDescription(SBTypeMemberFunction self, SBStream description, DescriptionLevel description_level) -> bool"},
	 { (char *)"SBTypeMemberFunction___str__", _wrap_SBTypeMemberFunction___str__, METH_VARARGS, (char *)"SBTypeMemberFunction___str__(SBTypeMemberFunction self) -> PyObject"},
	 { (char *)"SBTypeMemberFunction_swigregister", SBTypeMemberFunction_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBType", _wrap_new_SBType, METH_VARARGS, (char *)"\n"
		"SBType()\n"
		"new_SBType(SBType rhs) -> SBType\n"
		""},
	 { (char *)"delete_SBType", _wrap_delete_SBType, METH_VARARGS, (char *)"delete_SBType(SBType self)"},
	 { (char *)"SBType_IsValid", _wrap_SBType_IsValid, METH_VARARGS, (char *)"SBType_IsValid(SBType self) -> bool"},
	 { (char *)"SBType_GetByteSize", _wrap_SBType_GetByteSize, METH_VARARGS, (char *)"SBType_GetByteSize(SBType self) -> uint64_t"},
	 { (char *)"SBType_IsPointerType", _wrap_SBType_IsPointerType, METH_VARARGS, (char *)"SBType_IsPointerType(SBType self) -> bool"},
	 { (char *)"SBType_IsReferenceType", _wrap_SBType_IsReferenceType, METH_VARARGS, (char *)"SBType_IsReferenceType(SBType self) -> bool"},
	 { (char *)"SBType_IsFunctionType", _wrap_SBType_IsFunctionType, METH_VARARGS, (char *)"SBType_IsFunctionType(SBType self) -> bool"},
	 { (char *)"SBType_IsPolymorphicClass", _wrap_SBType_IsPolymorphicClass, METH_VARARGS, (char *)"SBType_IsPolymorphicClass(SBType self) -> bool"},
	 { (char *)"SBType_IsArrayType", _wrap_SBType_IsArrayType, METH_VARARGS, (char *)"SBType_IsArrayType(SBType self) -> bool"},
	 { (char *)"SBType_IsVectorType", _wrap_SBType_IsVectorType, METH_VARARGS, (char *)"SBType_IsVectorType(SBType self) -> bool"},
	 { (char *)"SBType_IsTypedefType", _wrap_SBType_IsTypedefType, METH_VARARGS, (char *)"SBType_IsTypedefType(SBType self) -> bool"},
	 { (char *)"SBType_IsAnonymousType", _wrap_SBType_IsAnonymousType, METH_VARARGS, (char *)"SBType_IsAnonymousType(SBType self) -> bool"},
	 { (char *)"SBType_GetPointerType", _wrap_SBType_GetPointerType, METH_VARARGS, (char *)"SBType_GetPointerType(SBType self) -> SBType"},
	 { (char *)"SBType_GetPointeeType", _wrap_SBType_GetPointeeType, METH_VARARGS, (char *)"SBType_GetPointeeType(SBType self) -> SBType"},
	 { (char *)"SBType_GetReferenceType", _wrap_SBType_GetReferenceType, METH_VARARGS, (char *)"SBType_GetReferenceType(SBType self) -> SBType"},
	 { (char *)"SBType_GetTypedefedType", _wrap_SBType_GetTypedefedType, METH_VARARGS, (char *)"SBType_GetTypedefedType(SBType self) -> SBType"},
	 { (char *)"SBType_GetDereferencedType", _wrap_SBType_GetDereferencedType, METH_VARARGS, (char *)"SBType_GetDereferencedType(SBType self) -> SBType"},
	 { (char *)"SBType_GetUnqualifiedType", _wrap_SBType_GetUnqualifiedType, METH_VARARGS, (char *)"SBType_GetUnqualifiedType(SBType self) -> SBType"},
	 { (char *)"SBType_GetCanonicalType", _wrap_SBType_GetCanonicalType, METH_VARARGS, (char *)"SBType_GetCanonicalType(SBType self) -> SBType"},
	 { (char *)"SBType_GetArrayElementType", _wrap_SBType_GetArrayElementType, METH_VARARGS, (char *)"SBType_GetArrayElementType(SBType self) -> SBType"},
	 { (char *)"SBType_GetArrayType", _wrap_SBType_GetArrayType, METH_VARARGS, (char *)"SBType_GetArrayType(SBType self, uint64_t size) -> SBType"},
	 { (char *)"SBType_GetVectorElementType", _wrap_SBType_GetVectorElementType, METH_VARARGS, (char *)"SBType_GetVectorElementType(SBType self) -> SBType"},
	 { (char *)"SBType_GetBasicType", _wrap_SBType_GetBasicType, METH_VARARGS, (char *)"\n"
		"GetBasicType() -> BasicType\n"
		"SBType_GetBasicType(SBType self, BasicType type) -> SBType\n"
		""},
	 { (char *)"SBType_GetNumberOfFields", _wrap_SBType_GetNumberOfFields, METH_VARARGS, (char *)"SBType_GetNumberOfFields(SBType self) -> uint32_t"},
	 { (char *)"SBType_GetNumberOfDirectBaseClasses", _wrap_SBType_GetNumberOfDirectBaseClasses, METH_VARARGS, (char *)"SBType_GetNumberOfDirectBaseClasses(SBType self) -> uint32_t"},
	 { (char *)"SBType_GetNumberOfVirtualBaseClasses", _wrap_SBType_GetNumberOfVirtualBaseClasses, METH_VARARGS, (char *)"SBType_GetNumberOfVirtualBaseClasses(SBType self) -> uint32_t"},
	 { (char *)"SBType_GetFieldAtIndex", _wrap_SBType_GetFieldAtIndex, METH_VARARGS, (char *)"SBType_GetFieldAtIndex(SBType self, uint32_t idx) -> SBTypeMember"},
	 { (char *)"SBType_GetDirectBaseClassAtIndex", _wrap_SBType_GetDirectBaseClassAtIndex, METH_VARARGS, (char *)"SBType_GetDirectBaseClassAtIndex(SBType self, uint32_t idx) -> SBTypeMember"},
	 { (char *)"SBType_GetVirtualBaseClassAtIndex", _wrap_SBType_GetVirtualBaseClassAtIndex, METH_VARARGS, (char *)"SBType_GetVirtualBaseClassAtIndex(SBType self, uint32_t idx) -> SBTypeMember"},
	 { (char *)"SBType_GetEnumMembers", _wrap_SBType_GetEnumMembers, METH_VARARGS, (char *)"SBType_GetEnumMembers(SBType self) -> SBTypeEnumMemberList"},
	 { (char *)"SBType_GetName", _wrap_SBType_GetName, METH_VARARGS, (char *)"SBType_GetName(SBType self) -> char"},
	 { (char *)"SBType_GetDisplayTypeName", _wrap_SBType_GetDisplayTypeName, METH_VARARGS, (char *)"SBType_GetDisplayTypeName(SBType self) -> char"},
	 { (char *)"SBType_GetTypeClass", _wrap_SBType_GetTypeClass, METH_VARARGS, (char *)"SBType_GetTypeClass(SBType self) -> TypeClass"},
	 { (char *)"SBType_GetNumberOfTemplateArguments", _wrap_SBType_GetNumberOfTemplateArguments, METH_VARARGS, (char *)"SBType_GetNumberOfTemplateArguments(SBType self) -> uint32_t"},
	 { (char *)"SBType_GetTemplateArgumentType", _wrap_SBType_GetTemplateArgumentType, METH_VARARGS, (char *)"SBType_GetTemplateArgumentType(SBType self, uint32_t idx) -> SBType"},
	 { (char *)"SBType_GetTemplateArgumentKind", _wrap_SBType_GetTemplateArgumentKind, METH_VARARGS, (char *)"SBType_GetTemplateArgumentKind(SBType self, uint32_t idx) -> TemplateArgumentKind"},
	 { (char *)"SBType_GetFunctionReturnType", _wrap_SBType_GetFunctionReturnType, METH_VARARGS, (char *)"SBType_GetFunctionReturnType(SBType self) -> SBType"},
	 { (char *)"SBType_GetFunctionArgumentTypes", _wrap_SBType_GetFunctionArgumentTypes, METH_VARARGS, (char *)"SBType_GetFunctionArgumentTypes(SBType self) -> SBTypeList"},
	 { (char *)"SBType_GetNumberOfMemberFunctions", _wrap_SBType_GetNumberOfMemberFunctions, METH_VARARGS, (char *)"SBType_GetNumberOfMemberFunctions(SBType self) -> uint32_t"},
	 { (char *)"SBType_GetMemberFunctionAtIndex", _wrap_SBType_GetMemberFunctionAtIndex, METH_VARARGS, (char *)"SBType_GetMemberFunctionAtIndex(SBType self, uint32_t idx) -> SBTypeMemberFunction"},
	 { (char *)"SBType_IsTypeComplete", _wrap_SBType_IsTypeComplete, METH_VARARGS, (char *)"SBType_IsTypeComplete(SBType self) -> bool"},
	 { (char *)"SBType_GetTypeFlags", _wrap_SBType_GetTypeFlags, METH_VARARGS, (char *)"SBType_GetTypeFlags(SBType self) -> uint32_t"},
	 { (char *)"SBType___str__", _wrap_SBType___str__, METH_VARARGS, (char *)"SBType___str__(SBType self) -> PyObject"},
	 { (char *)"SBType_swigregister", SBType_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBTypeList", _wrap_new_SBTypeList, METH_VARARGS, (char *)"new_SBTypeList() -> SBTypeList"},
	 { (char *)"SBTypeList_IsValid", _wrap_SBTypeList_IsValid, METH_VARARGS, (char *)"SBTypeList_IsValid(SBTypeList self) -> bool"},
	 { (char *)"SBTypeList_Append", _wrap_SBTypeList_Append, METH_VARARGS, (char *)"SBTypeList_Append(SBTypeList self, SBType type)"},
	 { (char *)"SBTypeList_GetTypeAtIndex", _wrap_SBTypeList_GetTypeAtIndex, METH_VARARGS, (char *)"SBTypeList_GetTypeAtIndex(SBTypeList self, uint32_t index) -> SBType"},
	 { (char *)"SBTypeList_GetSize", _wrap_SBTypeList_GetSize, METH_VARARGS, (char *)"SBTypeList_GetSize(SBTypeList self) -> uint32_t"},
	 { (char *)"delete_SBTypeList", _wrap_delete_SBTypeList, METH_VARARGS, (char *)"delete_SBTypeList(SBTypeList self)"},
	 { (char *)"SBTypeList_swigregister", SBTypeList_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBTypeCategory", _wrap_new_SBTypeCategory, METH_VARARGS, (char *)"\n"
		"SBTypeCategory()\n"
		"new_SBTypeCategory(SBTypeCategory rhs) -> SBTypeCategory\n"
		""},
	 { (char *)"delete_SBTypeCategory", _wrap_delete_SBTypeCategory, METH_VARARGS, (char *)"delete_SBTypeCategory(SBTypeCategory self)"},
	 { (char *)"SBTypeCategory_IsValid", _wrap_SBTypeCategory_IsValid, METH_VARARGS, (char *)"SBTypeCategory_IsValid(SBTypeCategory self) -> bool"},
	 { (char *)"SBTypeCategory_GetEnabled", _wrap_SBTypeCategory_GetEnabled, METH_VARARGS, (char *)"SBTypeCategory_GetEnabled(SBTypeCategory self) -> bool"},
	 { (char *)"SBTypeCategory_SetEnabled", _wrap_SBTypeCategory_SetEnabled, METH_VARARGS, (char *)"SBTypeCategory_SetEnabled(SBTypeCategory self, bool arg1)"},
	 { (char *)"SBTypeCategory_GetName", _wrap_SBTypeCategory_GetName, METH_VARARGS, (char *)"SBTypeCategory_GetName(SBTypeCategory self) -> char"},
	 { (char *)"SBTypeCategory_GetLanguageAtIndex", _wrap_SBTypeCategory_GetLanguageAtIndex, METH_VARARGS, (char *)"SBTypeCategory_GetLanguageAtIndex(SBTypeCategory self, uint32_t idx) -> LanguageType"},
	 { (char *)"SBTypeCategory_GetNumLanguages", _wrap_SBTypeCategory_GetNumLanguages, METH_VARARGS, (char *)"SBTypeCategory_GetNumLanguages(SBTypeCategory self) -> uint32_t"},
	 { (char *)"SBTypeCategory_AddLanguage", _wrap_SBTypeCategory_AddLanguage, METH_VARARGS, (char *)"SBTypeCategory_AddLanguage(SBTypeCategory self, LanguageType language)"},
	 { (char *)"SBTypeCategory_GetDescription", _wrap_SBTypeCategory_GetDescription, METH_VARARGS, (char *)"SBTypeCategory_GetDescription(SBTypeCategory self, SBStream description, DescriptionLevel description_level) -> bool"},
	 { (char *)"SBTypeCategory_GetNumFormats", _wrap_SBTypeCategory_GetNumFormats, METH_VARARGS, (char *)"SBTypeCategory_GetNumFormats(SBTypeCategory self) -> uint32_t"},
	 { (char *)"SBTypeCategory_GetNumSummaries", _wrap_SBTypeCategory_GetNumSummaries, METH_VARARGS, (char *)"SBTypeCategory_GetNumSummaries(SBTypeCategory self) -> uint32_t"},
	 { (char *)"SBTypeCategory_GetNumFilters", _wrap_SBTypeCategory_GetNumFilters, METH_VARARGS, (char *)"SBTypeCategory_GetNumFilters(SBTypeCategory self) -> uint32_t"},
	 { (char *)"SBTypeCategory_GetNumSynthetics", _wrap_SBTypeCategory_GetNumSynthetics, METH_VARARGS, (char *)"SBTypeCategory_GetNumSynthetics(SBTypeCategory self) -> uint32_t"},
	 { (char *)"SBTypeCategory_GetTypeNameSpecifierForFilterAtIndex", _wrap_SBTypeCategory_GetTypeNameSpecifierForFilterAtIndex, METH_VARARGS, (char *)"SBTypeCategory_GetTypeNameSpecifierForFilterAtIndex(SBTypeCategory self, uint32_t arg1) -> SBTypeNameSpecifier"},
	 { (char *)"SBTypeCategory_GetTypeNameSpecifierForFormatAtIndex", _wrap_SBTypeCategory_GetTypeNameSpecifierForFormatAtIndex, METH_VARARGS, (char *)"SBTypeCategory_GetTypeNameSpecifierForFormatAtIndex(SBTypeCategory self, uint32_t arg1) -> SBTypeNameSpecifier"},
	 { (char *)"SBTypeCategory_GetTypeNameSpecifierForSummaryAtIndex", _wrap_SBTypeCategory_GetTypeNameSpecifierForSummaryAtIndex, METH_VARARGS, (char *)"SBTypeCategory_GetTypeNameSpecifierForSummaryAtIndex(SBTypeCategory self, uint32_t arg1) -> SBTypeNameSpecifier"},
	 { (char *)"SBTypeCategory_GetTypeNameSpecifierForSyntheticAtIndex", _wrap_SBTypeCategory_GetTypeNameSpecifierForSyntheticAtIndex, METH_VARARGS, (char *)"SBTypeCategory_GetTypeNameSpecifierForSyntheticAtIndex(SBTypeCategory self, uint32_t arg1) -> SBTypeNameSpecifier"},
	 { (char *)"SBTypeCategory_GetFilterForType", _wrap_SBTypeCategory_GetFilterForType, METH_VARARGS, (char *)"SBTypeCategory_GetFilterForType(SBTypeCategory self, SBTypeNameSpecifier arg1) -> SBTypeFilter"},
	 { (char *)"SBTypeCategory_GetFormatForType", _wrap_SBTypeCategory_GetFormatForType, METH_VARARGS, (char *)"SBTypeCategory_GetFormatForType(SBTypeCategory self, SBTypeNameSpecifier arg1) -> SBTypeFormat"},
	 { (char *)"SBTypeCategory_GetSummaryForType", _wrap_SBTypeCategory_GetSummaryForType, METH_VARARGS, (char *)"SBTypeCategory_GetSummaryForType(SBTypeCategory self, SBTypeNameSpecifier arg1) -> SBTypeSummary"},
	 { (char *)"SBTypeCategory_GetSyntheticForType", _wrap_SBTypeCategory_GetSyntheticForType, METH_VARARGS, (char *)"SBTypeCategory_GetSyntheticForType(SBTypeCategory self, SBTypeNameSpecifier arg1) -> SBTypeSynthetic"},
	 { (char *)"SBTypeCategory_GetFilterAtIndex", _wrap_SBTypeCategory_GetFilterAtIndex, METH_VARARGS, (char *)"SBTypeCategory_GetFilterAtIndex(SBTypeCategory self, uint32_t arg1) -> SBTypeFilter"},
	 { (char *)"SBTypeCategory_GetFormatAtIndex", _wrap_SBTypeCategory_GetFormatAtIndex, METH_VARARGS, (char *)"SBTypeCategory_GetFormatAtIndex(SBTypeCategory self, uint32_t arg1) -> SBTypeFormat"},
	 { (char *)"SBTypeCategory_GetSummaryAtIndex", _wrap_SBTypeCategory_GetSummaryAtIndex, METH_VARARGS, (char *)"SBTypeCategory_GetSummaryAtIndex(SBTypeCategory self, uint32_t arg1) -> SBTypeSummary"},
	 { (char *)"SBTypeCategory_GetSyntheticAtIndex", _wrap_SBTypeCategory_GetSyntheticAtIndex, METH_VARARGS, (char *)"SBTypeCategory_GetSyntheticAtIndex(SBTypeCategory self, uint32_t arg1) -> SBTypeSynthetic"},
	 { (char *)"SBTypeCategory_AddTypeFormat", _wrap_SBTypeCategory_AddTypeFormat, METH_VARARGS, (char *)"SBTypeCategory_AddTypeFormat(SBTypeCategory self, SBTypeNameSpecifier arg1, SBTypeFormat arg2) -> bool"},
	 { (char *)"SBTypeCategory_DeleteTypeFormat", _wrap_SBTypeCategory_DeleteTypeFormat, METH_VARARGS, (char *)"SBTypeCategory_DeleteTypeFormat(SBTypeCategory self, SBTypeNameSpecifier arg1) -> bool"},
	 { (char *)"SBTypeCategory_AddTypeSummary", _wrap_SBTypeCategory_AddTypeSummary, METH_VARARGS, (char *)"SBTypeCategory_AddTypeSummary(SBTypeCategory self, SBTypeNameSpecifier arg1, SBTypeSummary arg2) -> bool"},
	 { (char *)"SBTypeCategory_DeleteTypeSummary", _wrap_SBTypeCategory_DeleteTypeSummary, METH_VARARGS, (char *)"SBTypeCategory_DeleteTypeSummary(SBTypeCategory self, SBTypeNameSpecifier arg1) -> bool"},
	 { (char *)"SBTypeCategory_AddTypeFilter", _wrap_SBTypeCategory_AddTypeFilter, METH_VARARGS, (char *)"SBTypeCategory_AddTypeFilter(SBTypeCategory self, SBTypeNameSpecifier arg1, SBTypeFilter arg2) -> bool"},
	 { (char *)"SBTypeCategory_DeleteTypeFilter", _wrap_SBTypeCategory_DeleteTypeFilter, METH_VARARGS, (char *)"SBTypeCategory_DeleteTypeFilter(SBTypeCategory self, SBTypeNameSpecifier arg1) -> bool"},
	 { (char *)"SBTypeCategory_AddTypeSynthetic", _wrap_SBTypeCategory_AddTypeSynthetic, METH_VARARGS, (char *)"SBTypeCategory_AddTypeSynthetic(SBTypeCategory self, SBTypeNameSpecifier arg1, SBTypeSynthetic arg2) -> bool"},
	 { (char *)"SBTypeCategory_DeleteTypeSynthetic", _wrap_SBTypeCategory_DeleteTypeSynthetic, METH_VARARGS, (char *)"SBTypeCategory_DeleteTypeSynthetic(SBTypeCategory self, SBTypeNameSpecifier arg1) -> bool"},
	 { (char *)"SBTypeCategory___str__", _wrap_SBTypeCategory___str__, METH_VARARGS, (char *)"SBTypeCategory___str__(SBTypeCategory self) -> PyObject"},
	 { (char *)"SBTypeCategory_swigregister", SBTypeCategory_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBTypeEnumMember", _wrap_new_SBTypeEnumMember, METH_VARARGS, (char *)"\n"
		"SBTypeEnumMember()\n"
		"new_SBTypeEnumMember(SBTypeEnumMember rhs) -> SBTypeEnumMember\n"
		""},
	 { (char *)"delete_SBTypeEnumMember", _wrap_delete_SBTypeEnumMember, METH_VARARGS, (char *)"delete_SBTypeEnumMember(SBTypeEnumMember self)"},
	 { (char *)"SBTypeEnumMember_IsValid", _wrap_SBTypeEnumMember_IsValid, METH_VARARGS, (char *)"SBTypeEnumMember_IsValid(SBTypeEnumMember self) -> bool"},
	 { (char *)"SBTypeEnumMember_GetValueAsSigned", _wrap_SBTypeEnumMember_GetValueAsSigned, METH_VARARGS, (char *)"SBTypeEnumMember_GetValueAsSigned(SBTypeEnumMember self) -> int64_t"},
	 { (char *)"SBTypeEnumMember_GetValueAsUnsigned", _wrap_SBTypeEnumMember_GetValueAsUnsigned, METH_VARARGS, (char *)"SBTypeEnumMember_GetValueAsUnsigned(SBTypeEnumMember self) -> uint64_t"},
	 { (char *)"SBTypeEnumMember_GetName", _wrap_SBTypeEnumMember_GetName, METH_VARARGS, (char *)"SBTypeEnumMember_GetName(SBTypeEnumMember self) -> char"},
	 { (char *)"SBTypeEnumMember_GetType", _wrap_SBTypeEnumMember_GetType, METH_VARARGS, (char *)"SBTypeEnumMember_GetType(SBTypeEnumMember self) -> SBType"},
	 { (char *)"SBTypeEnumMember_GetDescription", _wrap_SBTypeEnumMember_GetDescription, METH_VARARGS, (char *)"SBTypeEnumMember_GetDescription(SBTypeEnumMember self, SBStream description, DescriptionLevel description_level) -> bool"},
	 { (char *)"SBTypeEnumMember___str__", _wrap_SBTypeEnumMember___str__, METH_VARARGS, (char *)"SBTypeEnumMember___str__(SBTypeEnumMember self) -> PyObject"},
	 { (char *)"SBTypeEnumMember_swigregister", SBTypeEnumMember_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBTypeEnumMemberList", _wrap_new_SBTypeEnumMemberList, METH_VARARGS, (char *)"\n"
		"SBTypeEnumMemberList()\n"
		"new_SBTypeEnumMemberList(SBTypeEnumMemberList rhs) -> SBTypeEnumMemberList\n"
		""},
	 { (char *)"delete_SBTypeEnumMemberList", _wrap_delete_SBTypeEnumMemberList, METH_VARARGS, (char *)"delete_SBTypeEnumMemberList(SBTypeEnumMemberList self)"},
	 { (char *)"SBTypeEnumMemberList_IsValid", _wrap_SBTypeEnumMemberList_IsValid, METH_VARARGS, (char *)"SBTypeEnumMemberList_IsValid(SBTypeEnumMemberList self) -> bool"},
	 { (char *)"SBTypeEnumMemberList_Append", _wrap_SBTypeEnumMemberList_Append, METH_VARARGS, (char *)"SBTypeEnumMemberList_Append(SBTypeEnumMemberList self, SBTypeEnumMember entry)"},
	 { (char *)"SBTypeEnumMemberList_GetTypeEnumMemberAtIndex", _wrap_SBTypeEnumMemberList_GetTypeEnumMemberAtIndex, METH_VARARGS, (char *)"SBTypeEnumMemberList_GetTypeEnumMemberAtIndex(SBTypeEnumMemberList self, uint32_t index) -> SBTypeEnumMember"},
	 { (char *)"SBTypeEnumMemberList_GetSize", _wrap_SBTypeEnumMemberList_GetSize, METH_VARARGS, (char *)"SBTypeEnumMemberList_GetSize(SBTypeEnumMemberList self) -> uint32_t"},
	 { (char *)"SBTypeEnumMemberList_swigregister", SBTypeEnumMemberList_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBTypeFilter", _wrap_new_SBTypeFilter, METH_VARARGS, (char *)"\n"
		"SBTypeFilter()\n"
		"SBTypeFilter(uint32_t options)\n"
		"new_SBTypeFilter(SBTypeFilter rhs) -> SBTypeFilter\n"
		""},
	 { (char *)"delete_SBTypeFilter", _wrap_delete_SBTypeFilter, METH_VARARGS, (char *)"delete_SBTypeFilter(SBTypeFilter self)"},
	 { (char *)"SBTypeFilter_IsValid", _wrap_SBTypeFilter_IsValid, METH_VARARGS, (char *)"SBTypeFilter_IsValid(SBTypeFilter self) -> bool"},
	 { (char *)"SBTypeFilter_IsEqualTo", _wrap_SBTypeFilter_IsEqualTo, METH_VARARGS, (char *)"SBTypeFilter_IsEqualTo(SBTypeFilter self, SBTypeFilter rhs) -> bool"},
	 { (char *)"SBTypeFilter_GetNumberOfExpressionPaths", _wrap_SBTypeFilter_GetNumberOfExpressionPaths, METH_VARARGS, (char *)"SBTypeFilter_GetNumberOfExpressionPaths(SBTypeFilter self) -> uint32_t"},
	 { (char *)"SBTypeFilter_GetExpressionPathAtIndex", _wrap_SBTypeFilter_GetExpressionPathAtIndex, METH_VARARGS, (char *)"SBTypeFilter_GetExpressionPathAtIndex(SBTypeFilter self, uint32_t i) -> char"},
	 { (char *)"SBTypeFilter_ReplaceExpressionPathAtIndex", _wrap_SBTypeFilter_ReplaceExpressionPathAtIndex, METH_VARARGS, (char *)"SBTypeFilter_ReplaceExpressionPathAtIndex(SBTypeFilter self, uint32_t i, char item) -> bool"},
	 { (char *)"SBTypeFilter_AppendExpressionPath", _wrap_SBTypeFilter_AppendExpressionPath, METH_VARARGS, (char *)"SBTypeFilter_AppendExpressionPath(SBTypeFilter self, char item)"},
	 { (char *)"SBTypeFilter_Clear", _wrap_SBTypeFilter_Clear, METH_VARARGS, (char *)"SBTypeFilter_Clear(SBTypeFilter self)"},
	 { (char *)"SBTypeFilter_GetOptions", _wrap_SBTypeFilter_GetOptions, METH_VARARGS, (char *)"SBTypeFilter_GetOptions(SBTypeFilter self) -> uint32_t"},
	 { (char *)"SBTypeFilter_SetOptions", _wrap_SBTypeFilter_SetOptions, METH_VARARGS, (char *)"SBTypeFilter_SetOptions(SBTypeFilter self, uint32_t arg1)"},
	 { (char *)"SBTypeFilter_GetDescription", _wrap_SBTypeFilter_GetDescription, METH_VARARGS, (char *)"SBTypeFilter_GetDescription(SBTypeFilter self, SBStream description, DescriptionLevel description_level) -> bool"},
	 { (char *)"SBTypeFilter___eq__", _wrap_SBTypeFilter___eq__, METH_VARARGS, (char *)"SBTypeFilter___eq__(SBTypeFilter self, SBTypeFilter rhs) -> bool"},
	 { (char *)"SBTypeFilter___ne__", _wrap_SBTypeFilter___ne__, METH_VARARGS, (char *)"SBTypeFilter___ne__(SBTypeFilter self, SBTypeFilter rhs) -> bool"},
	 { (char *)"SBTypeFilter___str__", _wrap_SBTypeFilter___str__, METH_VARARGS, (char *)"SBTypeFilter___str__(SBTypeFilter self) -> PyObject"},
	 { (char *)"SBTypeFilter_swigregister", SBTypeFilter_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBTypeFormat", _wrap_new_SBTypeFormat, METH_VARARGS, (char *)"\n"
		"SBTypeFormat()\n"
		"SBTypeFormat(Format format, uint32_t options = 0)\n"
		"SBTypeFormat(Format format)\n"
		"SBTypeFormat(char type, uint32_t options = 0)\n"
		"SBTypeFormat(char type)\n"
		"new_SBTypeFormat(SBTypeFormat rhs) -> SBTypeFormat\n"
		""},
	 { (char *)"delete_SBTypeFormat", _wrap_delete_SBTypeFormat, METH_VARARGS, (char *)"delete_SBTypeFormat(SBTypeFormat self)"},
	 { (char *)"SBTypeFormat_IsValid", _wrap_SBTypeFormat_IsValid, METH_VARARGS, (char *)"SBTypeFormat_IsValid(SBTypeFormat self) -> bool"},
	 { (char *)"SBTypeFormat_IsEqualTo", _wrap_SBTypeFormat_IsEqualTo, METH_VARARGS, (char *)"SBTypeFormat_IsEqualTo(SBTypeFormat self, SBTypeFormat rhs) -> bool"},
	 { (char *)"SBTypeFormat_GetFormat", _wrap_SBTypeFormat_GetFormat, METH_VARARGS, (char *)"SBTypeFormat_GetFormat(SBTypeFormat self) -> Format"},
	 { (char *)"SBTypeFormat_GetTypeName", _wrap_SBTypeFormat_GetTypeName, METH_VARARGS, (char *)"SBTypeFormat_GetTypeName(SBTypeFormat self) -> char"},
	 { (char *)"SBTypeFormat_GetOptions", _wrap_SBTypeFormat_GetOptions, METH_VARARGS, (char *)"SBTypeFormat_GetOptions(SBTypeFormat self) -> uint32_t"},
	 { (char *)"SBTypeFormat_SetFormat", _wrap_SBTypeFormat_SetFormat, METH_VARARGS, (char *)"SBTypeFormat_SetFormat(SBTypeFormat self, Format arg1)"},
	 { (char *)"SBTypeFormat_SetTypeName", _wrap_SBTypeFormat_SetTypeName, METH_VARARGS, (char *)"SBTypeFormat_SetTypeName(SBTypeFormat self, char arg1)"},
	 { (char *)"SBTypeFormat_SetOptions", _wrap_SBTypeFormat_SetOptions, METH_VARARGS, (char *)"SBTypeFormat_SetOptions(SBTypeFormat self, uint32_t arg1)"},
	 { (char *)"SBTypeFormat_GetDescription", _wrap_SBTypeFormat_GetDescription, METH_VARARGS, (char *)"SBTypeFormat_GetDescription(SBTypeFormat self, SBStream description, DescriptionLevel description_level) -> bool"},
	 { (char *)"SBTypeFormat___eq__", _wrap_SBTypeFormat___eq__, METH_VARARGS, (char *)"SBTypeFormat___eq__(SBTypeFormat self, SBTypeFormat rhs) -> bool"},
	 { (char *)"SBTypeFormat___ne__", _wrap_SBTypeFormat___ne__, METH_VARARGS, (char *)"SBTypeFormat___ne__(SBTypeFormat self, SBTypeFormat rhs) -> bool"},
	 { (char *)"SBTypeFormat___str__", _wrap_SBTypeFormat___str__, METH_VARARGS, (char *)"SBTypeFormat___str__(SBTypeFormat self) -> PyObject"},
	 { (char *)"SBTypeFormat_swigregister", SBTypeFormat_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBTypeNameSpecifier", _wrap_new_SBTypeNameSpecifier, METH_VARARGS, (char *)"\n"
		"SBTypeNameSpecifier()\n"
		"SBTypeNameSpecifier(char name, bool is_regex = False)\n"
		"SBTypeNameSpecifier(char name)\n"
		"SBTypeNameSpecifier(SBType type)\n"
		"new_SBTypeNameSpecifier(SBTypeNameSpecifier rhs) -> SBTypeNameSpecifier\n"
		""},
	 { (char *)"delete_SBTypeNameSpecifier", _wrap_delete_SBTypeNameSpecifier, METH_VARARGS, (char *)"delete_SBTypeNameSpecifier(SBTypeNameSpecifier self)"},
	 { (char *)"SBTypeNameSpecifier_IsValid", _wrap_SBTypeNameSpecifier_IsValid, METH_VARARGS, (char *)"SBTypeNameSpecifier_IsValid(SBTypeNameSpecifier self) -> bool"},
	 { (char *)"SBTypeNameSpecifier_IsEqualTo", _wrap_SBTypeNameSpecifier_IsEqualTo, METH_VARARGS, (char *)"SBTypeNameSpecifier_IsEqualTo(SBTypeNameSpecifier self, SBTypeNameSpecifier rhs) -> bool"},
	 { (char *)"SBTypeNameSpecifier_GetName", _wrap_SBTypeNameSpecifier_GetName, METH_VARARGS, (char *)"SBTypeNameSpecifier_GetName(SBTypeNameSpecifier self) -> char"},
	 { (char *)"SBTypeNameSpecifier_GetType", _wrap_SBTypeNameSpecifier_GetType, METH_VARARGS, (char *)"SBTypeNameSpecifier_GetType(SBTypeNameSpecifier self) -> SBType"},
	 { (char *)"SBTypeNameSpecifier_IsRegex", _wrap_SBTypeNameSpecifier_IsRegex, METH_VARARGS, (char *)"SBTypeNameSpecifier_IsRegex(SBTypeNameSpecifier self) -> bool"},
	 { (char *)"SBTypeNameSpecifier_GetDescription", _wrap_SBTypeNameSpecifier_GetDescription, METH_VARARGS, (char *)"SBTypeNameSpecifier_GetDescription(SBTypeNameSpecifier self, SBStream description, DescriptionLevel description_level) -> bool"},
	 { (char *)"SBTypeNameSpecifier___eq__", _wrap_SBTypeNameSpecifier___eq__, METH_VARARGS, (char *)"SBTypeNameSpecifier___eq__(SBTypeNameSpecifier self, SBTypeNameSpecifier rhs) -> bool"},
	 { (char *)"SBTypeNameSpecifier___ne__", _wrap_SBTypeNameSpecifier___ne__, METH_VARARGS, (char *)"SBTypeNameSpecifier___ne__(SBTypeNameSpecifier self, SBTypeNameSpecifier rhs) -> bool"},
	 { (char *)"SBTypeNameSpecifier___str__", _wrap_SBTypeNameSpecifier___str__, METH_VARARGS, (char *)"SBTypeNameSpecifier___str__(SBTypeNameSpecifier self) -> PyObject"},
	 { (char *)"SBTypeNameSpecifier_swigregister", SBTypeNameSpecifier_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBTypeSummaryOptions", _wrap_new_SBTypeSummaryOptions, METH_VARARGS, (char *)"\n"
		"SBTypeSummaryOptions()\n"
		"new_SBTypeSummaryOptions(SBTypeSummaryOptions rhs) -> SBTypeSummaryOptions\n"
		""},
	 { (char *)"delete_SBTypeSummaryOptions", _wrap_delete_SBTypeSummaryOptions, METH_VARARGS, (char *)"delete_SBTypeSummaryOptions(SBTypeSummaryOptions self)"},
	 { (char *)"SBTypeSummaryOptions_IsValid", _wrap_SBTypeSummaryOptions_IsValid, METH_VARARGS, (char *)"SBTypeSummaryOptions_IsValid(SBTypeSummaryOptions self) -> bool"},
	 { (char *)"SBTypeSummaryOptions_GetLanguage", _wrap_SBTypeSummaryOptions_GetLanguage, METH_VARARGS, (char *)"SBTypeSummaryOptions_GetLanguage(SBTypeSummaryOptions self) -> LanguageType"},
	 { (char *)"SBTypeSummaryOptions_GetCapping", _wrap_SBTypeSummaryOptions_GetCapping, METH_VARARGS, (char *)"SBTypeSummaryOptions_GetCapping(SBTypeSummaryOptions self) -> TypeSummaryCapping"},
	 { (char *)"SBTypeSummaryOptions_SetLanguage", _wrap_SBTypeSummaryOptions_SetLanguage, METH_VARARGS, (char *)"SBTypeSummaryOptions_SetLanguage(SBTypeSummaryOptions self, LanguageType arg1)"},
	 { (char *)"SBTypeSummaryOptions_SetCapping", _wrap_SBTypeSummaryOptions_SetCapping, METH_VARARGS, (char *)"SBTypeSummaryOptions_SetCapping(SBTypeSummaryOptions self, TypeSummaryCapping arg1)"},
	 { (char *)"SBTypeSummaryOptions_swigregister", SBTypeSummaryOptions_swigregister, METH_VARARGS, NULL},
	 { (char *)"SBTypeSummary_CreateWithSummaryString", _wrap_SBTypeSummary_CreateWithSummaryString, METH_VARARGS, (char *)"\n"
		"CreateWithSummaryString(char data, uint32_t options = 0) -> SBTypeSummary\n"
		"SBTypeSummary_CreateWithSummaryString(char data) -> SBTypeSummary\n"
		""},
	 { (char *)"SBTypeSummary_CreateWithFunctionName", _wrap_SBTypeSummary_CreateWithFunctionName, METH_VARARGS, (char *)"\n"
		"CreateWithFunctionName(char data, uint32_t options = 0) -> SBTypeSummary\n"
		"SBTypeSummary_CreateWithFunctionName(char data) -> SBTypeSummary\n"
		""},
	 { (char *)"SBTypeSummary_CreateWithScriptCode", _wrap_SBTypeSummary_CreateWithScriptCode, METH_VARARGS, (char *)"\n"
		"CreateWithScriptCode(char data, uint32_t options = 0) -> SBTypeSummary\n"
		"SBTypeSummary_CreateWithScriptCode(char data) -> SBTypeSummary\n"
		""},
	 { (char *)"new_SBTypeSummary", _wrap_new_SBTypeSummary, METH_VARARGS, (char *)"\n"
		"SBTypeSummary()\n"
		"new_SBTypeSummary(SBTypeSummary rhs) -> SBTypeSummary\n"
		""},
	 { (char *)"delete_SBTypeSummary", _wrap_delete_SBTypeSummary, METH_VARARGS, (char *)"delete_SBTypeSummary(SBTypeSummary self)"},
	 { (char *)"SBTypeSummary_IsValid", _wrap_SBTypeSummary_IsValid, METH_VARARGS, (char *)"SBTypeSummary_IsValid(SBTypeSummary self) -> bool"},
	 { (char *)"SBTypeSummary_IsEqualTo", _wrap_SBTypeSummary_IsEqualTo, METH_VARARGS, (char *)"SBTypeSummary_IsEqualTo(SBTypeSummary self, SBTypeSummary rhs) -> bool"},
	 { (char *)"SBTypeSummary_IsFunctionCode", _wrap_SBTypeSummary_IsFunctionCode, METH_VARARGS, (char *)"SBTypeSummary_IsFunctionCode(SBTypeSummary self) -> bool"},
	 { (char *)"SBTypeSummary_IsFunctionName", _wrap_SBTypeSummary_IsFunctionName, METH_VARARGS, (char *)"SBTypeSummary_IsFunctionName(SBTypeSummary self) -> bool"},
	 { (char *)"SBTypeSummary_IsSummaryString", _wrap_SBTypeSummary_IsSummaryString, METH_VARARGS, (char *)"SBTypeSummary_IsSummaryString(SBTypeSummary self) -> bool"},
	 { (char *)"SBTypeSummary_GetData", _wrap_SBTypeSummary_GetData, METH_VARARGS, (char *)"SBTypeSummary_GetData(SBTypeSummary self) -> char"},
	 { (char *)"SBTypeSummary_SetSummaryString", _wrap_SBTypeSummary_SetSummaryString, METH_VARARGS, (char *)"SBTypeSummary_SetSummaryString(SBTypeSummary self, char data)"},
	 { (char *)"SBTypeSummary_SetFunctionName", _wrap_SBTypeSummary_SetFunctionName, METH_VARARGS, (char *)"SBTypeSummary_SetFunctionName(SBTypeSummary self, char data)"},
	 { (char *)"SBTypeSummary_SetFunctionCode", _wrap_SBTypeSummary_SetFunctionCode, METH_VARARGS, (char *)"SBTypeSummary_SetFunctionCode(SBTypeSummary self, char data)"},
	 { (char *)"SBTypeSummary_GetOptions", _wrap_SBTypeSummary_GetOptions, METH_VARARGS, (char *)"SBTypeSummary_GetOptions(SBTypeSummary self) -> uint32_t"},
	 { (char *)"SBTypeSummary_SetOptions", _wrap_SBTypeSummary_SetOptions, METH_VARARGS, (char *)"SBTypeSummary_SetOptions(SBTypeSummary self, uint32_t arg1)"},
	 { (char *)"SBTypeSummary_GetDescription", _wrap_SBTypeSummary_GetDescription, METH_VARARGS, (char *)"SBTypeSummary_GetDescription(SBTypeSummary self, SBStream description, DescriptionLevel description_level) -> bool"},
	 { (char *)"SBTypeSummary___eq__", _wrap_SBTypeSummary___eq__, METH_VARARGS, (char *)"SBTypeSummary___eq__(SBTypeSummary self, SBTypeSummary rhs) -> bool"},
	 { (char *)"SBTypeSummary___ne__", _wrap_SBTypeSummary___ne__, METH_VARARGS, (char *)"SBTypeSummary___ne__(SBTypeSummary self, SBTypeSummary rhs) -> bool"},
	 { (char *)"SBTypeSummary___str__", _wrap_SBTypeSummary___str__, METH_VARARGS, (char *)"SBTypeSummary___str__(SBTypeSummary self) -> PyObject"},
	 { (char *)"SBTypeSummary_swigregister", SBTypeSummary_swigregister, METH_VARARGS, NULL},
	 { (char *)"SBTypeSynthetic_CreateWithClassName", _wrap_SBTypeSynthetic_CreateWithClassName, METH_VARARGS, (char *)"\n"
		"CreateWithClassName(char data, uint32_t options = 0) -> SBTypeSynthetic\n"
		"SBTypeSynthetic_CreateWithClassName(char data) -> SBTypeSynthetic\n"
		""},
	 { (char *)"SBTypeSynthetic_CreateWithScriptCode", _wrap_SBTypeSynthetic_CreateWithScriptCode, METH_VARARGS, (char *)"\n"
		"CreateWithScriptCode(char data, uint32_t options = 0) -> SBTypeSynthetic\n"
		"SBTypeSynthetic_CreateWithScriptCode(char data) -> SBTypeSynthetic\n"
		""},
	 { (char *)"new_SBTypeSynthetic", _wrap_new_SBTypeSynthetic, METH_VARARGS, (char *)"\n"
		"SBTypeSynthetic()\n"
		"new_SBTypeSynthetic(SBTypeSynthetic rhs) -> SBTypeSynthetic\n"
		""},
	 { (char *)"delete_SBTypeSynthetic", _wrap_delete_SBTypeSynthetic, METH_VARARGS, (char *)"delete_SBTypeSynthetic(SBTypeSynthetic self)"},
	 { (char *)"SBTypeSynthetic_IsValid", _wrap_SBTypeSynthetic_IsValid, METH_VARARGS, (char *)"SBTypeSynthetic_IsValid(SBTypeSynthetic self) -> bool"},
	 { (char *)"SBTypeSynthetic_IsEqualTo", _wrap_SBTypeSynthetic_IsEqualTo, METH_VARARGS, (char *)"SBTypeSynthetic_IsEqualTo(SBTypeSynthetic self, SBTypeSynthetic rhs) -> bool"},
	 { (char *)"SBTypeSynthetic_IsClassCode", _wrap_SBTypeSynthetic_IsClassCode, METH_VARARGS, (char *)"SBTypeSynthetic_IsClassCode(SBTypeSynthetic self) -> bool"},
	 { (char *)"SBTypeSynthetic_GetData", _wrap_SBTypeSynthetic_GetData, METH_VARARGS, (char *)"SBTypeSynthetic_GetData(SBTypeSynthetic self) -> char"},
	 { (char *)"SBTypeSynthetic_SetClassName", _wrap_SBTypeSynthetic_SetClassName, METH_VARARGS, (char *)"SBTypeSynthetic_SetClassName(SBTypeSynthetic self, char data)"},
	 { (char *)"SBTypeSynthetic_SetClassCode", _wrap_SBTypeSynthetic_SetClassCode, METH_VARARGS, (char *)"SBTypeSynthetic_SetClassCode(SBTypeSynthetic self, char data)"},
	 { (char *)"SBTypeSynthetic_GetOptions", _wrap_SBTypeSynthetic_GetOptions, METH_VARARGS, (char *)"SBTypeSynthetic_GetOptions(SBTypeSynthetic self) -> uint32_t"},
	 { (char *)"SBTypeSynthetic_SetOptions", _wrap_SBTypeSynthetic_SetOptions, METH_VARARGS, (char *)"SBTypeSynthetic_SetOptions(SBTypeSynthetic self, uint32_t arg1)"},
	 { (char *)"SBTypeSynthetic_GetDescription", _wrap_SBTypeSynthetic_GetDescription, METH_VARARGS, (char *)"SBTypeSynthetic_GetDescription(SBTypeSynthetic self, SBStream description, DescriptionLevel description_level) -> bool"},
	 { (char *)"SBTypeSynthetic___eq__", _wrap_SBTypeSynthetic___eq__, METH_VARARGS, (char *)"SBTypeSynthetic___eq__(SBTypeSynthetic self, SBTypeSynthetic rhs) -> bool"},
	 { (char *)"SBTypeSynthetic___ne__", _wrap_SBTypeSynthetic___ne__, METH_VARARGS, (char *)"SBTypeSynthetic___ne__(SBTypeSynthetic self, SBTypeSynthetic rhs) -> bool"},
	 { (char *)"SBTypeSynthetic___str__", _wrap_SBTypeSynthetic___str__, METH_VARARGS, (char *)"SBTypeSynthetic___str__(SBTypeSynthetic self) -> PyObject"},
	 { (char *)"SBTypeSynthetic_swigregister", SBTypeSynthetic_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBValue", _wrap_new_SBValue, METH_VARARGS, (char *)"\n"
		"SBValue()\n"
		"new_SBValue(SBValue rhs) -> SBValue\n"
		""},
	 { (char *)"delete_SBValue", _wrap_delete_SBValue, METH_VARARGS, (char *)"delete_SBValue(SBValue self)"},
	 { (char *)"SBValue_IsValid", _wrap_SBValue_IsValid, METH_VARARGS, (char *)"SBValue_IsValid(SBValue self) -> bool"},
	 { (char *)"SBValue_Clear", _wrap_SBValue_Clear, METH_VARARGS, (char *)"SBValue_Clear(SBValue self)"},
	 { (char *)"SBValue_GetError", _wrap_SBValue_GetError, METH_VARARGS, (char *)"SBValue_GetError(SBValue self) -> SBError"},
	 { (char *)"SBValue_GetID", _wrap_SBValue_GetID, METH_VARARGS, (char *)"SBValue_GetID(SBValue self) -> user_id_t"},
	 { (char *)"SBValue_GetName", _wrap_SBValue_GetName, METH_VARARGS, (char *)"SBValue_GetName(SBValue self) -> char"},
	 { (char *)"SBValue_GetTypeName", _wrap_SBValue_GetTypeName, METH_VARARGS, (char *)"SBValue_GetTypeName(SBValue self) -> char"},
	 { (char *)"SBValue_GetDisplayTypeName", _wrap_SBValue_GetDisplayTypeName, METH_VARARGS, (char *)"SBValue_GetDisplayTypeName(SBValue self) -> char"},
	 { (char *)"SBValue_GetByteSize", _wrap_SBValue_GetByteSize, METH_VARARGS, (char *)"SBValue_GetByteSize(SBValue self) -> size_t"},
	 { (char *)"SBValue_IsInScope", _wrap_SBValue_IsInScope, METH_VARARGS, (char *)"SBValue_IsInScope(SBValue self) -> bool"},
	 { (char *)"SBValue_GetFormat", _wrap_SBValue_GetFormat, METH_VARARGS, (char *)"SBValue_GetFormat(SBValue self) -> Format"},
	 { (char *)"SBValue_SetFormat", _wrap_SBValue_SetFormat, METH_VARARGS, (char *)"SBValue_SetFormat(SBValue self, Format format)"},
	 { (char *)"SBValue_GetValue", _wrap_SBValue_GetValue, METH_VARARGS, (char *)"SBValue_GetValue(SBValue self) -> char"},
	 { (char *)"SBValue_GetValueAsSigned", _wrap_SBValue_GetValueAsSigned, METH_VARARGS, (char *)"\n"
		"GetValueAsSigned(SBError error, int64_t fail_value = 0) -> int64_t\n"
		"GetValueAsSigned(SBError error) -> int64_t\n"
		"GetValueAsSigned(int64_t fail_value = 0) -> int64_t\n"
		"SBValue_GetValueAsSigned(SBValue self) -> int64_t\n"
		""},
	 { (char *)"SBValue_GetValueAsUnsigned", _wrap_SBValue_GetValueAsUnsigned, METH_VARARGS, (char *)"\n"
		"GetValueAsUnsigned(SBError error, uint64_t fail_value = 0) -> uint64_t\n"
		"GetValueAsUnsigned(SBError error) -> uint64_t\n"
		"GetValueAsUnsigned(uint64_t fail_value = 0) -> uint64_t\n"
		"SBValue_GetValueAsUnsigned(SBValue self) -> uint64_t\n"
		""},
	 { (char *)"SBValue_GetValueType", _wrap_SBValue_GetValueType, METH_VARARGS, (char *)"SBValue_GetValueType(SBValue self) -> ValueType"},
	 { (char *)"SBValue_GetValueDidChange", _wrap_SBValue_GetValueDidChange, METH_VARARGS, (char *)"SBValue_GetValueDidChange(SBValue self) -> bool"},
	 { (char *)"SBValue_GetSummary", _wrap_SBValue_GetSummary, METH_VARARGS, (char *)"\n"
		"GetSummary() -> char\n"
		"SBValue_GetSummary(SBValue self, SBStream stream, SBTypeSummaryOptions options) -> char\n"
		""},
	 { (char *)"SBValue_GetObjectDescription", _wrap_SBValue_GetObjectDescription, METH_VARARGS, (char *)"SBValue_GetObjectDescription(SBValue self) -> char"},
	 { (char *)"SBValue_GetTypeValidatorResult", _wrap_SBValue_GetTypeValidatorResult, METH_VARARGS, (char *)"SBValue_GetTypeValidatorResult(SBValue self) -> char"},
	 { (char *)"SBValue_GetDynamicValue", _wrap_SBValue_GetDynamicValue, METH_VARARGS, (char *)"SBValue_GetDynamicValue(SBValue self, DynamicValueType use_dynamic) -> SBValue"},
	 { (char *)"SBValue_GetStaticValue", _wrap_SBValue_GetStaticValue, METH_VARARGS, (char *)"SBValue_GetStaticValue(SBValue self) -> SBValue"},
	 { (char *)"SBValue_GetNonSyntheticValue", _wrap_SBValue_GetNonSyntheticValue, METH_VARARGS, (char *)"SBValue_GetNonSyntheticValue(SBValue self) -> SBValue"},
	 { (char *)"SBValue_GetPreferDynamicValue", _wrap_SBValue_GetPreferDynamicValue, METH_VARARGS, (char *)"SBValue_GetPreferDynamicValue(SBValue self) -> DynamicValueType"},
	 { (char *)"SBValue_SetPreferDynamicValue", _wrap_SBValue_SetPreferDynamicValue, METH_VARARGS, (char *)"SBValue_SetPreferDynamicValue(SBValue self, DynamicValueType use_dynamic)"},
	 { (char *)"SBValue_GetPreferSyntheticValue", _wrap_SBValue_GetPreferSyntheticValue, METH_VARARGS, (char *)"SBValue_GetPreferSyntheticValue(SBValue self) -> bool"},
	 { (char *)"SBValue_SetPreferSyntheticValue", _wrap_SBValue_SetPreferSyntheticValue, METH_VARARGS, (char *)"SBValue_SetPreferSyntheticValue(SBValue self, bool use_synthetic)"},
	 { (char *)"SBValue_IsDynamic", _wrap_SBValue_IsDynamic, METH_VARARGS, (char *)"SBValue_IsDynamic(SBValue self) -> bool"},
	 { (char *)"SBValue_IsSynthetic", _wrap_SBValue_IsSynthetic, METH_VARARGS, (char *)"SBValue_IsSynthetic(SBValue self) -> bool"},
	 { (char *)"SBValue_IsSyntheticChildrenGenerated", _wrap_SBValue_IsSyntheticChildrenGenerated, METH_VARARGS, (char *)"SBValue_IsSyntheticChildrenGenerated(SBValue self) -> bool"},
	 { (char *)"SBValue_SetSyntheticChildrenGenerated", _wrap_SBValue_SetSyntheticChildrenGenerated, METH_VARARGS, (char *)"SBValue_SetSyntheticChildrenGenerated(SBValue self, bool arg1)"},
	 { (char *)"SBValue_GetLocation", _wrap_SBValue_GetLocation, METH_VARARGS, (char *)"SBValue_GetLocation(SBValue self) -> char"},
	 { (char *)"SBValue_SetValueFromCString", _wrap_SBValue_SetValueFromCString, METH_VARARGS, (char *)"\n"
		"SetValueFromCString(char value_str) -> bool\n"
		"SBValue_SetValueFromCString(SBValue self, char value_str, SBError error) -> bool\n"
		""},
	 { (char *)"SBValue_GetTypeFormat", _wrap_SBValue_GetTypeFormat, METH_VARARGS, (char *)"SBValue_GetTypeFormat(SBValue self) -> SBTypeFormat"},
	 { (char *)"SBValue_GetTypeSummary", _wrap_SBValue_GetTypeSummary, METH_VARARGS, (char *)"SBValue_GetTypeSummary(SBValue self) -> SBTypeSummary"},
	 { (char *)"SBValue_GetTypeFilter", _wrap_SBValue_GetTypeFilter, METH_VARARGS, (char *)"SBValue_GetTypeFilter(SBValue self) -> SBTypeFilter"},
	 { (char *)"SBValue_GetTypeSynthetic", _wrap_SBValue_GetTypeSynthetic, METH_VARARGS, (char *)"SBValue_GetTypeSynthetic(SBValue self) -> SBTypeSynthetic"},
	 { (char *)"SBValue_GetChildAtIndex", _wrap_SBValue_GetChildAtIndex, METH_VARARGS, (char *)"\n"
		"GetChildAtIndex(uint32_t idx) -> SBValue\n"
		"SBValue_GetChildAtIndex(SBValue self, uint32_t idx, DynamicValueType use_dynamic, \n"
		"    bool can_create_synthetic) -> SBValue\n"
		""},
	 { (char *)"SBValue_CreateChildAtOffset", _wrap_SBValue_CreateChildAtOffset, METH_VARARGS, (char *)"SBValue_CreateChildAtOffset(SBValue self, char name, uint32_t offset, SBType type) -> SBValue"},
	 { (char *)"SBValue_Cast", _wrap_SBValue_Cast, METH_VARARGS, (char *)"SBValue_Cast(SBValue self, SBType type) -> SBValue"},
	 { (char *)"SBValue_CreateValueFromExpression", _wrap_SBValue_CreateValueFromExpression, METH_VARARGS, (char *)"\n"
		"CreateValueFromExpression(char name, char expression) -> SBValue\n"
		"SBValue_CreateValueFromExpression(SBValue self, char name, char expression, SBExpressionOptions options) -> SBValue\n"
		""},
	 { (char *)"SBValue_CreateValueFromAddress", _wrap_SBValue_CreateValueFromAddress, METH_VARARGS, (char *)"SBValue_CreateValueFromAddress(SBValue self, char name, addr_t address, SBType type) -> SBValue"},
	 { (char *)"SBValue_CreateValueFromData", _wrap_SBValue_CreateValueFromData, METH_VARARGS, (char *)"SBValue_CreateValueFromData(SBValue self, char name, SBData data, SBType type) -> SBValue"},
	 { (char *)"SBValue_GetType", _wrap_SBValue_GetType, METH_VARARGS, (char *)"SBValue_GetType(SBValue self) -> SBType"},
	 { (char *)"SBValue_GetIndexOfChildWithName", _wrap_SBValue_GetIndexOfChildWithName, METH_VARARGS, (char *)"\n"
		"SBValue_GetIndexOfChildWithName(SBValue self, char name) -> uint32_t\n"
		"\n"
		"//------------------------------------------------------------------\n"
		"/// Returns the child member index.\n"
		"///\n"
		"/// Matches children of this object only and will match base classes and\n"
		"/// member names if this is a clang typed object.\n"
		"///\n"
		"/// @param[in] name\n"
		"///     The name of the child value to get\n"
		"///\n"
		"/// @return\n"
		"///     An index to the child member value.\n"
		"//------------------------------------------------------------------\n"
		"\n"
		""},
	 { (char *)"SBValue_GetChildMemberWithName", _wrap_SBValue_GetChildMemberWithName, METH_VARARGS, (char *)"\n"
		"GetChildMemberWithName(char name) -> SBValue\n"
		"SBValue_GetChildMemberWithName(SBValue self, char name, DynamicValueType use_dynamic) -> SBValue\n"
		""},
	 { (char *)"SBValue_GetValueForExpressionPath", _wrap_SBValue_GetValueForExpressionPath, METH_VARARGS, (char *)"\n"
		"SBValue_GetValueForExpressionPath(SBValue self, char expr_path) -> SBValue\n"
		"\n"
		"Expands nested expressions like .a->b[0].c[1]->d.\n"
		""},
	 { (char *)"SBValue_GetDeclaration", _wrap_SBValue_GetDeclaration, METH_VARARGS, (char *)"SBValue_GetDeclaration(SBValue self) -> SBDeclaration"},
	 { (char *)"SBValue_MightHaveChildren", _wrap_SBValue_MightHaveChildren, METH_VARARGS, (char *)"SBValue_MightHaveChildren(SBValue self) -> bool"},
	 { (char *)"SBValue_IsRuntimeSupportValue", _wrap_SBValue_IsRuntimeSupportValue, METH_VARARGS, (char *)"SBValue_IsRuntimeSupportValue(SBValue self) -> bool"},
	 { (char *)"SBValue_GetNumChildren", _wrap_SBValue_GetNumChildren, METH_VARARGS, (char *)"\n"
		"GetNumChildren() -> uint32_t\n"
		"SBValue_GetNumChildren(SBValue self, uint32_t max) -> uint32_t\n"
		""},
	 { (char *)"SBValue_GetOpaqueType", _wrap_SBValue_GetOpaqueType, METH_VARARGS, (char *)"SBValue_GetOpaqueType(SBValue self) -> void"},
	 { (char *)"SBValue_Dereference", _wrap_SBValue_Dereference, METH_VARARGS, (char *)"SBValue_Dereference(SBValue self) -> SBValue"},
	 { (char *)"SBValue_AddressOf", _wrap_SBValue_AddressOf, METH_VARARGS, (char *)"SBValue_AddressOf(SBValue self) -> SBValue"},
	 { (char *)"SBValue_TypeIsPointerType", _wrap_SBValue_TypeIsPointerType, METH_VARARGS, (char *)"SBValue_TypeIsPointerType(SBValue self) -> bool"},
	 { (char *)"SBValue_GetTarget", _wrap_SBValue_GetTarget, METH_VARARGS, (char *)"SBValue_GetTarget(SBValue self) -> SBTarget"},
	 { (char *)"SBValue_GetProcess", _wrap_SBValue_GetProcess, METH_VARARGS, (char *)"SBValue_GetProcess(SBValue self) -> SBProcess"},
	 { (char *)"SBValue_GetThread", _wrap_SBValue_GetThread, METH_VARARGS, (char *)"SBValue_GetThread(SBValue self) -> SBThread"},
	 { (char *)"SBValue_GetFrame", _wrap_SBValue_GetFrame, METH_VARARGS, (char *)"SBValue_GetFrame(SBValue self) -> SBFrame"},
	 { (char *)"SBValue_Watch", _wrap_SBValue_Watch, METH_VARARGS, (char *)"\n"
		"SBValue_Watch(SBValue self, bool resolve_location, bool read, bool write, \n"
		"    SBError error) -> SBWatchpoint\n"
		"\n"
		"/// Find and watch a variable.\n"
		"/// It returns an SBWatchpoint, which may be invalid.\n"
		"\n"
		""},
	 { (char *)"SBValue_WatchPointee", _wrap_SBValue_WatchPointee, METH_VARARGS, (char *)"\n"
		"SBValue_WatchPointee(SBValue self, bool resolve_location, bool read, bool write, \n"
		"    SBError error) -> SBWatchpoint\n"
		"\n"
		"/// Find and watch the location pointed to by a variable.\n"
		"/// It returns an SBWatchpoint, which may be invalid.\n"
		"\n"
		""},
	 { (char *)"SBValue_GetDescription", _wrap_SBValue_GetDescription, METH_VARARGS, (char *)"SBValue_GetDescription(SBValue self, SBStream description) -> bool"},
	 { (char *)"SBValue_GetPointeeData", _wrap_SBValue_GetPointeeData, METH_VARARGS, (char *)"\n"
		"GetPointeeData(uint32_t item_idx = 0, uint32_t item_count = 1) -> SBData\n"
		"GetPointeeData(uint32_t item_idx = 0) -> SBData\n"
		"SBValue_GetPointeeData(SBValue self) -> SBData\n"
		"\n"
		"//------------------------------------------------------------------\n"
		"   /// Get an SBData wrapping what this SBValue points to.\n"
		"   ///\n"
		"   /// This method will dereference the current SBValue, if its\n"
		"   /// data type is a T* or T[], and extract item_count elements\n"
		"   /// of type T from it, copying their contents in an SBData. \n"
		"   ///\n"
		"   /// @param[in] item_idx\n"
		"   ///     The index of the first item to retrieve. For an array\n"
		"   ///     this is equivalent to array[item_idx], for a pointer\n"
		"   ///     to *(pointer + item_idx). In either case, the measurement\n"
		"   ///     unit for item_idx is the sizeof(T) rather than the byte\n"
		"   ///\n"
		"   /// @param[in] item_count\n"
		"   ///     How many items should be copied into the output. By default\n"
		"   ///     only one item is copied, but more can be asked for.\n"
		"   ///\n"
		"   /// @return\n"
		"   ///     An SBData with the contents of the copied items, on success.\n"
		"   ///     An empty SBData otherwise.\n"
		"   //------------------------------------------------------------------\n"
		"\n"
		""},
	 { (char *)"SBValue_GetData", _wrap_SBValue_GetData, METH_VARARGS, (char *)"\n"
		"SBValue_GetData(SBValue self) -> SBData\n"
		"\n"
		"//------------------------------------------------------------------\n"
		"   /// Get an SBData wrapping the contents of this SBValue.\n"
		"   ///\n"
		"   /// This method will read the contents of this object in memory\n"
		"   /// and copy them into an SBData for future use. \n"
		"   ///\n"
		"   /// @return\n"
		"   ///     An SBData with the contents of this SBValue, on success.\n"
		"   ///     An empty SBData otherwise.\n"
		"   //------------------------------------------------------------------\n"
		"\n"
		""},
	 { (char *)"SBValue_SetData", _wrap_SBValue_SetData, METH_VARARGS, (char *)"SBValue_SetData(SBValue self, SBData data, SBError error) -> bool"},
	 { (char *)"SBValue_GetLoadAddress", _wrap_SBValue_GetLoadAddress, METH_VARARGS, (char *)"SBValue_GetLoadAddress(SBValue self) -> addr_t"},
	 { (char *)"SBValue_GetAddress", _wrap_SBValue_GetAddress, METH_VARARGS, (char *)"SBValue_GetAddress(SBValue self) -> SBAddress"},
	 { (char *)"SBValue_Persist", _wrap_SBValue_Persist, METH_VARARGS, (char *)"SBValue_Persist(SBValue self) -> SBValue"},
	 { (char *)"SBValue_GetExpressionPath", _wrap_SBValue_GetExpressionPath, METH_VARARGS, (char *)"\n"
		"GetExpressionPath(SBStream description) -> bool\n"
		"SBValue_GetExpressionPath(SBValue self, SBStream description, bool qualify_cxx_base_classes) -> bool\n"
		""},
	 { (char *)"SBValue___str__", _wrap_SBValue___str__, METH_VARARGS, (char *)"SBValue___str__(SBValue self) -> PyObject"},
	 { (char *)"SBValue_swigregister", SBValue_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBValueList", _wrap_new_SBValueList, METH_VARARGS, (char *)"\n"
		"SBValueList()\n"
		"new_SBValueList(SBValueList rhs) -> SBValueList\n"
		""},
	 { (char *)"delete_SBValueList", _wrap_delete_SBValueList, METH_VARARGS, (char *)"delete_SBValueList(SBValueList self)"},
	 { (char *)"SBValueList_IsValid", _wrap_SBValueList_IsValid, METH_VARARGS, (char *)"SBValueList_IsValid(SBValueList self) -> bool"},
	 { (char *)"SBValueList_Clear", _wrap_SBValueList_Clear, METH_VARARGS, (char *)"SBValueList_Clear(SBValueList self)"},
	 { (char *)"SBValueList_Append", _wrap_SBValueList_Append, METH_VARARGS, (char *)"\n"
		"Append(SBValue val_obj)\n"
		"SBValueList_Append(SBValueList self, SBValueList value_list)\n"
		""},
	 { (char *)"SBValueList_GetSize", _wrap_SBValueList_GetSize, METH_VARARGS, (char *)"SBValueList_GetSize(SBValueList self) -> uint32_t"},
	 { (char *)"SBValueList_GetValueAtIndex", _wrap_SBValueList_GetValueAtIndex, METH_VARARGS, (char *)"SBValueList_GetValueAtIndex(SBValueList self, uint32_t idx) -> SBValue"},
	 { (char *)"SBValueList_FindValueObjectByUID", _wrap_SBValueList_FindValueObjectByUID, METH_VARARGS, (char *)"SBValueList_FindValueObjectByUID(SBValueList self, user_id_t uid) -> SBValue"},
	 { (char *)"SBValueList_GetFirstValueByName", _wrap_SBValueList_GetFirstValueByName, METH_VARARGS, (char *)"SBValueList_GetFirstValueByName(SBValueList self, char name) -> SBValue"},
	 { (char *)"SBValueList___str__", _wrap_SBValueList___str__, METH_VARARGS, (char *)"SBValueList___str__(SBValueList self) -> PyObject"},
	 { (char *)"SBValueList_swigregister", SBValueList_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBVariablesOptions", _wrap_new_SBVariablesOptions, METH_VARARGS, (char *)"\n"
		"SBVariablesOptions()\n"
		"new_SBVariablesOptions(SBVariablesOptions options) -> SBVariablesOptions\n"
		""},
	 { (char *)"delete_SBVariablesOptions", _wrap_delete_SBVariablesOptions, METH_VARARGS, (char *)"delete_SBVariablesOptions(SBVariablesOptions self)"},
	 { (char *)"SBVariablesOptions_IsValid", _wrap_SBVariablesOptions_IsValid, METH_VARARGS, (char *)"SBVariablesOptions_IsValid(SBVariablesOptions self) -> bool"},
	 { (char *)"SBVariablesOptions_GetIncludeArguments", _wrap_SBVariablesOptions_GetIncludeArguments, METH_VARARGS, (char *)"SBVariablesOptions_GetIncludeArguments(SBVariablesOptions self) -> bool"},
	 { (char *)"SBVariablesOptions_SetIncludeArguments", _wrap_SBVariablesOptions_SetIncludeArguments, METH_VARARGS, (char *)"SBVariablesOptions_SetIncludeArguments(SBVariablesOptions self, bool arg1)"},
	 { (char *)"SBVariablesOptions_GetIncludeLocals", _wrap_SBVariablesOptions_GetIncludeLocals, METH_VARARGS, (char *)"SBVariablesOptions_GetIncludeLocals(SBVariablesOptions self) -> bool"},
	 { (char *)"SBVariablesOptions_SetIncludeLocals", _wrap_SBVariablesOptions_SetIncludeLocals, METH_VARARGS, (char *)"SBVariablesOptions_SetIncludeLocals(SBVariablesOptions self, bool arg1)"},
	 { (char *)"SBVariablesOptions_GetIncludeStatics", _wrap_SBVariablesOptions_GetIncludeStatics, METH_VARARGS, (char *)"SBVariablesOptions_GetIncludeStatics(SBVariablesOptions self) -> bool"},
	 { (char *)"SBVariablesOptions_SetIncludeStatics", _wrap_SBVariablesOptions_SetIncludeStatics, METH_VARARGS, (char *)"SBVariablesOptions_SetIncludeStatics(SBVariablesOptions self, bool arg1)"},
	 { (char *)"SBVariablesOptions_GetInScopeOnly", _wrap_SBVariablesOptions_GetInScopeOnly, METH_VARARGS, (char *)"SBVariablesOptions_GetInScopeOnly(SBVariablesOptions self) -> bool"},
	 { (char *)"SBVariablesOptions_SetInScopeOnly", _wrap_SBVariablesOptions_SetInScopeOnly, METH_VARARGS, (char *)"SBVariablesOptions_SetInScopeOnly(SBVariablesOptions self, bool arg1)"},
	 { (char *)"SBVariablesOptions_GetIncludeRuntimeSupportValues", _wrap_SBVariablesOptions_GetIncludeRuntimeSupportValues, METH_VARARGS, (char *)"SBVariablesOptions_GetIncludeRuntimeSupportValues(SBVariablesOptions self) -> bool"},
	 { (char *)"SBVariablesOptions_SetIncludeRuntimeSupportValues", _wrap_SBVariablesOptions_SetIncludeRuntimeSupportValues, METH_VARARGS, (char *)"SBVariablesOptions_SetIncludeRuntimeSupportValues(SBVariablesOptions self, bool arg1)"},
	 { (char *)"SBVariablesOptions_GetUseDynamic", _wrap_SBVariablesOptions_GetUseDynamic, METH_VARARGS, (char *)"SBVariablesOptions_GetUseDynamic(SBVariablesOptions self) -> DynamicValueType"},
	 { (char *)"SBVariablesOptions_SetUseDynamic", _wrap_SBVariablesOptions_SetUseDynamic, METH_VARARGS, (char *)"SBVariablesOptions_SetUseDynamic(SBVariablesOptions self, DynamicValueType arg1)"},
	 { (char *)"SBVariablesOptions_swigregister", SBVariablesOptions_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBWatchpoint", _wrap_new_SBWatchpoint, METH_VARARGS, (char *)"\n"
		"SBWatchpoint()\n"
		"new_SBWatchpoint(SBWatchpoint rhs) -> SBWatchpoint\n"
		""},
	 { (char *)"delete_SBWatchpoint", _wrap_delete_SBWatchpoint, METH_VARARGS, (char *)"delete_SBWatchpoint(SBWatchpoint self)"},
	 { (char *)"SBWatchpoint_IsValid", _wrap_SBWatchpoint_IsValid, METH_VARARGS, (char *)"SBWatchpoint_IsValid(SBWatchpoint self) -> bool"},
	 { (char *)"SBWatchpoint_GetError", _wrap_SBWatchpoint_GetError, METH_VARARGS, (char *)"SBWatchpoint_GetError(SBWatchpoint self) -> SBError"},
	 { (char *)"SBWatchpoint_GetID", _wrap_SBWatchpoint_GetID, METH_VARARGS, (char *)"SBWatchpoint_GetID(SBWatchpoint self) -> watch_id_t"},
	 { (char *)"SBWatchpoint_GetHardwareIndex", _wrap_SBWatchpoint_GetHardwareIndex, METH_VARARGS, (char *)"\n"
		"SBWatchpoint_GetHardwareIndex(SBWatchpoint self) -> int32_t\n"
		"\n"
		"//------------------------------------------------------------------\n"
		"/// With -1 representing an invalid hardware index.\n"
		"//------------------------------------------------------------------\n"
		"\n"
		""},
	 { (char *)"SBWatchpoint_GetWatchAddress", _wrap_SBWatchpoint_GetWatchAddress, METH_VARARGS, (char *)"SBWatchpoint_GetWatchAddress(SBWatchpoint self) -> addr_t"},
	 { (char *)"SBWatchpoint_GetWatchSize", _wrap_SBWatchpoint_GetWatchSize, METH_VARARGS, (char *)"SBWatchpoint_GetWatchSize(SBWatchpoint self) -> size_t"},
	 { (char *)"SBWatchpoint_SetEnabled", _wrap_SBWatchpoint_SetEnabled, METH_VARARGS, (char *)"SBWatchpoint_SetEnabled(SBWatchpoint self, bool enabled)"},
	 { (char *)"SBWatchpoint_IsEnabled", _wrap_SBWatchpoint_IsEnabled, METH_VARARGS, (char *)"SBWatchpoint_IsEnabled(SBWatchpoint self) -> bool"},
	 { (char *)"SBWatchpoint_GetHitCount", _wrap_SBWatchpoint_GetHitCount, METH_VARARGS, (char *)"SBWatchpoint_GetHitCount(SBWatchpoint self) -> uint32_t"},
	 { (char *)"SBWatchpoint_GetIgnoreCount", _wrap_SBWatchpoint_GetIgnoreCount, METH_VARARGS, (char *)"SBWatchpoint_GetIgnoreCount(SBWatchpoint self) -> uint32_t"},
	 { (char *)"SBWatchpoint_SetIgnoreCount", _wrap_SBWatchpoint_SetIgnoreCount, METH_VARARGS, (char *)"SBWatchpoint_SetIgnoreCount(SBWatchpoint self, uint32_t n)"},
	 { (char *)"SBWatchpoint_GetCondition", _wrap_SBWatchpoint_GetCondition, METH_VARARGS, (char *)"\n"
		"SBWatchpoint_GetCondition(SBWatchpoint self) -> char\n"
		"\n"
		"//------------------------------------------------------------------\n"
		"/// Get the condition expression for the watchpoint.\n"
		"//------------------------------------------------------------------\n"
		"\n"
		""},
	 { (char *)"SBWatchpoint_SetCondition", _wrap_SBWatchpoint_SetCondition, METH_VARARGS, (char *)"\n"
		"SBWatchpoint_SetCondition(SBWatchpoint self, char condition)\n"
		"\n"
		"//--------------------------------------------------------------------------\n"
		"/// The watchpoint stops only if the condition expression evaluates to true.\n"
		"//--------------------------------------------------------------------------\n"
		"\n"
		""},
	 { (char *)"SBWatchpoint_GetDescription", _wrap_SBWatchpoint_GetDescription, METH_VARARGS, (char *)"SBWatchpoint_GetDescription(SBWatchpoint self, SBStream description, DescriptionLevel level) -> bool"},
	 { (char *)"SBWatchpoint_EventIsWatchpointEvent", _wrap_SBWatchpoint_EventIsWatchpointEvent, METH_VARARGS, (char *)"SBWatchpoint_EventIsWatchpointEvent(SBEvent event) -> bool"},
	 { (char *)"SBWatchpoint_GetWatchpointEventTypeFromEvent", _wrap_SBWatchpoint_GetWatchpointEventTypeFromEvent, METH_VARARGS, (char *)"SBWatchpoint_GetWatchpointEventTypeFromEvent(SBEvent event) -> WatchpointEventType"},
	 { (char *)"SBWatchpoint_GetWatchpointFromEvent", _wrap_SBWatchpoint_GetWatchpointFromEvent, METH_VARARGS, (char *)"SBWatchpoint_GetWatchpointFromEvent(SBEvent event) -> SBWatchpoint"},
	 { (char *)"SBWatchpoint___str__", _wrap_SBWatchpoint___str__, METH_VARARGS, (char *)"SBWatchpoint___str__(SBWatchpoint self) -> PyObject"},
	 { (char *)"SBWatchpoint_swigregister", SBWatchpoint_swigregister, METH_VARARGS, NULL},
	 { (char *)"new_SBUnixSignals", _wrap_new_SBUnixSignals, METH_VARARGS, (char *)"\n"
		"SBUnixSignals()\n"
		"new_SBUnixSignals(SBUnixSignals rhs) -> SBUnixSignals\n"
		""},
	 { (char *)"delete_SBUnixSignals", _wrap_delete_SBUnixSignals, METH_VARARGS, (char *)"delete_SBUnixSignals(SBUnixSignals self)"},
	 { (char *)"SBUnixSignals_Clear", _wrap_SBUnixSignals_Clear, METH_VARARGS, (char *)"SBUnixSignals_Clear(SBUnixSignals self)"},
	 { (char *)"SBUnixSignals_IsValid", _wrap_SBUnixSignals_IsValid, METH_VARARGS, (char *)"SBUnixSignals_IsValid(SBUnixSignals self) -> bool"},
	 { (char *)"SBUnixSignals_GetSignalAsCString", _wrap_SBUnixSignals_GetSignalAsCString, METH_VARARGS, (char *)"SBUnixSignals_GetSignalAsCString(SBUnixSignals self, int32_t signo) -> char"},
	 { (char *)"SBUnixSignals_GetSignalNumberFromName", _wrap_SBUnixSignals_GetSignalNumberFromName, METH_VARARGS, (char *)"SBUnixSignals_GetSignalNumberFromName(SBUnixSignals self, char name) -> int32_t"},
	 { (char *)"SBUnixSignals_GetShouldSuppress", _wrap_SBUnixSignals_GetShouldSuppress, METH_VARARGS, (char *)"SBUnixSignals_GetShouldSuppress(SBUnixSignals self, int32_t signo) -> bool"},
	 { (char *)"SBUnixSignals_SetShouldSuppress", _wrap_SBUnixSignals_SetShouldSuppress, METH_VARARGS, (char *)"SBUnixSignals_SetShouldSuppress(SBUnixSignals self, int32_t signo, bool value) -> bool"},
	 { (char *)"SBUnixSignals_GetShouldStop", _wrap_SBUnixSignals_GetShouldStop, METH_VARARGS, (char *)"SBUnixSignals_GetShouldStop(SBUnixSignals self, int32_t signo) -> bool"},
	 { (char *)"SBUnixSignals_SetShouldStop", _wrap_SBUnixSignals_SetShouldStop, METH_VARARGS, (char *)"SBUnixSignals_SetShouldStop(SBUnixSignals self, int32_t signo, bool value) -> bool"},
	 { (char *)"SBUnixSignals_GetShouldNotify", _wrap_SBUnixSignals_GetShouldNotify, METH_VARARGS, (char *)"SBUnixSignals_GetShouldNotify(SBUnixSignals self, int32_t signo) -> bool"},
	 { (char *)"SBUnixSignals_SetShouldNotify", _wrap_SBUnixSignals_SetShouldNotify, METH_VARARGS, (char *)"SBUnixSignals_SetShouldNotify(SBUnixSignals self, int32_t signo, bool value) -> bool"},
	 { (char *)"SBUnixSignals_GetNumSignals", _wrap_SBUnixSignals_GetNumSignals, METH_VARARGS, (char *)"SBUnixSignals_GetNumSignals(SBUnixSignals self) -> int32_t"},
	 { (char *)"SBUnixSignals_GetSignalAtIndex", _wrap_SBUnixSignals_GetSignalAtIndex, METH_VARARGS, (char *)"SBUnixSignals_GetSignalAtIndex(SBUnixSignals self, int32_t index) -> int32_t"},
	 { (char *)"SBUnixSignals_swigregister", SBUnixSignals_swigregister, METH_VARARGS, NULL},
	 { NULL, NULL, 0, NULL }
};


/* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */

static swig_type_info _swigt__p_FILE = {"_p_FILE", "FILE *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_bool = {"_p_bool", "bool *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_char = {"_p_char", "char *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_double = {"_p_double", "double *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void__p_void = {"_p_f_p_void__p_void", "lldb::thread_func_t|void *(*)(void *)", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_f_p_void_p_q_const__void_size_t__void = {"_p_f_p_void_p_q_const__void_size_t__void", "void (*)(void *,void const *,size_t)|lldb::SBCommunication::ReadThreadBytesReceived", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_int = {"_p_int", "intptr_t *|int *|lldb::file_t *|int_least32_t *|int_fast32_t *|int32_t *|lldb::watch_id_t *|lldb::socket_t *|lldb::break_id_t *|int_fast16_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__ConnectionStatus = {"_p_lldb__ConnectionStatus", "enum lldb::ConnectionStatus *|lldb::ConnectionStatus *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBAddress = {"_p_lldb__SBAddress", "lldb::SBAddress *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBAttachInfo = {"_p_lldb__SBAttachInfo", "lldb::SBAttachInfo *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBBlock = {"_p_lldb__SBBlock", "lldb::SBBlock *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBBreakpoint = {"_p_lldb__SBBreakpoint", "lldb::SBBreakpoint *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBBreakpointList = {"_p_lldb__SBBreakpointList", "lldb::SBBreakpointList *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBBreakpointLocation = {"_p_lldb__SBBreakpointLocation", "lldb::SBBreakpointLocation *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBBreakpointName = {"_p_lldb__SBBreakpointName", "lldb::SBBreakpointName *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBBroadcaster = {"_p_lldb__SBBroadcaster", "lldb::SBBroadcaster *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBCommandInterpreter = {"_p_lldb__SBCommandInterpreter", "lldb::SBCommandInterpreter *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBCommandInterpreterRunOptions = {"_p_lldb__SBCommandInterpreterRunOptions", "lldb::SBCommandInterpreterRunOptions *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBCommandReturnObject = {"_p_lldb__SBCommandReturnObject", "lldb::SBCommandReturnObject *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBCommunication = {"_p_lldb__SBCommunication", "lldb::SBCommunication *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBCompileUnit = {"_p_lldb__SBCompileUnit", "lldb::SBCompileUnit *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBData = {"_p_lldb__SBData", "lldb::SBData *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBDebugger = {"_p_lldb__SBDebugger", "lldb::SBDebugger *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBDeclaration = {"_p_lldb__SBDeclaration", "lldb::SBDeclaration *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBError = {"_p_lldb__SBError", "lldb::SBError *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBEvent = {"_p_lldb__SBEvent", "lldb::SBEvent *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBExecutionContext = {"_p_lldb__SBExecutionContext", "lldb::SBExecutionContext *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBExpressionOptions = {"_p_lldb__SBExpressionOptions", "lldb::SBExpressionOptions *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBFileSpec = {"_p_lldb__SBFileSpec", "lldb::SBFileSpec *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBFileSpecList = {"_p_lldb__SBFileSpecList", "lldb::SBFileSpecList *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBFrame = {"_p_lldb__SBFrame", "lldb::SBFrame *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBFunction = {"_p_lldb__SBFunction", "lldb::SBFunction *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBHostOS = {"_p_lldb__SBHostOS", "lldb::SBHostOS *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBInstruction = {"_p_lldb__SBInstruction", "lldb::SBInstruction *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBInstructionList = {"_p_lldb__SBInstructionList", "lldb::SBInstructionList *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBLanguageRuntime = {"_p_lldb__SBLanguageRuntime", "lldb::SBLanguageRuntime *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBLaunchInfo = {"_p_lldb__SBLaunchInfo", "lldb::SBLaunchInfo *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBLineEntry = {"_p_lldb__SBLineEntry", "lldb::SBLineEntry *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBListener = {"_p_lldb__SBListener", "lldb::SBListener *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBMemoryRegionInfo = {"_p_lldb__SBMemoryRegionInfo", "lldb::SBMemoryRegionInfo *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBMemoryRegionInfoList = {"_p_lldb__SBMemoryRegionInfoList", "lldb::SBMemoryRegionInfoList *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBModule = {"_p_lldb__SBModule", "lldb::SBModule *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBModuleSpec = {"_p_lldb__SBModuleSpec", "lldb::SBModuleSpec *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBModuleSpecList = {"_p_lldb__SBModuleSpecList", "lldb::SBModuleSpecList *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBPlatform = {"_p_lldb__SBPlatform", "lldb::SBPlatform *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBPlatformConnectOptions = {"_p_lldb__SBPlatformConnectOptions", "lldb::SBPlatformConnectOptions *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBPlatformShellCommand = {"_p_lldb__SBPlatformShellCommand", "lldb::SBPlatformShellCommand *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBProcess = {"_p_lldb__SBProcess", "lldb::SBProcess *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBProcessInfo = {"_p_lldb__SBProcessInfo", "lldb::SBProcessInfo *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBQueue = {"_p_lldb__SBQueue", "lldb::SBQueue *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBQueueItem = {"_p_lldb__SBQueueItem", "lldb::SBQueueItem *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBSection = {"_p_lldb__SBSection", "lldb::SBSection *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBSourceManager = {"_p_lldb__SBSourceManager", "lldb::SBSourceManager *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBStream = {"_p_lldb__SBStream", "lldb::SBStream *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBStringList = {"_p_lldb__SBStringList", "lldb::SBStringList *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBStructuredData = {"_p_lldb__SBStructuredData", "lldb::SBStructuredData *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBSymbol = {"_p_lldb__SBSymbol", "lldb::SBSymbol *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBSymbolContext = {"_p_lldb__SBSymbolContext", "lldb::SBSymbolContext *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBSymbolContextList = {"_p_lldb__SBSymbolContextList", "lldb::SBSymbolContextList *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBTarget = {"_p_lldb__SBTarget", "lldb::SBTarget *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBThread = {"_p_lldb__SBThread", "lldb::SBThread *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBThreadCollection = {"_p_lldb__SBThreadCollection", "lldb::SBThreadCollection *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBThreadPlan = {"_p_lldb__SBThreadPlan", "lldb::SBThreadPlan *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBTrace = {"_p_lldb__SBTrace", "lldb::SBTrace *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBTraceOptions = {"_p_lldb__SBTraceOptions", "lldb::SBTraceOptions *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBType = {"_p_lldb__SBType", "lldb::SBType *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBTypeCategory = {"_p_lldb__SBTypeCategory", "lldb::SBTypeCategory *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBTypeEnumMember = {"_p_lldb__SBTypeEnumMember", "lldb::SBTypeEnumMember *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBTypeEnumMemberList = {"_p_lldb__SBTypeEnumMemberList", "lldb::SBTypeEnumMemberList *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBTypeFilter = {"_p_lldb__SBTypeFilter", "lldb::SBTypeFilter *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBTypeFormat = {"_p_lldb__SBTypeFormat", "lldb::SBTypeFormat *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBTypeList = {"_p_lldb__SBTypeList", "lldb::SBTypeList *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBTypeMember = {"_p_lldb__SBTypeMember", "lldb::SBTypeMember *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBTypeMemberFunction = {"_p_lldb__SBTypeMemberFunction", "lldb::SBTypeMemberFunction *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBTypeNameSpecifier = {"_p_lldb__SBTypeNameSpecifier", "lldb::SBTypeNameSpecifier *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBTypeSummary = {"_p_lldb__SBTypeSummary", "lldb::SBTypeSummary *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBTypeSummaryOptions = {"_p_lldb__SBTypeSummaryOptions", "lldb::SBTypeSummaryOptions *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBTypeSynthetic = {"_p_lldb__SBTypeSynthetic", "lldb::SBTypeSynthetic *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBUnixSignals = {"_p_lldb__SBUnixSignals", "lldb::SBUnixSignals *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBValue = {"_p_lldb__SBValue", "lldb::SBValue *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBValueList = {"_p_lldb__SBValueList", "lldb::SBValueList *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBVariablesOptions = {"_p_lldb__SBVariablesOptions", "lldb::SBVariablesOptions *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb__SBWatchpoint = {"_p_lldb__SBWatchpoint", "lldb::SBWatchpoint *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_lldb_private__SharingPtrT_lldb_private__ValueObject_t = {"_p_lldb_private__SharingPtrT_lldb_private__ValueObject_t", "lldb::ValueObjectSP *|lldb_private::SharingPtr< lldb_private::ValueObject > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_long_double = {"_p_long_double", "long double *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_long_long = {"_p_long_long", "int_least64_t *|int_fast64_t *|int64_t *|long long *|intmax_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_p_void = {"_p_p_void", "lldb::thread_result_t *|void **", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_pthread_rwlock_t = {"_p_pthread_rwlock_t", "pthread_rwlock_t *|lldb::rwlock_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_pthread_t = {"_p_pthread_t", "pthread_t *|lldb::thread_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_short = {"_p_short", "short *|int_least16_t *|int16_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_signed_char = {"_p_signed_char", "signed char *|int_least8_t *|int_fast8_t *|int8_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__ABI_t = {"_p_std__shared_ptrT_lldb_private__ABI_t", "std::shared_ptr< lldb_private::ABI > *|lldb::ABISP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__Baton_t = {"_p_std__shared_ptrT_lldb_private__Baton_t", "lldb::BatonSP *|std::shared_ptr< lldb_private::Baton > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__Block_t = {"_p_std__shared_ptrT_lldb_private__Block_t", "lldb::BlockSP *|std::shared_ptr< lldb_private::Block > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__BreakpointLocation_t = {"_p_std__shared_ptrT_lldb_private__BreakpointLocation_t", "lldb::BreakpointLocationSP *|std::shared_ptr< lldb_private::BreakpointLocation > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__BreakpointResolver_t = {"_p_std__shared_ptrT_lldb_private__BreakpointResolver_t", "std::shared_ptr< lldb_private::BreakpointResolver > *|lldb::BreakpointResolverSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__BreakpointSite_t = {"_p_std__shared_ptrT_lldb_private__BreakpointSite_t", "std::shared_ptr< lldb_private::BreakpointSite > *|lldb::BreakpointSiteSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__Breakpoint_t = {"_p_std__shared_ptrT_lldb_private__Breakpoint_t", "lldb::BreakpointSP *|std::shared_ptr< lldb_private::Breakpoint > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__BroadcasterManager_t = {"_p_std__shared_ptrT_lldb_private__BroadcasterManager_t", "lldb::BroadcasterManagerSP *|std::shared_ptr< lldb_private::BroadcasterManager > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__Broadcaster_t = {"_p_std__shared_ptrT_lldb_private__Broadcaster_t", "std::shared_ptr< lldb_private::Broadcaster > *|lldb::BroadcasterSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__ClangASTImporter_t = {"_p_std__shared_ptrT_lldb_private__ClangASTImporter_t", "std::shared_ptr< lldb_private::ClangASTImporter > *|lldb::ClangASTImporterSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__CommandObject_t = {"_p_std__shared_ptrT_lldb_private__CommandObject_t", "lldb::CommandObjectSP *|std::shared_ptr< lldb_private::CommandObject > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__Communication_t = {"_p_std__shared_ptrT_lldb_private__Communication_t", "lldb::CommunicationSP *|std::shared_ptr< lldb_private::Communication > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__CompileUnit_t = {"_p_std__shared_ptrT_lldb_private__CompileUnit_t", "lldb::CompUnitSP *|std::shared_ptr< lldb_private::CompileUnit > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__Connection_t = {"_p_std__shared_ptrT_lldb_private__Connection_t", "lldb::ConnectionSP *|std::shared_ptr< lldb_private::Connection > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__DataBuffer_t = {"_p_std__shared_ptrT_lldb_private__DataBuffer_t", "std::shared_ptr< lldb_private::DataBuffer > *|lldb::DataBufferSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__DataExtractor_t = {"_p_std__shared_ptrT_lldb_private__DataExtractor_t", "std::shared_ptr< lldb_private::DataExtractor > *|lldb::DataExtractorSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__Debugger_t = {"_p_std__shared_ptrT_lldb_private__Debugger_t", "std::shared_ptr< lldb_private::Debugger > *|lldb::DebuggerSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__Disassembler_t = {"_p_std__shared_ptrT_lldb_private__Disassembler_t", "std::shared_ptr< lldb_private::Disassembler > *|lldb::DisassemblerSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__DynamicLoader_t = {"_p_std__shared_ptrT_lldb_private__DynamicLoader_t", "std::shared_ptr< lldb_private::DynamicLoader > *|lldb::DynamicLoaderSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__EventDataStructuredData_t = {"_p_std__shared_ptrT_lldb_private__EventDataStructuredData_t", "lldb::EventDataStructuredDataSP *|std::shared_ptr< lldb_private::EventDataStructuredData > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__EventData_t = {"_p_std__shared_ptrT_lldb_private__EventData_t", "lldb::EventDataSP *|std::shared_ptr< lldb_private::EventData > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__Event_t = {"_p_std__shared_ptrT_lldb_private__Event_t", "lldb::EventSP *|std::shared_ptr< lldb_private::Event > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__ExecutionContextRef_t = {"_p_std__shared_ptrT_lldb_private__ExecutionContextRef_t", "std::shared_ptr< lldb_private::ExecutionContextRef > *|lldb::ExecutionContextRefSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__ExpressionVariable_t = {"_p_std__shared_ptrT_lldb_private__ExpressionVariable_t", "std::shared_ptr< lldb_private::ExpressionVariable > *|lldb::ExpressionVariableSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__File_t = {"_p_std__shared_ptrT_lldb_private__File_t", "lldb::FileSP *|std::shared_ptr< lldb_private::File > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__FuncUnwinders_t = {"_p_std__shared_ptrT_lldb_private__FuncUnwinders_t", "std::shared_ptr< lldb_private::FuncUnwinders > *|lldb::FuncUnwindersSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__FunctionCaller_t = {"_p_std__shared_ptrT_lldb_private__FunctionCaller_t", "std::shared_ptr< lldb_private::FunctionCaller > *|lldb::FunctionCallerSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__Function_t = {"_p_std__shared_ptrT_lldb_private__Function_t", "lldb::FunctionSP *|std::shared_ptr< lldb_private::Function > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__IOHandler_t = {"_p_std__shared_ptrT_lldb_private__IOHandler_t", "std::shared_ptr< lldb_private::IOHandler > *|lldb::IOHandlerSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__IOObject_t = {"_p_std__shared_ptrT_lldb_private__IOObject_t", "lldb::IOObjectSP *|std::shared_ptr< lldb_private::IOObject > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__IRExecutionUnit_t = {"_p_std__shared_ptrT_lldb_private__IRExecutionUnit_t", "lldb::IRExecutionUnitSP *|std::shared_ptr< lldb_private::IRExecutionUnit > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__InlineFunctionInfo_t = {"_p_std__shared_ptrT_lldb_private__InlineFunctionInfo_t", "lldb::InlineFunctionInfoSP *|std::shared_ptr< lldb_private::InlineFunctionInfo > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__Instruction_t = {"_p_std__shared_ptrT_lldb_private__Instruction_t", "lldb::InstructionSP *|std::shared_ptr< lldb_private::Instruction > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__InstrumentationRuntime_t = {"_p_std__shared_ptrT_lldb_private__InstrumentationRuntime_t", "lldb::InstrumentationRuntimeSP *|std::shared_ptr< lldb_private::InstrumentationRuntime > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__JITLoader_t = {"_p_std__shared_ptrT_lldb_private__JITLoader_t", "std::shared_ptr< lldb_private::JITLoader > *|lldb::JITLoaderSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__LanguageRuntime_t = {"_p_std__shared_ptrT_lldb_private__LanguageRuntime_t", "std::shared_ptr< lldb_private::LanguageRuntime > *|lldb::LanguageRuntimeSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__LineTable_t = {"_p_std__shared_ptrT_lldb_private__LineTable_t", "lldb::LineTableSP *|std::shared_ptr< lldb_private::LineTable > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__Listener_t = {"_p_std__shared_ptrT_lldb_private__Listener_t", "std::shared_ptr< lldb_private::Listener > *|lldb::ListenerSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__MemoryHistory_t = {"_p_std__shared_ptrT_lldb_private__MemoryHistory_t", "lldb::MemoryHistorySP *|std::shared_ptr< lldb_private::MemoryHistory > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__MemoryRegionInfo_t = {"_p_std__shared_ptrT_lldb_private__MemoryRegionInfo_t", "std::shared_ptr< lldb_private::MemoryRegionInfo > *|lldb::MemoryRegionInfoSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__Module_t = {"_p_std__shared_ptrT_lldb_private__Module_t", "lldb::ModuleSP *|std::shared_ptr< lldb_private::Module > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__ObjectFileJITDelegate_t = {"_p_std__shared_ptrT_lldb_private__ObjectFileJITDelegate_t", "lldb::ObjectFileJITDelegateSP *|std::shared_ptr< lldb_private::ObjectFileJITDelegate > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__ObjectFile_t = {"_p_std__shared_ptrT_lldb_private__ObjectFile_t", "lldb::ObjectFileSP *|std::shared_ptr< lldb_private::ObjectFile > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__OptionValueArch_t = {"_p_std__shared_ptrT_lldb_private__OptionValueArch_t", "std::shared_ptr< lldb_private::OptionValueArch > *|lldb::OptionValueArchSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__OptionValueArgs_t = {"_p_std__shared_ptrT_lldb_private__OptionValueArgs_t", "std::shared_ptr< lldb_private::OptionValueArgs > *|lldb::OptionValueArgsSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__OptionValueArray_t = {"_p_std__shared_ptrT_lldb_private__OptionValueArray_t", "std::shared_ptr< lldb_private::OptionValueArray > *|lldb::OptionValueArraySP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__OptionValueBoolean_t = {"_p_std__shared_ptrT_lldb_private__OptionValueBoolean_t", "lldb::OptionValueBooleanSP *|std::shared_ptr< lldb_private::OptionValueBoolean > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__OptionValueDictionary_t = {"_p_std__shared_ptrT_lldb_private__OptionValueDictionary_t", "lldb::OptionValueDictionarySP *|std::shared_ptr< lldb_private::OptionValueDictionary > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__OptionValueFileSpecList_t = {"_p_std__shared_ptrT_lldb_private__OptionValueFileSpecList_t", "lldb::OptionValueFileSpecListSP *|std::shared_ptr< lldb_private::OptionValueFileSpecList > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__OptionValueFileSpec_t = {"_p_std__shared_ptrT_lldb_private__OptionValueFileSpec_t", "lldb::OptionValueFileSpecSP *|std::shared_ptr< lldb_private::OptionValueFileSpec > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__OptionValueFormat_t = {"_p_std__shared_ptrT_lldb_private__OptionValueFormat_t", "std::shared_ptr< lldb_private::OptionValueFormat > *|lldb::OptionValueFormatSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__OptionValuePathMappings_t = {"_p_std__shared_ptrT_lldb_private__OptionValuePathMappings_t", "std::shared_ptr< lldb_private::OptionValuePathMappings > *|lldb::OptionValuePathMappingsSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__OptionValueProperties_t = {"_p_std__shared_ptrT_lldb_private__OptionValueProperties_t", "lldb::OptionValuePropertiesSP *|std::shared_ptr< lldb_private::OptionValueProperties > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__OptionValueRegex_t = {"_p_std__shared_ptrT_lldb_private__OptionValueRegex_t", "std::shared_ptr< lldb_private::OptionValueRegex > *|lldb::OptionValueRegexSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__OptionValueSInt64_t = {"_p_std__shared_ptrT_lldb_private__OptionValueSInt64_t", "std::shared_ptr< lldb_private::OptionValueSInt64 > *|lldb::OptionValueSInt64SP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__OptionValueString_t = {"_p_std__shared_ptrT_lldb_private__OptionValueString_t", "std::shared_ptr< lldb_private::OptionValueString > *|lldb::OptionValueStringSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__OptionValueUInt64_t = {"_p_std__shared_ptrT_lldb_private__OptionValueUInt64_t", "std::shared_ptr< lldb_private::OptionValueUInt64 > *|lldb::OptionValueUInt64SP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__OptionValueUUID_t = {"_p_std__shared_ptrT_lldb_private__OptionValueUUID_t", "std::shared_ptr< lldb_private::OptionValueUUID > *|lldb::OptionValueUUIDSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__OptionValue_t = {"_p_std__shared_ptrT_lldb_private__OptionValue_t", "std::shared_ptr< lldb_private::OptionValue > *|lldb::OptionValueSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__Platform_t = {"_p_std__shared_ptrT_lldb_private__Platform_t", "std::shared_ptr< lldb_private::Platform > *|lldb::PlatformSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__ProcessAttachInfo_t = {"_p_std__shared_ptrT_lldb_private__ProcessAttachInfo_t", "lldb::ProcessAttachInfoSP *|std::shared_ptr< lldb_private::ProcessAttachInfo > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__ProcessLaunchInfo_t = {"_p_std__shared_ptrT_lldb_private__ProcessLaunchInfo_t", "lldb::ProcessLaunchInfoSP *|std::shared_ptr< lldb_private::ProcessLaunchInfo > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__Process_t = {"_p_std__shared_ptrT_lldb_private__Process_t", "lldb::ProcessSP *|std::shared_ptr< lldb_private::Process > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__Property_t = {"_p_std__shared_ptrT_lldb_private__Property_t", "lldb::PropertySP *|std::shared_ptr< lldb_private::Property > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__QueueItem_t = {"_p_std__shared_ptrT_lldb_private__QueueItem_t", "std::shared_ptr< lldb_private::QueueItem > *|lldb::QueueItemSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__Queue_t = {"_p_std__shared_ptrT_lldb_private__Queue_t", "std::shared_ptr< lldb_private::Queue > *|lldb::QueueSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__REPL_t = {"_p_std__shared_ptrT_lldb_private__REPL_t", "lldb::REPLSP *|std::shared_ptr< lldb_private::REPL > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__RegisterCheckpoint_t = {"_p_std__shared_ptrT_lldb_private__RegisterCheckpoint_t", "std::shared_ptr< lldb_private::RegisterCheckpoint > *|lldb::RegisterCheckpointSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__RegisterContext_t = {"_p_std__shared_ptrT_lldb_private__RegisterContext_t", "lldb::RegisterContextSP *|std::shared_ptr< lldb_private::RegisterContext > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__RegularExpression_t = {"_p_std__shared_ptrT_lldb_private__RegularExpression_t", "lldb::RegularExpressionSP *|std::shared_ptr< lldb_private::RegularExpression > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__ScriptInterpreter_t = {"_p_std__shared_ptrT_lldb_private__ScriptInterpreter_t", "std::shared_ptr< lldb_private::ScriptInterpreter > *|lldb::ScriptInterpreterSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__ScriptSummaryFormat_t = {"_p_std__shared_ptrT_lldb_private__ScriptSummaryFormat_t", "lldb::ScriptSummaryFormatSP *|std::shared_ptr< lldb_private::ScriptSummaryFormat > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__ScriptedSyntheticChildren_t = {"_p_std__shared_ptrT_lldb_private__ScriptedSyntheticChildren_t", "std::shared_ptr< lldb_private::ScriptedSyntheticChildren > *|lldb::ScriptedSyntheticChildrenSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__SearchFilter_t = {"_p_std__shared_ptrT_lldb_private__SearchFilter_t", "std::shared_ptr< lldb_private::SearchFilter > *|lldb::SearchFilterSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__SectionLoadList_t = {"_p_std__shared_ptrT_lldb_private__SectionLoadList_t", "std::shared_ptr< lldb_private::SectionLoadList > *|lldb::SectionLoadListSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__Section_t = {"_p_std__shared_ptrT_lldb_private__Section_t", "lldb::SectionSP *|std::shared_ptr< lldb_private::Section > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__Settings_t = {"_p_std__shared_ptrT_lldb_private__Settings_t", "std::shared_ptr< lldb_private::Settings > *|lldb::SettingsSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__StackFrameList_t = {"_p_std__shared_ptrT_lldb_private__StackFrameList_t", "std::shared_ptr< lldb_private::StackFrameList > *|lldb::StackFrameListSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__StackFrame_t = {"_p_std__shared_ptrT_lldb_private__StackFrame_t", "std::shared_ptr< lldb_private::StackFrame > *|lldb::StackFrameSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__StopInfo_t = {"_p_std__shared_ptrT_lldb_private__StopInfo_t", "lldb::StopInfoSP *|std::shared_ptr< lldb_private::StopInfo > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__StoppointLocation_t = {"_p_std__shared_ptrT_lldb_private__StoppointLocation_t", "std::shared_ptr< lldb_private::StoppointLocation > *|lldb::StoppointLocationSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__StreamFile_t = {"_p_std__shared_ptrT_lldb_private__StreamFile_t", "lldb::StreamFileSP *|std::shared_ptr< lldb_private::StreamFile > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__Stream_t = {"_p_std__shared_ptrT_lldb_private__Stream_t", "std::shared_ptr< lldb_private::Stream > *|lldb::StreamSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__StringSummaryFormat_t = {"_p_std__shared_ptrT_lldb_private__StringSummaryFormat_t", "lldb::StringTypeSummaryImplSP *|std::shared_ptr< lldb_private::StringSummaryFormat > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__StructuredDataPlugin_t = {"_p_std__shared_ptrT_lldb_private__StructuredDataPlugin_t", "lldb::StructuredDataPluginSP *|std::shared_ptr< lldb_private::StructuredDataPlugin > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__SwiftASTContext_t = {"_p_std__shared_ptrT_lldb_private__SwiftASTContext_t", "lldb::SwiftASTContextSP *|std::shared_ptr< lldb_private::SwiftASTContext > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__SymbolContextSpecifier_t = {"_p_std__shared_ptrT_lldb_private__SymbolContextSpecifier_t", "lldb::SymbolContextSpecifierSP *|std::shared_ptr< lldb_private::SymbolContextSpecifier > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__SymbolFileType_t = {"_p_std__shared_ptrT_lldb_private__SymbolFileType_t", "lldb::SymbolFileTypeSP *|std::shared_ptr< lldb_private::SymbolFileType > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__SymbolFile_t = {"_p_std__shared_ptrT_lldb_private__SymbolFile_t", "lldb::SymbolFileSP *|std::shared_ptr< lldb_private::SymbolFile > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__SyntheticChildrenFrontEnd_t = {"_p_std__shared_ptrT_lldb_private__SyntheticChildrenFrontEnd_t", "lldb::SyntheticChildrenFrontEndSP *|std::shared_ptr< lldb_private::SyntheticChildrenFrontEnd > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__SyntheticChildren_t = {"_p_std__shared_ptrT_lldb_private__SyntheticChildren_t", "std::shared_ptr< lldb_private::SyntheticChildren > *|lldb::SyntheticChildrenSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__SystemRuntime_t = {"_p_std__shared_ptrT_lldb_private__SystemRuntime_t", "std::shared_ptr< lldb_private::SystemRuntime > *|lldb::SystemRuntimeSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__TargetProperties_t = {"_p_std__shared_ptrT_lldb_private__TargetProperties_t", "std::shared_ptr< lldb_private::TargetProperties > *|lldb::TargetPropertiesSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__Target_t = {"_p_std__shared_ptrT_lldb_private__Target_t", "std::shared_ptr< lldb_private::Target > *|lldb::TargetSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__ThreadCollection_t = {"_p_std__shared_ptrT_lldb_private__ThreadCollection_t", "std::shared_ptr< lldb_private::ThreadCollection > *|lldb::ThreadCollectionSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__ThreadPlanTracer_t = {"_p_std__shared_ptrT_lldb_private__ThreadPlanTracer_t", "std::shared_ptr< lldb_private::ThreadPlanTracer > *|lldb::ThreadPlanTracerSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__ThreadPlan_t = {"_p_std__shared_ptrT_lldb_private__ThreadPlan_t", "lldb::ThreadPlanSP *|std::shared_ptr< lldb_private::ThreadPlan > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__Thread_t = {"_p_std__shared_ptrT_lldb_private__Thread_t", "std::shared_ptr< lldb_private::Thread > *|lldb::ThreadSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__TraceOptions_t = {"_p_std__shared_ptrT_lldb_private__TraceOptions_t", "std::shared_ptr< lldb_private::TraceOptions > *|lldb::TraceOptionsSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__TypeCategoryImpl_t = {"_p_std__shared_ptrT_lldb_private__TypeCategoryImpl_t", "std::shared_ptr< lldb_private::TypeCategoryImpl > *|lldb::TypeCategoryImplSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__TypeEnumMemberImpl_t = {"_p_std__shared_ptrT_lldb_private__TypeEnumMemberImpl_t", "lldb::TypeEnumMemberImplSP *|std::shared_ptr< lldb_private::TypeEnumMemberImpl > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__TypeFilterImpl_t = {"_p_std__shared_ptrT_lldb_private__TypeFilterImpl_t", "lldb::TypeFilterImplSP *|std::shared_ptr< lldb_private::TypeFilterImpl > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__TypeFormatImpl_t = {"_p_std__shared_ptrT_lldb_private__TypeFormatImpl_t", "lldb::TypeFormatImplSP *|std::shared_ptr< lldb_private::TypeFormatImpl > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__TypeImpl_t = {"_p_std__shared_ptrT_lldb_private__TypeImpl_t", "lldb::TypeImplSP *|std::shared_ptr< lldb_private::TypeImpl > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__TypeMemberFunctionImpl_t = {"_p_std__shared_ptrT_lldb_private__TypeMemberFunctionImpl_t", "std::shared_ptr< lldb_private::TypeMemberFunctionImpl > *|lldb::TypeMemberFunctionImplSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__TypeNameSpecifierImpl_t = {"_p_std__shared_ptrT_lldb_private__TypeNameSpecifierImpl_t", "std::shared_ptr< lldb_private::TypeNameSpecifierImpl > *|lldb::TypeNameSpecifierImplSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__TypeSummaryImpl_t = {"_p_std__shared_ptrT_lldb_private__TypeSummaryImpl_t", "lldb::TypeSummaryImplSP *|std::shared_ptr< lldb_private::TypeSummaryImpl > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__TypeSummaryOptions_t = {"_p_std__shared_ptrT_lldb_private__TypeSummaryOptions_t", "std::shared_ptr< lldb_private::TypeSummaryOptions > *|lldb::TypeSummaryOptionsSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__TypeSystem_t = {"_p_std__shared_ptrT_lldb_private__TypeSystem_t", "std::shared_ptr< lldb_private::TypeSystem > *|lldb::TypeSystemSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__TypeValidatorImpl_t = {"_p_std__shared_ptrT_lldb_private__TypeValidatorImpl_t", "lldb::TypeValidatorImplSP *|std::shared_ptr< lldb_private::TypeValidatorImpl > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__Type_t = {"_p_std__shared_ptrT_lldb_private__Type_t", "lldb::TypeSP *|std::shared_ptr< lldb_private::Type > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__UnixSignals_t = {"_p_std__shared_ptrT_lldb_private__UnixSignals_t", "lldb::UnixSignalsSP *|std::shared_ptr< lldb_private::UnixSignals > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__UnwindAssembly_t = {"_p_std__shared_ptrT_lldb_private__UnwindAssembly_t", "std::shared_ptr< lldb_private::UnwindAssembly > *|lldb::UnwindAssemblySP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__UnwindPlan_t = {"_p_std__shared_ptrT_lldb_private__UnwindPlan_t", "lldb::UnwindPlanSP *|std::shared_ptr< lldb_private::UnwindPlan > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__UserExpression_t = {"_p_std__shared_ptrT_lldb_private__UserExpression_t", "lldb::UserExpressionSP *|std::shared_ptr< lldb_private::UserExpression > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__UtilityFunction_t = {"_p_std__shared_ptrT_lldb_private__UtilityFunction_t", "lldb::UtilityFunctionSP *|std::shared_ptr< lldb_private::UtilityFunction > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__ValueList_t = {"_p_std__shared_ptrT_lldb_private__ValueList_t", "std::shared_ptr< lldb_private::ValueList > *|lldb::ValueListSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__ValueObjectList_t = {"_p_std__shared_ptrT_lldb_private__ValueObjectList_t", "std::shared_ptr< lldb_private::ValueObjectList > *|lldb::ValueObjectListSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__Value_t = {"_p_std__shared_ptrT_lldb_private__Value_t", "std::shared_ptr< lldb_private::Value > *|lldb::ValueSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__VariableList_t = {"_p_std__shared_ptrT_lldb_private__VariableList_t", "std::shared_ptr< lldb_private::VariableList > *|lldb::VariableListSP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__Variable_t = {"_p_std__shared_ptrT_lldb_private__Variable_t", "lldb::VariableSP *|std::shared_ptr< lldb_private::Variable > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__shared_ptrT_lldb_private__Watchpoint_t = {"_p_std__shared_ptrT_lldb_private__Watchpoint_t", "lldb::WatchpointSP *|std::shared_ptr< lldb_private::Watchpoint > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__unique_ptrT_lldb_private__ClangASTContext_t = {"_p_std__unique_ptrT_lldb_private__ClangASTContext_t", "lldb::ClangASTContextUP *|std::unique_ptr< lldb_private::ClangASTContext > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__unique_ptrT_lldb_private__ClangModulesDeclVendor_t = {"_p_std__unique_ptrT_lldb_private__ClangModulesDeclVendor_t", "std::unique_ptr< lldb_private::ClangModulesDeclVendor > *|lldb::ClangModulesDeclVendorUP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__unique_ptrT_lldb_private__ClangPersistentVariables_t = {"_p_std__unique_ptrT_lldb_private__ClangPersistentVariables_t", "std::unique_ptr< lldb_private::ClangPersistentVariables > *|lldb::ClangPersistentVariablesUP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__unique_ptrT_lldb_private__DynamicCheckerFunctions_t = {"_p_std__unique_ptrT_lldb_private__DynamicCheckerFunctions_t", "lldb::DynamicCheckerFunctionsUP *|std::unique_ptr< lldb_private::DynamicCheckerFunctions > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__unique_ptrT_lldb_private__DynamicLoader_t = {"_p_std__unique_ptrT_lldb_private__DynamicLoader_t", "lldb::DynamicLoaderUP *|std::unique_ptr< lldb_private::DynamicLoader > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__unique_ptrT_lldb_private__GoASTContext_t = {"_p_std__unique_ptrT_lldb_private__GoASTContext_t", "lldb::GoASTContextUP *|std::unique_ptr< lldb_private::GoASTContext > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__unique_ptrT_lldb_private__JITLoaderList_t = {"_p_std__unique_ptrT_lldb_private__JITLoaderList_t", "lldb::JITLoaderListUP *|std::unique_ptr< lldb_private::JITLoaderList > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__unique_ptrT_lldb_private__MemoryRegionInfo_t = {"_p_std__unique_ptrT_lldb_private__MemoryRegionInfo_t", "std::unique_ptr< lldb_private::MemoryRegionInfo > *|lldb::MemoryRegionInfoUP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__unique_ptrT_lldb_private__OperatingSystem_t = {"_p_std__unique_ptrT_lldb_private__OperatingSystem_t", "lldb::OperatingSystemUP *|std::unique_ptr< lldb_private::OperatingSystem > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__unique_ptrT_lldb_private__ScriptInterpreter_t = {"_p_std__unique_ptrT_lldb_private__ScriptInterpreter_t", "std::unique_ptr< lldb_private::ScriptInterpreter > *|lldb::ScriptInterpreterUP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__unique_ptrT_lldb_private__SectionList_t = {"_p_std__unique_ptrT_lldb_private__SectionList_t", "lldb::SectionListUP *|std::unique_ptr< lldb_private::SectionList > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__unique_ptrT_lldb_private__SourceManager_t = {"_p_std__unique_ptrT_lldb_private__SourceManager_t", "std::unique_ptr< lldb_private::SourceManager > *|lldb::SourceManagerUP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__unique_ptrT_lldb_private__StackFrame_t = {"_p_std__unique_ptrT_lldb_private__StackFrame_t", "std::unique_ptr< lldb_private::StackFrame > *|lldb::StackFrameUP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__unique_ptrT_lldb_private__StructuredDataImpl_t = {"_p_std__unique_ptrT_lldb_private__StructuredDataImpl_t", "std::unique_ptr< lldb_private::StructuredDataImpl > *|lldb::StructuredDataImplUP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__unique_ptrT_lldb_private__SymbolVendor_t = {"_p_std__unique_ptrT_lldb_private__SymbolVendor_t", "std::unique_ptr< lldb_private::SymbolVendor > *|lldb::SymbolVendorUP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__unique_ptrT_lldb_private__SystemRuntime_t = {"_p_std__unique_ptrT_lldb_private__SystemRuntime_t", "std::unique_ptr< lldb_private::SystemRuntime > *|lldb::SystemRuntimeUP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__weak_ptrT_lldb_private__BreakpointLocation_t = {"_p_std__weak_ptrT_lldb_private__BreakpointLocation_t", "std::weak_ptr< lldb_private::BreakpointLocation > *|lldb::BreakpointLocationWP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__weak_ptrT_lldb_private__BreakpointSite_t = {"_p_std__weak_ptrT_lldb_private__BreakpointSite_t", "std::weak_ptr< lldb_private::BreakpointSite > *|lldb::BreakpointSiteWP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__weak_ptrT_lldb_private__Breakpoint_t = {"_p_std__weak_ptrT_lldb_private__Breakpoint_t", "std::weak_ptr< lldb_private::Breakpoint > *|lldb::BreakpointWP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__weak_ptrT_lldb_private__BroadcasterManager_t = {"_p_std__weak_ptrT_lldb_private__BroadcasterManager_t", "std::weak_ptr< lldb_private::BroadcasterManager > *|lldb::BroadcasterManagerWP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__weak_ptrT_lldb_private__Debugger_t = {"_p_std__weak_ptrT_lldb_private__Debugger_t", "std::weak_ptr< lldb_private::Debugger > *|lldb::DebuggerWP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__weak_ptrT_lldb_private__Listener_t = {"_p_std__weak_ptrT_lldb_private__Listener_t", "std::weak_ptr< lldb_private::Listener > *|lldb::ListenerWP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__weak_ptrT_lldb_private__Module_t = {"_p_std__weak_ptrT_lldb_private__Module_t", "std::weak_ptr< lldb_private::Module > *|lldb::ModuleWP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__weak_ptrT_lldb_private__ObjectFileJITDelegate_t = {"_p_std__weak_ptrT_lldb_private__ObjectFileJITDelegate_t", "lldb::ObjectFileJITDelegateWP *|std::weak_ptr< lldb_private::ObjectFileJITDelegate > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__weak_ptrT_lldb_private__ObjectFile_t = {"_p_std__weak_ptrT_lldb_private__ObjectFile_t", "std::weak_ptr< lldb_private::ObjectFile > *|lldb::ObjectFileWP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__weak_ptrT_lldb_private__OptionValue_t = {"_p_std__weak_ptrT_lldb_private__OptionValue_t", "std::weak_ptr< lldb_private::OptionValue > *|lldb::OptionValueWP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__weak_ptrT_lldb_private__Process_t = {"_p_std__weak_ptrT_lldb_private__Process_t", "std::weak_ptr< lldb_private::Process > *|lldb::ProcessWP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__weak_ptrT_lldb_private__Queue_t = {"_p_std__weak_ptrT_lldb_private__Queue_t", "std::weak_ptr< lldb_private::Queue > *|lldb::QueueWP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__weak_ptrT_lldb_private__Section_t = {"_p_std__weak_ptrT_lldb_private__Section_t", "std::weak_ptr< lldb_private::Section > *|lldb::SectionWP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__weak_ptrT_lldb_private__StackFrame_t = {"_p_std__weak_ptrT_lldb_private__StackFrame_t", "std::weak_ptr< lldb_private::StackFrame > *|lldb::StackFrameWP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__weak_ptrT_lldb_private__Stream_t = {"_p_std__weak_ptrT_lldb_private__Stream_t", "std::weak_ptr< lldb_private::Stream > *|lldb::StreamWP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__weak_ptrT_lldb_private__StructuredDataPlugin_t = {"_p_std__weak_ptrT_lldb_private__StructuredDataPlugin_t", "lldb::StructuredDataPluginWP *|std::weak_ptr< lldb_private::StructuredDataPlugin > *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__weak_ptrT_lldb_private__SymbolFileType_t = {"_p_std__weak_ptrT_lldb_private__SymbolFileType_t", "std::weak_ptr< lldb_private::SymbolFileType > *|lldb::SymbolFileTypeWP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__weak_ptrT_lldb_private__Target_t = {"_p_std__weak_ptrT_lldb_private__Target_t", "std::weak_ptr< lldb_private::Target > *|lldb::TargetWP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__weak_ptrT_lldb_private__Thread_t = {"_p_std__weak_ptrT_lldb_private__Thread_t", "std::weak_ptr< lldb_private::Thread > *|lldb::ThreadWP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__weak_ptrT_lldb_private__Type_t = {"_p_std__weak_ptrT_lldb_private__Type_t", "std::weak_ptr< lldb_private::Type > *|lldb::TypeWP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_std__weak_ptrT_lldb_private__UnixSignals_t = {"_p_std__weak_ptrT_lldb_private__UnixSignals_t", "std::weak_ptr< lldb_private::UnixSignals > *|lldb::UnixSignalsWP *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_unsigned_char = {"_p_unsigned_char", "unsigned char *|uint_least8_t *|uint_fast8_t *|uint8_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_unsigned_int = {"_p_unsigned_int", "uintptr_t *|uint_least32_t *|uint_fast32_t *|uint32_t *|unsigned int *|uint_fast16_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_unsigned_long_long = {"_p_unsigned_long_long", "uint_least64_t *|uint_fast64_t *|uint64_t *|lldb::process_t *|unsigned long long *|lldb::addr_t *|lldb::offset_t *|lldb::queue_id_t *|lldb::user_id_t *|lldb::pid_t *|uintmax_t *|lldb::tid_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_unsigned_short = {"_p_unsigned_short", "unsigned short *|uint_least16_t *|uint16_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_void = {"_p_void", "void *", 0, 0, (void*)0, 0};

static swig_type_info *swig_type_initial[] = {
  &_swigt__p_FILE,
  &_swigt__p_bool,
  &_swigt__p_char,
  &_swigt__p_double,
  &_swigt__p_f_p_void__p_void,
  &_swigt__p_f_p_void_p_q_const__void_size_t__void,
  &_swigt__p_int,
  &_swigt__p_lldb__ConnectionStatus,
  &_swigt__p_lldb__SBAddress,
  &_swigt__p_lldb__SBAttachInfo,
  &_swigt__p_lldb__SBBlock,
  &_swigt__p_lldb__SBBreakpoint,
  &_swigt__p_lldb__SBBreakpointList,
  &_swigt__p_lldb__SBBreakpointLocation,
  &_swigt__p_lldb__SBBreakpointName,
  &_swigt__p_lldb__SBBroadcaster,
  &_swigt__p_lldb__SBCommandInterpreter,
  &_swigt__p_lldb__SBCommandInterpreterRunOptions,
  &_swigt__p_lldb__SBCommandReturnObject,
  &_swigt__p_lldb__SBCommunication,
  &_swigt__p_lldb__SBCompileUnit,
  &_swigt__p_lldb__SBData,
  &_swigt__p_lldb__SBDebugger,
  &_swigt__p_lldb__SBDeclaration,
  &_swigt__p_lldb__SBError,
  &_swigt__p_lldb__SBEvent,
  &_swigt__p_lldb__SBExecutionContext,
  &_swigt__p_lldb__SBExpressionOptions,
  &_swigt__p_lldb__SBFileSpec,
  &_swigt__p_lldb__SBFileSpecList,
  &_swigt__p_lldb__SBFrame,
  &_swigt__p_lldb__SBFunction,
  &_swigt__p_lldb__SBHostOS,
  &_swigt__p_lldb__SBInstruction,
  &_swigt__p_lldb__SBInstructionList,
  &_swigt__p_lldb__SBLanguageRuntime,
  &_swigt__p_lldb__SBLaunchInfo,
  &_swigt__p_lldb__SBLineEntry,
  &_swigt__p_lldb__SBListener,
  &_swigt__p_lldb__SBMemoryRegionInfo,
  &_swigt__p_lldb__SBMemoryRegionInfoList,
  &_swigt__p_lldb__SBModule,
  &_swigt__p_lldb__SBModuleSpec,
  &_swigt__p_lldb__SBModuleSpecList,
  &_swigt__p_lldb__SBPlatform,
  &_swigt__p_lldb__SBPlatformConnectOptions,
  &_swigt__p_lldb__SBPlatformShellCommand,
  &_swigt__p_lldb__SBProcess,
  &_swigt__p_lldb__SBProcessInfo,
  &_swigt__p_lldb__SBQueue,
  &_swigt__p_lldb__SBQueueItem,
  &_swigt__p_lldb__SBSection,
  &_swigt__p_lldb__SBSourceManager,
  &_swigt__p_lldb__SBStream,
  &_swigt__p_lldb__SBStringList,
  &_swigt__p_lldb__SBStructuredData,
  &_swigt__p_lldb__SBSymbol,
  &_swigt__p_lldb__SBSymbolContext,
  &_swigt__p_lldb__SBSymbolContextList,
  &_swigt__p_lldb__SBTarget,
  &_swigt__p_lldb__SBThread,
  &_swigt__p_lldb__SBThreadCollection,
  &_swigt__p_lldb__SBThreadPlan,
  &_swigt__p_lldb__SBTrace,
  &_swigt__p_lldb__SBTraceOptions,
  &_swigt__p_lldb__SBType,
  &_swigt__p_lldb__SBTypeCategory,
  &_swigt__p_lldb__SBTypeEnumMember,
  &_swigt__p_lldb__SBTypeEnumMemberList,
  &_swigt__p_lldb__SBTypeFilter,
  &_swigt__p_lldb__SBTypeFormat,
  &_swigt__p_lldb__SBTypeList,
  &_swigt__p_lldb__SBTypeMember,
  &_swigt__p_lldb__SBTypeMemberFunction,
  &_swigt__p_lldb__SBTypeNameSpecifier,
  &_swigt__p_lldb__SBTypeSummary,
  &_swigt__p_lldb__SBTypeSummaryOptions,
  &_swigt__p_lldb__SBTypeSynthetic,
  &_swigt__p_lldb__SBUnixSignals,
  &_swigt__p_lldb__SBValue,
  &_swigt__p_lldb__SBValueList,
  &_swigt__p_lldb__SBVariablesOptions,
  &_swigt__p_lldb__SBWatchpoint,
  &_swigt__p_lldb_private__SharingPtrT_lldb_private__ValueObject_t,
  &_swigt__p_long_double,
  &_swigt__p_long_long,
  &_swigt__p_p_void,
  &_swigt__p_pthread_rwlock_t,
  &_swigt__p_pthread_t,
  &_swigt__p_short,
  &_swigt__p_signed_char,
  &_swigt__p_std__shared_ptrT_lldb_private__ABI_t,
  &_swigt__p_std__shared_ptrT_lldb_private__Baton_t,
  &_swigt__p_std__shared_ptrT_lldb_private__Block_t,
  &_swigt__p_std__shared_ptrT_lldb_private__BreakpointLocation_t,
  &_swigt__p_std__shared_ptrT_lldb_private__BreakpointResolver_t,
  &_swigt__p_std__shared_ptrT_lldb_private__BreakpointSite_t,
  &_swigt__p_std__shared_ptrT_lldb_private__Breakpoint_t,
  &_swigt__p_std__shared_ptrT_lldb_private__BroadcasterManager_t,
  &_swigt__p_std__shared_ptrT_lldb_private__Broadcaster_t,
  &_swigt__p_std__shared_ptrT_lldb_private__ClangASTImporter_t,
  &_swigt__p_std__shared_ptrT_lldb_private__CommandObject_t,
  &_swigt__p_std__shared_ptrT_lldb_private__Communication_t,
  &_swigt__p_std__shared_ptrT_lldb_private__CompileUnit_t,
  &_swigt__p_std__shared_ptrT_lldb_private__Connection_t,
  &_swigt__p_std__shared_ptrT_lldb_private__DataBuffer_t,
  &_swigt__p_std__shared_ptrT_lldb_private__DataExtractor_t,
  &_swigt__p_std__shared_ptrT_lldb_private__Debugger_t,
  &_swigt__p_std__shared_ptrT_lldb_private__Disassembler_t,
  &_swigt__p_std__shared_ptrT_lldb_private__DynamicLoader_t,
  &_swigt__p_std__shared_ptrT_lldb_private__EventDataStructuredData_t,
  &_swigt__p_std__shared_ptrT_lldb_private__EventData_t,
  &_swigt__p_std__shared_ptrT_lldb_private__Event_t,
  &_swigt__p_std__shared_ptrT_lldb_private__ExecutionContextRef_t,
  &_swigt__p_std__shared_ptrT_lldb_private__ExpressionVariable_t,
  &_swigt__p_std__shared_ptrT_lldb_private__File_t,
  &_swigt__p_std__shared_ptrT_lldb_private__FuncUnwinders_t,
  &_swigt__p_std__shared_ptrT_lldb_private__FunctionCaller_t,
  &_swigt__p_std__shared_ptrT_lldb_private__Function_t,
  &_swigt__p_std__shared_ptrT_lldb_private__IOHandler_t,
  &_swigt__p_std__shared_ptrT_lldb_private__IOObject_t,
  &_swigt__p_std__shared_ptrT_lldb_private__IRExecutionUnit_t,
  &_swigt__p_std__shared_ptrT_lldb_private__InlineFunctionInfo_t,
  &_swigt__p_std__shared_ptrT_lldb_private__Instruction_t,
  &_swigt__p_std__shared_ptrT_lldb_private__InstrumentationRuntime_t,
  &_swigt__p_std__shared_ptrT_lldb_private__JITLoader_t,
  &_swigt__p_std__shared_ptrT_lldb_private__LanguageRuntime_t,
  &_swigt__p_std__shared_ptrT_lldb_private__LineTable_t,
  &_swigt__p_std__shared_ptrT_lldb_private__Listener_t,
  &_swigt__p_std__shared_ptrT_lldb_private__MemoryHistory_t,
  &_swigt__p_std__shared_ptrT_lldb_private__MemoryRegionInfo_t,
  &_swigt__p_std__shared_ptrT_lldb_private__Module_t,
  &_swigt__p_std__shared_ptrT_lldb_private__ObjectFileJITDelegate_t,
  &_swigt__p_std__shared_ptrT_lldb_private__ObjectFile_t,
  &_swigt__p_std__shared_ptrT_lldb_private__OptionValueArch_t,
  &_swigt__p_std__shared_ptrT_lldb_private__OptionValueArgs_t,
  &_swigt__p_std__shared_ptrT_lldb_private__OptionValueArray_t,
  &_swigt__p_std__shared_ptrT_lldb_private__OptionValueBoolean_t,
  &_swigt__p_std__shared_ptrT_lldb_private__OptionValueDictionary_t,
  &_swigt__p_std__shared_ptrT_lldb_private__OptionValueFileSpecList_t,
  &_swigt__p_std__shared_ptrT_lldb_private__OptionValueFileSpec_t,
  &_swigt__p_std__shared_ptrT_lldb_private__OptionValueFormat_t,
  &_swigt__p_std__shared_ptrT_lldb_private__OptionValuePathMappings_t,
  &_swigt__p_std__shared_ptrT_lldb_private__OptionValueProperties_t,
  &_swigt__p_std__shared_ptrT_lldb_private__OptionValueRegex_t,
  &_swigt__p_std__shared_ptrT_lldb_private__OptionValueSInt64_t,
  &_swigt__p_std__shared_ptrT_lldb_private__OptionValueString_t,
  &_swigt__p_std__shared_ptrT_lldb_private__OptionValueUInt64_t,
  &_swigt__p_std__shared_ptrT_lldb_private__OptionValueUUID_t,
  &_swigt__p_std__shared_ptrT_lldb_private__OptionValue_t,
  &_swigt__p_std__shared_ptrT_lldb_private__Platform_t,
  &_swigt__p_std__shared_ptrT_lldb_private__ProcessAttachInfo_t,
  &_swigt__p_std__shared_ptrT_lldb_private__ProcessLaunchInfo_t,
  &_swigt__p_std__shared_ptrT_lldb_private__Process_t,
  &_swigt__p_std__shared_ptrT_lldb_private__Property_t,
  &_swigt__p_std__shared_ptrT_lldb_private__QueueItem_t,
  &_swigt__p_std__shared_ptrT_lldb_private__Queue_t,
  &_swigt__p_std__shared_ptrT_lldb_private__REPL_t,
  &_swigt__p_std__shared_ptrT_lldb_private__RegisterCheckpoint_t,
  &_swigt__p_std__shared_ptrT_lldb_private__RegisterContext_t,
  &_swigt__p_std__shared_ptrT_lldb_private__RegularExpression_t,
  &_swigt__p_std__shared_ptrT_lldb_private__ScriptInterpreter_t,
  &_swigt__p_std__shared_ptrT_lldb_private__ScriptSummaryFormat_t,
  &_swigt__p_std__shared_ptrT_lldb_private__ScriptedSyntheticChildren_t,
  &_swigt__p_std__shared_ptrT_lldb_private__SearchFilter_t,
  &_swigt__p_std__shared_ptrT_lldb_private__SectionLoadList_t,
  &_swigt__p_std__shared_ptrT_lldb_private__Section_t,
  &_swigt__p_std__shared_ptrT_lldb_private__Settings_t,
  &_swigt__p_std__shared_ptrT_lldb_private__StackFrameList_t,
  &_swigt__p_std__shared_ptrT_lldb_private__StackFrame_t,
  &_swigt__p_std__shared_ptrT_lldb_private__StopInfo_t,
  &_swigt__p_std__shared_ptrT_lldb_private__StoppointLocation_t,
  &_swigt__p_std__shared_ptrT_lldb_private__StreamFile_t,
  &_swigt__p_std__shared_ptrT_lldb_private__Stream_t,
  &_swigt__p_std__shared_ptrT_lldb_private__StringSummaryFormat_t,
  &_swigt__p_std__shared_ptrT_lldb_private__StructuredDataPlugin_t,
  &_swigt__p_std__shared_ptrT_lldb_private__SwiftASTContext_t,
  &_swigt__p_std__shared_ptrT_lldb_private__SymbolContextSpecifier_t,
  &_swigt__p_std__shared_ptrT_lldb_private__SymbolFileType_t,
  &_swigt__p_std__shared_ptrT_lldb_private__SymbolFile_t,
  &_swigt__p_std__shared_ptrT_lldb_private__SyntheticChildrenFrontEnd_t,
  &_swigt__p_std__shared_ptrT_lldb_private__SyntheticChildren_t,
  &_swigt__p_std__shared_ptrT_lldb_private__SystemRuntime_t,
  &_swigt__p_std__shared_ptrT_lldb_private__TargetProperties_t,
  &_swigt__p_std__shared_ptrT_lldb_private__Target_t,
  &_swigt__p_std__shared_ptrT_lldb_private__ThreadCollection_t,
  &_swigt__p_std__shared_ptrT_lldb_private__ThreadPlanTracer_t,
  &_swigt__p_std__shared_ptrT_lldb_private__ThreadPlan_t,
  &_swigt__p_std__shared_ptrT_lldb_private__Thread_t,
  &_swigt__p_std__shared_ptrT_lldb_private__TraceOptions_t,
  &_swigt__p_std__shared_ptrT_lldb_private__TypeCategoryImpl_t,
  &_swigt__p_std__shared_ptrT_lldb_private__TypeEnumMemberImpl_t,
  &_swigt__p_std__shared_ptrT_lldb_private__TypeFilterImpl_t,
  &_swigt__p_std__shared_ptrT_lldb_private__TypeFormatImpl_t,
  &_swigt__p_std__shared_ptrT_lldb_private__TypeImpl_t,
  &_swigt__p_std__shared_ptrT_lldb_private__TypeMemberFunctionImpl_t,
  &_swigt__p_std__shared_ptrT_lldb_private__TypeNameSpecifierImpl_t,
  &_swigt__p_std__shared_ptrT_lldb_private__TypeSummaryImpl_t,
  &_swigt__p_std__shared_ptrT_lldb_private__TypeSummaryOptions_t,
  &_swigt__p_std__shared_ptrT_lldb_private__TypeSystem_t,
  &_swigt__p_std__shared_ptrT_lldb_private__TypeValidatorImpl_t,
  &_swigt__p_std__shared_ptrT_lldb_private__Type_t,
  &_swigt__p_std__shared_ptrT_lldb_private__UnixSignals_t,
  &_swigt__p_std__shared_ptrT_lldb_private__UnwindAssembly_t,
  &_swigt__p_std__shared_ptrT_lldb_private__UnwindPlan_t,
  &_swigt__p_std__shared_ptrT_lldb_private__UserExpression_t,
  &_swigt__p_std__shared_ptrT_lldb_private__UtilityFunction_t,
  &_swigt__p_std__shared_ptrT_lldb_private__ValueList_t,
  &_swigt__p_std__shared_ptrT_lldb_private__ValueObjectList_t,
  &_swigt__p_std__shared_ptrT_lldb_private__Value_t,
  &_swigt__p_std__shared_ptrT_lldb_private__VariableList_t,
  &_swigt__p_std__shared_ptrT_lldb_private__Variable_t,
  &_swigt__p_std__shared_ptrT_lldb_private__Watchpoint_t,
  &_swigt__p_std__unique_ptrT_lldb_private__ClangASTContext_t,
  &_swigt__p_std__unique_ptrT_lldb_private__ClangModulesDeclVendor_t,
  &_swigt__p_std__unique_ptrT_lldb_private__ClangPersistentVariables_t,
  &_swigt__p_std__unique_ptrT_lldb_private__DynamicCheckerFunctions_t,
  &_swigt__p_std__unique_ptrT_lldb_private__DynamicLoader_t,
  &_swigt__p_std__unique_ptrT_lldb_private__GoASTContext_t,
  &_swigt__p_std__unique_ptrT_lldb_private__JITLoaderList_t,
  &_swigt__p_std__unique_ptrT_lldb_private__MemoryRegionInfo_t,
  &_swigt__p_std__unique_ptrT_lldb_private__OperatingSystem_t,
  &_swigt__p_std__unique_ptrT_lldb_private__ScriptInterpreter_t,
  &_swigt__p_std__unique_ptrT_lldb_private__SectionList_t,
  &_swigt__p_std__unique_ptrT_lldb_private__SourceManager_t,
  &_swigt__p_std__unique_ptrT_lldb_private__StackFrame_t,
  &_swigt__p_std__unique_ptrT_lldb_private__StructuredDataImpl_t,
  &_swigt__p_std__unique_ptrT_lldb_private__SymbolVendor_t,
  &_swigt__p_std__unique_ptrT_lldb_private__SystemRuntime_t,
  &_swigt__p_std__weak_ptrT_lldb_private__BreakpointLocation_t,
  &_swigt__p_std__weak_ptrT_lldb_private__BreakpointSite_t,
  &_swigt__p_std__weak_ptrT_lldb_private__Breakpoint_t,
  &_swigt__p_std__weak_ptrT_lldb_private__BroadcasterManager_t,
  &_swigt__p_std__weak_ptrT_lldb_private__Debugger_t,
  &_swigt__p_std__weak_ptrT_lldb_private__Listener_t,
  &_swigt__p_std__weak_ptrT_lldb_private__Module_t,
  &_swigt__p_std__weak_ptrT_lldb_private__ObjectFileJITDelegate_t,
  &_swigt__p_std__weak_ptrT_lldb_private__ObjectFile_t,
  &_swigt__p_std__weak_ptrT_lldb_private__OptionValue_t,
  &_swigt__p_std__weak_ptrT_lldb_private__Process_t,
  &_swigt__p_std__weak_ptrT_lldb_private__Queue_t,
  &_swigt__p_std__weak_ptrT_lldb_private__Section_t,
  &_swigt__p_std__weak_ptrT_lldb_private__StackFrame_t,
  &_swigt__p_std__weak_ptrT_lldb_private__Stream_t,
  &_swigt__p_std__weak_ptrT_lldb_private__StructuredDataPlugin_t,
  &_swigt__p_std__weak_ptrT_lldb_private__SymbolFileType_t,
  &_swigt__p_std__weak_ptrT_lldb_private__Target_t,
  &_swigt__p_std__weak_ptrT_lldb_private__Thread_t,
  &_swigt__p_std__weak_ptrT_lldb_private__Type_t,
  &_swigt__p_std__weak_ptrT_lldb_private__UnixSignals_t,
  &_swigt__p_unsigned_char,
  &_swigt__p_unsigned_int,
  &_swigt__p_unsigned_long_long,
  &_swigt__p_unsigned_short,
  &_swigt__p_void,
};

static swig_cast_info _swigc__p_FILE[] = {  {&_swigt__p_FILE, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_bool[] = {  {&_swigt__p_bool, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_char[] = {  {&_swigt__p_char, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_double[] = {  {&_swigt__p_double, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void__p_void[] = {  {&_swigt__p_f_p_void__p_void, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_f_p_void_p_q_const__void_size_t__void[] = {  {&_swigt__p_f_p_void_p_q_const__void_size_t__void, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_int[] = {  {&_swigt__p_int, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__ConnectionStatus[] = {  {&_swigt__p_lldb__ConnectionStatus, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBAddress[] = {  {&_swigt__p_lldb__SBAddress, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBAttachInfo[] = {  {&_swigt__p_lldb__SBAttachInfo, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBBlock[] = {  {&_swigt__p_lldb__SBBlock, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBBreakpoint[] = {  {&_swigt__p_lldb__SBBreakpoint, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBBreakpointList[] = {  {&_swigt__p_lldb__SBBreakpointList, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBBreakpointLocation[] = {  {&_swigt__p_lldb__SBBreakpointLocation, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBBreakpointName[] = {  {&_swigt__p_lldb__SBBreakpointName, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBBroadcaster[] = {  {&_swigt__p_lldb__SBBroadcaster, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBCommandInterpreter[] = {  {&_swigt__p_lldb__SBCommandInterpreter, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBCommandInterpreterRunOptions[] = {  {&_swigt__p_lldb__SBCommandInterpreterRunOptions, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBCommandReturnObject[] = {  {&_swigt__p_lldb__SBCommandReturnObject, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBCommunication[] = {  {&_swigt__p_lldb__SBCommunication, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBCompileUnit[] = {  {&_swigt__p_lldb__SBCompileUnit, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBData[] = {  {&_swigt__p_lldb__SBData, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBDebugger[] = {  {&_swigt__p_lldb__SBDebugger, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBDeclaration[] = {  {&_swigt__p_lldb__SBDeclaration, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBError[] = {  {&_swigt__p_lldb__SBError, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBEvent[] = {  {&_swigt__p_lldb__SBEvent, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBExecutionContext[] = {  {&_swigt__p_lldb__SBExecutionContext, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBExpressionOptions[] = {  {&_swigt__p_lldb__SBExpressionOptions, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBFileSpec[] = {  {&_swigt__p_lldb__SBFileSpec, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBFileSpecList[] = {  {&_swigt__p_lldb__SBFileSpecList, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBFrame[] = {  {&_swigt__p_lldb__SBFrame, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBFunction[] = {  {&_swigt__p_lldb__SBFunction, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBHostOS[] = {  {&_swigt__p_lldb__SBHostOS, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBInstruction[] = {  {&_swigt__p_lldb__SBInstruction, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBInstructionList[] = {  {&_swigt__p_lldb__SBInstructionList, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBLanguageRuntime[] = {  {&_swigt__p_lldb__SBLanguageRuntime, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBLaunchInfo[] = {  {&_swigt__p_lldb__SBLaunchInfo, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBLineEntry[] = {  {&_swigt__p_lldb__SBLineEntry, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBListener[] = {  {&_swigt__p_lldb__SBListener, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBMemoryRegionInfo[] = {  {&_swigt__p_lldb__SBMemoryRegionInfo, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBMemoryRegionInfoList[] = {  {&_swigt__p_lldb__SBMemoryRegionInfoList, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBModule[] = {  {&_swigt__p_lldb__SBModule, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBModuleSpec[] = {  {&_swigt__p_lldb__SBModuleSpec, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBModuleSpecList[] = {  {&_swigt__p_lldb__SBModuleSpecList, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBPlatform[] = {  {&_swigt__p_lldb__SBPlatform, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBPlatformConnectOptions[] = {  {&_swigt__p_lldb__SBPlatformConnectOptions, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBPlatformShellCommand[] = {  {&_swigt__p_lldb__SBPlatformShellCommand, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBProcess[] = {  {&_swigt__p_lldb__SBProcess, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBProcessInfo[] = {  {&_swigt__p_lldb__SBProcessInfo, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBQueue[] = {  {&_swigt__p_lldb__SBQueue, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBQueueItem[] = {  {&_swigt__p_lldb__SBQueueItem, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBSection[] = {  {&_swigt__p_lldb__SBSection, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBSourceManager[] = {  {&_swigt__p_lldb__SBSourceManager, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBStream[] = {  {&_swigt__p_lldb__SBStream, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBStringList[] = {  {&_swigt__p_lldb__SBStringList, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBStructuredData[] = {  {&_swigt__p_lldb__SBStructuredData, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBSymbol[] = {  {&_swigt__p_lldb__SBSymbol, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBSymbolContext[] = {  {&_swigt__p_lldb__SBSymbolContext, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBSymbolContextList[] = {  {&_swigt__p_lldb__SBSymbolContextList, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBTarget[] = {  {&_swigt__p_lldb__SBTarget, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBThread[] = {  {&_swigt__p_lldb__SBThread, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBThreadCollection[] = {  {&_swigt__p_lldb__SBThreadCollection, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBThreadPlan[] = {  {&_swigt__p_lldb__SBThreadPlan, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBTrace[] = {  {&_swigt__p_lldb__SBTrace, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBTraceOptions[] = {  {&_swigt__p_lldb__SBTraceOptions, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBType[] = {  {&_swigt__p_lldb__SBType, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBTypeCategory[] = {  {&_swigt__p_lldb__SBTypeCategory, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBTypeEnumMember[] = {  {&_swigt__p_lldb__SBTypeEnumMember, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBTypeEnumMemberList[] = {  {&_swigt__p_lldb__SBTypeEnumMemberList, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBTypeFilter[] = {  {&_swigt__p_lldb__SBTypeFilter, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBTypeFormat[] = {  {&_swigt__p_lldb__SBTypeFormat, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBTypeList[] = {  {&_swigt__p_lldb__SBTypeList, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBTypeMember[] = {  {&_swigt__p_lldb__SBTypeMember, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBTypeMemberFunction[] = {  {&_swigt__p_lldb__SBTypeMemberFunction, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBTypeNameSpecifier[] = {  {&_swigt__p_lldb__SBTypeNameSpecifier, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBTypeSummary[] = {  {&_swigt__p_lldb__SBTypeSummary, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBTypeSummaryOptions[] = {  {&_swigt__p_lldb__SBTypeSummaryOptions, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBTypeSynthetic[] = {  {&_swigt__p_lldb__SBTypeSynthetic, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBUnixSignals[] = {  {&_swigt__p_lldb__SBUnixSignals, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBValue[] = {  {&_swigt__p_lldb__SBValue, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBValueList[] = {  {&_swigt__p_lldb__SBValueList, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBVariablesOptions[] = {  {&_swigt__p_lldb__SBVariablesOptions, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb__SBWatchpoint[] = {  {&_swigt__p_lldb__SBWatchpoint, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_lldb_private__SharingPtrT_lldb_private__ValueObject_t[] = {  {&_swigt__p_lldb_private__SharingPtrT_lldb_private__ValueObject_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_long_double[] = {  {&_swigt__p_long_double, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_long_long[] = {  {&_swigt__p_long_long, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_p_void[] = {  {&_swigt__p_p_void, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_pthread_rwlock_t[] = {  {&_swigt__p_pthread_rwlock_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_pthread_t[] = {  {&_swigt__p_pthread_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_short[] = {  {&_swigt__p_short, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_signed_char[] = {  {&_swigt__p_signed_char, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__ABI_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__ABI_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__Baton_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__Baton_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__Block_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__Block_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__BreakpointLocation_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__BreakpointLocation_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__BreakpointResolver_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__BreakpointResolver_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__BreakpointSite_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__BreakpointSite_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__Breakpoint_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__Breakpoint_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__BroadcasterManager_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__BroadcasterManager_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__Broadcaster_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__Broadcaster_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__ClangASTImporter_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__ClangASTImporter_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__CommandObject_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__CommandObject_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__Communication_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__Communication_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__CompileUnit_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__CompileUnit_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__Connection_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__Connection_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__DataBuffer_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__DataBuffer_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__DataExtractor_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__DataExtractor_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__Debugger_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__Debugger_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__Disassembler_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__Disassembler_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__DynamicLoader_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__DynamicLoader_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__EventDataStructuredData_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__EventDataStructuredData_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__EventData_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__EventData_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__Event_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__Event_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__ExecutionContextRef_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__ExecutionContextRef_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__ExpressionVariable_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__ExpressionVariable_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__File_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__File_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__FuncUnwinders_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__FuncUnwinders_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__FunctionCaller_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__FunctionCaller_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__Function_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__Function_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__IOHandler_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__IOHandler_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__IOObject_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__IOObject_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__IRExecutionUnit_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__IRExecutionUnit_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__InlineFunctionInfo_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__InlineFunctionInfo_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__Instruction_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__Instruction_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__InstrumentationRuntime_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__InstrumentationRuntime_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__JITLoader_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__JITLoader_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__LanguageRuntime_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__LanguageRuntime_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__LineTable_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__LineTable_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__Listener_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__Listener_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__MemoryHistory_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__MemoryHistory_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__MemoryRegionInfo_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__MemoryRegionInfo_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__Module_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__Module_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__ObjectFileJITDelegate_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__ObjectFileJITDelegate_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__ObjectFile_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__ObjectFile_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__OptionValueArch_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__OptionValueArch_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__OptionValueArgs_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__OptionValueArgs_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__OptionValueArray_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__OptionValueArray_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__OptionValueBoolean_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__OptionValueBoolean_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__OptionValueDictionary_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__OptionValueDictionary_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__OptionValueFileSpecList_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__OptionValueFileSpecList_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__OptionValueFileSpec_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__OptionValueFileSpec_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__OptionValueFormat_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__OptionValueFormat_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__OptionValuePathMappings_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__OptionValuePathMappings_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__OptionValueProperties_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__OptionValueProperties_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__OptionValueRegex_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__OptionValueRegex_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__OptionValueSInt64_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__OptionValueSInt64_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__OptionValueString_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__OptionValueString_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__OptionValueUInt64_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__OptionValueUInt64_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__OptionValueUUID_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__OptionValueUUID_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__OptionValue_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__OptionValue_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__Platform_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__Platform_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__ProcessAttachInfo_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__ProcessAttachInfo_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__ProcessLaunchInfo_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__ProcessLaunchInfo_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__Process_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__Process_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__Property_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__Property_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__QueueItem_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__QueueItem_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__Queue_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__Queue_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__REPL_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__REPL_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__RegisterCheckpoint_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__RegisterCheckpoint_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__RegisterContext_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__RegisterContext_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__RegularExpression_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__RegularExpression_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__ScriptInterpreter_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__ScriptInterpreter_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__ScriptSummaryFormat_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__ScriptSummaryFormat_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__ScriptedSyntheticChildren_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__ScriptedSyntheticChildren_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__SearchFilter_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__SearchFilter_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__SectionLoadList_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__SectionLoadList_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__Section_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__Section_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__Settings_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__Settings_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__StackFrameList_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__StackFrameList_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__StackFrame_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__StackFrame_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__StopInfo_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__StopInfo_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__StoppointLocation_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__StoppointLocation_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__StreamFile_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__StreamFile_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__Stream_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__Stream_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__StringSummaryFormat_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__StringSummaryFormat_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__StructuredDataPlugin_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__StructuredDataPlugin_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__SwiftASTContext_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__SwiftASTContext_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__SymbolContextSpecifier_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__SymbolContextSpecifier_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__SymbolFileType_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__SymbolFileType_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__SymbolFile_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__SymbolFile_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__SyntheticChildrenFrontEnd_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__SyntheticChildrenFrontEnd_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__SyntheticChildren_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__SyntheticChildren_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__SystemRuntime_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__SystemRuntime_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__TargetProperties_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__TargetProperties_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__Target_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__Target_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__ThreadCollection_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__ThreadCollection_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__ThreadPlanTracer_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__ThreadPlanTracer_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__ThreadPlan_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__ThreadPlan_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__Thread_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__Thread_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__TraceOptions_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__TraceOptions_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__TypeCategoryImpl_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__TypeCategoryImpl_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__TypeEnumMemberImpl_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__TypeEnumMemberImpl_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__TypeFilterImpl_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__TypeFilterImpl_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__TypeFormatImpl_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__TypeFormatImpl_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__TypeImpl_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__TypeImpl_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__TypeMemberFunctionImpl_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__TypeMemberFunctionImpl_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__TypeNameSpecifierImpl_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__TypeNameSpecifierImpl_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__TypeSummaryImpl_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__TypeSummaryImpl_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__TypeSummaryOptions_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__TypeSummaryOptions_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__TypeSystem_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__TypeSystem_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__TypeValidatorImpl_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__TypeValidatorImpl_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__Type_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__Type_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__UnixSignals_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__UnixSignals_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__UnwindAssembly_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__UnwindAssembly_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__UnwindPlan_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__UnwindPlan_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__UserExpression_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__UserExpression_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__UtilityFunction_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__UtilityFunction_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__ValueList_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__ValueList_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__ValueObjectList_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__ValueObjectList_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__Value_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__Value_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__VariableList_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__VariableList_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__Variable_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__Variable_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__shared_ptrT_lldb_private__Watchpoint_t[] = {  {&_swigt__p_std__shared_ptrT_lldb_private__Watchpoint_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__unique_ptrT_lldb_private__ClangASTContext_t[] = {  {&_swigt__p_std__unique_ptrT_lldb_private__ClangASTContext_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__unique_ptrT_lldb_private__ClangModulesDeclVendor_t[] = {  {&_swigt__p_std__unique_ptrT_lldb_private__ClangModulesDeclVendor_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__unique_ptrT_lldb_private__ClangPersistentVariables_t[] = {  {&_swigt__p_std__unique_ptrT_lldb_private__ClangPersistentVariables_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__unique_ptrT_lldb_private__DynamicCheckerFunctions_t[] = {  {&_swigt__p_std__unique_ptrT_lldb_private__DynamicCheckerFunctions_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__unique_ptrT_lldb_private__DynamicLoader_t[] = {  {&_swigt__p_std__unique_ptrT_lldb_private__DynamicLoader_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__unique_ptrT_lldb_private__GoASTContext_t[] = {  {&_swigt__p_std__unique_ptrT_lldb_private__GoASTContext_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__unique_ptrT_lldb_private__JITLoaderList_t[] = {  {&_swigt__p_std__unique_ptrT_lldb_private__JITLoaderList_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__unique_ptrT_lldb_private__MemoryRegionInfo_t[] = {  {&_swigt__p_std__unique_ptrT_lldb_private__MemoryRegionInfo_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__unique_ptrT_lldb_private__OperatingSystem_t[] = {  {&_swigt__p_std__unique_ptrT_lldb_private__OperatingSystem_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__unique_ptrT_lldb_private__ScriptInterpreter_t[] = {  {&_swigt__p_std__unique_ptrT_lldb_private__ScriptInterpreter_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__unique_ptrT_lldb_private__SectionList_t[] = {  {&_swigt__p_std__unique_ptrT_lldb_private__SectionList_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__unique_ptrT_lldb_private__SourceManager_t[] = {  {&_swigt__p_std__unique_ptrT_lldb_private__SourceManager_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__unique_ptrT_lldb_private__StackFrame_t[] = {  {&_swigt__p_std__unique_ptrT_lldb_private__StackFrame_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__unique_ptrT_lldb_private__StructuredDataImpl_t[] = {  {&_swigt__p_std__unique_ptrT_lldb_private__StructuredDataImpl_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__unique_ptrT_lldb_private__SymbolVendor_t[] = {  {&_swigt__p_std__unique_ptrT_lldb_private__SymbolVendor_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__unique_ptrT_lldb_private__SystemRuntime_t[] = {  {&_swigt__p_std__unique_ptrT_lldb_private__SystemRuntime_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__weak_ptrT_lldb_private__BreakpointLocation_t[] = {  {&_swigt__p_std__weak_ptrT_lldb_private__BreakpointLocation_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__weak_ptrT_lldb_private__BreakpointSite_t[] = {  {&_swigt__p_std__weak_ptrT_lldb_private__BreakpointSite_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__weak_ptrT_lldb_private__Breakpoint_t[] = {  {&_swigt__p_std__weak_ptrT_lldb_private__Breakpoint_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__weak_ptrT_lldb_private__BroadcasterManager_t[] = {  {&_swigt__p_std__weak_ptrT_lldb_private__BroadcasterManager_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__weak_ptrT_lldb_private__Debugger_t[] = {  {&_swigt__p_std__weak_ptrT_lldb_private__Debugger_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__weak_ptrT_lldb_private__Listener_t[] = {  {&_swigt__p_std__weak_ptrT_lldb_private__Listener_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__weak_ptrT_lldb_private__Module_t[] = {  {&_swigt__p_std__weak_ptrT_lldb_private__Module_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__weak_ptrT_lldb_private__ObjectFileJITDelegate_t[] = {  {&_swigt__p_std__weak_ptrT_lldb_private__ObjectFileJITDelegate_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__weak_ptrT_lldb_private__ObjectFile_t[] = {  {&_swigt__p_std__weak_ptrT_lldb_private__ObjectFile_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__weak_ptrT_lldb_private__OptionValue_t[] = {  {&_swigt__p_std__weak_ptrT_lldb_private__OptionValue_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__weak_ptrT_lldb_private__Process_t[] = {  {&_swigt__p_std__weak_ptrT_lldb_private__Process_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__weak_ptrT_lldb_private__Queue_t[] = {  {&_swigt__p_std__weak_ptrT_lldb_private__Queue_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__weak_ptrT_lldb_private__Section_t[] = {  {&_swigt__p_std__weak_ptrT_lldb_private__Section_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__weak_ptrT_lldb_private__StackFrame_t[] = {  {&_swigt__p_std__weak_ptrT_lldb_private__StackFrame_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__weak_ptrT_lldb_private__Stream_t[] = {  {&_swigt__p_std__weak_ptrT_lldb_private__Stream_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__weak_ptrT_lldb_private__StructuredDataPlugin_t[] = {  {&_swigt__p_std__weak_ptrT_lldb_private__StructuredDataPlugin_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__weak_ptrT_lldb_private__SymbolFileType_t[] = {  {&_swigt__p_std__weak_ptrT_lldb_private__SymbolFileType_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__weak_ptrT_lldb_private__Target_t[] = {  {&_swigt__p_std__weak_ptrT_lldb_private__Target_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__weak_ptrT_lldb_private__Thread_t[] = {  {&_swigt__p_std__weak_ptrT_lldb_private__Thread_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__weak_ptrT_lldb_private__Type_t[] = {  {&_swigt__p_std__weak_ptrT_lldb_private__Type_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_std__weak_ptrT_lldb_private__UnixSignals_t[] = {  {&_swigt__p_std__weak_ptrT_lldb_private__UnixSignals_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_unsigned_char[] = {  {&_swigt__p_unsigned_char, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_unsigned_int[] = {  {&_swigt__p_unsigned_int, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_unsigned_long_long[] = {  {&_swigt__p_unsigned_long_long, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_unsigned_short[] = {  {&_swigt__p_unsigned_short, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_void[] = {  {&_swigt__p_void, 0, 0, 0},{0, 0, 0, 0}};

static swig_cast_info *swig_cast_initial[] = {
  _swigc__p_FILE,
  _swigc__p_bool,
  _swigc__p_char,
  _swigc__p_double,
  _swigc__p_f_p_void__p_void,
  _swigc__p_f_p_void_p_q_const__void_size_t__void,
  _swigc__p_int,
  _swigc__p_lldb__ConnectionStatus,
  _swigc__p_lldb__SBAddress,
  _swigc__p_lldb__SBAttachInfo,
  _swigc__p_lldb__SBBlock,
  _swigc__p_lldb__SBBreakpoint,
  _swigc__p_lldb__SBBreakpointList,
  _swigc__p_lldb__SBBreakpointLocation,
  _swigc__p_lldb__SBBreakpointName,
  _swigc__p_lldb__SBBroadcaster,
  _swigc__p_lldb__SBCommandInterpreter,
  _swigc__p_lldb__SBCommandInterpreterRunOptions,
  _swigc__p_lldb__SBCommandReturnObject,
  _swigc__p_lldb__SBCommunication,
  _swigc__p_lldb__SBCompileUnit,
  _swigc__p_lldb__SBData,
  _swigc__p_lldb__SBDebugger,
  _swigc__p_lldb__SBDeclaration,
  _swigc__p_lldb__SBError,
  _swigc__p_lldb__SBEvent,
  _swigc__p_lldb__SBExecutionContext,
  _swigc__p_lldb__SBExpressionOptions,
  _swigc__p_lldb__SBFileSpec,
  _swigc__p_lldb__SBFileSpecList,
  _swigc__p_lldb__SBFrame,
  _swigc__p_lldb__SBFunction,
  _swigc__p_lldb__SBHostOS,
  _swigc__p_lldb__SBInstruction,
  _swigc__p_lldb__SBInstructionList,
  _swigc__p_lldb__SBLanguageRuntime,
  _swigc__p_lldb__SBLaunchInfo,
  _swigc__p_lldb__SBLineEntry,
  _swigc__p_lldb__SBListener,
  _swigc__p_lldb__SBMemoryRegionInfo,
  _swigc__p_lldb__SBMemoryRegionInfoList,
  _swigc__p_lldb__SBModule,
  _swigc__p_lldb__SBModuleSpec,
  _swigc__p_lldb__SBModuleSpecList,
  _swigc__p_lldb__SBPlatform,
  _swigc__p_lldb__SBPlatformConnectOptions,
  _swigc__p_lldb__SBPlatformShellCommand,
  _swigc__p_lldb__SBProcess,
  _swigc__p_lldb__SBProcessInfo,
  _swigc__p_lldb__SBQueue,
  _swigc__p_lldb__SBQueueItem,
  _swigc__p_lldb__SBSection,
  _swigc__p_lldb__SBSourceManager,
  _swigc__p_lldb__SBStream,
  _swigc__p_lldb__SBStringList,
  _swigc__p_lldb__SBStructuredData,
  _swigc__p_lldb__SBSymbol,
  _swigc__p_lldb__SBSymbolContext,
  _swigc__p_lldb__SBSymbolContextList,
  _swigc__p_lldb__SBTarget,
  _swigc__p_lldb__SBThread,
  _swigc__p_lldb__SBThreadCollection,
  _swigc__p_lldb__SBThreadPlan,
  _swigc__p_lldb__SBTrace,
  _swigc__p_lldb__SBTraceOptions,
  _swigc__p_lldb__SBType,
  _swigc__p_lldb__SBTypeCategory,
  _swigc__p_lldb__SBTypeEnumMember,
  _swigc__p_lldb__SBTypeEnumMemberList,
  _swigc__p_lldb__SBTypeFilter,
  _swigc__p_lldb__SBTypeFormat,
  _swigc__p_lldb__SBTypeList,
  _swigc__p_lldb__SBTypeMember,
  _swigc__p_lldb__SBTypeMemberFunction,
  _swigc__p_lldb__SBTypeNameSpecifier,
  _swigc__p_lldb__SBTypeSummary,
  _swigc__p_lldb__SBTypeSummaryOptions,
  _swigc__p_lldb__SBTypeSynthetic,
  _swigc__p_lldb__SBUnixSignals,
  _swigc__p_lldb__SBValue,
  _swigc__p_lldb__SBValueList,
  _swigc__p_lldb__SBVariablesOptions,
  _swigc__p_lldb__SBWatchpoint,
  _swigc__p_lldb_private__SharingPtrT_lldb_private__ValueObject_t,
  _swigc__p_long_double,
  _swigc__p_long_long,
  _swigc__p_p_void,
  _swigc__p_pthread_rwlock_t,
  _swigc__p_pthread_t,
  _swigc__p_short,
  _swigc__p_signed_char,
  _swigc__p_std__shared_ptrT_lldb_private__ABI_t,
  _swigc__p_std__shared_ptrT_lldb_private__Baton_t,
  _swigc__p_std__shared_ptrT_lldb_private__Block_t,
  _swigc__p_std__shared_ptrT_lldb_private__BreakpointLocation_t,
  _swigc__p_std__shared_ptrT_lldb_private__BreakpointResolver_t,
  _swigc__p_std__shared_ptrT_lldb_private__BreakpointSite_t,
  _swigc__p_std__shared_ptrT_lldb_private__Breakpoint_t,
  _swigc__p_std__shared_ptrT_lldb_private__BroadcasterManager_t,
  _swigc__p_std__shared_ptrT_lldb_private__Broadcaster_t,
  _swigc__p_std__shared_ptrT_lldb_private__ClangASTImporter_t,
  _swigc__p_std__shared_ptrT_lldb_private__CommandObject_t,
  _swigc__p_std__shared_ptrT_lldb_private__Communication_t,
  _swigc__p_std__shared_ptrT_lldb_private__CompileUnit_t,
  _swigc__p_std__shared_ptrT_lldb_private__Connection_t,
  _swigc__p_std__shared_ptrT_lldb_private__DataBuffer_t,
  _swigc__p_std__shared_ptrT_lldb_private__DataExtractor_t,
  _swigc__p_std__shared_ptrT_lldb_private__Debugger_t,
  _swigc__p_std__shared_ptrT_lldb_private__Disassembler_t,
  _swigc__p_std__shared_ptrT_lldb_private__DynamicLoader_t,
  _swigc__p_std__shared_ptrT_lldb_private__EventDataStructuredData_t,
  _swigc__p_std__shared_ptrT_lldb_private__EventData_t,
  _swigc__p_std__shared_ptrT_lldb_private__Event_t,
  _swigc__p_std__shared_ptrT_lldb_private__ExecutionContextRef_t,
  _swigc__p_std__shared_ptrT_lldb_private__ExpressionVariable_t,
  _swigc__p_std__shared_ptrT_lldb_private__File_t,
  _swigc__p_std__shared_ptrT_lldb_private__FuncUnwinders_t,
  _swigc__p_std__shared_ptrT_lldb_private__FunctionCaller_t,
  _swigc__p_std__shared_ptrT_lldb_private__Function_t,
  _swigc__p_std__shared_ptrT_lldb_private__IOHandler_t,
  _swigc__p_std__shared_ptrT_lldb_private__IOObject_t,
  _swigc__p_std__shared_ptrT_lldb_private__IRExecutionUnit_t,
  _swigc__p_std__shared_ptrT_lldb_private__InlineFunctionInfo_t,
  _swigc__p_std__shared_ptrT_lldb_private__Instruction_t,
  _swigc__p_std__shared_ptrT_lldb_private__InstrumentationRuntime_t,
  _swigc__p_std__shared_ptrT_lldb_private__JITLoader_t,
  _swigc__p_std__shared_ptrT_lldb_private__LanguageRuntime_t,
  _swigc__p_std__shared_ptrT_lldb_private__LineTable_t,
  _swigc__p_std__shared_ptrT_lldb_private__Listener_t,
  _swigc__p_std__shared_ptrT_lldb_private__MemoryHistory_t,
  _swigc__p_std__shared_ptrT_lldb_private__MemoryRegionInfo_t,
  _swigc__p_std__shared_ptrT_lldb_private__Module_t,
  _swigc__p_std__shared_ptrT_lldb_private__ObjectFileJITDelegate_t,
  _swigc__p_std__shared_ptrT_lldb_private__ObjectFile_t,
  _swigc__p_std__shared_ptrT_lldb_private__OptionValueArch_t,
  _swigc__p_std__shared_ptrT_lldb_private__OptionValueArgs_t,
  _swigc__p_std__shared_ptrT_lldb_private__OptionValueArray_t,
  _swigc__p_std__shared_ptrT_lldb_private__OptionValueBoolean_t,
  _swigc__p_std__shared_ptrT_lldb_private__OptionValueDictionary_t,
  _swigc__p_std__shared_ptrT_lldb_private__OptionValueFileSpecList_t,
  _swigc__p_std__shared_ptrT_lldb_private__OptionValueFileSpec_t,
  _swigc__p_std__shared_ptrT_lldb_private__OptionValueFormat_t,
  _swigc__p_std__shared_ptrT_lldb_private__OptionValuePathMappings_t,
  _swigc__p_std__shared_ptrT_lldb_private__OptionValueProperties_t,
  _swigc__p_std__shared_ptrT_lldb_private__OptionValueRegex_t,
  _swigc__p_std__shared_ptrT_lldb_private__OptionValueSInt64_t,
  _swigc__p_std__shared_ptrT_lldb_private__OptionValueString_t,
  _swigc__p_std__shared_ptrT_lldb_private__OptionValueUInt64_t,
  _swigc__p_std__shared_ptrT_lldb_private__OptionValueUUID_t,
  _swigc__p_std__shared_ptrT_lldb_private__OptionValue_t,
  _swigc__p_std__shared_ptrT_lldb_private__Platform_t,
  _swigc__p_std__shared_ptrT_lldb_private__ProcessAttachInfo_t,
  _swigc__p_std__shared_ptrT_lldb_private__ProcessLaunchInfo_t,
  _swigc__p_std__shared_ptrT_lldb_private__Process_t,
  _swigc__p_std__shared_ptrT_lldb_private__Property_t,
  _swigc__p_std__shared_ptrT_lldb_private__QueueItem_t,
  _swigc__p_std__shared_ptrT_lldb_private__Queue_t,
  _swigc__p_std__shared_ptrT_lldb_private__REPL_t,
  _swigc__p_std__shared_ptrT_lldb_private__RegisterCheckpoint_t,
  _swigc__p_std__shared_ptrT_lldb_private__RegisterContext_t,
  _swigc__p_std__shared_ptrT_lldb_private__RegularExpression_t,
  _swigc__p_std__shared_ptrT_lldb_private__ScriptInterpreter_t,
  _swigc__p_std__shared_ptrT_lldb_private__ScriptSummaryFormat_t,
  _swigc__p_std__shared_ptrT_lldb_private__ScriptedSyntheticChildren_t,
  _swigc__p_std__shared_ptrT_lldb_private__SearchFilter_t,
  _swigc__p_std__shared_ptrT_lldb_private__SectionLoadList_t,
  _swigc__p_std__shared_ptrT_lldb_private__Section_t,
  _swigc__p_std__shared_ptrT_lldb_private__Settings_t,
  _swigc__p_std__shared_ptrT_lldb_private__StackFrameList_t,
  _swigc__p_std__shared_ptrT_lldb_private__StackFrame_t,
  _swigc__p_std__shared_ptrT_lldb_private__StopInfo_t,
  _swigc__p_std__shared_ptrT_lldb_private__StoppointLocation_t,
  _swigc__p_std__shared_ptrT_lldb_private__StreamFile_t,
  _swigc__p_std__shared_ptrT_lldb_private__Stream_t,
  _swigc__p_std__shared_ptrT_lldb_private__StringSummaryFormat_t,
  _swigc__p_std__shared_ptrT_lldb_private__StructuredDataPlugin_t,
  _swigc__p_std__shared_ptrT_lldb_private__SwiftASTContext_t,
  _swigc__p_std__shared_ptrT_lldb_private__SymbolContextSpecifier_t,
  _swigc__p_std__shared_ptrT_lldb_private__SymbolFileType_t,
  _swigc__p_std__shared_ptrT_lldb_private__SymbolFile_t,
  _swigc__p_std__shared_ptrT_lldb_private__SyntheticChildrenFrontEnd_t,
  _swigc__p_std__shared_ptrT_lldb_private__SyntheticChildren_t,
  _swigc__p_std__shared_ptrT_lldb_private__SystemRuntime_t,
  _swigc__p_std__shared_ptrT_lldb_private__TargetProperties_t,
  _swigc__p_std__shared_ptrT_lldb_private__Target_t,
  _swigc__p_std__shared_ptrT_lldb_private__ThreadCollection_t,
  _swigc__p_std__shared_ptrT_lldb_private__ThreadPlanTracer_t,
  _swigc__p_std__shared_ptrT_lldb_private__ThreadPlan_t,
  _swigc__p_std__shared_ptrT_lldb_private__Thread_t,
  _swigc__p_std__shared_ptrT_lldb_private__TraceOptions_t,
  _swigc__p_std__shared_ptrT_lldb_private__TypeCategoryImpl_t,
  _swigc__p_std__shared_ptrT_lldb_private__TypeEnumMemberImpl_t,
  _swigc__p_std__shared_ptrT_lldb_private__TypeFilterImpl_t,
  _swigc__p_std__shared_ptrT_lldb_private__TypeFormatImpl_t,
  _swigc__p_std__shared_ptrT_lldb_private__TypeImpl_t,
  _swigc__p_std__shared_ptrT_lldb_private__TypeMemberFunctionImpl_t,
  _swigc__p_std__shared_ptrT_lldb_private__TypeNameSpecifierImpl_t,
  _swigc__p_std__shared_ptrT_lldb_private__TypeSummaryImpl_t,
  _swigc__p_std__shared_ptrT_lldb_private__TypeSummaryOptions_t,
  _swigc__p_std__shared_ptrT_lldb_private__TypeSystem_t,
  _swigc__p_std__shared_ptrT_lldb_private__TypeValidatorImpl_t,
  _swigc__p_std__shared_ptrT_lldb_private__Type_t,
  _swigc__p_std__shared_ptrT_lldb_private__UnixSignals_t,
  _swigc__p_std__shared_ptrT_lldb_private__UnwindAssembly_t,
  _swigc__p_std__shared_ptrT_lldb_private__UnwindPlan_t,
  _swigc__p_std__shared_ptrT_lldb_private__UserExpression_t,
  _swigc__p_std__shared_ptrT_lldb_private__UtilityFunction_t,
  _swigc__p_std__shared_ptrT_lldb_private__ValueList_t,
  _swigc__p_std__shared_ptrT_lldb_private__ValueObjectList_t,
  _swigc__p_std__shared_ptrT_lldb_private__Value_t,
  _swigc__p_std__shared_ptrT_lldb_private__VariableList_t,
  _swigc__p_std__shared_ptrT_lldb_private__Variable_t,
  _swigc__p_std__shared_ptrT_lldb_private__Watchpoint_t,
  _swigc__p_std__unique_ptrT_lldb_private__ClangASTContext_t,
  _swigc__p_std__unique_ptrT_lldb_private__ClangModulesDeclVendor_t,
  _swigc__p_std__unique_ptrT_lldb_private__ClangPersistentVariables_t,
  _swigc__p_std__unique_ptrT_lldb_private__DynamicCheckerFunctions_t,
  _swigc__p_std__unique_ptrT_lldb_private__DynamicLoader_t,
  _swigc__p_std__unique_ptrT_lldb_private__GoASTContext_t,
  _swigc__p_std__unique_ptrT_lldb_private__JITLoaderList_t,
  _swigc__p_std__unique_ptrT_lldb_private__MemoryRegionInfo_t,
  _swigc__p_std__unique_ptrT_lldb_private__OperatingSystem_t,
  _swigc__p_std__unique_ptrT_lldb_private__ScriptInterpreter_t,
  _swigc__p_std__unique_ptrT_lldb_private__SectionList_t,
  _swigc__p_std__unique_ptrT_lldb_private__SourceManager_t,
  _swigc__p_std__unique_ptrT_lldb_private__StackFrame_t,
  _swigc__p_std__unique_ptrT_lldb_private__StructuredDataImpl_t,
  _swigc__p_std__unique_ptrT_lldb_private__SymbolVendor_t,
  _swigc__p_std__unique_ptrT_lldb_private__SystemRuntime_t,
  _swigc__p_std__weak_ptrT_lldb_private__BreakpointLocation_t,
  _swigc__p_std__weak_ptrT_lldb_private__BreakpointSite_t,
  _swigc__p_std__weak_ptrT_lldb_private__Breakpoint_t,
  _swigc__p_std__weak_ptrT_lldb_private__BroadcasterManager_t,
  _swigc__p_std__weak_ptrT_lldb_private__Debugger_t,
  _swigc__p_std__weak_ptrT_lldb_private__Listener_t,
  _swigc__p_std__weak_ptrT_lldb_private__Module_t,
  _swigc__p_std__weak_ptrT_lldb_private__ObjectFileJITDelegate_t,
  _swigc__p_std__weak_ptrT_lldb_private__ObjectFile_t,
  _swigc__p_std__weak_ptrT_lldb_private__OptionValue_t,
  _swigc__p_std__weak_ptrT_lldb_private__Process_t,
  _swigc__p_std__weak_ptrT_lldb_private__Queue_t,
  _swigc__p_std__weak_ptrT_lldb_private__Section_t,
  _swigc__p_std__weak_ptrT_lldb_private__StackFrame_t,
  _swigc__p_std__weak_ptrT_lldb_private__Stream_t,
  _swigc__p_std__weak_ptrT_lldb_private__StructuredDataPlugin_t,
  _swigc__p_std__weak_ptrT_lldb_private__SymbolFileType_t,
  _swigc__p_std__weak_ptrT_lldb_private__Target_t,
  _swigc__p_std__weak_ptrT_lldb_private__Thread_t,
  _swigc__p_std__weak_ptrT_lldb_private__Type_t,
  _swigc__p_std__weak_ptrT_lldb_private__UnixSignals_t,
  _swigc__p_unsigned_char,
  _swigc__p_unsigned_int,
  _swigc__p_unsigned_long_long,
  _swigc__p_unsigned_short,
  _swigc__p_void,
};


/* -------- TYPE CONVERSION AND EQUIVALENCE RULES (END) -------- */

static swig_const_info swig_const_table[] = {
{0, 0, 0, 0.0, 0, 0}};

#ifdef __cplusplus
}
#endif
/* -----------------------------------------------------------------------------
 * Type initialization:
 * This problem is tough by the requirement that no dynamic 
 * memory is used. Also, since swig_type_info structures store pointers to 
 * swig_cast_info structures and swig_cast_info structures store pointers back
 * to swig_type_info structures, we need some lookup code at initialization. 
 * The idea is that swig generates all the structures that are needed. 
 * The runtime then collects these partially filled structures. 
 * The SWIG_InitializeModule function takes these initial arrays out of 
 * swig_module, and does all the lookup, filling in the swig_module.types
 * array with the correct data and linking the correct swig_cast_info
 * structures together.
 *
 * The generated swig_type_info structures are assigned staticly to an initial 
 * array. We just loop through that array, and handle each type individually.
 * First we lookup if this type has been already loaded, and if so, use the
 * loaded structure instead of the generated one. Then we have to fill in the
 * cast linked list. The cast data is initially stored in something like a
 * two-dimensional array. Each row corresponds to a type (there are the same
 * number of rows as there are in the swig_type_initial array). Each entry in
 * a column is one of the swig_cast_info structures for that type.
 * The cast_initial array is actually an array of arrays, because each row has
 * a variable number of columns. So to actually build the cast linked list,
 * we find the array of casts associated with the type, and loop through it 
 * adding the casts to the list. The one last trick we need to do is making
 * sure the type pointer in the swig_cast_info struct is correct.
 *
 * First off, we lookup the cast->type name to see if it is already loaded. 
 * There are three cases to handle:
 *  1) If the cast->type has already been loaded AND the type we are adding
 *     casting info to has not been loaded (it is in this module), THEN we
 *     replace the cast->type pointer with the type pointer that has already
 *     been loaded.
 *  2) If BOTH types (the one we are adding casting info to, and the 
 *     cast->type) are loaded, THEN the cast info has already been loaded by
 *     the previous module so we just ignore it.
 *  3) Finally, if cast->type has not already been loaded, then we add that
 *     swig_cast_info to the linked list (because the cast->type) pointer will
 *     be correct.
 * ----------------------------------------------------------------------------- */

#ifdef __cplusplus
extern "C" {
#if 0
} /* c-mode */
#endif
#endif

#if 0
#define SWIGRUNTIME_DEBUG
#endif


SWIGRUNTIME void
SWIG_InitializeModule(void *clientdata) {
  size_t i;
  swig_module_info *module_head, *iter;
  int found, init;
  
  clientdata = clientdata;
  
  /* check to see if the circular list has been setup, if not, set it up */
  if (swig_module.next==0) {
    /* Initialize the swig_module */
    swig_module.type_initial = swig_type_initial;
    swig_module.cast_initial = swig_cast_initial;
    swig_module.next = &swig_module;
    init = 1;
  } else {
    init = 0;
  }
  
  /* Try and load any already created modules */
  module_head = SWIG_GetModule(clientdata);
  if (!module_head) {
    /* This is the first module loaded for this interpreter */
    /* so set the swig module into the interpreter */
    SWIG_SetModule(clientdata, &swig_module);
    module_head = &swig_module;
  } else {
    /* the interpreter has loaded a SWIG module, but has it loaded this one? */
    found=0;
    iter=module_head;
    do {
      if (iter==&swig_module) {
        found=1;
        break;
      }
      iter=iter->next;
    } while (iter!= module_head);
    
    /* if the is found in the list, then all is done and we may leave */
    if (found) return;
    /* otherwise we must add out module into the list */
    swig_module.next = module_head->next;
    module_head->next = &swig_module;
  }
  
  /* When multiple interpeters are used, a module could have already been initialized in
       a different interpreter, but not yet have a pointer in this interpreter.
       In this case, we do not want to continue adding types... everything should be
       set up already */
  if (init == 0) return;
  
  /* Now work on filling in swig_module.types */
#ifdef SWIGRUNTIME_DEBUG
  printf("SWIG_InitializeModule: size %d\n", swig_module.size);
#endif
  for (i = 0; i < swig_module.size; ++i) {
    swig_type_info *type = 0;
    swig_type_info *ret;
    swig_cast_info *cast;
    
#ifdef SWIGRUNTIME_DEBUG
    printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name);
#endif
    
    /* if there is another module already loaded */
    if (swig_module.next != &swig_module) {
      type = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, swig_module.type_initial[i]->name);
    }
    if (type) {
      /* Overwrite clientdata field */
#ifdef SWIGRUNTIME_DEBUG
      printf("SWIG_InitializeModule: found type %s\n", type->name);
#endif
      if (swig_module.type_initial[i]->clientdata) {
        type->clientdata = swig_module.type_initial[i]->clientdata;
#ifdef SWIGRUNTIME_DEBUG
        printf("SWIG_InitializeModule: found and overwrite type %s \n", type->name);
#endif
      }
    } else {
      type = swig_module.type_initial[i];
    }
    
    /* Insert casting types */
    cast = swig_module.cast_initial[i];
    while (cast->type) {
      /* Don't need to add information already in the list */
      ret = 0;
#ifdef SWIGRUNTIME_DEBUG
      printf("SWIG_InitializeModule: look cast %s\n", cast->type->name);
#endif
      if (swig_module.next != &swig_module) {
        ret = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, cast->type->name);
#ifdef SWIGRUNTIME_DEBUG
        if (ret) printf("SWIG_InitializeModule: found cast %s\n", ret->name);
#endif
      }
      if (ret) {
        if (type == swig_module.type_initial[i]) {
#ifdef SWIGRUNTIME_DEBUG
          printf("SWIG_InitializeModule: skip old type %s\n", ret->name);
#endif
          cast->type = ret;
          ret = 0;
        } else {
          /* Check for casting already in the list */
          swig_cast_info *ocast = SWIG_TypeCheck(ret->name, type);
#ifdef SWIGRUNTIME_DEBUG
          if (ocast) printf("SWIG_InitializeModule: skip old cast %s\n", ret->name);
#endif
          if (!ocast) ret = 0;
        }
      }
      
      if (!ret) {
#ifdef SWIGRUNTIME_DEBUG
        printf("SWIG_InitializeModule: adding cast %s\n", cast->type->name);
#endif
        if (type->cast) {
          type->cast->prev = cast;
          cast->next = type->cast;
        }
        type->cast = cast;
      }
      cast++;
    }
    /* Set entry in modules->types array equal to the type */
    swig_module.types[i] = type;
  }
  swig_module.types[i] = 0;
  
#ifdef SWIGRUNTIME_DEBUG
  printf("**** SWIG_InitializeModule: Cast List ******\n");
  for (i = 0; i < swig_module.size; ++i) {
    int j = 0;
    swig_cast_info *cast = swig_module.cast_initial[i];
    printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name);
    while (cast->type) {
      printf("SWIG_InitializeModule: cast type %s\n", cast->type->name);
      cast++;
      ++j;
    }
    printf("---- Total casts: %d\n",j);
  }
  printf("**** SWIG_InitializeModule: Cast List ******\n");
#endif
}

/* This function will propagate the clientdata field of type to
* any new swig_type_info structures that have been added into the list
* of equivalent types.  It is like calling
* SWIG_TypeClientData(type, clientdata) a second time.
*/
SWIGRUNTIME void
SWIG_PropagateClientData(void) {
  size_t i;
  swig_cast_info *equiv;
  static int init_run = 0;
  
  if (init_run) return;
  init_run = 1;
  
  for (i = 0; i < swig_module.size; i++) {
    if (swig_module.types[i]->clientdata) {
      equiv = swig_module.types[i]->cast;
      while (equiv) {
        if (!equiv->converter) {
          if (equiv->type && !equiv->type->clientdata)
          SWIG_TypeClientData(equiv->type, swig_module.types[i]->clientdata);
        }
        equiv = equiv->next;
      }
    }
  }
}

#ifdef __cplusplus
#if 0
{
  /* c-mode */
#endif
}
#endif



#ifdef __cplusplus
extern "C" {
#endif
  
  /* Python-specific SWIG API */
#define SWIG_newvarlink()                             SWIG_Python_newvarlink()
#define SWIG_addvarlink(p, name, get_attr, set_attr)  SWIG_Python_addvarlink(p, name, get_attr, set_attr)
#define SWIG_InstallConstants(d, constants)           SWIG_Python_InstallConstants(d, constants)
  
  /* -----------------------------------------------------------------------------
   * global variable support code.
   * ----------------------------------------------------------------------------- */
  
  typedef struct swig_globalvar {
    char       *name;                  /* Name of global variable */
    PyObject *(*get_attr)(void);       /* Return the current value */
    int       (*set_attr)(PyObject *); /* Set the value */
    struct swig_globalvar *next;
  } swig_globalvar;
  
  typedef struct swig_varlinkobject {
    PyObject_HEAD
    swig_globalvar *vars;
  } swig_varlinkobject;
  
  SWIGINTERN PyObject *
  swig_varlink_repr(swig_varlinkobject *SWIGUNUSEDPARM(v)) {
#if PY_VERSION_HEX >= 0x03000000
    return PyUnicode_InternFromString("<Swig global variables>");
#else
    return PyString_FromString("<Swig global variables>");
#endif
  }
  
  SWIGINTERN PyObject *
  swig_varlink_str(swig_varlinkobject *v) {
#if PY_VERSION_HEX >= 0x03000000
    PyObject *str = PyUnicode_InternFromString("(");
    PyObject *tail;
    PyObject *joined;
    swig_globalvar *var;
    for (var = v->vars; var; var=var->next) {
      tail = PyUnicode_FromString(var->name);
      joined = PyUnicode_Concat(str, tail);
      Py_DecRef(str);
      Py_DecRef(tail);
      str = joined;
      if (var->next) {
        tail = PyUnicode_InternFromString(", ");
        joined = PyUnicode_Concat(str, tail);
        Py_DecRef(str);
        Py_DecRef(tail);
        str = joined;
      }
    }
    tail = PyUnicode_InternFromString(")");
    joined = PyUnicode_Concat(str, tail);
    Py_DecRef(str);
    Py_DecRef(tail);
    str = joined;
#else
    PyObject *str = PyString_FromString("(");
    swig_globalvar *var;
    for (var = v->vars; var; var=var->next) {
      PyString_ConcatAndDel(&str,PyString_FromString(var->name));
      if (var->next) PyString_ConcatAndDel(&str,PyString_FromString(", "));
    }
    PyString_ConcatAndDel(&str,PyString_FromString(")"));
#endif
    return str;
  }
  
  SWIGINTERN int
  swig_varlink_print(swig_varlinkobject *v, FILE *fp, int SWIGUNUSEDPARM(flags)) {
    char *tmp;
    PyObject *str = swig_varlink_str(v);
    fprintf(fp,"Swig global variables ");
    fprintf(fp,"%s\n", tmp = SWIG_Python_str_AsChar(str));
    SWIG_Python_str_DelForPy3(tmp);
    Py_DECREF(str);
    return 0;
  }
  
  SWIGINTERN void
  swig_varlink_dealloc(swig_varlinkobject *v) {
    swig_globalvar *var = v->vars;
    while (var) {
      swig_globalvar *n = var->next;
      free(var->name);
      free(var);
      var = n;
    }
  }
  
  SWIGINTERN PyObject *
  swig_varlink_getattr(swig_varlinkobject *v, char *n) {
    PyObject *res = NULL;
    swig_globalvar *var = v->vars;
    while (var) {
      if (strcmp(var->name,n) == 0) {
        res = (*var->get_attr)();
        break;
      }
      var = var->next;
    }
    if (res == NULL && !PyErr_Occurred()) {
      PyErr_SetString(PyExc_NameError,"Unknown C global variable");
    }
    return res;
  }
  
  SWIGINTERN int
  swig_varlink_setattr(swig_varlinkobject *v, char *n, PyObject *p) {
    int res = 1;
    swig_globalvar *var = v->vars;
    while (var) {
      if (strcmp(var->name,n) == 0) {
        res = (*var->set_attr)(p);
        break;
      }
      var = var->next;
    }
    if (res == 1 && !PyErr_Occurred()) {
      PyErr_SetString(PyExc_NameError,"Unknown C global variable");
    }
    return res;
  }
  
  SWIGINTERN PyTypeObject*
  swig_varlink_type(void) {
    static char varlink__doc__[] = "Swig var link object";
    static PyTypeObject varlink_type;
    static int type_init = 0;  
    if (!type_init) {
      const PyTypeObject tmp
      = {
        /* PyObject header changed in Python 3 */
#if PY_VERSION_HEX >= 0x03000000
        PyVarObject_HEAD_INIT(&PyType_Type, 0)
#else
        PyObject_HEAD_INIT(NULL)
        0,                                  /* Number of items in variable part (ob_size) */
#endif
        (char *)"swigvarlink",              /* Type name (tp_name) */
        sizeof(swig_varlinkobject),         /* Basic size (tp_basicsize) */
        0,                                  /* Itemsize (tp_itemsize) */
        (destructor) swig_varlink_dealloc,  /* Deallocator (tp_dealloc) */ 
        (printfunc) swig_varlink_print,     /* Print (tp_print) */
        (getattrfunc) swig_varlink_getattr, /* get attr (tp_getattr) */
        (setattrfunc) swig_varlink_setattr, /* Set attr (tp_setattr) */
        0,                                  /* tp_compare */
        (reprfunc) swig_varlink_repr,       /* tp_repr */
        0,                                  /* tp_as_number */
        0,                                  /* tp_as_sequence */
        0,                                  /* tp_as_mapping */
        0,                                  /* tp_hash */
        0,                                  /* tp_call */
        (reprfunc) swig_varlink_str,        /* tp_str */
        0,                                  /* tp_getattro */
        0,                                  /* tp_setattro */
        0,                                  /* tp_as_buffer */
        0,                                  /* tp_flags */
        varlink__doc__,                     /* tp_doc */
        0,                                  /* tp_traverse */
        0,                                  /* tp_clear */
        0,                                  /* tp_richcompare */
        0,                                  /* tp_weaklistoffset */
#if PY_VERSION_HEX >= 0x02020000
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* tp_iter -> tp_weaklist */
#endif
#if PY_VERSION_HEX >= 0x02030000
        0,                                  /* tp_del */
#endif
#ifdef COUNT_ALLOCS
        0,0,0,0                             /* tp_alloc -> tp_next */
#endif
      };
      varlink_type = tmp;
      /* for Python 3 we already assigned ob_type in PyVarObject_HEAD_INIT() */
#if PY_VERSION_HEX < 0x03000000
      varlink_type.ob_type = &PyType_Type;
#endif
      type_init = 1;
    }
    return &varlink_type;
  }
  
  /* Create a variable linking object for use later */
  SWIGINTERN PyObject *
  SWIG_Python_newvarlink(void) {
    swig_varlinkobject *result = PyObject_NEW(swig_varlinkobject, swig_varlink_type());
    if (result) {
      result->vars = 0;
    }
    return ((PyObject*) result);
  }
  
  SWIGINTERN void 
  SWIG_Python_addvarlink(PyObject *p, char *name, PyObject *(*get_attr)(void), int (*set_attr)(PyObject *p)) {
    swig_varlinkobject *v = (swig_varlinkobject *) p;
    swig_globalvar *gv = (swig_globalvar *) malloc(sizeof(swig_globalvar));
    if (gv) {
      size_t size = strlen(name)+1;
      gv->name = (char *)malloc(size);
      if (gv->name) {
        strncpy(gv->name,name,size);
        gv->get_attr = get_attr;
        gv->set_attr = set_attr;
        gv->next = v->vars;
      }
    }
    v->vars = gv;
  }
  
  SWIGINTERN PyObject *
  SWIG_globals(void) {
    static PyObject *_SWIG_globals = 0; 
    if (!_SWIG_globals) _SWIG_globals = SWIG_newvarlink();  
    return _SWIG_globals;
  }
  
  /* -----------------------------------------------------------------------------
   * constants/methods manipulation
   * ----------------------------------------------------------------------------- */
  
  /* Install Constants */
  SWIGINTERN void
  SWIG_Python_InstallConstants(PyObject *d, swig_const_info constants[]) {
    PyObject *obj = 0;
    size_t i;
    for (i = 0; constants[i].type; ++i) {
      switch(constants[i].type) {
      case SWIG_PY_POINTER:
        obj = SWIG_NewPointerObj(constants[i].pvalue, *(constants[i]).ptype,0);
        break;
      case SWIG_PY_BINARY:
        obj = SWIG_NewPackedObj(constants[i].pvalue, constants[i].lvalue, *(constants[i].ptype));
        break;
      default:
        obj = 0;
        break;
      }
      if (obj) {
        PyDict_SetItemString(d, constants[i].name, obj);
        Py_DECREF(obj);
      }
    }
  }
  
  /* -----------------------------------------------------------------------------*/
  /* Fix SwigMethods to carry the callback ptrs when needed */
  /* -----------------------------------------------------------------------------*/
  
  SWIGINTERN void
  SWIG_Python_FixMethods(PyMethodDef *methods,
    swig_const_info *const_table,
    swig_type_info **types,
    swig_type_info **types_initial) {
    size_t i;
    for (i = 0; methods[i].ml_name; ++i) {
      const char *c = methods[i].ml_doc;
      if (c && (c = strstr(c, "swig_ptr: "))) {
        int j;
        swig_const_info *ci = 0;
        const char *name = c + 10;
        for (j = 0; const_table[j].type; ++j) {
          if (strncmp(const_table[j].name, name, 
              strlen(const_table[j].name)) == 0) {
            ci = &(const_table[j]);
            break;
          }
        }
        if (ci) {
          size_t shift = (ci->ptype) - types;
          swig_type_info *ty = types_initial[shift];
          size_t ldoc = (c - methods[i].ml_doc);
          size_t lptr = strlen(ty->name)+2*sizeof(void*)+2;
          char *ndoc = (char*)malloc(ldoc + lptr + 10);
          if (ndoc) {
            char *buff = ndoc;
            void *ptr = (ci->type == SWIG_PY_POINTER) ? ci->pvalue : 0;
            if (ptr) {
              strncpy(buff, methods[i].ml_doc, ldoc);
              buff += ldoc;
              strncpy(buff, "swig_ptr: ", 10);
              buff += 10;
              SWIG_PackVoidPtr(buff, ptr, ty->name, lptr);
              methods[i].ml_doc = ndoc;
            }
          }
        }
      }
    }
  } 
  
#ifdef __cplusplus
}
#endif

/* -----------------------------------------------------------------------------*
 *  Partial Init method
 * -----------------------------------------------------------------------------*/

#ifdef __cplusplus
extern "C"
#endif

SWIGEXPORT 
#if PY_VERSION_HEX >= 0x03000000
PyObject*
#else
void
#endif
SWIG_init(void) {
  PyObject *m, *d;  
#if PY_VERSION_HEX >= 0x03000000
  static struct PyModuleDef SWIG_module = {
    PyModuleDef_HEAD_INIT,
    (char *) SWIG_name,
    NULL,
    -1,
    SwigMethods,
    NULL,
    NULL,
    NULL,
    NULL
  };
#endif
  
  /* Fix SwigMethods to carry the callback ptrs when needed */
  SWIG_Python_FixMethods(SwigMethods, swig_const_table, swig_types, swig_type_initial);
  
#if PY_VERSION_HEX >= 0x03000000
  m = PyModule_Create(&SWIG_module);
#else
  m = Py_InitModule((char *) SWIG_name, SwigMethods);
#endif
  d = PyModule_GetDict(m);
  
  SWIG_InitializeModule(0);
  SWIG_InstallConstants(d,swig_const_table);
  
  
  SWIG_Python_SetConstant(d, "INT32_MAX",SWIG_From_int(static_cast< int >(2147483647)));
  SWIG_Python_SetConstant(d, "UINT32_MAX",SWIG_From_unsigned_SS_int(static_cast< unsigned int >(4294967295U)));
  SWIG_Python_SetConstant(d, "UINT64_MAX",SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(18446744073709551615ULL)));
  SWIG_Python_SetConstant(d, "LLDB_GENERIC_ERROR",SWIG_From_unsigned_SS_int(static_cast< unsigned int >(4294967295U)));
  SWIG_Python_SetConstant(d, "LLDB_INVALID_BREAK_ID",SWIG_From_int(static_cast< int >(0)));
  SWIG_Python_SetConstant(d, "LLDB_DEFAULT_BREAK_SIZE",SWIG_From_int(static_cast< int >(0)));
  SWIG_Python_SetConstant(d, "LLDB_INVALID_WATCH_ID",SWIG_From_int(static_cast< int >(0)));
  SWIG_Python_SetConstant(d, "LLDB_WATCH_TYPE_READ",SWIG_From_unsigned_SS_int(static_cast< unsigned int >((1u << 0))));
  SWIG_Python_SetConstant(d, "LLDB_WATCH_TYPE_WRITE",SWIG_From_unsigned_SS_int(static_cast< unsigned int >((1u << 1))));
  SWIG_Python_SetConstant(d, "LLDB_REGNUM_GENERIC_PC",SWIG_From_int(static_cast< int >(0)));
  SWIG_Python_SetConstant(d, "LLDB_REGNUM_GENERIC_SP",SWIG_From_int(static_cast< int >(1)));
  SWIG_Python_SetConstant(d, "LLDB_REGNUM_GENERIC_FP",SWIG_From_int(static_cast< int >(2)));
  SWIG_Python_SetConstant(d, "LLDB_REGNUM_GENERIC_RA",SWIG_From_int(static_cast< int >(3)));
  SWIG_Python_SetConstant(d, "LLDB_REGNUM_GENERIC_FLAGS",SWIG_From_int(static_cast< int >(4)));
  SWIG_Python_SetConstant(d, "LLDB_REGNUM_GENERIC_ARG1",SWIG_From_int(static_cast< int >(5)));
  SWIG_Python_SetConstant(d, "LLDB_REGNUM_GENERIC_ARG2",SWIG_From_int(static_cast< int >(6)));
  SWIG_Python_SetConstant(d, "LLDB_REGNUM_GENERIC_ARG3",SWIG_From_int(static_cast< int >(7)));
  SWIG_Python_SetConstant(d, "LLDB_REGNUM_GENERIC_ARG4",SWIG_From_int(static_cast< int >(8)));
  SWIG_Python_SetConstant(d, "LLDB_REGNUM_GENERIC_ARG5",SWIG_From_int(static_cast< int >(9)));
  SWIG_Python_SetConstant(d, "LLDB_REGNUM_GENERIC_ARG6",SWIG_From_int(static_cast< int >(10)));
  SWIG_Python_SetConstant(d, "LLDB_REGNUM_GENERIC_ARG7",SWIG_From_int(static_cast< int >(11)));
  SWIG_Python_SetConstant(d, "LLDB_REGNUM_GENERIC_ARG8",SWIG_From_int(static_cast< int >(12)));
  SWIG_Python_SetConstant(d, "LLDB_INVALID_ADDRESS",SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(18446744073709551615ULL)));
  SWIG_Python_SetConstant(d, "LLDB_INVALID_INDEX32",SWIG_From_unsigned_SS_int(static_cast< unsigned int >(4294967295U)));
  SWIG_Python_SetConstant(d, "LLDB_INVALID_IVAR_OFFSET",SWIG_From_unsigned_SS_int(static_cast< unsigned int >(4294967295U)));
  SWIG_Python_SetConstant(d, "LLDB_INVALID_IMAGE_TOKEN",SWIG_From_unsigned_SS_int(static_cast< unsigned int >(4294967295U)));
  SWIG_Python_SetConstant(d, "LLDB_INVALID_MODULE_VERSION",SWIG_From_unsigned_SS_int(static_cast< unsigned int >(4294967295U)));
  SWIG_Python_SetConstant(d, "LLDB_INVALID_REGNUM",SWIG_From_unsigned_SS_int(static_cast< unsigned int >(4294967295U)));
  SWIG_Python_SetConstant(d, "LLDB_INVALID_UID",SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(18446744073709551615ULL)));
  SWIG_Python_SetConstant(d, "LLDB_INVALID_PROCESS_ID",SWIG_From_int(static_cast< int >(0)));
  SWIG_Python_SetConstant(d, "LLDB_INVALID_THREAD_ID",SWIG_From_int(static_cast< int >(0)));
  SWIG_Python_SetConstant(d, "LLDB_INVALID_FRAME_ID",SWIG_From_unsigned_SS_int(static_cast< unsigned int >(4294967295U)));
  SWIG_Python_SetConstant(d, "LLDB_INVALID_SIGNAL_NUMBER",SWIG_From_int(static_cast< int >(2147483647)));
  SWIG_Python_SetConstant(d, "LLDB_INVALID_OFFSET",SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(18446744073709551615ULL)));
  SWIG_Python_SetConstant(d, "LLDB_INVALID_LINE_NUMBER",SWIG_From_unsigned_SS_int(static_cast< unsigned int >(4294967295U)));
  SWIG_Python_SetConstant(d, "LLDB_INVALID_QUEUE_ID",SWIG_From_int(static_cast< int >(0)));
  SWIG_Python_SetConstant(d, "LLDB_ARCH_DEFAULT",SWIG_FromCharPtr("systemArch"));
  SWIG_Python_SetConstant(d, "LLDB_ARCH_DEFAULT_32BIT",SWIG_FromCharPtr("systemArch32"));
  SWIG_Python_SetConstant(d, "LLDB_ARCH_DEFAULT_64BIT",SWIG_FromCharPtr("systemArch64"));
  SWIG_Python_SetConstant(d, "LLDB_INVALID_CPUTYPE",SWIG_From_unsigned_SS_int(static_cast< unsigned int >((0xFFFFFFFEu))));
  SWIG_Python_SetConstant(d, "LLDB_MAX_NUM_OPTION_SETS",SWIG_From_int(static_cast< int >(32)));
  SWIG_Python_SetConstant(d, "LLDB_OPT_SET_ALL",SWIG_From_unsigned_SS_int(static_cast< unsigned int >(0xFFFFFFFFU)));
  SWIG_Python_SetConstant(d, "LLDB_OPT_SET_1",SWIG_From_unsigned_SS_int(static_cast< unsigned int >((1U << 0))));
  SWIG_Python_SetConstant(d, "LLDB_OPT_SET_2",SWIG_From_unsigned_SS_int(static_cast< unsigned int >((1U << 1))));
  SWIG_Python_SetConstant(d, "LLDB_OPT_SET_3",SWIG_From_unsigned_SS_int(static_cast< unsigned int >((1U << 2))));
  SWIG_Python_SetConstant(d, "LLDB_OPT_SET_4",SWIG_From_unsigned_SS_int(static_cast< unsigned int >((1U << 3))));
  SWIG_Python_SetConstant(d, "LLDB_OPT_SET_5",SWIG_From_unsigned_SS_int(static_cast< unsigned int >((1U << 4))));
  SWIG_Python_SetConstant(d, "LLDB_OPT_SET_6",SWIG_From_unsigned_SS_int(static_cast< unsigned int >((1U << 5))));
  SWIG_Python_SetConstant(d, "LLDB_OPT_SET_7",SWIG_From_unsigned_SS_int(static_cast< unsigned int >((1U << 6))));
  SWIG_Python_SetConstant(d, "LLDB_OPT_SET_8",SWIG_From_unsigned_SS_int(static_cast< unsigned int >((1U << 7))));
  SWIG_Python_SetConstant(d, "LLDB_OPT_SET_9",SWIG_From_unsigned_SS_int(static_cast< unsigned int >((1U << 8))));
  SWIG_Python_SetConstant(d, "LLDB_OPT_SET_10",SWIG_From_unsigned_SS_int(static_cast< unsigned int >((1U << 9))));
  SWIG_Python_SetConstant(d, "eStateInvalid",SWIG_From_int(static_cast< int >(lldb::eStateInvalid)));
  SWIG_Python_SetConstant(d, "eStateUnloaded",SWIG_From_int(static_cast< int >(lldb::eStateUnloaded)));
  SWIG_Python_SetConstant(d, "eStateConnected",SWIG_From_int(static_cast< int >(lldb::eStateConnected)));
  SWIG_Python_SetConstant(d, "eStateAttaching",SWIG_From_int(static_cast< int >(lldb::eStateAttaching)));
  SWIG_Python_SetConstant(d, "eStateLaunching",SWIG_From_int(static_cast< int >(lldb::eStateLaunching)));
  SWIG_Python_SetConstant(d, "eStateStopped",SWIG_From_int(static_cast< int >(lldb::eStateStopped)));
  SWIG_Python_SetConstant(d, "eStateRunning",SWIG_From_int(static_cast< int >(lldb::eStateRunning)));
  SWIG_Python_SetConstant(d, "eStateStepping",SWIG_From_int(static_cast< int >(lldb::eStateStepping)));
  SWIG_Python_SetConstant(d, "eStateCrashed",SWIG_From_int(static_cast< int >(lldb::eStateCrashed)));
  SWIG_Python_SetConstant(d, "eStateDetached",SWIG_From_int(static_cast< int >(lldb::eStateDetached)));
  SWIG_Python_SetConstant(d, "eStateExited",SWIG_From_int(static_cast< int >(lldb::eStateExited)));
  SWIG_Python_SetConstant(d, "eStateSuspended",SWIG_From_int(static_cast< int >(lldb::eStateSuspended)));
  SWIG_Python_SetConstant(d, "eLaunchFlagNone",SWIG_From_int(static_cast< int >(lldb::eLaunchFlagNone)));
  SWIG_Python_SetConstant(d, "eLaunchFlagExec",SWIG_From_int(static_cast< int >(lldb::eLaunchFlagExec)));
  SWIG_Python_SetConstant(d, "eLaunchFlagDebug",SWIG_From_int(static_cast< int >(lldb::eLaunchFlagDebug)));
  SWIG_Python_SetConstant(d, "eLaunchFlagStopAtEntry",SWIG_From_int(static_cast< int >(lldb::eLaunchFlagStopAtEntry)));
  SWIG_Python_SetConstant(d, "eLaunchFlagDisableASLR",SWIG_From_int(static_cast< int >(lldb::eLaunchFlagDisableASLR)));
  SWIG_Python_SetConstant(d, "eLaunchFlagDisableSTDIO",SWIG_From_int(static_cast< int >(lldb::eLaunchFlagDisableSTDIO)));
  SWIG_Python_SetConstant(d, "eLaunchFlagLaunchInTTY",SWIG_From_int(static_cast< int >(lldb::eLaunchFlagLaunchInTTY)));
  SWIG_Python_SetConstant(d, "eLaunchFlagLaunchInShell",SWIG_From_int(static_cast< int >(lldb::eLaunchFlagLaunchInShell)));
  SWIG_Python_SetConstant(d, "eLaunchFlagLaunchInSeparateProcessGroup",SWIG_From_int(static_cast< int >(lldb::eLaunchFlagLaunchInSeparateProcessGroup)));
  SWIG_Python_SetConstant(d, "eLaunchFlagDontSetExitStatus",SWIG_From_int(static_cast< int >(lldb::eLaunchFlagDontSetExitStatus)));
  SWIG_Python_SetConstant(d, "eLaunchFlagDetachOnError",SWIG_From_int(static_cast< int >(lldb::eLaunchFlagDetachOnError)));
  SWIG_Python_SetConstant(d, "eLaunchFlagShellExpandArguments",SWIG_From_int(static_cast< int >(lldb::eLaunchFlagShellExpandArguments)));
  SWIG_Python_SetConstant(d, "eLaunchFlagCloseTTYOnExit",SWIG_From_int(static_cast< int >(lldb::eLaunchFlagCloseTTYOnExit)));
  SWIG_Python_SetConstant(d, "eOnlyThisThread",SWIG_From_int(static_cast< int >(lldb::eOnlyThisThread)));
  SWIG_Python_SetConstant(d, "eAllThreads",SWIG_From_int(static_cast< int >(lldb::eAllThreads)));
  SWIG_Python_SetConstant(d, "eOnlyDuringStepping",SWIG_From_int(static_cast< int >(lldb::eOnlyDuringStepping)));
  SWIG_Python_SetConstant(d, "eByteOrderInvalid",SWIG_From_int(static_cast< int >(lldb::eByteOrderInvalid)));
  SWIG_Python_SetConstant(d, "eByteOrderBig",SWIG_From_int(static_cast< int >(lldb::eByteOrderBig)));
  SWIG_Python_SetConstant(d, "eByteOrderPDP",SWIG_From_int(static_cast< int >(lldb::eByteOrderPDP)));
  SWIG_Python_SetConstant(d, "eByteOrderLittle",SWIG_From_int(static_cast< int >(lldb::eByteOrderLittle)));
  SWIG_Python_SetConstant(d, "eEncodingInvalid",SWIG_From_int(static_cast< int >(lldb::eEncodingInvalid)));
  SWIG_Python_SetConstant(d, "eEncodingUint",SWIG_From_int(static_cast< int >(lldb::eEncodingUint)));
  SWIG_Python_SetConstant(d, "eEncodingSint",SWIG_From_int(static_cast< int >(lldb::eEncodingSint)));
  SWIG_Python_SetConstant(d, "eEncodingIEEE754",SWIG_From_int(static_cast< int >(lldb::eEncodingIEEE754)));
  SWIG_Python_SetConstant(d, "eEncodingVector",SWIG_From_int(static_cast< int >(lldb::eEncodingVector)));
  SWIG_Python_SetConstant(d, "eFormatDefault",SWIG_From_int(static_cast< int >(lldb::eFormatDefault)));
  SWIG_Python_SetConstant(d, "eFormatInvalid",SWIG_From_int(static_cast< int >(lldb::eFormatInvalid)));
  SWIG_Python_SetConstant(d, "eFormatBoolean",SWIG_From_int(static_cast< int >(lldb::eFormatBoolean)));
  SWIG_Python_SetConstant(d, "eFormatBinary",SWIG_From_int(static_cast< int >(lldb::eFormatBinary)));
  SWIG_Python_SetConstant(d, "eFormatBytes",SWIG_From_int(static_cast< int >(lldb::eFormatBytes)));
  SWIG_Python_SetConstant(d, "eFormatBytesWithASCII",SWIG_From_int(static_cast< int >(lldb::eFormatBytesWithASCII)));
  SWIG_Python_SetConstant(d, "eFormatChar",SWIG_From_int(static_cast< int >(lldb::eFormatChar)));
  SWIG_Python_SetConstant(d, "eFormatCharPrintable",SWIG_From_int(static_cast< int >(lldb::eFormatCharPrintable)));
  SWIG_Python_SetConstant(d, "eFormatComplex",SWIG_From_int(static_cast< int >(lldb::eFormatComplex)));
  SWIG_Python_SetConstant(d, "eFormatComplexFloat",SWIG_From_int(static_cast< int >(lldb::eFormatComplexFloat)));
  SWIG_Python_SetConstant(d, "eFormatCString",SWIG_From_int(static_cast< int >(lldb::eFormatCString)));
  SWIG_Python_SetConstant(d, "eFormatDecimal",SWIG_From_int(static_cast< int >(lldb::eFormatDecimal)));
  SWIG_Python_SetConstant(d, "eFormatEnum",SWIG_From_int(static_cast< int >(lldb::eFormatEnum)));
  SWIG_Python_SetConstant(d, "eFormatHex",SWIG_From_int(static_cast< int >(lldb::eFormatHex)));
  SWIG_Python_SetConstant(d, "eFormatHexUppercase",SWIG_From_int(static_cast< int >(lldb::eFormatHexUppercase)));
  SWIG_Python_SetConstant(d, "eFormatFloat",SWIG_From_int(static_cast< int >(lldb::eFormatFloat)));
  SWIG_Python_SetConstant(d, "eFormatOctal",SWIG_From_int(static_cast< int >(lldb::eFormatOctal)));
  SWIG_Python_SetConstant(d, "eFormatOSType",SWIG_From_int(static_cast< int >(lldb::eFormatOSType)));
  SWIG_Python_SetConstant(d, "eFormatUnicode16",SWIG_From_int(static_cast< int >(lldb::eFormatUnicode16)));
  SWIG_Python_SetConstant(d, "eFormatUnicode32",SWIG_From_int(static_cast< int >(lldb::eFormatUnicode32)));
  SWIG_Python_SetConstant(d, "eFormatUnsigned",SWIG_From_int(static_cast< int >(lldb::eFormatUnsigned)));
  SWIG_Python_SetConstant(d, "eFormatPointer",SWIG_From_int(static_cast< int >(lldb::eFormatPointer)));
  SWIG_Python_SetConstant(d, "eFormatVectorOfChar",SWIG_From_int(static_cast< int >(lldb::eFormatVectorOfChar)));
  SWIG_Python_SetConstant(d, "eFormatVectorOfSInt8",SWIG_From_int(static_cast< int >(lldb::eFormatVectorOfSInt8)));
  SWIG_Python_SetConstant(d, "eFormatVectorOfUInt8",SWIG_From_int(static_cast< int >(lldb::eFormatVectorOfUInt8)));
  SWIG_Python_SetConstant(d, "eFormatVectorOfSInt16",SWIG_From_int(static_cast< int >(lldb::eFormatVectorOfSInt16)));
  SWIG_Python_SetConstant(d, "eFormatVectorOfUInt16",SWIG_From_int(static_cast< int >(lldb::eFormatVectorOfUInt16)));
  SWIG_Python_SetConstant(d, "eFormatVectorOfSInt32",SWIG_From_int(static_cast< int >(lldb::eFormatVectorOfSInt32)));
  SWIG_Python_SetConstant(d, "eFormatVectorOfUInt32",SWIG_From_int(static_cast< int >(lldb::eFormatVectorOfUInt32)));
  SWIG_Python_SetConstant(d, "eFormatVectorOfSInt64",SWIG_From_int(static_cast< int >(lldb::eFormatVectorOfSInt64)));
  SWIG_Python_SetConstant(d, "eFormatVectorOfUInt64",SWIG_From_int(static_cast< int >(lldb::eFormatVectorOfUInt64)));
  SWIG_Python_SetConstant(d, "eFormatVectorOfFloat16",SWIG_From_int(static_cast< int >(lldb::eFormatVectorOfFloat16)));
  SWIG_Python_SetConstant(d, "eFormatVectorOfFloat32",SWIG_From_int(static_cast< int >(lldb::eFormatVectorOfFloat32)));
  SWIG_Python_SetConstant(d, "eFormatVectorOfFloat64",SWIG_From_int(static_cast< int >(lldb::eFormatVectorOfFloat64)));
  SWIG_Python_SetConstant(d, "eFormatVectorOfUInt128",SWIG_From_int(static_cast< int >(lldb::eFormatVectorOfUInt128)));
  SWIG_Python_SetConstant(d, "eFormatComplexInteger",SWIG_From_int(static_cast< int >(lldb::eFormatComplexInteger)));
  SWIG_Python_SetConstant(d, "eFormatCharArray",SWIG_From_int(static_cast< int >(lldb::eFormatCharArray)));
  SWIG_Python_SetConstant(d, "eFormatAddressInfo",SWIG_From_int(static_cast< int >(lldb::eFormatAddressInfo)));
  SWIG_Python_SetConstant(d, "eFormatHexFloat",SWIG_From_int(static_cast< int >(lldb::eFormatHexFloat)));
  SWIG_Python_SetConstant(d, "eFormatInstruction",SWIG_From_int(static_cast< int >(lldb::eFormatInstruction)));
  SWIG_Python_SetConstant(d, "eFormatVoid",SWIG_From_int(static_cast< int >(lldb::eFormatVoid)));
  SWIG_Python_SetConstant(d, "kNumFormats",SWIG_From_int(static_cast< int >(lldb::kNumFormats)));
  SWIG_Python_SetConstant(d, "eDescriptionLevelBrief",SWIG_From_int(static_cast< int >(lldb::eDescriptionLevelBrief)));
  SWIG_Python_SetConstant(d, "eDescriptionLevelFull",SWIG_From_int(static_cast< int >(lldb::eDescriptionLevelFull)));
  SWIG_Python_SetConstant(d, "eDescriptionLevelVerbose",SWIG_From_int(static_cast< int >(lldb::eDescriptionLevelVerbose)));
  SWIG_Python_SetConstant(d, "eDescriptionLevelInitial",SWIG_From_int(static_cast< int >(lldb::eDescriptionLevelInitial)));
  SWIG_Python_SetConstant(d, "kNumDescriptionLevels",SWIG_From_int(static_cast< int >(lldb::kNumDescriptionLevels)));
  SWIG_Python_SetConstant(d, "eScriptLanguageNone",SWIG_From_int(static_cast< int >(lldb::eScriptLanguageNone)));
  SWIG_Python_SetConstant(d, "eScriptLanguagePython",SWIG_From_int(static_cast< int >(lldb::eScriptLanguagePython)));
  SWIG_Python_SetConstant(d, "eScriptLanguageDefault",SWIG_From_int(static_cast< int >(lldb::eScriptLanguageDefault)));
  SWIG_Python_SetConstant(d, "eScriptLanguageUnknown",SWIG_From_int(static_cast< int >(lldb::eScriptLanguageUnknown)));
  SWIG_Python_SetConstant(d, "eRegisterKindEHFrame",SWIG_From_int(static_cast< int >(lldb::eRegisterKindEHFrame)));
  SWIG_Python_SetConstant(d, "eRegisterKindDWARF",SWIG_From_int(static_cast< int >(lldb::eRegisterKindDWARF)));
  SWIG_Python_SetConstant(d, "eRegisterKindGeneric",SWIG_From_int(static_cast< int >(lldb::eRegisterKindGeneric)));
  SWIG_Python_SetConstant(d, "eRegisterKindProcessPlugin",SWIG_From_int(static_cast< int >(lldb::eRegisterKindProcessPlugin)));
  SWIG_Python_SetConstant(d, "eRegisterKindLLDB",SWIG_From_int(static_cast< int >(lldb::eRegisterKindLLDB)));
  SWIG_Python_SetConstant(d, "kNumRegisterKinds",SWIG_From_int(static_cast< int >(lldb::kNumRegisterKinds)));
  SWIG_Python_SetConstant(d, "eStopReasonInvalid",SWIG_From_int(static_cast< int >(lldb::eStopReasonInvalid)));
  SWIG_Python_SetConstant(d, "eStopReasonNone",SWIG_From_int(static_cast< int >(lldb::eStopReasonNone)));
  SWIG_Python_SetConstant(d, "eStopReasonTrace",SWIG_From_int(static_cast< int >(lldb::eStopReasonTrace)));
  SWIG_Python_SetConstant(d, "eStopReasonBreakpoint",SWIG_From_int(static_cast< int >(lldb::eStopReasonBreakpoint)));
  SWIG_Python_SetConstant(d, "eStopReasonWatchpoint",SWIG_From_int(static_cast< int >(lldb::eStopReasonWatchpoint)));
  SWIG_Python_SetConstant(d, "eStopReasonSignal",SWIG_From_int(static_cast< int >(lldb::eStopReasonSignal)));
  SWIG_Python_SetConstant(d, "eStopReasonException",SWIG_From_int(static_cast< int >(lldb::eStopReasonException)));
  SWIG_Python_SetConstant(d, "eStopReasonExec",SWIG_From_int(static_cast< int >(lldb::eStopReasonExec)));
  SWIG_Python_SetConstant(d, "eStopReasonPlanComplete",SWIG_From_int(static_cast< int >(lldb::eStopReasonPlanComplete)));
  SWIG_Python_SetConstant(d, "eStopReasonThreadExiting",SWIG_From_int(static_cast< int >(lldb::eStopReasonThreadExiting)));
  SWIG_Python_SetConstant(d, "eStopReasonInstrumentation",SWIG_From_int(static_cast< int >(lldb::eStopReasonInstrumentation)));
  SWIG_Python_SetConstant(d, "eReturnStatusInvalid",SWIG_From_int(static_cast< int >(lldb::eReturnStatusInvalid)));
  SWIG_Python_SetConstant(d, "eReturnStatusSuccessFinishNoResult",SWIG_From_int(static_cast< int >(lldb::eReturnStatusSuccessFinishNoResult)));
  SWIG_Python_SetConstant(d, "eReturnStatusSuccessFinishResult",SWIG_From_int(static_cast< int >(lldb::eReturnStatusSuccessFinishResult)));
  SWIG_Python_SetConstant(d, "eReturnStatusSuccessContinuingNoResult",SWIG_From_int(static_cast< int >(lldb::eReturnStatusSuccessContinuingNoResult)));
  SWIG_Python_SetConstant(d, "eReturnStatusSuccessContinuingResult",SWIG_From_int(static_cast< int >(lldb::eReturnStatusSuccessContinuingResult)));
  SWIG_Python_SetConstant(d, "eReturnStatusStarted",SWIG_From_int(static_cast< int >(lldb::eReturnStatusStarted)));
  SWIG_Python_SetConstant(d, "eReturnStatusFailed",SWIG_From_int(static_cast< int >(lldb::eReturnStatusFailed)));
  SWIG_Python_SetConstant(d, "eReturnStatusQuit",SWIG_From_int(static_cast< int >(lldb::eReturnStatusQuit)));
  SWIG_Python_SetConstant(d, "eExpressionCompleted",SWIG_From_int(static_cast< int >(lldb::eExpressionCompleted)));
  SWIG_Python_SetConstant(d, "eExpressionSetupError",SWIG_From_int(static_cast< int >(lldb::eExpressionSetupError)));
  SWIG_Python_SetConstant(d, "eExpressionParseError",SWIG_From_int(static_cast< int >(lldb::eExpressionParseError)));
  SWIG_Python_SetConstant(d, "eExpressionDiscarded",SWIG_From_int(static_cast< int >(lldb::eExpressionDiscarded)));
  SWIG_Python_SetConstant(d, "eExpressionInterrupted",SWIG_From_int(static_cast< int >(lldb::eExpressionInterrupted)));
  SWIG_Python_SetConstant(d, "eExpressionHitBreakpoint",SWIG_From_int(static_cast< int >(lldb::eExpressionHitBreakpoint)));
  SWIG_Python_SetConstant(d, "eExpressionTimedOut",SWIG_From_int(static_cast< int >(lldb::eExpressionTimedOut)));
  SWIG_Python_SetConstant(d, "eExpressionResultUnavailable",SWIG_From_int(static_cast< int >(lldb::eExpressionResultUnavailable)));
  SWIG_Python_SetConstant(d, "eExpressionStoppedForDebug",SWIG_From_int(static_cast< int >(lldb::eExpressionStoppedForDebug)));
  SWIG_Python_SetConstant(d, "eConnectionStatusSuccess",SWIG_From_int(static_cast< int >(lldb::eConnectionStatusSuccess)));
  SWIG_Python_SetConstant(d, "eConnectionStatusEndOfFile",SWIG_From_int(static_cast< int >(lldb::eConnectionStatusEndOfFile)));
  SWIG_Python_SetConstant(d, "eConnectionStatusError",SWIG_From_int(static_cast< int >(lldb::eConnectionStatusError)));
  SWIG_Python_SetConstant(d, "eConnectionStatusTimedOut",SWIG_From_int(static_cast< int >(lldb::eConnectionStatusTimedOut)));
  SWIG_Python_SetConstant(d, "eConnectionStatusNoConnection",SWIG_From_int(static_cast< int >(lldb::eConnectionStatusNoConnection)));
  SWIG_Python_SetConstant(d, "eConnectionStatusLostConnection",SWIG_From_int(static_cast< int >(lldb::eConnectionStatusLostConnection)));
  SWIG_Python_SetConstant(d, "eConnectionStatusInterrupted",SWIG_From_int(static_cast< int >(lldb::eConnectionStatusInterrupted)));
  SWIG_Python_SetConstant(d, "eErrorTypeInvalid",SWIG_From_int(static_cast< int >(lldb::eErrorTypeInvalid)));
  SWIG_Python_SetConstant(d, "eErrorTypeGeneric",SWIG_From_int(static_cast< int >(lldb::eErrorTypeGeneric)));
  SWIG_Python_SetConstant(d, "eErrorTypeMachKernel",SWIG_From_int(static_cast< int >(lldb::eErrorTypeMachKernel)));
  SWIG_Python_SetConstant(d, "eErrorTypePOSIX",SWIG_From_int(static_cast< int >(lldb::eErrorTypePOSIX)));
  SWIG_Python_SetConstant(d, "eErrorTypeExpression",SWIG_From_int(static_cast< int >(lldb::eErrorTypeExpression)));
  SWIG_Python_SetConstant(d, "eErrorTypeWin32",SWIG_From_int(static_cast< int >(lldb::eErrorTypeWin32)));
  SWIG_Python_SetConstant(d, "eValueTypeInvalid",SWIG_From_int(static_cast< int >(lldb::eValueTypeInvalid)));
  SWIG_Python_SetConstant(d, "eValueTypeVariableGlobal",SWIG_From_int(static_cast< int >(lldb::eValueTypeVariableGlobal)));
  SWIG_Python_SetConstant(d, "eValueTypeVariableStatic",SWIG_From_int(static_cast< int >(lldb::eValueTypeVariableStatic)));
  SWIG_Python_SetConstant(d, "eValueTypeVariableArgument",SWIG_From_int(static_cast< int >(lldb::eValueTypeVariableArgument)));
  SWIG_Python_SetConstant(d, "eValueTypeVariableLocal",SWIG_From_int(static_cast< int >(lldb::eValueTypeVariableLocal)));
  SWIG_Python_SetConstant(d, "eValueTypeRegister",SWIG_From_int(static_cast< int >(lldb::eValueTypeRegister)));
  SWIG_Python_SetConstant(d, "eValueTypeRegisterSet",SWIG_From_int(static_cast< int >(lldb::eValueTypeRegisterSet)));
  SWIG_Python_SetConstant(d, "eValueTypeConstResult",SWIG_From_int(static_cast< int >(lldb::eValueTypeConstResult)));
  SWIG_Python_SetConstant(d, "eValueTypeVariableThreadLocal",SWIG_From_int(static_cast< int >(lldb::eValueTypeVariableThreadLocal)));
  SWIG_Python_SetConstant(d, "eInputReaderGranularityInvalid",SWIG_From_int(static_cast< int >(lldb::eInputReaderGranularityInvalid)));
  SWIG_Python_SetConstant(d, "eInputReaderGranularityByte",SWIG_From_int(static_cast< int >(lldb::eInputReaderGranularityByte)));
  SWIG_Python_SetConstant(d, "eInputReaderGranularityWord",SWIG_From_int(static_cast< int >(lldb::eInputReaderGranularityWord)));
  SWIG_Python_SetConstant(d, "eInputReaderGranularityLine",SWIG_From_int(static_cast< int >(lldb::eInputReaderGranularityLine)));
  SWIG_Python_SetConstant(d, "eInputReaderGranularityAll",SWIG_From_int(static_cast< int >(lldb::eInputReaderGranularityAll)));
  SWIG_Python_SetConstant(d, "eSymbolContextTarget",SWIG_From_int(static_cast< int >(lldb::eSymbolContextTarget)));
  SWIG_Python_SetConstant(d, "eSymbolContextModule",SWIG_From_int(static_cast< int >(lldb::eSymbolContextModule)));
  SWIG_Python_SetConstant(d, "eSymbolContextCompUnit",SWIG_From_int(static_cast< int >(lldb::eSymbolContextCompUnit)));
  SWIG_Python_SetConstant(d, "eSymbolContextFunction",SWIG_From_int(static_cast< int >(lldb::eSymbolContextFunction)));
  SWIG_Python_SetConstant(d, "eSymbolContextBlock",SWIG_From_int(static_cast< int >(lldb::eSymbolContextBlock)));
  SWIG_Python_SetConstant(d, "eSymbolContextLineEntry",SWIG_From_int(static_cast< int >(lldb::eSymbolContextLineEntry)));
  SWIG_Python_SetConstant(d, "eSymbolContextSymbol",SWIG_From_int(static_cast< int >(lldb::eSymbolContextSymbol)));
  SWIG_Python_SetConstant(d, "eSymbolContextEverything",SWIG_From_int(static_cast< int >(lldb::eSymbolContextEverything)));
  SWIG_Python_SetConstant(d, "eSymbolContextVariable",SWIG_From_int(static_cast< int >(lldb::eSymbolContextVariable)));
  SWIG_Python_SetConstant(d, "ePermissionsWritable",SWIG_From_int(static_cast< int >(lldb::ePermissionsWritable)));
  SWIG_Python_SetConstant(d, "ePermissionsReadable",SWIG_From_int(static_cast< int >(lldb::ePermissionsReadable)));
  SWIG_Python_SetConstant(d, "ePermissionsExecutable",SWIG_From_int(static_cast< int >(lldb::ePermissionsExecutable)));
  SWIG_Python_SetConstant(d, "eInputReaderActivate",SWIG_From_int(static_cast< int >(lldb::eInputReaderActivate)));
  SWIG_Python_SetConstant(d, "eInputReaderAsynchronousOutputWritten",SWIG_From_int(static_cast< int >(lldb::eInputReaderAsynchronousOutputWritten)));
  SWIG_Python_SetConstant(d, "eInputReaderReactivate",SWIG_From_int(static_cast< int >(lldb::eInputReaderReactivate)));
  SWIG_Python_SetConstant(d, "eInputReaderDeactivate",SWIG_From_int(static_cast< int >(lldb::eInputReaderDeactivate)));
  SWIG_Python_SetConstant(d, "eInputReaderGotToken",SWIG_From_int(static_cast< int >(lldb::eInputReaderGotToken)));
  SWIG_Python_SetConstant(d, "eInputReaderInterrupt",SWIG_From_int(static_cast< int >(lldb::eInputReaderInterrupt)));
  SWIG_Python_SetConstant(d, "eInputReaderEndOfFile",SWIG_From_int(static_cast< int >(lldb::eInputReaderEndOfFile)));
  SWIG_Python_SetConstant(d, "eInputReaderDone",SWIG_From_int(static_cast< int >(lldb::eInputReaderDone)));
  SWIG_Python_SetConstant(d, "eBreakpointEventTypeInvalidType",SWIG_From_int(static_cast< int >(lldb::eBreakpointEventTypeInvalidType)));
  SWIG_Python_SetConstant(d, "eBreakpointEventTypeAdded",SWIG_From_int(static_cast< int >(lldb::eBreakpointEventTypeAdded)));
  SWIG_Python_SetConstant(d, "eBreakpointEventTypeRemoved",SWIG_From_int(static_cast< int >(lldb::eBreakpointEventTypeRemoved)));
  SWIG_Python_SetConstant(d, "eBreakpointEventTypeLocationsAdded",SWIG_From_int(static_cast< int >(lldb::eBreakpointEventTypeLocationsAdded)));
  SWIG_Python_SetConstant(d, "eBreakpointEventTypeLocationsRemoved",SWIG_From_int(static_cast< int >(lldb::eBreakpointEventTypeLocationsRemoved)));
  SWIG_Python_SetConstant(d, "eBreakpointEventTypeLocationsResolved",SWIG_From_int(static_cast< int >(lldb::eBreakpointEventTypeLocationsResolved)));
  SWIG_Python_SetConstant(d, "eBreakpointEventTypeEnabled",SWIG_From_int(static_cast< int >(lldb::eBreakpointEventTypeEnabled)));
  SWIG_Python_SetConstant(d, "eBreakpointEventTypeDisabled",SWIG_From_int(static_cast< int >(lldb::eBreakpointEventTypeDisabled)));
  SWIG_Python_SetConstant(d, "eBreakpointEventTypeCommandChanged",SWIG_From_int(static_cast< int >(lldb::eBreakpointEventTypeCommandChanged)));
  SWIG_Python_SetConstant(d, "eBreakpointEventTypeConditionChanged",SWIG_From_int(static_cast< int >(lldb::eBreakpointEventTypeConditionChanged)));
  SWIG_Python_SetConstant(d, "eBreakpointEventTypeIgnoreChanged",SWIG_From_int(static_cast< int >(lldb::eBreakpointEventTypeIgnoreChanged)));
  SWIG_Python_SetConstant(d, "eBreakpointEventTypeThreadChanged",SWIG_From_int(static_cast< int >(lldb::eBreakpointEventTypeThreadChanged)));
  SWIG_Python_SetConstant(d, "eBreakpointEventTypeAutoContinueChanged",SWIG_From_int(static_cast< int >(lldb::eBreakpointEventTypeAutoContinueChanged)));
  SWIG_Python_SetConstant(d, "eWatchpointEventTypeInvalidType",SWIG_From_int(static_cast< int >(lldb::eWatchpointEventTypeInvalidType)));
  SWIG_Python_SetConstant(d, "eWatchpointEventTypeAdded",SWIG_From_int(static_cast< int >(lldb::eWatchpointEventTypeAdded)));
  SWIG_Python_SetConstant(d, "eWatchpointEventTypeRemoved",SWIG_From_int(static_cast< int >(lldb::eWatchpointEventTypeRemoved)));
  SWIG_Python_SetConstant(d, "eWatchpointEventTypeEnabled",SWIG_From_int(static_cast< int >(lldb::eWatchpointEventTypeEnabled)));
  SWIG_Python_SetConstant(d, "eWatchpointEventTypeDisabled",SWIG_From_int(static_cast< int >(lldb::eWatchpointEventTypeDisabled)));
  SWIG_Python_SetConstant(d, "eWatchpointEventTypeCommandChanged",SWIG_From_int(static_cast< int >(lldb::eWatchpointEventTypeCommandChanged)));
  SWIG_Python_SetConstant(d, "eWatchpointEventTypeConditionChanged",SWIG_From_int(static_cast< int >(lldb::eWatchpointEventTypeConditionChanged)));
  SWIG_Python_SetConstant(d, "eWatchpointEventTypeIgnoreChanged",SWIG_From_int(static_cast< int >(lldb::eWatchpointEventTypeIgnoreChanged)));
  SWIG_Python_SetConstant(d, "eWatchpointEventTypeThreadChanged",SWIG_From_int(static_cast< int >(lldb::eWatchpointEventTypeThreadChanged)));
  SWIG_Python_SetConstant(d, "eWatchpointEventTypeTypeChanged",SWIG_From_int(static_cast< int >(lldb::eWatchpointEventTypeTypeChanged)));
  SWIG_Python_SetConstant(d, "eLanguageTypeUnknown",SWIG_From_int(static_cast< int >(lldb::eLanguageTypeUnknown)));
  SWIG_Python_SetConstant(d, "eLanguageTypeC89",SWIG_From_int(static_cast< int >(lldb::eLanguageTypeC89)));
  SWIG_Python_SetConstant(d, "eLanguageTypeC",SWIG_From_int(static_cast< int >(lldb::eLanguageTypeC)));
  SWIG_Python_SetConstant(d, "eLanguageTypeAda83",SWIG_From_int(static_cast< int >(lldb::eLanguageTypeAda83)));
  SWIG_Python_SetConstant(d, "eLanguageTypeC_plus_plus",SWIG_From_int(static_cast< int >(lldb::eLanguageTypeC_plus_plus)));
  SWIG_Python_SetConstant(d, "eLanguageTypeCobol74",SWIG_From_int(static_cast< int >(lldb::eLanguageTypeCobol74)));
  SWIG_Python_SetConstant(d, "eLanguageTypeCobol85",SWIG_From_int(static_cast< int >(lldb::eLanguageTypeCobol85)));
  SWIG_Python_SetConstant(d, "eLanguageTypeFortran77",SWIG_From_int(static_cast< int >(lldb::eLanguageTypeFortran77)));
  SWIG_Python_SetConstant(d, "eLanguageTypeFortran90",SWIG_From_int(static_cast< int >(lldb::eLanguageTypeFortran90)));
  SWIG_Python_SetConstant(d, "eLanguageTypePascal83",SWIG_From_int(static_cast< int >(lldb::eLanguageTypePascal83)));
  SWIG_Python_SetConstant(d, "eLanguageTypeModula2",SWIG_From_int(static_cast< int >(lldb::eLanguageTypeModula2)));
  SWIG_Python_SetConstant(d, "eLanguageTypeJava",SWIG_From_int(static_cast< int >(lldb::eLanguageTypeJava)));
  SWIG_Python_SetConstant(d, "eLanguageTypeC99",SWIG_From_int(static_cast< int >(lldb::eLanguageTypeC99)));
  SWIG_Python_SetConstant(d, "eLanguageTypeAda95",SWIG_From_int(static_cast< int >(lldb::eLanguageTypeAda95)));
  SWIG_Python_SetConstant(d, "eLanguageTypeFortran95",SWIG_From_int(static_cast< int >(lldb::eLanguageTypeFortran95)));
  SWIG_Python_SetConstant(d, "eLanguageTypePLI",SWIG_From_int(static_cast< int >(lldb::eLanguageTypePLI)));
  SWIG_Python_SetConstant(d, "eLanguageTypeObjC",SWIG_From_int(static_cast< int >(lldb::eLanguageTypeObjC)));
  SWIG_Python_SetConstant(d, "eLanguageTypeObjC_plus_plus",SWIG_From_int(static_cast< int >(lldb::eLanguageTypeObjC_plus_plus)));
  SWIG_Python_SetConstant(d, "eLanguageTypeUPC",SWIG_From_int(static_cast< int >(lldb::eLanguageTypeUPC)));
  SWIG_Python_SetConstant(d, "eLanguageTypeD",SWIG_From_int(static_cast< int >(lldb::eLanguageTypeD)));
  SWIG_Python_SetConstant(d, "eLanguageTypePython",SWIG_From_int(static_cast< int >(lldb::eLanguageTypePython)));
  SWIG_Python_SetConstant(d, "eLanguageTypeOpenCL",SWIG_From_int(static_cast< int >(lldb::eLanguageTypeOpenCL)));
  SWIG_Python_SetConstant(d, "eLanguageTypeGo",SWIG_From_int(static_cast< int >(lldb::eLanguageTypeGo)));
  SWIG_Python_SetConstant(d, "eLanguageTypeModula3",SWIG_From_int(static_cast< int >(lldb::eLanguageTypeModula3)));
  SWIG_Python_SetConstant(d, "eLanguageTypeHaskell",SWIG_From_int(static_cast< int >(lldb::eLanguageTypeHaskell)));
  SWIG_Python_SetConstant(d, "eLanguageTypeC_plus_plus_03",SWIG_From_int(static_cast< int >(lldb::eLanguageTypeC_plus_plus_03)));
  SWIG_Python_SetConstant(d, "eLanguageTypeC_plus_plus_11",SWIG_From_int(static_cast< int >(lldb::eLanguageTypeC_plus_plus_11)));
  SWIG_Python_SetConstant(d, "eLanguageTypeOCaml",SWIG_From_int(static_cast< int >(lldb::eLanguageTypeOCaml)));
  SWIG_Python_SetConstant(d, "eLanguageTypeRust",SWIG_From_int(static_cast< int >(lldb::eLanguageTypeRust)));
  SWIG_Python_SetConstant(d, "eLanguageTypeC11",SWIG_From_int(static_cast< int >(lldb::eLanguageTypeC11)));
  SWIG_Python_SetConstant(d, "eLanguageTypeSwift",SWIG_From_int(static_cast< int >(lldb::eLanguageTypeSwift)));
  SWIG_Python_SetConstant(d, "eLanguageTypeJulia",SWIG_From_int(static_cast< int >(lldb::eLanguageTypeJulia)));
  SWIG_Python_SetConstant(d, "eLanguageTypeDylan",SWIG_From_int(static_cast< int >(lldb::eLanguageTypeDylan)));
  SWIG_Python_SetConstant(d, "eLanguageTypeC_plus_plus_14",SWIG_From_int(static_cast< int >(lldb::eLanguageTypeC_plus_plus_14)));
  SWIG_Python_SetConstant(d, "eLanguageTypeFortran03",SWIG_From_int(static_cast< int >(lldb::eLanguageTypeFortran03)));
  SWIG_Python_SetConstant(d, "eLanguageTypeFortran08",SWIG_From_int(static_cast< int >(lldb::eLanguageTypeFortran08)));
  SWIG_Python_SetConstant(d, "eLanguageTypeMipsAssembler",SWIG_From_int(static_cast< int >(lldb::eLanguageTypeMipsAssembler)));
  SWIG_Python_SetConstant(d, "eLanguageTypeExtRenderScript",SWIG_From_int(static_cast< int >(lldb::eLanguageTypeExtRenderScript)));
  SWIG_Python_SetConstant(d, "eNumLanguageTypes",SWIG_From_int(static_cast< int >(lldb::eNumLanguageTypes)));
  SWIG_Python_SetConstant(d, "eInstrumentationRuntimeTypeAddressSanitizer",SWIG_From_int(static_cast< int >(lldb::eInstrumentationRuntimeTypeAddressSanitizer)));
  SWIG_Python_SetConstant(d, "eInstrumentationRuntimeTypeThreadSanitizer",SWIG_From_int(static_cast< int >(lldb::eInstrumentationRuntimeTypeThreadSanitizer)));
  SWIG_Python_SetConstant(d, "eInstrumentationRuntimeTypeUndefinedBehaviorSanitizer",SWIG_From_int(static_cast< int >(lldb::eInstrumentationRuntimeTypeUndefinedBehaviorSanitizer)));
  SWIG_Python_SetConstant(d, "eInstrumentationRuntimeTypeMainThreadChecker",SWIG_From_int(static_cast< int >(lldb::eInstrumentationRuntimeTypeMainThreadChecker)));
  SWIG_Python_SetConstant(d, "eInstrumentationRuntimeTypeSwiftRuntimeReporting",SWIG_From_int(static_cast< int >(lldb::eInstrumentationRuntimeTypeSwiftRuntimeReporting)));
  SWIG_Python_SetConstant(d, "eNumInstrumentationRuntimeTypes",SWIG_From_int(static_cast< int >(lldb::eNumInstrumentationRuntimeTypes)));
  SWIG_Python_SetConstant(d, "eNoDynamicValues",SWIG_From_int(static_cast< int >(lldb::eNoDynamicValues)));
  SWIG_Python_SetConstant(d, "eDynamicCanRunTarget",SWIG_From_int(static_cast< int >(lldb::eDynamicCanRunTarget)));
  SWIG_Python_SetConstant(d, "eDynamicDontRunTarget",SWIG_From_int(static_cast< int >(lldb::eDynamicDontRunTarget)));
  SWIG_Python_SetConstant(d, "eStopShowColumnAnsiOrCaret",SWIG_From_int(static_cast< int >(lldb::eStopShowColumnAnsiOrCaret)));
  SWIG_Python_SetConstant(d, "eStopShowColumnAnsi",SWIG_From_int(static_cast< int >(lldb::eStopShowColumnAnsi)));
  SWIG_Python_SetConstant(d, "eStopShowColumnCaret",SWIG_From_int(static_cast< int >(lldb::eStopShowColumnCaret)));
  SWIG_Python_SetConstant(d, "eStopShowColumnNone",SWIG_From_int(static_cast< int >(lldb::eStopShowColumnNone)));
  SWIG_Python_SetConstant(d, "eAccessNone",SWIG_From_int(static_cast< int >(lldb::eAccessNone)));
  SWIG_Python_SetConstant(d, "eAccessPublic",SWIG_From_int(static_cast< int >(lldb::eAccessPublic)));
  SWIG_Python_SetConstant(d, "eAccessPrivate",SWIG_From_int(static_cast< int >(lldb::eAccessPrivate)));
  SWIG_Python_SetConstant(d, "eAccessProtected",SWIG_From_int(static_cast< int >(lldb::eAccessProtected)));
  SWIG_Python_SetConstant(d, "eAccessPackage",SWIG_From_int(static_cast< int >(lldb::eAccessPackage)));
  SWIG_Python_SetConstant(d, "eArgTypeAddress",SWIG_From_int(static_cast< int >(lldb::eArgTypeAddress)));
  SWIG_Python_SetConstant(d, "eArgTypeAddressOrExpression",SWIG_From_int(static_cast< int >(lldb::eArgTypeAddressOrExpression)));
  SWIG_Python_SetConstant(d, "eArgTypeAliasName",SWIG_From_int(static_cast< int >(lldb::eArgTypeAliasName)));
  SWIG_Python_SetConstant(d, "eArgTypeAliasOptions",SWIG_From_int(static_cast< int >(lldb::eArgTypeAliasOptions)));
  SWIG_Python_SetConstant(d, "eArgTypeArchitecture",SWIG_From_int(static_cast< int >(lldb::eArgTypeArchitecture)));
  SWIG_Python_SetConstant(d, "eArgTypeBoolean",SWIG_From_int(static_cast< int >(lldb::eArgTypeBoolean)));
  SWIG_Python_SetConstant(d, "eArgTypeBreakpointID",SWIG_From_int(static_cast< int >(lldb::eArgTypeBreakpointID)));
  SWIG_Python_SetConstant(d, "eArgTypeBreakpointIDRange",SWIG_From_int(static_cast< int >(lldb::eArgTypeBreakpointIDRange)));
  SWIG_Python_SetConstant(d, "eArgTypeBreakpointName",SWIG_From_int(static_cast< int >(lldb::eArgTypeBreakpointName)));
  SWIG_Python_SetConstant(d, "eArgTypeByteSize",SWIG_From_int(static_cast< int >(lldb::eArgTypeByteSize)));
  SWIG_Python_SetConstant(d, "eArgTypeClassName",SWIG_From_int(static_cast< int >(lldb::eArgTypeClassName)));
  SWIG_Python_SetConstant(d, "eArgTypeCommandName",SWIG_From_int(static_cast< int >(lldb::eArgTypeCommandName)));
  SWIG_Python_SetConstant(d, "eArgTypeCount",SWIG_From_int(static_cast< int >(lldb::eArgTypeCount)));
  SWIG_Python_SetConstant(d, "eArgTypeDescriptionVerbosity",SWIG_From_int(static_cast< int >(lldb::eArgTypeDescriptionVerbosity)));
  SWIG_Python_SetConstant(d, "eArgTypeDirectoryName",SWIG_From_int(static_cast< int >(lldb::eArgTypeDirectoryName)));
  SWIG_Python_SetConstant(d, "eArgTypeDisassemblyFlavor",SWIG_From_int(static_cast< int >(lldb::eArgTypeDisassemblyFlavor)));
  SWIG_Python_SetConstant(d, "eArgTypeEndAddress",SWIG_From_int(static_cast< int >(lldb::eArgTypeEndAddress)));
  SWIG_Python_SetConstant(d, "eArgTypeExpression",SWIG_From_int(static_cast< int >(lldb::eArgTypeExpression)));
  SWIG_Python_SetConstant(d, "eArgTypeExpressionPath",SWIG_From_int(static_cast< int >(lldb::eArgTypeExpressionPath)));
  SWIG_Python_SetConstant(d, "eArgTypeExprFormat",SWIG_From_int(static_cast< int >(lldb::eArgTypeExprFormat)));
  SWIG_Python_SetConstant(d, "eArgTypeFilename",SWIG_From_int(static_cast< int >(lldb::eArgTypeFilename)));
  SWIG_Python_SetConstant(d, "eArgTypeFormat",SWIG_From_int(static_cast< int >(lldb::eArgTypeFormat)));
  SWIG_Python_SetConstant(d, "eArgTypeFrameIndex",SWIG_From_int(static_cast< int >(lldb::eArgTypeFrameIndex)));
  SWIG_Python_SetConstant(d, "eArgTypeFullName",SWIG_From_int(static_cast< int >(lldb::eArgTypeFullName)));
  SWIG_Python_SetConstant(d, "eArgTypeFunctionName",SWIG_From_int(static_cast< int >(lldb::eArgTypeFunctionName)));
  SWIG_Python_SetConstant(d, "eArgTypeFunctionOrSymbol",SWIG_From_int(static_cast< int >(lldb::eArgTypeFunctionOrSymbol)));
  SWIG_Python_SetConstant(d, "eArgTypeGDBFormat",SWIG_From_int(static_cast< int >(lldb::eArgTypeGDBFormat)));
  SWIG_Python_SetConstant(d, "eArgTypeHelpText",SWIG_From_int(static_cast< int >(lldb::eArgTypeHelpText)));
  SWIG_Python_SetConstant(d, "eArgTypeIndex",SWIG_From_int(static_cast< int >(lldb::eArgTypeIndex)));
  SWIG_Python_SetConstant(d, "eArgTypeLanguage",SWIG_From_int(static_cast< int >(lldb::eArgTypeLanguage)));
  SWIG_Python_SetConstant(d, "eArgTypeLineNum",SWIG_From_int(static_cast< int >(lldb::eArgTypeLineNum)));
  SWIG_Python_SetConstant(d, "eArgTypeLogCategory",SWIG_From_int(static_cast< int >(lldb::eArgTypeLogCategory)));
  SWIG_Python_SetConstant(d, "eArgTypeLogChannel",SWIG_From_int(static_cast< int >(lldb::eArgTypeLogChannel)));
  SWIG_Python_SetConstant(d, "eArgTypeMethod",SWIG_From_int(static_cast< int >(lldb::eArgTypeMethod)));
  SWIG_Python_SetConstant(d, "eArgTypeName",SWIG_From_int(static_cast< int >(lldb::eArgTypeName)));
  SWIG_Python_SetConstant(d, "eArgTypeNewPathPrefix",SWIG_From_int(static_cast< int >(lldb::eArgTypeNewPathPrefix)));
  SWIG_Python_SetConstant(d, "eArgTypeNumLines",SWIG_From_int(static_cast< int >(lldb::eArgTypeNumLines)));
  SWIG_Python_SetConstant(d, "eArgTypeNumberPerLine",SWIG_From_int(static_cast< int >(lldb::eArgTypeNumberPerLine)));
  SWIG_Python_SetConstant(d, "eArgTypeOffset",SWIG_From_int(static_cast< int >(lldb::eArgTypeOffset)));
  SWIG_Python_SetConstant(d, "eArgTypeOldPathPrefix",SWIG_From_int(static_cast< int >(lldb::eArgTypeOldPathPrefix)));
  SWIG_Python_SetConstant(d, "eArgTypeOneLiner",SWIG_From_int(static_cast< int >(lldb::eArgTypeOneLiner)));
  SWIG_Python_SetConstant(d, "eArgTypePath",SWIG_From_int(static_cast< int >(lldb::eArgTypePath)));
  SWIG_Python_SetConstant(d, "eArgTypePermissionsNumber",SWIG_From_int(static_cast< int >(lldb::eArgTypePermissionsNumber)));
  SWIG_Python_SetConstant(d, "eArgTypePermissionsString",SWIG_From_int(static_cast< int >(lldb::eArgTypePermissionsString)));
  SWIG_Python_SetConstant(d, "eArgTypePid",SWIG_From_int(static_cast< int >(lldb::eArgTypePid)));
  SWIG_Python_SetConstant(d, "eArgTypePlugin",SWIG_From_int(static_cast< int >(lldb::eArgTypePlugin)));
  SWIG_Python_SetConstant(d, "eArgTypeProcessName",SWIG_From_int(static_cast< int >(lldb::eArgTypeProcessName)));
  SWIG_Python_SetConstant(d, "eArgTypePythonClass",SWIG_From_int(static_cast< int >(lldb::eArgTypePythonClass)));
  SWIG_Python_SetConstant(d, "eArgTypePythonFunction",SWIG_From_int(static_cast< int >(lldb::eArgTypePythonFunction)));
  SWIG_Python_SetConstant(d, "eArgTypePythonScript",SWIG_From_int(static_cast< int >(lldb::eArgTypePythonScript)));
  SWIG_Python_SetConstant(d, "eArgTypeQueueName",SWIG_From_int(static_cast< int >(lldb::eArgTypeQueueName)));
  SWIG_Python_SetConstant(d, "eArgTypeRegisterName",SWIG_From_int(static_cast< int >(lldb::eArgTypeRegisterName)));
  SWIG_Python_SetConstant(d, "eArgTypeRegularExpression",SWIG_From_int(static_cast< int >(lldb::eArgTypeRegularExpression)));
  SWIG_Python_SetConstant(d, "eArgTypeRunArgs",SWIG_From_int(static_cast< int >(lldb::eArgTypeRunArgs)));
  SWIG_Python_SetConstant(d, "eArgTypeRunMode",SWIG_From_int(static_cast< int >(lldb::eArgTypeRunMode)));
  SWIG_Python_SetConstant(d, "eArgTypeScriptedCommandSynchronicity",SWIG_From_int(static_cast< int >(lldb::eArgTypeScriptedCommandSynchronicity)));
  SWIG_Python_SetConstant(d, "eArgTypeScriptLang",SWIG_From_int(static_cast< int >(lldb::eArgTypeScriptLang)));
  SWIG_Python_SetConstant(d, "eArgTypeSearchWord",SWIG_From_int(static_cast< int >(lldb::eArgTypeSearchWord)));
  SWIG_Python_SetConstant(d, "eArgTypeSelector",SWIG_From_int(static_cast< int >(lldb::eArgTypeSelector)));
  SWIG_Python_SetConstant(d, "eArgTypeSettingIndex",SWIG_From_int(static_cast< int >(lldb::eArgTypeSettingIndex)));
  SWIG_Python_SetConstant(d, "eArgTypeSettingKey",SWIG_From_int(static_cast< int >(lldb::eArgTypeSettingKey)));
  SWIG_Python_SetConstant(d, "eArgTypeSettingPrefix",SWIG_From_int(static_cast< int >(lldb::eArgTypeSettingPrefix)));
  SWIG_Python_SetConstant(d, "eArgTypeSettingVariableName",SWIG_From_int(static_cast< int >(lldb::eArgTypeSettingVariableName)));
  SWIG_Python_SetConstant(d, "eArgTypeShlibName",SWIG_From_int(static_cast< int >(lldb::eArgTypeShlibName)));
  SWIG_Python_SetConstant(d, "eArgTypeSourceFile",SWIG_From_int(static_cast< int >(lldb::eArgTypeSourceFile)));
  SWIG_Python_SetConstant(d, "eArgTypeSortOrder",SWIG_From_int(static_cast< int >(lldb::eArgTypeSortOrder)));
  SWIG_Python_SetConstant(d, "eArgTypeStartAddress",SWIG_From_int(static_cast< int >(lldb::eArgTypeStartAddress)));
  SWIG_Python_SetConstant(d, "eArgTypeSummaryString",SWIG_From_int(static_cast< int >(lldb::eArgTypeSummaryString)));
  SWIG_Python_SetConstant(d, "eArgTypeSymbol",SWIG_From_int(static_cast< int >(lldb::eArgTypeSymbol)));
  SWIG_Python_SetConstant(d, "eArgTypeThreadID",SWIG_From_int(static_cast< int >(lldb::eArgTypeThreadID)));
  SWIG_Python_SetConstant(d, "eArgTypeThreadIndex",SWIG_From_int(static_cast< int >(lldb::eArgTypeThreadIndex)));
  SWIG_Python_SetConstant(d, "eArgTypeThreadName",SWIG_From_int(static_cast< int >(lldb::eArgTypeThreadName)));
  SWIG_Python_SetConstant(d, "eArgTypeTypeName",SWIG_From_int(static_cast< int >(lldb::eArgTypeTypeName)));
  SWIG_Python_SetConstant(d, "eArgTypeUnsignedInteger",SWIG_From_int(static_cast< int >(lldb::eArgTypeUnsignedInteger)));
  SWIG_Python_SetConstant(d, "eArgTypeUnixSignal",SWIG_From_int(static_cast< int >(lldb::eArgTypeUnixSignal)));
  SWIG_Python_SetConstant(d, "eArgTypeVarName",SWIG_From_int(static_cast< int >(lldb::eArgTypeVarName)));
  SWIG_Python_SetConstant(d, "eArgTypeValue",SWIG_From_int(static_cast< int >(lldb::eArgTypeValue)));
  SWIG_Python_SetConstant(d, "eArgTypeWidth",SWIG_From_int(static_cast< int >(lldb::eArgTypeWidth)));
  SWIG_Python_SetConstant(d, "eArgTypeNone",SWIG_From_int(static_cast< int >(lldb::eArgTypeNone)));
  SWIG_Python_SetConstant(d, "eArgTypePlatform",SWIG_From_int(static_cast< int >(lldb::eArgTypePlatform)));
  SWIG_Python_SetConstant(d, "eArgTypeWatchpointID",SWIG_From_int(static_cast< int >(lldb::eArgTypeWatchpointID)));
  SWIG_Python_SetConstant(d, "eArgTypeWatchpointIDRange",SWIG_From_int(static_cast< int >(lldb::eArgTypeWatchpointIDRange)));
  SWIG_Python_SetConstant(d, "eArgTypeWatchType",SWIG_From_int(static_cast< int >(lldb::eArgTypeWatchType)));
  SWIG_Python_SetConstant(d, "eArgRawInput",SWIG_From_int(static_cast< int >(lldb::eArgRawInput)));
  SWIG_Python_SetConstant(d, "eArgTypeCommand",SWIG_From_int(static_cast< int >(lldb::eArgTypeCommand)));
  SWIG_Python_SetConstant(d, "eArgTypeLastArg",SWIG_From_int(static_cast< int >(lldb::eArgTypeLastArg)));
  SWIG_Python_SetConstant(d, "eSymbolTypeAny",SWIG_From_int(static_cast< int >(lldb::eSymbolTypeAny)));
  SWIG_Python_SetConstant(d, "eSymbolTypeInvalid",SWIG_From_int(static_cast< int >(lldb::eSymbolTypeInvalid)));
  SWIG_Python_SetConstant(d, "eSymbolTypeAbsolute",SWIG_From_int(static_cast< int >(lldb::eSymbolTypeAbsolute)));
  SWIG_Python_SetConstant(d, "eSymbolTypeCode",SWIG_From_int(static_cast< int >(lldb::eSymbolTypeCode)));
  SWIG_Python_SetConstant(d, "eSymbolTypeResolver",SWIG_From_int(static_cast< int >(lldb::eSymbolTypeResolver)));
  SWIG_Python_SetConstant(d, "eSymbolTypeData",SWIG_From_int(static_cast< int >(lldb::eSymbolTypeData)));
  SWIG_Python_SetConstant(d, "eSymbolTypeTrampoline",SWIG_From_int(static_cast< int >(lldb::eSymbolTypeTrampoline)));
  SWIG_Python_SetConstant(d, "eSymbolTypeRuntime",SWIG_From_int(static_cast< int >(lldb::eSymbolTypeRuntime)));
  SWIG_Python_SetConstant(d, "eSymbolTypeException",SWIG_From_int(static_cast< int >(lldb::eSymbolTypeException)));
  SWIG_Python_SetConstant(d, "eSymbolTypeSourceFile",SWIG_From_int(static_cast< int >(lldb::eSymbolTypeSourceFile)));
  SWIG_Python_SetConstant(d, "eSymbolTypeHeaderFile",SWIG_From_int(static_cast< int >(lldb::eSymbolTypeHeaderFile)));
  SWIG_Python_SetConstant(d, "eSymbolTypeObjectFile",SWIG_From_int(static_cast< int >(lldb::eSymbolTypeObjectFile)));
  SWIG_Python_SetConstant(d, "eSymbolTypeCommonBlock",SWIG_From_int(static_cast< int >(lldb::eSymbolTypeCommonBlock)));
  SWIG_Python_SetConstant(d, "eSymbolTypeBlock",SWIG_From_int(static_cast< int >(lldb::eSymbolTypeBlock)));
  SWIG_Python_SetConstant(d, "eSymbolTypeLocal",SWIG_From_int(static_cast< int >(lldb::eSymbolTypeLocal)));
  SWIG_Python_SetConstant(d, "eSymbolTypeParam",SWIG_From_int(static_cast< int >(lldb::eSymbolTypeParam)));
  SWIG_Python_SetConstant(d, "eSymbolTypeVariable",SWIG_From_int(static_cast< int >(lldb::eSymbolTypeVariable)));
  SWIG_Python_SetConstant(d, "eSymbolTypeVariableType",SWIG_From_int(static_cast< int >(lldb::eSymbolTypeVariableType)));
  SWIG_Python_SetConstant(d, "eSymbolTypeLineEntry",SWIG_From_int(static_cast< int >(lldb::eSymbolTypeLineEntry)));
  SWIG_Python_SetConstant(d, "eSymbolTypeLineHeader",SWIG_From_int(static_cast< int >(lldb::eSymbolTypeLineHeader)));
  SWIG_Python_SetConstant(d, "eSymbolTypeScopeBegin",SWIG_From_int(static_cast< int >(lldb::eSymbolTypeScopeBegin)));
  SWIG_Python_SetConstant(d, "eSymbolTypeScopeEnd",SWIG_From_int(static_cast< int >(lldb::eSymbolTypeScopeEnd)));
  SWIG_Python_SetConstant(d, "eSymbolTypeAdditional",SWIG_From_int(static_cast< int >(lldb::eSymbolTypeAdditional)));
  SWIG_Python_SetConstant(d, "eSymbolTypeCompiler",SWIG_From_int(static_cast< int >(lldb::eSymbolTypeCompiler)));
  SWIG_Python_SetConstant(d, "eSymbolTypeInstrumentation",SWIG_From_int(static_cast< int >(lldb::eSymbolTypeInstrumentation)));
  SWIG_Python_SetConstant(d, "eSymbolTypeUndefined",SWIG_From_int(static_cast< int >(lldb::eSymbolTypeUndefined)));
  SWIG_Python_SetConstant(d, "eSymbolTypeObjCClass",SWIG_From_int(static_cast< int >(lldb::eSymbolTypeObjCClass)));
  SWIG_Python_SetConstant(d, "eSymbolTypeObjCMetaClass",SWIG_From_int(static_cast< int >(lldb::eSymbolTypeObjCMetaClass)));
  SWIG_Python_SetConstant(d, "eSymbolTypeObjCIVar",SWIG_From_int(static_cast< int >(lldb::eSymbolTypeObjCIVar)));
  SWIG_Python_SetConstant(d, "eSymbolTypeIVarOffset",SWIG_From_int(static_cast< int >(lldb::eSymbolTypeIVarOffset)));
  SWIG_Python_SetConstant(d, "eSymbolTypeReExported",SWIG_From_int(static_cast< int >(lldb::eSymbolTypeReExported)));
  SWIG_Python_SetConstant(d, "eSymbolTypeMetadata",SWIG_From_int(static_cast< int >(lldb::eSymbolTypeMetadata)));
  SWIG_Python_SetConstant(d, "eSymbolTypeASTFile",SWIG_From_int(static_cast< int >(lldb::eSymbolTypeASTFile)));
  SWIG_Python_SetConstant(d, "eSectionTypeInvalid",SWIG_From_int(static_cast< int >(lldb::eSectionTypeInvalid)));
  SWIG_Python_SetConstant(d, "eSectionTypeCode",SWIG_From_int(static_cast< int >(lldb::eSectionTypeCode)));
  SWIG_Python_SetConstant(d, "eSectionTypeContainer",SWIG_From_int(static_cast< int >(lldb::eSectionTypeContainer)));
  SWIG_Python_SetConstant(d, "eSectionTypeData",SWIG_From_int(static_cast< int >(lldb::eSectionTypeData)));
  SWIG_Python_SetConstant(d, "eSectionTypeDataCString",SWIG_From_int(static_cast< int >(lldb::eSectionTypeDataCString)));
  SWIG_Python_SetConstant(d, "eSectionTypeDataCStringPointers",SWIG_From_int(static_cast< int >(lldb::eSectionTypeDataCStringPointers)));
  SWIG_Python_SetConstant(d, "eSectionTypeDataSymbolAddress",SWIG_From_int(static_cast< int >(lldb::eSectionTypeDataSymbolAddress)));
  SWIG_Python_SetConstant(d, "eSectionTypeData4",SWIG_From_int(static_cast< int >(lldb::eSectionTypeData4)));
  SWIG_Python_SetConstant(d, "eSectionTypeData8",SWIG_From_int(static_cast< int >(lldb::eSectionTypeData8)));
  SWIG_Python_SetConstant(d, "eSectionTypeData16",SWIG_From_int(static_cast< int >(lldb::eSectionTypeData16)));
  SWIG_Python_SetConstant(d, "eSectionTypeDataPointers",SWIG_From_int(static_cast< int >(lldb::eSectionTypeDataPointers)));
  SWIG_Python_SetConstant(d, "eSectionTypeDebug",SWIG_From_int(static_cast< int >(lldb::eSectionTypeDebug)));
  SWIG_Python_SetConstant(d, "eSectionTypeZeroFill",SWIG_From_int(static_cast< int >(lldb::eSectionTypeZeroFill)));
  SWIG_Python_SetConstant(d, "eSectionTypeDataObjCMessageRefs",SWIG_From_int(static_cast< int >(lldb::eSectionTypeDataObjCMessageRefs)));
  SWIG_Python_SetConstant(d, "eSectionTypeDataObjCCFStrings",SWIG_From_int(static_cast< int >(lldb::eSectionTypeDataObjCCFStrings)));
  SWIG_Python_SetConstant(d, "eSectionTypeDWARFDebugAbbrev",SWIG_From_int(static_cast< int >(lldb::eSectionTypeDWARFDebugAbbrev)));
  SWIG_Python_SetConstant(d, "eSectionTypeDWARFDebugAddr",SWIG_From_int(static_cast< int >(lldb::eSectionTypeDWARFDebugAddr)));
  SWIG_Python_SetConstant(d, "eSectionTypeDWARFDebugAranges",SWIG_From_int(static_cast< int >(lldb::eSectionTypeDWARFDebugAranges)));
  SWIG_Python_SetConstant(d, "eSectionTypeDWARFDebugCuIndex",SWIG_From_int(static_cast< int >(lldb::eSectionTypeDWARFDebugCuIndex)));
  SWIG_Python_SetConstant(d, "eSectionTypeDWARFDebugFrame",SWIG_From_int(static_cast< int >(lldb::eSectionTypeDWARFDebugFrame)));
  SWIG_Python_SetConstant(d, "eSectionTypeDWARFDebugInfo",SWIG_From_int(static_cast< int >(lldb::eSectionTypeDWARFDebugInfo)));
  SWIG_Python_SetConstant(d, "eSectionTypeDWARFDebugLine",SWIG_From_int(static_cast< int >(lldb::eSectionTypeDWARFDebugLine)));
  SWIG_Python_SetConstant(d, "eSectionTypeDWARFDebugLoc",SWIG_From_int(static_cast< int >(lldb::eSectionTypeDWARFDebugLoc)));
  SWIG_Python_SetConstant(d, "eSectionTypeDWARFDebugMacInfo",SWIG_From_int(static_cast< int >(lldb::eSectionTypeDWARFDebugMacInfo)));
  SWIG_Python_SetConstant(d, "eSectionTypeDWARFDebugMacro",SWIG_From_int(static_cast< int >(lldb::eSectionTypeDWARFDebugMacro)));
  SWIG_Python_SetConstant(d, "eSectionTypeDWARFDebugPubNames",SWIG_From_int(static_cast< int >(lldb::eSectionTypeDWARFDebugPubNames)));
  SWIG_Python_SetConstant(d, "eSectionTypeDWARFDebugPubTypes",SWIG_From_int(static_cast< int >(lldb::eSectionTypeDWARFDebugPubTypes)));
  SWIG_Python_SetConstant(d, "eSectionTypeDWARFDebugRanges",SWIG_From_int(static_cast< int >(lldb::eSectionTypeDWARFDebugRanges)));
  SWIG_Python_SetConstant(d, "eSectionTypeDWARFDebugStr",SWIG_From_int(static_cast< int >(lldb::eSectionTypeDWARFDebugStr)));
  SWIG_Python_SetConstant(d, "eSectionTypeDWARFDebugStrOffsets",SWIG_From_int(static_cast< int >(lldb::eSectionTypeDWARFDebugStrOffsets)));
  SWIG_Python_SetConstant(d, "eSectionTypeDWARFAppleNames",SWIG_From_int(static_cast< int >(lldb::eSectionTypeDWARFAppleNames)));
  SWIG_Python_SetConstant(d, "eSectionTypeDWARFAppleTypes",SWIG_From_int(static_cast< int >(lldb::eSectionTypeDWARFAppleTypes)));
  SWIG_Python_SetConstant(d, "eSectionTypeDWARFAppleExternalTypes",SWIG_From_int(static_cast< int >(lldb::eSectionTypeDWARFAppleExternalTypes)));
  SWIG_Python_SetConstant(d, "eSectionTypeDWARFAppleNamespaces",SWIG_From_int(static_cast< int >(lldb::eSectionTypeDWARFAppleNamespaces)));
  SWIG_Python_SetConstant(d, "eSectionTypeDWARFAppleObjC",SWIG_From_int(static_cast< int >(lldb::eSectionTypeDWARFAppleObjC)));
  SWIG_Python_SetConstant(d, "eSectionTypeELFSymbolTable",SWIG_From_int(static_cast< int >(lldb::eSectionTypeELFSymbolTable)));
  SWIG_Python_SetConstant(d, "eSectionTypeELFDynamicSymbols",SWIG_From_int(static_cast< int >(lldb::eSectionTypeELFDynamicSymbols)));
  SWIG_Python_SetConstant(d, "eSectionTypeELFRelocationEntries",SWIG_From_int(static_cast< int >(lldb::eSectionTypeELFRelocationEntries)));
  SWIG_Python_SetConstant(d, "eSectionTypeELFDynamicLinkInfo",SWIG_From_int(static_cast< int >(lldb::eSectionTypeELFDynamicLinkInfo)));
  SWIG_Python_SetConstant(d, "eSectionTypeEHFrame",SWIG_From_int(static_cast< int >(lldb::eSectionTypeEHFrame)));
  SWIG_Python_SetConstant(d, "eSectionTypeSwiftModules",SWIG_From_int(static_cast< int >(lldb::eSectionTypeSwiftModules)));
  SWIG_Python_SetConstant(d, "eSectionTypeARMexidx",SWIG_From_int(static_cast< int >(lldb::eSectionTypeARMexidx)));
  SWIG_Python_SetConstant(d, "eSectionTypeARMextab",SWIG_From_int(static_cast< int >(lldb::eSectionTypeARMextab)));
  SWIG_Python_SetConstant(d, "eSectionTypeCompactUnwind",SWIG_From_int(static_cast< int >(lldb::eSectionTypeCompactUnwind)));
  SWIG_Python_SetConstant(d, "eSectionTypeGoSymtab",SWIG_From_int(static_cast< int >(lldb::eSectionTypeGoSymtab)));
  SWIG_Python_SetConstant(d, "eSectionTypeAbsoluteAddress",SWIG_From_int(static_cast< int >(lldb::eSectionTypeAbsoluteAddress)));
  SWIG_Python_SetConstant(d, "eSectionTypeOther",SWIG_From_int(static_cast< int >(lldb::eSectionTypeOther)));
  SWIG_Python_SetConstant(d, "eEmulateInstructionOptionNone",SWIG_From_int(static_cast< int >(lldb::eEmulateInstructionOptionNone)));
  SWIG_Python_SetConstant(d, "eEmulateInstructionOptionAutoAdvancePC",SWIG_From_int(static_cast< int >(lldb::eEmulateInstructionOptionAutoAdvancePC)));
  SWIG_Python_SetConstant(d, "eEmulateInstructionOptionIgnoreConditions",SWIG_From_int(static_cast< int >(lldb::eEmulateInstructionOptionIgnoreConditions)));
  SWIG_Python_SetConstant(d, "eFunctionNameTypeNone",SWIG_From_int(static_cast< int >(lldb::eFunctionNameTypeNone)));
  SWIG_Python_SetConstant(d, "eFunctionNameTypeAuto",SWIG_From_int(static_cast< int >(lldb::eFunctionNameTypeAuto)));
  SWIG_Python_SetConstant(d, "eFunctionNameTypeFull",SWIG_From_int(static_cast< int >(lldb::eFunctionNameTypeFull)));
  SWIG_Python_SetConstant(d, "eFunctionNameTypeBase",SWIG_From_int(static_cast< int >(lldb::eFunctionNameTypeBase)));
  SWIG_Python_SetConstant(d, "eFunctionNameTypeMethod",SWIG_From_int(static_cast< int >(lldb::eFunctionNameTypeMethod)));
  SWIG_Python_SetConstant(d, "eFunctionNameTypeSelector",SWIG_From_int(static_cast< int >(lldb::eFunctionNameTypeSelector)));
  SWIG_Python_SetConstant(d, "eFunctionNameTypeAny",SWIG_From_int(static_cast< int >(lldb::eFunctionNameTypeAny)));
  SWIG_Python_SetConstant(d, "eBasicTypeInvalid",SWIG_From_int(static_cast< int >(lldb::eBasicTypeInvalid)));
  SWIG_Python_SetConstant(d, "eBasicTypeVoid",SWIG_From_int(static_cast< int >(lldb::eBasicTypeVoid)));
  SWIG_Python_SetConstant(d, "eBasicTypeChar",SWIG_From_int(static_cast< int >(lldb::eBasicTypeChar)));
  SWIG_Python_SetConstant(d, "eBasicTypeSignedChar",SWIG_From_int(static_cast< int >(lldb::eBasicTypeSignedChar)));
  SWIG_Python_SetConstant(d, "eBasicTypeUnsignedChar",SWIG_From_int(static_cast< int >(lldb::eBasicTypeUnsignedChar)));
  SWIG_Python_SetConstant(d, "eBasicTypeWChar",SWIG_From_int(static_cast< int >(lldb::eBasicTypeWChar)));
  SWIG_Python_SetConstant(d, "eBasicTypeSignedWChar",SWIG_From_int(static_cast< int >(lldb::eBasicTypeSignedWChar)));
  SWIG_Python_SetConstant(d, "eBasicTypeUnsignedWChar",SWIG_From_int(static_cast< int >(lldb::eBasicTypeUnsignedWChar)));
  SWIG_Python_SetConstant(d, "eBasicTypeChar16",SWIG_From_int(static_cast< int >(lldb::eBasicTypeChar16)));
  SWIG_Python_SetConstant(d, "eBasicTypeChar32",SWIG_From_int(static_cast< int >(lldb::eBasicTypeChar32)));
  SWIG_Python_SetConstant(d, "eBasicTypeShort",SWIG_From_int(static_cast< int >(lldb::eBasicTypeShort)));
  SWIG_Python_SetConstant(d, "eBasicTypeUnsignedShort",SWIG_From_int(static_cast< int >(lldb::eBasicTypeUnsignedShort)));
  SWIG_Python_SetConstant(d, "eBasicTypeInt",SWIG_From_int(static_cast< int >(lldb::eBasicTypeInt)));
  SWIG_Python_SetConstant(d, "eBasicTypeUnsignedInt",SWIG_From_int(static_cast< int >(lldb::eBasicTypeUnsignedInt)));
  SWIG_Python_SetConstant(d, "eBasicTypeLong",SWIG_From_int(static_cast< int >(lldb::eBasicTypeLong)));
  SWIG_Python_SetConstant(d, "eBasicTypeUnsignedLong",SWIG_From_int(static_cast< int >(lldb::eBasicTypeUnsignedLong)));
  SWIG_Python_SetConstant(d, "eBasicTypeLongLong",SWIG_From_int(static_cast< int >(lldb::eBasicTypeLongLong)));
  SWIG_Python_SetConstant(d, "eBasicTypeUnsignedLongLong",SWIG_From_int(static_cast< int >(lldb::eBasicTypeUnsignedLongLong)));
  SWIG_Python_SetConstant(d, "eBasicTypeInt128",SWIG_From_int(static_cast< int >(lldb::eBasicTypeInt128)));
  SWIG_Python_SetConstant(d, "eBasicTypeUnsignedInt128",SWIG_From_int(static_cast< int >(lldb::eBasicTypeUnsignedInt128)));
  SWIG_Python_SetConstant(d, "eBasicTypeBool",SWIG_From_int(static_cast< int >(lldb::eBasicTypeBool)));
  SWIG_Python_SetConstant(d, "eBasicTypeHalf",SWIG_From_int(static_cast< int >(lldb::eBasicTypeHalf)));
  SWIG_Python_SetConstant(d, "eBasicTypeFloat",SWIG_From_int(static_cast< int >(lldb::eBasicTypeFloat)));
  SWIG_Python_SetConstant(d, "eBasicTypeDouble",SWIG_From_int(static_cast< int >(lldb::eBasicTypeDouble)));
  SWIG_Python_SetConstant(d, "eBasicTypeLongDouble",SWIG_From_int(static_cast< int >(lldb::eBasicTypeLongDouble)));
  SWIG_Python_SetConstant(d, "eBasicTypeFloatComplex",SWIG_From_int(static_cast< int >(lldb::eBasicTypeFloatComplex)));
  SWIG_Python_SetConstant(d, "eBasicTypeDoubleComplex",SWIG_From_int(static_cast< int >(lldb::eBasicTypeDoubleComplex)));
  SWIG_Python_SetConstant(d, "eBasicTypeLongDoubleComplex",SWIG_From_int(static_cast< int >(lldb::eBasicTypeLongDoubleComplex)));
  SWIG_Python_SetConstant(d, "eBasicTypeObjCID",SWIG_From_int(static_cast< int >(lldb::eBasicTypeObjCID)));
  SWIG_Python_SetConstant(d, "eBasicTypeObjCClass",SWIG_From_int(static_cast< int >(lldb::eBasicTypeObjCClass)));
  SWIG_Python_SetConstant(d, "eBasicTypeObjCSel",SWIG_From_int(static_cast< int >(lldb::eBasicTypeObjCSel)));
  SWIG_Python_SetConstant(d, "eBasicTypeNullPtr",SWIG_From_int(static_cast< int >(lldb::eBasicTypeNullPtr)));
  SWIG_Python_SetConstant(d, "eBasicTypeOther",SWIG_From_int(static_cast< int >(lldb::eBasicTypeOther)));
  SWIG_Python_SetConstant(d, "eTraceTypeNone",SWIG_From_int(static_cast< int >(lldb::eTraceTypeNone)));
  SWIG_Python_SetConstant(d, "eTraceTypeProcessorTrace",SWIG_From_int(static_cast< int >(lldb::eTraceTypeProcessorTrace)));
  SWIG_Python_SetConstant(d, "eStructuredDataTypeInvalid",SWIG_From_int(static_cast< int >(lldb::eStructuredDataTypeInvalid)));
  SWIG_Python_SetConstant(d, "eStructuredDataTypeNull",SWIG_From_int(static_cast< int >(lldb::eStructuredDataTypeNull)));
  SWIG_Python_SetConstant(d, "eStructuredDataTypeGeneric",SWIG_From_int(static_cast< int >(lldb::eStructuredDataTypeGeneric)));
  SWIG_Python_SetConstant(d, "eStructuredDataTypeArray",SWIG_From_int(static_cast< int >(lldb::eStructuredDataTypeArray)));
  SWIG_Python_SetConstant(d, "eStructuredDataTypeInteger",SWIG_From_int(static_cast< int >(lldb::eStructuredDataTypeInteger)));
  SWIG_Python_SetConstant(d, "eStructuredDataTypeFloat",SWIG_From_int(static_cast< int >(lldb::eStructuredDataTypeFloat)));
  SWIG_Python_SetConstant(d, "eStructuredDataTypeBoolean",SWIG_From_int(static_cast< int >(lldb::eStructuredDataTypeBoolean)));
  SWIG_Python_SetConstant(d, "eStructuredDataTypeString",SWIG_From_int(static_cast< int >(lldb::eStructuredDataTypeString)));
  SWIG_Python_SetConstant(d, "eStructuredDataTypeDictionary",SWIG_From_int(static_cast< int >(lldb::eStructuredDataTypeDictionary)));
  SWIG_Python_SetConstant(d, "eTypeClassInvalid",SWIG_From_int(static_cast< int >(lldb::eTypeClassInvalid)));
  SWIG_Python_SetConstant(d, "eTypeClassArray",SWIG_From_int(static_cast< int >(lldb::eTypeClassArray)));
  SWIG_Python_SetConstant(d, "eTypeClassBlockPointer",SWIG_From_int(static_cast< int >(lldb::eTypeClassBlockPointer)));
  SWIG_Python_SetConstant(d, "eTypeClassBuiltin",SWIG_From_int(static_cast< int >(lldb::eTypeClassBuiltin)));
  SWIG_Python_SetConstant(d, "eTypeClassClass",SWIG_From_int(static_cast< int >(lldb::eTypeClassClass)));
  SWIG_Python_SetConstant(d, "eTypeClassComplexFloat",SWIG_From_int(static_cast< int >(lldb::eTypeClassComplexFloat)));
  SWIG_Python_SetConstant(d, "eTypeClassComplexInteger",SWIG_From_int(static_cast< int >(lldb::eTypeClassComplexInteger)));
  SWIG_Python_SetConstant(d, "eTypeClassEnumeration",SWIG_From_int(static_cast< int >(lldb::eTypeClassEnumeration)));
  SWIG_Python_SetConstant(d, "eTypeClassFunction",SWIG_From_int(static_cast< int >(lldb::eTypeClassFunction)));
  SWIG_Python_SetConstant(d, "eTypeClassMemberPointer",SWIG_From_int(static_cast< int >(lldb::eTypeClassMemberPointer)));
  SWIG_Python_SetConstant(d, "eTypeClassObjCObject",SWIG_From_int(static_cast< int >(lldb::eTypeClassObjCObject)));
  SWIG_Python_SetConstant(d, "eTypeClassObjCInterface",SWIG_From_int(static_cast< int >(lldb::eTypeClassObjCInterface)));
  SWIG_Python_SetConstant(d, "eTypeClassObjCObjectPointer",SWIG_From_int(static_cast< int >(lldb::eTypeClassObjCObjectPointer)));
  SWIG_Python_SetConstant(d, "eTypeClassPointer",SWIG_From_int(static_cast< int >(lldb::eTypeClassPointer)));
  SWIG_Python_SetConstant(d, "eTypeClassReference",SWIG_From_int(static_cast< int >(lldb::eTypeClassReference)));
  SWIG_Python_SetConstant(d, "eTypeClassStruct",SWIG_From_int(static_cast< int >(lldb::eTypeClassStruct)));
  SWIG_Python_SetConstant(d, "eTypeClassTypedef",SWIG_From_int(static_cast< int >(lldb::eTypeClassTypedef)));
  SWIG_Python_SetConstant(d, "eTypeClassUnion",SWIG_From_int(static_cast< int >(lldb::eTypeClassUnion)));
  SWIG_Python_SetConstant(d, "eTypeClassVector",SWIG_From_int(static_cast< int >(lldb::eTypeClassVector)));
  SWIG_Python_SetConstant(d, "eTypeClassOther",SWIG_From_int(static_cast< int >(lldb::eTypeClassOther)));
  SWIG_Python_SetConstant(d, "eTypeClassAny",SWIG_From_int(static_cast< int >(lldb::eTypeClassAny)));
  SWIG_Python_SetConstant(d, "eTemplateArgumentKindNull",SWIG_From_int(static_cast< int >(lldb::eTemplateArgumentKindNull)));
  SWIG_Python_SetConstant(d, "eTemplateArgumentKindType",SWIG_From_int(static_cast< int >(lldb::eTemplateArgumentKindType)));
  SWIG_Python_SetConstant(d, "eTemplateArgumentKindDeclaration",SWIG_From_int(static_cast< int >(lldb::eTemplateArgumentKindDeclaration)));
  SWIG_Python_SetConstant(d, "eTemplateArgumentKindIntegral",SWIG_From_int(static_cast< int >(lldb::eTemplateArgumentKindIntegral)));
  SWIG_Python_SetConstant(d, "eTemplateArgumentKindTemplate",SWIG_From_int(static_cast< int >(lldb::eTemplateArgumentKindTemplate)));
  SWIG_Python_SetConstant(d, "eTemplateArgumentKindTemplateExpansion",SWIG_From_int(static_cast< int >(lldb::eTemplateArgumentKindTemplateExpansion)));
  SWIG_Python_SetConstant(d, "eTemplateArgumentKindExpression",SWIG_From_int(static_cast< int >(lldb::eTemplateArgumentKindExpression)));
  SWIG_Python_SetConstant(d, "eTemplateArgumentKindPack",SWIG_From_int(static_cast< int >(lldb::eTemplateArgumentKindPack)));
  SWIG_Python_SetConstant(d, "eTemplateArgumentKindNullPtr",SWIG_From_int(static_cast< int >(lldb::eTemplateArgumentKindNullPtr)));
  SWIG_Python_SetConstant(d, "eNullGenericKindType",SWIG_From_int(static_cast< int >(lldb::eNullGenericKindType)));
  SWIG_Python_SetConstant(d, "eBoundGenericKindType",SWIG_From_int(static_cast< int >(lldb::eBoundGenericKindType)));
  SWIG_Python_SetConstant(d, "eUnboundGenericKindType",SWIG_From_int(static_cast< int >(lldb::eUnboundGenericKindType)));
  SWIG_Python_SetConstant(d, "eTypeOptionNone",SWIG_From_int(static_cast< int >(lldb::eTypeOptionNone)));
  SWIG_Python_SetConstant(d, "eTypeOptionCascade",SWIG_From_int(static_cast< int >(lldb::eTypeOptionCascade)));
  SWIG_Python_SetConstant(d, "eTypeOptionSkipPointers",SWIG_From_int(static_cast< int >(lldb::eTypeOptionSkipPointers)));
  SWIG_Python_SetConstant(d, "eTypeOptionSkipReferences",SWIG_From_int(static_cast< int >(lldb::eTypeOptionSkipReferences)));
  SWIG_Python_SetConstant(d, "eTypeOptionHideChildren",SWIG_From_int(static_cast< int >(lldb::eTypeOptionHideChildren)));
  SWIG_Python_SetConstant(d, "eTypeOptionHideValue",SWIG_From_int(static_cast< int >(lldb::eTypeOptionHideValue)));
  SWIG_Python_SetConstant(d, "eTypeOptionShowOneLiner",SWIG_From_int(static_cast< int >(lldb::eTypeOptionShowOneLiner)));
  SWIG_Python_SetConstant(d, "eTypeOptionHideNames",SWIG_From_int(static_cast< int >(lldb::eTypeOptionHideNames)));
  SWIG_Python_SetConstant(d, "eTypeOptionNonCacheable",SWIG_From_int(static_cast< int >(lldb::eTypeOptionNonCacheable)));
  SWIG_Python_SetConstant(d, "eTypeOptionHideEmptyAggregates",SWIG_From_int(static_cast< int >(lldb::eTypeOptionHideEmptyAggregates)));
  SWIG_Python_SetConstant(d, "eFrameCompareInvalid",SWIG_From_int(static_cast< int >(lldb::eFrameCompareInvalid)));
  SWIG_Python_SetConstant(d, "eFrameCompareUnknown",SWIG_From_int(static_cast< int >(lldb::eFrameCompareUnknown)));
  SWIG_Python_SetConstant(d, "eFrameCompareEqual",SWIG_From_int(static_cast< int >(lldb::eFrameCompareEqual)));
  SWIG_Python_SetConstant(d, "eFrameCompareSameParent",SWIG_From_int(static_cast< int >(lldb::eFrameCompareSameParent)));
  SWIG_Python_SetConstant(d, "eFrameCompareYounger",SWIG_From_int(static_cast< int >(lldb::eFrameCompareYounger)));
  SWIG_Python_SetConstant(d, "eFrameCompareOlder",SWIG_From_int(static_cast< int >(lldb::eFrameCompareOlder)));
  SWIG_Python_SetConstant(d, "eAddressClassInvalid",SWIG_From_int(static_cast< int >(lldb::eAddressClassInvalid)));
  SWIG_Python_SetConstant(d, "eAddressClassUnknown",SWIG_From_int(static_cast< int >(lldb::eAddressClassUnknown)));
  SWIG_Python_SetConstant(d, "eAddressClassCode",SWIG_From_int(static_cast< int >(lldb::eAddressClassCode)));
  SWIG_Python_SetConstant(d, "eAddressClassCodeAlternateISA",SWIG_From_int(static_cast< int >(lldb::eAddressClassCodeAlternateISA)));
  SWIG_Python_SetConstant(d, "eAddressClassData",SWIG_From_int(static_cast< int >(lldb::eAddressClassData)));
  SWIG_Python_SetConstant(d, "eAddressClassDebug",SWIG_From_int(static_cast< int >(lldb::eAddressClassDebug)));
  SWIG_Python_SetConstant(d, "eAddressClassRuntime",SWIG_From_int(static_cast< int >(lldb::eAddressClassRuntime)));
  SWIG_Python_SetConstant(d, "eFilePermissionsUserRead",SWIG_From_int(static_cast< int >(lldb::eFilePermissionsUserRead)));
  SWIG_Python_SetConstant(d, "eFilePermissionsUserWrite",SWIG_From_int(static_cast< int >(lldb::eFilePermissionsUserWrite)));
  SWIG_Python_SetConstant(d, "eFilePermissionsUserExecute",SWIG_From_int(static_cast< int >(lldb::eFilePermissionsUserExecute)));
  SWIG_Python_SetConstant(d, "eFilePermissionsGroupRead",SWIG_From_int(static_cast< int >(lldb::eFilePermissionsGroupRead)));
  SWIG_Python_SetConstant(d, "eFilePermissionsGroupWrite",SWIG_From_int(static_cast< int >(lldb::eFilePermissionsGroupWrite)));
  SWIG_Python_SetConstant(d, "eFilePermissionsGroupExecute",SWIG_From_int(static_cast< int >(lldb::eFilePermissionsGroupExecute)));
  SWIG_Python_SetConstant(d, "eFilePermissionsWorldRead",SWIG_From_int(static_cast< int >(lldb::eFilePermissionsWorldRead)));
  SWIG_Python_SetConstant(d, "eFilePermissionsWorldWrite",SWIG_From_int(static_cast< int >(lldb::eFilePermissionsWorldWrite)));
  SWIG_Python_SetConstant(d, "eFilePermissionsWorldExecute",SWIG_From_int(static_cast< int >(lldb::eFilePermissionsWorldExecute)));
  SWIG_Python_SetConstant(d, "eFilePermissionsUserRW",SWIG_From_int(static_cast< int >(lldb::eFilePermissionsUserRW)));
  SWIG_Python_SetConstant(d, "eFileFilePermissionsUserRX",SWIG_From_int(static_cast< int >(lldb::eFileFilePermissionsUserRX)));
  SWIG_Python_SetConstant(d, "eFilePermissionsUserRWX",SWIG_From_int(static_cast< int >(lldb::eFilePermissionsUserRWX)));
  SWIG_Python_SetConstant(d, "eFilePermissionsGroupRW",SWIG_From_int(static_cast< int >(lldb::eFilePermissionsGroupRW)));
  SWIG_Python_SetConstant(d, "eFilePermissionsGroupRX",SWIG_From_int(static_cast< int >(lldb::eFilePermissionsGroupRX)));
  SWIG_Python_SetConstant(d, "eFilePermissionsGroupRWX",SWIG_From_int(static_cast< int >(lldb::eFilePermissionsGroupRWX)));
  SWIG_Python_SetConstant(d, "eFilePermissionsWorldRW",SWIG_From_int(static_cast< int >(lldb::eFilePermissionsWorldRW)));
  SWIG_Python_SetConstant(d, "eFilePermissionsWorldRX",SWIG_From_int(static_cast< int >(lldb::eFilePermissionsWorldRX)));
  SWIG_Python_SetConstant(d, "eFilePermissionsWorldRWX",SWIG_From_int(static_cast< int >(lldb::eFilePermissionsWorldRWX)));
  SWIG_Python_SetConstant(d, "eFilePermissionsEveryoneR",SWIG_From_int(static_cast< int >(lldb::eFilePermissionsEveryoneR)));
  SWIG_Python_SetConstant(d, "eFilePermissionsEveryoneW",SWIG_From_int(static_cast< int >(lldb::eFilePermissionsEveryoneW)));
  SWIG_Python_SetConstant(d, "eFilePermissionsEveryoneX",SWIG_From_int(static_cast< int >(lldb::eFilePermissionsEveryoneX)));
  SWIG_Python_SetConstant(d, "eFilePermissionsEveryoneRW",SWIG_From_int(static_cast< int >(lldb::eFilePermissionsEveryoneRW)));
  SWIG_Python_SetConstant(d, "eFilePermissionsEveryoneRX",SWIG_From_int(static_cast< int >(lldb::eFilePermissionsEveryoneRX)));
  SWIG_Python_SetConstant(d, "eFilePermissionsEveryoneRWX",SWIG_From_int(static_cast< int >(lldb::eFilePermissionsEveryoneRWX)));
  SWIG_Python_SetConstant(d, "eFilePermissionsFileDefault",SWIG_From_int(static_cast< int >(lldb::eFilePermissionsFileDefault)));
  SWIG_Python_SetConstant(d, "eFilePermissionsDirectoryDefault",SWIG_From_int(static_cast< int >(lldb::eFilePermissionsDirectoryDefault)));
  SWIG_Python_SetConstant(d, "eQueueItemKindUnknown",SWIG_From_int(static_cast< int >(lldb::eQueueItemKindUnknown)));
  SWIG_Python_SetConstant(d, "eQueueItemKindFunction",SWIG_From_int(static_cast< int >(lldb::eQueueItemKindFunction)));
  SWIG_Python_SetConstant(d, "eQueueItemKindBlock",SWIG_From_int(static_cast< int >(lldb::eQueueItemKindBlock)));
  SWIG_Python_SetConstant(d, "eQueueKindUnknown",SWIG_From_int(static_cast< int >(lldb::eQueueKindUnknown)));
  SWIG_Python_SetConstant(d, "eQueueKindSerial",SWIG_From_int(static_cast< int >(lldb::eQueueKindSerial)));
  SWIG_Python_SetConstant(d, "eQueueKindConcurrent",SWIG_From_int(static_cast< int >(lldb::eQueueKindConcurrent)));
  SWIG_Python_SetConstant(d, "eExpressionEvaluationParse",SWIG_From_int(static_cast< int >(lldb::eExpressionEvaluationParse)));
  SWIG_Python_SetConstant(d, "eExpressionEvaluationIRGen",SWIG_From_int(static_cast< int >(lldb::eExpressionEvaluationIRGen)));
  SWIG_Python_SetConstant(d, "eExpressionEvaluationExecution",SWIG_From_int(static_cast< int >(lldb::eExpressionEvaluationExecution)));
  SWIG_Python_SetConstant(d, "eExpressionEvaluationComplete",SWIG_From_int(static_cast< int >(lldb::eExpressionEvaluationComplete)));
  SWIG_Python_SetConstant(d, "eWatchpointKindWrite",SWIG_From_int(static_cast< int >(lldb::eWatchpointKindWrite)));
  SWIG_Python_SetConstant(d, "eWatchpointKindRead",SWIG_From_int(static_cast< int >(lldb::eWatchpointKindRead)));
  SWIG_Python_SetConstant(d, "eGdbSignalBadAccess",SWIG_From_int(static_cast< int >(lldb::eGdbSignalBadAccess)));
  SWIG_Python_SetConstant(d, "eGdbSignalBadInstruction",SWIG_From_int(static_cast< int >(lldb::eGdbSignalBadInstruction)));
  SWIG_Python_SetConstant(d, "eGdbSignalArithmetic",SWIG_From_int(static_cast< int >(lldb::eGdbSignalArithmetic)));
  SWIG_Python_SetConstant(d, "eGdbSignalEmulation",SWIG_From_int(static_cast< int >(lldb::eGdbSignalEmulation)));
  SWIG_Python_SetConstant(d, "eGdbSignalSoftware",SWIG_From_int(static_cast< int >(lldb::eGdbSignalSoftware)));
  SWIG_Python_SetConstant(d, "eGdbSignalBreakpoint",SWIG_From_int(static_cast< int >(lldb::eGdbSignalBreakpoint)));
  SWIG_Python_SetConstant(d, "ePathTypeLLDBShlibDir",SWIG_From_int(static_cast< int >(lldb::ePathTypeLLDBShlibDir)));
  SWIG_Python_SetConstant(d, "ePathTypeSupportExecutableDir",SWIG_From_int(static_cast< int >(lldb::ePathTypeSupportExecutableDir)));
  SWIG_Python_SetConstant(d, "ePathTypeSupportFileDir",SWIG_From_int(static_cast< int >(lldb::ePathTypeSupportFileDir)));
  SWIG_Python_SetConstant(d, "ePathTypeHeaderDir",SWIG_From_int(static_cast< int >(lldb::ePathTypeHeaderDir)));
  SWIG_Python_SetConstant(d, "ePathTypePythonDir",SWIG_From_int(static_cast< int >(lldb::ePathTypePythonDir)));
  SWIG_Python_SetConstant(d, "ePathTypeLLDBSystemPlugins",SWIG_From_int(static_cast< int >(lldb::ePathTypeLLDBSystemPlugins)));
  SWIG_Python_SetConstant(d, "ePathTypeLLDBUserPlugins",SWIG_From_int(static_cast< int >(lldb::ePathTypeLLDBUserPlugins)));
  SWIG_Python_SetConstant(d, "ePathTypeLLDBTempSystemDir",SWIG_From_int(static_cast< int >(lldb::ePathTypeLLDBTempSystemDir)));
  SWIG_Python_SetConstant(d, "ePathTypeGlobalLLDBTempSystemDir",SWIG_From_int(static_cast< int >(lldb::ePathTypeGlobalLLDBTempSystemDir)));
  SWIG_Python_SetConstant(d, "ePathTypeClangDir",SWIG_From_int(static_cast< int >(lldb::ePathTypeClangDir)));
  SWIG_Python_SetConstant(d, "ePathTypeSwiftDir",SWIG_From_int(static_cast< int >(lldb::ePathTypeSwiftDir)));
  SWIG_Python_SetConstant(d, "eMemberFunctionKindUnknown",SWIG_From_int(static_cast< int >(lldb::eMemberFunctionKindUnknown)));
  SWIG_Python_SetConstant(d, "eMemberFunctionKindConstructor",SWIG_From_int(static_cast< int >(lldb::eMemberFunctionKindConstructor)));
  SWIG_Python_SetConstant(d, "eMemberFunctionKindDestructor",SWIG_From_int(static_cast< int >(lldb::eMemberFunctionKindDestructor)));
  SWIG_Python_SetConstant(d, "eMemberFunctionKindInstanceMethod",SWIG_From_int(static_cast< int >(lldb::eMemberFunctionKindInstanceMethod)));
  SWIG_Python_SetConstant(d, "eMemberFunctionKindStaticMethod",SWIG_From_int(static_cast< int >(lldb::eMemberFunctionKindStaticMethod)));
  SWIG_Python_SetConstant(d, "eMatchTypeNormal",SWIG_From_int(static_cast< int >(lldb::eMatchTypeNormal)));
  SWIG_Python_SetConstant(d, "eMatchTypeRegex",SWIG_From_int(static_cast< int >(lldb::eMatchTypeRegex)));
  SWIG_Python_SetConstant(d, "eMatchTypeStartsWith",SWIG_From_int(static_cast< int >(lldb::eMatchTypeStartsWith)));
  SWIG_Python_SetConstant(d, "eTypeHasChildren",SWIG_From_int(static_cast< int >(lldb::eTypeHasChildren)));
  SWIG_Python_SetConstant(d, "eTypeHasValue",SWIG_From_int(static_cast< int >(lldb::eTypeHasValue)));
  SWIG_Python_SetConstant(d, "eTypeIsArray",SWIG_From_int(static_cast< int >(lldb::eTypeIsArray)));
  SWIG_Python_SetConstant(d, "eTypeIsBlock",SWIG_From_int(static_cast< int >(lldb::eTypeIsBlock)));
  SWIG_Python_SetConstant(d, "eTypeIsBuiltIn",SWIG_From_int(static_cast< int >(lldb::eTypeIsBuiltIn)));
  SWIG_Python_SetConstant(d, "eTypeIsClass",SWIG_From_int(static_cast< int >(lldb::eTypeIsClass)));
  SWIG_Python_SetConstant(d, "eTypeIsCPlusPlus",SWIG_From_int(static_cast< int >(lldb::eTypeIsCPlusPlus)));
  SWIG_Python_SetConstant(d, "eTypeIsEnumeration",SWIG_From_int(static_cast< int >(lldb::eTypeIsEnumeration)));
  SWIG_Python_SetConstant(d, "eTypeIsFuncPrototype",SWIG_From_int(static_cast< int >(lldb::eTypeIsFuncPrototype)));
  SWIG_Python_SetConstant(d, "eTypeIsMember",SWIG_From_int(static_cast< int >(lldb::eTypeIsMember)));
  SWIG_Python_SetConstant(d, "eTypeIsObjC",SWIG_From_int(static_cast< int >(lldb::eTypeIsObjC)));
  SWIG_Python_SetConstant(d, "eTypeIsPointer",SWIG_From_int(static_cast< int >(lldb::eTypeIsPointer)));
  SWIG_Python_SetConstant(d, "eTypeIsReference",SWIG_From_int(static_cast< int >(lldb::eTypeIsReference)));
  SWIG_Python_SetConstant(d, "eTypeIsStructUnion",SWIG_From_int(static_cast< int >(lldb::eTypeIsStructUnion)));
  SWIG_Python_SetConstant(d, "eTypeIsTemplate",SWIG_From_int(static_cast< int >(lldb::eTypeIsTemplate)));
  SWIG_Python_SetConstant(d, "eTypeIsTypedef",SWIG_From_int(static_cast< int >(lldb::eTypeIsTypedef)));
  SWIG_Python_SetConstant(d, "eTypeIsVector",SWIG_From_int(static_cast< int >(lldb::eTypeIsVector)));
  SWIG_Python_SetConstant(d, "eTypeIsScalar",SWIG_From_int(static_cast< int >(lldb::eTypeIsScalar)));
  SWIG_Python_SetConstant(d, "eTypeIsInteger",SWIG_From_int(static_cast< int >(lldb::eTypeIsInteger)));
  SWIG_Python_SetConstant(d, "eTypeIsFloat",SWIG_From_int(static_cast< int >(lldb::eTypeIsFloat)));
  SWIG_Python_SetConstant(d, "eTypeIsComplex",SWIG_From_int(static_cast< int >(lldb::eTypeIsComplex)));
  SWIG_Python_SetConstant(d, "eTypeIsSigned",SWIG_From_int(static_cast< int >(lldb::eTypeIsSigned)));
  SWIG_Python_SetConstant(d, "eTypeInstanceIsPointer",SWIG_From_int(static_cast< int >(lldb::eTypeInstanceIsPointer)));
  SWIG_Python_SetConstant(d, "eTypeIsSwift",SWIG_From_int(static_cast< int >(lldb::eTypeIsSwift)));
  SWIG_Python_SetConstant(d, "eTypeIsArchetype",SWIG_From_int(static_cast< int >(lldb::eTypeIsArchetype)));
  SWIG_Python_SetConstant(d, "eTypeIsProtocol",SWIG_From_int(static_cast< int >(lldb::eTypeIsProtocol)));
  SWIG_Python_SetConstant(d, "eTypeIsTuple",SWIG_From_int(static_cast< int >(lldb::eTypeIsTuple)));
  SWIG_Python_SetConstant(d, "eTypeIsMetatype",SWIG_From_int(static_cast< int >(lldb::eTypeIsMetatype)));
  SWIG_Python_SetConstant(d, "eTypeIsGeneric",SWIG_From_int(static_cast< int >(lldb::eTypeIsGeneric)));
  SWIG_Python_SetConstant(d, "eTypeIsBound",SWIG_From_int(static_cast< int >(lldb::eTypeIsBound)));
  SWIG_Python_SetConstant(d, "eCommandRequiresTarget",SWIG_From_int(static_cast< int >(lldb::eCommandRequiresTarget)));
  SWIG_Python_SetConstant(d, "eCommandRequiresProcess",SWIG_From_int(static_cast< int >(lldb::eCommandRequiresProcess)));
  SWIG_Python_SetConstant(d, "eCommandRequiresThread",SWIG_From_int(static_cast< int >(lldb::eCommandRequiresThread)));
  SWIG_Python_SetConstant(d, "eCommandRequiresFrame",SWIG_From_int(static_cast< int >(lldb::eCommandRequiresFrame)));
  SWIG_Python_SetConstant(d, "eCommandRequiresRegContext",SWIG_From_int(static_cast< int >(lldb::eCommandRequiresRegContext)));
  SWIG_Python_SetConstant(d, "eCommandTryTargetAPILock",SWIG_From_int(static_cast< int >(lldb::eCommandTryTargetAPILock)));
  SWIG_Python_SetConstant(d, "eCommandProcessMustBeLaunched",SWIG_From_int(static_cast< int >(lldb::eCommandProcessMustBeLaunched)));
  SWIG_Python_SetConstant(d, "eCommandProcessMustBePaused",SWIG_From_int(static_cast< int >(lldb::eCommandProcessMustBePaused)));
  SWIG_Python_SetConstant(d, "eTypeSummaryCapped",SWIG_From_int(static_cast< int >(lldb::eTypeSummaryCapped)));
  SWIG_Python_SetConstant(d, "eTypeSummaryUncapped",SWIG_From_int(static_cast< int >(lldb::eTypeSummaryUncapped)));
  SWIG_Python_SetConstant(d, "SBCommandInterpreter_eBroadcastBitThreadShouldExit",SWIG_From_int(static_cast< int >(lldb::SBCommandInterpreter::eBroadcastBitThreadShouldExit)));
  SWIG_Python_SetConstant(d, "SBCommandInterpreter_eBroadcastBitResetPrompt",SWIG_From_int(static_cast< int >(lldb::SBCommandInterpreter::eBroadcastBitResetPrompt)));
  SWIG_Python_SetConstant(d, "SBCommandInterpreter_eBroadcastBitQuitCommandReceived",SWIG_From_int(static_cast< int >(lldb::SBCommandInterpreter::eBroadcastBitQuitCommandReceived)));
  SWIG_Python_SetConstant(d, "SBCommandInterpreter_eBroadcastBitAsynchronousOutputData",SWIG_From_int(static_cast< int >(lldb::SBCommandInterpreter::eBroadcastBitAsynchronousOutputData)));
  SWIG_Python_SetConstant(d, "SBCommandInterpreter_eBroadcastBitAsynchronousErrorData",SWIG_From_int(static_cast< int >(lldb::SBCommandInterpreter::eBroadcastBitAsynchronousErrorData)));
  SWIG_Python_SetConstant(d, "SBCommunication_eBroadcastBitDisconnected",SWIG_From_int(static_cast< int >(lldb::SBCommunication::eBroadcastBitDisconnected)));
  SWIG_Python_SetConstant(d, "SBCommunication_eBroadcastBitReadThreadGotBytes",SWIG_From_int(static_cast< int >(lldb::SBCommunication::eBroadcastBitReadThreadGotBytes)));
  SWIG_Python_SetConstant(d, "SBCommunication_eBroadcastBitReadThreadDidExit",SWIG_From_int(static_cast< int >(lldb::SBCommunication::eBroadcastBitReadThreadDidExit)));
  SWIG_Python_SetConstant(d, "SBCommunication_eBroadcastBitReadThreadShouldExit",SWIG_From_int(static_cast< int >(lldb::SBCommunication::eBroadcastBitReadThreadShouldExit)));
  SWIG_Python_SetConstant(d, "SBCommunication_eBroadcastBitPacketAvailable",SWIG_From_int(static_cast< int >(lldb::SBCommunication::eBroadcastBitPacketAvailable)));
  SWIG_Python_SetConstant(d, "SBCommunication_eAllEventBits",SWIG_From_int(static_cast< int >(lldb::SBCommunication::eAllEventBits)));
  SWIG_Python_SetConstant(d, "SBProcess_eBroadcastBitStateChanged",SWIG_From_int(static_cast< int >(lldb::SBProcess::eBroadcastBitStateChanged)));
  SWIG_Python_SetConstant(d, "SBProcess_eBroadcastBitInterrupt",SWIG_From_int(static_cast< int >(lldb::SBProcess::eBroadcastBitInterrupt)));
  SWIG_Python_SetConstant(d, "SBProcess_eBroadcastBitSTDOUT",SWIG_From_int(static_cast< int >(lldb::SBProcess::eBroadcastBitSTDOUT)));
  SWIG_Python_SetConstant(d, "SBProcess_eBroadcastBitSTDERR",SWIG_From_int(static_cast< int >(lldb::SBProcess::eBroadcastBitSTDERR)));
  SWIG_Python_SetConstant(d, "SBProcess_eBroadcastBitProfileData",SWIG_From_int(static_cast< int >(lldb::SBProcess::eBroadcastBitProfileData)));
  SWIG_Python_SetConstant(d, "SBProcess_eBroadcastBitStructuredData",SWIG_From_int(static_cast< int >(lldb::SBProcess::eBroadcastBitStructuredData)));
  SWIG_Python_SetConstant(d, "SBTarget_eBroadcastBitBreakpointChanged",SWIG_From_int(static_cast< int >(lldb::SBTarget::eBroadcastBitBreakpointChanged)));
  SWIG_Python_SetConstant(d, "SBTarget_eBroadcastBitModulesLoaded",SWIG_From_int(static_cast< int >(lldb::SBTarget::eBroadcastBitModulesLoaded)));
  SWIG_Python_SetConstant(d, "SBTarget_eBroadcastBitModulesUnloaded",SWIG_From_int(static_cast< int >(lldb::SBTarget::eBroadcastBitModulesUnloaded)));
  SWIG_Python_SetConstant(d, "SBTarget_eBroadcastBitWatchpointChanged",SWIG_From_int(static_cast< int >(lldb::SBTarget::eBroadcastBitWatchpointChanged)));
  SWIG_Python_SetConstant(d, "SBTarget_eBroadcastBitSymbolsLoaded",SWIG_From_int(static_cast< int >(lldb::SBTarget::eBroadcastBitSymbolsLoaded)));
  SWIG_Python_SetConstant(d, "SBThread_eBroadcastBitStackChanged",SWIG_From_int(static_cast< int >(lldb::SBThread::eBroadcastBitStackChanged)));
  SWIG_Python_SetConstant(d, "SBThread_eBroadcastBitThreadSuspended",SWIG_From_int(static_cast< int >(lldb::SBThread::eBroadcastBitThreadSuspended)));
  SWIG_Python_SetConstant(d, "SBThread_eBroadcastBitThreadResumed",SWIG_From_int(static_cast< int >(lldb::SBThread::eBroadcastBitThreadResumed)));
  SWIG_Python_SetConstant(d, "SBThread_eBroadcastBitSelectedFrameChanged",SWIG_From_int(static_cast< int >(lldb::SBThread::eBroadcastBitSelectedFrameChanged)));
  SWIG_Python_SetConstant(d, "SBThread_eBroadcastBitThreadSelected",SWIG_From_int(static_cast< int >(lldb::SBThread::eBroadcastBitThreadSelected)));
  
  /* Initialize threading */
  SWIG_PYTHON_INITIALIZE_THREADS;
#if PY_VERSION_HEX >= 0x03000000
  return m;
#else
  return;
#endif
}

