7101 - tile: remove quotes when evaluating strings
This found several bugs due to me not checking for null strings.
This commit is contained in:
parent
8a6ad45d8d
commit
a148b23a22
|
@ -25,6 +25,9 @@ write: # f: fd or (addr stream byte), s: (addr array byte)
|
||||||
# . prologue
|
# . prologue
|
||||||
55/push-ebp
|
55/push-ebp
|
||||||
89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp
|
89/copy 3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp
|
||||||
|
# if (s == 0) return
|
||||||
|
81 7/subop/compare 1/mod/*+disp8 5/rm32/ebp . . . . 0xc/disp8 0/imm32 # compare *(ebp+12)
|
||||||
|
74/jump-if-= $write:end/disp8
|
||||||
# if (f < 0x08000000) _write(f, s) and return # f can't be a user-mode address, so treat it as a kernel file descriptor
|
# if (f < 0x08000000) _write(f, s) and return # f can't be a user-mode address, so treat it as a kernel file descriptor
|
||||||
81 7/subop/compare 1/mod/*+disp8 5/rm32/ebp . . . . 8/disp8 0x08000000/imm32 # compare *(ebp+8)
|
81 7/subop/compare 1/mod/*+disp8 5/rm32/ebp . . . . 8/disp8 0x08000000/imm32 # compare *(ebp+8)
|
||||||
73/jump-if-addr>= $write:fake/disp8
|
73/jump-if-addr>= $write:fake/disp8
|
||||||
|
|
|
@ -113,3 +113,44 @@ test-stream-to-string:
|
||||||
89/<- %esp 5/r32/ebp
|
89/<- %esp 5/r32/ebp
|
||||||
5d/pop-to-ebp
|
5d/pop-to-ebp
|
||||||
c3/return
|
c3/return
|
||||||
|
|
||||||
|
# like stream-to-string but ignore surrounding quotes
|
||||||
|
# we might do other stuff here later
|
||||||
|
unquote-stream-to-string: # in: (addr stream _), out: (addr handle array _)
|
||||||
|
# . prologue
|
||||||
|
55/push-ebp
|
||||||
|
89/<- %ebp 4/r32/esp
|
||||||
|
# . save registers
|
||||||
|
50/push-eax
|
||||||
|
51/push-ecx
|
||||||
|
52/push-edx
|
||||||
|
56/push-esi
|
||||||
|
# esi = s
|
||||||
|
8b/-> *(ebp+8) 6/r32/esi
|
||||||
|
# var len/ecx: int = s->write - s->read - 2
|
||||||
|
8b/-> *esi 1/r32/ecx
|
||||||
|
2b/subtract *(esi+4) 1/r32/ecx
|
||||||
|
81 7/subop/compare %ecx 2/imm32
|
||||||
|
7c/jump-if-< $unquote-stream-to-string:end/disp8
|
||||||
|
81 5/subop/subtract %ecx 2/imm32
|
||||||
|
# allocate
|
||||||
|
(allocate-array Heap %ecx *(ebp+0xc))
|
||||||
|
# var in/edx: (addr byte) = s->data + s->read + 1
|
||||||
|
8b/-> *(esi+4) 2/r32/edx
|
||||||
|
8d/copy-address *(esi+edx+0xd) 2/r32/edx # Stream-data + 1
|
||||||
|
# var dest/eax: (addr byte) = data for out
|
||||||
|
8b/-> *(ebp+0xc) 0/r32/eax
|
||||||
|
(lookup *eax *(eax+4)) # => eax
|
||||||
|
8d/copy-address *(eax+4) 0/r32/eax
|
||||||
|
#
|
||||||
|
(copy-bytes %edx %eax %ecx)
|
||||||
|
$unquote-stream-to-string:end:
|
||||||
|
# . restore registers
|
||||||
|
5e/pop-to-esi
|
||||||
|
5a/pop-to-edx
|
||||||
|
59/pop-to-ecx
|
||||||
|
58/pop-to-eax
|
||||||
|
# . epilogue
|
||||||
|
89/<- %esp 5/r32/ebp
|
||||||
|
5d/pop-to-ebp
|
||||||
|
c3/return
|
||||||
|
|
1
400.mu
1
400.mu
|
@ -177,6 +177,7 @@ sig new-buffered-file out: (addr handle buffered-file)
|
||||||
sig stream-empty? s: (addr stream _) -> result/eax: boolean
|
sig stream-empty? s: (addr stream _) -> result/eax: boolean
|
||||||
sig stream-full? s: (addr stream _) -> result/eax: boolean
|
sig stream-full? s: (addr stream _) -> result/eax: boolean
|
||||||
sig stream-to-string in: (addr stream _), out: (addr handle array _)
|
sig stream-to-string in: (addr stream _), out: (addr handle array _)
|
||||||
|
sig unquote-stream-to-string in: (addr stream _), out: (addr handle array _)
|
||||||
sig stream-first s: (addr stream byte) -> result/eax: byte
|
sig stream-first s: (addr stream byte) -> result/eax: byte
|
||||||
sig stream-final s: (addr stream byte) -> result/eax: byte
|
sig stream-final s: (addr stream byte) -> result/eax: byte
|
||||||
|
|
||||||
|
|
BIN
apps/assort
BIN
apps/assort
Binary file not shown.
BIN
apps/braces
BIN
apps/braces
Binary file not shown.
BIN
apps/calls
BIN
apps/calls
Binary file not shown.
BIN
apps/crenshaw2-1
BIN
apps/crenshaw2-1
Binary file not shown.
Binary file not shown.
BIN
apps/dquotes
BIN
apps/dquotes
Binary file not shown.
BIN
apps/factorial
BIN
apps/factorial
Binary file not shown.
BIN
apps/sigils
BIN
apps/sigils
Binary file not shown.
BIN
apps/survey
BIN
apps/survey
Binary file not shown.
BIN
apps/tests
BIN
apps/tests
Binary file not shown.
|
@ -77,12 +77,7 @@ fn test {
|
||||||
initialize-environment-with-fake-screen env, 5, 0xa
|
initialize-environment-with-fake-screen env, 5, 0xa
|
||||||
var g/eax: grapheme <- copy 0x22 # '"'
|
var g/eax: grapheme <- copy 0x22 # '"'
|
||||||
process env, g
|
process env, g
|
||||||
g <- copy 0x31 # '1'
|
render env
|
||||||
process env, g
|
|
||||||
g <- copy 0x20 # space
|
|
||||||
process env, g
|
|
||||||
g <- copy 0x33 # '3'
|
|
||||||
process env, g
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn repl {
|
fn repl {
|
||||||
|
|
|
@ -109,7 +109,7 @@ fn evaluate functions: (addr handle function), bindings: (addr table), scratch:
|
||||||
break-if-!=
|
break-if-!=
|
||||||
var h: (handle array byte)
|
var h: (handle array byte)
|
||||||
var s/eax: (addr handle array byte) <- address h
|
var s/eax: (addr handle array byte) <- address h
|
||||||
stream-to-string curr-stream, s # leak
|
unquote-stream-to-string curr-stream, s # leak
|
||||||
push-string-to-value-stack out, *s
|
push-string-to-value-stack out, *s
|
||||||
break $evaluate:process-word
|
break $evaluate:process-word
|
||||||
}
|
}
|
||||||
|
|
|
@ -130,6 +130,8 @@ fn value-stack-max-width _self: (addr value-stack) -> result/eax: int {
|
||||||
break-if-!=
|
break-if-!=
|
||||||
var s-ah/eax: (addr handle array byte) <- get g, text-data
|
var s-ah/eax: (addr handle array byte) <- get g, text-data
|
||||||
var s/eax: (addr array byte) <- lookup *s-ah
|
var s/eax: (addr array byte) <- lookup *s-ah
|
||||||
|
compare s, 0
|
||||||
|
break-if-=
|
||||||
var w/eax: int <- length s
|
var w/eax: int <- length s
|
||||||
compare w, out
|
compare w, out
|
||||||
break-if-<=
|
break-if-<=
|
||||||
|
|
Loading…
Reference in New Issue