bug-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#64919: 28.2; jsonrpc.el: jsonrpc-lambda failed to deal with single v


From: Yue Yi
Subject: bug#64919: 28.2; jsonrpc.el: jsonrpc-lambda failed to deal with single value
Date: Sat, 29 Jul 2023 01:59:09 +0900

Currently I'm trying to write an toturial about using JSON-RPC in Emacs, so I spent some time to read the source code and document and found #bug64888.
 
Here is another bug I find: When I do a async request through `jsonrpc-async-request' without specifing :success-fn, emacs will signal an error. Here is the code I use:
 
--- 
(defclass yy-rpc (jsonrpc-connection)
  ((place
    :initarg :place
    :accessor yy-place)))
(cl-defmethod jsonrpc-connection-send ((conn yy-rpc)
                                 &key id method params result error)
  (setcar (yy-place conn)
          (append (if id `(:id ,id))
                 (if method `(:method ,method))
                 (if params `(:params ,params))
                 (if result `(:result ,result))
                 (if error  `(:error  ,error)))))
(setq a (cons nil nil))
(setq b (yy-rpc :name "1" :place a))
 
(jsonrpc-async-request b "add" [1 2])
(jsonrpc-connection-receive b '(:result 3 :id 1))
---
 
I just make a very simple subclass `yy-rpc' and response to it "by hand", after evaluating the above code, I get:
 
---
Debugger entered--Lisp error: (wrong-type-argument listp 3)
---
 
By reading the code of `jsonrpc--async-request-1', I find the default :success-fn callback uses the macro jsonrpc-lambda and I know why it happened:
 
---
(funcall (jsonrpc-lambda (&rest _ignored) nil) 3)
=> Debugger entered--Lisp error: (wrong-type-argument listp 3)
---
 
It seems that `jsonrpc-lambda' cannot handle single value. Maybe We can change its last line from
 
`(lambda (,e) (apply (cl-function (lambda ,cl-lambda-list ,@body)) ,e))))
 
to
 
`(lambda (,e) (apply (cl-function (lambda ,cl-lambda-list ,@body)) ,e ())))
 
After change it and M-x eval-buffer, I can get the right behavior using the code above.
 
Is it the right way?
 
Regards
 
YI YUE

reply via email to

[Prev in Thread] Current Thread [Next in Thread]