Don't search twice for a macro.

git-svn-id: svn://svn.cc65.org/cc65/trunk@5075 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
uz 2011-07-08 09:22:26 +00:00
parent 49cdfcf5b0
commit 241afdc738
4 changed files with 47 additions and 34 deletions

View file

@ -95,7 +95,6 @@ struct IdDesc {
/* Struct that describes a macro definition */
typedef struct Macro Macro;
struct Macro {
HashNode Node; /* Hash list node */
Macro* List; /* List of all macros */
@ -641,7 +640,7 @@ static int MacExpand (void* Data)
/* Check if we should abort this macro */
if (DoMacAbort) {
/* Reset the flag */
/* Reset the flag */
DoMacAbort = 0;
/* Abort any open .IF statements in this macro expansion */
@ -936,14 +935,13 @@ static void StartExpDefine (MacExp* E)
void MacExpandStart (void)
/* Start expanding the macro in SVal */
void MacExpandStart (Macro* M)
/* Start expanding a macro */
{
MacExp* E;
/* Search for the macro */
Macro* M = HT_FindEntry (&MacroTab, &CurTok.SVal);
CHECK (M != 0 && (M->Style != MAC_STYLE_DEFINE || DisableDefines == 0));
/* Check the argument */
PRECONDITION (M && (M->Style != MAC_STYLE_DEFINE || DisableDefines == 0));
/* We cannot expand an incomplete macro */
if (M->Incomplete) {
@ -984,16 +982,21 @@ void MacAbort (void)
int IsMacro (const StrBuf* Name)
/* Return true if the given name is the name of a macro */
Macro* FindMacro (const StrBuf* Name)
/* Try to find the macro with the given name and return it. If no macro with
* this name was found, return NULL.
*/
{
return (HT_Find (&MacroTab, Name) != 0);
Macro* M = HT_FindEntry (&MacroTab, Name);
return (M != 0 && M->Style == MAC_STYLE_CLASSIC)? M : 0;
}
int IsDefine (const StrBuf* Name)
/* Return true if the given name is the name of a define style macro */
Macro* FindDefine (const StrBuf* Name)
/* Try to find the define style macro with the given name and return it. If no
* such macro was found, return NULL.
*/
{
Macro* M;
@ -1004,7 +1007,7 @@ int IsDefine (const StrBuf* Name)
/* Check if we have such a macro */
M = HT_FindEntry (&MacroTab, Name);
return (M != 0 && M->Style == MAC_STYLE_DEFINE);
return (M != 0 && M->Style == MAC_STYLE_DEFINE)? M : 0;
}

View file

@ -58,6 +58,10 @@ struct StrBuf;
#define MAC_STYLE_CLASSIC 0
#define MAC_STYLE_DEFINE 1
/* Macro as an opaque data type */
struct Macro;
typedef struct Macro Macro;
/*****************************************************************************/
@ -74,17 +78,21 @@ void MacUndef (const StrBuf* Name, unsigned char Style);
* treated as if the macro didn't exist.
*/
void MacExpandStart (void);
/* Start expanding the macro in SVal */
void MacExpandStart (Macro* M);
/* Start expanding a macro */
void MacAbort (void);
/* Abort the current macro expansion */
int IsMacro (const StrBuf* Name);
/* Return true if the given name is the name of a macro */
Macro* FindMacro (const StrBuf* Name);
/* Try to find the macro with the given name and return it. If no macro with
* this name was found, return NULL.
*/
int IsDefine (const StrBuf* Name);
/* Return true if the given name is the name of a define style macro */
Macro* FindDefine (const StrBuf* Name);
/* Try to find the define style macro with the given name and return it. If no
* such macro was found, return NULL.
*/
int InMacExpansion (void);
/* Return true if we're currently expanding a macro */

View file

@ -596,7 +596,7 @@ static void OneLine (void)
Segment* Seg = 0;
unsigned long PC = 0;
SymEntry* Sym = 0;
int Macro = 0;
Macro* Mac = 0;
int Instr = -1;
/* Initialize the new listing line if we are actually reading from file
@ -606,8 +606,8 @@ static void OneLine (void)
InitListingLine ();
}
/* Single colon means unnamed label */
if (CurTok.Tok == TOK_COLON) {
/* An unnamed label */
ULabDef ();
NextTok ();
}
@ -620,11 +620,11 @@ static void OneLine (void)
/* Macros and symbols cannot use instruction names */
Instr = FindInstruction (&CurTok.SVal);
if (Instr < 0) {
Macro = IsMacro (&CurTok.SVal);
Mac = FindMacro (&CurTok.SVal);
}
} else {
/* Macros and symbols may use the names of instructions */
Macro = IsMacro (&CurTok.SVal);
Mac = FindMacro (&CurTok.SVal);
}
}
@ -634,7 +634,7 @@ static void OneLine (void)
*/
if (CurTok.Tok == TOK_LOCAL_IDENT ||
CurTok.Tok == TOK_NAMESPACE ||
(CurTok.Tok == TOK_IDENT && Instr < 0 && !Macro)) {
(CurTok.Tok == TOK_IDENT && Instr < 0 && Mac == 0)) {
/* Did we have whitespace before the ident? */
int HadWS = CurTok.WS;
@ -715,11 +715,11 @@ static void OneLine (void)
/* Macros and symbols cannot use instruction names */
Instr = FindInstruction (&CurTok.SVal);
if (Instr < 0) {
Macro = IsMacro (&CurTok.SVal);
Mac = FindMacro (&CurTok.SVal);
}
} else {
/* Macros and symbols may use the names of instructions */
Macro = IsMacro (&CurTok.SVal);
Mac = FindMacro (&CurTok.SVal);
}
}
}
@ -729,9 +729,9 @@ static void OneLine (void)
if (CurTok.Tok >= TOK_FIRSTPSEUDO && CurTok.Tok <= TOK_LASTPSEUDO) {
/* A control command */
HandlePseudo ();
} else if (Macro) {
} else if (Mac != 0) {
/* A macro expansion */
MacExpandStart ();
MacExpandStart (Mac);
} else if (Instr >= 0 ||
(UbiquitousIdents && ((Instr = FindInstruction (&CurTok.SVal)) >= 0))) {
/* A mnemonic - assemble one instruction */

View file

@ -818,6 +818,8 @@ static int Sweet16Reg (const StrBuf* Id)
void NextRawTok (void)
/* Read the next raw token from the input stream */
{
Macro* M;
/* If we've a forced end of assembly, don't read further */
if (ForcedEnd) {
CurTok.Tok = TOK_EOF;
@ -827,9 +829,9 @@ void NextRawTok (void)
Restart:
/* Check if we have tokens from another input source */
if (InputFromStack ()) {
if (CurTok.Tok == TOK_IDENT && IsDefine (&CurTok.SVal)) {
if (CurTok.Tok == TOK_IDENT && (M = FindDefine (&CurTok.SVal)) != 0) {
/* This is a define style macro - expand it */
MacExpandStart ();
MacExpandStart (M);
goto Restart;
}
return;
@ -1001,9 +1003,9 @@ Again:
/* An identifier with a dot. Check if it's a define style
* macro.
*/
if (IsDefine (&CurTok.SVal)) {
if ((M = FindDefine (&CurTok.SVal)) != 0) {
/* This is a define style macro - expand it */
MacExpandStart ();
MacExpandStart (M);
goto Restart;
}
@ -1108,9 +1110,9 @@ Again:
}
/* Check for define style macro */
if (IsDefine (&CurTok.SVal)) {
if ((M = FindDefine (&CurTok.SVal)) != 0) {
/* Macro - expand it */
MacExpandStart ();
MacExpandStart (M);
goto Restart;
} else {
/* An identifier */