This commit is contained in:
laubzega 2024-04-01 21:49:29 -04:00 committed by GitHub
commit f18b579ce2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 66 additions and 1 deletions

View File

@ -32,6 +32,8 @@
/*****************************************************************************/
#include "addrsize.h"
#include "scopedefs.h"
/* ca65 */
#include "error.h"
@ -42,6 +44,7 @@
#include "symbol.h"
#include "symtab.h"
#include "condasm.h"
#include "pseudo.h"
@ -193,7 +196,7 @@ static void FreeIf (void)
int Done;
do {
IfDesc* ID = GetCurrentIf();
if (ID == 0) {
if (ID == 0 || strcmp(ID->Name, ".WEAKPROC") == 0) {
Error (" Unexpected .ENDIF");
Done = 1;
} else {
@ -205,6 +208,23 @@ static void FreeIf (void)
} while (!Done);
}
static void CheckNoWeak (void)
{
int Done = 0;
do {
IfDesc* ID = GetCurrentIf();
if (ID == 0) {
Done = 1;
} else {
if (strcmp(ID->Name, ".WEAKPROC") == 0) {
Error (".WEAKPROC nesting not allowed");
Done = 1;
}
}
} while (!Done);
}
/*****************************************************************************/
@ -282,6 +302,27 @@ void DoConditionals (void)
CalcOverallIfCond ();
break;
case TOK_ENDWEAK:
D = GetCurrentIf();
if (D == 0 || strcmp(D->Name, ".WEAKPROC") != 0) {
Error ("Unexpected .ENDWEAK");
} else {
ReleaseFullLineInfo (&D->LineInfos);
DoneCollection (&D->LineInfos);
--IfCount;
}
if (CurrentScope->Type != SCOPE_SCOPE || CurrentScope->Label == 0) {
} else {
SymLeaveLevel ();
}
NextTok ();
ExpectSep ();
/* Get the new overall condition */
CalcOverallIfCond ();
break;
case TOK_IF:
D = AllocIf (".IF", 1);
NextTok ();
@ -447,6 +488,23 @@ void DoConditionals (void)
CalcOverallIfCond ();
break;
case TOK_WEAKPROC:
CheckNoWeak();
D = AllocIf (".WEAKPROC", 1);
NextTok ();
if (IfCond) {
SymEntry* Sym = ParseAnySymName (SYM_FIND_EXISTING);
SetIfCond (D, Sym != 0 && SymIsRef (Sym));
if (Sym != 0) {
SymDef (Sym, GenCurrentPC (), ADDR_SIZE_DEFAULT, SF_LABEL);
SymEnterLevel (&CurTok.SVal, SCOPE_SCOPE, ADDR_SIZE_DEFAULT, Sym);
}
ExpectSep ();
}
CalcOverallIfCond ();
break;
default:
/* Skip tokens */
NextTok ();
@ -468,6 +526,7 @@ int CheckConditionals (void)
case TOK_ELSE:
case TOK_ELSEIF:
case TOK_ENDIF:
case TOK_ENDWEAK:
case TOK_IF:
case TOK_IFBLANK:
case TOK_IFCONST:

View File

@ -2103,6 +2103,7 @@ static CtrlDesc CtrlCmdTab [] = {
{ ccNone, DoEndScope },
{ ccNone, DoUnexpected }, /* .ENDSTRUCT */
{ ccNone, DoUnexpected }, /* .ENDUNION */
{ ccKeepToken, DoConditionals }, /* .ENDWEAK */
{ ccNone, DoEnum },
{ ccNone, DoError },
{ ccNone, DoExitMacro },
@ -2203,6 +2204,7 @@ static CtrlDesc CtrlCmdTab [] = {
{ ccNone, DoUnion },
{ ccNone, DoUnexpected }, /* .VERSION */
{ ccNone, DoWarning },
{ ccKeepToken, DoConditionals }, /* .WEAKPROC */
{ ccNone, DoWord },
{ ccNone, DoUnexpected }, /* .XMATCH */
{ ccNone, DoZeropage },

View File

@ -187,6 +187,7 @@ struct DotKeyword {
{ ".ENDSCOPE", TOK_ENDSCOPE },
{ ".ENDSTRUCT", TOK_ENDSTRUCT },
{ ".ENDUNION", TOK_ENDUNION },
{ ".ENDWEAK", TOK_ENDWEAK },
{ ".ENUM", TOK_ENUM },
{ ".ERROR", TOK_ERROR },
{ ".EXITMAC", TOK_EXITMACRO },
@ -300,6 +301,7 @@ struct DotKeyword {
{ ".UNION", TOK_UNION },
{ ".VERSION", TOK_VERSION },
{ ".WARNING", TOK_WARNING },
{ ".WEAKPROC", TOK_WEAKPROC },
{ ".WORD", TOK_WORD },
{ ".XMATCH", TOK_XMATCH },
{ ".XOR", TOK_BOOLXOR },

View File

@ -165,6 +165,7 @@ typedef enum token_t {
TOK_ENDSCOPE,
TOK_ENDSTRUCT,
TOK_ENDUNION,
TOK_ENDWEAK,
TOK_ENUM,
TOK_ERROR,
TOK_EXITMACRO,
@ -265,6 +266,7 @@ typedef enum token_t {
TOK_UNION,
TOK_VERSION,
TOK_WARNING,
TOK_WEAKPROC,
TOK_WORD,
TOK_XMATCH,
TOK_ZEROPAGE,