6bd5a354f5
git-svn-id: svn://kolibrios.org@6446 a494cfbc-eb01-0410-851d-a64ba20cac60
89 lines
2.1 KiB
C++
89 lines
2.1 KiB
C++
#define _CLASS_
|
|
|
|
|
|
|
|
#include "tok.h"
|
|
|
|
|
|
|
|
structteg *searchteg=NULL;
|
|
|
|
int destructor=FALSE;
|
|
|
|
|
|
|
|
void notclassname(char *name)
|
|
|
|
{
|
|
|
|
char buf[90];
|
|
|
|
sprintf(buf,"'%s' not class name",name);
|
|
|
|
preerror(buf);
|
|
|
|
nexttok(); //¯à®¯ã᪠::
|
|
|
|
nexttok();
|
|
|
|
}
|
|
|
|
|
|
|
|
void notclassproc(char *classname, char* procname)
|
|
|
|
{
|
|
|
|
char buf[160];
|
|
|
|
sprintf(buf,"'%s' not member class '%s'",procname,classname);
|
|
|
|
preerror(buf);
|
|
|
|
}
|
|
|
|
|
|
|
|
void AddThis()
|
|
|
|
{
|
|
|
|
int lsize=(am32==TRUE?4:2);
|
|
|
|
localrec *lrec=addlocalvar("this",(am32==TRUE?tk_dwordvar:tk_wordvar),paramsize);
|
|
|
|
lrec->rec.recsize=lsize;
|
|
|
|
lrec->rec.type=tp_paramvar;
|
|
|
|
lrec->fuse=USEDVAR;
|
|
|
|
paramsize+=lsize;
|
|
|
|
}
|
|
|
|
|
|
|
|
void doclassproc(unsigned int tproc)
|
|
|
|
{
|
|
|
|
int type=itok.rm; //⨯ ¢®§¢à â
|
|
|
|
unsigned int flag=itok.flag;
|
|
|
|
unsigned int npointr=itok.npointr;
|
|
|
|
char classname[IDLENGTH];
|
|
|
|
if((searchteg=FindTeg(TRUE,itok.name))!=NULL){
|
|
|
|
strcpy(classname,itok.name);
|
|
|
|
nexttok(); //¯à®¯ã᪠::
|
|
|
|
if(tok2==tk_tilda){
|
|
|
|
nexttok();
|
|
|
|
destructor=TRUE;
|
|
|
|
flag|=fs_destructor;
|
|
|
|
type=tk_void;
|
|
|
|
}
|
|
|
|
nexttok();
|
|
|
|
char *tn;
|
|
|
|
char name[IDLENGTH];
|
|
|
|
strcpy(name,itok.name);
|
|
|
|
if((tn=strchr(name,'@'))!=NULL)*tn=0;
|
|
|
|
|
|
|
|
if(strcmp(classname,name)==0&&(flag&fs_destructor)==0)flag|=fs_constructor;
|
|
|
|
if((tok!=tk_declare&&tok!=tk_undefproc)||(itok.flag&f_classproc)==0){
|
|
|
|
notclassproc(classname,name);
|
|
|
|
searchteg=NULL;
|
|
|
|
define_procedure();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if(tproc==0){
|
|
|
|
if(CidOrID()==tk_ID)tproc=tk_fastcall;
|
|
|
|
else tproc=(comfile==file_w32?tk_stdcall:tk_pascal);
|
|
|
|
}
|
|
|
|
flag|=(tproc-tk_pascal)*2;
|
|
|
|
if(type==tokens)type=am32==FALSE?tk_word:tk_dword;
|
|
|
|
if(flag!=itok.flag||type!=itok.rm||(unsigned short)npointr!=itok.npointr){
|
|
|
|
// printf("flag %08X - %08X\n",flag,itok.flag);
|
|
|
|
// printf("type %u - %u\n",type,itok.rm);
|
|
|
|
redeclare(name);
|
|
|
|
}
|
|
|
|
if(dynamic_flag){
|
|
|
|
dynamic_proc();
|
|
|
|
searchteg=NULL;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
// if(itok.flag&f_static)searchteg=NULL;
|
|
|
|
if(AlignProc!=FALSE)AlignCD(CS,alignproc);
|
|
|
|
if(dbg)AddLine();
|
|
|
|
setproc(1);
|
|
|
|
}
|
|
|
|
else{
|
|
|
|
notclassname(itok.name);
|
|
|
|
setproc(0);
|
|
|
|
}
|
|
|
|
dopoststrings();
|
|
|
|
}
|
|
|