Author: Ronny Pfannschmidt <[email protected]>
Branch: 
Changeset: r190:b2fe479ec33c
Date: 2012-05-03 18:10 +0200
http://bitbucket.org/pypy/pyrepl/changeset/b2fe479ec33c/

Log:    refactor unix eventqueue decoding

diff --git a/pyrepl/unix_eventqueue.py b/pyrepl/unix_eventqueue.py
--- a/pyrepl/unix_eventqueue.py
+++ b/pyrepl/unix_eventqueue.py
@@ -76,7 +76,7 @@
     def __init__(self, keymap, encoding):
         self.k = self.ck = keymap
         self.events = []
-        self.buf = []
+        self.buf = bytearray()
         self.encoding=encoding
 
     def get(self):
@@ -89,32 +89,33 @@
         return not self.events
 
     def flush_buf(self):
-        raw = b''.join(self.buf)
-        self.buf = []
-        return raw
+        old = self.buf
+        self.buf = bytearray()
+        return old
 
     def insert(self, event):
         trace('added event {event}', event=event)
         self.events.append(event)
 
     def push(self, char):
+        self.buf.append(char)
         if char in self.k:
+            if self.k is self.ck:
+                #sanity check, buffer is empty when a special key comes
+                assert len(self.buf) == 1
             k = self.k[char]
             trace('found map {k!r}', k=k)
-            self.buf.append(char)
             if isinstance(k, dict):
                 self.k = k
             else:
                 self.insert(Event('key', k, self.flush_buf()))
                 self.k = self.ck
-        elif self.buf:
-            keys = self.flush_buf()
-            decoded = keys.decode(self.encoding, 'ignore')  # XXX surogate?
-            #XXX: incorrect
-            for c in decoded:
-                self.insert(Event('key', c, c))
-            self.buf = []
+
+        else:
+            try:
+                decoded = bytes(self.buf).decode(self.encoding)
+            except:
+                return
+
+            self.insert(Event('key', decoded, self.flush_buf()))
             self.k = self.ck
-            self.push(char)
-        else:
-            self.insert(Event('key', char.decode(self.encoding), char))
diff --git a/testing/test_unix_reader.py b/testing/test_unix_reader.py
--- a/testing/test_unix_reader.py
+++ b/testing/test_unix_reader.py
@@ -1,3 +1,4 @@
+from __future__ import unicode_literals
 from pyrepl.unix_eventqueue import EncodedQueue
 
 from pyrepl import curses
@@ -6,3 +7,11 @@
 def test_simple():
     q = EncodedQueue({}, 'utf-8')
 
+    a = u'\u1234'
+    b = a.encode('utf-8')
+    for c in b:
+        q.push(c)
+
+    event = q.get()
+    assert q.get() is None
+
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to