@@ -9099,22 +9099,32 @@ DO
9099
9099
END IF
9100
9100
END IF
9101
9101
9102
- IF n = 4 THEN
9102
+ IF n = 4 OR n = 5 THEN
9103
9103
IF getelements(a$, 1, 3) = "ON" + sp + "ERROR" + sp + "GOTO" THEN
9104
9104
l$ = SCase$("On" + sp + "Error" + sp + "GoTo")
9105
9105
lbl$ = getelement$(ca$, 4)
9106
- IF lbl$ = "0" THEN
9106
+ hhc$ = UCASE$(lbl$) '(H)andler(H)istory(C)ommand
9107
+ IF n = 5 THEN
9108
+ IF hhc$ = "_LASTHANDLER" OR (hhc$ = "LASTHANDLER" AND qb64prefix_set = 1) THEN a$ = "No label allowed after _LASTHANDLER": GOTO errmes
9109
+ IF hhc$ <> "_NEWHANDLER" AND (hhc$ <> "NEWHANDLER" AND qb64prefix_set = 1) THEN a$ = "Expected: ON ERROR GOTO [_NEWHANDLER] label": GOTO errmes
9110
+ lbl$ = getelement$(ca$, 5)
9111
+ IF lbl$ = "0" THEN a$ = "Zero not allowed after _NEWHANDLER": GOTO errmes
9112
+ END IF
9113
+ IF lbl$ = "0" THEN 'independent from hhc$ (i.e. always clear history)
9107
9114
WriteBufLine MainTxtBuf, "error_goto_line=0;"
9108
9115
WriteBufLine MainTxtBuf, "qbs_set(error_handler_history, qbs_new_txt_len(" + MKI$(&H2222) + ", 0));"
9109
9116
WriteBufLine MainTxtBuf, "qbs_cleanup(qbs_tmp_base, 0);"
9110
9117
l$ = l$ + sp + "0"
9111
9118
layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
9112
9119
GOTO finishedline
9113
- ELSEIF UCASE$(lbl$) = "_LASTHANDLER" OR (UCASE$(lbl$) = "LASTHANDLER" AND qb64prefix_set = 1) THEN
9120
+ ELSEIF hhc$ = "_NEWHANDLER" OR (hhc$ = "NEWHANDLER" AND qb64prefix_set = 1) THEN
9121
+ IF n = 4 THEN a$ = "Expected: ON ERROR GOTO [_NEWHANDLER] label": GOTO errmes
9122
+ IF ASC(hhc$, 1) = 95 THEN l$ = l$ + sp + SCase$("_NewHandler") ELSE l$ = l$ + sp + SCase$("NewHandler")
9123
+ ELSEIF hhc$ = "_LASTHANDLER" OR (hhc$ = "LASTHANDLER" AND qb64prefix_set = 1) THEN
9114
9124
WriteBufLine MainTxtBuf, "error_goto_line = qbr(func_val(error_handler_history));"
9115
9125
WriteBufLine MainTxtBuf, "qbs_set(error_handler_history, func_mid(error_handler_history, func_instr(NULL, error_handler_history, qbs_new_txt_len(" + CHR$(34) + "|" + CHR$(34) + ", 1), 0) + 1 , NULL, 0));"
9116
9126
WriteBufLine MainTxtBuf, "qbs_cleanup(qbs_tmp_base, 0);"
9117
- IF ASC(lbl $, 1) = 95 THEN l$ = l$ + sp + SCase$("_LastHandler") ELSE l$ = l$ + sp + SCase$("LastHandler")
9127
+ IF ASC(hhc $, 1) = 95 THEN l$ = l$ + sp + SCase$("_LastHandler") ELSE l$ = l$ + sp + SCase$("LastHandler")
9118
9128
layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
9119
9129
GOTO finishedline
9120
9130
END IF
@@ -9148,12 +9158,13 @@ DO
9148
9158
Labels(r).Scope_Restriction = subfuncn
9149
9159
END IF 'x
9150
9160
9151
-
9152
9161
l$ = l$ + sp + tlayout$
9153
9162
layoutdone = 1: IF LEN(layout$) THEN layout$ = layout$ + sp + l$ ELSE layout$ = l$
9154
9163
errorlabels = errorlabels + 1
9155
- WriteBufLine MainTxtBuf, "qbs_set(error_handler_history, qbs_add(qbs_add(qbs_str((int32)(error_goto_line)), qbs_new_txt_len(" + CHR$(34) + "|" + CHR$(34) + ", 1)), error_handler_history));"
9156
- WriteBufLine MainTxtBuf, "qbs_cleanup(qbs_tmp_base, 0);"
9164
+ IF hhc$ = "_NEWHANDLER" OR (hhc$ = "NEWHANDLER" AND qb64prefix_set = 1) THEN
9165
+ WriteBufLine MainTxtBuf, "qbs_set(error_handler_history, qbs_add(qbs_add(qbs_str((int32)(error_goto_line)), qbs_new_txt_len(" + CHR$(34) + "|" + CHR$(34) + ", 1)), error_handler_history));"
9166
+ WriteBufLine MainTxtBuf, "qbs_cleanup(qbs_tmp_base, 0);"
9167
+ END IF
9157
9168
WriteBufLine MainTxtBuf, "error_goto_line=" + str2(errorlabels) + ";"
9158
9169
WriteBufLine ErrTxtBuf, "if (error_goto_line==" + str2(errorlabels) + "){error_handling=1; goto LABEL_" + lbl$ + ";}"
9159
9170
GOTO finishedline
0 commit comments