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

View File

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