diff mbox

libstdc++/77645 fix deque and vector xmethods for Python 3

Message ID 20160919171125.GA31777@redhat.com
State New
Headers show

Commit Message

Jonathan Wakely Sept. 19, 2016, 5:11 p.m. UTC
The problem for these xmethods is that in Python 3 division of two
integers produces a float, and GDB then doesn't allow that value
to be used for pointer arithmetic (https://sourceware.org/PR20622).

	PR libstdc++/77645
	* python/libstdcxx/v6/xmethods.py (DequeWorkerBase.__init__)
	(DequeWorkerBase.index, VectorWorkerBase.get): Cast results of
	division to int to work with Python 3.

Tested x86_64-linux, committed to trunk.

I'll fix it for gcc-5 and gcc-6 too.
commit a1eda07dc44e271ea07c266624b600cbae257b58
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Mon Sep 19 18:02:36 2016 +0100

    libstdc++/77645 fix deque and vector xmethods for Python 3
    
    	PR libstdc++/77645
    	* python/libstdcxx/v6/xmethods.py (DequeWorkerBase.__init__)
    	(DequeWorkerBase.index, VectorWorkerBase.get): Cast results of
    	division to int to work with Python 3.

Comments

Joe Buck Sept. 19, 2016, 5:24 p.m. UTC | #1
Python has a distinct integer division operator, "//".  7 // 3 returns the integer 2.

-----Original Message-----
From: libstdc++-owner@gcc.gnu.org [mailto:libstdc++-owner@gcc.gnu.org] On Behalf Of Jonathan Wakely
Sent: Monday, September 19, 2016 10:11 AM
To: libstdc++@gcc.gnu.org; gcc-patches@gcc.gnu.org
Subject: [PATCH] libstdc++/77645 fix deque and vector xmethods for Python 3

The problem for these xmethods is that in Python 3 division of two integers produces a float, and GDB then doesn't allow that value to be used for pointer arithmetic (https://sourceware.org/PR20622).

	PR libstdc++/77645
	* python/libstdcxx/v6/xmethods.py (DequeWorkerBase.__init__)
	(DequeWorkerBase.index, VectorWorkerBase.get): Cast results of
	division to int to work with Python 3.

Tested x86_64-linux, committed to trunk.

I'll fix it for gcc-5 and gcc-6 too.
Jonathan Wakely Sept. 19, 2016, 5:37 p.m. UTC | #2
On 19/09/16 17:24 +0000, Joe Buck wrote:
>Python has a distinct integer division operator, "//".  7 // 3 returns the integer 2.

Python 3 does, but Python 2 doesn't have it unless you import it from
__future, and I don't know how far back that works. I don't want to
introduce a fix for Python 3 that breaks it for old systems.

Using a cast is clear and (AFAIK) works with all versions.
Joseph Myers Sept. 19, 2016, 9:39 p.m. UTC | #3
On Mon, 19 Sep 2016, Jonathan Wakely wrote:

> On 19/09/16 17:24 +0000, Joe Buck wrote:
> > Python has a distinct integer division operator, "//".  7 // 3 returns the
> > integer 2.
> 
> Python 3 does, but Python 2 doesn't have it unless you import it from
> __future, and I don't know how far back that works. I don't want to
> introduce a fix for Python 3 that breaks it for old systems.

No, // is available in Python, without needing __future__, from 2.2 
onwards.
diff mbox

Patch

diff --git a/libstdc++-v3/python/libstdcxx/v6/xmethods.py b/libstdc++-v3/python/libstdcxx/v6/xmethods.py
index 95f9af9..71a5b75 100644
--- a/libstdc++-v3/python/libstdcxx/v6/xmethods.py
+++ b/libstdc++-v3/python/libstdcxx/v6/xmethods.py
@@ -165,7 +165,7 @@  class ArrayMethodsMatcher(gdb.xmethod.XMethodMatcher):
 class DequeWorkerBase(gdb.xmethod.XMethodWorker):
     def __init__(self, val_type):
         self._val_type = val_type
-        self._bufsize = (512 / val_type.sizeof) or 1
+        self._bufsize = int(512 / val_type.sizeof) or 1
 
     def size(self, obj):
         first_node = obj['_M_impl']['_M_start']['_M_node']
@@ -176,7 +176,7 @@  class DequeWorkerBase(gdb.xmethod.XMethodWorker):
 
     def index(self, obj, idx):
         first_node = obj['_M_impl']['_M_start']['_M_node']
-        index_node = first_node + idx / self._bufsize
+        index_node = first_node + int(idx / self._bufsize)
         return index_node[0][idx % self._bufsize]
 
 class DequeEmptyWorker(DequeWorkerBase):
@@ -419,7 +419,7 @@  class VectorWorkerBase(gdb.xmethod.XMethodWorker):
         if self._val_type.code == gdb.TYPE_CODE_BOOL:
             start = obj['_M_impl']['_M_start']['_M_p']
             bit_size = start.dereference().type.sizeof * 8
-            valp = start + index / bit_size
+            valp = start + int(index / bit_size)
             offset = index % bit_size
             return (valp.dereference() & (1 << offset)) > 0
         else: