mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	Adapt libpython.py and test_gdb.py to Python3
* Rename PyStringObjectPtr to PyBytesObjectPtr * Replace PyObject_Print by textiowrapper_write
This commit is contained in:
		
							parent
							
								
									e212416420
								
							
						
					
					
						commit
						67df3a4b7e
					
				
					 2 changed files with 12 additions and 12 deletions
				
			
		|  | @ -60,7 +60,7 @@ def run_gdb(self, *args): | ||||||
|         return out.decode('iso-8859-1'), err.decode('iso-8859-1') |         return out.decode('iso-8859-1'), err.decode('iso-8859-1') | ||||||
| 
 | 
 | ||||||
|     def get_stack_trace(self, source=None, script=None, |     def get_stack_trace(self, source=None, script=None, | ||||||
|                         breakpoint='PyObject_Print', |                         breakpoint='textiowrapper_write', | ||||||
|                         cmds_after_breakpoint=None, |                         cmds_after_breakpoint=None, | ||||||
|                         import_site=False): |                         import_site=False): | ||||||
|         ''' |         ''' | ||||||
|  | @ -78,7 +78,7 @@ def get_stack_trace(self, source=None, script=None, | ||||||
|         # error, which typically happens python is dynamically linked (the |         # error, which typically happens python is dynamically linked (the | ||||||
|         # breakpoints of interest are to be found in the shared library) |         # breakpoints of interest are to be found in the shared library) | ||||||
|         # When this happens, we still get: |         # When this happens, we still get: | ||||||
|         #   Function "PyObject_Print" not defined. |         #   Function "textiowrapper_write" not defined. | ||||||
|         # emitted to stderr each time, alas. |         # emitted to stderr each time, alas. | ||||||
| 
 | 
 | ||||||
|         # Initially I had "--eval-command=continue" here, but removed it to |         # Initially I had "--eval-command=continue" here, but removed it to | ||||||
|  | @ -130,18 +130,18 @@ def get_gdb_repr(self, source, | ||||||
|                      import_site=False): |                      import_site=False): | ||||||
|         # Given an input python source representation of data, |         # Given an input python source representation of data, | ||||||
|         # run "python -c'print DATA'" under gdb with a breakpoint on |         # run "python -c'print DATA'" under gdb with a breakpoint on | ||||||
|         # PyObject_Print and scrape out gdb's representation of the "op" |         # textiowrapper_write and scrape out gdb's representation of the "op" | ||||||
|         # parameter, and verify that the gdb displays the same string |         # parameter, and verify that the gdb displays the same string | ||||||
|         # |         # | ||||||
|         # For a nested structure, the first time we hit the breakpoint will |         # For a nested structure, the first time we hit the breakpoint will | ||||||
|         # give us the top-level structure |         # give us the top-level structure | ||||||
|         gdb_output = self.get_stack_trace(source, breakpoint='PyObject_Print', |         gdb_output = self.get_stack_trace(source, breakpoint='textiowrapper_write', | ||||||
|                                           cmds_after_breakpoint=cmds_after_breakpoint, |                                           cmds_after_breakpoint=cmds_after_breakpoint, | ||||||
|                                           import_site=import_site) |                                           import_site=import_site) | ||||||
|         # gdb can insert additional '\n' and space characters in various places |         # gdb can insert additional '\n' and space characters in various places | ||||||
|         # in its output, depending on the width of the terminal it's connected |         # in its output, depending on the width of the terminal it's connected | ||||||
|         # to (using its "wrap_here" function) |         # to (using its "wrap_here" function) | ||||||
|         m = re.match('.*#0\s+PyObject_Print\s+\(\s*op\=\s*(.*?),\s+fp=.*\).*', |         m = re.match('.*#0\s+textiowrapper_write\s+\(\s*op\=\s*(.*?),\s+fp=.*\).*', | ||||||
|                      gdb_output, re.DOTALL) |                      gdb_output, re.DOTALL) | ||||||
|         if not m: |         if not m: | ||||||
|             self.fail('Unexpected gdb output: %r\n%s' % (gdb_output, gdb_output)) |             self.fail('Unexpected gdb output: %r\n%s' % (gdb_output, gdb_output)) | ||||||
|  | @ -163,7 +163,7 @@ def get_sample_script(self): | ||||||
| class PrettyPrintTests(DebuggerTests): | class PrettyPrintTests(DebuggerTests): | ||||||
|     def test_getting_backtrace(self): |     def test_getting_backtrace(self): | ||||||
|         gdb_output = self.get_stack_trace('print(42)') |         gdb_output = self.get_stack_trace('print(42)') | ||||||
|         self.assertTrue('PyObject_Print' in gdb_output) |         self.assertTrue('textiowrapper_write' in gdb_output) | ||||||
| 
 | 
 | ||||||
