Skip to content

Commit 5e91ae2

Browse files
refactor unix eventqueue decoding
1 parent baf27e0 commit 5e91ae2

File tree

2 files changed

+25
-15
lines changed

2 files changed

+25
-15
lines changed

pyrepl/unix_eventqueue.py

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ class EncodedQueue(object):
7676
def __init__(self, keymap, encoding):
7777
self.k = self.ck = keymap
7878
self.events = []
79-
self.buf = []
79+
self.buf = bytearray()
8080
self.encoding=encoding
8181

8282
def get(self):
@@ -89,32 +89,33 @@ def empty(self):
8989
return not self.events
9090

9191
def flush_buf(self):
92-
raw = b''.join(self.buf)
93-
self.buf = []
94-
return raw
92+
old = self.buf
93+
self.buf = bytearray()
94+
return old
9595

9696
def insert(self, event):
9797
trace('added event {event}', event=event)
9898
self.events.append(event)
9999

100100
def push(self, char):
101+
self.buf.append(char)
101102
if char in self.k:
103+
if self.k is self.ck:
104+
#sanity check, buffer is empty when a special key comes
105+
assert len(self.buf) == 1
102106
k = self.k[char]
103107
trace('found map {k!r}', k=k)
104-
self.buf.append(char)
105108
if isinstance(k, dict):
106109
self.k = k
107110
else:
108111
self.insert(Event('key', k, self.flush_buf()))
109112
self.k = self.ck
110-
elif self.buf:
111-
keys = self.flush_buf()
112-
decoded = keys.decode(self.encoding, 'ignore') # XXX surogate?
113-
#XXX: incorrect
114-
for c in decoded:
115-
self.insert(Event('key', c, c))
116-
self.buf = []
117-
self.k = self.ck
118-
self.push(char)
113+
119114
else:
120-
self.insert(Event('key', char.decode(self.encoding), char))
115+
try:
116+
decoded = bytes(self.buf).decode(self.encoding)
117+
except:
118+
return
119+
120+
self.insert(Event('key', decoded, self.flush_buf()))
121+
self.k = self.ck

testing/test_unix_reader.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from __future__ import unicode_literals
12
from pyrepl.unix_eventqueue import EncodedQueue
23

34
from pyrepl import curses
@@ -6,3 +7,11 @@
67
def test_simple():
78
q = EncodedQueue({}, 'utf-8')
89

10+
a = u'\u1234'
11+
b = a.encode('utf-8')
12+
for c in b:
13+
q.push(c)
14+
15+
event = q.get()
16+
assert q.get() is None
17+

0 commit comments

Comments
 (0)