Fix ONERR GOTO handling - should skip to next line. Resolves #7

This commit is contained in:
Joshua Bell 2015-12-06 15:47:15 -08:00
parent 3542aa89e6
commit 20f302339f
2 changed files with 77 additions and 64 deletions

View File

@ -632,7 +632,6 @@ this.basic = (function() {
throw new EndProgram();
},
//////////////////////////////////////////////////////////////////////
//
// Error Handling Statements
@ -641,6 +640,7 @@ this.basic = (function() {
'onerr_goto': function ONERR_GOTO(line) {
state.onerr_handler = line;
throw new NextLine();
},
'resume': function RESUME() {

View File

@ -10,9 +10,12 @@
110 A = 1 : A$ = "a" : A(1) = 2 : A$(1) = "b" : CLEAR
200 REM Feature Detection
210 LR = 0 : ONERR GOTO 220 : GR : LR = 1
220 HR = 0 : ONERR GOTO 240 : HGR : HR = 1
230 PD = 0 : ONERR GOTO 240 : X = PDL(0) : PD = 1
210 LR = 0 : ONERR GOTO 220
211 GR : LR = 1
220 HR = 0 : ONERR GOTO 240
221 HGR : HR = 1
230 PD = 0 : ONERR GOTO 240
231 X = PDL(0) : PD = 1
240 POKE 216,0
300 PR#3 : TEXT : HOME : PRINT "Unit Tests"
@ -122,125 +125,128 @@
3000 PRINT : PRINT "Error Handling ";
3010 T$ = "ONERR GOTO"
: T = 1 : ONERR GOTO 3015 : T = 1 / 0
3011 T = 2
: T = 1 : ONERR GOTO 3015
3011 T = 1 / 0
3012 T = 2
3015 S = (T=1) : GOSUB 1
3020 T$ = "RESUME"
: T = 0 : ONERR GOTO 3025 : T = 1 / T : GOTO 3029
: T = 0 : ONERR GOTO 3025
3021 T = 1 / T : GOTO 3029
3025 T = 1 : RESUME
3029 S = (T=1) : GOSUB 1
3040 T$ = "RETURN FROM LOOP"
: T = 1 : ONERR GOTO 3046
: GOSUB 3045
3041 GOSUB 3045
: GOTO 3048
3045 FOR I = 1 TO 10 : RETURN
3046 T = 2 : REM ONERR goes here
3048 S = (T=1) : GOSUB 1
3100 T$ = "NEXT WITHOUT FOR"
: T = 1 : ONERR GOTO 3101
: NEXT
: T = 1 : ONERR GOTO 3102
3101 NEXT
: T = 2
3101 S = (T=1) AND (PEEK(222)=0) : GOSUB 1
3102 S = (T=1) AND (PEEK(222)=0) : GOSUB 1
3110 T$ = "SYNTAX ERROR" : REM Compile time only, can't test!
3120 T$ = "RETURN WITHOUT GOSUB"
: T = 1 : ONERR GOTO 3121
: RETURN
: T = 1 : ONERR GOTO 3122
3121 RETURN
: T = 2
3121 S = (T=1) AND (PEEK(222)=22) : GOSUB 1
3122 S = (T=1) AND (PEEK(222)=22) : GOSUB 1
3130 T$ = "OUT OF DATA"
: T = 1 : ONERR GOTO 3131
: FOR A = 1 TO 1000 : READ A$ : NEXT
: T = 1 : ONERR GOTO 3132
3131 FOR A = 1 TO 1000 : READ A$ : NEXT
: T = 2
3131 S = (T=1) AND (PEEK(222)=42) : GOSUB 1
3132 S = (T=1) AND (PEEK(222)=42) : GOSUB 1
3140 T$ = "ILLEGAL QUANTITY"
: T = 1 : ONERR GOTO 3141
: A% = 32768
: T = 1 : ONERR GOTO 3142
3141 A% = 32768
: T = 2
3141 S = (T=1) AND (PEEK(222)=53) : GOSUB 1
3142 S = (T=1) AND (PEEK(222)=53) : GOSUB 1
3145 T$ = "ILLEGAL QUANTITY"
: T = 1 : ONERR GOTO 3146
: A = ASC("")
: T = 1 : ONERR GOTO 3147
3146 A = ASC("")
: T = 2
3146 S = (T=1) AND (PEEK(222)=53) : GOSUB 1
3147 S = (T=1) AND (PEEK(222)=53) : GOSUB 1
3150 T$ = "OVERFLOW" :
: T = 1 : ONERR GOTO 3151
: A = 256^256^256
: T = 1 : ONERR GOTO 3152
3151 A = 256^256^256
: T = 2
3151 S = (T=1) AND (PEEK(222)=69) : GOSUB 1
3152 S = (T=1) AND (PEEK(222)=69) : GOSUB 1
3160 T$ = "OUT OF MEMORY" : REM Not consistent enough across browsers
: REM T = 1 : ONERR GOTO 3161
: REM A$ = "x"
: REM T = 1 : ONERR GOTO 3162
3161 REM A$ = "x"
: REM FOR I = 0 TO 1 STEP 0 : A$ = A$ + A$ : NEXT
: REM T = 2
3161 REM S = (T=1) AND (PEEK(222)=77) : GOSUB 1
3162 REM S = (T=1) AND (PEEK(222)=77) : GOSUB 1
3170 T$ = "UNDEFINED STATEMENT" :
: T = 1 : ONERR GOTO 3171
: GOTO 3172
: T = 1 : ONERR GOTO 3172
3171 GOTO 3173
: T = 2
3171 S = (T=1) AND (PEEK(222)=90) : GOSUB 1
3172 S = (T=1) AND (PEEK(222)=90) : GOSUB 1
3180 T$ = "BAD SUBSCRIPT" :
: T = 1 : ONERR GOTO 3181
: DIM BS(3) : BS(4) = 123
: T = 1 : ONERR GOTO 3182
3181 DIM BS(3) : BS(4) = 123
: T = 2
3181 S = (T=1) AND (PEEK(222)=107) : GOSUB 1
3182 S = (T=1) AND (PEEK(222)=107) : GOSUB 1
3190 T$ = "REDIMENSION ARRAY" :
: T = 1 : ONERR GOTO 3191
: DIM RA(3) : DIM RA(3)
: T = 1 : ONERR GOTO 3192
3191 DIM RA(3) : DIM RA(3)
: T = 2
3191 S = (T=1) AND (PEEK(222)=120) : GOSUB 1
3192 S = (T=1) AND (PEEK(222)=120) : GOSUB 1
3200 T$ = "DIVISION BY ZERO" :
: T = 1 : ONERR GOTO 3201
: A = 1 / 0
: T = 1 : ONERR GOTO 3202
3201 A = 1 / 0
: T = 2
3201 S = (T=1) AND (PEEK(222)=133) : GOSUB 1
3202 S = (T=1) AND (PEEK(222)=133) : GOSUB 1
3210 T$ = "TYPE MISMATCH" :
: T = 1 : ONERR GOTO 3211
: RESTORE : FOR I = 1 TO 1000 : READ A : NEXT
: T = 1 : ONERR GOTO 3212
3211 RESTORE : FOR I = 1 TO 1000 : READ A : NEXT
: T = 2
3211 S = (T=1) AND (PEEK(222)=163) : GOSUB 1
3212 S = (T=1) AND (PEEK(222)=163) : GOSUB 1
3215 T$ = "TYPE MISMATCH" :
: T = 1 : ONERR GOTO 3216
: RESTORE : FOR I = 1 TO 1000 : READ A% : NEXT
: T = 1 : ONERR GOTO 3217
3216 RESTORE : FOR I = 1 TO 1000 : READ A% : NEXT
: T = 2
3216 S = (T=1) AND (PEEK(222)=163) : GOSUB 1
3217 S = (T=1) AND (PEEK(222)=163) : GOSUB 1
3220 T$ = "STRING TOO LONG" : REM Strings are "infinite", can't test
3220 T$ = "STRING TOO LONG"
: REM Strings are "infinite", can't test
3230 T$ = "FORMULA TOO COMPLEX"
: REM T = 1 : ONERR GOTO 3231
: REM DEF FN FC(x) = FN FC(x) + 1 : X = FN FC(0)
: REM T = 1 : ONERR GOTO 3232
3231 REM DEF FN FC(x) = FN FC(x) + 1 : X = FN FC(0)
: REM T = 2
3231 REM S = (T=1) AND (PEEK(222)=191): GOSUB 1
3232 REM S = (T=1) AND (PEEK(222)=191): GOSUB 1
3240 T$ = "UNDEFINED FUNCTION" :
: T = 1 : ONERR GOTO 3241
: X = FN UF(0)
: T = 1 : ONERR GOTO 3242
3241 X = FN UF(0)
: T = 2
3241 S = (T=1) AND (PEEK(222)=224) : GOSUB 1
3242 S = (T=1) AND (PEEK(222)=224) : GOSUB 1
3250 T$ = "RE-ENTER" : REM Can't test until input can be synthesized
3260 T$ = "BREAK" :
: T = 1 : ONERR GOTO 3261
: STOP
: T = 1 : ONERR GOTO 3262
3261 STOP
: T = 2
3261 S = (T=1) AND (PEEK(222)=255) : GOSUB 1
3262 S = (T=1) AND (PEEK(222)=255) : GOSUB 1
3270 T$ = "CALL-3288" :
: T = 1 : ONERR GOTO 3274
@ -254,6 +260,12 @@
: RETURN
3275 S = (T=3) : GOSUB 1
3280 T$ = "ONERR GOTO skips rest of line"
: T = 1
: ONERR GOTO 3281
: T = 2
3281 S = (T=1) : GOSUB 1
3999 POKE 216,0 : REM Disable ONERR handler
@ -748,7 +760,8 @@
17040 T$ = "Sequential Access/ONERR"
: PRINT CHR$(4)"OPEN JABBERWOCKY"
: PRINT CHR$(4)"READ JABBERWOCKY"
: ONERR GOTO 17042 : N = 0
: ONERR GOTO 17042
17041 N = 0
: FOR N = 0 TO 10 : INPUT A$ : NEXT
17042 POKE 216,0 : PRINT CHR$(4)"CLOSE" : S = (N = 4) : GOSUB 1
@ -801,16 +814,16 @@
: S = (A2(1.5) = 123) : GOSUB 1
18060 T$ = "Array Lower Bounds"
: T = 1 : ONERR GOTO 18061
: X = A2(-1) :
: T = 1 : ONERR GOTO 18062
18061 X = A2(-1) :
: T = 2
18061 S = (T=1) AND (PEEK(222)=53) : GOSUB 1 : POKE 216,0
18062 S = (T=1) AND (PEEK(222)=53) : GOSUB 1 : POKE 216,0
18070 T$ = "Array Upper Bounds"
: T = 1 : ONERR GOTO 18071
: X = A2(11) :
: T = 1 : ONERR GOTO 18072
18071 X = A2(11) :
: T = 2
18071 S = (T=1) AND (PEEK(222)=107) : GOSUB 1 : POKE 216,0
18072 S = (T=1) AND (PEEK(222)=107) : GOSUB 1 : POKE 216,0
18080 T$ = "Duplicate Lines"
18081 T = 1