| 1 | (in-package "PARENSCRIPT") |
| 2 | |
| 3 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
| 4 | ;;; ParenScript namespace system |
| 5 | |
| 6 | ;;; Symbol obfuscation |
| 7 | (defvar *obfuscated-packages* (make-hash-table)) |
| 8 | |
| 9 | (defun obfuscate-package (package-designator &optional (symbol-map (make-hash-table))) |
| 10 | "symbol-map can either be a hash table or a closure that takes a symbol as its only argument." |
| 11 | (setf (gethash (find-package package-designator) *obfuscated-packages*) symbol-map)) |
| 12 | |
| 13 | (defun unobfuscate-package (package-designator) |
| 14 | (remhash (find-package package-designator) *obfuscated-packages*)) |
| 15 | |
| 16 | (defun maybe-obfuscate-symbol (symbol) |
| 17 | (ctypecase (gethash (symbol-package symbol) *obfuscated-packages*) |
| 18 | (hash-table (let ((symbol-map (gethash (symbol-package symbol) *obfuscated-packages*))) |
| 19 | (or (gethash symbol symbol-map) (setf (gethash symbol symbol-map) (ps-gensym "G"))))) |
| 20 | (function (funcall (gethash (symbol-package symbol) *obfuscated-packages*) symbol)) |
| 21 | (null symbol))) |
| 22 | |
| 23 | ;;; Interface for printing identifiers |
| 24 | |
| 25 | (defvar *package-prefix-table* (make-hash-table)) |
| 26 | |
| 27 | (defmacro ps-package-prefix (package) |
| 28 | "Place for storing a string to be prefixed to any symbols in the |
| 29 | designated package when translating ParenScript code." |
| 30 | `(gethash (find-package ,package) *package-prefix-table*)) |
| 31 | |
| 32 | (defun js-translate-symbol (symbol) |
| 33 | (let ((possibly-obfuscated-symbol (maybe-obfuscate-symbol symbol))) |
| 34 | (if (ps-package-prefix (symbol-package symbol)) |
| 35 | (format nil "~A~A" (ps-package-prefix (symbol-package symbol)) (symbol-to-js-string possibly-obfuscated-symbol)) |
| 36 | (symbol-to-js-string possibly-obfuscated-symbol)))) |