From 8394b5a29ecc535f62d58e4938fb6cc56220e5b8 Mon Sep 17 00:00:00 2001 From: Daniel_Cortez Date: Mon, 3 Jun 2019 17:06:31 +0700 Subject: [PATCH] __emit: Make sure the opcode table is sorted --- source/compiler/sc1.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/source/compiler/sc1.c b/source/compiler/sc1.c index e4cda9c..c46fbf6 100644 --- a/source/compiler/sc1.c +++ b/source/compiler/sc1.c @@ -7406,7 +7406,7 @@ static EMIT_OPCODE emit_opcodelist[] = { { "zero.u", emit_do_zero_u }, }; -static int emit_findopcode(const char *instr,int maxlen) +static int emit_findopcode(const char *instr) { int low,high,mid,cmp; @@ -7438,6 +7438,23 @@ SC_FUNC void emit_parse_line(void) symbol *sym; char name[MAX_INSTR_LEN]; + #if !defined NDEBUG + /* verify that the opcode list is sorted (skip entry 1; it is reserved + * for a non-existant opcode) + */ + { /* local */ + static int sorted=FALSE; + if (!sorted) { + assert(emit_opcodelist[1].name!=NULL); + for (i=2; i<(sizeof emit_opcodelist / sizeof emit_opcodelist[0]); i++) { + assert(emit_opcodelist[i].name!=NULL); + assert(stricmp(emit_opcodelist[i].name,emit_opcodelist[i-1].name)>0); + } /* for */ + sorted=TRUE; + } /* if */ + } /* local */ + #endif + tok=tokeninfo(&val,&st); if (tok==tSYMBOL || (tok>tMIDDLE && tok<=tLAST)) { /* get the token length */ @@ -7455,7 +7472,7 @@ SC_FUNC void emit_parse_line(void) name[i]='\0'; /* find the corresponding argument handler and call it */ - i=emit_findopcode(name,i); + i=emit_findopcode(name); if (emit_opcodelist[i].name==NULL && name[0]!='\0') error(104,name); /* invalid assembler instruction */ emit_opcodelist[i].func(name);