Add more tests.
Chris Pressey
4 years ago
3222 | 3222 | | } |
3223 | 3223 | = ok |
3224 | 3224 | |
3225 | Here, we declare that main outputs `a`, and we `goto` two routines, and they both output `a`. | |
3226 | ||
3227 | | define bar0 routine | |
3228 | | inputs x | |
3229 | | outputs a | |
3230 | | trashes x, z, n | |
3231 | | { | |
3232 | | ld a, x | |
3233 | | } | |
3234 | | | |
3235 | | define bar1 routine | |
3236 | | inputs x | |
3237 | | outputs a | |
3238 | | trashes x, z, n | |
3239 | | { | |
3240 | | ld a, 200 | |
3241 | | } | |
3242 | | | |
3243 | | define main routine | |
3244 | | outputs a | |
3245 | | trashes x, z, n | |
3246 | | { | |
3247 | | ld x, 0 | |
3248 | | if z { | |
3249 | | ld x, 1 | |
3250 | | goto bar0 | |
3251 | | } else { | |
3252 | | ld x, 2 | |
3253 | | goto bar1 | |
3254 | | } | |
3255 | | } | |
3256 | = ok | |
3257 | ||
3258 | Here is like just above, but one routine doesn't output `a`. | |
3259 | ||
3260 | | define bar0 routine | |
3261 | | inputs x | |
3262 | | outputs a | |
3263 | | trashes x, z, n | |
3264 | | { | |
3265 | | ld a, x | |
3266 | | } | |
3267 | | | |
3268 | | define bar1 routine | |
3269 | | inputs x | |
3270 | | trashes x, z, n | |
3271 | | { | |
3272 | | ld x, 200 | |
3273 | | } | |
3274 | | | |
3275 | | define main routine | |
3276 | | outputs a | |
3277 | | trashes x, z, n | |
3278 | | { | |
3279 | | ld x, 0 | |
3280 | | if z { | |
3281 | | ld x, 1 | |
3282 | | goto bar0 | |
3283 | | } else { | |
3284 | | ld x, 2 | |
3285 | | goto bar1 | |
3286 | | } | |
3287 | | } | |
3288 | ? InconsistentExitError | |
3289 | ||
3290 | Here is like the above, but the two routines have different inputs, and that's OK. | |
3291 | ||
3292 | | define bar0 routine | |
3293 | | inputs x | |
3294 | | outputs a | |
3295 | | trashes x, z, n | |
3296 | | { | |
3297 | | ld a, x | |
3298 | | } | |
3299 | | | |
3300 | | define bar1 routine | |
3301 | | outputs a | |
3302 | | trashes x, z, n | |
3303 | | { | |
3304 | | ld a, 200 | |
3305 | | } | |
3306 | | | |
3307 | | define main routine | |
3308 | | outputs a | |
3309 | | trashes x, z, n | |
3310 | | { | |
3311 | | ld x, 0 | |
3312 | | if z { | |
3313 | | ld x, 1 | |
3314 | | goto bar0 | |
3315 | | } else { | |
3316 | | ld x, 2 | |
3317 | | goto bar1 | |
3318 | | } | |
3319 | | } | |
3320 | = ok | |
3321 | ||
3225 | 3322 | TODO: we should have a lot more test cases for the above, here. |
3226 | 3323 | |
3227 | 3324 | Can't `goto` a routine that outputs or trashes more than the current routine. |