summary refs log tree commit diff
path: root/transform.e
diff options
context:
space:
mode:
Diffstat (limited to 'transform.e')
-rw-r--r--transform.e138
1 files changed, 138 insertions, 0 deletions
diff --git a/transform.e b/transform.e
index a137c0c..d4c1c43 100644
--- a/transform.e
+++ b/transform.e
@@ -702,6 +702,7 @@ allocate-transform-state s" transform-state" variable
   dup s" L!'" stringcmp 0 = { drop -1 exit } if
   dup s" ," stringcmp 0 = { drop -1 exit } if
 
+  dup s" foo" stringcmp 0 = { drop 0 exit } if ~ DO NOT SUBMIT
   ~   If we get here, that's a problem. Emit an error message to make sure
   ~ it's easy to diagnose. We also return a comically large negative value,
   ~ to make sure things fail as quickly as possible afterwards.
@@ -1896,6 +1897,131 @@ allocate-transform-state s" transform-state" variable
   ; make-immediate
 
 
+~   Not to be outdone by the label transform, the log-load transform also
+~ offers alternates of all the high-level flow-control words: if, unless,
+~ if-else, forever, and while. Unlike the label transform, we also need to
+~ implement alternates of { and }, because their values need to be on the
+~ stack at log-load "immediate" time, not at transform time.
+~
+~   Anyway, most of the implementation is deferred to pre-packaged words in
+~ log-load.e.
+: log-load-left-curly-brace-alternate
+  log-load-roll-log-address
+
+  swap-transform-variables
+  L@' log-load-left-curly-brace
+  swap-transform-variables
+
+  offset-to-target-address-space ,               ~ log-load-left-curly-brace
+
+  ~ It pushes a start pointer onto the stack.
+  1 transform-apply-stack-delta
+
+  log-load-unroll-log-address
+  ; make-immediate
+
+
+: log-load-right-curly-brace-alternate
+  log-load-roll-log-address
+
+  swap-transform-variables
+  L@' log-load-right-curly-brace
+  swap-transform-variables
+
+  offset-to-target-address-space ,               ~ log-load-right-curly-brace
+
+  ~ It pushes a length value onto the stack.
+  1 transform-apply-stack-delta
+
+  log-load-unroll-log-address
+  ; make-immediate
+
+
+~ (start pointer, length --)
+: log-load-if-alternate
+  log-load-roll-log-address
+
+  swap-transform-variables
+  L@' log-load-if
+  swap-transform-variables
+
+  offset-to-target-address-space ,               ~ log-load-if
+
+  ~ It pops the start and length.
+  -2 transform-apply-stack-delta
+
+  log-load-unroll-log-address
+  ; make-immediate
+
+
+~ (start pointer, length)
+: label-unless-alternate
+  log-load-roll-log-address
+
+  swap-transform-variables
+  L@' log-load-unless
+  swap-transform-variables
+
+  offset-to-target-address-space ,               ~ log-load-unless
+
+  ~ It pops the start and length.
+  -2 transform-apply-stack-delta
+
+  log-load-unroll-log-address
+  ; make-immediate
+
+
+~ (true start, true length, false start, false length)
+: log-load-if-else-alternate
+  log-load-roll-log-address
+
+  swap-transform-variables
+  L@' log-load-if-else
+  swap-transform-variables
+
+  offset-to-target-address-space ,               ~ log-load-if-else
+
+  ~ It pops two pairs of start and length.
+  -4 transform-apply-stack-delta
+
+  log-load-unroll-log-address
+  ; make-immediate
+
+
+~ (start, length --)
+: log-load-forever-alternate
+  log-load-roll-log-address
+
+  swap-transform-variables
+  L@' log-load-forever
+  swap-transform-variables
+
+  offset-to-target-address-space ,               ~ log-load-forever
+
+  ~ It pops the start and length.
+  -2 transform-apply-stack-delta
+
+  log-load-unroll-log-address
+  ; make-immediate
+
+
+~ (test start, test length, body start, body length --)
+: log-load-while-alternate
+  log-load-roll-log-address
+
+  swap-transform-variables
+  L@' log-load-while
+  swap-transform-variables
+
+  offset-to-target-address-space ,               ~ log-load-while
+
+  ~ It pops two pairs of start and length.
+  -4 transform-apply-stack-delta
+
+  log-load-unroll-log-address
+  ; make-immediate
+
+
 ~   This implements the log-load transform for a single word. It is directly
 ~ analogous to "interpret", and reading interpret.e may help in understanding
 ~ it, though it's meant to still make sense on its own.
@@ -1945,6 +2071,18 @@ allocate-transform-state s" transform-state" variable
     swap drop ' log-load-dot-string-alternate swap } if
   dup s" L@'" stringcmp 0 = { swap drop ' log-load-L@'-alternate swap } if
   dup s" L!'" stringcmp 0 = { swap drop ' log-load-L!'-alternate swap } if
+  dup s" {" stringcmp 0 = {
+    swap drop ' log-load-left-curly-brace-alternate swap } if
+  dup s" }" stringcmp 0 = {
+    swap drop ' log-load-right-curly-brace-alternate swap } if
+  dup s" if" stringcmp 0 = { swap drop ' log-load-if-alternate swap } if
+  dup s" unless" stringcmp 0 = {
+    swap drop ' log-load-unless-alternate swap } if
+  dup s" if-else" stringcmp 0 = {
+    swap drop ' log-load-if-else-alternate swap } if
+  dup s" forever" stringcmp 0 = {
+    swap drop ' log-load-forever-alternate swap } if
+  dup s" while" stringcmp 0 = { swap drop ' log-load-while-alternate swap } if
   ~ (name as stack string, 0 or alternate entry pointer, name pointer)
 
   ~   If we have an alternate, we want to run that now, regardless of what