Commit | Line | Data |
---|---|---|
b39a6394 VS |
1 | (in-package "PARENSCRIPT") |
2 | ||
06babcf5 | 3 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
4a987e2b | 4 | ;;; ParenScript namespace system |
06babcf5 | 5 | |
4a987e2b | 6 | ;;; Symbol obfuscation |
4dae66e8 | 7 | (defvar *obfuscated-packages* (make-hash-table)) |
06babcf5 | 8 | |
4dae66e8 VS |
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)) | |
06babcf5 | 12 | |
0c542be0 | 13 | (defun unobfuscate-package (package-designator) |
4dae66e8 | 14 | (remhash (find-package package-designator) *obfuscated-packages*)) |
06babcf5 | 15 | |
0c542be0 | 16 | (defun maybe-obfuscate-symbol (symbol) |
4dae66e8 VS |
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))) | |
06babcf5 | 22 | |
0c542be0 | 23 | ;;; Interface for printing identifiers |
06babcf5 | 24 | |
4a987e2b VS |
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*)) | |
06babcf5 | 31 | |
5ffb1eba VS |
32 | (defun symbol-to-js-string (symbol &optional (mangle-symbol-name t)) |
33 | (let ((symbol-name (funcall (if mangle-symbol-name | |
34 | #'symbol-name-to-js-string | |
35 | #'symbol-name) | |
36 | (maybe-obfuscate-symbol symbol)))) | |
dd4442b8 VS |
37 | (aif (ps-package-prefix (symbol-package symbol)) |
38 | (format nil "~A~A" it symbol-name) | |
39 | symbol-name))) |