|     def assertGdbRepr(self, val, cmds_after_breakpoint=None): |     def assertGdbRepr(self, val, cmds_after_breakpoint=None): | ||||||
|         # Ensure that gdb's rendering of the value in a debugged process |         # Ensure that gdb's rendering of the value in a debugged process | ||||||
|  | @ -533,7 +533,7 @@ def foo(a, b, c): | ||||||
| 
 | 
 | ||||||
| foo(3, 4, 5) | foo(3, 4, 5) | ||||||
| print foo.__code__''', | print foo.__code__''', | ||||||
|                                           breakpoint='PyObject_Print', |                                           breakpoint='textiowrapper_write', | ||||||
|                                           cmds_after_breakpoint=['print (PyFrameObject*)(((PyCodeObject*)op)->co_zombieframe)'] |                                           cmds_after_breakpoint=['print (PyFrameObject*)(((PyCodeObject*)op)->co_zombieframe)'] | ||||||
|                                           ) |                                           ) | ||||||
|         self.assertTrue(re.match(r'.*\s+\$1 =\s+Frame 0x[0-9a-f]+, for file <string>, line 3, in foo \(\)\s+.*', |         self.assertTrue(re.match(r'.*\s+\$1 =\s+Frame 0x[0-9a-f]+, for file <string>, line 3, in foo \(\)\s+.*', | ||||||
|  |  | ||||||
|  | @ -19,7 +19,7 @@ | ||||||
| In particular, given a gdb.Value corresponding to a PyObject* in the inferior | In particular, given a gdb.Value corresponding to a PyObject* in the inferior | ||||||
| process, we can generate a "proxy value" within the gdb process.  For example, | process, we can generate a "proxy value" within the gdb process.  For example, | ||||||
| given a PyObject* in the inferior process that is in fact a PyListObject* | given a PyObject* in the inferior process that is in fact a PyListObject* | ||||||
| holding three PyObject* that turn out to be PyStringObject* instances, we can | holding three PyObject* that turn out to be PyBytesObject* instances, we can | ||||||
| generate a proxy value within the gdb process that is a list of strings: | generate a proxy value within the gdb process that is a list of strings: | ||||||
|   ["foo", "bar", "baz"] |   ["foo", "bar", "baz"] | ||||||
| 
 | 
 | ||||||
|  | @ -108,7 +108,7 @@ def getvalue(self): | ||||||
| class PyObjectPtr(object): | class PyObjectPtr(object): | ||||||
|     """ |     """ | ||||||
|     Class wrapping a gdb.Value that's a either a (PyObject*) within the |     Class wrapping a gdb.Value that's a either a (PyObject*) within the | ||||||
|     inferior process, or some subclass pointer e.g. (PyStringObject*) |     inferior process, or some subclass pointer e.g. (PyBytesObject*) | ||||||
| 
 | 
 | ||||||
|     There will be a subclass for every refined PyObject type that we care |     There will be a subclass for every refined PyObject type that we care | ||||||
|     about. |     about. | ||||||
|  | @ -319,7 +319,7 @@ def subclass_from_type(cls, t): | ||||||
|         if tp_flags & Py_TPFLAGS_TUPLE_SUBCLASS: |         if tp_flags & Py_TPFLAGS_TUPLE_SUBCLASS: | ||||||
|             return PyTupleObjectPtr |             return PyTupleObjectPtr | ||||||
|         if tp_flags & Py_TPFLAGS_STRING_SUBCLASS: |         if tp_flags & Py_TPFLAGS_STRING_SUBCLASS: | ||||||
|             return PyStringObjectPtr |             return PyBytesObjectPtr | ||||||
|         if tp_flags & Py_TPFLAGS_UNICODE_SUBCLASS: |         if tp_flags & Py_TPFLAGS_UNICODE_SUBCLASS: | ||||||
|             return PyUnicodeObjectPtr |             return PyUnicodeObjectPtr | ||||||
|         if tp_flags & Py_TPFLAGS_DICT_SUBCLASS: |         if tp_flags & Py_TPFLAGS_DICT_SUBCLASS: | ||||||
|  | @ -958,8 +958,8 @@ def write_repr(self, out, visited): | ||||||
|         out.write('])') |         out.write('])') | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class PyStringObjectPtr(PyObjectPtr): | class PyBytesObjectPtr(PyObjectPtr): | ||||||
|     _typename = 'PyStringObject' |     _typename = 'PyBytesObject' | ||||||
| 
 | 
 | ||||||
|     def __str__(self): |     def __str__(self): | ||||||
|         field_ob_size = self.field('ob_size') |         field_ob_size = self.field('ob_size') | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Victor Stinner
						Victor Stinner