summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2018-03-12 23:54:42 -0700
committerKaz Kylheku <kaz@kylheku.com>2018-03-12 23:54:42 -0700
commit4c0019ef1bf58ccb782e52bc3db5032e3df45e77 (patch)
tree44c1556555e1513f4c8e56b05ec35a4c3a5761d4
parentbf523ef3457d20fd1b1c3e8113136966ec035177 (diff)
downloadtxr-4c0019ef1bf58ccb782e52bc3db5032e3df45e77.tar.gz
txr-4c0019ef1bf58ccb782e52bc3db5032e3df45e77.tar.bz2
txr-4c0019ef1bf58ccb782e52bc3db5032e3df45e77.zip
asm: support gensym labels.
Remove restriction that labels are keywords; a compiler cannot pollute the keyword space to generate labels. We allow them to be uninterned symbols also. * share/txr/stdlib/asm.tl (assembler parse-args, assembler asm-one): Use is-label instead of keywordp. (is-label): New function. (op-label): Use is-label test.
-rw-r--r--share/txr/stdlib/asm.tl13
1 files changed, 9 insertions, 4 deletions
diff --git a/share/txr/stdlib/asm.tl b/share/txr/stdlib/asm.tl
index 4871dd4f..be83a0e3 100644
--- a/share/txr/stdlib/asm.tl
+++ b/share/txr/stdlib/asm.tl
@@ -116,7 +116,7 @@
(when me.(immediate-fits-type arg type)
arg))
(l (cond
- ((keywordp arg) me.(lookup-label arg oc))
+ ((is-label arg) me.(lookup-label arg oc))
((integerp arg) arg)))
(n (if (integerp arg) arg))
(o arg)
@@ -142,7 +142,7 @@
(:method asm-one (me syntax)
(let ((oc (cond
- ((keywordp syntax) [%oc-hash% 'label])
+ ((is-label syntax) [%oc-hash% 'label])
((consp syntax) [%oc-hash% (car syntax)]))))
(unless oc
(error "assembler: invalid instruction ~s" syntax))
@@ -196,6 +196,11 @@
(set [%oc-hash% oc.symbol] oc)
(set [%oc-hash% oc.code] oc))
+(defun is-label (obj)
+ (or (keywordp obj)
+ (and (symbolp obj)
+ (not (symbol-package obj)))))
+
(defun parse-operand (str)
(cond
((r^$ #/t[0-9A-Fa-f][0-9A-Fa-f]?/ str)
@@ -242,8 +247,8 @@
(defopcode op-label label nil
(:method asm (me asm syntax)
- (unless (keywordp syntax)
- asm.(synerr "label must be keyword"))
+ (unless (is-label syntax)
+ asm.(synerr "label must be keyword or gensym"))
asm.(define-label syntax))
(:method dis (me asm extension operand)))