Skip to content

Commit 4e6f02c

Browse files
committed
Remove some uses of buffer()
It looks like the uses of buffer() here were just to do a non-copying slice - i.e. buffer(data, p) is equivalent to data[p:], but it points to the existing memory used for data rather than copying it. I'm proposing this change for discussion: it replaces the buffer calls with standard slicing. If bytes objects are passed in, this will copy data, with some potential performance loss - how much depends on how many times we're slicing each chunk of data. The tests are not measurably slower. If the overhead of copying is significant, the caller of the parsing machinery can pass in a memoryview object, on which slices should be non-copying. I think this should mostly work with no changes to this code, but if that's important, we should obviously test it. This reduces the number of test failures on Python 3 to 251 (26 failures, 225 errors). Tests still pass on Python 2.
1 parent 574ca06 commit 4e6f02c

File tree

1 file changed

+17
-17
lines changed

1 file changed

+17
-17
lines changed

Xlib/protocol/rq.py

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,7 @@ def parse_binary_value(self, data, display, length, format):
410410
else:
411411
slen = length
412412

413-
return str(data[:length]), buffer(data, slen)
413+
return str(data[:length]), data[slen:]
414414

415415

416416
class String16(ValueField):
@@ -445,7 +445,7 @@ def parse_binary_value(self, data, display, length, format):
445445
else:
446446
slen = length
447447

448-
return struct.unpack('>' + 'H' * length, data[:length * 2]), buffer(data, slen * 2)
448+
return struct.unpack('>' + 'H' * length, data[:length * 2]), data[slen * 2:]
449449

450450

451451

@@ -489,7 +489,7 @@ def parse_binary_value(self, data, display, length, format):
489489

490490
pos = pos + slen
491491

492-
data = buffer(data, pos)
492+
data = data[pos:]
493493

494494
else:
495495
ret = [None] * int(length)
@@ -514,10 +514,10 @@ def parse_binary_value(self, data, display, length, format):
514514

515515
pos = pos + slen
516516

517-
data = buffer(data, pos)
517+
data = data[pos:]
518518

519519
if self.pad:
520-
data = buffer(data, len(data) % 4)
520+
data = data[len(data) % 4:]
521521

522522
return ret, data
523523

@@ -625,15 +625,15 @@ def parse_binary_value(self, data, display, length, format):
625625

626626
elif format == 8:
627627
ret = (8, str(data[:length]))
628-
data = buffer(data, length + ((4 - length % 4) % 4))
628+
data = data[length + ((4 - length % 4) % 4):]
629629

630630
elif format == 16:
631631
ret = (16, array(array_unsigned_codes[2], str(data[:2 * length])))
632-
data = buffer(data, 2 * (length + length % 2))
632+
data = data[2 * (length + length % 2):]
633633

634634
elif format == 32:
635635
ret = (32, array(array_unsigned_codes[4], str(data[:4 * length])))
636-
data = buffer(data, 4 * length)
636+
data = data[4 * length:]
637637

638638
return ret, data
639639

@@ -728,7 +728,7 @@ def parse_binary_value(self, data, display, length, format):
728728
r = {}
729729

730730
mask = int(struct.unpack(self.maskcode, data[:self.maskcodelen])[0])
731-
data = buffer(data, self.maskcodelen)
731+
data = data[self.maskcodelen:]
732732

733733
for field, flag in self.fields:
734734
if mask & flag:
@@ -745,7 +745,7 @@ def parse_binary_value(self, data, display, length, format):
745745
vals, d = field.parse_binary_value(data[:4], display, None, None)
746746

747747
r[field.name] = vals
748-
data = buffer(data, 4)
748+
data = data[4:]
749749

750750
return DictWrapper(r), data
751751

@@ -765,7 +765,7 @@ def parse_binary_value(self, data, display, length, format):
765765
for i in range(0, len(a), format):
766766
ret.append(a[i : i + format])
767767

768-
return ret, buffer(data, dlen)
768+
return ret, data[dlen:]
769769

770770
def pack_value(self, value):
771771
keycodes = 0
@@ -793,7 +793,7 @@ def parse_binary_value(self, data, display, length, format):
793793
for i in range(0, 8):
794794
ret.append(a[i * format : (i + 1) * format])
795795

796-
return ret, buffer(data, 8 * format)
796+
return ret, data[8 * format:]
797797

798798
def pack_value(self, value):
799799
if len(value) != 8:
@@ -830,7 +830,7 @@ def parse_binary_value(self, data, display, length, format):
830830
# this etype refers to a set of sub-events with individual subcodes
831831
estruct = estruct[ord(data[1])]
832832

833-
return estruct(display = display, binarydata = data[:32]), buffer(data, 32)
833+
return estruct(display = display, binarydata = data[:32]), data[32:]
834834

835835

836836
#
@@ -877,7 +877,7 @@ def pack_value(self, val):
877877

878878
def parse_binary(self, data, display):
879879
slen = ord(data[0]) + 1
880-
return data[1:slen], buffer(data, slen)
880+
return data[1:slen], data[slen:]
881881

882882
Str = StrClass()
883883

@@ -1270,7 +1270,7 @@ def parse_binary(self, data, display, rawdict = 0):
12701270
fno = fno + 1
12711271
vno = vno + f.structvalues
12721272

1273-
code = code + ' data = buffer(data, %d)\n' % self.static_size
1273+
code = code + ' data = data[%d:]\n' % self.static_size
12741274

12751275
# Call parse_binary_value for each var_field, passing the
12761276
# length and format values from the unpacked val.
@@ -1357,11 +1357,11 @@ def parse_binary_value(self, data, display, length, format):
13571357
# font change
13581358
if ord(data[0]) == 255:
13591359
values.append(struct.unpack('>L', str(data[1:5]))[0])
1360-
data = buffer(data, 5)
1360+
data = data[5:]
13611361

13621362
# skip null strings
13631363
elif ord(data[0]) == 0 and ord(data[1]) == 0:
1364-
data = buffer(data, 2)
1364+
data = data[2:]
13651365

13661366
# string with delta
13671367
else:

0 commit comments

Comments
 (0)