about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rwxr-xr-xapps/desugarbin39177 -> 39374 bytes
-rw-r--r--apps/desugar.subx65
2 files changed, 64 insertions, 1 deletions
diff --git a/apps/desugar b/apps/desugar
index e61d9bed..66ca0e0f 100755
--- a/apps/desugar
+++ b/apps/desugar
Binary files differdiff --git a/apps/desugar.subx b/apps/desugar.subx
index dd8737ee..2d5762ce 100644
--- a/apps/desugar.subx
+++ b/apps/desugar.subx
@@ -226,7 +226,7 @@ $convert:direct-mode:
 $convert:check-for-indirect-mode:
     # if (!slice-starts-with?(word-slice, "*")) goto next check
     3d/compare-EAX-and  0x2a/imm32/asterisk
-    75/jump-if-not-equal  $convert:regular-word/disp8
+    75/jump-if-not-equal  $convert:check-for-invalid-addition/disp8
 $convert:indirect-mode:
     # emit-indirect-mode(word-slice, out)
     # . . push args
@@ -238,6 +238,14 @@ $convert:indirect-mode:
     81          0/subop/add         3/mod/direct    4/rm32/ESP    .           .             .           .           .               4/imm32           # add to ESP
     # continue
     e9/jump  $convert:next-word/disp32
+$convert:check-for-invalid-addition:
+    # if (slice-starts-with?(word-slice, "+")) goto error1
+    3d/compare-EAX-and  0x2b/imm32/plus
+    74/jump-if-equal  $convert:error1/disp8
+$convert:check-for-invalid-left-shift:
+    # if (slice-starts-with?(word-slice, "<")) goto error1
+    3d/compare-EAX-and  0x3c/imm32/less-than
+    74/jump-if-equal  $convert:error1/disp8
 $convert:regular-word:
     # write-slice-buffered(out, word-slice)
     # . . push args
@@ -291,6 +299,61 @@ $convert:end:
     5d/pop-to-EBP
     c3/return
 
+$convert:error1:
+    # print(stderr, "error: '" EAX "' only permitted within '*(...)' in '" line "'")
+    # . write-buffered(Stderr, "error: '")
+    # . . push args
+    68/push  "error: '"/imm32
+    68/push  Stderr/imm32
+    # . . call
+    e8/call  write-buffered/disp32
+    # . . discard args
+    81          0/subop/add         3/mod/direct    4/rm32/ESP    .           .             .           .           .               8/imm32           # add to ESP
+    # . write-byte-buffered(Stderr, EAX)
+    # . . push args
+    50/push-EAX
+    68/push  Stderr/imm32
+    # . . call
+    e8/call  write-byte-buffered/disp32
+    # . . discard args
+    81          0/subop/add         3/mod/direct    4/rm32/ESP    .           .             .           .           .               8/imm32           # add to ESP
+    # . write-buffered(Stderr, "' only permitted within '*(...)' in '")
+    # . . push args
+    68/push  "' only permitted within '*(...)' in '"/imm32
+    68/push  Stderr/imm32
+    # . . call
+    e8/call  write-buffered/disp32
+    # . . discard args
+    81          0/subop/add         3/mod/direct    4/rm32/ESP    .           .             .           .           .               8/imm32           # add to ESP
+    # . write-stream-data(Stderr, line)
+    # . . push args
+    51/push-ECX
+    68/push  Stderr/imm32
+    # . . call
+    e8/call  write-stream-data/disp32
+    # . . discard args
+    81          0/subop/add         3/mod/direct    4/rm32/ESP    .           .             .           .           .               8/imm32           # add to ESP
+    # . write-buffered(Stderr, "'")
+    # . . push args
+    68/push  "'"/imm32
+    68/push  Stderr/imm32
+    # . . call
+    e8/call  write-buffered/disp32
+    # . . discard args
+    81          0/subop/add         3/mod/direct    4/rm32/ESP    .           .             .           .           .               8/imm32           # add to ESP
+    # . flush(Stderr)
+    # . . push args
+    68/push  Stderr/imm32
+    # . . call
+    e8/call  flush/disp32
+    # . . discard args
+    81          0/subop/add         3/mod/direct    4/rm32/ESP    .           .             .           .           .               4/imm32           # add to ESP
+    # . syscall(exit, 1)
+    bb/copy-to-EBX  1/imm32
+    b8/copy-to-EAX  1/imm32/exit
+    cd/syscall  0x80/imm8
+    # never gets here
+
 # beware: modifies 'word'
 emit-direct-mode:  # word : (address slice), out : (address buffered-file)
     # . prolog