X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fcc65%2Flocals.c;h=fccc8040e94429ffd5f36384ce1efbcba9f7b146;hb=08443d5e7aca1686a7b69dd23ff496516dfdf569;hp=c10083ec440f4fdea342b876032562c99278a31c;hpb=2eab65ad24b672cf72499ad6002c05a3a173c17a;p=cc65 diff --git a/src/cc65/locals.c b/src/cc65/locals.c index c10083ec4..fccc8040e 100644 --- a/src/cc65/locals.c +++ b/src/cc65/locals.c @@ -9,7 +9,7 @@ /* (C) 2000-2001 Ullrich von Bassewitz */ /* Wacholderweg 14 */ /* D-70597 Stuttgart */ -/* EMail: uz@musoftware.de */ +/* EMail: uz@cc65.org */ /* */ /* */ /* This software is provided 'as-is', without any expressed or implied */ @@ -178,16 +178,13 @@ static void ParseOneDecl (const DeclSpec* Spec) /* Change SC in case it was register */ SC = (SC & ~SC_REGISTER) | SC_AUTO; - if (curtok == TOK_ASSIGN) { + if (CurTok.Tok == TOK_ASSIGN) { - struct expent lval; + ExprDesc lval; /* Allocate previously reserved local space */ AllocLocalSpace (CurrentFunc); - /* Switch to the code segment. */ - g_usecode (); - /* Skip the '=' */ NextToken (); @@ -205,7 +202,7 @@ static void ParseOneDecl (const DeclSpec* Spec) } /* Push the value */ - g_push (flags | TypeOf (Decl.Type), lval.e_const); + g_push (flags | TypeOf (Decl.Type), lval.ConstVal); /* Mark the variable as referenced */ SC |= SC_REF; @@ -229,37 +226,37 @@ static void ParseOneDecl (const DeclSpec* Spec) g_usebss (); /* Define the variable label */ - SymData = GetLabel (); - g_defloclabel (SymData); + SymData = GetLocalLabel (); + g_defdatalabel (SymData); /* Reserve space for the data */ g_res (Size); /* Allow assignments */ - if (curtok == TOK_ASSIGN) { - - struct expent lval; + if (CurTok.Tok == TOK_ASSIGN) { - /* Switch to the code segment. */ - g_usecode (); + ExprDesc lval; /* Skip the '=' */ NextToken (); - /* Get the expression into the primary */ - expression1 (&lval); - - /* Make type adjustments if needed */ - assignadjust (Decl.Type, &lval); - /* Setup the type flags for the assignment */ - flags = TypeOf (Decl.Type); - if (Size == 1) { - flags |= CF_FORCECHAR; + flags = Size == 1? CF_FORCECHAR : CF_NONE; + + /* Get the expression into the primary */ + if (evalexpr (flags, hie1, &lval) == 0) { + /* Constant expression. Adjust the types */ + assignadjust (Decl.Type, &lval); + flags |= CF_CONST; + /* Load it into the primary */ + exprhs (flags, 0, &lval); + } else { + /* Expression is not constant and in the primary */ + assignadjust (Decl.Type, &lval); } /* Store the value into the variable */ - g_putstatic (flags, SymData, 0); + g_putstatic (flags | TypeOf (Decl.Type), SymData, 0); /* Mark the variable as referenced */ SC |= SC_REF; @@ -269,7 +266,7 @@ static void ParseOneDecl (const DeclSpec* Spec) } else if ((SC & SC_STATIC) == SC_STATIC) { /* Static data */ - if (curtok == TOK_ASSIGN) { + if (CurTok.Tok == TOK_ASSIGN) { /* Initialization ahead, switch to data segment */ if (IsQualConst (Decl.Type)) { @@ -279,8 +276,8 @@ static void ParseOneDecl (const DeclSpec* Spec) } /* Define the variable label */ - SymData = GetLabel (); - g_defloclabel (SymData); + SymData = GetLocalLabel (); + g_defdatalabel (SymData); /* Skip the '=' */ NextToken (); @@ -297,8 +294,8 @@ static void ParseOneDecl (const DeclSpec* Spec) g_usebss (); /* Define the variable label */ - SymData = GetLabel (); - g_defloclabel (SymData); + SymData = GetLocalLabel (); + g_defdatalabel (SymData); /* Reserve space for the data */ g_res (Size); @@ -341,7 +338,7 @@ void DeclareLocals (void) } /* Accept type only declarations */ - if (curtok == TOK_SEMI) { + if (CurTok.Tok == TOK_SEMI) { /* Type declaration only */ CheckEmptyDecl (&Spec); NextToken (); @@ -355,7 +352,7 @@ void DeclareLocals (void) ParseOneDecl (&Spec); /* Check if there is more */ - if (curtok == TOK_COMMA) { + if (CurTok.Tok == TOK_COMMA) { /* More to come */ NextToken (); } else { @@ -371,9 +368,6 @@ void DeclareLocals (void) /* Be sure to allocate any reserved space for locals */ AllocLocalSpace (CurrentFunc); - /* In case we switched away from code segment, switch back now */ - g_usecode (); - /* In case we've allocated local variables in this block, emit a call to * the stack checking routine if stack checks are enabled. */