core will now ignore missing natives starting with '@'
the compiler will now resolve aliased natives to single references and export '@' natives for each redundant entry --HG-- extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%40804
This commit is contained in:
parent
82e07a9bf0
commit
c9bc46e770
@ -1037,7 +1037,8 @@ bool CPluginManager::RunSecondPass(CPlugin *pPlugin, char *error, size_t maxleng
|
||||
{
|
||||
break;
|
||||
}
|
||||
if (native->status == SP_NATIVE_UNBOUND)
|
||||
if (native->status == SP_NATIVE_UNBOUND
|
||||
&& native->name[0] != '@')
|
||||
{
|
||||
if (error)
|
||||
{
|
||||
|
@ -738,6 +738,7 @@ SC_FUNC void ffcase(cell value,char *labelname,int newtable)
|
||||
SC_FUNC void ffcall(symbol *sym,const char *label,int numargs)
|
||||
{
|
||||
char symname[2*sNAMEMAX+16];
|
||||
char aliasname[sNAMEMAX+1];
|
||||
|
||||
assert(sym!=NULL);
|
||||
assert(sym->ident==iFUNCTN);
|
||||
@ -749,6 +750,14 @@ SC_FUNC void ffcall(symbol *sym,const char *label,int numargs)
|
||||
if (sc_status==statWRITE && (sym->usage & uREAD)==0 && sym->addr>=0)
|
||||
sym->addr=ntv_funcid++;
|
||||
stgwrite("\tsysreq.c ");
|
||||
/* Look for an alias */
|
||||
if (lookup_alias(aliasname, sym->name)) {
|
||||
symbol *asym = findglb(aliasname, sGLOBAL);
|
||||
if (asym && asym->ident==iFUNCTN && ((sym->usage & uNATIVE) != 0)) {
|
||||
sym = asym;
|
||||
}
|
||||
}
|
||||
assert(sym->addr != 0x1d);
|
||||
outval(sym->addr,FALSE);
|
||||
if (sc_asmfile) {
|
||||
stgwrite("\t; ");
|
||||
|
@ -676,6 +676,7 @@ SC_FUNC int assemble(FILE *fout,FILE *fin)
|
||||
constvalue *constptr;
|
||||
cell mainaddr;
|
||||
char nullchar;
|
||||
char testalias[sNAMEMAX+1];
|
||||
|
||||
/* if compression failed, restart the assembly with compaction switched off */
|
||||
if (setjmp(compact_err)!=0) {
|
||||
@ -706,8 +707,9 @@ SC_FUNC int assemble(FILE *fout,FILE *fin)
|
||||
for (sym=glbtab.next; sym!=NULL; sym=sym->next) {
|
||||
int match=0;
|
||||
if (sym->ident==iFUNCTN) {
|
||||
if ((sym->usage & uNATIVE)!=0 && (sym->usage & uREAD)!=0 && sym->addr>=0)
|
||||
if ((sym->usage & uNATIVE)!=0 && (sym->usage & uREAD)!=0 && sym->addr>=0) {
|
||||
match=++numnatives;
|
||||
}
|
||||
if ((sym->usage & uPUBLIC)!=0 && (sym->usage & uDEFINE)!=0)
|
||||
match=++numpublics;
|
||||
if (strcmp(sym->name,uMAINFUNC)==0) {
|
||||
@ -719,13 +721,12 @@ SC_FUNC int assemble(FILE *fout,FILE *fin)
|
||||
match=++numpubvars;
|
||||
} /* if */
|
||||
if (match) {
|
||||
char alias[sNAMEMAX+1];
|
||||
const char *aliasptr = sym->name;
|
||||
assert(sym!=NULL);
|
||||
if ((sym->usage & uNATIVE)==0 || !lookup_alias(alias,sym->name)) {
|
||||
assert(strlen(sym->name)<=sNAMEMAX);
|
||||
strcpy(alias,sym->name);
|
||||
if (((sym->usage & uNATIVE)!=0) && lookup_alias(testalias,sym->name)) {
|
||||
aliasptr = "@";
|
||||
} /* if */
|
||||
nametablesize+=strlen(alias)+1;
|
||||
nametablesize+=strlen(aliasptr)+1;
|
||||
} /* if */
|
||||
} /* for */
|
||||
assert(numnatives==ntv_funcid);
|
||||
@ -843,13 +844,13 @@ SC_FUNC int assemble(FILE *fout,FILE *fin)
|
||||
} /* for */
|
||||
count=0;
|
||||
for (i=0; i<numnatives; i++) {
|
||||
char alias[sNAMEMAX+1];
|
||||
const char *aliasptr;
|
||||
sym=nativelist[i];
|
||||
assert(sym!=NULL);
|
||||
if (!lookup_alias(alias,sym->name)) {
|
||||
assert(strlen(sym->name)<=sNAMEMAX);
|
||||
strcpy(alias,sym->name);
|
||||
} /* if */
|
||||
aliasptr = sym->name;
|
||||
if (lookup_alias(testalias,sym->name)) {
|
||||
aliasptr = "@";
|
||||
}
|
||||
assert(sym->vclass==sGLOBAL);
|
||||
func.address=0;
|
||||
func.nameofs=nameofs;
|
||||
@ -860,8 +861,8 @@ SC_FUNC int assemble(FILE *fout,FILE *fin)
|
||||
pc_resetbin(fout,hdr.natives+count*sizeof(AMX_FUNCSTUBNT));
|
||||
pc_writebin(fout,&func,sizeof func);
|
||||
pc_resetbin(fout,nameofs);
|
||||
pc_writebin(fout,alias,strlen(alias)+1);
|
||||
nameofs+=strlen(alias)+1;
|
||||
pc_writebin(fout,(void *)aliasptr,strlen(aliasptr)+1);
|
||||
nameofs+=strlen(aliasptr)+1;
|
||||
count++;
|
||||
} /* for */
|
||||
free(nativelist);
|
||||
|
Loading…
Reference in New Issue
Block a user