summary refs log tree commit diff
diff options
context:
space:
mode:
authorIrene Knapp <ireneista@irenes.space>2026-09-03 15:02:53 -0700
committerIrene Knapp <ireneista@irenes.space>2026-09-03 15:37:52 -0700
commit2d84431c52997410925f7d118afb70b2c0750fc2 (patch)
tree87642505c44f51ab8c73ac9b0044384d33e7bd3e
parent6b0e81fe0712b757a6e1d6b8c4c66c874bd57e92 (diff)
hex transform of packalign now implemented
hex.e doesn't actually call packalign, so this was tested by temporarily modifying it to do so (not checked in)

Force-Push: yes
Change-Id: Ie266c3bda6e65e055da5d88acfe248d6487ab6cc
-rw-r--r--transform.e70
1 files changed, 70 insertions, 0 deletions
diff --git a/transform.e b/transform.e
index 69e7d05..26f4adb 100644
--- a/transform.e
+++ b/transform.e
@@ -2629,6 +2629,7 @@ allocate-transformation-state s" transformation-state" variable
 : hex-output-metadata-entry-type-line-comment 0 ;
 : hex-output-metadata-entry-type-line-break 1 ;
 : hex-output-metadata-entry-type-string-literal 2 ;
+: hex-output-metadata-entry-type-alignment 3 ;
 
 ~   Initialize the contents of the output metadata to all zeroes. This is
 ~ called from hex-transform at its top level, at the very start, to make sure
@@ -2858,6 +2859,15 @@ allocate-transformation-state s" transformation-state" variable
           0x22 value@ emitstring drop
           newline
         } if
+
+        dup hex-output-metadata-entry-type @
+        hex-output-metadata-entry-type-alignment = {
+          newline
+          ." ~ Alignment padding to width "
+          dup hex-output-metadata-entry-string @ .
+          newline
+        } if
+
       } if
       hex-output-metadata-next-entry
     } while
@@ -3030,6 +3040,66 @@ allocate-transformation-state s" transformation-state" variable
     exit
   } if
 
+  dup s" packalign" stringcmp 0 = {
+    create dropstring
+    s" docol" find entry-to-execution-token execute ,
+    make-hidden
+
+    ~ (output point, alignment byte count)
+    s" 2dup" find entry-to-execution-token ,
+
+    ~   We can't use unpackalign because this patch happens at the time
+    ~ packalign is being defined, and it would be a forward reference. We do
+    ~ the equivalent by hand.
+    s" dup" find entry-to-execution-token ,
+    s" 3unroll" find entry-to-execution-token ,
+    s" dup" find entry-to-execution-token ,
+    s" 3unroll" find entry-to-execution-token ,
+    s" 1-" find entry-to-execution-token ,
+    s" +" find entry-to-execution-token ,
+    s" swap" find entry-to-execution-token ,
+    s" /%" find entry-to-execution-token ,
+    s" swap" find entry-to-execution-token ,
+    s" drop" find entry-to-execution-token ,
+    s" *" find entry-to-execution-token ,
+    ~ (output point, alignment byte count, padding end)
+
+    ~ We can't use pick, either.
+    s" 3roll" find entry-to-execution-token ,
+    s" dup" find entry-to-execution-token ,
+    s" dup" find entry-to-execution-token ,
+    s" lit" find entry-to-execution-token ,
+    5 ,
+    s" unroll" find entry-to-execution-token ,
+    ~ (output point, alignment byte count, padding end, output point,
+    ~  output point)
+
+    s" 3unroll" find entry-to-execution-token ,
+    s" -" find entry-to-execution-token ,
+    ~ (output point, alignment byte count, padding start, padding length)
+
+    ' hex-output-metadata-entry-type-alignment entry-to-execution-token ,
+    ~ (output point, alignment byte count, padding start, padding length,,
+    ~  entry type)
+
+    ~ Again, no pick.
+    s" lit" find entry-to-execution-token ,
+    4 ,
+    s" roll" find entry-to-execution-token ,
+    s" dup" find entry-to-execution-token ,
+    s" lit" find entry-to-execution-token ,
+    5 ,
+    s" unroll" find entry-to-execution-token ,
+
+    ~ (output point, alignment byte count, padding start, padding length,
+    ~  entry type, alignment byte count)
+    ' add-hex-output-metadata-entry entry-to-execution-token ,
+    ~ (output point, alignment byte count)
+    ~ Fall through to the inner implementation.
+
+    ' ] entry-to-execution-token execute
+    exit
+  } if
 
   ~   If no special case matches, we fall back to just being a regular colon.
   ~ We already read the word name above, so we have to do the rest of the