summaryrefslogtreecommitdiff
path: root/module/language/tree-il/cps-primitives.scm
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2018-01-19 21:57:03 +0100
committerAndy Wingo <wingo@pobox.com>2018-01-19 21:57:03 +0100
commit557acdbbba9e3bcc1108d81cbf8c2f7c14fcb29a (patch)
treedf9eb06704d73168960f518cb18de49b2ea320c1 /module/language/tree-il/cps-primitives.scm
parent310c34e11200db58f59c119d58c65822728ba3ba (diff)
downloadguile-557acdbbba9e3bcc1108d81cbf8c2f7c14fcb29a.tar.gz
Instruction explosion for struct-ref, struct-set!
* module/language/cps/effects-analysis.scm (&memory-kind-mask): Add &bitmask, for the bitmask in vtables. (annotation->memory-kind): Add 'bitmask case. * module/language/tree-il/compile-cps.scm (ensure-struct-index-in-range): (prepare-struct-scm-access): New helpers. (struct-ref/immediate, struct-set!/immediate): New exploded lowering routines. (struct-ref, struct-set!): New lowering routines that just do a call. (canonicalize): Remove struct-ref hack; lowering procedures will handle it. * module/language/tree-il/cps-primitives.scm (bytevector-length): Define struct-set! as returning a value.
Diffstat (limited to 'module/language/tree-il/cps-primitives.scm')
-rw-r--r--module/language/tree-il/cps-primitives.scm6
1 files changed, 5 insertions, 1 deletions
diff --git a/module/language/tree-il/cps-primitives.scm b/module/language/tree-il/cps-primitives.scm
index 6888ab9f8..be92de6a0 100644
--- a/module/language/tree-il/cps-primitives.scm
+++ b/module/language/tree-il/cps-primitives.scm
@@ -104,7 +104,11 @@
(define-cps-primitive struct-vtable 1 1)
(define-cps-primitive allocate-struct 2 1)
(define-cps-primitive struct-ref 2 1)
-(define-cps-primitive struct-set! 3 0)
+
+;; Unhappily, and undocumentedly, struct-set! returns the value that was
+;; set. There is code that relies on this. The struct-set! lowering
+;; routines ensure this return arity.
+(define-cps-primitive struct-set! 3 1)
(define-cps-primitive class-of 1 1)