1
0
mirror of https://github.com/cc65/cc65.git synced 2024-07-01 08:29:37 +00:00

Fixed a bug: .ENDPROC without .PROC would crash the assembler

git-svn-id: svn://svn.cc65.org/cc65/trunk@2027 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
cuz 2003-03-17 10:14:43 +00:00
parent 53518d59c9
commit 7d350d3f61
5 changed files with 31 additions and 13 deletions

View File

@ -6,10 +6,10 @@
/* */ /* */
/* */ /* */
/* */ /* */
/* (C) 1998-2002 Ullrich von Bassewitz */ /* (C) 1998-2003 Ullrich von Bassewitz */
/* Wacholderweg 14 */ /* Römerstrasse 52 */
/* D-70597 Stuttgart */ /* D-70794 Filderstadt */
/* EMail: uz@musoftware.de */ /* EMail: uz@cc65.org */
/* */ /* */
/* */ /* */
/* This software is provided 'as-is', without any expressed or implied */ /* This software is provided 'as-is', without any expressed or implied */
@ -183,6 +183,7 @@ void ErrorMsg (const FilePos* Pos, unsigned ErrNum, va_list ap)
"Duplicate `.ELSE'", "Duplicate `.ELSE'",
"Conditional assembly branch was never closed", "Conditional assembly branch was never closed",
"Lexical level was not terminated correctly", "Lexical level was not terminated correctly",
"No open lexical level",
"Segment attribute mismatch", "Segment attribute mismatch",
"Segment stack overflow", "Segment stack overflow",
"Segment stack is empty", "Segment stack is empty",
@ -190,7 +191,7 @@ void ErrorMsg (const FilePos* Pos, unsigned ErrNum, va_list ap)
"CPU not supported", "CPU not supported",
"Counter underflow", "Counter underflow",
"Undefined label", "Undefined label",
"Open `%s´", "Open `%s'",
"File name `%s' not found in file table", "File name `%s' not found in file table",
}; };

View File

@ -6,10 +6,10 @@
/* */ /* */
/* */ /* */
/* */ /* */
/* (C) 1998-2002 Ullrich von Bassewitz */ /* (C) 1998-2003 Ullrich von Bassewitz */
/* Wacholderweg 14 */ /* Römerstrasse 52 */
/* D-70597 Stuttgart */ /* D-70794 Filderstadt */
/* EMail: uz@musoftware.de */ /* EMail: uz@cc65.org */
/* */ /* */
/* */ /* */
/* This software is provided 'as-is', without any expressed or implied */ /* This software is provided 'as-is', without any expressed or implied */
@ -124,6 +124,7 @@ enum Errors {
ERR_DUPLICATE_ELSE, ERR_DUPLICATE_ELSE,
ERR_OPEN_IF, ERR_OPEN_IF,
ERR_OPEN_PROC, ERR_OPEN_PROC,
ERR_NO_OPEN_PROC,
ERR_SEG_ATTR_MISMATCH, ERR_SEG_ATTR_MISMATCH,
ERR_SEGSTACK_OVERFLOW, ERR_SEGSTACK_OVERFLOW,
ERR_SEGSTACK_EMPTY, ERR_SEGSTACK_EMPTY,

View File

@ -605,8 +605,13 @@ static void DoEnd (void)
static void DoEndProc (void) static void DoEndProc (void)
/* Leave a lexical level */ /* Leave a lexical level */
{ {
SymLeaveLevel (); if (!SymIsLocalLevel ()) {
/* No local symbol table level open */
ErrorSkip (ERR_NO_OPEN_PROC);
} else {
SymLeaveLevel ();
}
} }

View File

@ -379,12 +379,20 @@ void SymEnterLevel (void)
void SymLeaveLevel (void) void SymLeaveLevel (void)
/* Leave the current lexical level */ /* Leave the current lexical level */
{ {
SymTab = SymTab->BackLink; SymTab = SymTab->BackLink;
} }
int SymIsLocalLevel (void)
/* Return true if we ae on a local symbol table level. */
{
return (SymTab != RootTab);
}
void SymDef (const char* Name, ExprNode* Expr, int ZP, int Label) void SymDef (const char* Name, ExprNode* Expr, int ZP, int Label)
/* Define a new symbol */ /* Define a new symbol */
{ {

View File

@ -73,6 +73,9 @@ void SymEnterLevel (void);
void SymLeaveLevel (void); void SymLeaveLevel (void);
/* Leave the current lexical level */ /* Leave the current lexical level */
int SymIsLocalLevel (void);
/* Return true if we ae on a local symbol table level. */
void SymDef (const char* Name, ExprNode* Expr, int ZP, int Label); void SymDef (const char* Name, ExprNode* Expr, int ZP, int Label);
/* Define a new symbol */ /* Define a new symbol */
@ -104,7 +107,7 @@ void SymGlobal (const char* Name);
/* Mark the given symbol as a global symbol, that is, as a symbol that is /* Mark the given symbol as a global symbol, that is, as a symbol that is
* either imported or exported. * either imported or exported.
*/ */
void SymGlobalZP (const char* Name); void SymGlobalZP (const char* Name);
/* Mark the given symbol as a global zeropage symbol, that is, as a symbol /* Mark the given symbol as a global zeropage symbol, that is, as a symbol
* that is either imported or exported. * that is either imported or exported.