mirror of
https://github.com/hsoft/collapseos.git
synced 2024-11-27 15:18:05 +11:00
lib/expr: fix stack imbalance on failure
This commit is contained in:
parent
4760d044c0
commit
981c93bfd4
@ -45,10 +45,11 @@ _parseApply:
|
|||||||
; Here we do some stack kung fu. We have, in HL, a string pointer we
|
; Here we do some stack kung fu. We have, in HL, a string pointer we
|
||||||
; want to keep. We have, in (SP), our left result we want to use.
|
; want to keep. We have, in (SP), our left result we want to use.
|
||||||
ex (sp), hl ; <-> lvl 1
|
ex (sp), hl ; <-> lvl 1
|
||||||
ret nz
|
jr nz, .end
|
||||||
push af ; --> lvl 2, save ending operator
|
push af ; --> lvl 2, save ending operator
|
||||||
call callIX
|
call callIX
|
||||||
pop af ; <-- lvl 2, restore operator.
|
pop af ; <-- lvl 2, restore operator.
|
||||||
|
.end:
|
||||||
pop hl ; <-- lvl 1, restore str pointer
|
pop hl ; <-- lvl 1, restore str pointer
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
@ -6,6 +6,12 @@
|
|||||||
; lib/fmt
|
; lib/fmt
|
||||||
|
|
||||||
testNum: .db 1
|
testNum: .db 1
|
||||||
|
; Each time we call assertSP, we verify that our stack isn't imbalanced by
|
||||||
|
; comparing SP to its saved value. Whenever your "base" SP value change,
|
||||||
|
; generally at the beginning of a test routine, run "ld (testSP), sp" to have
|
||||||
|
; proper value saved to heap.
|
||||||
|
testSP: .dw 0xffff
|
||||||
|
|
||||||
|
|
||||||
STDIO_PUTC:
|
STDIO_PUTC:
|
||||||
out (0), a
|
out (0), a
|
||||||
@ -69,6 +75,20 @@ testList:
|
|||||||
pop hl ; <-- lvl 1
|
pop hl ; <-- lvl 1
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
; test that SP == testSP
|
||||||
|
assertSP:
|
||||||
|
ld hl, (testSP)
|
||||||
|
; offset the fact that we call assertSP
|
||||||
|
dec hl \ dec hl
|
||||||
|
or a ; reset carry
|
||||||
|
sbc hl, sp
|
||||||
|
ret z
|
||||||
|
ld hl, .msg
|
||||||
|
call printstr
|
||||||
|
jr fail
|
||||||
|
.msg:
|
||||||
|
.db "Wrong SP", CR, LF, 0
|
||||||
|
|
||||||
nexttest:
|
nexttest:
|
||||||
ld a, (testNum)
|
ld a, (testNum)
|
||||||
inc a
|
inc a
|
||||||
|
@ -53,6 +53,7 @@ test:
|
|||||||
jp nz, fail
|
jp nz, fail
|
||||||
|
|
||||||
call testParseExpr
|
call testParseExpr
|
||||||
|
call testSPOnFail
|
||||||
|
|
||||||
; success
|
; success
|
||||||
xor a
|
xor a
|
||||||
@ -130,3 +131,15 @@ testParseExpr:
|
|||||||
.alltests:
|
.alltests:
|
||||||
.dw .t1, .t2, .t3, .t4, .t5, .t6, .t7, .t8, .t9, .t10, .t11, .t12
|
.dw .t1, .t2, .t3, .t4, .t5, .t6, .t7, .t8, .t9, .t10, .t11, .t12
|
||||||
.dw .t13, .t14, .t15, 0
|
.dw .t13, .t14, .t15, 0
|
||||||
|
|
||||||
|
; Ensure that stack is balanced on failure
|
||||||
|
testSPOnFail:
|
||||||
|
ld (testSP), sp
|
||||||
|
ld hl, .sFail
|
||||||
|
call parseExpr
|
||||||
|
call assertNZ
|
||||||
|
call assertSP
|
||||||
|
jp nexttest
|
||||||
|
|
||||||
|
.sFail: .db "1+abc123", 0
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user