Oh boy, here we go...
Finally getting back to poking at this. Apparently my Common Lisp has gotten
better in the past six months because good lord this code looks bad now.
Anyway, a few changes:
* Make it run on CCL by working around a usocket bug.
* Remove the workaround hacks. It's never gonna work with Fireplace anyway.
* Make the socket stream once instead of on every read/write so the GC doesn't hate us.
author |
Steve Losh <steve@stevelosh.com> |
date |
Sat, 09 Apr 2016 20:42:34 +0000 |
parents |
7753eedff7fe |
children |
e342c4a78a57 |
(in-package #:nrepl)
;;;; In/out
(defun write-object (socket-stream lock map)
"Bencode and write `map` to `socket-stream` while holding `lock`."
(bt:with-lock-held (lock)
(bencode:encode map socket-stream)
(force-output socket-stream)))
(defun read-object (socket-stream)
"Read and bdecode a map from `socket-stream`."
(fset:convert 'fset:map (bencode:decode socket-stream)))
;;; Patch in support for writing fset data types to bencode
(defmethod bencode:encode ((fm fset:map) stream &key &allow-other-keys)
(bencode:encode (fset:convert 'hash-table fm) stream))
(defmethod bencode:encode ((fs fset:set) stream &key &allow-other-keys)
(bencode:encode (fset:convert 'list fs) stream))
(defmethod bencode:encode ((fb fset:bag) stream &key &allow-other-keys)
(bencode:encode (fset:convert 'list fb) stream))
(defmethod bencode:encode ((fb fset:seq) stream &key &allow-other-keys)
(bencode:encode (fset:convert 'list fb) stream))