ref: fe65e07cb6812424869bf069ea1e9b0f721a6e15
parent: bb12806da1b3e504afa76ca0c44a00482f8c48a8
author: Antonio Niño Díaz <antonio_nd@outlook.com>
date: Sat Jul 1 10:29:31 EDT 2017
Fail when using negative constants if not allowed Some commands, such as `DS`, `BANK[n]`, etc, don't allow the use of negative constants, but there wasn't any check to prohibit the code from trying to do so. This patch adds the `uconst` type to the parser to use when a constant is expected, but it mustn't be negative. Signed-off-by: Antonio Niño Díaz <antonio_nd@outlook.com>
--- a/src/asm/asmy.y
+++ b/src/asm/asmy.y
@@ -439,6 +439,7 @@
%type <sVal> relocconst
%type <nConstValue> const
+%type <nConstValue> uconst
%type <nConstValue> const_3bit
%type <sVal> const_8bit
%type <sVal> const_16bit
@@ -692,7 +693,7 @@
{ sym_ShiftCurrentMacroArgs(); };
-rept : T_POP_REPT const
+rept : T_POP_REPT uconst
{copyrept();
fstk_RunRept( $2 );
@@ -710,7 +711,7 @@
{ sym_AddString( $1, $3 ); };
-rsset : T_POP_RSSET const
+rsset : T_POP_RSSET uconst
{ sym_AddSet( "_RS", $2 ); };
@@ -718,7 +719,7 @@
{ sym_AddSet( "_RS", 0 ); };
-rl : T_LABEL T_POP_RL const
+rl : T_LABEL T_POP_RL uconst
{ sym_AddEqu( $1, sym_GetConstantValue("_RS") ); sym_AddSet( "_RS", sym_GetConstantValue("_RS")+4*$3 );@@ -725,7 +726,7 @@
}
;
-rw : T_LABEL T_POP_RW const
+rw : T_LABEL T_POP_RW uconst
{ sym_AddEqu( $1, sym_GetConstantValue("_RS") ); sym_AddSet( "_RS", sym_GetConstantValue("_RS")+2*$3 );@@ -732,7 +733,7 @@
}
;
-rb : T_LABEL T_POP_RB const
+rb : T_LABEL T_POP_RB uconst
{ sym_AddEqu( $1, sym_GetConstantValue("_RS") ); sym_AddSet( "_RS", sym_GetConstantValue("_RS")+$3 );@@ -739,7 +740,7 @@
}
;
-ds : T_POP_DS const
+ds : T_POP_DS uconst
{ out_Skip( $2 ); };
@@ -821,7 +822,7 @@
incbin : T_POP_INCBIN string
{ out_BinaryFile( $2 ); }- | T_POP_INCBIN string ',' const ',' const
+ | T_POP_INCBIN string ',' uconst ',' uconst
{out_BinaryFileSlice( $2, $4, $6 );
}
@@ -1042,6 +1043,14 @@
{ $$ = $2; };
+uconst : const
+ {+ if($1 < 0)
+ fatalerror("Constant mustn't be negative: %d", $1);+ $$=$1;
+ }
+;
+
const : T_ID { $$ = sym_GetConstantValue($1); } | T_NUMBER { $$ = $1; } | string { $$ = str2int($1); }@@ -1115,7 +1124,7 @@
string : T_STRING
{ strcpy($$,$1); }- | T_OP_STRSUB '(' string ',' const ',' const ')'+ | T_OP_STRSUB '(' string ',' uconst ',' uconst ')' { strncpy($$,$3+$5-1,$7); $$[$7]=0; } | T_OP_STRCAT '(' string ',' string ')' { strcpy($$,$3); strcat($$,$5); }@@ -1129,7 +1138,7 @@
{out_NewSection($2,$4);
}
- | T_POP_SECTION string ',' sectiontype '[' const ']'
+ | T_POP_SECTION string ',' sectiontype '[' uconst ']'
{if( $6>=0 && $6<0x10000 )
out_NewAbsSection($2,$4,$6,-1);
@@ -1136,15 +1145,15 @@
else
yyerror("Address $%x not 16-bit", $6);}
- | T_POP_SECTION string ',' sectiontype ',' T_OP_ALIGN '[' const ']'
+ | T_POP_SECTION string ',' sectiontype ',' T_OP_ALIGN '[' uconst ']'
{out_NewAlignedSection($2, $4, $8, -1);
}
- | T_POP_SECTION string ',' sectiontype ',' T_OP_BANK '[' const ']'
+ | T_POP_SECTION string ',' sectiontype ',' T_OP_BANK '[' uconst ']'
{bankrangecheck($2, $4, -1, $8);
}
- | T_POP_SECTION string ',' sectiontype '[' const ']' ',' T_OP_BANK '[' const ']'
+ | T_POP_SECTION string ',' sectiontype '[' uconst ']' ',' T_OP_BANK '[' uconst ']'
{ if ($6 < 0 || $6 > 0x10000) { yyerror("Address $%x not 16-bit", $6);@@ -1151,11 +1160,11 @@
}
bankrangecheck($2, $4, $6, $11);
}
- | T_POP_SECTION string ',' sectiontype ',' T_OP_ALIGN '[' const ']' ',' T_OP_BANK '[' const ']'
+ | T_POP_SECTION string ',' sectiontype ',' T_OP_ALIGN '[' uconst ']' ',' T_OP_BANK '[' uconst ']'
{out_NewAlignedSection($2, $4, $8, $13);
}
- | T_POP_SECTION string ',' sectiontype ',' T_OP_BANK '[' const ']' ',' T_OP_ALIGN '[' const ']'
+ | T_POP_SECTION string ',' sectiontype ',' T_OP_BANK '[' uconst ']' ',' T_OP_ALIGN '[' uconst ']'
{out_NewAlignedSection($2, $4, $13, $8);
}
--
⑨