Skip to content

Instantly share code, notes, and snippets.

@vibhavp
Created October 12, 2017 13:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vibhavp/8f04b671776d18b25b738aa68d264e24 to your computer and use it in GitHub Desktop.
Save vibhavp/8f04b671776d18b25b738aa68d264e24 to your computer and use it in GitHub Desktop.
preprocess.el
(require 'ht)
(defun pp-nan (expr)
(if (symbolp expr)
(if (string-prefix-p "nan" (symbol-name expr))
"nan"
(if (string-prefix-p "-nan" (symbol-name expr))
"-nan"
expr))
expr))
(defun pp-const (val)
(pcase val
(`(f32.const ,const) (format "f32:%s" (pp-nan const)))
(`(f64.const ,const) (format "f64:%s" (pp-nan const)))
(`(i32.const ,const) (format "i32:%s" (pp-nan const)))
(`(i64.const ,const) (format "i64:%s" (pp-nan const)))
(_ (error "Invalid value expression"))))
(defun pp-invoke (expr)
`(:function ,(nth 1 expr) :args ,(cl-coerce (mapcar #'pp-const (cddr expr)) 'vector)))
(defun pp-assert-return (expr)
(cl-assert (eq (caadr expr) 'invoke))
(let ((hash (ht<-plist (pp-invoke (nth 1 expr))))
(rtrn (if (null (caddr expr)) nil
(pp-const (caddr expr)))))
(puthash "return" rtrn hash)
hash))
(defun pp-assert-trap (expr)
(cl-assert (eq (caadr expr) 'invoke))
(let ((hash (ht<-plist (pp-invoke (nth 1 expr))))
(trap-msg (caddr expr)))
(puthash "trap" trap-msg hash)
hash))
(defun pp-expr (expr)
(pcase (car expr)
('assert_return (pp-assert-return expr))
((or 'assert_return_arithmetic_nan 'assert_return_canonical_nan)
(pp-assert-return `(assert-return ,@ (cdr expr) (f64.const nan))))
('assert_trap (pp-assert-trap expr))
(_ (error "Unrecognized expression"))))
(defun pp-kill-json (tests)
(kill-new (json-encode (mapcar #'pp-expr tests))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment