Changeset 75 in dev for BasicCompiler_Common


Ignore:
Timestamp:
Mar 20, 2007, 4:36:16 AM (17 years ago)
Author:
dai_9181
Message:

TYPEINFO→Typeへのリファクタリングを実施。64bitはほぼ完了。32bitが全般的に未完成。

Location:
BasicCompiler_Common
Files:
2 added
34 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler_Common/BasicCompiler.h

    r73 r75  
    2020
    2121//プログラム情報
    22 BOOL bCompilingGlobal;
    2322BOOL bStrict;
    2423DWORD ImageBase;
    2524INCLUDEFILEINFO IncludeFileInfo;
    26 SubInfo **ppSubHash;
     25UserProc **ppSubHash;
    2726int SubNum;
    2827char **ppMacroNames;
    2928int MacroNum;
    30 DECLAREINFO **ppDeclareHash;
     29DllProc **ppDeclareHash;
    3130CONSTINFO **ppConstHash;
    32 PROCPTRINFO *pProcPtrInfo;
     31ProcPointer **ppProcPointer;
    3332int ProcPtrInfoNum;
    3433
  • BasicCompiler_Common/Class.cpp

    r73 r75  
    1616
    1717
    18 CMember::CMember( CClass *pobj_c, DWORD access, bool isConst, bool isRef, char *buffer, int NowLine ){
     18CMember::CMember( CClass *pobj_c, DWORD access, bool isConst, bool isRef, char *buffer, int nowLine ){
    1919    extern int cp;
    2020
     
    2323    char init_buf[VN_SIZE];
    2424    char constract_parameter[VN_SIZE];
    25     GetDimentionFormat(buffer,isRef,VarName,SubScripts,&TypeInfo,init_buf,constract_parameter);
     25    GetDimentionFormat(buffer,VarName,SubScripts,*this,init_buf,constract_parameter);
    2626
    2727    //重複チェック
     
    3030    }
    3131
    32     if(TypeInfo.type==DEF_OBJECT){
    33         if(TypeInfo.u.pobj_Class->IsAbstract()){
     32    if( IsObject() ){
     33        if( GetClass().IsAbstract() ){
    3434            //抽象クラスだったとき
    35             SetError(125,TypeInfo.u.pobj_Class->name,cp);
     35            SetError(125,GetClass().name,cp);
    3636        }
    3737    }
     
    4747    this->isConst = isConst;
    4848
    49     //参照型かどうか
    50     this->isRef = isRef;
    51 
    5249    //初期データ
    5350    InitBuf=(char *)HeapAlloc(hHeap,0,lstrlen(init_buf)+1);
     
    5956
    6057    //ソースコードの位置
    61     source_code_address=NowLine;
    62 }
    63 CMember::CMember(CMember *pobj){
    64     //コピーコンストラクタ
    65     memset(this,0,sizeof(CMember));
     58    source_code_address=nowLine;
     59}
     60CMember::CMember(CMember &member):
     61    Type( member )
     62{
    6663
    6764    //name
    68     name=(char *)HeapAlloc(hHeap,0,lstrlen(pobj->name)+1);
    69     lstrcpy(name,pobj->name);
     65    name=(char *)HeapAlloc(hHeap,0,lstrlen(member.name)+1);
     66    lstrcpy(name,member.name);
    7067
    7168    //定数扱いかどうか
    72     isConst = pobj->isConst;
    73 
    74     //参照型かどうか
    75     isRef = pobj->isRef;
     69    isConst = member.isConst;
    7670
    7771    //SubScripts
    78     memcpy(SubScripts,pobj->SubScripts,MAX_ARRAYDIM*sizeof(int));
    79 
    80     //TypeInfo
    81     TypeInfo=pobj->TypeInfo;
     72    memcpy(SubScripts,member.SubScripts,MAX_ARRAYDIM*sizeof(int));
    8273
    8374    //ソースコードの位置
    84     source_code_address=pobj->source_code_address;
     75    source_code_address=member.source_code_address;
    8576}
    8677CMember::CMember(){
     
    9586bool CMember::IsConst(){
    9687    return isConst;
    97 }
    98 bool CMember::IsRef(){
    99     return isRef;
    100 }
    101 
    102 int CMember::GetSize(){
    103     //メンバサイズを取得
    104     return GetTypeSize(TypeInfo.type,TypeInfo.u.lpIndex);
    10588}
    10689
     
    126109                temporary,
    127110                member->SubScripts,
    128                 member->TypeInfo,
    129                 GetTypeSize(member->TypeInfo.type,member->TypeInfo.u.lpIndex),
     111                *member,
    130112                member->InitBuf,
    131113                member->ConstractParameter,
     
    151133    memset(this,0,sizeof(CMethod));
    152134
    153     psi=pobj->psi;
     135    pUserProc=pobj->pUserProc;
    154136
    155137    bAbstract=pobj->bAbstract;
     
    224206    iMemberNum=pInheritsClass->iMemberNum;
    225207    for(i3=0;i3<pInheritsClass->iMemberNum;i3++){
    226         ppobj_Member[i3]=new CMember(pInheritsClass->ppobj_Member[i3]);
     208        ppobj_Member[i3]=new CMember( *pInheritsClass->ppobj_Member[i3] );
    227209
    228210        //dwAccess
     
    263245    iMemberNum++;
    264246}
    265 void CClass::AddStaticMember( DWORD dwAccess, bool isConst, bool isRef, char *buffer, int NowLine ){
    266     CMember *member = new CMember( this, dwAccess, isConst, isRef, buffer, NowLine );
     247void CClass::AddStaticMember( DWORD dwAccess, bool isConst, bool isRef, char *buffer, int nowLine ){
     248    CMember *member = new CMember( this, dwAccess, isConst, isRef, buffer, nowLine );
    267249    staticMembers.push_back( member );
    268250}
    269 void CClass::AddMethod( SubInfo *psi,DWORD dwAccess, bool isConst, BOOL bAbstract, BOOL bVirtual ){
     251void CClass::AddMethod( UserProc *pUserProc,DWORD dwAccess, bool isConst, BOOL bAbstract, BOOL bVirtual ){
    270252    CMethod *method = new CMethod();
    271     method->psi = psi;
     253    method->pUserProc = pUserProc;
    272254    method->dwAccess = dwAccess;
    273255    method->isConst = isConst;
     
    277259
    278260    methods.push_back( method );
    279 }
    280 void CClass::AddStaticMethod(SubInfo *psi,DWORD dwAccess){
     261
     262    // プロシージャオブジェクトと関連付け
     263    pUserProc->SetMethod( method );
     264}
     265void CClass::AddStaticMethod(UserProc *pUserProc,DWORD dwAccess){
    281266    CMethod *method = new CMethod();
    282     method->psi=psi;
     267    method->pUserProc=pUserProc;
    283268    method->dwAccess=dwAccess;
    284269    method->bAbstract=0;
     
    287272
    288273    staticMethods.push_back( method );
     274
     275    // プロシージャオブジェクトと関連付け
     276    pUserProc->SetMethod( method );
    289277}
    290278BOOL CClass::DupliCheckAll(const char *name){
     
    296284    //メソッド
    297285    foreach( CMethod *method, methods ){
    298         if( lstrcmp( name, method->psi->name ) == 0 ){
     286        if( lstrcmp( name, method->pUserProc->GetName().c_str() ) == 0 ){
    299287            return 1;
    300288        }
     
    322310    return 0;
    323311}
    324 CMethod *CClass::GetMethodInfo( SubInfo *psi ){
     312CMethod *CClass::GetMethodInfo( UserProc *pUserProc ) const
     313{
    325314    for( int i=(int)methods.size()-1; i>=0; i-- ){
    326         if( psi == methods[i]->psi ) return methods[i];
     315        if( pUserProc == methods[i]->pUserProc ) return methods[i];
    327316    }
    328317    return NULL;
    329318}
    330 CMethod *CClass::GetStaticMethodInfo( SubInfo *psi ){
     319CMethod *CClass::GetStaticMethodInfo( UserProc *pUserProc ) const
     320{
    331321    for( int i=(int)staticMethods.size()-1; i>=0; i-- ){
    332         if( psi == staticMethods[i]->psi ) return staticMethods[i];
     322        if( pUserProc == staticMethods[i]->pUserProc ) return staticMethods[i];
    333323    }
    334324    return NULL;
    335325}
    336 bool CClass::IsExistMethod( const char *name ){
     326bool CClass::IsExistMethod( const char *name ) const
     327{
    337328    foreach( CMethod *method, methods ){
    338         if( lstrcmp( method->psi->name, name ) == 0 ) return true;
     329        if( method->pUserProc->GetName() == name ) return true;
    339330    }
    340331    return false;
    341332}
    342 bool CClass::IsExistStaticMethod( const char *name ){
     333bool CClass::IsExistStaticMethod( const char *name ) const
     334{
    343335    foreach( CMethod *method, staticMethods ){
    344         if( lstrcmp( method->psi->name, name ) == 0 ) return true;
     336        if( method->pUserProc->GetName() == name ) return true;
    345337    }
    346338    return false;
    347339}
    348340
    349 void CClass::EnumStaticMethod( const char *methodName, std::vector<SubInfo *> &subs ) const
     341void CClass::EnumStaticMethod( const char *methodName, std::vector<UserProc *> &subs ) const
    350342{
    351343    foreach( CMethod *method, staticMethods ){
    352         if(lstrcmp(methodName,method->psi->name)==0){
    353             subs.push_back( method->psi );
    354         }
    355     }
    356 }
    357 
    358 void CClass::EnumMethod( const char *methodName, std::vector<SubInfo *> &subs ) const
     344        if( method->pUserProc->GetName() == methodName ){
     345            subs.push_back( method->pUserProc );
     346        }
     347    }
     348}
     349
     350void CClass::EnumMethod( const char *methodName, std::vector<UserProc *> &subs ) const
    359351{
    360352    //オブジェクトのメンバ関数の場合
    361353    //※オーバーライドされた関数を先にサーチする必要があるため、バックサーチを行う
    362354    for( int i=(int)methods.size()-1; i>=0; i-- ){
    363         if(lstrcmp(methodName,methods[i]->psi->name)==0){
    364             subs.push_back( methods[i]->psi );
    365         }
    366     }
    367 }
    368 
    369 void CClass::EnumMethod( const BYTE idOperatorCalc, std::vector<SubInfo *> &subs ) const
     355        if( methods[i]->pUserProc->GetName() == methodName ){
     356            subs.push_back( methods[i]->pUserProc );
     357        }
     358    }
     359}
     360
     361void CClass::EnumMethod( const BYTE idOperatorCalc, std::vector<UserProc *> &subs ) const
    370362{
    371363    //オブジェクトのメンバ関数の場合
    372364    //※オーバーライドされた関数を先にサーチする必要があるため、バックサーチを行う
    373365    for( int i=(int)methods.size()-1; i>=0; i-- ){
    374         SubInfo *psi = methods[i]->psi;
    375         char *temp = psi->name;
     366        UserProc *pUserProc = methods[i]->pUserProc;
     367        const char *temp = pUserProc->GetName().c_str();
    376368        if(temp[0]==1&&temp[1]==ESC_OPERATOR){
    377369            if((BYTE)temp[2]==idOperatorCalc){
    378                 subs.push_back( psi );
     370                subs.push_back( pUserProc );
    379371            }
    380372        }
     
    423415        //アラインメントを算出
    424416        int member_size;
    425         if(pMember->TypeInfo.type==DEF_STRUCT){
     417        if( pMember->IsStruct() ){
    426418            //メンバクラスのアラインメントを取得
    427             member_size=pMember->TypeInfo.u.pobj_Class->GetAlignment();
     419            member_size=pMember->GetClass().GetAlignment();
    428420        }
    429421        else{
     
    486478        CMember *pMember = ppobj_Member[i];
    487479
    488         if(pMember->TypeInfo.type==DEF_STRUCT){
     480        if(pMember->IsStruct()){
    489481            //メンバクラスのアラインメントを取得
    490             member_size=pMember->TypeInfo.u.pobj_Class->GetAlignment();
     482            member_size=pMember->GetClass().GetAlignment();
    491483        }
    492484        else{
     
    508500
    509501
    510 int CClass::GetFuncNumInVtbl( const SubInfo *psi ) const
     502int CClass::GetFuncNumInVtbl( const UserProc *pUserProc ) const
    511503{
    512504    int n = 0;
    513505    foreach( CMethod *method, methods ){
    514         if( method->psi == psi ) break;
    515         if( method->psi->bVirtual ) n++;
     506        if( method->pUserProc == pUserProc ) break;
     507        if( method->bVirtual ) n++;
    516508    }
    517509    return n;
     
    527519    //////////////////////////////////////
    528520
    529     SubInfo **ppsi;
    530     ppsi=(SubInfo **)HeapAlloc(hHeap,0,vtbl_num*sizeof(SubInfo *));
     521    UserProc **ppsi;
     522    ppsi=(UserProc **)HeapAlloc(hHeap,0,vtbl_num*sizeof(UserProc *));
    531523
    532524    //関数テーブルに値をセット
     
    534526    foreach( CMethod *method, methods ){
    535527        if(method->bVirtual){
    536             method->psi->bUse=1;
     528            method->pUserProc->Using();
    537529
    538530            if(method->bAbstract){
     
    542534                ppsi[i2]=0;
    543535            }
    544             else ppsi[i2]=method->psi;
     536            else ppsi[i2]=method->pUserProc;
    545537            i2++;
    546538        }
     
    565557    int i;
    566558    for(i=0;i<vtbl_num;i++){
    567         SubInfo *psi;
    568         psi=(SubInfo *)pVtbl[i];
    569         if(!psi) continue;
    570         pVtbl[i]=psi->CompileAddress+ImageBase+MemPos_CodeSection;
    571     }
    572 }
    573 bool CClass::IsAbstract(){
     559        UserProc *pUserProc;
     560        pUserProc=(UserProc *)pVtbl[i];
     561        if(!pUserProc) continue;
     562        pVtbl[i]=pUserProc->beginOpAddress+ImageBase+MemPos_CodeSection;
     563    }
     564}
     565bool CClass::IsAbstract() const
     566{
    574567    //未実装の仮想関数を持つ場合はtrueを返す
    575568
     
    584577    //コンポジションの関係にあるメンバも検査する
    585578    for(int i=0;i < iMemberNum;i++){
    586         if(ppobj_Member[i]->TypeInfo.type==DEF_OBJECT){
    587             if(ppobj_Member[i]->TypeInfo.u.pobj_Class->IsAbstract())
     579        if(ppobj_Member[i]->IsObject()){
     580            if(ppobj_Member[i]->GetClass().IsAbstract())
    588581                return true;
    589582        }
     
    604597
    605598//コンストラクタをコンパイル中かどうかを判別
    606 bool CClass::IsCompilingConstructor(){
     599bool CClass::IsCompilingConstructor() const
     600{
    607601    return isCompilingConstructor;
    608602}
     
    619613
    620614//デストラクタをコンパイル中かどうかを判別
    621 bool CClass::IsCompilingDestructor(){
     615bool CClass::IsCompilingDestructor() const
     616{
    622617    return isCompilingDestructor;
    623618}
     
    625620
    626621//自身と等しいクラスかどうかを確認
    627 bool CClass::IsEquals( CClass *pClass ){
     622bool CClass::IsEquals( const CClass *pClass ) const
     623{
    628624    if( this == pClass ) return true;
    629625    return false;
     
    631627
    632628//自身の派生クラスかどうかを確認
    633 bool CClass::IsSubClass( CClass *pClass ){
     629bool CClass::IsSubClass( const CClass *pClass ) const
     630{
    634631    pClass = pClass->pobj_InheritsClass;
    635632    while( pClass ){
     
    641638
    642639//自身と等しいまたは派生クラスかどうかを確認
    643 bool CClass::IsEqualsOrSubClass( CClass *pClass ){
     640bool CClass::IsEqualsOrSubClass( const CClass *pClass ) const
     641{
    644642    if( IsEquals( pClass ) ) return true;
    645643    return IsSubClass( pClass );
     
    722720}
    723721
    724 CClass *CDBClass::AddClass(const char *name,int NowLine){
     722CClass *CDBClass::AddClass(const char *name,int nowLine){
    725723    //////////////////////////////////////////////////////////////////////////
    726724    // クラスを追加
     
    753751            if(lstrcmp(name,pobj_c2->name)==0){
    754752                //重複した場合
    755                 SetError(15,name,NowLine);
     753                SetError(15,name,nowLine);
    756754                return 0;
    757755            }
     
    781779            basbuf[i+1]==ESC_INTERFACE
    782780            )){
    783                 int NowLine;
    784                 NowLine=i;
     781                int nowLine;
     782                nowLine=i;
    785783
    786784                i+=2;
     
    802800
    803801                //クラスを追加
    804                 CClass *pClass = pobj_DBClass->AddClass(temporary,NowLine);
     802                CClass *pClass = pobj_DBClass->AddClass(temporary,nowLine);
    805803                if( pClass ){
    806                     if( basbuf[NowLine+1] == ESC_CLASS ){
     804                    if( basbuf[nowLine+1] == ESC_CLASS ){
    807805                        pClass->classType = CClass::Class;
    808806                    }
    809                     else if( basbuf[NowLine+1] == ESC_INTERFACE ){
     807                    else if( basbuf[nowLine+1] == ESC_INTERFACE ){
    810808                        pClass->classType = CClass::Interface;
    811809                    }
     
    820818
    821819void CDBClass::AddMethod(CClass *pobj_c, DWORD dwAccess, BOOL bStatic, bool isConst, BOOL bAbstract,
    822                          BOOL bVirtual, BOOL bOverride, char *buffer, int NowLine){
     820                         BOOL bVirtual, BOOL bOverride, char *buffer, int nowLine){
    823821    int i,i2;
    824822    char temporary[VN_SIZE];
     
    835833
    836834    //関数ハッシュへ登録
    837     SubInfo *psi;
    838     psi=AddSubData(buffer,NowLine,bVirtual,pobj_c,bStatic);
    839     if(!psi) return;
     835    UserProc *pUserProc;
     836    pUserProc=AddSubData(buffer,nowLine,bVirtual,pobj_c, (bStatic!=0) );
     837    if(!pUserProc) return;
    840838
    841839
     
    849847
    850848        //標準コンストラクタ(引数なし)
    851         if(psi->params.size()==0) fConstructor=1;
     849        if(pUserProc->Params().size()==0) fConstructor=1;
    852850
    853851        //強制的にConst修飾子をつける
     
    857855        //デストラクタの場合はその名前が正しいかチェックを行う
    858856        if(lstrcmp(temporary+1,pobj_c->name)!=0)
    859             SetError(117,NULL,NowLine);
     857            SetError(117,NULL,nowLine);
    860858        else
    861859            bDestructor=1;
     
    864862        // コンストラクタ、デストラクタのアクセシビリティをチェック
    865863        if(dwAccess!=ACCESS_PUBLIC){
    866             SetError(116,NULL,NowLine);
     864            SetError(116,NULL,nowLine);
    867865            dwAccess=ACCESS_PUBLIC;
    868866        }
     
    884882
    885883    if(pobj_c->DupliCheckMember(temporary)){
    886         SetError(15,temporary,NowLine);
     884        SetError(15,temporary,nowLine);
    887885        return;
    888886    }
     
    893891        if(method->pobj_InheritsClass) continue;
    894892
    895         if(lstrcmp(temporary,method->psi->name)==0){
    896             if( Parameter::Equals( method->psi->params, psi->params ) ){
     893        if( method->pUserProc->GetName() == temporary ){
     894            if( Parameter::Equals( method->pUserProc->Params(), pUserProc->Params() ) ){
    897895                //関数名、パラメータ属性が合致したとき
    898                 SetError(15,psi->name,NowLine);
     896                SetError(15,pUserProc->GetName().c_str(),nowLine);
    899897                return;
    900898            }
     
    903901
    904902    //仮想関数の場合
    905     if(bAbstract) psi->bCompile=1;
     903    if(bAbstract) pUserProc->CompleteCompile();
    906904
    907905    //メソッドのオーバーライド
    908906    foreach( CMethod *method, pobj_c->methods ){
    909         if(lstrcmp(temporary,method->psi->name)==0){
    910             if( Parameter::Equals( method->psi->params, psi->params ) ){
    911 
    912                 if(method->psi->bVirtual){
     907        if( method->pUserProc->GetName() == temporary ){
     908            if( Parameter::Equals( method->pUserProc->Params(), pUserProc->Params() ) ){
     909
     910                if(method->bVirtual){
    913911                    //メンバ関数を上書き
    914                     method->psi=psi;
     912                    method->pUserProc=pUserProc;
    915913                    method->bAbstract=0;
    916914
    917915                    if(!bOverride){
    918                         SetError(127,NULL,NowLine);
     916                        SetError(127,NULL,nowLine);
    919917                    }
    920918                    if(method->dwAccess!=dwAccess){
    921                         SetError(128,NULL,NowLine);
     919                        SetError(128,NULL,nowLine);
    922920                    }
     921
     922                    pUserProc->SetMethod( method );
    923923                    return;
    924924                }
     
    927927    }
    928928
    929     if(psi->bVirtual){
     929    if(bVirtual){
    930930        pobj_c->vtbl_num++;
    931931    }
    932932
    933933    if(bOverride){
    934         SetError(12,"Override",NowLine);
     934        SetError(12,"Override",nowLine);
    935935    }
    936936
    937937    if(bStatic){
    938         pobj_c->AddStaticMethod(psi,dwAccess);
     938        pobj_c->AddStaticMethod(pUserProc,dwAccess);
    939939    }
    940940    else{
    941         pobj_c->AddMethod(psi, dwAccess, isConst, bAbstract, bVirtual);
    942     }
    943 }
    944 
    945 BOOL CDBClass::MemberVar_LoopRefCheck(CClass *pobj_c){
     941        pobj_c->AddMethod(pUserProc, dwAccess, isConst, bAbstract, bVirtual);
     942    }
     943}
     944
     945BOOL CDBClass::MemberVar_LoopRefCheck(const CClass &objClass){
    946946    int i,i2,bRet=1;
    947     for(i=0;i<pobj_c->iMemberNum;i++){
    948         CMember *pMember = pobj_c->ppobj_Member[i];
    949         if(pMember->TypeInfo.type==DEF_OBJECT){
     947    for(i=0;i<objClass.iMemberNum;i++){
     948        const CMember *pMember = objClass.ppobj_Member[i];
     949        if(pMember->IsObject()){
    950950            //循環参照でないかをチェック
    951             if(pobj_LoopRefCheck->check(pMember->TypeInfo.u.pobj_Class->name)){
     951            if(pobj_LoopRefCheck->check(pMember->GetClass().name)){
    952952                extern int cp;
    953                 SetError(124,pMember->TypeInfo.u.pobj_Class->name,cp);
     953                SetError(124,pMember->GetClass().name,cp);
    954954                return 0;
    955955            }
    956956
    957             pobj_LoopRefCheck->add(pobj_c->name);
    958 
    959             i2=MemberVar_LoopRefCheck(pMember->TypeInfo.u.pobj_Class);
     957            pobj_LoopRefCheck->add(objClass.name);
     958
     959            i2=MemberVar_LoopRefCheck(pMember->GetClass());
    960960            if(bRet==1) bRet=i2;
    961961
    962             pobj_LoopRefCheck->del(pobj_c->name);
     962            pobj_LoopRefCheck->del(objClass.name);
    963963        }
    964964    }
     
    13471347
    13481348
    1349                         if(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->TypeInfo.type==DEF_OBJECT||
    1350                             pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->TypeInfo.type==DEF_STRUCT){
    1351                             if(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->TypeInfo.u.pobj_Class->ppobj_Member==0){
     1349                        if(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->IsObject()||
     1350                            pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->IsStruct()){
     1351                            if(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->GetClass().ppobj_Member==0){
    13521352                                //参照先が読み取られていないとき
    1353                                 GetClass_recur(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->TypeInfo.u.pobj_Class->name);
     1353                                GetClass_recur(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->GetClass().name);
    13541354                            }
    13551355                        }
    13561356
    13571357
    1358                         if(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->TypeInfo.type==DEF_OBJECT){
     1358                        if(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->IsObject()){
    13591359                            //循環参照のチェック
    13601360                            pobj_LoopRefCheck->add(pobj_c->name);
    1361                             if(!MemberVar_LoopRefCheck(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->TypeInfo.u.pobj_Class)){
     1361                            if(!MemberVar_LoopRefCheck(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->GetClass())){
    13621362                                //エラー回避
    1363                                 pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->TypeInfo.type=DEF_PTR_VOID;
     1363                                pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->SetBasicType( DEF_PTR_VOID );
    13641364                            }
    13651365                            pobj_LoopRefCheck->del(pobj_c->name);
     
    14381438}
    14391439
    1440 void CDBClass::StartCompile( SubInfo *psi ){
    1441     pCompilingClass = psi->pobj_ParentClass;
     1440void CDBClass::StartCompile( UserProc *pUserProc ){
     1441    pCompilingClass = pUserProc->GetParentClassPtr();
    14421442    if( pCompilingClass ){
    1443         pCompilingMethod = pCompilingClass->GetMethodInfo( psi );
     1443        pCompilingMethod = pCompilingClass->GetMethodInfo( pUserProc );
    14441444        if( !pCompilingMethod ){
    1445             pCompilingMethod = pCompilingClass->GetStaticMethodInfo( psi );
     1445            pCompilingMethod = pCompilingClass->GetStaticMethodInfo( pUserProc );
    14461446            if( !pCompilingMethod ){
    14471447                SetError(300,NULL,cp);
  • BasicCompiler_Common/Class.h

    r73 r75  
    11#include <vector>
     2#include "Type.h"
    23
    34class CClass;
    4 class SubInfo;
    5 
    6 //データ型
    7 struct TYPEINFO{
    8     int type;
    9     union{
    10         LONG_PTR lpIndex;
    11         CClass *pobj_Class;
    12     }u;
    13 };
     5class UserProc;
    146
    157#define ACCESS_NON          0
     
    1810#define ACCESS_PROTECTED    3
    1911
    20 class CMember{
     12class CMember : public Type
     13{
    2114    bool isConst;
    22     bool isRef;
    2315public:
    2416    char *name;
    2517    int SubScripts[MAX_ARRAYDIM];
    26     TYPEINFO TypeInfo;
    2718
    2819    DWORD dwAccess;
     
    3425
    3526
    36     CMember( CClass *pobj_c, DWORD access, bool idConst, bool isRef, char *buffer, int NowLine=-1 );
    37     CMember( CMember *pobj );
     27    CMember( CClass *pobj_c, DWORD access, bool idConst, bool isRef, char *buffer, int nowLine=-1 );
     28    CMember( CMember &member );
    3829    CMember();
    3930    ~CMember();
    4031
    4132    bool IsConst();
    42     bool IsRef();
    43     int GetSize();
    4433
    4534
     
    4837class CMethod{
    4938public:
    50     SubInfo *psi;
     39    UserProc *pUserProc;
    5140    DWORD dwAccess;
    5241    BOOL bAbstract;
     
    115104    //メンバ、メソッドの追加
    116105    void AddMember( DWORD dwAccess, bool idConst, bool isRef, char *buffer );
    117     void AddStaticMember( DWORD dwAccess, bool isConst, bool isRef, char *buffer, int NowLine );
    118     void AddMethod( SubInfo *psi,DWORD dwAccess, bool isConst, BOOL bAbstract, BOOL bVirtual );
    119     void AddStaticMethod(SubInfo *psi,DWORD dwAccess);
     106    void AddStaticMember( DWORD dwAccess, bool isConst, bool isRef, char *buffer, int nowLine );
     107    void AddMethod( UserProc *pUserProc,DWORD dwAccess, bool isConst, BOOL bAbstract, BOOL bVirtual );
     108    void AddStaticMethod(UserProc *pUserProc,DWORD dwAccess);
    120109
    121110    //重複チェック
     
    124113
    125114    //メソッド取得
    126     CMethod *GetMethodInfo( SubInfo *psi );
    127     CMethod *GetStaticMethodInfo( SubInfo *psi );
     115    CMethod *GetMethodInfo( UserProc *pUserProc ) const;
     116    CMethod *GetStaticMethodInfo( UserProc *pUserProc ) const;
    128117
    129118    //メソッドの存在を確認
    130     bool IsExistMethod( const char *name );
    131     bool IsExistStaticMethod( const char *name );
     119    bool IsExistMethod( const char *name ) const;
     120    bool IsExistStaticMethod( const char *name ) const;
    132121
    133122    //メソッドを列挙
    134     void EnumStaticMethod( const char *methodName, std::vector<SubInfo *> &subs ) const;
    135     void EnumMethod( const char *methodName, std::vector<SubInfo *> &subs ) const;
    136     void EnumMethod( const BYTE idOperatorCalc, std::vector<SubInfo *> &subs ) const;
     123    void EnumStaticMethod( const char *methodName, std::vector<UserProc *> &subs ) const;
     124    void EnumMethod( const char *methodName, std::vector<UserProc *> &subs ) const;
     125    void EnumMethod( const BYTE idOperatorCalc, std::vector<UserProc *> &subs ) const;
    137126
    138127    //デフォルト コンストラクタ メソッドを取得
     
    157146    long vtbl_offset;
    158147public:
    159     int GetFuncNumInVtbl( const SubInfo *psi ) const;
     148    int GetFuncNumInVtbl( const UserProc *pUserProc ) const;
    160149    LONG_PTR GetVtblGlobalOffset(void);
    161150    void ActionVtblSchedule(LONG_PTR ImageBase, LONG_PTR MemPos_CodeSection);
    162     bool IsAbstract();
     151    bool IsAbstract() const;
    163152
    164153
     
    169158    void NotifyStartConstructorCompile();
    170159    void NotifyFinishConstructorCompile();
    171     bool IsCompilingConstructor();
     160    bool IsCompilingConstructor() const;
    172161
    173162    //デストラクタをコンパイルしているかどうかのチェックフラグ
     
    177166    void NotifyStartDestructorCompile();
    178167    void NotifyFinishDestructorCompile();
    179     bool IsCompilingDestructor();
     168    bool IsCompilingDestructor() const;
    180169
    181170
    182171    //自身と等しいクラスかどうかを確認
    183     bool IsEquals( CClass *pClass );
     172    bool IsEquals( const CClass *pClass ) const;
    184173
    185174    //自身の派生クラスかどうかを確認
    186     bool IsSubClass( CClass *pClass );
     175    bool IsSubClass( const CClass *pClass ) const;
    187176
    188177    //自身と等しいまたは派生クラスかどうかを確認
    189     bool IsEqualsOrSubClass( CClass *pClass );
     178    bool IsEqualsOrSubClass( const CClass *pClass ) const;
    190179
    191180
     
    214203    CClass *check(const char *name);
    215204
    216     CClass *AddClass(const char *name,int NowLine);
     205    CClass *AddClass(const char *name,int nowLine);
    217206
    218207    void ActionVtblSchedule(LONG_PTR ImageBase, LONG_PTR MemPos_CodeSection);
     
    220209private:
    221210    void AddMethod(CClass *pobj_c, DWORD dwAccess, BOOL bStatic, bool isConst, BOOL bAbstract,
    222         BOOL bVirtual, BOOL bOverride, char *buffer, int NowLine);
    223     BOOL MemberVar_LoopRefCheck(CClass *pobj_c);
     211        BOOL bVirtual, BOOL bOverride, char *buffer, int nowLine);
     212    BOOL MemberVar_LoopRefCheck(const CClass &objClass);
    224213public:
    225214    void InitNames(void);
     
    245234public:
    246235    //コンパイル開始の通知を受け取るメソッド
    247     void StartCompile( SubInfo *psi );
     236    void StartCompile( UserProc *pUserProc );
    248237
    249238    //現在コンパイル中のメソッド情報を取得
  • BasicCompiler_Common/CommandFormat.cpp

    r4 r75  
    11#include "common.h"
    22
    3 void ComOpen(char *Parameter,char *buffer,int NowLine){
     3void ComOpen(char *Parameter,char *buffer,int nowLine){
    44    int i,i2,IsStr;
    55    char temporary[255];
     
    2626        for(i2=0;;i++,i2++){
    2727            if(Parameter[i]=='\0'){
    28                 SetError(1,NULL,NowLine);
     28                SetError(1,NULL,nowLine);
    2929                return;
    3030            }
     
    3939        else if(lstrcmpi(temporary,"append")==0) lstrcat(buffer,",3");
    4040        else{
    41             SetError(1,NULL,NowLine);
     41            SetError(1,NULL,nowLine);
    4242            return;
    4343        }
     
    6363}
    6464
    65 void ComLine(char *Parameter,char *buffer,int NowLine){
     65void ComLine(char *Parameter,char *buffer,int nowLine){
    6666    int i,i2,PareNum;
    6767    char temporary[VN_SIZE],temp2[VN_SIZE];
     
    7575    else{
    7676        if(Parameter[0]!='('){
    77             SetError(10,"Line",NowLine);
     77            SetError(10,"Line",nowLine);
    7878            return;
    7979        }
     
    9393
    9494        if(Parameter[i+1]!='-'){
    95             SetError(10,"Line",NowLine);
     95            SetError(10,"Line",nowLine);
    9696            return;
    9797        }
     
    107107
    108108    if(Parameter[i]!='('){
    109         SetError(10,"Line",NowLine);
     109        SetError(10,"Line",nowLine);
    110110        return;
    111111    }
     
    129129    }
    130130    else if(Parameter[i+1]!=','){
    131         SetError(10,"Line",NowLine);
     131        SetError(10,"Line",nowLine);
    132132        return;
    133133    }
     
    147147    else if(lstrcmpi(temporary,"bf")==0) lstrcat(buffer,",2");
    148148    else{
    149         SetError(10,"Line",NowLine);
     149        SetError(10,"Line",nowLine);
    150150        return;
    151151    }
     
    158158    i=GetOneParameter(Parameter,i,temporary);   //第7パラメータ取得
    159159    if(Parameter[i-1]==','){
    160         SetError(10,"Line",NowLine);
     160        SetError(10,"Line",nowLine);
    161161        return;
    162162    }
     
    165165    lstrcat(buffer,temporary);
    166166}
    167 void ComCircle(char *Parameter,char *buffer,int NowLine){
     167void ComCircle(char *Parameter,char *buffer,int nowLine){
    168168    int i,i2,PareNum;
    169169    char temporary[VN_SIZE],temp2[VN_SIZE];
     
    172172
    173173    if(Parameter[0]!='('){
    174         SetError(10,"Circle",NowLine);
     174        SetError(10,"Circle",nowLine);
    175175        return;
    176176    }
     
    189189    i++;
    190190    if(Parameter[i]!=','){
    191         SetError(10,"Circle",NowLine);
     191        SetError(10,"Circle",nowLine);
    192192        return;
    193193    }
     
    241241    }
    242242    else{
    243         SetError(10,"Circle",NowLine);
     243        SetError(10,"Circle",nowLine);
    244244        return;
    245245    }
     
    251251        lstrcat(buffer,temporary);
    252252        if(Parameter[i-1]==','){
    253             SetError(10,"Circle",NowLine);
     253            SetError(10,"Circle",nowLine);
    254254            return;
    255255        }
     
    260260    }
    261261}
    262 void ComPSet(char *Parameter,char *buffer,int NowLine){
     262void ComPSet(char *Parameter,char *buffer,int nowLine){
    263263    int i,i2,PareNum;
    264264
     
    266266
    267267    if(Parameter[0]!='('){
    268         SetError(10,"PSet",NowLine);
     268        SetError(10,"PSet",nowLine);
    269269        return;
    270270    }
     
    284284    else if(Parameter[i+1]=='\0') lstrcat(buffer,",7");
    285285    else{
    286         SetError(10,"PSet",NowLine);
    287         return;
    288     }
    289 }
    290 void ComPaint(char *Parameter,char *buffer,int NowLine){
     286        SetError(10,"PSet",nowLine);
     287        return;
     288    }
     289}
     290void ComPaint(char *Parameter,char *buffer,int nowLine){
    291291    int i,i2,PareNum;
    292292
     
    294294
    295295    if(Parameter[0]!='('){
    296         SetError(10,"Paint",NowLine);
     296        SetError(10,"Paint",nowLine);
    297297        return;
    298298    }
     
    309309    }
    310310    if(Parameter[i+1]!=','){
    311         SetError(10,"Paint",NowLine);
     311        SetError(10,"Paint",nowLine);
    312312        return;
    313313    }
  • BasicCompiler_Common/Const.cpp

    r7 r75  
    153153}
    154154void CDBConst::AddConst(char *Name, char *Expression){
    155     LONG_PTR lpIndex;
    156155    _int64 i64data;
    157     int Type = StaticCalculation(false, Expression, 0, &i64data, &lpIndex);
    158 
    159     if(Type){
    160         //リテラル値の場合
    161         //登録を行う
    162 
    163         CConst *newconst = new CConst(Name, Type, i64data);
    164 
    165         AddConst(Name, newconst);
    166     }
    167     else{
     156    Type resultType;
     157    if( !StaticCalculation(false, Expression, 0, &i64data, resultType) ){
    168158        //変数の場合
    169159        //何もしない(実行領域コンパイル時にdim宣言として扱う)
    170     }
     160        return;
     161    }
     162
     163    //リテラル値の場合
     164    //登録を行う
     165
     166    CConst *newconst = new CConst(Name, resultType.GetBasicType(), i64data);
     167
     168    AddConst(Name, newconst);
    171169}
    172170void CDBConst::AddConst(char *Name, int value){
  • BasicCompiler_Common/Debug.cpp

    r73 r75  
    224224    SendDlgItemMessage(hMainDlg,IDC_DEBUGLIST,EM_REPLACESEL,0,(LPARAM)buffer);
    225225}
    226 SubInfo *GetSubFromObp(ULONG_PTR pos){
    227     extern SubInfo **ppSubHash;
    228     SubInfo *psi;
     226UserProc *GetSubFromObp(ULONG_PTR pos){
     227    extern UserProc **ppSubHash;
     228    UserProc *pUserProc;
    229229    int i2;
    230230
    231231    for(i2=0;i2<MAX_HASH;i2++){
    232         psi=ppSubHash[i2];
    233         while(psi){
    234             if(rva_to_real(psi->CompileAddress) <= pos  &&
    235                 pos < rva_to_real(psi->EndOpAddr))
    236                 return psi;
    237 
    238             psi=psi->pNextData;
     232        pUserProc=ppSubHash[i2];
     233        while(pUserProc){
     234            if(rva_to_real(pUserProc->beginOpAddress) <= pos  &&
     235                pos < rva_to_real(pUserProc->endOpAddress))
     236                return pUserProc;
     237
     238            pUserProc=pUserProc->pNextData;
    239239        }
    240240    }
     
    447447    pobj_dti=new CDebugThreadInfo();
    448448
    449     SubInfo *psi;
     449    UserProc *pUserProc;
    450450
    451451    extern DWORD dwStepRun;
     
    681681                        if(!bRet) MessageBox(hMainDlg,"プロセスメモリーの読み込みに失敗","error",MB_OK);
    682682
    683                         extern SubInfo *pSub_DebugSys_EndProc;
     683                        extern UserProc *pSub_DebugSys_EndProc;
    684684                        if((BYTE)temporary[0]==0xE8&&
    685                             *((long *)(temporary+1))+5==(long)rva_to_real(pSub_DebugSys_EndProc->CompileAddress)-(long)EIP_RIP(Context)){
     685                            *((long *)(temporary+1))+5==(long)rva_to_real(pSub_DebugSys_EndProc->beginOpAddress)-(long)EIP_RIP(Context)){
    686686                            //プロシージャの終端位置の場合はステップインを行う
    687687                            goto StepIn;
     
    700700                        else{
    701701                            //プロシージャを識別
    702                             psi=GetSubFromObp(pobj_dti->lplpObp[pobj_dti->iProcLevel]);
     702                            pUserProc=GetSubFromObp(pobj_dti->lplpObp[pobj_dti->iProcLevel]);
    703703
    704704                            //シングルステップON
    705705                            WriteProcessMemory(hDebugProcess,
    706                                 (void *)rva_to_real(psi->CompileAddress),
    707                                 pobj_DBDebugSection->pobj_now->SingleStepCodeBuffer+psi->CompileAddress,
    708                                 psi->EndOpAddr-psi->CompileAddress,
     706                                (void *)rva_to_real(pUserProc->beginOpAddress),
     707                                pobj_DBDebugSection->pobj_now->SingleStepCodeBuffer+pUserProc->beginOpAddress,
     708                                pUserProc->endOpAddress-pUserProc->beginOpAddress,
    709709                                &lpAccBytes);
    710710                        }
  • BasicCompiler_Common/DebugMiddleFile.cpp

    r73 r75  
    1010
    1111
    12 void SetLpIndex_DebugFile(char *buffer,int *p,int type,LONG_PTR lpIndex){
    13     if(NATURAL_TYPE(type)==DEF_OBJECT || NATURAL_TYPE(type)==DEF_STRUCT){
    14         lstrcpy(buffer+(*p),((CClass *)lpIndex)->name);
     12void SetLpIndex_DebugFile(char *buffer,int *p,const Type &type){
     13    if(NATURAL_TYPE(type.GetBasicType())==DEF_OBJECT || NATURAL_TYPE(type.GetBasicType())==DEF_STRUCT){
     14        lstrcpy(buffer+(*p),type.GetClass().name);
    1515        (*p)+=lstrlen(buffer+(*p))+1;
    1616    }
    1717    else{
    18         *(LONG_PTR *)(buffer+(*p))=lpIndex;
     18        *(LONG_PTR *)(buffer+(*p))=type.GetIndex();
    1919        (*p)+=sizeof(LONG_PTR);
    2020    }
     
    2222
    2323
    24 void GetLpIndex_DebugFile(char *buffer,int *p,int type,LONG_PTR *plpIndex){
    25     if(NATURAL_TYPE(type)==DEF_OBJECT || NATURAL_TYPE(type)==DEF_STRUCT){
     24void GetLpIndex_DebugFile(char *buffer,int *p,Type &type){
     25    if(NATURAL_TYPE(type.GetBasicType())==DEF_OBJECT || NATURAL_TYPE(type.GetBasicType())==DEF_STRUCT){
    2626        char szClassName[VN_SIZE];
    2727        lstrcpy(szClassName,buffer+(*p));
    2828        (*p)+=lstrlen(buffer+(*p))+1;
    2929
    30         *plpIndex=(LONG_PTR)pobj_DBClass->check(szClassName);
     30        type.SetIndex( (LONG_PTR)pobj_DBClass->check(szClassName) );
    3131    }
    3232    else{
    33         *plpIndex=*(LONG_PTR *)(buffer+(*p));
     33        type.SetIndex( *(LONG_PTR *)(buffer+(*p)) );
    3434        (*p)+=sizeof(LONG_PTR);
    3535    }
     
    4949}
    5050void CDebugSection::make(void){
    51     extern VARIABLE *GlobalVar;
    52     extern int MaxGlobalVarNum;
    5351    extern INCLUDEFILEINFO IncludeFileInfo;
    5452    int i2,i3,i4,i5,BufferSize;
     
    160158
    161159    //グローバル変数情報
    162     *(long *)(buffer+i2)=MaxGlobalVarNum;
    163     i2+=sizeof(long);
    164     for(i3=0;i3<MaxGlobalVarNum;i3++){
    165         VARIABLE *pVar=&GlobalVar[i3];
    166 
     160    *(long *)(buffer+i2)=(int)::globalVars.size();
     161    i2+=sizeof(long);
     162    foreach( Variable *pVar, ::globalVars ){
    167163        //変数名
    168         lstrcpy(buffer+i2,pVar->name);
     164        lstrcpy(buffer+i2,pVar->GetName().c_str());
    169165        i2+=lstrlen(buffer+i2)+1;
    170166
    171167        //型
    172         *(long *)(buffer+i2)=pVar->type;
     168        *(long *)(buffer+i2)=pVar->GetBasicType();
    173169        i2+=sizeof(long);
    174170
    175171        //型の拡張情報
    176         SetLpIndex_DebugFile(buffer,&i2,pVar->type,pVar->u.index);
    177 
    178         buffer[i2++]=(char)pVar->fRef;
    179 
    180         buffer[i2++]=(char)pVar->bArray;
    181 
    182         if(pVar->bArray){
    183             for(i4=0;;i4++){
    184                 *(long *)(buffer+i2)=pVar->SubScripts[i4];
     172        SetLpIndex_DebugFile(buffer,&i2,*pVar);
     173
     174        buffer[i2++] = pVar->IsRef() ? 1 : 0;
     175
     176        buffer[i2++] = pVar->IsArray() ? 1 : 0;
     177
     178        if(pVar->IsArray()){
     179            for(i5=0;;i5++){
     180                *(long *)(buffer+i2)=pVar->GetSubScriptsPtr()[i5];
    185181                i2+=sizeof(long);
    186                 if(pVar->SubScripts[i4]==-1) break;
     182                if(pVar->GetSubScriptsPtr()[i5]==-1) break;
    187183            }
    188184        }
     
    213209
    214210    //プロシージャ情報
    215     extern SubInfo **ppSubHash;
     211    extern UserProc **ppSubHash;
    216212    extern int SubNum;
    217     SubInfo *psi;
     213    UserProc *pUserProc;
    218214    *(long *)(buffer+i2)=SubNum;
    219215    i2+=sizeof(long);
    220216    for(i3=0;i3<MAX_HASH;i3++){
    221         psi=ppSubHash[i3];
    222         while(psi){
    223             if(psi->pobj_ParentClass){
    224                 lstrcpy(buffer+i2,psi->pobj_ParentClass->name);
     217        pUserProc=ppSubHash[i3];
     218        while(pUserProc){
     219            if(pUserProc->GetParentClassPtr()){
     220                lstrcpy(buffer+i2,pUserProc->GetParentClassPtr()->name);
    225221                i2+=lstrlen(buffer+i2)+1;
    226222            }
     
    231227
    232228            //ID
    233             *(long *)(buffer+i2)=psi->id;
     229            *(long *)(buffer+i2)=pUserProc->id;
    234230            i2+=sizeof(long);
    235231
    236232            //関数名
    237             lstrcpy(buffer+i2,psi->name);
     233            lstrcpy(buffer+i2,pUserProc->GetName().c_str());
    238234            i2+=lstrlen(buffer+i2)+1;
    239235
    240             *(long *)(buffer+i2)=psi->CompileAddress;
    241             i2+=sizeof(long);
    242             *(long *)(buffer+i2)=psi->EndOpAddr;
    243             i2+=sizeof(long);
    244 
    245             *(long *)(buffer+i2)=psi->bVirtual;
     236            *(long *)(buffer+i2)=pUserProc->beginOpAddress;
     237            i2+=sizeof(long);
     238            *(long *)(buffer+i2)=pUserProc->endOpAddress;
    246239            i2+=sizeof(long);
    247240
    248241            //ローカル変数情報
    249             *(long *)(buffer+i2)=psi->VarNum;
     242            *(long *)(buffer+i2)=(int)pUserProc->localVars.size();
    250243            i2+=sizeof(long);
    251244
     
    256249            }
    257250
    258             for(i4=0;i4<psi->VarNum;i4++){
    259                 VARIABLE *pVar=&psi->pVar[i4];
    260                 lstrcpy(buffer+i2,pVar->name);
     251            foreach( Variable *pVar, pUserProc->localVars ){
     252                lstrcpy(buffer+i2,pVar->GetName().c_str());
    261253                i2+=lstrlen(buffer+i2)+1;
    262254
    263255                //型
    264                 *(long *)(buffer+i2)=pVar->type;
     256                *(long *)(buffer+i2)=pVar->GetBasicType();
    265257                i2+=sizeof(long);
    266258
    267259                //型の拡張情報
    268                 SetLpIndex_DebugFile(buffer,&i2,pVar->type,pVar->u.index);
     260                SetLpIndex_DebugFile(buffer,&i2,*pVar);
    269261
    270262                //参照型パラメータかどうか
    271                 buffer[i2++]=(char)pVar->fRef;
     263                buffer[i2++] = pVar->IsRef() ? 1 : 0;
    272264
    273265                //配列かどうか
    274                 buffer[i2++]=(char)pVar->bArray;
     266                buffer[i2++] = pVar->IsArray() ? 1 : 0;
    275267
    276268                //配列要素
    277                 if(pVar->bArray){
     269                if(pVar->IsArray()){
    278270                    for(i5=0;;i5++){
    279                         *(long *)(buffer+i2)=pVar->SubScripts[i5];
     271                        *(long *)(buffer+i2)=pVar->GetSubScriptsPtr()[i5];
    280272                        i2+=sizeof(long);
    281                         if(pVar->SubScripts[i5]==-1) break;
     273                        if(pVar->GetSubScriptsPtr()[i5]==-1) break;
    282274                    }
    283275                }
    284                 else pVar->SubScripts[0]=-1;
    285276
    286277                //レキシカルスコープ情報
     
    306297            }
    307298
    308             psi=psi->pNextData;
     299            pUserProc=pUserProc->pNextData;
    309300        }
    310301    }
     
    347338
    348339            //型
    349             *(long *)(buffer+i2)=pobj_c->ppobj_Member[i4]->TypeInfo.type;
     340            *(long *)(buffer+i2)=pobj_c->ppobj_Member[i4]->GetBasicType();
    350341            i2+=sizeof(long);
    351342
    352343            //型の拡張情報
    353             SetLpIndex_DebugFile(buffer,&i2,pobj_c->ppobj_Member[i4]->TypeInfo.type,pobj_c->ppobj_Member[i4]->TypeInfo.u.lpIndex);
     344            SetLpIndex_DebugFile(buffer,&i2,*pobj_c->ppobj_Member[i4]);
    354345
    355346            *(long *)(buffer+i2)=pobj_c->ppobj_Member[i4]->dwAccess;
     
    377368                i2+=lstrlen(buffer+i2)+1;
    378369            }
    379             lstrcpy(buffer+i2,method->psi->name);
     370            lstrcpy(buffer+i2,method->pUserProc->GetName().c_str());
    380371            i2+=lstrlen(buffer+i2)+1;
    381372        }
     
    392383
    393384            //型
    394             *(long *)(buffer+i2)=member->TypeInfo.type;
     385            *(long *)(buffer+i2)=member->GetBasicType();
    395386            i2+=sizeof(long);
    396387
    397388            //型の拡張情報
    398             SetLpIndex_DebugFile(buffer,&i2,member->TypeInfo.type,member->TypeInfo.u.lpIndex);
     389            SetLpIndex_DebugFile(buffer,&i2,*member);
    399390
    400391            *(long *)(buffer+i2)=member->dwAccess;
     
    540531
    541532    //グローバル変数情報
    542     MaxGlobalVarNum=*(long *)(buffer+i2);
    543     i2+=sizeof(long);
    544     GlobalVar=(VARIABLE *)HeapAlloc(hHeap,0,MaxGlobalVarNum*sizeof(VARIABLE)+1);
    545     for(i3=0;i3<MaxGlobalVarNum;i3++){
    546         VARIABLE *pVar=&GlobalVar[i3];
     533    globalVars.clear();
     534    int maxGlobalVars=*(long *)(buffer+i2);
     535    i2+=sizeof(long);
     536    for(i3=0;i3<maxGlobalVars;i3++){
    547537
    548538        //変数名
    549         lstrcpy(pVar->name,buffer+i2);
    550         i2+=lstrlen(buffer+i2)+1;
    551 
    552         pVar->type=*(long *)(buffer+i2);
    553         i2+=sizeof(long);
    554 
    555         GetLpIndex_DebugFile(buffer,&i2,pVar->type,&pVar->u.index);
    556 
    557         pVar->fRef=(long)buffer[i2++];
    558 
    559         pVar->bArray=(long)buffer[i2++];
    560         if(pVar->bArray){
     539        char *name = buffer+i2;
     540        i2+=lstrlen(buffer+i2)+1;
     541
     542        int basicType = *(long *)(buffer+i2);
     543        i2+=sizeof(long);
     544
     545        Type type( basicType );
     546        GetLpIndex_DebugFile(buffer,&i2,type);
     547
     548        bool isRef = (buffer[i2++]) ? true:false;
     549
     550        bool isArray = (buffer[i2++]) ? true:false;
     551
     552        Variable *pVar = new Variable( name, type, false, isRef );
     553
     554        if(isArray){
     555            int SubScripts[MAX_ARRAYDIM];
    561556            for(i4=0;;i4++){
    562                 pVar->SubScripts[i4]=*(long *)(buffer+i2);
     557                SubScripts[i4]=*(long *)(buffer+i2);
    563558                i2+=sizeof(long);
    564559
    565                 if(pVar->SubScripts[i4]==-1) break;
    566             }
     560                if(SubScripts[i4]==-1) break;
     561            }
     562
     563            pVar->SetArray( SubScripts );
    567564        }
    568565
     
    578575        pVar->offset=*(long *)(buffer+i2);
    579576        i2+=sizeof(long);
     577
     578        //変数を追加
     579        globalVars.push_back( pVar );
    580580    }
    581581
     
    585585
    586586    //プロシージャ情報
    587     SubInfo *psi;
     587    UserProc *pUserProc;
    588588    SubNum=*(long *)(buffer+i2);
    589589    i2+=sizeof(long);
    590     ppSubHash=(SubInfo **)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,MAX_HASH*sizeof(SubInfo *));
    591     for(i3=0;i3<SubNum;i3++){
    592         psi = new SubInfo();
    593         psi->pNextData=0;
    594 
     590    ppSubHash=(UserProc **)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,MAX_HASH*sizeof(UserProc *));
     591    for(int i6=0;i6<SubNum;i6++){
    595592        char szParentClassName[VN_SIZE];
    596593        lstrcpy(szParentClassName,buffer+i2);
    597594        i2+=lstrlen(buffer+i2)+1;
    598595
     596        CClass *pClass = NULL;
    599597        if(szParentClassName[0])
    600             psi->pobj_ParentClass=pobj_DBClass->check(szParentClassName);
    601         else psi->pobj_ParentClass=0;
     598            pClass=pobj_DBClass->check(szParentClassName);
    602599
    603600        //ID
    604         psi->id=*(long *)(buffer+i2);
     601        int id=*(long *)(buffer+i2);
    605602        i2+=sizeof(long);
    606603
    607604        //名前
    608         psi->name=(char *)HeapAlloc(hHeap,0,lstrlen(buffer+i2)+1);
    609         lstrcpy(psi->name,buffer+i2);
    610         i2+=lstrlen(buffer+i2)+1;
    611 
    612         psi->CompileAddress=*(long *)(buffer+i2);
    613         i2+=sizeof(long);
    614         psi->EndOpAddr=*(long *)(buffer+i2);
    615         i2+=sizeof(long);
    616 
    617         psi->bVirtual=*(long *)(buffer+i2);
    618         i2+=sizeof(long);
    619 
    620         psi->bCompile=1;
     605        char *name = buffer+i2;
     606        i2+=lstrlen(buffer+i2)+1;
     607
     608        // オブジェクトを生成
     609        pUserProc = new UserProc( name, UserProc::Function, false, false, false );
     610        pUserProc->pNextData=0;
     611        pUserProc->id=id;
     612        pUserProc->SetParentClass( pClass );
     613
     614        pUserProc->beginOpAddress=*(long *)(buffer+i2);
     615        i2+=sizeof(long);
     616        pUserProc->endOpAddress=*(long *)(buffer+i2);
     617        i2+=sizeof(long);
     618
     619        pUserProc->CompleteCompile();
    621620
    622621        //ローカル変数情報
    623         psi->VarNum=*(long *)(buffer+i2);
    624         i2+=sizeof(long);
    625         psi->pVar=(VARIABLE *)HeapAlloc(hHeap,0,psi->VarNum*sizeof(VARIABLE)+1);
    626         for(i4=0;i4<psi->VarNum;i4++){
    627             VARIABLE *pVar=&psi->pVar[i4];
    628 
    629             //ローカル変数名
    630             lstrcpy(pVar->name,buffer+i2);
     622        pUserProc->localVars.clear();
     623        int maxLocalVar=*(long *)(buffer+i2);
     624        i2+=sizeof(long);
     625        for(i3=0;i3<maxLocalVar;i3++){
     626            //変数名
     627            char *name = buffer+i2;
    631628            i2+=lstrlen(buffer+i2)+1;
    632629
    633             //型
    634             pVar->type=*(long *)(buffer+i2);
    635             i2+=sizeof(long);
    636 
    637             //型の拡張情報
    638             GetLpIndex_DebugFile(buffer,&i2,pVar->type,&pVar->u.index);
    639 
    640             //参照型パラメータかどうか
    641             pVar->fRef=(long)buffer[i2++];
    642 
    643             //配列かどうか
    644             pVar->bArray=(long)buffer[i2++];
    645             if(pVar->bArray){
    646                 for(i5=0;;i5++){
    647                     //配列要素
    648                     pVar->SubScripts[i5]=*(long *)(buffer+i2);
     630            int basicType = *(long *)(buffer+i2);
     631            i2+=sizeof(long);
     632
     633            Type type( basicType );
     634            GetLpIndex_DebugFile(buffer,&i2,type);
     635
     636            bool isRef = (buffer[i2++]) ? true:false;
     637
     638            bool isArray = (buffer[i2++]) ? true:false;
     639
     640            Variable *pVar = new Variable( name, type, false, isRef );
     641
     642            if(isArray){
     643                int SubScripts[MAX_ARRAYDIM];
     644                for(i4=0;;i4++){
     645                    SubScripts[i4]=*(long *)(buffer+i2);
    649646                    i2+=sizeof(long);
    650647
    651                     if(pVar->SubScripts[i5]==-1) break;
     648                    if(SubScripts[i4]==-1) break;
    652649                }
     650
     651                pVar->SetArray( SubScripts );
    653652            }
    654653
     
    661660            i2+=sizeof(long);
    662661
    663             //メモリ上の位置
     662            //メモリ位置
    664663            pVar->offset=*(long *)(buffer+i2);
    665664            i2+=sizeof(long);
     665
     666            //変数を追加
     667            pUserProc->localVars.push_back( pVar );
    666668        }
    667669
    668670
    669671        /////////////////////////////////
    670         // 格納位置を計算してpsiをセット
     672        // 格納位置を計算してpUserProcをセット
    671673        /////////////////////////////////
    672674
    673         i4=hash_default(psi->name);
    674 
    675         SubInfo *psi2;
     675        i4=hash_default(pUserProc->GetName().c_str());
     676
     677        UserProc *psi2;
    676678        if(ppSubHash[i4]){
    677679            psi2=ppSubHash[i4];
    678680            while(1){
    679681                if(psi2->pNextData==0){
    680                     psi2->pNextData=psi;
     682                    psi2->pNextData=pUserProc;
    681683                    break;
    682684                }
     
    685687        }
    686688        else{
    687             ppSubHash[i4]=psi;
     689            ppSubHash[i4]=pUserProc;
    688690        }
    689691    }
     
    723725
    724726            //型
    725             pobj_c->ppobj_Member[i4]->TypeInfo.type=*(long *)(buffer+i2);
     727            Type type( *(long *)(buffer+i2) );
    726728            i2+=sizeof(long);
    727729
    728730            //型の拡張情報
    729             GetLpIndex_DebugFile(buffer,&i2,pobj_c->ppobj_Member[i4]->TypeInfo.type,&pobj_c->ppobj_Member[i4]->TypeInfo.u.lpIndex);
     731            GetLpIndex_DebugFile(buffer,&i2,type);
     732
     733            pobj_c->ppobj_Member[i4]->SetType( type.GetBasicType(), type.GetIndex() );
    730734
    731735            pobj_c->ppobj_Member[i4]->dwAccess=*(long *)(buffer+i2);
     
    757761            if(pobj_temp_c==0) pobj_temp_c=pobj_c;
    758762            i5=hash_default(temp2);
    759             psi=ppSubHash[i5];
     763            pUserProc=ppSubHash[i5];
    760764            while(1){
    761                 if(lstrcmp(psi->name,temp2)==0&&psi->pobj_ParentClass==pobj_temp_c) break;
    762                 psi=psi->pNextData;
    763             }
    764             method->psi=psi;
     765                if( pUserProc->GetName() == temp2 &&pUserProc->GetParentClassPtr()==pobj_temp_c) break;
     766                pUserProc=pUserProc->pNextData;
     767            }
     768            method->pUserProc=pUserProc;
    765769
    766770            pobj_c->methods.push_back( method );
     
    781785
    782786            //型
    783             member->TypeInfo.type=*(long *)(buffer+i2);
     787            Type type( *(long *)(buffer+i2) );
    784788            i2+=sizeof(long);
    785789
    786790            //型の拡張情報
    787             GetLpIndex_DebugFile(buffer,&i2,member->TypeInfo.type,&member->TypeInfo.u.lpIndex);
     791            GetLpIndex_DebugFile(buffer,&i2,type);
     792
     793            member->SetType( type.GetBasicType(), type.GetIndex() );
    788794
    789795            member->dwAccess=*(long *)(buffer+i2);
     
    800806
    801807
    802     extern SubInfo **ppSubHash;
     808    extern UserProc **ppSubHash;
    803809    ppSubHash=this->ppSubHash;
    804810    pSub_DebugSys_EndProc=GetSubHash("_DebugSys_EndProc");
     
    956962    ppConstHash=this->ppConstHash;
    957963
    958     //グローバル変数に関する情報
    959     extern VARIABLE *GlobalVar;
    960     extern int MaxGlobalVarNum;
    961     GlobalVar=this->GlobalVar;
    962     MaxGlobalVarNum=this->MaxGlobalVarNum;
    963 
    964964    //グローバル実行領域のサイズ
    965965    extern int GlobalOpBufferSize;
     
    969969    extern char **ppMacroNames;
    970970    ppMacroNames=0;
    971     extern SubInfo **ppSubHash;
     971    extern UserProc **ppSubHash;
    972972    extern int SubNum;
    973973    ppSubHash=this->ppSubHash;
    974974    SubNum=this->SubNum;
    975975
    976     extern SubInfo *pSub_DebugSys_EndProc;
     976    extern UserProc *pSub_DebugSys_EndProc;
    977977    pSub_DebugSys_EndProc=this->pSub_DebugSys_EndProc;
    978978
     
    989989        HeapDefaultFree(IncludeFileInfo.ppFileNames[i2]);
    990990    HeapDefaultFree(IncludeFileInfo.ppFileNames);
    991 
    992     //グローバル変数に関する情報を解放
    993     HeapDefaultFree(GlobalVar);
    994 
    995     //ローカル変数に関する情報を解放
    996     SubInfo *psi;
    997     for(i2=0;i2<MAX_HASH;i2++){
    998         psi=ppSubHash[i2];
    999         while(psi){
    1000             if(psi->bCompile)
    1001                 HeapDefaultFree(psi->pVar);
    1002 
    1003             psi=psi->pNextData;
    1004         }
    1005     }
    1006991
    1007992    //クラスに関するメモリを解放
  • BasicCompiler_Common/DebugSection.h

    r73 r75  
    4141    CONSTINFO **ppConstHash;
    4242
    43     //グローバル変数に関する情報
    44     VARIABLE *GlobalVar;
    45     int MaxGlobalVarNum;
    46 
    4743    //グローバル実行領域のサイズ
    4844    int GlobalOpBufferSize;
    4945
    5046    //プロシージャ
    51     SubInfo **ppSubHash;
     47    UserProc **ppSubHash;
    5248    int SubNum;
    5349
    54     SubInfo *pSub_DebugSys_EndProc;
     50    UserProc *pSub_DebugSys_EndProc;
    5551
    5652    //ネイティブコードバッファ
  • BasicCompiler_Common/Enum.cpp

    r47 r75  
    1515
    1616
    17 CEnumParent::CEnumParent(char *buffer,int NowLine){
     17CEnumParent::CEnumParent(char *buffer,int nowLine){
    1818    ppobj_EnumMember=(CEnumMember **)HeapAlloc(hHeap,0,1);
    1919    iEnumMemberNum=0;
     
    4242
    4343    if(buffer[i]=='\0'){
    44         SetError(22,"Enum",NowLine);
     44        SetError(22,"Enum",nowLine);
    4545        return;
    4646    }
     
    6565        if(temporary[0]=='\0'){
    6666            if(buffer[i]=='\0'){
    67                 SetError(22,"Enum",NowLine);
     67                SetError(22,"Enum",nowLine);
    6868                break;
    6969            }
  • BasicCompiler_Common/Enum.h

    r4 r75  
    1717public:
    1818
    19     CEnumParent(char *buffer,int NowLine);
     19    CEnumParent(char *buffer,int nowLine);
    2020    ~CEnumParent();
    2121
  • BasicCompiler_Common/Intermediate_Step2.cpp

    r64 r75  
    146146        //数値定数
    147147        _int64 i64data;
    148         pci->type=StaticCalculation(true, temporary,0,&i64data,&pci->lpIndex);
     148        Type resultType;
     149        StaticCalculation(true, temporary,0,&i64data,resultType);
     150        pci->type=resultType.GetBasicType();
    149151        if(IsRealNumberType(pci->type)){
    150152            //実数型
     
    231233
    232234            _int64 i64data;
    233             LONG_PTR lpIndex;
    234             StaticCalculation(true, temp2,DEF_LONG,&i64data,&lpIndex);
     235            StaticCalculation(true, temp2,DEF_LONG,&i64data,Type());
    235236            NextValue=(int)i64data;
    236237        }
     
    303304
    304305char ConstructorDestructorSchedule[MAX_PATH];
    305 void MakeConstructorAndDestructor(char *buffer,int NowLine,char *ClassName){
     306void MakeConstructorAndDestructor(char *buffer,int nowLine,char *ClassName){
    306307    int i,i2;
    307308    char temporary[MAX_PATH],*pTemp;
     
    312313    bDestructor=0;
    313314
    314     for(i=NowLine;;i++){
     315    for(i=nowLine;;i++){
    315316        if(buffer[i]=='\0') break;
    316317        if(buffer[i]==1&&buffer[i+1]==ESC_ENDCLASS){
     
    360361    }
    361362}
    362 void ChangeCommand(char *buffer,int NowLine,char *Command){
     363void ChangeCommand(char *buffer,int nowLine,char *Command){
    363364    int i,i2,IsStr;
    364365    unsigned _int16 ComNum;
     
    391392
    392393                //コンストラクタ、デストラクタを暗黙的に生成
    393                 MakeConstructorAndDestructor(buffer,NowLine,Command+2);
     394                MakeConstructorAndDestructor(buffer,nowLine,Command+2);
    394395                break;
    395396            case ESC_INTERFACE:
     
    457458    if( nCountOfNonGlobalScope == 0 ){
    458459        //グローバル
    459         if(lstrcmpi(com,"Open")==0) ComOpen(Command+i,pam,NowLine);
     460        if(lstrcmpi(com,"Open")==0) ComOpen(Command+i,pam,nowLine);
    460461        else if(lstrcmpi(com,"Close")==0) ComClose(Command+i,pam);
    461462        else if(lstrcmpi(com,"Field")==0||
    462463            lstrcmpi(com,"Get")==0||
    463464            lstrcmpi(com,"Put")==0) ComField(Command+i,pam);
    464         else if(lstrcmpi(com,"Line")==0) ComLine(Command+i,pam,NowLine);
    465         else if(lstrcmpi(com,"Circle")==0) ComCircle(Command+i,pam,NowLine);
    466         else if(lstrcmpi(com,"PSet")==0) ComPSet(Command+i,pam,NowLine);
    467         else if(lstrcmpi(com,"Paint")==0) ComPaint(Command+i,pam,NowLine);
     465        else if(lstrcmpi(com,"Line")==0) ComLine(Command+i,pam,nowLine);
     466        else if(lstrcmpi(com,"Circle")==0) ComCircle(Command+i,pam,nowLine);
     467        else if(lstrcmpi(com,"PSet")==0) ComPSet(Command+i,pam,nowLine);
     468        else if(lstrcmpi(com,"Paint")==0) ComPaint(Command+i,pam,nowLine);
    468469
    469470        else if(
  • BasicCompiler_Common/LexicalScoping.cpp

    r73 r75  
    8585    CallDestructorsOfScopeEnd();
    8686
    87     extern BOOL bCompilingGlobal;
    88     VARIABLE *pVar;
    89     int num;
    90     if(bCompilingGlobal){
    91         //グローバル領域をコンパイルしているとき
    92         extern VARIABLE *GlobalVar;
    93         extern int MaxGlobalVarNum;
    94         pVar=GlobalVar;
    95         num=MaxGlobalVarNum;
    96     }
    97     else{
    98         //ローカル領域をコンパイルしているとき
    99         extern VARIABLE *LocalVar;
    100         extern int MaxLocalVarNum;
    101         pVar=LocalVar;
    102         num=MaxLocalVarNum;
    103     }
     87    Variables &vars = UserProc::IsGlobalAreaCompiling()?
     88        globalVars :
     89        UserProc::CompilingUserProc().localVars;
    10490
    10591    //使用済みローカル変数の生存チェックを外す
    106     for(int i=0;i<num;i++){
    107         if(pVar[i].bLiving&&pVar[i].ScopeLevel==level){
    108             pVar[i].bLiving=0;
     92    foreach( Variable *pVar, vars ){
     93        if(pVar->bLiving&&pVar->ScopeLevel==level){
     94            pVar->bLiving=0;
    10995            extern int obp;
    110             pVar[i].ScopeEndAddress=obp;
     96            pVar->ScopeEndAddress=obp;
    11197        }
    11298    }
     
    163149// スコープ終了時のデストラクタ呼び出し
    164150void CLexicalScopes::CallDestructorsOfScopeEnd(){
    165     extern BOOL bCompilingGlobal;
    166     VARIABLE *pVar;
    167     int num;
    168     if(bCompilingGlobal){
    169         //グローバルオブジェクトの解放処理
    170         extern VARIABLE *GlobalVar;
    171         extern int MaxGlobalVarNum;
    172         pVar=GlobalVar;
    173         num=MaxGlobalVarNum;
    174     }
    175     else{
    176         //ローカルオブジェクトの解放処理
    177         extern VARIABLE *LocalVar;
    178         extern int MaxLocalVarNum;
    179         pVar=LocalVar;
    180         num=MaxLocalVarNum;
    181     }
     151
     152    Variables &vars = UserProc::IsGlobalAreaCompiling()?
     153        globalVars :
     154        UserProc::CompilingUserProc().localVars;
    182155
    183156
    184157    int i3;
    185158    int indexSystemGC=-1;
    186     for( i3 = num - 1; i3 >= 0; i3-- ){     //確保したのと逆順序で解放するため、バックサーチにする
    187 
    188         if( bCompilingGlobal && GetNowLevel() == 0 ){
    189             if(lstrcmp(pVar[i3].name,"_System_GC")==0){
     159    for( i3 = (int)vars.size() - 1; i3 >= 0; i3-- ){        //確保したのと逆順序で解放するため、バックサーチにする
     160
     161        Variable *pVar = vars[i3];
     162
     163        if( UserProc::IsGlobalAreaCompiling() && GetNowLevel() == 0 ){
     164            if( pVar->GetName() == "_System_GC" ){
    190165                indexSystemGC=i3;
    191166                continue;
     
    194169
    195170        //同一レベルのレキシカルスコープのみを検知
    196         if(!pVar[i3].bLiving) continue;
    197         if( pVar[i3].ScopeLevel != GetNowLevel() ) continue;
    198 
    199         if(pVar[i3].type==DEF_STRUCT&&pVar[i3].fRef&OBJECT_PARAMETER){
     171        if(!pVar->bLiving) continue;
     172        if( pVar->ScopeLevel != GetNowLevel() ) continue;
     173
     174        if( pVar->IsStruct() && pVar->IsParameter() ){
    200175            //構造体パラメータを持つとき
    201176
     
    207182            //mov rcx,qword ptr[rsp+offset]
    208183            op_mov_RM(sizeof(_int64),REG_RCX,REG_RSP,
    209                 -pVar[i3].offset,
     184                -pVar->offset,
    210185                MOD_BASE_DISP32);
    211186            obp-=sizeof(long);
     
    216191
    217192            //mov ecx,dword ptr[ebp+offset]
    218             op_mov_RM(sizeof(long),REG_ECX,REG_EBP,-pVar[i3].offset,MOD_BASE_DISP32);
     193            op_mov_RM(sizeof(long),REG_ECX,REG_EBP,-pVar->offset,MOD_BASE_DISP32);
    219194            obp-=sizeof(long);
    220195            AddLocalVarAddrSchedule();
     
    226201
    227202            //call free
    228             extern SubInfo *pSub_free;
     203            extern UserProc *pSub_free;
    229204            op_call(pSub_free);
    230205
    231206
    232             if(bCompilingGlobal){
     207            if( UserProc::IsGlobalAreaCompiling() ){
    233208                //ここには来ないハズ
    234209                SetError(300,NULL,cp);
    235210            }
    236211        }
    237 
    238         /*
    239         TODO: 消す
    240         else if(pVar[i3].type==DEF_OBJECT&&pVar[i3].fRef==0){
    241             //デストラクタの呼び出し
    242             CMethod *method = pVar[i3].u.pobj_c->GetDestructorMethod();
    243             if( method ){
    244                 int ss[MAX_ARRAYDIM];
    245                 memset(ss,0,MAX_ARRAYDIM*sizeof(int));
    246                 if(pVar[i3].SubScripts[0]!=-1){
    247                     while(1){
    248                         for(i4=0;;i4++){
    249                             if(pVar[i3].SubScripts[i4]==-1) break;
    250 
    251                             if(ss[i4]>pVar[i3].SubScripts[i4]){
    252                                 ss[i4]=0;
    253                                 ss[i4+1]++;
    254                             }
    255                             else break;
    256                         }
    257                         if(pVar[i3].SubScripts[i4]==-1) break;
    258                         char temporary[VN_SIZE];
    259                         sprintf(temporary,"%s[%d",pVar[i3].name,ss[0]);
    260                         for(i4=1;;i4++){
    261                             if(pVar[i3].SubScripts[i4]==-1) break;
    262 
    263                             sprintf(temporary+lstrlen(temporary),",%d",ss[i4]);
    264                         }
    265                         lstrcat(temporary,"]");
    266                         Opcode_CallProc("",method->psi,0,temporary,DEF_OBJECT);
    267 
    268                         ss[0]++;
    269 
    270 
    271                         //ネイティブコードバッファの再確保
    272                         extern int obp_AllocSize;
    273                         if(obp_AllocSize<obp+8192){
    274                             obp_AllocSize+=8192;
    275                             OpBuffer=(char *)HeapReAlloc(hHeap,0,OpBuffer,obp_AllocSize); //matea
    276                         }
    277                     }
    278                 }
    279                 else{
    280                     Opcode_CallProc("",method->psi,0,pVar[i3].name,DEF_OBJECT);
    281                 }
    282             }
    283         }
    284         */
    285212    }
    286213
    287214    if(indexSystemGC!=-1){
    288215        //_System_GCオブジェクトのデストラクタの呼び出し処理
    289         CMethod *method = pVar[indexSystemGC].u.pobj_c->GetDestructorMethod();
     216        CMethod *method = vars[indexSystemGC]->GetClass().GetDestructorMethod();
    290217        if( method ){
    291             Opcode_CallProc("",method->psi,0,pVar[indexSystemGC].name,DEF_OBJECT);
     218            Opcode_CallProc("",method->pUserProc,0,vars[indexSystemGC]->GetName().c_str(),DEF_OBJECT);
    292219        }
    293220    }
  • BasicCompiler_Common/LexicalScoping.h

    r34 r75  
    7070    //Returnステートメント用のデストラクタ呼び出し
    7171    void CallDestructorsOfReturn( int BaseLevel = 0 );
    72 
    73 private:
    74     VARIABLE *add(void);
    7572};
    7673
  • BasicCompiler_Common/MakeExe.cpp

    r73 r75  
    165165    for(i3=0;i3<SynonymErrorNum;i3++) HeapDefaultFree(SynonymErrorWords[i3]);
    166166    HeapDefaultFree(SynonymErrorWords);
     167    SynonymErrorWords=0;
    167168
    168169    if(bError||bStopCompile){
     
    181182
    182183    //グローバル変数に関する情報
    183     extern VARIABLE *GlobalVar;
    184184    extern int MaxGlobalVarNum;
    185185    extern int AllGlobalVarSize;
    186186    extern int AllInitGlobalVarSize;
    187     GlobalVar=(VARIABLE *)HeapAlloc(hHeap,0,1);
     187    globalVars.clear();
    188188    MaxGlobalVarNum=0;
    189189    AllGlobalVarSize=0;
     
    214214    HeapDefaultFree(pLineInfo);
    215215
    216     //グローバル変数に関する情報を解放
    217     int i;
    218     for(i=0;i<MaxGlobalVarNum;i++){
    219         if(GlobalVar[i].ConstractParameter)
    220             HeapDefaultFree(GlobalVar[i].ConstractParameter);
    221     }
    222     HeapDefaultFree(GlobalVar);
    223 
    224     //ローカル変数に関する情報を解放
    225     extern SubInfo **ppSubHash;
    226     SubInfo *psi;
    227     for(i2=0;i2<MAX_HASH;i2++){
    228         psi=ppSubHash[i2];
    229         while(psi){
    230             if(psi->bCompile) HeapDefaultFree(psi->pVar);
    231             psi=psi->pNextData;
    232         }
    233     }
    234 
    235216    //TypeDef情報を初期化
    236217    delete pobj_DBTypeDef;
     
    238219
    239220    //サブルーチン(ユーザー定義)情報のメモリ解放
    240     extern SubInfo **ppSubHash;
     221    extern UserProc **ppSubHash;
    241222    extern char **ppMacroNames;
    242223    extern int MacroNum;
  • BasicCompiler_Common/NumOpe_GetType.cpp

    r73 r75  
    2828    type=CalcType;
    2929
    30     if(!BaseType){
     30    if(BaseType==0||BaseType==-1){
    3131        //ベースタイプが未定のとき
    3232        return type;
     
    3838    }
    3939
    40     if(BaseType==DEF_OBJECT){
     40    if(BaseType==DEF_OBJECT||BaseType==DEF_STRUCT){
    4141        //ベースタイプがオブジェクトのときは暗黙の変換は必要なし
    4242        return type;
     
    188188}
    189189
    190 int GetReturnType_OperatorProc(int idCalc,TYPEINFO *pBaseTypeInfo,int *type,LONG_PTR *index_stack,int &sp){
     190int GetReturnType_OperatorProc(int idCalc,const Type &baseType,int *type,LONG_PTR *index_stack,int &sp){
    191191    //オーバーロードされたオペレータ関数の戻り値を取得
    192192    CClass *pobj_c;
    193193    pobj_c=(CClass *)index_stack[sp-2];
    194194
    195     std::vector<SubInfo *> subs;
     195    std::vector<UserProc *> subs;
    196196    pobj_c->EnumMethod( idCalc, subs );
    197197    if( subs.size() == 0 ){
     
    212212
    213213    //_System_LocalThis
    214     PARAMETER_INFO *ppi = (PARAMETER_INFO *)HeapAlloc(hHeap,0,sizeof(PARAMETER_INFO)*3);
    215     int iParmNum=0;
     214    Parameters params;
    216215
    217216    if(bTwoTerm){
    218         ppi[iParmNum].bArray=0;
    219         ppi[iParmNum].bByVal=0;
    220         ppi[iParmNum].name=0;
    221         ppi[iParmNum].type=type[sp-1];
    222         ppi[iParmNum].u.index=index_stack[sp-1];
    223         ppi[iParmNum].SubScripts[0]=-1;
    224         iParmNum++;
     217        params.push_back( new Parameter( "", Type( type[sp-1], index_stack[sp-1] ) ) );
    225218    }
    226219
     
    230223    if(idCalc==CALC_EQUAL) lstrcpy(temporary,"==");
    231224    else GetCalcName(idCalc,temporary);
    232     SubInfo *psi;
    233     psi=OverloadSolution(temporary,subs,ppi,iParmNum,pBaseTypeInfo);
    234 
    235 
    236     if(!psi){
    237         HeapDefaultFree(ppi);
     225    UserProc *pUserProc = OverloadSolution( temporary, subs, params, baseType );
     226
     227    if(bTwoTerm){
     228        delete params[0];
     229    }
     230
     231    if(!pUserProc){
    238232        return 0;
    239233    }
    240234    else{
    241235        //オーバーロードされていないが、パラメータ個数が一致しないとき
    242         if(iParmNum!=psi->params.size()){
    243             HeapDefaultFree(ppi);
     236        if(params.size()!=pUserProc->Params().size()){
    244237            return 0;
    245238        }
    246239    }
    247240
    248     HeapDefaultFree(ppi);
    249 
    250241    sp--;
    251     type[sp-1]=psi->ReturnType;
    252     index_stack[sp-1]=psi->u.ReturnIndex;
     242    type[sp-1]=pUserProc->ReturnType().GetBasicType();
     243    index_stack[sp-1]=pUserProc->ReturnType().GetIndex();
    253244
    254245    return 1;
    255246}
    256247
    257 int Operator_New_GetType(const char *Parameter,LONG_PTR *plpIndex,const TYPEINFO &baseTypeInfo ){
     248bool Operator_New_GetType(const char *Parameter,const Type &baseType, Type &resultType ){
    258249    char TypeName[VN_SIZE],CreateParameter[VN_SIZE],objectSizeStr[VN_SIZE];
    259250    int i,i2;
     
    279270            if(Parameter[i]!='\0'){
    280271                SetError(42,NULL,cp);
    281                 return 0;
     272                return false;
    282273            }
    283274            break;
     
    290281    }
    291282
    292     int type;
    293     type=GetTypeFixed(TypeName,plpIndex);
    294 
    295     if( baseTypeInfo.type == DEF_OBJECT ){
    296         return DEF_OBJECT;
    297     }
    298     return DEF_PTR_OBJECT;
     283    if( !Type::StringToType( TypeName, resultType ) ){
     284        return false;
     285    }
     286
     287    if( baseType.IsObject() ){
     288        resultType.SetBasicType( DEF_OBJECT );
     289    }
     290    else{
     291        resultType.SetBasicType( DEF_PTR_OBJECT );
     292    }
     293    return true;
    299294}
    300295
    301 int NumOpe_GetType_Old( const char *Command,TYPEINFO *pBaseType,LONG_PTR *plpIndex){
     296bool NumOpe_GetType( const char *expression, const Type &baseType, Type &resultType ){
    302297    extern int cp;
    303298    int i,i2,i3,i4;
    304299    char temporary[1024],temp2[1024],temp3[1024];
    305300
    306     if(Command[0]=='\0'){
     301    if(expression[0]=='\0'){
    307302        SetError(1,NULL,cp);
    308         return 0;
    309     }
    310 
    311     if(Command[0]==1&& Command[1]==ESC_NEW ){
     303        return false;
     304    }
     305
     306    if(expression[0]==1&& expression[1]==ESC_NEW ){
    312307        //New演算子(オブジェクト生成)
    313         return Operator_New_GetType(Command+2,plpIndex, *pBaseType );
     308        return Operator_New_GetType(expression+2,baseType, resultType );
    314309    }
    315310
     
    323318    long stack[255];
    324319    int pnum;
    325     if(!GetNumOpeElements(Command,&pnum,values,calc,stack)){
     320    if(!GetNumOpeElements(expression,&pnum,values,calc,stack)){
    326321        for(i=0;i<pnum;i++){
    327322            if(values[i]) HeapDefaultFree(values[i]);
    328323        }
    329         return 0;
     324        return false;
    330325    }
    331326
     
    343338
    344339    int sp;
    345     int type[255];
     340    int type_stack[255];
    346341    LONG_PTR index_stack[255];
    347342    _int64 i64data;
     
    351346
    352347        if(idCalc){
    353             if(type[sp-2]==DEF_OBJECT){
     348            if(type_stack[sp-2]==DEF_OBJECT){
    354349                //オーバーロードされたオペレータを呼び出す
    355                 if(!GetReturnType_OperatorProc(idCalc,pBaseType,type,index_stack,sp)){
     350                if(!GetReturnType_OperatorProc(idCalc,baseType,type_stack,index_stack,sp)){
    356351                    goto error;
    357352                }
     
    360355            }
    361356
    362             if(!CheckCalcType(idCalc,type,sp)) goto error;
     357            if(!CheckCalcType(idCalc,type_stack,sp)) goto error;
    363358        }
    364359
     
    374369StrLiteral:
    375370
    376                     if(pBaseType){
    377                         if(pBaseType->type==DEF_OBJECT){
    378                             if(IsStringObjectType(*pBaseType)){
    379                                 //要求タイプがオブジェクトであり、Stringの受け入れが可能な場合
    380                                 extern CClass *pobj_StringClass;
    381                                 type[sp]=DEF_OBJECT;
    382                                 index_stack[sp]=(LONG_PTR)pobj_StringClass;
    383                                 bLiteralCalculation=0;
    384 
    385                                 sp++;
    386                                 break;
    387                             }
    388                         }
     371                    if( baseType.IsStringObject() ){
     372                        //要求タイプがオブジェクトであり、Stringの受け入れが可能な場合
     373                        extern CClass *pobj_StringClass;
     374                        type_stack[sp]=DEF_OBJECT;
     375                        index_stack[sp]=(LONG_PTR)pobj_StringClass;
     376                        bLiteralCalculation=0;
     377
     378                        sp++;
     379                        break;
    389380                    }
    390381
    391                     type[sp]=typeOfPtrChar;
     382                    type_stack[sp]=typeOfPtrChar;
    392383                    bLiteralCalculation=0;
    393384                }
     
    413404
    414405                        int idProc;
    415                         void *pInfo;
    416                         idProc=GetProc(temporary,&pInfo);
     406                        void *pProc;
     407                        idProc=GetProc(temporary,(void **)&pProc);
    417408
    418409                        if(idProc){
     
    433424                            ////////////////
    434425
    435                             i2=GetReturnTypeOfProc(idProc,pInfo,temporary,temp2,&index_stack[sp]);
    436                             if(i2==-1){
     426                            Type resultType;
     427                            if( !CallProc(idProc,pProc,temporary,temp2, resultType, false ) ){
     428                                goto error;
     429                            }
     430                            if( resultType.IsNull() ){
    437431                                //戻り値が存在しないとき
    438432                                goto error;
    439433                            }
    440434
    441                             type[sp]=i2;
     435                            type_stack[sp] = resultType.GetBasicType();
     436                            index_stack[sp] = resultType.GetIndex();
     437
    442438                            bLiteralCalculation=0;
    443439
     
    454450
    455451                            //マクロ関数の場合
    456                             i2=NumOpe_GetType_Old(temp3,NULL,&index_stack[sp]);
    457 
    458                             if(!IS_LITERAL(index_stack[sp])){
     452                            Type tempType;
     453                            NumOpe_GetType(temp3,Type(),tempType);
     454
     455                            if(!IS_LITERAL(tempType.GetIndex())){
    459456                                //リテラル値ではなかったとき
    460457                                bLiteralCalculation=0;
    461458                            }
    462459
    463                             type[sp]=i2;
     460                            type_stack[sp] = tempType.GetBasicType();
     461                            index_stack[sp] = tempType.GetIndex();
    464462
    465463                            sp++;
     
    473471                    GetArrayElement(term,VarName,ArrayElements);
    474472                    if(ArrayElements[0]){
    475                         CClass *pobj_c;
    476                         i2=GetVarType(VarName,(LONG_PTR *)&pobj_c,0);
    477                         if(i2==DEF_OBJECT){
    478                             TYPEINFO RetTypeInfo;
    479                             if( !GetReturnTypeOfIndexerGetterProc(pobj_c,RetTypeInfo) ){
     473                        Type type;
     474                        GetVarType(VarName,type,false);
     475                        if( type.IsObject() ){
     476                            if( !GetReturnTypeOfIndexerGetterProc( type.GetClass(),type) ){
    480477                                SetError(1,NULL,cp);
    481478                                goto error;
    482479                            }
    483                             type[sp]=RetTypeInfo.type;
    484                             index_stack[sp]=RetTypeInfo.u.lpIndex;
     480                            type_stack[sp]=type.GetBasicType();
     481                            index_stack[sp]=type.GetIndex();
    485482                            bLiteralCalculation=0;
    486483
     
    493490                    // Nothing
    494491                    if( lstrcmp( term, "Nothing" ) == 0 ){
    495                         type[sp] = DEF_OBJECT;
    496                         if( pBaseType && pBaseType->type == DEF_OBJECT ){
    497                             index_stack[sp] = pBaseType->u.lpIndex;
     492                        type_stack[sp] = DEF_OBJECT;
     493                        if( baseType.IsObject() ){
     494                            index_stack[sp] = baseType.GetIndex();
    498495                        }
    499496                        else{
     
    506503
    507504
    508                     i2=GetVarType(term,&index_stack[sp],0);
    509                     if(i2!=-1){
     505                    Type varType;
     506                    if( GetVarType(term,varType,0) ){
    510507                        //////////
    511508                        // 変数
    512509                        //////////
    513510
    514                         if(i2&FLAG_PTR){
     511                        if( varType.GetBasicType() & FLAG_PTR ){
    515512                            //配列ポインタ
    516                             type[sp]=GetPtrType(i2^FLAG_PTR,index_stack[sp]);
     513                            type_stack[sp]=GetPtrType( varType.GetBasicType()^FLAG_PTR );
    517514                        }
    518515                        else{
    519                             type[sp]=i2;
    520                         }
     516                            type_stack[sp]=varType.GetBasicType();
     517                        }
     518                        index_stack[sp] = varType.GetIndex();
    521519
    522520                        bLiteralCalculation=0;
     
    532530                    i3 = CDBConst::obj.GetType(term);
    533531                    if(i3){
    534                         type[sp]=i3;
     532                        type_stack[sp]=i3;
    535533                        if(IsRealNumberType(i3)){
    536534                            //実数
     
    563561                    i3=GetTypeFixed(term,&lp);
    564562                    if(i3!=-1){
    565                         type[sp]=i3|FLAG_CAST;
     563                        type_stack[sp]=i3|FLAG_CAST;
    566564                        index_stack[sp]=lp;
    567565                        sp++;
     
    579577
    580578                    if(GetSubHash(VarName,0)){
    581                         TYPEINFO RetTypeInfo;
    582                         GetReturnTypeOfPropertyMethod(term,NULL,&RetTypeInfo);
     579                        Type tempType;
     580                        GetReturnTypeOfPropertyMethod(term,NULL,tempType);
    583581
    584582                        //大きな型への暗黙の変換
    585                         type[sp]=RetTypeInfo.type;
    586 
    587                         index_stack[sp]=RetTypeInfo.u.lpIndex;
     583                        type_stack[sp]=tempType.GetBasicType();
     584
     585                        index_stack[sp]=tempType.GetIndex();
    588586                        bLiteralCalculation=0;
    589587
     
    597595                    bError=1;
    598596                    SetError(3,term,cp);
    599                     type[sp]=DEF_DOUBLE;
     597                    type_stack[sp]=DEF_DOUBLE;
    600598                }
    601599                else{
    602600                    //リテラル値
    603                     int base_type;
    604                     base_type=0;
    605                     if(pBaseType) base_type=pBaseType->type;
    606                     type[sp]=GetLiteralValue(term,&i64data,base_type);
     601                    int base_type = 0;
     602                    if( !baseType.IsNull() ) base_type = baseType.GetBasicType();
     603                    type_stack[sp]=GetLiteralValue(term,&i64data,base_type);
    607604Literal:
    608605                    if((long)i64data==0&&index_stack[sp]==-1) index_stack[sp]=LITERAL_NULL;
     
    617614            case CALC_AND:
    618615                sp--;
    619                 type[sp-1]=NeutralizationType(type[sp-1],index_stack[sp-1],type[sp],index_stack[sp]);
     616                type_stack[sp-1]=NeutralizationType(type_stack[sp-1],index_stack[sp-1],type_stack[sp],index_stack[sp]);
    620617                break;
    621618            case CALC_NOT:
     
    632629            case CALC_EQUAL:    //values[sp-2] =  values[sp-1] 
    633630                sp--;
    634                 type[sp-1]=DEF_LONG;
     631                type_stack[sp-1]=DEF_LONG;
    635632                break;
    636633
     
    646643            case CALC_PRODUCT:
    647644                sp--;
    648                 type[sp-1]=NeutralizationType(type[sp-1],index_stack[sp-1],type[sp],index_stack[sp]);
     645                type_stack[sp-1]=NeutralizationType(type_stack[sp-1],index_stack[sp-1],type_stack[sp],index_stack[sp]);
    649646                break;
    650647            case CALC_MOD:
     
    652649                //剰余演算
    653650                sp--;
    654                 type[sp-1]=NeutralizationType(type[sp-1],index_stack[sp-1],type[sp],index_stack[sp]);
     651                type_stack[sp-1]=NeutralizationType(type_stack[sp-1],index_stack[sp-1],type_stack[sp],index_stack[sp]);
    655652                break;
    656653            case CALC_QUOTIENT:
     
    658655                //除算
    659656                sp--;
    660                 type[sp-1]=NeutralizationType(type[sp-1],index_stack[sp-1],type[sp],index_stack[sp]);
     657                type_stack[sp-1]=NeutralizationType(type_stack[sp-1],index_stack[sp-1],type_stack[sp],index_stack[sp]);
    661658                break;
    662659            case CALC_INTQUOTIENT:
     
    664661                //整数除算
    665662                sp--;
    666                 type[sp-1]=NeutralizationType(type[sp-1],index_stack[sp-1],type[sp],index_stack[sp]);
     663                type_stack[sp-1]=NeutralizationType(type_stack[sp-1],index_stack[sp-1],type_stack[sp],index_stack[sp]);
    667664                break;
    668665            case CALC_MINUSMARK:
     
    677674            case CALC_AS:
    678675                //キャスト
    679                 type[sp-2]=type[sp-1]&(~FLAG_CAST);
     676                type_stack[sp-2]=type_stack[sp-1]&(~FLAG_CAST);
    680677                index_stack[sp-2]=index_stack[sp-1];
    681678
     
    685682            case CALC_BYVAL:
    686683                //ポインタ型→参照型
    687                 if( PTR_LEVEL( type[sp-1] ) <= 0 ){
     684                if( PTR_LEVEL( type_stack[sp-1] ) <= 0 ){
    688685                    //ポインタ型ではないとき
    689686                    SetError( 3, NULL, cp );
     
    691688                }
    692689
    693                 type[sp-1] = PTR_LEVEL_DOWN( type[sp-1] );
     690                type_stack[sp-1] = PTR_LEVEL_DOWN( type_stack[sp-1] );
    694691                break;
    695692        }
     
    705702    if(bLiteralCalculation){
    706703        //右辺値が数値の定数式の場合
    707         LONG_PTR lpCalcIndex;
    708         int base_type=0;
    709         if(pBaseType) base_type=pBaseType->type;
    710         i2=StaticCalculation(true, Command,base_type,&i64data,&lpCalcIndex);
    711 
    712         type[0]=i2;
    713         index_stack[0]=lpCalcIndex;
     704        int base_type = 0;
     705        if( !baseType.IsNull() ) base_type = baseType.GetBasicType();
     706        Type tempType;
     707        StaticCalculation(true, expression,base_type,&i64data,tempType);
     708
     709        type_stack[0]=tempType.GetBasicType();
     710        index_stack[0]=tempType.GetIndex();
    714711    }
    715712    else{
     
    718715    }
    719716
    720     if(plpIndex) *plpIndex=index_stack[0];
    721 
    722     int RetType;
    723     RetType=type[0];
     717    resultType.SetType( type_stack[0], index_stack[0] );
     718
     719    bool isSuccessful = true;
    724720    goto finish;
    725721
     
    730726
    731727error:
    732     RetType=-1;
     728    isSuccessful = false;
    733729    goto finish;
    734730
     
    738734        if(values[i]) HeapDefaultFree(values[i]);
    739735    }
    740     return RetType;
     736    return isSuccessful;
    741737}
    742 
    743 bool NumOpe_GetType( const char *expression, const Type &baseType, Type &resultType ){
    744     TYPEINFO baseTypeInfo = {
    745         baseType.GetBasicType(),
    746         baseType.GetIndex()
    747     };
    748     LONG_PTR lpIndex;
    749     int basicType = NumOpe_GetType_Old( expression,
    750         baseType.IsNull() ? NULL:&baseTypeInfo,
    751         &lpIndex );
    752 
    753     resultType.SetBasicType( basicType );
    754     resultType.SetIndex( lpIndex );
    755 
    756     return ( basicType != -1 );
    757 }
  • BasicCompiler_Common/Object.cpp

    r73 r75  
    99extern HANDLE hHeap;
    1010
    11 void CallConstructor(char *ObjectName,int *SubScripts,TYPEINFO &TypeInfo,char *Parameter){
    12     if(TypeInfo.type!=DEF_OBJECT) return;
     11void CallConstructor( const char *ObjectName,const int *SubScripts,const Type &type,const char *Parameter){
     12    if( !type.IsObject() ){
     13        return;
     14    }
    1315
    1416    /////////////////////////////////////
     
    1618    // ※コンストラクタの呼び出し
    1719    /////////////////////////////////////
    18     CClass *pobj_c;
    19     pobj_c=(CClass *)TypeInfo.u.lpIndex;
    2020
    21     SubInfo *psi;
    22     psi=GetMethodHash(ObjectName,pobj_c->name,Parameter);
    23     if(!psi){
    24         if(Parameter[0]) SetError(113,pobj_c->name,cp);
     21    UserProc *pUserProc;
     22    pUserProc=GetMethodHash(ObjectName,type.GetClass().name,Parameter);
     23    if(!pUserProc){
     24        if(Parameter[0]) SetError(113,type.GetClass().name,cp);
    2525        return;
    2626    }
     
    5252            lstrcat(temporary,"]");
    5353
    54             LONG_PTR lp;
    55             sprintf(temporary+lstrlen(temporary),".%s",pobj_c->name);
    56             CallProc(PROC_DEFAULT,
    57                 psi,
     54            Type dummyType;
     55            sprintf(temporary+lstrlen(temporary),".%s",type.GetClass().name);
     56            CallProc( PROC_DEFAULT,
     57                pUserProc,
    5858                temporary,
    5959                Parameter,
    60                 &lp);
     60                dummyType );
    6161
    6262            ss[0]++;
     
    7272    }
    7373    else{
    74         LONG_PTR lp;
    75         sprintf(temporary,"%s.%s",ObjectName,pobj_c->name);
    76         CallProc(PROC_DEFAULT,
    77             psi,
     74        Type dummyType;
     75        sprintf(temporary,"%s.%s",ObjectName,type.GetClass().name);
     76        CallProc( PROC_DEFAULT,
     77            pUserProc,
    7878            temporary,
    7979            Parameter,
    80             &lp);
     80            dummyType );
    8181    }
    8282}
     83
     84bool Operator_New( const char *expression, const Type &baseType, Type &resultType ){
     85    char CreateParameter[VN_SIZE],objectSizeStr[VN_SIZE];
     86    int i,i2;
     87
     88    i=0;
     89
     90    if(expression[0]=='['){
     91        i=GetStringInBracket(objectSizeStr,expression);
     92
     93        SlideString(objectSizeStr+1,-1);
     94        objectSizeStr[i-2]=0;
     95    }
     96    else objectSizeStr[0]=0;
     97
     98    char typeName[VN_SIZE];
     99    for(i2=0;;i++,i2++){
     100        if(expression[i]=='('){
     101            typeName[i2]=0;
     102
     103            //コンストラクタに渡すパラメータを取得
     104            i2=GetStringInPare(CreateParameter,expression+i);
     105            RemoveStringPare(CreateParameter);
     106            i+=i2;
     107            if(expression[i]!='\0'){
     108                SetError(42,NULL,cp);
     109                return false;
     110            }
     111            break;
     112        }
     113        typeName[i2]=expression[i];
     114        if(expression[i]=='\0'){
     115            CreateParameter[0]=0;
     116            break;
     117        }
     118    }
     119
     120    if( !Type::StringToType( typeName, resultType ) ){
     121        SetError(3,typeName,cp);
     122        return false;
     123    }
     124
     125    if( !resultType.IsObject() ){
     126        ////////////////////////
     127        // 通常のデータ型の場合
     128        ////////////////////////
     129
     130        SetError(121,NULL,cp);
     131        return false;
     132    }
     133
     134    Operator_New( resultType.GetClass(), objectSizeStr, CreateParameter, baseType );
     135
     136    if( !baseType.IsObject() ){
     137        // オブジェクトポインタ向け
     138        resultType.SetBasicType( DEF_PTR_OBJECT );
     139    }
     140
     141    return true;
     142}
  • BasicCompiler_Common/Overload.cpp

    r73 r75  
    77#endif
    88
    9 SubInfo *OverloadSolutionWithStrParam(
     9UserProc *OverloadSolutionWithStrParam(
    1010    const char *name,
    11     std::vector<SubInfo *> &subs,
     11    std::vector<UserProc *> &subs,
    1212    const char *Parameter,
    13     const char *ObjectName,
    14     TYPEINFO *pReturnTypeInfo){
     13    const char *ObjectName){
    1514
    1615        // オーバーロードの解決
     
    3130        //メソッドの場合は静的かどうかを調べる
    3231        bool isStatic = false;
    33         CClass *pClass = subs[0]->pobj_ParentClass;
     32        CClass *pClass = subs[0]->GetParentClassPtr();
    3433        if( pClass ){
    3534            isStatic = pClass->IsExistStaticMethod( MethodName );
     
    3736*/
    3837        //パラメータオブジェクトを生成
    39         if(lstrcmp(Parameter,"\"test\"")==0){
    40             int i=0;
    41         }
    4238        pobj_parameter=new ParamImpl(Parameter);
    43         if(pReturnTypeInfo) pobj_parameter->SetReturnType(pReturnTypeInfo);
    4439
    4540
    46         SubInfo *psi;
    47         psi=pobj_parameter->OverloadSolution(name,subs);
     41        UserProc *pUserProc;
     42        pUserProc=pobj_parameter->OverloadSolution(name,subs);
    4843
    4944
     
    5247        pobj_parameter=0;
    5348
    54         return psi;
     49        return pUserProc;
    5550}
    56 
    57 SubInfo *OverloadSolution(
     51UserProc *OverloadSolution(
    5852    const char *name,
    59     std::vector<SubInfo *> &subs,
    60     const PARAMETER_INFO *ppi,
    61     const int ParmNum,
    62     TYPEINFO *pReturnTypeInfo){
     53    std::vector<UserProc *> &subs,
     54    const Parameters &params,
     55    const Type &returnType ){
    6356
    6457        // オーバーロードの解決
     
    6861
    6962
    70         ParamImpl *pobj_Parameter=new ParamImpl(ppi,ParmNum);
    71         if(pReturnTypeInfo) pobj_Parameter->SetReturnType(pReturnTypeInfo);
     63        ParamImpl *pobj_Parameter=new ParamImpl( params );
     64        if( !returnType.IsNull() ){
     65            pobj_Parameter->SetReturnType( returnType );
     66        }
    7267
    73         SubInfo *psi;
    74         psi=pobj_Parameter->OverloadSolution(name,subs);
     68        UserProc *pUserProc;
     69        pUserProc=pobj_Parameter->OverloadSolution(name,subs);
    7570
    7671        delete pobj_Parameter;
    7772
    78         return psi;
     73        return pUserProc;
    7974}
  • BasicCompiler_Common/PESchedule.cpp

    r73 r75  
    197197
    198198CImportAddrSchedule::CImportAddrSchedule(){
    199     ppdi=(DECLAREINFO **)HeapAlloc(hHeap,0,1);
     199    ppdi=(DllProc **)HeapAlloc(hHeap,0,1);
    200200}
    201201CImportAddrSchedule::~CImportAddrSchedule(){
     
    203203}
    204204
    205 void CImportAddrSchedule::add(DECLAREINFO *pdi){
    206     ppdi=(DECLAREINFO **)HeapReAlloc(hHeap,0,ppdi,(num+1)*sizeof(DECLAREINFO *));
    207     ppdi[num]=pdi;
     205void CImportAddrSchedule::add(DllProc *pDllProc){
     206    ppdi=(DllProc **)HeapReAlloc(hHeap,0,ppdi,(num+1)*sizeof(DllProc *));
     207    ppdi[num]=pDllProc;
    208208
    209209    CSchedule::add();
     
    220220
    221221CSubAddrSchedule::CSubAddrSchedule(){
    222     ppsi=(SubInfo **)HeapAlloc(hHeap,0,1);
     222    ppsi=(UserProc **)HeapAlloc(hHeap,0,1);
    223223    pbCall=(BOOL *)HeapAlloc(hHeap,0,1);
    224224}
     
    228228}
    229229
    230 void CSubAddrSchedule::add(SubInfo *psi,BOOL bCall){
    231     if(!psi) return;
    232 
    233     ppsi=(SubInfo **)HeapReAlloc(hHeap,0,ppsi,(num+1)*sizeof(SubInfo *));
    234     ppsi[num]=psi;
     230void CSubAddrSchedule::add(UserProc *pUserProc,BOOL bCall){
     231    if(!pUserProc) return;
     232
     233    ppsi=(UserProc **)HeapReAlloc(hHeap,0,ppsi,(num+1)*sizeof(UserProc *));
     234    ppsi[num]=pUserProc;
    235235    pbCall=(BOOL *)HeapReAlloc(hHeap,0,pbCall,(num+1)*sizeof(BOOL));
    236236    pbCall[num]=bCall;
     
    283283
    284284
     285
     286
  • BasicCompiler_Common/PESchedule.h

    r73 r75  
    6363class CImportAddrSchedule:public CSchedule{
    6464public:
    65     DECLAREINFO **ppdi;
     65    DllProc **ppdi;
    6666
    6767    CImportAddrSchedule();
    6868    ~CImportAddrSchedule();
    6969
    70     void add(DECLAREINFO *pdi);
     70    void add(DllProc *pDllProc);
    7171};
    7272extern CImportAddrSchedule *pobj_ImportAddrSchedule;
     
    7979class CSubAddrSchedule:public CSchedule{
    8080public:
    81     SubInfo **ppsi;
     81    UserProc **ppsi;
    8282    BOOL *pbCall;
    8383
     
    8585    ~CSubAddrSchedule();
    8686
    87     void add(SubInfo *psi,BOOL bCall);
     87    void add(UserProc *pUserProc,BOOL bCall);
    8888};
    8989extern CSubAddrSchedule *pobj_SubAddrSchedule;
  • BasicCompiler_Common/ParamImpl.cpp

    r73 r75  
    77#endif
    88
    9 ParamImpl::ParamImpl(const char *buffer){
     9ParamImpl::ParamImpl(const char *buffer):
     10    returnType()
     11{
    1012    ///////////////////////////
    1113    // パラメータ文字列を整理
     
    5557        ParmsNum++;
    5658
     59        types.push_back( Type() );
     60
    5761        if(buffer[i]==',') i++;
    5862    }
    59 
    60     ReturnTypeInfo.type=DEF_NON;
    61     ReturnTypeInfo.u.lpIndex=-1;
    62 }
    63 ParamImpl::ParamImpl(const PARAMETER_INFO *pParamInfo,const int ParmNum){
    64     int i;
    65     for(i=0;i<ParmNum;i++){
    66         Parms[i]=0;
    67         types[i].type=pParamInfo[i].type;
    68         types[i].u.lpIndex=pParamInfo[i].u.index;
    69     }
    70     this->ParmsNum=ParmNum;
    71 
    72     ReturnTypeInfo.type=DEF_NON;
    73     ReturnTypeInfo.u.lpIndex=-1;
    74 }
    75 ParamImpl::ParamImpl(const Parameters &params){
    76     int count = 0;
     63}
     64ParamImpl::ParamImpl(const Parameters &params):
     65    returnType()
     66{
     67    ParmsNum = 0;
    7768    foreach( Parameter *pParam, params ){
    78         types[count].type = pParam->GetBasicType();
    79         types[count].u.lpIndex = pParam->GetIndex();
    80         count++;
    81     }
    82     this->ParmsNum=params.size();
    83 
    84     ReturnTypeInfo.type=DEF_NON;
    85     ReturnTypeInfo.u.lpIndex=-1;
     69        Parms[ParmsNum]=0;
     70        ParmsNum++;
     71
     72        types.push_back( *pParam );
     73    }
    8674}
    8775ParamImpl::~ParamImpl(){
     
    9684}
    9785
    98 void ParamImpl::SetReturnType(TYPEINFO *pTypeInfo){
    99     ReturnTypeInfo=*pTypeInfo;
    100 }
    101 
    102 BOOL ParamImpl::_overload_check( Parameters &params,TYPEINFO *pReturnTypeInfo,int overload_level){
     86void ParamImpl::SetReturnType( const Type &returnType ){
     87    this->returnType = returnType;
     88}
     89
     90bool ParamImpl::_overload_check( int level, const Parameters &targetParms, const Type &targetResultType ){
    10391    //パラメータを識別してオーバーロードを解決
    10492
    10593    //パラメータの個数が不一致の場合
    106     int max = (int)params.size();
    107     if(max!=ParmsNum) return 0;
     94    int max = (int)targetParms.size();
     95    if(max!=ParmsNum){
     96        return false;
     97    }
    10898
    10999    Type argType;
    110100    for(int i=0;i<max;i++){
    111         Parameter &param = *params[i];
     101        Parameter &param = *targetParms[i];
    112102
    113103        if(Parms[i]){
     
    115105
    116106            NumOpe_GetType(Parms[i],
    117                 (overload_level==OVERLOAD_LEVEL0)? nullParam : param,
     107                (level==OVERLOAD_LEVEL0)? nullParam : param,
    118108                argType);
    119109        }
    120110        else{
    121             argType.SetType( types[i].type, types[i].u.lpIndex );
     111            argType = types[i];
    122112        }
    123113
    124114        if(argType.GetBasicType()!=param.GetBasicType()){
    125             if(overload_level==OVERLOAD_LEVEL1 || overload_level == OVERLOAD_LEVEL0){
    126                 return 0;
    127             }
    128             else if(overload_level==OVERLOAD_LEVEL2){
     115            if(level==OVERLOAD_LEVEL1 || level == OVERLOAD_LEVEL0){
     116                return false;
     117            }
     118            else if(level==OVERLOAD_LEVEL2){
    129119                if(!(
    130120                    IsWholeNumberType(argType.GetBasicType())&&IsWholeNumberType(param.GetBasicType())||
    131121                    IsRealNumberType(argType.GetBasicType())&&IsRealNumberType(param.GetBasicType())
    132                     )) return 0;
    133             }
    134             else if(overload_level==OVERLOAD_LEVEL3){
     122                    )){
     123                        return false;
     124                }
     125            }
     126            else if(level==OVERLOAD_LEVEL3){
    135127                if(argType.GetBasicType()==DEF_OBJECT||param.GetBasicType()==DEF_OBJECT) return 0;
    136128            }
     
    138130        else{
    139131            if(NATURAL_TYPE(argType.GetBasicType())==DEF_OBJECT || NATURAL_TYPE(argType.GetBasicType())==DEF_STRUCT){
    140                 if(argType.GetIndex()!=param.GetIndex()) return 0;
    141             }
    142         }
    143     }
    144 
    145     if(pReturnTypeInfo){
     132                if(argType.GetIndex()!=param.GetIndex()){
     133                    return false;
     134                }
     135            }
     136        }
     137    }
     138
     139    if( !targetResultType.IsNull() ){
    146140        //戻り値も比較対象にする
    147         if(ReturnTypeInfo.type==pReturnTypeInfo->type){
    148             if(NATURAL_TYPE(ReturnTypeInfo.type)==DEF_OBJECT
    149                 || NATURAL_TYPE(ReturnTypeInfo.type)==DEF_STRUCT ){
    150                     if(ReturnTypeInfo.u.lpIndex != pReturnTypeInfo->u.lpIndex) return 0;
    151             }
    152         }
    153         else return 0;
    154     }
    155 
    156     return 1;
    157 }
    158 
    159 SubInfo *ParamImpl::OverloadSolutionWithReturnType( const char *name, std::vector<SubInfo *> &subs ){
     141        if( !returnType.Equals( targetResultType ) ){
     142            return false;
     143        }
     144    }
     145
     146    return true;
     147}
     148
     149UserProc *ParamImpl::OverloadSolutionWithReturnType( const char *name, std::vector<UserProc *> &subs ){
    160150    int sw=0;
    161     SubInfo *psi;
    162     psi=0;
     151    UserProc *pUserProc = NULL;
    163152
    164153    for( int level=OVERLOAD_MIN_LEVEL; level<=OVERLOAD_MAX_LEVEL; level++ ){
    165         foreach( SubInfo *temp_psi, subs ){
    166 
    167             TYPEINFO ReturnTypeInfo;
    168             ReturnTypeInfo.type=temp_psi->ReturnType;
    169             ReturnTypeInfo.u.lpIndex=temp_psi->u.ReturnIndex;
     154        foreach( UserProc *pTempUserProc, subs ){
    170155
    171156            //エラーチェック
    172             if(_overload_check(temp_psi->params,&ReturnTypeInfo,level)){
     157            if(_overload_check( level, pTempUserProc->Params(), pTempUserProc->ReturnType() )){
    173158                if(sw){
    174159                    SetError(52,name,cp);
     
    177162                sw=1;
    178163
    179                 psi = temp_psi;
     164                pUserProc = pTempUserProc;
    180165                break;
    181166            }
     
    190175    }
    191176
    192     return psi;
    193 }
    194 SubInfo *ParamImpl::OverloadSolution( const char *name, std::vector<SubInfo *> &subs ){
     177    return pUserProc;
     178}
     179UserProc *ParamImpl::OverloadSolution( const char *name, std::vector<UserProc *> &subs ){
    195180    int sw=0;
    196     SubInfo *psi;
    197     psi=0;
     181    UserProc *pUserProc;
     182    pUserProc=0;
    198183
    199184    for( int level=OVERLOAD_MIN_LEVEL; level<=OVERLOAD_MAX_LEVEL; level++ ){
    200185
    201         foreach( SubInfo *temp_psi, subs ){
     186        foreach( UserProc *pTempUserProc, subs ){
    202187
    203188            //エラーチェック
    204             if(_overload_check(temp_psi->params,NULL,level)){
     189            if(_overload_check( level, pTempUserProc->Params(), Type() )){
    205190                if(sw){
    206191                    return OverloadSolutionWithReturnType(name,subs);
     
    208193                sw=1;
    209194
    210                 psi = temp_psi;
     195                pUserProc = pTempUserProc;
    211196            }
    212197        }
     
    216201
    217202    if(!sw){
    218         SubInfo *temp_psi;
    219         foreach( temp_psi, subs ){
     203        foreach( UserProc *pTempUserProc, subs ){
    220204
    221205            //エラーチェック
    222             if(temp_psi->params.size()==this->ParmsNum){
     206            if(pTempUserProc->Params().size()==this->ParmsNum){
    223207                if(sw){
    224208                    sw=0;
     
    227211                sw=1;
    228212
    229                 psi=temp_psi;
     213                pUserProc=pTempUserProc;
    230214            }
    231215        }
     
    237221    }
    238222
    239     return psi;
    240 }
    241 
    242 BOOL ParamImpl::ErrorCheck(const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum){
    243     if(ParmsNum>pi_num){
    244         if(ppi[pi_num-1].type!=DEF_ELLIPSE){
    245             //パラメータが多すぎるとき
    246             SetError(10,FuncName,cp);
    247             return 0;
    248         }
    249     }
    250     else if(ParmsNum<pi_num){
    251         if(ParmsNum<SecondParmNum){
    252             if(ppi[ParmsNum].type==DEF_ELLIPSE){
    253                 return 1;
    254             }
    255 
    256             //パラメータが少なすぎるとき
    257             SetError(10,FuncName,cp);
    258             return 0;
    259         }
    260 
    261         //省略パラメータに "0" を指定する
    262         for(;ParmsNum < pi_num;ParmsNum++){
    263             extern HANDLE hHeap;
    264             char temporary[64];
    265             if(ppi[ParmsNum].bByVal) lstrcpy(temporary,"0");
    266             else sprintf(temporary,"%c%c0",1,ESC_BYVAL);
    267             Parms[ParmsNum]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
    268             lstrcpy(Parms[ParmsNum],temporary);
    269         }
    270     }
    271 
    272     return 1;
    273 }
    274 bool ParamImpl::ErrorCheck( const char *procName, const Parameters &params, int SecondParmNum ){
     223    return pUserProc;
     224}
     225
     226bool ParamImpl::ErrorCheck( const string &procName, const Parameters &params, int SecondParmNum ){
     227    if( SecondParmNum == -1 ) SecondParmNum = (int)params.size();
     228
    275229    if(ParmsNum>(int)params.size()){
    276230        if(params[params.size()-1]->GetBasicType()!=DEF_ELLIPSE){
     
    305259}
    306260
    307 void ParamImpl::MacroParameterSupport(PARAMETER_INFO *ppi){
    308     for(int i=0;i<ParmsNum;i++){
    309         if(Parms[i][0]=='\0'){
    310             extern HANDLE hHeap;
    311             char temporary[64];
    312             if(ppi[i].bByVal) lstrcpy(temporary,"0");
    313             else sprintf(temporary,"%c%c0",1,ESC_BYVAL);
    314             HeapDefaultFree(Parms[i]);
    315             Parms[i]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
    316             lstrcpy(Parms[i],temporary);
    317         }
    318     }
    319 }
    320261void ParamImpl::MacroParameterSupport( const Parameters &params ){
    321262    for(int i=0;i<ParmsNum;i++){
  • BasicCompiler_Common/Parameter.h

    r73 r75  
    4646    }
    4747
    48     bool IsRef(){
     48    bool IsRef() const
     49    {
    4950        return isRef;
    5051    }
  • BasicCompiler_Common/Procedure.cpp

    r74 r75  
    11#include "common.h"
    22
    3 SubInfo::SubInfo():
    4   pNextData( NULL )
    5 {
     3bool UserProc::SetParamsAndReturnType( const char *sourceOfParams, int nowLine, bool isStatic ){
     4    int i = 0;
     5    int i2,i3,sw;
     6    char temporary[8192],temp2[VN_SIZE];
     7
     8    //ソースコードの位置
     9    this->codePos = nowLine;
     10
     11    //パラメータ
     12    if(sourceOfParams[i]!='('){
     13        SetError(1,NULL,nowLine);
     14        return 0;
     15    }
     16    i++;
     17    if(sourceOfParams[i]!=')'&& this->pParentClass ){
     18        //クラスのメンバ関数の場合のみ、デストラクタにパラメータがある場合にエラーをだす
     19        if(this->GetName()[0]=='~'){
     20            SetError(114,NULL,nowLine);
     21            i=JumpStringInPare(sourceOfParams,i);
     22        }
     23    }
     24    while(1){
     25        if(sourceOfParams[i]==')') break;
     26
     27        //ByRef
     28        bool isRef;
     29        if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYVAL){
     30            isRef = false;
     31            i+=2;
     32        }
     33        else if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYREF){
     34            isRef = true;
     35            i+=2;
     36        }
     37        else isRef = false;
     38
     39        //パラメータ名
     40        bool isArray = false;
     41        int subScripts[MAX_ARRAYDIM];
     42        char name[VN_SIZE];
     43        sw=0;
     44        for(i2=0;;i++,i2++){
     45            if(sourceOfParams[i]=='('){
     46                if(!sw) sw=1;
     47
     48                i3=GetStringInPare(name+i2,sourceOfParams+i);
     49                i2+=i3-1;
     50                i+=i3-1;
     51                continue;
     52            }
     53            if(sourceOfParams[i]=='['){
     54                if(!sw) sw=1;
     55
     56                i3=GetStringInBracket(name+i2,sourceOfParams+i);
     57                i2+=i3-1;
     58                i+=i3-1;
     59                continue;
     60            }
     61            if(!IsVariableChar(sourceOfParams[i])){
     62                name[i2]=0;
     63                break;
     64            }
     65            name[i2]=sourceOfParams[i];
     66        }
     67        if(sw){
     68            //配列パラメータ
     69            if( isRef == false ) SetError(29,NULL,nowLine);
     70            isArray = true;
     71
     72            if((name[i2-2]=='('&&name[i2-1]==')')||
     73                (name[i2-2]=='['&&name[i2-1]==']')){
     74                subScripts[0]=LONG_MAX;
     75                subScripts[1]=-1;
     76
     77                name[i2-2]=0;
     78            }
     79            else{
     80                GetArrange(name,temp2,subScripts);
     81                lstrcpy(name,temp2);
     82            }
     83
     84            i2=lstrlen(name);
     85        }
     86
     87        //型
     88        Type type( DEF_NON );
     89        if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_AS){
     90            i+=2;
     91
     92            i2=0;
     93            while(sourceOfParams[i]=='*'){
     94                temporary[i2]=sourceOfParams[i];
     95                i++;
     96                i2++;
     97            }
     98            for(;;i++,i2++){
     99                if(!IsVariableChar(sourceOfParams[i])){
     100                    if(sourceOfParams[i]==1&&(sourceOfParams[i+1]==ESC_FUNCTION||sourceOfParams[i+1]==ESC_SUB)){
     101                        temporary[i2++]=sourceOfParams[i++];
     102                        temporary[i2]=sourceOfParams[i];
     103                        continue;
     104                    }
     105                    temporary[i2]=0;
     106                    break;
     107                }
     108                temporary[i2]=sourceOfParams[i];
     109            }
     110
     111            Type::StringToType( temporary, type );
     112
     113            if(temporary[0]=='*'&&
     114                temporary[1]==1&&
     115                (temporary[2]==ESC_FUNCTION||temporary[2]==ESC_SUB)){
     116                if(sourceOfParams[i]!='('){
     117                    SetError(10,temporary,nowLine);
     118                    break;
     119                }
     120                i3=GetStringInPare(temporary+i2,sourceOfParams+i);
     121                i+=i3;
     122                i2+=i3;
     123
     124                if(temporary[2]==ESC_FUNCTION&&sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_AS){
     125                    temporary[i2++]=sourceOfParams[i++];
     126                    temporary[i2++]=sourceOfParams[i++];
     127                    for(;;i++,i2++){
     128                        if(!IsVariableChar(sourceOfParams[i])){
     129                            temporary[i2]=0;
     130                            break;
     131                        }
     132                        temporary[i2]=sourceOfParams[i];
     133                    }
     134                }
     135            }
     136            else{
     137                //TypeDefをする前のベース型を取得
     138                GetOriginalTypeName(temporary);
     139            }
     140
     141            if( type.IsNull() ){
     142                SetError(3,temporary,nowLine);
     143                type.SetBasicType( DEF_PTR_VOID );
     144            }
     145        }
     146        else{
     147            type.SetBasicType( GetTypeFromSimpleName(temporary) );
     148            SetError(-103,temporary,nowLine);
     149        }
     150
     151        if( type.IsProcPtr() ){
     152            //関数ポインタの場合
     153            type.SetIndex( AddProcPtrInfo(temporary+3,temporary[2], nowLine) );
     154        }
     155
     156        Parameter *pParam = new Parameter( name, type, isRef );
     157        if( isArray ){
     158            pParam->SetArray( subScripts );
     159        }
     160
     161        //パラメータを追加
     162        this->params.push_back( pParam );
     163
     164        if(sourceOfParams[i]==','){
     165            i++;
     166            continue;
     167        }
     168        else if(sourceOfParams[i]==')') continue;
     169        else{
     170            SetError(1,NULL,nowLine);
     171            break;
     172        }
     173    }
     174    this->secondParmNum = (int)this->params.size();
     175    i++;
     176    if(sourceOfParams[i]=='('){
     177        i++;
     178        while(1){
     179            if(sourceOfParams[i]==')') break;
     180
     181            //ByRef
     182            bool isRef;
     183            if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYVAL){
     184                isRef = false;
     185                i+=2;
     186            }
     187            else if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYREF){
     188                isRef = true;
     189                i+=2;
     190            }
     191            else isRef = false;
     192
     193            //パラメータ名
     194            bool isArray = false;
     195            int subScripts[MAX_ARRAYDIM];
     196            char name[VN_SIZE];
     197            sw=0;
     198            for(i2=0;;i++,i2++){
     199                if(sourceOfParams[i]=='('){
     200                    if(!sw) sw=1;
     201
     202                    i3=GetStringInPare(name+i2,sourceOfParams+i);
     203                    i2+=i3-1;
     204                    i+=i3-1;
     205                    continue;
     206                }
     207                if(sourceOfParams[i]=='['){
     208                    if(!sw) sw=1;
     209
     210                    i3=GetStringInBracket(name+i2,sourceOfParams+i);
     211                    i2+=i3-1;
     212                    i+=i3-1;
     213                    continue;
     214                }
     215                if(!IsVariableChar(sourceOfParams[i])){
     216                    name[i2]=0;
     217                    break;
     218                }
     219                name[i2]=sourceOfParams[i];
     220            }
     221            if(sw){
     222                //配列パラメータ
     223                if( isRef == false ) SetError(29,NULL,nowLine);
     224                isArray = true;
     225
     226                if((name[i2-2]=='('&&name[i2-1]==')')||
     227                    (name[i2-2]=='['&&name[i2-1]==']')){
     228                    subScripts[0]=LONG_MAX;
     229                    subScripts[1]=-1;
     230
     231                    name[i2-2]=0;
     232                }
     233                else{
     234                    GetArrange(name,temp2,subScripts);
     235                    lstrcpy(name,temp2);
     236                }
     237
     238                i2=lstrlen(name);
     239            }
     240
     241            //型
     242            Type type( DEF_NON );
     243            if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_AS){
     244                i+=2;
     245
     246                i2=0;
     247                while(sourceOfParams[i]=='*'){
     248                    temporary[i2]=sourceOfParams[i];
     249                    i++;
     250                    i2++;
     251                }
     252                for(;;i++,i2++){
     253                    if(!IsVariableChar(sourceOfParams[i])){
     254                        if(sourceOfParams[i]==1&&(sourceOfParams[i+1]==ESC_FUNCTION||sourceOfParams[i+1]==ESC_SUB)){
     255                            temporary[i2++]=sourceOfParams[i++];
     256                            temporary[i2]=sourceOfParams[i];
     257                            continue;
     258                        }
     259                        temporary[i2]=0;
     260                        break;
     261                    }
     262                    temporary[i2]=sourceOfParams[i];
     263                }
     264
     265                Type::StringToType( temporary, type );
     266
     267                if(temporary[0]=='*'&&
     268                    temporary[1]==1&&
     269                    (temporary[2]==ESC_FUNCTION||temporary[2]==ESC_SUB)){
     270                    if(sourceOfParams[i]!='('){
     271                        SetError(10,temporary,nowLine);
     272                        break;
     273                    }
     274                    i3=GetStringInPare(temporary+i2,sourceOfParams+i);
     275                    i+=i3;
     276                    i2+=i3;
     277
     278                    if(temporary[2]==ESC_FUNCTION&&sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_AS){
     279                        temporary[i2++]=sourceOfParams[i++];
     280                        temporary[i2++]=sourceOfParams[i++];
     281                        for(;;i++,i2++){
     282                            if(!IsVariableChar(sourceOfParams[i])){
     283                                temporary[i2]=0;
     284                                break;
     285                            }
     286                            temporary[i2]=sourceOfParams[i];
     287                        }
     288                    }
     289                }
     290                else{
     291                    //TypeDefをする前のベース型を取得
     292                    GetOriginalTypeName(temporary);
     293                }
     294
     295                if( type.IsNull() ){
     296                    SetError(3,temporary,nowLine);
     297                    type.SetBasicType( DEF_PTR_VOID );
     298                }
     299            }
     300            else{
     301                type.SetBasicType( GetTypeFromSimpleName(temporary) );
     302                SetError(-103,temporary,nowLine);
     303            }
     304
     305            if( type.IsProcPtr() ){
     306                //関数ポインタの場合
     307                type.SetIndex( AddProcPtrInfo(temporary+3,temporary[2], nowLine) );
     308            }
     309
     310            Parameter *pParam = new Parameter( name, type, isRef );
     311            if( isArray ){
     312                pParam->SetArray( subScripts );
     313            }
     314
     315            //パラメータを追加
     316            this->params.push_back( pParam );
     317
     318            if(sourceOfParams[i]==','){
     319                i++;
     320                continue;
     321            }
     322            else if(sourceOfParams[i]==')') continue;
     323            else{
     324                SetError(1,NULL,nowLine);
     325                break;
     326            }
     327        }
     328        i++;
     329    }
     330
     331    if(sourceOfParams[i]){
     332        ///////////////////
     333        // 戻り値を取得
     334        ///////////////////
     335
     336        if( !this->IsFunction() ){
     337            // Sub/Macroの場合
     338            SetError(38,this->GetName(),nowLine);
     339        }
     340
     341        if( this->pParentClass ){
     342            if( this->GetName() == this->pParentClass->name ||
     343                this->GetName()[0]=='~'){
     344                //クラスのコンストラクタ、デストラクタがFunction定義の場合はエラーをだす
     345                SetError(115,NULL,nowLine);
     346            }
     347        }
     348
     349
     350        i2=lstrlen(sourceOfParams)-2;
     351
     352        int sw_as=0;
     353        for(;i2>0;i2--){
     354            if(sourceOfParams[i2]==')') break;
     355
     356            if(sourceOfParams[i2]==1&&sourceOfParams[i2+1]==ESC_AS){
     357                i2+=2;
     358                i3=0;
     359                while(sourceOfParams[i2]=='*') temporary[i3++]=sourceOfParams[i2++];
     360                for(;;i2++,i3++){
     361                    if(!IsVariableChar(sourceOfParams[i2])){
     362                        temporary[i3]=0;
     363                        break;
     364                    }
     365                    temporary[i3]=sourceOfParams[i2];
     366                }
     367                Type::StringToType( temporary, this->returnType );
     368                if( this->returnType.IsNull() ) SetError(3,temporary,nowLine);
     369
     370                sw_as=1;
     371                break;
     372            }
     373        }
     374
     375        if(!sw_as){
     376            SetError(-104,this->GetName().c_str(),nowLine);
     377
     378            this->returnType.SetBasicType( DEF_DOUBLE );
     379        }
     380    }
     381    else{
     382        //戻り値なしのSub定義
     383        this->returnType.SetNull();
     384    }
     385
     386    //リアルパラメータ領域を取得(_System_LocalThisを考慮して2つだけ多く確保する場合がある)
     387
     388    if( this->pParentClass && isStatic == false ){
     389        //オブジェクトメンバの場合は、第一パラメータを_System_LocalThis引き渡し用として利用
     390        string name = "_System_LocalThis";
     391        Type type( DEF_PTR_VOID );
     392        this->realParams.push_back( new Parameter( name, type ) );
     393    }
     394
     395    if( this->returnType.IsStruct() ){
     396        //構造体を戻り値として持つ場合
     397        //※第一パラメータ(Thisポインタありの場合は第二パラメータ)を戻り値用の参照宣言にする
     398
     399        string name = this->GetName();
     400        if(name[0]==1&&name[1]==ESC_OPERATOR){
     401            name="_System_ReturnValue";
     402        }
     403        Type type( DEF_STRUCT, this->returnType.GetIndex() );
     404        this->realParams.push_back( new Parameter( name, type, true ) );
     405    }
     406
     407    //パラメータをコピー
     408    foreach( Parameter *pParam, params ){
     409        this->realParams.push_back( new Parameter( *pParam ) );
     410    }
     411
     412    return true;
    6413}
     414
     415bool DllProc::SetParamsAndReturnType( const char *sourceOfParams, int nowLine ){
     416    int i = 0;
     417    int i2,i3,sw;
     418    char temporary[8192],temp2[VN_SIZE];
     419
     420    //ソースコードの位置
     421    this->codePos = nowLine;
     422
     423    //パラメータ
     424    if(sourceOfParams[i]!='('){
     425        SetError(1,NULL,nowLine);
     426        return 0;
     427    }
     428    i++;
     429
     430    while(1){
     431        if(sourceOfParams[i]==')') break;
     432
     433        //ByRef
     434        bool isRef;
     435        if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYVAL){
     436            isRef = false;
     437            i+=2;
     438        }
     439        else if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYREF){
     440            isRef = true;
     441            i+=2;
     442        }
     443        else isRef = false;
     444
     445        //パラメータ名
     446        bool isArray = false;
     447        int subScripts[MAX_ARRAYDIM];
     448        char name[VN_SIZE];
     449        sw=0;
     450        for(i2=0;;i++,i2++){
     451            if(sourceOfParams[i]=='('){
     452                if(!sw) sw=1;
     453
     454                i3=GetStringInPare(name+i2,sourceOfParams+i);
     455                i2+=i3-1;
     456                i+=i3-1;
     457                continue;
     458            }
     459            if(sourceOfParams[i]=='['){
     460                if(!sw) sw=1;
     461
     462                i3=GetStringInBracket(name+i2,sourceOfParams+i);
     463                i2+=i3-1;
     464                i+=i3-1;
     465                continue;
     466            }
     467            if(!IsVariableChar(sourceOfParams[i])){
     468                name[i2]=0;
     469                break;
     470            }
     471            name[i2]=sourceOfParams[i];
     472        }
     473        if(sw){
     474            //配列パラメータ
     475            if( isRef == false ) SetError(29,NULL,nowLine);
     476            isArray = true;
     477
     478            if((name[i2-2]=='('&&name[i2-1]==')')||
     479                (name[i2-2]=='['&&name[i2-1]==']')){
     480                subScripts[0]=LONG_MAX;
     481                subScripts[1]=-1;
     482
     483                name[i2-2]=0;
     484            }
     485            else{
     486                GetArrange(name,temp2,subScripts);
     487                lstrcpy(name,temp2);
     488            }
     489
     490            i2=lstrlen(name);
     491        }
     492
     493        //型
     494        Type type( DEF_NON );
     495        if(lstrcmp(name,"...")==0) type.SetBasicType( DEF_ELLIPSE );
     496        else if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_AS){
     497            i+=2;
     498
     499            i2=0;
     500            while(sourceOfParams[i]=='*'){
     501                temporary[i2]=sourceOfParams[i];
     502                i++;
     503                i2++;
     504            }
     505            for(;;i++,i2++){
     506                if(!IsVariableChar(sourceOfParams[i])){
     507                    if(sourceOfParams[i]==1&&(sourceOfParams[i+1]==ESC_FUNCTION||sourceOfParams[i+1]==ESC_SUB)){
     508                        temporary[i2++]=sourceOfParams[i++];
     509                        temporary[i2]=sourceOfParams[i];
     510                        continue;
     511                    }
     512                    temporary[i2]=0;
     513                    break;
     514                }
     515                temporary[i2]=sourceOfParams[i];
     516            }
     517
     518            Type::StringToType( temporary, type );
     519
     520            if(temporary[0]=='*'&&
     521                temporary[1]==1&&
     522                (temporary[2]==ESC_FUNCTION||temporary[2]==ESC_SUB)){
     523                if(sourceOfParams[i]!='('){
     524                    SetError(10,temporary,nowLine);
     525                    break;
     526                }
     527                i3=GetStringInPare(temporary+i2,sourceOfParams+i);
     528                i+=i3;
     529                i2+=i3;
     530
     531                if(temporary[2]==ESC_FUNCTION&&sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_AS){
     532                    temporary[i2++]=sourceOfParams[i++];
     533                    temporary[i2++]=sourceOfParams[i++];
     534                    for(;;i++,i2++){
     535                        if(!IsVariableChar(sourceOfParams[i])){
     536                            temporary[i2]=0;
     537                            break;
     538                        }
     539                        temporary[i2]=sourceOfParams[i];
     540                    }
     541                }
     542            }
     543            else{
     544                //TypeDefをする前のベース型を取得
     545                GetOriginalTypeName(temporary);
     546            }
     547
     548            if( type.IsNull() ){
     549                SetError(3,temporary,nowLine);
     550                type.SetBasicType( DEF_PTR_VOID );
     551            }
     552        }
     553        else{
     554            type.SetBasicType( GetTypeFromSimpleName(temporary) );
     555            SetError(-103,temporary,nowLine);
     556        }
     557
     558        if( type.IsProcPtr() ){
     559            //関数ポインタの場合
     560            type.SetIndex( AddProcPtrInfo(temporary+3,temporary[2], nowLine ) );
     561        }
     562
     563        Parameter *pParam = new Parameter( name, type, isRef );
     564        if( isArray ){
     565            pParam->SetArray( subScripts );
     566        }
     567
     568        //パラメータを追加
     569        this->params.push_back( pParam );
     570
     571        if(sourceOfParams[i]==','){
     572            i++;
     573            continue;
     574        }
     575        else if(sourceOfParams[i]==')') continue;
     576        else{
     577            SetError(1,NULL,nowLine);
     578            break;
     579        }
     580    }
     581    i++;
     582
     583    if(sourceOfParams[i]){
     584        ///////////////////
     585        // 戻り値を取得
     586        ///////////////////
     587
     588        i2=lstrlen(sourceOfParams)-2;
     589
     590        int sw_as=0;
     591        for(;i2>0;i2--){
     592            if(sourceOfParams[i2]==')') break;
     593
     594            if(sourceOfParams[i2]==1&&sourceOfParams[i2+1]==ESC_AS){
     595                i2+=2;
     596                i3=0;
     597                while(sourceOfParams[i2]=='*') temporary[i3++]=sourceOfParams[i2++];
     598                for(;;i2++,i3++){
     599                    if(!IsVariableChar(sourceOfParams[i2])){
     600                        temporary[i3]=0;
     601                        break;
     602                    }
     603                    temporary[i3]=sourceOfParams[i2];
     604                }
     605                Type::StringToType( temporary, this->returnType );
     606                if( this->returnType.IsNull() ) SetError(3,temporary,nowLine);
     607
     608                sw_as=1;
     609                break;
     610            }
     611        }
     612    }
     613    else{
     614        //戻り値なしのSub定義
     615        this->returnType.SetNull();
     616    }
     617
     618    return true;
     619}
     620
     621bool ProcPointer::SetParamsAndReturnType( const char *sourceOfParams, int nowLine ){
     622    int i = 0;
     623    int i2,i3,sw;
     624    char temporary[8192],temp2[VN_SIZE];
     625
     626    //ソースコードの位置
     627    this->codePos = nowLine;
     628
     629    //パラメータ
     630    if(sourceOfParams[i]!='('){
     631        SetError(1,NULL,nowLine);
     632        return 0;
     633    }
     634    i++;
     635    while(1){
     636        if(sourceOfParams[i]==')') break;
     637
     638        //ByRef
     639        bool isRef;
     640        if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYVAL){
     641            isRef = false;
     642            i+=2;
     643        }
     644        else if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYREF){
     645            isRef = true;
     646            i+=2;
     647        }
     648        else isRef = false;
     649
     650        //パラメータ名
     651        bool isArray = false;
     652        int subScripts[MAX_ARRAYDIM];
     653        char name[VN_SIZE];
     654        sw=0;
     655        for(i2=0;;i++,i2++){
     656            if(sourceOfParams[i]=='('){
     657                if(!sw) sw=1;
     658
     659                i3=GetStringInPare(name+i2,sourceOfParams+i);
     660                i2+=i3-1;
     661                i+=i3-1;
     662                continue;
     663            }
     664            if(sourceOfParams[i]=='['){
     665                if(!sw) sw=1;
     666
     667                i3=GetStringInBracket(name+i2,sourceOfParams+i);
     668                i2+=i3-1;
     669                i+=i3-1;
     670                continue;
     671            }
     672            if(!IsVariableChar(sourceOfParams[i])){
     673                name[i2]=0;
     674                break;
     675            }
     676            name[i2]=sourceOfParams[i];
     677        }
     678        if(sw){
     679            //配列パラメータ
     680            if( isRef == false ) SetError(29,NULL,nowLine);
     681            isArray = true;
     682
     683            if((name[i2-2]=='('&&name[i2-1]==')')||
     684                (name[i2-2]=='['&&name[i2-1]==']')){
     685                subScripts[0]=LONG_MAX;
     686                subScripts[1]=-1;
     687
     688                name[i2-2]=0;
     689            }
     690            else{
     691                GetArrange(name,temp2,subScripts);
     692                lstrcpy(name,temp2);
     693            }
     694
     695            i2=lstrlen(name);
     696        }
     697
     698        //型
     699        Type type( DEF_NON );
     700        if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_AS){
     701            i+=2;
     702
     703            i2=0;
     704            while(sourceOfParams[i]=='*'){
     705                temporary[i2]=sourceOfParams[i];
     706                i++;
     707                i2++;
     708            }
     709            for(;;i++,i2++){
     710                if(!IsVariableChar(sourceOfParams[i])){
     711                    if(sourceOfParams[i]==1&&(sourceOfParams[i+1]==ESC_FUNCTION||sourceOfParams[i+1]==ESC_SUB)){
     712                        temporary[i2++]=sourceOfParams[i++];
     713                        temporary[i2]=sourceOfParams[i];
     714                        continue;
     715                    }
     716                    temporary[i2]=0;
     717                    break;
     718                }
     719                temporary[i2]=sourceOfParams[i];
     720            }
     721
     722            Type::StringToType( temporary, type );
     723
     724            if(temporary[0]=='*'&&
     725                temporary[1]==1&&
     726                (temporary[2]==ESC_FUNCTION||temporary[2]==ESC_SUB)){
     727                if(sourceOfParams[i]!='('){
     728                    SetError(10,temporary,nowLine);
     729                    break;
     730                }
     731                i3=GetStringInPare(temporary+i2,sourceOfParams+i);
     732                i+=i3;
     733                i2+=i3;
     734
     735                if(temporary[2]==ESC_FUNCTION&&sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_AS){
     736                    temporary[i2++]=sourceOfParams[i++];
     737                    temporary[i2++]=sourceOfParams[i++];
     738                    for(;;i++,i2++){
     739                        if(!IsVariableChar(sourceOfParams[i])){
     740                            temporary[i2]=0;
     741                            break;
     742                        }
     743                        temporary[i2]=sourceOfParams[i];
     744                    }
     745                }
     746            }
     747            else{
     748                //TypeDefをする前のベース型を取得
     749                GetOriginalTypeName(temporary);
     750            }
     751
     752            if( type.IsNull() ){
     753                SetError(3,temporary,nowLine);
     754                type.SetBasicType( DEF_PTR_VOID );
     755            }
     756        }
     757        else{
     758            type.SetBasicType( GetTypeFromSimpleName(temporary) );
     759            SetError(-103,temporary,nowLine);
     760        }
     761
     762        if( type.IsProcPtr() ){
     763            //関数ポインタの場合
     764            type.SetIndex( AddProcPtrInfo(temporary+3,temporary[2], nowLine ) );
     765        }
     766
     767        Parameter *pParam = new Parameter( name, type, isRef );
     768        if( isArray ){
     769            pParam->SetArray( subScripts );
     770        }
     771
     772        //パラメータを追加
     773        this->params.push_back( pParam );
     774
     775        if(sourceOfParams[i]==','){
     776            i++;
     777            continue;
     778        }
     779        else if(sourceOfParams[i]==')') continue;
     780        else{
     781            SetError(1,NULL,nowLine);
     782            break;
     783        }
     784    }
     785    i++;
     786
     787    if(sourceOfParams[i]){
     788        ///////////////////
     789        // 戻り値を取得
     790        ///////////////////
     791
     792        i2=lstrlen(sourceOfParams)-2;
     793
     794        int sw_as=0;
     795        for(;i2>0;i2--){
     796            if(sourceOfParams[i2]==')') break;
     797
     798            if(sourceOfParams[i2]==1&&sourceOfParams[i2+1]==ESC_AS){
     799                i2+=2;
     800                i3=0;
     801                while(sourceOfParams[i2]=='*') temporary[i3++]=sourceOfParams[i2++];
     802                for(;;i2++,i3++){
     803                    if(!IsVariableChar(sourceOfParams[i2])){
     804                        temporary[i3]=0;
     805                        break;
     806                    }
     807                    temporary[i3]=sourceOfParams[i2];
     808                }
     809                Type::StringToType( temporary, this->returnType );
     810                if( this->returnType.IsNull() ) SetError(3,temporary,nowLine);
     811
     812                sw_as=1;
     813                break;
     814            }
     815        }
     816    }
     817    else{
     818        //戻り値なしのSub定義
     819        this->returnType.SetNull();
     820    }
     821
     822    //戻り値のエラーチェック
     823    if( IsFunction() ){
     824        // Function定義
     825
     826        if( this->ReturnType().IsNull() ){
     827            // 戻り値がない
     828            SetError(26,this->GetName(),nowLine);
     829        }
     830    }
     831    else{
     832        if( !this->ReturnType().IsNull() ){
     833            // Sub定義なのに、戻り値がある
     834            SetError(38,this->GetName(),nowLine);
     835        }
     836    }
     837
     838    return true;
     839}
     840
     841UserProc *UserProc::pCompilingUserProc = NULL;
  • BasicCompiler_Common/Procedure.h

    r74 r75  
    22struct VARIABLE;
    33
    4 #define SUBTYPE_SUB         1
    5 #define SUBTYPE_FUNCTION    2
    6 #define SUBTYPE_MACRO       3
    7 class SubInfo{
    8 public:
    9     SubInfo();
    10 
    11     DWORD dwType;
    12 
    13     //クラス情報
    14     CClass *pobj_ParentClass;
    15 
     4class Procedure{
     5public:
     6    // 種類
     7    enum Kind{
     8        Sub,
     9        Function,
     10    };
     11
     12private:
     13    const string name;
     14
     15    Kind kind;
     16
     17    bool isCdecl;
     18    bool isUsing;
     19
     20protected:
     21
     22    // パラメータ
     23    Parameters params;
     24
     25    // 戻り値の型
     26    Type returnType;
     27
     28    // ソースコードの位置
     29    int codePos;
     30
     31public:
     32    Procedure( const string &name, Kind kind, bool isCdecl ):
     33      name( name ),
     34      kind( kind ),
     35      isCdecl( isCdecl ),
     36      isUsing( false ),
     37      codePos( -1 )
     38    {}
     39    ~Procedure(){
     40        foreach( Parameter *pParam, params ){
     41            delete pParam;
     42        }
     43    }
     44
     45    const string &GetName() const
     46    {
     47        return name;
     48    }
     49
     50    bool IsSub() const
     51    {
     52        return ( kind == Sub );
     53    }
     54    bool IsFunction() const
     55    {
     56        return ( kind == Function );
     57    }
     58
     59    bool IsCdecl() const
     60    {
     61        return isCdecl;
     62    }
     63    void Using(){
     64        isUsing = true;
     65    }
     66    bool IsUsing() const
     67    {
     68        return isUsing;
     69    }
     70
     71    int GetCodePos() const
     72    {
     73        return codePos;
     74    }
     75
     76    const Parameters &Params() const
     77    {
     78        return params;
     79    }
     80    const Type &ReturnType() const
     81    {
     82        return returnType;
     83    }
     84};
     85
     86class UserProc : public Procedure
     87{
     88
     89private:
     90    bool isMacro;
     91
     92    // パラメータの追加情報
     93    int secondParmNum;
     94    Parameters realParams;
     95    int realSecondParmNum;
     96
     97    // 親クラスと対応するメソッド
     98    CClass *pParentClass;
     99    CMethod *pMethod;
     100
     101    // 各種フラグ
     102    bool isExport;
     103    bool isSystem;
     104    bool isCompiled;
     105
     106public:
     107    // ハッシュリスト用
     108    UserProc *pNextData;
     109
     110    UserProc( const string &name, Kind kind, bool isMacro, bool isCdecl, bool isExport ):
     111      Procedure( name, kind, isCdecl ),
     112      isMacro( isMacro ),
     113      pParentClass( NULL ),
     114      pMethod( NULL ),
     115      isExport( isExport ),
     116      isSystem( false ),
     117      isCompiled( false ),
     118      pNextData( NULL )
     119    {
     120    }
     121    ~UserProc(){
     122        foreach( Parameter *pParam, realParams ){
     123            delete pParam;
     124        }
     125    }
     126
     127    bool IsMacro() const
     128    {
     129        return isMacro;
     130    }
     131
     132    virtual bool SetParamsAndReturnType( const char *sourceOfParams, int nowLine, bool isStatic );
     133
     134    int GetSecondParmNum() const
     135    {
     136        return secondParmNum;
     137    }
     138    const Parameters &RealParams() const
     139    {
     140        return realParams;
     141    }
     142    int GetRealSecondParmNum() const
     143    {
     144        return realSecondParmNum;
     145    }
     146
     147    void SetParentClass( CClass *pParentClass ){
     148        this->pParentClass = pParentClass;
     149    }
     150    CClass *GetParentClassPtr()
     151    {
     152        return pParentClass;
     153    }
     154    const CClass &GetParentClass() const
     155    {
     156        return *pParentClass;
     157    }
     158    void SetMethod( CMethod *pMethod ){
     159        this->pMethod = pMethod;
     160    }
     161
     162    void ExportOff(){
     163        isExport = false;
     164    }
     165    bool IsExport() const
     166    {
     167        return isExport;
     168    }
     169    void ThisIsSystemProc(){
     170        isSystem = true;
     171    }
     172    bool IsSystem() const
     173    {
     174        return isSystem;
     175    }
     176    void CompleteCompile(){
     177        isCompiled = true;
     178    }
     179    void KillCompileStatus(){
     180        isCompiled = false;
     181    }
     182    bool IsCompiled() const
     183    {
     184        return isCompiled;
     185    }
     186    bool IsDestructor() const
     187    {
     188        return ( GetName()[0] == '~' );
     189    }
     190    bool IsVirtual() const
     191    {
     192        if( pMethod == NULL ){
     193            return false;
     194        }
     195        return ( pMethod->bVirtual != 0 );
     196    }
     197
     198
     199    // バイナリコードの位置
     200    DWORD beginOpAddress;
     201    DWORD endOpAddress;
     202
     203    // ローカル変数
     204    Variables localVars;
     205
     206    // TODO: 適切なコードへ直す
    16207    long id;
    17208
    18     char *name;
    19     long address;
    20 
    21     //パラメータ
    22     Parameters params;
    23     int SecondParmNum;
    24     Parameters realParams;
    25     int RealSecondParmNum;
    26 
    27     //戻り値
    28     int ReturnType;
    29     union{
    30         LONG_PTR ReturnIndex;
    31         CClass *Return_pobj_c;
    32     }u;
    33     bool isReturnRef;
    34 
    35     DWORD CompileAddress;
    36     DWORD EndOpAddr;
    37     VARIABLE *pVar;
    38     int VarNum;
    39 
    40     BOOL bExport;
    41     BOOL bCdecl;
    42     BOOL bVirtual;
    43     BOOL bUse;
    44     BOOL bCompile;
    45     BOOL bSystem;
    46 
    47     SubInfo *pNextData;
    48 };
     209
     210    /////////////////////////////////////////////////////////////////
     211    // コンパイル中の関数を管理
     212    /////////////////////////////////////////////////////////////////
     213private:
     214    static UserProc *pCompilingUserProc;
     215public:
     216    static void CompileStartForGlobalArea(){
     217        pCompilingUserProc = NULL;
     218    }
     219    static void CompileStartForUserProc( UserProc *pUserProc ){
     220        pCompilingUserProc = pUserProc;
     221    }
     222    static bool IsGlobalAreaCompiling(){
     223        return ( pCompilingUserProc == NULL );
     224    }
     225    static bool IsLocalAreaCompiling(){
     226        return ( pCompilingUserProc != NULL );
     227    }
     228    static UserProc &CompilingUserProc(){
     229        return *pCompilingUserProc;
     230    }
     231};
     232
     233class DllProc : public Procedure
     234{
     235    const string dllFileName;
     236    const string alias;
     237    int lookupAddress;
     238
     239public:
     240    // ハッシュリスト用
     241    DllProc *pNextData;
     242
     243    DllProc( const string &name, Kind kind, bool isCdecl, const string &dllFileName, const string &alias ):
     244      Procedure( name, kind, isCdecl ),
     245      dllFileName( dllFileName ),
     246      alias( alias ),
     247      lookupAddress( 0 ),
     248      pNextData( NULL )
     249    {
     250    }
     251    ~DllProc(){}
     252
     253    virtual bool SetParamsAndReturnType( const char *sourceOfParams, int nowLine );
     254
     255    const string &GetDllFileName() const
     256    {
     257        return dllFileName;
     258    }
     259    const string &GetAlias() const
     260    {
     261        return alias;
     262    }
     263
     264    void SetLookupAddress( int lookupAddress ){
     265        this->lookupAddress = lookupAddress;
     266    }
     267    int GetLookupAddress() const
     268    {
     269        return lookupAddress;
     270    }
     271
     272};
     273
     274class ProcPointer : public Procedure
     275{
     276public:
     277    ProcPointer( Kind kind ):
     278      Procedure( "", kind, false )
     279    {
     280    }
     281    ~ProcPointer(){}
     282
     283    virtual bool SetParamsAndReturnType( const char *sourceOfParams, int nowLine );
     284};
  • BasicCompiler_Common/Resource.cpp

    r4 r75  
    5050
    5151        _int64 i64data;
    52         int type;
    53         type=StaticCalculation(true, temporary,0,&i64data,0);
    54         if(IsRealNumberType(type)){
     52        Type resultType;
     53        if( !StaticCalculation(true, temporary,0,&i64data,resultType) ){
     54            return;
     55        }
     56        if(resultType.IsReal()){
    5557            SetError(9,temporary,0);
    5658            return;
  • BasicCompiler_Common/Subroutine.cpp

    r73 r75  
    66#include "../BasicCompiler32/opcode.h"
    77#endif
    8 
    9 //コンパイル中の関数情報
    10 SubInfo *pCompilingSubInfo;
    118
    129int GetCallProcName(char *buffer,char *name){
     
    5653
    5754    //関数ポインタ
    58     int type;
    59     LONG_PTR lpIndex;
    60     type=GetVarType(name,&lpIndex,0);
    61     if(type==DEF_PTR_PROC) return PROC_PTR;
     55    Type type;
     56    if( !GetVarType( name, type, false ) ){
     57        return 0;
     58    }
     59    if( type.IsProcPtr() ){
     60        return PROC_PTR;
     61    }
    6262
    6363    return 0;
     
    105105}
    106106
    107 
    108 int CallProc(int idProc,void *pInfo,char *name,char *Parameter,LONG_PTR *plpRetIndex){
    109     int ret_type;
    110 
    111     if(idProc==PROC_DEFAULT){
     107bool CallProc( int kind, const void *pProc, const char *fullCallName, const char *lpszParms, Type &resultType, bool isCallOn ){
     108
     109    //GetSubHash内でエラー提示が行われた場合
     110    if(pProc==(Procedure *)-1){
     111        return false;
     112    }
     113
     114    if(kind==PROC_DEFAULT){
    112115        /////////////////////
    113116        // ユーザー定義関数
    114117        /////////////////////
    115118
    116         SubInfo *pSub;
    117         pSub=(SubInfo *)pInfo;
    118 
    119         //GetSubHash内でエラー提示が行われた場合
    120         if(pSub==(SubInfo *)-1) return -1;
    121 
     119        UserProc *pUserProc = (UserProc *)pProc;
    122120
    123121        //オブジェクト名を取得
    124122        char ObjectName[VN_SIZE];
    125123        int RefType;
    126         SplitObjectName(name,ObjectName,&RefType);
     124        SplitObjectName(fullCallName,ObjectName,&RefType);
    127125
    128126
     
    131129        ////////////////////////
    132130
    133         std::vector<SubInfo *> subs;
    134         GetOverloadSubHash(name,subs);
     131        std::vector<UserProc *> subs;
     132        GetOverloadSubHash(fullCallName,subs);
    135133        if(subs.size()){
    136134            //オーバーロードを解決
    137             pSub=OverloadSolutionWithStrParam(name,subs,Parameter,ObjectName,NULL);
    138 
    139             if(!pSub) return 0;
    140         }
    141 
    142 
    143         Opcode_CallProc(Parameter,pSub,0,ObjectName,RefType);
    144         if( plpRetIndex ){
    145             *plpRetIndex = pSub->u.ReturnIndex;
    146         }
    147         return pSub->ReturnType;
    148     }
    149     else if(idProc==PROC_DLL){
     135            pUserProc=OverloadSolutionWithStrParam(fullCallName,subs,lpszParms,ObjectName);
     136
     137            if(!pUserProc){
     138                return false;
     139            }
     140        }
     141
     142        resultType = pUserProc->ReturnType();
     143
     144        if( isCallOn ){
     145            if( !Opcode_CallProc(lpszParms,pUserProc,0,ObjectName,RefType) ){
     146                return false;
     147            }
     148        }
     149    }
     150    else if(kind==PROC_DLL){
    150151        /////////////////////////
    151152        // DLL関数
    152153        /////////////////////////
    153         DECLAREINFO *pdi;
    154         pdi=(DECLAREINFO *)pInfo;
    155 
    156         ret_type=Opcode_CallDllProc(Parameter,pdi,plpRetIndex);
    157     }
    158     else if(idProc==PROC_BUILTIN){
     154        DllProc *pDllProc = (DllProc *)pProc;
     155
     156        resultType = pDllProc->ReturnType();
     157
     158        if( isCallOn ){
     159            if( !Opcode_CallDllProc(lpszParms,pDllProc) ){
     160                return false;
     161            }
     162        }
     163    }
     164    else if(kind==PROC_BUILTIN){
    159165        /////////////////////////
    160166        // 組み込み関数
    161167        /////////////////////////
    162         int FuncId;
    163         FuncId=(int)(_int64)pInfo;
    164 
    165         TYPEINFO ReturnTypeInfo = { DEF_LONG, NULL };
    166         Opcode_CallFunc( Parameter, FuncId, ReturnTypeInfo );
    167         if( plpRetIndex ){
    168             *plpRetIndex = ReturnTypeInfo.u.lpIndex;
    169         }
    170         return ReturnTypeInfo.type;
    171     }
    172     else if(idProc==PROC_PTR){
     168        int FuncId = (int)(_int64)pProc;
     169
     170        if( !Opcode_CallFunc( lpszParms, FuncId, resultType, isCallOn ) ){
     171            return false;
     172        }
     173    }
     174    else if(kind==PROC_PTR){
    173175        /////////////////
    174176        // 関数ポインタ
    175177        /////////////////
    176178
    177         LONG_PTR lpIndex;
    178         GetVarType(name,&lpIndex,0);
    179 
    180         extern PROCPTRINFO *pProcPtrInfo;
    181         ret_type=Opcode_CallProcPtr(name,Parameter,&pProcPtrInfo[lpIndex],plpRetIndex);
    182     }
    183 
    184     return ret_type;
    185 }
    186 BOOL CallPropertyMethod(char *variable,char *RightSide,TYPEINFO *pRetTypeInfo){
     179        Type type;
     180        GetVarType(fullCallName,type,false);
     181
     182        extern ProcPointer **ppProcPointer;
     183        ProcPointer *pProcPtr = ppProcPointer[type.GetIndex()];
     184        resultType = pProcPtr->ReturnType();
     185
     186        if( isCallOn ){
     187            if( !Opcode_CallProcPtr(fullCallName,lpszParms,pProcPtr) ){
     188                return false;
     189            }
     190        }
     191    }
     192    else{
     193        return false;
     194    }
     195
     196    return true;
     197}
     198bool CallPropertyMethod( const char *variable, const char *rightSide, Type &resultType){
    187199    //プロパティ用のメソッドを呼び出す
    188200
     
    197209
    198210    //オーバーロード用の関数リストを作成
    199     std::vector<SubInfo *> subs;
     211    std::vector<UserProc *> subs;
    200212    GetOverloadSubHash(VarName,subs);
    201213    if(subs.size()==0){
    202         return 0;
     214        return false;
    203215    }
    204216
    205217    //パラメータを整備
    206218    char *Parameter;
    207     Parameter=(char *)HeapAlloc(hHeap,0,lstrlen(ArrayElements)+lstrlen(RightSide)+32);
     219    Parameter=(char *)HeapAlloc(hHeap,0,lstrlen(ArrayElements)+lstrlen(rightSide)+32);
    208220    lstrcpy(Parameter,ArrayElements);
    209     if(RightSide){
    210         if(Parameter[0]&&RightSide[0]) lstrcat(Parameter,",");
    211         lstrcat(Parameter,RightSide);
     221    if(rightSide){
     222        if(Parameter[0]&&rightSide[0]) lstrcat(Parameter,",");
     223        lstrcat(Parameter,rightSide);
    212224    }
    213225
    214226    //オーバーロードを解決
    215     SubInfo *pSub;
    216     pSub=OverloadSolutionWithStrParam(VarName,subs,Parameter,ObjectName,NULL);
    217 
    218     if(pSub){
     227    UserProc *pUserProc;
     228    pUserProc=OverloadSolutionWithStrParam(VarName,subs,Parameter,ObjectName);
     229
     230    if(pUserProc){
    219231        //呼び出し
    220         Opcode_CallProc(Parameter,pSub,0,ObjectName,RefType);
    221 
    222         if( pRetTypeInfo ){
    223             pRetTypeInfo->type = pSub->ReturnType;
    224             pRetTypeInfo->u.lpIndex = pSub->u.ReturnIndex;
    225         }
     232        Opcode_CallProc(Parameter,pUserProc,0,ObjectName,RefType);
     233
     234        resultType = pUserProc->ReturnType();
    226235    }
    227236
    228237    HeapDefaultFree(Parameter);
    229238
    230     return 1;
    231 }
    232 
    233 
    234 int GetReturnTypeOfProc(int idProc,void *pInfo,char *name,char *Parameter,LONG_PTR *plpRetIndex){
    235     int ret_type;
    236 
    237     if(idProc==PROC_DEFAULT){
    238         /////////////////////
    239         // ユーザー定義関数
    240         /////////////////////
    241 
    242         SubInfo *pSub;
    243         pSub=(SubInfo *)pInfo;
    244 
    245         //GetSubHash内でエラー提示が行われた場合
    246         if(pSub==(SubInfo *)-1) return -1;
    247 
    248 
    249         //オブジェクト名を取得
    250         char ObjectName[VN_SIZE];
    251         int RefType;
    252         SplitObjectName(name,ObjectName,&RefType);
    253 
    254 
    255         ////////////////////////
    256         // オーバーロードを解決
    257         ////////////////////////
    258 
    259         std::vector<SubInfo *> subs;
    260         GetOverloadSubHash(name,subs);
    261         if( subs.size() > 0 ){
    262             //オーバーロードを解決
    263             pSub=OverloadSolutionWithStrParam(name,subs,Parameter,ObjectName,NULL);
    264 
    265             if(!pSub) return 0;
    266         }
    267 
    268 
    269         ret_type=pSub->ReturnType;
    270         *plpRetIndex=pSub->u.ReturnIndex;
    271     }
    272     else if(idProc==PROC_DLL){
    273         /////////////////////////
    274         // DLL関数
    275         /////////////////////////
    276         DECLAREINFO *pdi;
    277         pdi=(DECLAREINFO *)pInfo;
    278 
    279         ret_type=pdi->ReturnType;
    280         *plpRetIndex=pdi->u.ReturnIndex;
    281     }
    282     else if(idProc==PROC_BUILTIN){
    283         /////////////////////////
    284         // 組み込み関数
    285         /////////////////////////
    286         int FuncId;
    287         FuncId=(int)(_int64)pInfo;
    288 
    289         ret_type=GetFunctionType(FuncId);
    290         *plpRetIndex=-1;
    291     }
    292     else if(idProc==PROC_PTR){
    293         /////////////////
    294         // 関数ポインタ
    295         /////////////////
    296 
    297         LONG_PTR lpIndex;
    298         GetVarType(name,&lpIndex,0);
    299 
    300         extern PROCPTRINFO *pProcPtrInfo;
    301         ret_type=pProcPtrInfo[lpIndex].ReturnType;
    302         *plpRetIndex=pProcPtrInfo[lpIndex].u.ReturnIndex;
    303     }
    304 
    305     return ret_type;
    306 }
    307 BOOL GetReturnTypeOfPropertyMethod(char *variable,char *RightSide,TYPEINFO *pRetTypeInfo){
     239    return true;
     240}
     241
     242bool GetReturnTypeOfPropertyMethod( const char *variable, const char *rightSide, Type &resultType ){
    308243    //プロパティ用のメソッドを呼び出す
    309244
     
    318253
    319254    //オーバーロード用の関数リストを作成
    320     std::vector<SubInfo *> subs;
     255    std::vector<UserProc *> subs;
    321256    GetOverloadSubHash(VarName,subs);
    322257    if(subs.size()==0){
     
    326261    //パラメータを整備
    327262    char *Parameter;
    328     Parameter=(char *)HeapAlloc(hHeap,0,lstrlen(ArrayElements)+lstrlen(RightSide)+32);
     263    Parameter=(char *)HeapAlloc(hHeap,0,lstrlen(ArrayElements)+lstrlen(rightSide)+32);
    329264    lstrcpy(Parameter,ArrayElements);
    330     if(RightSide){
    331         if(Parameter[0]&&RightSide[0]) lstrcat(Parameter,",");
    332         lstrcat(Parameter,RightSide);
     265    if(rightSide){
     266        if(Parameter[0]&&rightSide[0]) lstrcat(Parameter,",");
     267        lstrcat(Parameter,rightSide);
    333268    }
    334269
    335270    //オーバーロードを解決
    336     SubInfo *pSub;
    337     pSub=OverloadSolutionWithStrParam(VarName,subs,Parameter,ObjectName,NULL);
    338 
    339     if(pSub){
    340         if(pRetTypeInfo){
    341             pRetTypeInfo->type=pSub->ReturnType;
    342             pRetTypeInfo->u.lpIndex=pSub->u.ReturnIndex;
    343         }
     271    UserProc *pUserProc;
     272    pUserProc=OverloadSolutionWithStrParam(VarName,subs,Parameter,ObjectName);
     273
     274    if(pUserProc){
     275        resultType = pUserProc->ReturnType();
    344276    }
    345277
     
    348280
    349281//インデクサ(getter)の戻り値を取得
    350 bool GetReturnTypeOfIndexerGetterProc(CClass *pobj_Class,TYPEINFO &RetTypeInfo){
    351     std::vector<SubInfo *> subs;
    352     pobj_Class->EnumMethod( CALC_ARRAY_GET, subs );
     282bool GetReturnTypeOfIndexerGetterProc( const CClass &objClass, Type &resultType ){
     283    std::vector<UserProc *> subs;
     284    objClass.EnumMethod( CALC_ARRAY_GET, subs );
    353285    if( subs.size() == 0 ){
    354286        return false;
    355287    }
    356288
    357     RetTypeInfo.type = subs[0]->ReturnType;
    358     RetTypeInfo.u.lpIndex = subs[0]->u.ReturnIndex;
     289    resultType = subs[0]->ReturnType();
    359290
    360291    return true;
     
    362293
    363294
    364 void AddDeclareData(char *buffer,int NowLine){
     295void AddDeclareData(char *buffer,int nowLine){
    365296    extern HANDLE hHeap;
    366     int i,i2,i3,i4,sw,IsFunction;
    367     char temporary[VN_SIZE];
    368 
    369     i=0;
    370 
    371     DWORD dwType;
    372     BOOL bCdecl=0;
    373 
    374     //Static/Dynamic
    375     if(buffer[i]==ESC_STATIC){
    376         dwType=DECLARE_STATIC;
    377         i++;
    378     }
    379     else dwType=DECLARE_DYNAMIC;
     297    int i2;
     298
     299    int i=0;
    380300
    381301    //Sub/Function
    382     if(buffer[i]==ESC_SUB) IsFunction=0;
    383     else if(buffer[i]==ESC_FUNCTION) IsFunction=1;
     302    Procedure::Kind kind = Procedure::Sub;
     303    if(buffer[i]==ESC_SUB){
     304    }
     305    else if(buffer[i]==ESC_FUNCTION){
     306        kind = Procedure::Function;
     307    }
    384308    else{
    385         SetError(1,NULL,NowLine);
     309        SetError(1,NULL,nowLine);
    386310        return;
    387311    }
     
    389313
    390314    //プロシージャ名
     315    char procName[VN_SIZE];
     316    bool isCdecl = false;
    391317    for(i2=0;;i++,i2++){
    392318        if(buffer[i]==1&&buffer[i+1]==ESC_CDECL){
    393             bCdecl=1;
     319            isCdecl = true;
    394320
    395321            i+=2;
    396             temporary[i2]=0;
     322            procName[i2]=0;
    397323            break;
    398324        }
    399325        if(buffer[i]==','){
    400             temporary[i2]=0;
     326            procName[i2]=0;
    401327            break;
    402328        }
    403329        if(buffer[i]=='\0'){
    404             SetError(1,NULL,NowLine);
     330            SetError(1,NULL,nowLine);
    405331            return;
    406332        }
    407         temporary[i2]=buffer[i];
    408     }
     333        procName[i2]=buffer[i];
     334    }
     335    i++;
    409336
    410337    //ユーザー定義関数との重複チェック
    411     if(GetSubHash(temporary)){
    412         SetError(15,temporary,NowLine);
     338    if(GetSubHash(procName)){
     339        SetError(15,procName,nowLine);
    413340        return;
    414341    }
    415342
    416343
     344    //ライブラリ
     345    char dllFileName[MAX_PATH];
     346    i = GetOneParameter( buffer, i, dllFileName );
     347    Type resultType;
     348    _int64 i64data;
     349    if( !StaticCalculation( true, dllFileName, 0, &i64data, resultType ) ){
     350        return;
     351    }
     352    if( resultType.GetBasicType() != typeOfPtrChar ){
     353        SetError(1,NULL,nowLine);
     354        return;
     355    }
     356    lstrcpy( dllFileName, (char *)i64data );
     357    CharUpper(dllFileName);
     358    if(!strstr(dllFileName,".")){
     359        lstrcat(dllFileName,".DLL");
     360        if(lstrlen(dllFileName)>=16){
     361            SetError(7,NULL,nowLine);
     362            return;
     363        }
     364    }
     365
     366    //エイリアス
     367    char alias[VN_SIZE];
     368    i = GetOneParameter( buffer, i, alias );
     369    if( alias[0] ){
     370        if( !StaticCalculation( true, alias, 0, &i64data, resultType ) ){
     371            return;
     372        }
     373        if( resultType.GetBasicType() != typeOfPtrChar ){
     374            SetError(1,NULL,nowLine);
     375            return;
     376        }
     377        lstrcpy( alias, (char *)i64data );
     378    }
     379    else{
     380        //省略されたときは関数名
     381        lstrcpy( alias, procName );
     382    }
     383
     384
     385    // オブジェクトを生成
     386    DllProc *pDllProc = new DllProc( procName, kind, isCdecl, dllFileName, alias );
     387
     388    // パラメータを解析
     389    // ※第1パラメータにに指定するデータの例:"( s As String ) As String"
     390    pDllProc->SetParamsAndReturnType( buffer + i, nowLine );
     391
     392    // パラメータのエラーチェック
     393    foreach( const Parameter *pParam, pDllProc->Params() ){
     394        if( pParam->IsObject() ){
     395            SetError(25,pParam->GetVarName(),nowLine);
     396        }
     397        if( !pParam->IsRef() ){
     398            if( pParam->IsStruct() ){
     399                SetError(28,pParam->GetVarName(),nowLine);
     400            }
     401        }
     402    }
     403
     404    //戻り値のエラーチェック
     405    if( pDllProc->IsFunction() ){
     406        // Function定義
     407
     408        if( pDllProc->ReturnType().IsObject() ){
     409            // DLL関数ではオブジェクトを戻り値にできない
     410            SetError(40,pDllProc->GetName(),nowLine);
     411        }
     412    }
     413
     414
    417415    /////////////////////////////////
    418     // 格納位置を計算してpciにセット
     416    // 格納位置を計算してppDeclareHashにセット
    419417    /////////////////////////////////
    420418
    421419    //ハッシュ値を取得
    422420    int key;
    423     key=hash_default(temporary);
    424 
    425     extern DECLAREINFO **ppDeclareHash;
    426     DECLAREINFO *pdi;
     421    key=hash_default(procName);
     422
     423    extern DllProc **ppDeclareHash;
    427424    if(ppDeclareHash[key]){
    428         pdi=ppDeclareHash[key];
     425        DllProc *pTempProc;
     426        pTempProc=ppDeclareHash[key];
    429427        while(1){
    430             if(lstrcmpi(pdi->name,temporary)==0){
     428            if( pDllProc->GetName() == pTempProc->GetName() ){
    431429                //重複エラー
    432                 SetError(15,temporary,NowLine);
     430                SetError(15,procName,nowLine);
    433431                return;
    434432            }
    435433
    436             if(pdi->pNextData==0){
    437                 pdi->pNextData=(DECLAREINFO *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,sizeof(DECLAREINFO));
     434            if(pTempProc->pNextData==0){
     435                pTempProc->pNextData=pDllProc;
    438436                break;
    439437            }
    440             pdi=pdi->pNextData;
    441         }
    442         pdi=pdi->pNextData;
     438            pTempProc=pTempProc->pNextData;
     439        }
     440        pTempProc=pTempProc->pNextData;
    443441    }
    444442    else{
    445         ppDeclareHash[key]=(DECLAREINFO *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,sizeof(DECLAREINFO));
    446         pdi=ppDeclareHash[key];
    447     }
    448 
    449     pdi->dwType=dwType;
    450     pdi->bCdecl=bCdecl;
    451 
    452     pdi->name=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
    453     lstrcpy(pdi->name,temporary);
     443        ppDeclareHash[key]=pDllProc;
     444    }
     445}
     446
     447UserProc *AddSubData(char *buffer,int nowLine,BOOL bVirtual,CClass *pobj_c, bool isStatic){
     448    int i2,i3;
     449    char temporary[8192];
     450
     451    int i=1;
     452
     453    UserProc::Kind kind = Procedure::Sub;
     454    bool isMacro = false;
     455    if(buffer[i]==ESC_FUNCTION) kind = Procedure::Function;
     456    if(buffer[i]==ESC_MACRO){
     457        isMacro = true;
     458    }
     459
    454460    i++;
    455461
    456     //ライブラリ
    457     i = GetOneParameter( buffer, i, temporary );
    458     int type;
    459     LONG_PTR lpIndex;
    460     _int64 i64data;
    461     type = StaticCalculation( true, temporary, 0, &i64data, &lpIndex );
    462     if( type != typeOfPtrChar ){
    463         SetError(1,NULL,NowLine);
    464         return;
    465     }
    466     lstrcpy( temporary, (char *)i64data );
    467     CharUpper(temporary);
    468     if(!strstr(temporary,".")){
    469         if(pdi->dwType==DECLARE_STATIC) lstrcat(temporary,".LIB");
    470         else{
    471             lstrcat(temporary,".DLL");
    472             if(lstrlen(temporary)>=16){
    473                 SetError(7,NULL,NowLine);
    474                 return;
    475             }
    476         }
    477     }
    478     pdi->file=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
    479     lstrcpy(pdi->file,temporary);
    480 
    481     //エイリアス
    482     i = GetOneParameter( buffer, i, temporary );
    483     if( temporary[0] ){
    484         type = StaticCalculation( true, temporary, 0, &i64data, &lpIndex );
    485         if( type != typeOfPtrChar ){
    486             SetError(1,NULL,NowLine);
    487             return;
    488         }
    489         lstrcpy( temporary, (char *)i64data );
    490 
    491         pdi->alias=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
    492         lstrcpy(pdi->alias,temporary);
    493     }
    494     else{
    495         //省略されたときは関数名
    496         pdi->alias=(char *)HeapAlloc(hHeap,0,lstrlen(pdi->name)+1);
    497         lstrcpy(pdi->alias,pdi->name);
    498     }
    499 
    500     //パラメータの始めのカッコ
    501     if(buffer[i]!='('){
    502         SetError(1,NULL,NowLine);
    503         return;
    504     }
    505     i++;
    506 
    507     pdi->pParmInfo=(PARAMETER_INFO *)HeapAlloc(hHeap,0,1);
    508 
    509     //各パラメータ
    510     for(i3=0;;i3++){
    511         if(buffer[i]==')') break;
    512 
    513         pdi->pParmInfo=(PARAMETER_INFO *)HeapReAlloc(hHeap,0,pdi->pParmInfo,(i3+1)*sizeof(PARAMETER_INFO));
    514 
    515         //ByVal
    516         if(buffer[i]==1&&buffer[i+1]==ESC_BYVAL){
    517             pdi->pParmInfo[i3].bByVal=1;
     462    bool isCdecl = false;
     463    bool isExport = false;
     464    while(1){
     465        if(buffer[i]==1&&buffer[i+1]==ESC_CDECL&& isCdecl == false ){
     466            isCdecl = true;
     467
    518468            i+=2;
    519469        }
    520         else if(buffer[i]==1&&buffer[i+1]==ESC_BYREF){
    521             pdi->pParmInfo[i3].bByVal=0;
    522             i+=2;
    523         }
    524         else pdi->pParmInfo[i3].bByVal=1;
    525 
    526         //変数名は無視(temporaryの変数名は型宣言文字判断のため)
    527         sw=0;
    528         for(i2=0;;i++,i2++){
    529             if(buffer[i]=='('){
    530                 if(!sw) sw=1;
    531 
    532                 i4=GetStringInPare(temporary+i2,buffer+i);
    533                 i2+=i4-1;
    534                 i+=i4-1;
    535                 continue;
    536             }
    537             if(buffer[i]=='['){
    538                 if(!sw) sw=1;
    539 
    540                 i4=GetStringInBracket(temporary+i2,buffer+i);
    541                 i2+=i4-1;
    542                 i+=i4-1;
    543                 continue;
    544             }
    545             if(!IsVariableChar(buffer[i])){
    546                 temporary[i2]=0;
    547                 break;
    548             }
    549             temporary[i2]=buffer[i];
    550         }
    551         if(lstrcmp(temporary,"...")==0) pdi->pParmInfo[i3].type=DEF_ELLIPSE;
    552         else{
    553             //型
    554             if(buffer[i]==1&&buffer[i+1]==ESC_AS){
    555                 i+=2;
    556                 for(i2=0;;i++,i2++){
    557                     if(!(IsVariableChar(buffer[i])||buffer[i]=='*')){
    558                         temporary[i2]=0;
    559                         break;
    560                     }
    561                     temporary[i2]=buffer[i];
    562                 }
    563                 pdi->pParmInfo[i3].type=GetTypeFixed(temporary,&pdi->pParmInfo[i3].u.index);
    564             }
    565             else{
    566                 pdi->pParmInfo[i3].type=GetTypeFromSimpleName(temporary);
    567                 SetError(-103,temporary,NowLine);
    568             }
    569 
    570             if(sw){
    571                 //配列ポインタを引き渡すとき
    572                 pdi->pParmInfo[i3].type=GetPtrType(pdi->pParmInfo[i3].type,pdi->pParmInfo[i3].u.index);
    573             }
    574         }
    575 
    576         //名前はダミー(使用しないため)
    577         pdi->pParmInfo[i3].name="";
    578 
    579         //構造体の場合はエラーチェック
    580         if(pdi->pParmInfo[i3].type==-1) SetError(3,temporary,NowLine);
    581         if(pdi->pParmInfo[i3].type==DEF_OBJECT){
    582             if(pdi->pParmInfo[i3].bByVal) pdi->pParmInfo[i3].type=DEF_LONG;//SetError(28,temporary,NowLine);
    583         }
    584 
    585         //構造体アドレスの空白部
    586         while(buffer[i]==' ') i++;
    587 
    588         if(buffer[i]==','){
    589             i++;
    590             continue;
    591         }
    592         else if(buffer[i]==')') continue;
    593         else{
    594             SetError(1,NULL,NowLine);
    595             break;
    596         }
    597     }
    598     pdi->ParmNum=i3;
    599 
    600     //戻り値
    601     i++;
    602     if(buffer[i]==1&&buffer[i+1]==ESC_AS){
    603         if(IsFunction==0) SetError(1,NULL,NowLine);
    604         i+=2;
    605         pdi->ReturnType=GetTypeFixed(buffer+i,&pdi->u.ReturnIndex);
    606         if(pdi->ReturnType==DEF_NON) SetError(3,buffer+i,NowLine);
    607         if(pdi->ReturnType==DEF_OBJECT) SetError(40,NULL,NowLine);
    608     }
    609     else if(buffer[i]) SetError(1,NULL,NowLine);
    610     else pdi->ReturnType=DEF_NON;
    611 
    612     pdi->pos=NowLine;
    613 }
    614 
    615 BOOL CompareParameter(PARAMETER_INFO *ppi1,int pi_num1,PARAMETER_INFO *ppi2,int pi_num2){
    616     if(pi_num1!=pi_num2) return 1;
    617 
    618     int i;
    619     for(i=0;i<pi_num1;i++){
    620         if(ppi1[i].type!=ppi2[i].type){
    621 
    622             if(ppi1[i].bByVal==0&&ppi1[i].type==DEF_ANY&&
    623                 ppi2[i].bByVal==1&&IsPtrType(ppi2[i].type)||
    624                 ppi1[i].bByVal==1&&IsPtrType(ppi1[i].type)&&
    625                 ppi2[i].bByVal==0&&ppi2[i].type==DEF_ANY){
    626                     /* ByRef var As Any
    627                             と
    628                         var As VoidPtr
    629                         は同等
    630                     */
    631                     continue;
    632             }
    633 
    634             return 1;
    635         }
    636         else{
    637             if(NATURAL_TYPE(ppi1[i].type)==DEF_OBJECT
    638                 || NATURAL_TYPE(ppi1[i].type)==DEF_STRUCT ){
    639                 if(ppi1[i].u.index!=ppi2[i].u.index) return 1;
    640             }
    641         }
    642     }
    643 
    644     return 0;
    645 }
    646 SubInfo *AddSubData(char *buffer,int NowLine,BOOL bVirtual,CClass *pobj_c,BOOL bStatic){
    647     int i,i2,i3,sw;
    648     DWORD dwType;
    649     char temporary[8192],temp2[VN_SIZE];
    650 
    651     i=1;
    652     if(buffer[i]==ESC_SUB) dwType=SUBTYPE_SUB;
    653     else if(buffer[i]==ESC_FUNCTION) dwType=SUBTYPE_FUNCTION;
    654     else if(buffer[i]==ESC_MACRO) dwType=SUBTYPE_MACRO;
    655 
    656     i++;
    657 
    658     BOOL bExport=0,bCdecl=0;
    659     while(1){
    660         if(buffer[i]==1&&buffer[i+1]==ESC_EXPORT&&bExport==0){
    661             bExport=1;
    662 
    663             i+=2;
    664         }
    665         else if(buffer[i]==1&&buffer[i+1]==ESC_CDECL&&bCdecl==0){
    666             bCdecl=1;
     470        else if(buffer[i]==1&&buffer[i+1]==ESC_EXPORT&& isExport == false ){
     471            isExport = true;
    667472
    668473            i+=2;
     
    674479    if(buffer[i]==1&&buffer[i+1]==ESC_OPERATOR){
    675480        if(!pobj_c){
    676             SetError(126,NULL,NowLine);
     481            SetError(126,NULL,nowLine);
    677482            return 0;
    678483        }
     
    708513        }
    709514        if(!iCalcId){
    710             SetError(1,NULL,NowLine);
     515            SetError(1,NULL,nowLine);
    711516            return 0;
    712517        }
     
    735540    }
    736541
    737     if(dwType==SUBTYPE_MACRO){
     542    if( isMacro ){
    738543        //大文字に変換
    739544        CharUpper(temporary);
     
    753558
    754559        if(GetDeclareHash(temporary)){
    755             SetError(15,temporary,NowLine);
     560            SetError(15,temporary,nowLine);
    756561            return 0;
    757562        }
     
    761566    SubNum++;
    762567
    763     SubInfo *pSub = new SubInfo();
    764 
    765     //クラス名
    766     pSub->pobj_ParentClass=pobj_c;
     568
     569    UserProc *pUserProc = new UserProc( temporary, kind, isMacro, isCdecl, isExport );
     570    pUserProc->SetParentClass( pobj_c );
    767571
    768572    //ID
    769573    static int id_base=0;
    770     pSub->id=(id_base++);
    771 
    772     //関数名
    773     pSub->name=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
    774     lstrcpy(pSub->name,temporary);
    775 
    776     //ソースコードの位置
    777     pSub->address=NowLine;
    778 
    779     pSub->bExport=bExport;
    780     pSub->bCdecl=bCdecl;
    781     pSub->bVirtual=bVirtual;
    782     if(bExport) pSub->bUse=1;
    783     else pSub->bUse=0;
    784     pSub->bCompile=0;
    785     pSub->bSystem=0;
    786 
    787     pSub->dwType=dwType;
    788 
    789 
    790     if(pSub->dwType==SUBTYPE_FUNCTION){
    791         ///////////////////
    792         // 戻り値を取得
    793         ///////////////////
    794 
    795         pSub->isReturnRef = false;
    796 
    797         if(pobj_c){
    798             if(lstrcmp(pSub->name,pobj_c->name)==0||
    799                 pSub->name[0]=='~'){
    800                 //クラスのコンストラクタ、デストラクタがFunction定義の場合はエラーをだす
    801                 SetError(115,NULL,NowLine);
    802             }
    803         }
    804 
    805 
    806         i2=lstrlen(buffer)-2;
    807 
    808         int sw_as=0;
    809         for(;i2>0;i2--){
    810             if(buffer[i2]==')') break;
    811 
    812             if(buffer[i2]==1&&buffer[i2+1]==ESC_AS){
    813                 if( buffer[i2-2] == 1 && buffer[i2-1] == ESC_BYREF ){
    814                     //参照型
    815                     pSub->isReturnRef = true;
    816                 }
    817 
    818                 i2+=2;
    819                 i3=0;
    820                 while(buffer[i2]=='*') temporary[i3++]=buffer[i2++];
    821                 for(;;i2++,i3++){
    822                     if(!IsVariableChar(buffer[i2])){
    823                         temporary[i3]=0;
    824                         break;
    825                     }
    826                     temporary[i3]=buffer[i2];
    827                 }
    828                 pSub->ReturnType=GetTypeFixed(temporary,&pSub->u.ReturnIndex);
    829                 if(pSub->ReturnType==DEF_NON) SetError(3,temporary,NowLine);
    830 
    831                 sw_as=1;
    832                 break;
    833             }
    834         }
    835 
    836         if(!sw_as){
    837             SetError(-104,pSub->name,NowLine);
    838 
    839             pSub->ReturnType=DEF_DOUBLE;
    840         }
    841     }
    842     else{
    843         //戻り値なしのSub定義
    844         pSub->ReturnType=DEF_NON;
    845         pSub->u.ReturnIndex=-1;
    846     }
    847 
    848     //パラメータ
    849     if(buffer[i]!='('){
    850         SetError(1,NULL,NowLine);
    851         return 0;
    852     }
    853     i++;
    854     if(buffer[i]!=')'&&pobj_c){
    855         //クラスのメンバ関数の場合のみ、デストラクタにパラメータがある場合にエラーをだす
    856         if(pSub->name[0]=='~'){
    857             SetError(114,NULL,NowLine);
    858             i=JumpStringInPare(buffer,i);
    859         }
    860     }
    861     while(1){
    862         if(buffer[i]==')') break;
    863 
    864         //ByRef
    865         bool isRef;
    866         if(buffer[i]==1&&buffer[i+1]==ESC_BYVAL){
    867             isRef = false;
    868             i+=2;
    869         }
    870         else if(buffer[i]==1&&buffer[i+1]==ESC_BYREF){
    871             isRef = true;
    872             i+=2;
    873         }
    874         else isRef = false;
    875 
    876         //パラメータ名
    877         bool isArray = false;
    878         int subScripts[MAX_ARRAYDIM];
    879         char name[VN_SIZE];
    880         sw=0;
    881         for(i2=0;;i++,i2++){
    882             if(buffer[i]=='('){
    883                 if(!sw) sw=1;
    884 
    885                 i3=GetStringInPare(name+i2,buffer+i);
    886                 i2+=i3-1;
    887                 i+=i3-1;
    888                 continue;
    889             }
    890             if(buffer[i]=='['){
    891                 if(!sw) sw=1;
    892 
    893                 i3=GetStringInBracket(name+i2,buffer+i);
    894                 i2+=i3-1;
    895                 i+=i3-1;
    896                 continue;
    897             }
    898             if(!IsVariableChar(buffer[i])){
    899                 name[i2]=0;
    900                 break;
    901             }
    902             name[i2]=buffer[i];
    903         }
    904         if(sw){
    905             //配列パラメータ
    906             if( isRef == false ) SetError(29,NULL,NowLine);
    907             isArray = true;
    908 
    909             if((name[i2-2]=='('&&name[i2-1]==')')||
    910                 (name[i2-2]=='['&&name[i2-1]==']')){
    911                 subScripts[0]=LONG_MAX;
    912                 subScripts[1]=-1;
    913 
    914                 name[i2-2]=0;
    915             }
    916             else{
    917                 GetArrange(name,temp2,subScripts);
    918                 lstrcpy(name,temp2);
    919             }
    920 
    921             i2=lstrlen(name);
    922         }
    923 
    924         //型
    925         Type type( DEF_NON );
    926         if(buffer[i]==1&&buffer[i+1]==ESC_AS){
    927             i+=2;
    928 
    929             i2=0;
    930             while(buffer[i]=='*'){
    931                 temporary[i2]=buffer[i];
    932                 i++;
    933                 i2++;
    934             }
    935             for(;;i++,i2++){
    936                 if(!IsVariableChar(buffer[i])){
    937                     if(buffer[i]==1&&(buffer[i+1]==ESC_FUNCTION||buffer[i+1]==ESC_SUB)){
    938                         temporary[i2++]=buffer[i++];
    939                         temporary[i2]=buffer[i];
    940                         continue;
    941                     }
    942                     temporary[i2]=0;
    943                     break;
    944                 }
    945                 temporary[i2]=buffer[i];
    946             }
    947 
    948             Type::StringToType( temporary, type );
    949 
    950             if(temporary[0]=='*'&&
    951                 temporary[1]==1&&
    952                 (temporary[2]==ESC_FUNCTION||temporary[2]==ESC_SUB)){
    953                 if(buffer[i]!='('){
    954                     SetError(10,temporary,NowLine);
    955                     break;
    956                 }
    957                 i3=GetStringInPare(temporary+i2,buffer+i);
    958                 i+=i3;
    959                 i2+=i3;
    960 
    961                 if(temporary[2]==ESC_FUNCTION&&buffer[i]==1&&buffer[i+1]==ESC_AS){
    962                     temporary[i2++]=buffer[i++];
    963                     temporary[i2++]=buffer[i++];
    964                     for(;;i++,i2++){
    965                         if(!IsVariableChar(buffer[i])){
    966                             temporary[i2]=0;
    967                             break;
    968                         }
    969                         temporary[i2]=buffer[i];
    970                     }
    971                 }
    972             }
    973             else{
    974                 //TypeDefをする前のベース型を取得
    975                 GetOriginalTypeName(temporary);
    976             }
    977 
    978             if( type.IsNull() ){
    979                 SetError(3,temporary,NowLine);
    980                 type.SetBasicType( DEF_PTR_VOID );
    981             }
    982         }
    983         else{
    984             type.SetBasicType( GetTypeFromSimpleName(temporary) );
    985             SetError(-103,temporary,NowLine);
    986         }
    987 
    988         if( type.IsProcPtr() ){
    989             //関数ポインタの場合
    990             type.SetIndex( AddProcPtrInfo(temporary+3,temporary[2]) );
    991         }
    992 
    993         Parameter *pParam = new Parameter( name, type, isRef );
    994         if( isArray ){
    995             pParam->SetArray( subScripts );
    996         }
    997 
    998         //パラメータを追加
    999         pSub->params.push_back( pParam );
    1000 
    1001         if(buffer[i]==','){
    1002             i++;
    1003             continue;
    1004         }
    1005         else if(buffer[i]==')') continue;
    1006         else{
    1007             SetError(1,NULL,NowLine);
    1008             break;
    1009         }
    1010     }
    1011     pSub->SecondParmNum = (int)pSub->params.size();
    1012     i++;
    1013     if(buffer[i]=='('){
    1014         i++;
    1015         while(1){
    1016             if(buffer[i]==')') break;
    1017 
    1018             //ByRef
    1019             bool isRef;
    1020             if(buffer[i]==1&&buffer[i+1]==ESC_BYVAL){
    1021                 isRef = false;
    1022                 i+=2;
    1023             }
    1024             else if(buffer[i]==1&&buffer[i+1]==ESC_BYREF){
    1025                 isRef = true;
    1026                 i+=2;
    1027             }
    1028             else isRef = false;
    1029 
    1030             //パラメータ名
    1031             bool isArray = false;
    1032             int subScripts[MAX_ARRAYDIM];
    1033             char name[VN_SIZE];
    1034             sw=0;
    1035             for(i2=0;;i++,i2++){
    1036                 if(buffer[i]=='('){
    1037                     if(!sw) sw=1;
    1038 
    1039                     i3=GetStringInPare(name+i2,buffer+i);
    1040                     i2+=i3-1;
    1041                     i+=i3-1;
    1042                     continue;
    1043                 }
    1044                 if(buffer[i]=='['){
    1045                     if(!sw) sw=1;
    1046 
    1047                     i3=GetStringInBracket(name+i2,buffer+i);
    1048                     i2+=i3-1;
    1049                     i+=i3-1;
    1050                     continue;
    1051                 }
    1052                 if(!IsVariableChar(buffer[i])){
    1053                     name[i2]=0;
    1054                     break;
    1055                 }
    1056                 name[i2]=buffer[i];
    1057             }
    1058             if(sw){
    1059                 //配列パラメータ
    1060                 if( isRef == false ) SetError(29,NULL,NowLine);
    1061                 isArray = true;
    1062 
    1063                 if((name[i2-2]=='('&&name[i2-1]==')')||
    1064                     (name[i2-2]=='['&&name[i2-1]==']')){
    1065                     subScripts[0]=LONG_MAX;
    1066                     subScripts[1]=-1;
    1067 
    1068                     name[i2-2]=0;
    1069                 }
    1070                 else{
    1071                     GetArrange(name,temp2,subScripts);
    1072                     lstrcpy(name,temp2);
    1073                 }
    1074 
    1075                 i2=lstrlen(name);
    1076             }
    1077 
    1078             //型
    1079             Type type( DEF_NON );
    1080             if(buffer[i]==1&&buffer[i+1]==ESC_AS){
    1081                 i+=2;
    1082 
    1083                 i2=0;
    1084                 while(buffer[i]=='*'){
    1085                     temporary[i2]=buffer[i];
    1086                     i++;
    1087                     i2++;
    1088                 }
    1089                 for(;;i++,i2++){
    1090                     if(!IsVariableChar(buffer[i])){
    1091                         if(buffer[i]==1&&(buffer[i+1]==ESC_FUNCTION||buffer[i+1]==ESC_SUB)){
    1092                             temporary[i2++]=buffer[i++];
    1093                             temporary[i2]=buffer[i];
    1094                             continue;
    1095                         }
    1096                         temporary[i2]=0;
    1097                         break;
    1098                     }
    1099                     temporary[i2]=buffer[i];
    1100                 }
    1101 
    1102                 Type::StringToType( temporary, type );
    1103 
    1104                 if(temporary[0]=='*'&&
    1105                     temporary[1]==1&&
    1106                     (temporary[2]==ESC_FUNCTION||temporary[2]==ESC_SUB)){
    1107                     if(buffer[i]!='('){
    1108                         SetError(10,temporary,NowLine);
    1109                         break;
    1110                     }
    1111                     i3=GetStringInPare(temporary+i2,buffer+i);
    1112                     i+=i3;
    1113                     i2+=i3;
    1114 
    1115                     if(temporary[2]==ESC_FUNCTION&&buffer[i]==1&&buffer[i+1]==ESC_AS){
    1116                         temporary[i2++]=buffer[i++];
    1117                         temporary[i2++]=buffer[i++];
    1118                         for(;;i++,i2++){
    1119                             if(!IsVariableChar(buffer[i])){
    1120                                 temporary[i2]=0;
    1121                                 break;
    1122                             }
    1123                             temporary[i2]=buffer[i];
    1124                         }
    1125                     }
    1126                 }
    1127                 else{
    1128                     //TypeDefをする前のベース型を取得
    1129                     GetOriginalTypeName(temporary);
    1130                 }
    1131 
    1132                 if( type.IsNull() ){
    1133                     SetError(3,temporary,NowLine);
    1134                     type.SetBasicType( DEF_PTR_VOID );
    1135                 }
    1136             }
    1137             else{
    1138                 type.SetBasicType( GetTypeFromSimpleName(temporary) );
    1139                 SetError(-103,temporary,NowLine);
    1140             }
    1141 
    1142             if( type.IsProcPtr() ){
    1143                 //関数ポインタの場合
    1144                 type.SetIndex( AddProcPtrInfo(temporary+3,temporary[2]) );
    1145             }
    1146 
    1147             Parameter *pParam = new Parameter( name, type, isRef );
    1148             if( isArray ){
    1149                 pParam->SetArray( subScripts );
    1150             }
    1151 
    1152             //パラメータを追加
    1153             pSub->params.push_back( pParam );
    1154 
    1155             if(buffer[i]==','){
    1156                 i++;
    1157                 continue;
    1158             }
    1159             else if(buffer[i]==')') continue;
    1160             else{
    1161                 SetError(1,NULL,NowLine);
    1162                 break;
    1163             }
    1164         }
    1165         i++;
    1166     }
    1167 
    1168     //リアルパラメータ領域を取得(_System_LocalThisを考慮して2つだけ多く確保する場合がある)
    1169 
    1170     if(pobj_c&&bStatic==0){
    1171         //オブジェクトメンバの場合は、第一パラメータを_System_LocalThis引き渡し用として利用
    1172         string name = "_System_LocalThis";
    1173         Type type( DEF_PTR_VOID );
    1174         pSub->realParams.push_back( new Parameter( name, type ) );
    1175     }
    1176 
    1177     if(pSub->ReturnType==DEF_STRUCT){
    1178         //構造体を戻り値として持つ場合
    1179         //※第一パラメータ(Thisポインタありの場合は第二パラメータ)を戻り値用の参照宣言にする
    1180 
    1181         string name = pSub->name;
    1182         if(pSub->name[0]==1&&pSub->name[1]==ESC_OPERATOR){
    1183             name="_System_ReturnValue";
    1184         }
    1185         Type type( DEF_STRUCT, pSub->u.ReturnIndex );
    1186         pSub->realParams.push_back( new Parameter( name, type, true ) );
    1187     }
    1188 
    1189     //パラメータをコピー
    1190     foreach( Parameter *pParam, pSub->params ){
    1191         pSub->realParams.push_back( new Parameter( *pParam ) );
    1192     }
     574    pUserProc->id = (id_base++);
     575
     576    if(isExport){
     577        pUserProc->Using();
     578    }
     579
     580    // パラメータを解析
     581    // ※第1パラメータにに指定するデータの例:"( s As String ) As String"
     582    pUserProc->SetParamsAndReturnType( buffer + i, nowLine, isStatic );
    1193583
    1194584
     
    1198588
    1199589    int key;
    1200     key=hash_default(pSub->name);
    1201 
    1202     extern SubInfo **ppSubHash;
     590    key=hash_default(pUserProc->GetName().c_str());
     591
     592    extern UserProc **ppSubHash;
    1203593    if(ppSubHash[key]){
    1204         SubInfo *psi2;
     594        UserProc *psi2;
    1205595        psi2=ppSubHash[key];
    1206596        while(1){
    1207             if(pobj_c==psi2->pobj_ParentClass){
     597            if(pobj_c==psi2->GetParentClassPtr()){
    1208598                //重複エラーチェックを行う
    1209                 if(lstrcmp(psi2->name,pSub->name)==0){
    1210                     if( Parameter::Equals( psi2->params, pSub->params ) ){
    1211                         SetError(15,pSub->name,NowLine);
     599                if( pUserProc->GetName() == psi2->GetName() ){
     600                    if( Parameter::Equals( psi2->Params(), pUserProc->Params() ) ){
     601                        SetError(15,pUserProc->GetName().c_str(),nowLine);
    1212602                        return 0;
    1213603                    }
     
    1218608            psi2=psi2->pNextData;
    1219609        }
    1220         psi2->pNextData=pSub;
     610        psi2->pNextData=pUserProc;
    1221611    }
    1222612    else{
    1223         ppSubHash[key]=pSub;
    1224     }
    1225 
    1226     return pSub;
     613        ppSubHash[key]=pUserProc;
     614    }
     615
     616    return pUserProc;
    1227617}
    1228618
     
    1234624
    1235625    //Declare(DLL関数)情報を初期化
    1236     extern DECLAREINFO **ppDeclareHash;
    1237     ppDeclareHash=(DECLAREINFO **)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,MAX_HASH*sizeof(DECLAREINFO *));
     626    extern DllProc **ppDeclareHash;
     627    ppDeclareHash=(DllProc **)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,MAX_HASH*sizeof(DllProc *));
    1238628
    1239629    //サブルーチン(ユーザー定義)情報を初期化
    1240     extern SubInfo **ppSubHash;
     630    extern UserProc **ppSubHash;
    1241631    extern int SubNum;
    1242     ppSubHash=(SubInfo **)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,MAX_HASH*sizeof(SubInfo *));
     632    ppSubHash=(UserProc **)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,MAX_HASH*sizeof(UserProc *));
    1243633    SubNum=0;
    1244634
     
    1334724    AddSubData(temporary,0,0,0);
    1335725}
    1336 void Delete_si(SubInfo *pSub){
    1337     foreach( Parameter *pParam, pSub->params ){
    1338         delete pParam;
    1339     }
    1340 
    1341     foreach( Parameter *pParam, pSub->realParams ){
    1342         delete pParam;
    1343     }
    1344 
    1345     if(pSub->pNextData) Delete_si(pSub->pNextData);
    1346 
    1347     HeapDefaultFree(pSub->name);
    1348     delete pSub;
    1349 }
    1350 void DeleteSubInfo(SubInfo **ppSubHash,char **ppMacroNames,int MacroNum){   //サブルーチン情報のメモリ解放
     726void Delete_si(UserProc *pUserProc){
     727    if(pUserProc->pNextData) Delete_si(pUserProc->pNextData);
     728    delete pUserProc;
     729}
     730void DeleteSubInfo(UserProc **ppSubHash,char **ppMacroNames,int MacroNum){  //サブルーチン情報のメモリ解放
    1351731    int i;
    1352732    for(i=0;i<MAX_HASH;i++){
     
    1365745    }
    1366746}
    1367 void Delete_di(DECLAREINFO *pdi){
    1368     if(pdi->pParmInfo) HeapDefaultFree(pdi->pParmInfo);
    1369 
    1370     HeapDefaultFree(pdi->name);
    1371     if(pdi->file) HeapDefaultFree(pdi->file);
    1372     if(pdi->alias) HeapDefaultFree(pdi->alias);
    1373 
    1374     if(pdi->pNextData) Delete_di(pdi->pNextData);
    1375 
    1376     HeapDefaultFree(pdi);
     747void Delete_di(DllProc *pDllProc){
     748    if(pDllProc->pNextData) Delete_di(pDllProc->pNextData);
     749
     750    delete pDllProc;
    1377751}
    1378752void DeleteDeclareInfo(void){
    1379753    //DLL情報を解放
    1380     extern DECLAREINFO **ppDeclareHash;
     754    extern DllProc **ppDeclareHash;
    1381755    int i;
    1382756    for(i=0;i<MAX_HASH;i++){
     
    1394768///////////////////////
    1395769
    1396 int AddProcPtrInfo(char *buffer,DWORD dwProcType){
    1397     extern HANDLE hHeap;
    1398     extern int cp;
    1399     extern PROCPTRINFO *pProcPtrInfo;
     770int AddProcPtrInfo( char *buffer, DWORD dwProcType, int nowLine ){
     771
     772    Procedure::Kind kind = Procedure::Sub;
     773    if( dwProcType == ESC_FUNCTION ){
     774        kind = Procedure::Function;
     775    }
     776
     777    ProcPointer *pProcPointer = new ProcPointer( kind );
     778
     779    //buffer[0]は'('となっている
     780    pProcPointer->SetParamsAndReturnType( buffer, nowLine );
     781
     782    extern ProcPointer **ppProcPointer;
    1400783    extern int ProcPtrInfoNum;
    1401     int i,i2,i3,sw;
    1402     PROCPTRINFO *pi;
    1403     char temporary[VN_SIZE],temp2[VN_SIZE];
    1404 
    1405     pProcPtrInfo=(PROCPTRINFO *)HeapReAlloc(hHeap,0,pProcPtrInfo,(ProcPtrInfoNum+1)*sizeof(PROCPTRINFO));
    1406     pi=&pProcPtrInfo[ProcPtrInfoNum];
     784    ppProcPointer=(ProcPointer **)HeapReAlloc(hHeap,0,ppProcPointer,(ProcPtrInfoNum+1)*sizeof(ProcPointer *));
     785    ppProcPointer[ProcPtrInfoNum] = pProcPointer;
    1407786    ProcPtrInfoNum++;
    1408787
    1409     pi->pParmInfo=(PARAMETER_INFO *)HeapAlloc(hHeap,0,1);
    1410     pi->ParmNum=0;
    1411 
    1412     //buffer[0]は'('となっている
    1413     i=1;
    1414 
    1415     while(1){
    1416         if(buffer[i]==')') break;
    1417 
    1418         pi->pParmInfo=(PARAMETER_INFO *)HeapReAlloc(hHeap,0,pi->pParmInfo,(pi->ParmNum+1)*sizeof(PARAMETER_INFO));
    1419 
    1420         //ByVal
    1421         if(buffer[i]==1&&buffer[i+1]==ESC_BYVAL){
    1422             pi->pParmInfo[pi->ParmNum].bByVal=1;
    1423             i+=2;
    1424         }
    1425         else if(buffer[i]==1&&buffer[i+1]==ESC_BYREF){
    1426             pi->pParmInfo[pi->ParmNum].bByVal=0;
    1427             i+=2;
    1428         }
    1429         else pi->pParmInfo[pi->ParmNum].bByVal=1;
    1430 
    1431         //パラメータ名
    1432         sw=0;
    1433         for(i2=0;;i++,i2++){
    1434             if(buffer[i]=='('){
    1435                 if(!sw) sw=1;
    1436 
    1437                 i3=GetStringInPare(temporary+i2,buffer+i);
    1438                 i2+=i3-1;
    1439                 i+=i3-1;
    1440                 continue;
    1441             }
    1442             if(buffer[i]=='['){
    1443                 if(!sw) sw=1;
    1444 
    1445                 i3=GetStringInBracket(temporary+i2,buffer+i);
    1446                 i2+=i3-1;
    1447                 i+=i3-1;
    1448                 continue;
    1449             }
    1450             if(!IsVariableChar(buffer[i])){
    1451                 temporary[i2]=0;
    1452                 break;
    1453             }
    1454             temporary[i2]=buffer[i];
    1455         }
    1456         pi->pParmInfo[pi->ParmNum].name=0;
    1457 
    1458         if(sw){
    1459             //配列パラメータ
    1460             if(pi->pParmInfo[pi->ParmNum].bByVal) SetError(29,NULL,cp);
    1461             pi->pParmInfo[pi->ParmNum].bArray=1;
    1462 
    1463             if((temporary[i2-2]=='('&&temporary[i2-1]==')')||
    1464                 (temporary[i2-2]=='['&&temporary[i2-1]==']')){
    1465                 pi->pParmInfo[pi->ParmNum].SubScripts[0]=LONG_MAX;
    1466                 pi->pParmInfo[pi->ParmNum].SubScripts[1]=-1;
    1467 
    1468                 temporary[i2-2]=0;
    1469             }
    1470             else{
    1471                 GetArrange(temporary,temp2,pi->pParmInfo[pi->ParmNum].SubScripts);
    1472                 lstrcpy(temporary,temp2);
    1473             }
    1474 
    1475             i2=lstrlen(temporary);
    1476         }
    1477         else{
    1478             pi->pParmInfo[pi->ParmNum].bArray=0;
    1479             pi->pParmInfo[pi->ParmNum].SubScripts[0]=-1;
    1480         }
    1481 
    1482         //型
    1483         if(buffer[i]==1&&buffer[i+1]==ESC_AS){
    1484             i+=2;
    1485 
    1486             i2=0;
    1487             while(buffer[i]=='*'){
    1488                 temporary[i2]=buffer[i];
    1489                 i++;
    1490                 i2++;
    1491             }
    1492             for(;;i++,i2++){
    1493                 if(!IsVariableChar(buffer[i])){
    1494                     temporary[i2]=0;
    1495                     break;
    1496                 }
    1497                 temporary[i2]=buffer[i];
    1498             }
    1499 
    1500             pi->pParmInfo[pi->ParmNum].type=
    1501                 GetTypeFixed(temporary,&pi->pParmInfo[pi->ParmNum].u.index);
    1502             if(pi->pParmInfo[pi->ParmNum].type==-1){
    1503                 SetError(3,temporary,cp);
    1504                 pi->pParmInfo[pi->ParmNum].type=DEF_PTR_VOID;
    1505             }
    1506             if(pi->pParmInfo[pi->ParmNum].type==DEF_OBJECT){
    1507                 if(pi->pParmInfo[pi->ParmNum].bByVal) SetError(28,temporary,cp);
    1508             }
    1509         }
    1510         else{
    1511             pi->pParmInfo[pi->ParmNum].type=GetTypeFromSimpleName(temporary);
    1512             SetError(-103,temporary,cp);
    1513         }
    1514 
    1515         pi->ParmNum++;
    1516 
    1517         if(buffer[i]==','){
    1518             i++;
    1519             continue;
    1520         }
    1521         else if(buffer[i]==')') continue;
    1522         else{
    1523             SetError(1,NULL,cp);
    1524             return 0;
    1525         }
    1526     }
    1527     i++;
    1528 
    1529     //戻り値
    1530     if(dwProcType==ESC_FUNCTION){
    1531         if(buffer[i]==1&&buffer[i+1]==ESC_AS){
    1532             i+=2;
    1533             i2=0;
    1534             if(buffer[i]=='*') temporary[i2++]=buffer[i++];
    1535             for(;;i++,i2++){
    1536                 if(!IsVariableChar(buffer[i])){
    1537                     temporary[i2]=0;
    1538                     break;
    1539                 }
    1540                 temporary[i2]=buffer[i];
    1541             }
    1542             pi->ReturnType=GetTypeFixed(temporary,&pi->u.ReturnIndex);
    1543             if(pi->ReturnType==DEF_NON) SetError(3,temporary,cp);
    1544         }
    1545         else pi->ReturnType=DEF_DOUBLE;
    1546     }
    1547     else pi->ReturnType=DEF_NON;
    1548 
    1549788    return ProcPtrInfoNum-1;
    1550789}
    1551790void DeleteProcPtrInfo(void){
    1552     extern PROCPTRINFO *pProcPtrInfo;
     791    extern ProcPointer **ppProcPointer;
    1553792    extern int ProcPtrInfoNum;
    1554     int i;
    1555 
    1556     for(i=0;i<ProcPtrInfoNum;i++){
    1557         HeapDefaultFree(pProcPtrInfo[i].pParmInfo);
    1558     }
    1559 
    1560     HeapDefaultFree(pProcPtrInfo);
    1561 }
     793
     794    for(int i=0;i<ProcPtrInfoNum;i++){
     795        delete ppProcPointer[i];
     796    }
     797
     798    HeapDefaultFree(ppProcPointer);
     799}
  • BasicCompiler_Common/Type.cpp

    r73 r75  
    6565                //関数ポインタ(*Function)
    6666                type.basicType = DEF_PTR_PROC;
     67                return true;
    6768        }
    6869
     
    109110}
    110111
     112int Type::GetBasicSize( int basicType )
     113{
     114
     115    // 基本型
     116    switch( basicType ){
     117        case DEF_SBYTE:
     118        case DEF_BYTE:
     119        case DEF_BOOLEAN:
     120            return sizeof(BYTE);
     121
     122        case DEF_INTEGER:
     123        case DEF_WORD:
     124            return sizeof(WORD);
     125
     126        case DEF_LONG:
     127        case DEF_DWORD:
     128            return sizeof(DWORD);
     129
     130        case DEF_INT64:
     131        case DEF_QWORD:
     132            return sizeof(_int64);
     133
     134        case DEF_DOUBLE:
     135            return sizeof(double);
     136        case DEF_SINGLE:
     137            return sizeof(float);
     138    }
     139
     140    // ポインタ
     141    if(IsPtrType(basicType)){
     142        return PTR_SIZE;
     143    }
     144
     145    // オブジェクト
     146    if(basicType==DEF_OBJECT){
     147        return PTR_SIZE;
     148    }
     149
     150    SetError();
     151    return 0;
     152}
     153
    111154
    112155bool Type::Equals( const Type &type ) const
     
    128171}
    129172
     173int Type::GetBasicSize() const
     174{
     175    GetBasicSize( basicType );
     176    return 0;
     177}
     178int Type::GetSize() const
     179{
     180
     181    // 基本型
     182    switch( basicType ){
     183        case DEF_LONG:
     184            if(index==LITERAL_NULL||index==LITERAL_M128_0||index==LITERAL_0_255){
     185                return sizeof(BYTE);
     186            }
     187            else if(index==LITERAL_M32768_0||index==LITERAL_0_65535){
     188                return sizeof(WORD);
     189            }
     190            return sizeof(DWORD);
     191
     192        case DEF_SBYTE:
     193        case DEF_BYTE:
     194        case DEF_BOOLEAN:
     195            return sizeof(BYTE);
     196
     197        case DEF_INTEGER:
     198        case DEF_WORD:
     199            return sizeof(WORD);
     200
     201        case DEF_DWORD:
     202            return sizeof(DWORD);
     203
     204        case DEF_INT64:
     205        case DEF_QWORD:
     206            return sizeof(_int64);
     207
     208        case DEF_DOUBLE:
     209            return sizeof(double);
     210        case DEF_SINGLE:
     211            return sizeof(float);
     212    }
     213
     214    // ポインタ
     215    if(IsPtrType(basicType)){
     216        return PTR_SIZE;
     217    }
     218
     219    // 構造体
     220    if( basicType == DEF_STRUCT ){
     221        if( !pClass ){
     222            SetError();
     223            return 0;
     224        }
     225
     226        return pClass->GetSize();
     227    }
     228
     229    // オブジェクト
     230    if(basicType==DEF_OBJECT){
     231        return PTR_SIZE;
     232    }
     233
     234    SetError();
     235    return 0;
     236}
     237
    130238bool Type::IsNull() const{
    131239  if( basicType == DEF_NON ){
     
    134242  return false;
    135243}
     244
     245bool Type::IsByte() const{
     246  if( basicType == DEF_BYTE ){
     247      return true;
     248  }
     249  return false;
     250}
     251bool Type::IsSByte() const{
     252  if( basicType == DEF_SBYTE ){
     253      return true;
     254  }
     255  return false;
     256}
     257bool Type::IsWord() const{
     258  if( basicType == DEF_WORD ){
     259      return true;
     260  }
     261  return false;
     262}
     263bool Type::IsInteger() const{
     264  if( basicType == DEF_INTEGER ){
     265      return true;
     266  }
     267  return false;
     268}
     269bool Type::IsDWord() const{
     270  if( basicType == DEF_DWORD ){
     271      return true;
     272  }
     273  return false;
     274}
     275bool Type::IsLong() const{
     276  if( basicType == DEF_LONG ){
     277      return true;
     278  }
     279  return false;
     280}
     281bool Type::IsQWord() const{
     282  if( basicType == DEF_QWORD ){
     283      return true;
     284  }
     285  return false;
     286}
     287bool Type::IsInt64() const{
     288  if( basicType == DEF_INT64 ){
     289      return true;
     290  }
     291  return false;
     292}
     293bool Type::IsSingle() const{
     294  if( basicType == DEF_SINGLE ){
     295      return true;
     296  }
     297  return false;
     298}
     299bool Type::IsDouble() const{
     300  if( basicType == DEF_DOUBLE ){
     301      return true;
     302  }
     303  return false;
     304}
     305bool Type::IsBoolean() const{
     306  if( basicType == DEF_BOOLEAN ){
     307      return true;
     308  }
     309  return false;
     310}
     311
    136312bool Type::IsPointer() const
    137313{
     
    219395    return false;
    220396}
     397bool Type::IsStructPtr() const
     398{
     399    if( basicType == DEF_PTR_STRUCT ){
     400        return true;
     401    }
     402    return false;
     403}
     404bool Type::IsObject() const
     405{
     406    if( basicType == DEF_OBJECT ){
     407        return true;
     408    }
     409    return false;
     410}
     411bool Type::IsObjectPtr() const
     412{
     413    if( basicType == DEF_PTR_OBJECT ){
     414        return true;
     415    }
     416    return false;
     417}
     418bool Type::IsStringObject() const
     419{
     420    if( basicType == DEF_OBJECT ){
     421        if( lstrcmp( pClass->name,"String")==0){
     422            return true;
     423        }
     424    }
     425    return false;
     426}
     427bool Type::IsVoidPtr() const
     428{
     429    if( basicType == DEF_PTR_VOID ){
     430        return true;
     431    }
     432    return false;
     433}
     434
     435bool Type::IsAny() const
     436{
     437    if( basicType == DEF_ANY ){
     438        return true;
     439    }
     440    return false;
     441}
     442
     443const string Type::ToString() const
     444{
     445    if( PTR_LEVEL( basicType ) ){
     446        //ポインタレベルが1以上の場合
     447        Type type( *this );
     448        type.PtrLevelDown();
     449
     450        return (string)"*" + type.ToString();
     451    }
     452    else if( IsObject() || IsStruct() ){
     453        //オブジェクトまたは構造体
     454
     455        if( !( index == 0 || index == -1 ) ){
     456            return pClass->name;
     457        }
     458    }
     459    else if( IsProcPtr() ){
     460        if( index == 0 || index == -1 ){
     461            return "VoidPtr";
     462        }
     463        else{
     464            extern ProcPointer **ppProcPointer;
     465            if( ppProcPointer[index]->ReturnType().IsNull() ){
     466                return "*Sub";
     467            }
     468            return "*Function";
     469        }
     470    }
     471    else{
     472        // 基本型
     473
     474        for( int i=0; ; i++ ){
     475            if( basicTypeList[i] == DEF_NON ){
     476                break;
     477            }
     478            if( basicTypeList[i] == basicType ){
     479                return basicTypeNameList[i];
     480            }
     481        }
     482    }
     483
     484    extern int cp;
     485    SetError(1,NULL,cp);
     486
     487    return (string)"(null)";
     488}
  • BasicCompiler_Common/Type.h

    r73 r75  
     1#pragma once
    12
    2 #ifndef _ACTIVEBASIC_COMPILER_TYPE_H
    3 #define _ACTIVEBASIC_COMPILER_TYPE_H
     3class CClass;
    44
    55class Type{
     
    1818    static bool StringToBasicType( const string &typeName, int &basicType );
    1919    static bool StringToType( const string &typeName, Type &type );
     20    static int GetBasicSize( int basicType );
    2021
    2122    Type():
     
    3031      index( index ){}
    3132
    32     Type( int basicType, CClass &objClass ):
     33    Type( int basicType, const CClass &objClass ):
    3334      basicType( basicType ),
    3435      index( (LONG_PTR)&objClass ){}
     
    3839      index( type.index ){}
    3940
    40     int GetBasicType() const
     41    __inline int GetBasicType() const
    4142    {
    42 #ifdef _DEBUG
    43         if( basicType<-10000 ){
    44             DebugBreak();
    45         }
    46 #endif
    4743        return basicType;
    4844    }
     
    6460    void SetNull(){
    6561        SetBasicType( DEF_NON );
     62        SetIndex( -1 );
    6663    }
    6764    void SetType( int basicType, LONG_PTR index ){
     
    7471    }
    7572
     73    int PtrLevel() const
     74    {
     75        return PTR_LEVEL( basicType );
     76    }
    7677    void PtrLevelUp(){
    7778        PTR_LEVEL_UP( basicType );
     79    }
     80    void PtrLevelDown(){
     81        PTR_LEVEL_DOWN( basicType );
    7882    }
    7983
    8084    bool Equals( const Type &type ) const;
    8185
     86    int GetBasicSize() const;
     87    int GetSize() const;
     88
    8289    bool IsNull() const;
     90
     91    bool IsByte() const;
     92    bool IsSByte() const;
     93    bool IsWord() const;
     94    bool IsInteger() const;
     95    bool IsDWord() const;
     96    bool IsLong() const;
     97    bool IsQWord() const;
     98    bool IsInt64() const;
     99    bool IsSingle() const;
     100    bool IsDouble() const;
     101    bool IsBoolean() const;
     102
    83103    bool IsPointer() const;
    84104    bool IsSigned() const;
     
    89109    bool IsProcPtr() const;
    90110    bool IsStruct() const;
     111    bool IsStructPtr() const;
     112    bool IsObject() const;
     113    bool IsObjectPtr() const;
     114    bool IsStringObject() const;
     115    bool IsVoidPtr() const;
     116    bool IsAny() const;
    91117
     118    const string ToString() const;
     119
     120    void operator= ( const Type &type ){
     121        basicType = type.basicType;
     122        index = type.index;
     123    }
    92124};
    93 
    94 #endif //_ACTIVEBASIC_COMPILER_TYPE_H
  • BasicCompiler_Common/Variable.cpp

    r73 r75  
    1 #include "../BasicCompiler_Common/common.h"
    2 
    3 #ifdef _AMD64_
    4 #include "../BasicCompiler64/opcode.h"
    5 #else
    6 #include "../BasicCompiler32/opcode.h"
    7 #endif
    8 
    9 BOOL IsVariableTopChar(char c){
    10     if((c>='A'&&c<='Z')||(c>='a'&&c<='z')||c=='_') return 1;
    11     return 0;
    12 }
    13 BOOL IsVariableChar(char c){
    14     if((c>='A'&&c<='Z')||(c>='a'&&c<='z')||(c>='0'&&c<='9')||
    15         c=='%'||c=='!'||c=='#'||c=='$'||
    16         c=='_'||c=='.') return 1;
    17     return 0;
    18 }
    19 BOOL IsPtrType(int type){
    20     if(type==-1) return 0;
    21 
    22     if(PTR_LEVEL(type)||type==DEF_PTR_VOID||type==DEF_PTR_PROC||
    23         (type&FLAG_PTR) ) return 1;
    24 
    25     return 0;
    26 }
    27 BOOL IsSignedType(int type){
    28     switch(type){
    29         case DEF_SBYTE:
    30         case DEF_INTEGER:
    31         case DEF_LONG:
    32         case DEF_INT64:
    33         case DEF_SINGLE:
    34         case DEF_DOUBLE:
    35         case DEF_CHAR:
    36             return 1;
    37         default:
    38             break;
    39     }
    40     return 0;
    41 }
    42 BOOL IsNaturalWholeNumberType(int type){
    43     switch(type){
    44         case DEF_SBYTE:
    45         case DEF_BYTE:
    46         case DEF_INTEGER:
    47         case DEF_WORD:
    48         case DEF_LONG:
    49         case DEF_DWORD:
    50         case DEF_INT64:
    51         case DEF_QWORD:
    52         case DEF_CHAR:
    53             return 1;
    54         default:
    55             break;
    56     }
    57     return 0;
    58 }
    59 BOOL IsWholeNumberType(int type){
    60     return (
    61         IsNaturalWholeNumberType(type)
    62         || IsPtrType(type)
    63         || type == DEF_BOOLEAN
    64         );
    65 }
    66 BOOL IsRealNumberType(int type){
    67     switch(type){
    68         case DEF_DOUBLE:
    69         case DEF_SINGLE:
    70             return 1;
    71         default:
    72             break;
    73     }
    74     return 0;
    75 }
    76 BOOL Is64Type(int type){
    77     switch(type){
    78         case DEF_INT64:
    79         case DEF_QWORD:
    80             return 1;
    81         default:
    82             break;
    83     }
    84 #ifdef _AMD64_
    85     return IsPtrType(type);
    86 #else
    87     return 0;
    88 #endif
    89 }
    90 int GetSignedType(int type){
    91     switch(type){
    92         case DEF_BYTE:
    93             return DEF_SBYTE;
    94         case DEF_WORD:
    95             return DEF_INTEGER;
    96         case DEF_DWORD:
    97             return DEF_LONG;
    98         case DEF_QWORD:
    99             return DEF_INT64;
    100         default:
    101             break;
    102     }
    103 #ifdef _AMD64_
    104     if(IsPtrType(type)) return DEF_INT64;
    105 #else
    106     if(IsPtrType(type)) return DEF_LONG;
    107 #endif
    108     return type;
    109 }
    110 int GetUnsignedType(int type){
    111     switch(type){
    112         case DEF_SBYTE:
    113             return DEF_BYTE;
    114         case DEF_INTEGER:
    115             return DEF_WORD;
    116         case DEF_LONG:
    117             return DEF_DWORD;
    118         case DEF_INT64:
    119             return DEF_QWORD;
    120         case DEF_CHAR:
    121             if( isUnicode ) return DEF_WORD;
    122             return DEF_BYTE;
    123     }
    124     return type;
    125 }
    126 int GetTypeSize(int type,LONG_PTR lpIndex){
    127     if(type==DEF_LONG){
    128         if(lpIndex==LITERAL_NULL||lpIndex==LITERAL_M128_0||lpIndex==LITERAL_0_255)
    129             return sizeof(BYTE);
    130         else if(lpIndex==LITERAL_M32768_0||lpIndex==LITERAL_0_65535)
    131             return sizeof(WORD);
    132 
    133         return sizeof(DWORD);
    134     }
    135 
    136     //整数型
    137     if(type==DEF_INT64||type==DEF_QWORD)
    138         return sizeof(_int64);
    139     else if(type==DEF_LONG||type==DEF_DWORD)
    140         return sizeof(DWORD);
    141     else if(type==DEF_INTEGER||type==DEF_WORD)
    142         return sizeof(WORD);
    143     else if(type==DEF_SBYTE||type==DEF_BYTE || type == DEF_BOOLEAN)
    144         return sizeof(BYTE);
    145 
    146     //実数型
    147     else if(type==DEF_DOUBLE)       return sizeof(double);
    148     else if(type==DEF_SINGLE)       return sizeof(float);
    149 
    150     //文字型
    151     else if( type == DEF_CHAR ){
    152         if( isUnicode ) return sizeof( WORD );
    153         return sizeof( BYTE );
    154     }
    155 
    156     //ポインタ型
    157     else if(IsPtrType(type))        return PTR_SIZE;
    158 
    159     else if( type == DEF_STRUCT ){
    160         CClass *pobj_c;
    161         pobj_c=(CClass *)lpIndex;
    162         if(!pobj_c){
    163             SetError(300,NULL,cp);
    164             return 0;
    165         }
    166 
    167         return pobj_c->GetSize();
    168     }
    169 
    170     else if(type==DEF_OBJECT){
    171         return PTR_SIZE;
    172     }
    173     else{
    174         SetError(300,NULL,cp);
    175     }
    176     return 0;
    177 }
    178 int GetPtrType(int type,LONG_PTR lpIndex){
    179     return MAKE_PTR_TYPE(NATURAL_TYPE(type),PTR_LEVEL(type)+1);
    180 }
    181 int GetTypeFixed(const char *TypeName,LONG_PTR *lpNum){
    182     int type;
    183 
    184     if(lpNum) *lpNum=-1;
    185 
    186     if(TypeName[0]=='*'){
    187         if(TypeName[1]==1&&(TypeName[2]==ESC_FUNCTION||TypeName[2]==ESC_SUB)){
    188             //関数ポインタ(*Function)
    189             return DEF_PTR_PROC;
    190         }
    191 
    192         type=GetTypeFixed(TypeName+1,lpNum);
    193         if(type==-1) return -1;
    194 
    195         return GetPtrType(type,*lpNum);
    196     }
    197 
    198     //整数型
    199     if(lstrcmpi(TypeName,"SByte")==0)           return DEF_SBYTE;
    200     else if(lstrcmpi(TypeName,"Byte")==0)       return DEF_BYTE;
    201     else if(lstrcmpi(TypeName,"Integer")==0)    return DEF_INTEGER;
    202     else if(lstrcmpi(TypeName,"WORD")==0)       return DEF_WORD;
    203     else if(lstrcmpi(TypeName,"Long")==0)       return DEF_LONG;
    204     else if(lstrcmpi(TypeName,"DWORD")==0)      return DEF_DWORD;
    205     else if(lstrcmpi(TypeName,"Int64")==0)      return DEF_INT64;
    206     else if(lstrcmpi(TypeName,"QWORD")==0)      return DEF_QWORD;
    207 
    208     //実数型
    209     else if(lstrcmpi(TypeName,"Single")==0)     return DEF_SINGLE;
    210     else if(lstrcmpi(TypeName,"Double")==0)     return DEF_DOUBLE;
    211 
    212     //文字型
    213     //else if( lstrcmpi( TypeName, "Char" ) == 0 ) return DEF_CHAR;
    214 
    215     //bool型
    216     else if( lstrcmpi( TypeName, "Boolean" ) == 0 ) return DEF_BOOLEAN;
    217 
    218     //ポインタ型
    219     //※VoidPtr型以外のポインタ型はTypeDef宣言により定義される
    220     else if(lstrcmpi(TypeName,"VoidPtr")==0)    return DEF_PTR_VOID;
    221 
    222     //その他
    223     else if(lstrcmpi(TypeName,"Any")==0)        return DEF_ANY;
    224 
    225 
    226     ////////////////////
    227     // TypeDefされた型
    228     ////////////////////
    229     int i;
    230     i=pobj_DBTypeDef->check(TypeName);
    231     if(i!=-1){
    232         return GetTypeFixed(pobj_DBTypeDef->ppobj_TypeDef[i]->lpszBaseName,lpNum);
    233     }
    234 
    235     if(!lpNum) return -1;
    236 
    237     //クラス
    238     CClass *pobj_c;
    239     pobj_c=pobj_DBClass->check(TypeName);
    240     if(pobj_c){
    241         *lpNum=(LONG_PTR)pobj_c;
    242 
    243         if( pobj_c->IsStructure() ){
    244             return DEF_STRUCT;
    245         }
    246         else{
    247             return DEF_OBJECT;
    248         }
    249     }
    250 
    251     return -1;
    252 }
    253 void GetOriginalTypeName(char *buffer){
    254     // TypeDefされた型に対して、オリジナルの型の名前に変更する
    255 
    256     if(buffer[0]=='*'){
    257         if(buffer[1]==1&&(buffer[2]==ESC_FUNCTION||buffer[2]==ESC_SUB)) return;
    258 
    259         GetOriginalTypeName(buffer+1);
    260         return;
    261     }
    262 
    263     int i;
    264     i=pobj_DBTypeDef->check(buffer);
    265     if(i!=-1){
    266         lstrcpy(buffer,pobj_DBTypeDef->ppobj_TypeDef[i]->lpszBaseName);
    267         GetOriginalTypeName(buffer);
    268     }
    269 }
    270 BOOL GetTypeName(int type,LONG_PTR lpIndex,char *name){
    271     if(PTR_LEVEL(type)){
    272         //ポインタ型
    273         name[0]='*';
    274         return GetTypeName(MAKE_PTR_TYPE(NATURAL_TYPE(type),PTR_LEVEL(type)-1),lpIndex,name+1);
    275     }
    276 
    277     //整数型
    278     if(type==DEF_SBYTE)             lstrcpy(name,"SByte");
    279     else if(type==DEF_BYTE)         lstrcpy(name,"Byte");
    280     else if(type==DEF_INTEGER)      lstrcpy(name,"Integer");
    281     else if(type==DEF_WORD)         lstrcpy(name,"Word");
    282     else if(type==DEF_LONG)         lstrcpy(name,"Long");
    283     else if(type==DEF_DWORD)        lstrcpy(name,"DWord");
    284     else if(type==DEF_INT64)        lstrcpy(name,"Int64");
    285     else if(type==DEF_QWORD)        lstrcpy(name,"QWord");
    286 
    287     //実数型
    288     else if(type==DEF_SINGLE)       lstrcpy(name,"Single");
    289     else if(type==DEF_DOUBLE)       lstrcpy(name,"Double");
    290 
    291     //文字型
    292     //else if(type==DEF_CHAR)               lstrcpy(name,"Char");
    293 
    294     //bool型
    295     else if(type==DEF_BOOLEAN)      lstrcpy(name,"Boolean");
    296 
    297     //オブジェクト
    298     else if(type==DEF_OBJECT || type==DEF_STRUCT){
    299         if(lpIndex==0) lstrcpy(name,"non");
    300         else{
    301             lstrcpy(name,((CClass *)lpIndex)->name);
    302         }
    303     }
    304 
    305     //ポインタ型
    306     else if(type==DEF_PTR_VOID)     lstrcpy(name,"VoidPtr");
    307 
    308     else if(type==DEF_PTR_PROC){
    309         if(lpIndex==-1) lstrcpy(name,"VoidPtr");
    310         else{
    311             extern PROCPTRINFO *pProcPtrInfo;
    312             if(pProcPtrInfo[lpIndex].ReturnType==DEF_NON)
    313                 lstrcpy(name,"*Sub");
    314             else lstrcpy(name,"*Function");
    315         }
    316     }
    317 
    318     else{
    319         extern int cp;
    320         SetError(1,NULL,cp);
    321         return 0;
    322     }
    323     return 1;
    324 }
    325 
    326 TYPEINFO GetStringTypeInfo(){
    327     extern CClass *pobj_StringClass;
    328     TYPEINFO TypeInfo = { DEF_OBJECT, (LONG_PTR)pobj_StringClass };
    329     return TypeInfo;
    330 }
    331 
    332 bool FormatUseProcReturnObject( const char *term, char *procName, char *parameter, CClass::RefType &refType, char *member ){
    333     int p1 = 0, p2 = 0;
    334 
    335     for( int i=0; term[i]!='\0' ; i++ ){
    336 
    337         if( term[i] == '[' ){
    338             i = JumpStringInBracket( term, i + 1 );
    339             if( term[i] == '\0' ) break;
    340             continue;
    341         }
    342         if( term[i] == '(' ){
    343             int temp_p = i;
    344             i = JumpStringInPare( term, i + 1 ) + 1;
    345             if( term[i] == '\0' ) break;
    346             if( term[i] == '.'
    347                 || term[i] == 1 && term[i] == ESC_PSMEM ){
    348                     p1 = temp_p;
    349                     p2 = i;
    350             }
    351             continue;
    352         }
    353     }
    354     if( !p1 ) return false;
    355 
    356     //メソッド名
    357     memcpy( procName, term, p1 );
    358     procName[p1] = 0;
    359 
    360     //パラメータ
    361     memcpy( parameter, term + p1 + 1, p2 - p1 - 2 );
    362     parameter[ p2 - p1 - 2 ] = 0;
    363 
    364     //参照タイプ
    365     if( term[p2] == '.' ){
    366         refType = CClass::Dot;
    367     }
    368     else{
    369         refType = CClass::Pointer;
    370         p2++;
    371     }
    372 
    373     //メンバ
    374     lstrcpy( member, term + p2 + 1 );
    375 
    376     return true;
    377 }
    378 
    379 BOOL GetVarFormatString(char *buffer,char *array,char *array2,char *NestMember,CClass::RefType &refType){
    380     extern int cp;
    381     int i,i2,i3;
    382     char cPare_Open,cPare_Close;
    383 
    384     array[0]=0;
    385     array2[0]=0;
    386     NestMember[0]=0;
    387     for(i=0;;i++){
    388         if(buffer[i]=='\"'){
    389             for(i++;;i++){
    390                 if(IsDBCSLeadByte(buffer[i])){
    391                     i++;
    392                     continue;
    393                 }
    394                 if(buffer[i]=='\"') break;
    395             }
    396         }
    397         if(buffer[i]=='['||buffer[i]=='('){
    398             if(buffer[i]=='['){
    399                 cPare_Open='[';
    400                 cPare_Close=']';
    401             }
    402             else{
    403                 cPare_Open='(';
    404                 cPare_Close=')';
    405             }
    406             buffer[i]=0;
    407             for(i++,i2=0;;i++,i2++){
    408                 if(buffer[i]==cPare_Open){
    409                     if(cPare_Open=='[') i3=GetStringInBracket(array+i2,buffer+i);
    410                     else i3=GetStringInPare(array+i2,buffer+i);
    411                     i+=i3-1;
    412                     i2+=i3-1;
    413                     continue;
    414                 }
    415                 if(buffer[i]==cPare_Close){
    416                     array[i2]=0;
    417                     break;
    418                 }
    419                 array[i2]=buffer[i];
    420             }
    421             if(buffer[i+1]==cPare_Open){
    422                 for(i+=2,i2=0;;i++,i2++){
    423                     if(buffer[i]==cPare_Open){
    424                         if(cPare_Open=='[') i3=GetStringInBracket(array2+i2,buffer+i);
    425                         else i3=GetStringInPare(array2+i2,buffer+i);
    426                         i+=i3-1;
    427                         i2+=i3-1;
    428                         continue;
    429                     }
    430                     if(buffer[i]==cPare_Close){
    431                         array2[i2]=0;
    432                         break;
    433                     }
    434                     array2[i2]=buffer[i];
    435                 }
    436                 if(buffer[i+1]==cPare_Open){
    437                     SetError(14,buffer,cp);
    438                     return 0;
    439                 }
    440             }
    441             continue;
    442         }
    443         if(buffer[i]=='.'){
    444             lstrcpy(NestMember,buffer+i+1);
    445             refType = CClass::Dot;
    446             buffer[i]=0;
    447             break;
    448         }
    449         if(buffer[i]==1&&buffer[i+1]==ESC_PSMEM){
    450             lstrcpy(NestMember,buffer+i+2);
    451             refType = CClass::Pointer;
    452             buffer[i]=0;
    453             break;
    454         }
    455         if(buffer[i]=='\0') break;
    456     }
    457     return 1;
    458 }
    459 
    460 void GetArrayElement(char *buffer,char *variable,char *array_element){
    461     array_element[0]=0;
    462 
    463     if(buffer[lstrlen(buffer)-1]!=']'){
    464         lstrcpy(variable,buffer);
    465         return;
    466     }
    467 
    468     int i,i2;
    469     for(i=0;;i++){
    470         if(buffer[i]=='\0') break;
    471         if(buffer[i]=='['){
    472             i2=GetStringInBracket(array_element,buffer+i);
    473             i+=i2-1;
    474             continue;
    475         }
    476     }
    477 
    478     lstrcpy(variable,buffer);
    479     variable[lstrlen(variable)-lstrlen(array_element)]=0;
    480 
    481     RemoveStringBracket(array_element);
    482 }
    483 
    484 BOOL CheckVarNameError(char *name,int NowLine){
    485     int i2;
    486 
    487     if(!IsVariableTopChar(name[0])){
    488         SetError(1,NULL,NowLine);
    489         return 0;
    490     }
    491     for(i2=1;;i2++){
    492         if(name[i2]=='\0') break;
    493         if(!IsVariableChar(name[i2])){
    494             SetError(1,NULL,NowLine);
    495             return 0;
    496         }
    497     }
    498     return 1;
    499 }
    500 
    501 int JumpSubScripts(int *ss){
    502     //DIMで定義された並んだ配列の数だけアドレスを進める
    503     int i,i2;
    504     for(i=0,i2=1;i<255;i++){
    505         if(ss[i]==-1) break;
    506         i2*=ss[i]+1;
    507     }
    508     return i2;
    509 }
    510 void GetArrange(char *variable,char *variAnswer,int *SubScripts){
    511     extern int cp;
    512     int i,i2,i3,i4;
    513     double dbl;
    514     _int64 i64data;
    515     BOOL bBracket;
    516     char temporary[VN_SIZE];
    517 
    518     for(i=0;;i++){
    519         if(variable[i]=='('||variable[i]=='['){
    520             if(variable[i]=='[') bBracket=1;
    521             else bBracket=0;
    522 
    523             variAnswer[i]=0;
    524             for(i++,i2=0,i3=0;;i++,i2++){
    525                 if(variable[i]==','){
    526                     temporary[i2]=0;
    527 
    528                     i2=StaticCalculation(true, temporary,0,&i64data,0);
    529                     if(IsRealNumberType(i2)){
    530                         memcpy(&dbl,&i64data,sizeof(double));
    531                         i64data=(_int64)dbl;
    532                     }
    533 
    534                     if(i64data<0){
    535                         //error
    536                         SubScripts[i3]=0;
    537                     }
    538                     else SubScripts[i3]=(int)i64data;
    539                     i3++;
    540                     i2=-1;
    541                     continue;
    542                 }
    543                 if(variable[i]=='('){
    544                     i4=GetStringInPare(temporary+i2,variable+i);
    545                     i2+=i4-1;
    546                     i+=i4-1;
    547                     continue;
    548                 }
    549                 if(variable[i]=='['){
    550                     i4=GetStringInBracket(temporary+i2,variable+i);
    551                     i2+=i4-1;
    552                     i+=i4-1;
    553                     continue;
    554                 }
    555                 if(variable[i]==')'&&bBracket==0||
    556                     variable[i]==']'&&bBracket){
    557                     temporary[i2]=0;
    558                     if(i2==0){
    559                         SubScripts[i3]=-2;
    560                         break;
    561                     }
    562 
    563                     i2=StaticCalculation(true, temporary,0,&i64data,0);
    564                     if(IsRealNumberType(i2)){
    565                         memcpy(&dbl,&i64data,sizeof(double));
    566                         i64data=(_int64)dbl;
    567                     }
    568 
    569                     if(i64data<0){
    570                         //error
    571                         SubScripts[i3]=0;
    572                     }
    573                     else SubScripts[i3]=(int)i64data;
    574                     SubScripts[i3+1]=-1;
    575                     break;
    576                 }
    577                 if(variable[i]=='\"'){
    578                     SetError(1,NULL,cp);
    579                     return;
    580                 }
    581                 temporary[i2]=variable[i];
    582             }
    583             break;
    584         }
    585         variAnswer[i]=variable[i];
    586         if(variable[i]=='\0'){
    587             SubScripts[0]=-1;
    588             break;
    589         }
    590     }
    591 }
    592 
    593 int GetTypeFromSimpleName(char *variable){
    594     extern char DefIntVari[26],DefSngVari[26],DefStrVari[26],divNum,dsvNum,dStrvNum;
    595     int i;
    596     char name[VN_SIZE];
    597 
    598     //構造体メンバの場合を考慮
    599     for(i=lstrlen(variable);i>0;i--){
    600         if(variable[i]=='.'){
    601             i++;
    602             break;
    603         }
    604     }
    605 
    606     for(;;i++){
    607         if(variable[i]=='('||variable[i]=='\0'){
    608             name[i]=0;
    609             break;
    610         }
    611         name[i]=variable[i];
    612     }
    613     //変数名から選択
    614     i--;
    615     if(name[i]=='#') return DEF_DOUBLE;
    616     if(name[i]=='!') return DEF_SINGLE;
    617     if(name[i]=='%') return DEF_INTEGER;
    618     return DEF_DOUBLE;
    619 }
    620 
    621 
    622 int GetMemberType(CClass *pobj_c,char *member,LONG_PTR *plpNestIndex,BOOL bPrivateAccess,BOOL bError){
    623     extern int cp;
    624     int i;
    625 
    626     //クラス、配列の構成要素を解析する
    627     char VarName[VN_SIZE];      //変数名
    628     char array[VN_SIZE];        //第1次配列
    629     char lpPtrOffset[VN_SIZE];      //第2次配列
    630     char NestMember[VN_SIZE];   //入れ子メンバ
    631     CClass::RefType refType = CClass::Non;
    632     lstrcpy(VarName,member);
    633     if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember,refType)) return 0;
    634 
    635     for(i=0;i<pobj_c->iMemberNum;i++){
    636         if(lstrcmp(pobj_c->ppobj_Member[i]->name,VarName)==0) break;
    637     }
    638     if(i==pobj_c->iMemberNum){
    639         if(bError) SetError(103,VarName,cp);
    640         return -1;
    641     }
    642 
    643     //アクセシビリティをチェック
    644     if(pobj_c==pobj_CompilingClass){
    645         //同一クラスオブジェクトの場合はプライベートアクセスを容認する
    646         if(pobj_c->ppobj_Member[i]->dwAccess==ACCESS_NON){
    647             if(bError) SetError(107,VarName,cp);
    648             return -1;
    649         }
    650     }
    651     else{
    652         if((bPrivateAccess==0&&pobj_c->ppobj_Member[i]->dwAccess==ACCESS_PRIVATE)||
    653             pobj_c->ppobj_Member[i]->dwAccess==ACCESS_NON){
    654             if(bError) SetError(107,VarName,cp);
    655             return -1;
    656         }
    657         else if(bPrivateAccess==0&&pobj_c->ppobj_Member[i]->dwAccess==ACCESS_PROTECTED){
    658             if(bError) SetError(108,VarName,cp);
    659             return -1;
    660         }
    661     }
    662 
    663     int type;
    664     type=pobj_c->ppobj_Member[i]->TypeInfo.type;
    665     *plpNestIndex=pobj_c->ppobj_Member[i]->TypeInfo.u.lpIndex;
    666 
    667     //ポインタ変数の場合
    668     if(IsPtrType(type)){
    669         if(pobj_c->ppobj_Member[i]->SubScripts[0]==-1){
    670             lstrcpy(lpPtrOffset,array);
    671             array[0]=0;
    672         }
    673     }
    674     else{
    675         if(lpPtrOffset[0]){
    676             if(bError) SetError(16,member,cp);
    677             return 0;
    678         }
    679     }
    680 
    681     if( refType != CClass::Non ){
    682         //入れ子構造の場合
    683 
    684         return GetMemberType(pobj_c->ppobj_Member[i]->TypeInfo.u.pobj_Class,
    685             NestMember,
    686             plpNestIndex,
    687             0,
    688             bError);
    689     }
    690 
    691     if(array[0]==0&&pobj_c->ppobj_Member[i]->SubScripts[0]!=-1){
    692         return type|FLAG_PTR;
    693     }
    694 
    695     if(lpPtrOffset[0]){
    696         if(PTR_LEVEL(type)){
    697             type=MAKE_PTR_TYPE(NATURAL_TYPE(type),PTR_LEVEL(type)-1);
    698         }
    699         else{
    700             //エラー
    701             if(bError) SetError(1,NULL,cp);
    702             return -1;
    703         }
    704     }
    705 
    706     return type;
    707 }
    708 int GetVarType(const char *NameBuffer,LONG_PTR *plpIndex,BOOL bError){
    709     extern BOOL bCompilingGlobal;
    710     int i;
    711     LONG_PTR lpIndex;
    712     char variable[VN_SIZE],member[VN_SIZE],VarName[VN_SIZE],array[VN_SIZE],lpPtrOffset[VN_SIZE];
    713 
    714     if(NameBuffer[0]=='.'){
    715         GetWithName(variable);
    716         lstrcat(variable,NameBuffer);
    717     }
    718     else lstrcpy(variable,NameBuffer);
    719 
    720 
    721     CClass::RefType refType;
    722     if( FormatUseProcReturnObject( variable, VarName, array, refType, member ) ){
    723         // 戻り値オブジェクトのメンバを直接参照しているとき
    724         //例: func().member
    725 
    726         void *pInfo;
    727         int idProc=GetProc(VarName,&pInfo);
    728 
    729         if(idProc){
    730 
    731             int type=GetReturnTypeOfProc(idProc,pInfo,VarName,array,&lpIndex);
    732 
    733             return GetMemberType((CClass *)lpIndex,member,plpIndex,1,bError);
    734         }
    735     }
    736 
    737 
    738 
    739     lstrcpy(VarName,variable);
    740     GetVarFormatString(VarName,array,lpPtrOffset,member,refType);
    741 
    742     int *pSubScripts;
    743     int type;
    744 
    745     extern int MaxGlobalVarNum;
    746     extern VARIABLE *GlobalVar;
    747     extern int MaxLocalVarNum;
    748     extern VARIABLE *LocalVar;
    749 
    750     if(bCompilingGlobal==0){
    751         /////////////////
    752         // ローカル変数
    753         /////////////////
    754 
    755         for(i=MaxLocalVarNum-1;i>=0;i--){   //レキシカルスコープを考慮してバックサーチ
    756             if( LocalVar[i].bLiving                                         //現在のスコープで有効なもの
    757                 && LocalVar[i].ScopeLevel <= obj_LexScopes.GetNowLevel()    //現在のスコープレベルを超さないもの(Returnによる解放処理中を考慮)
    758                 ){
    759                     if(lstrcmp(VarName,LocalVar[i].name)==0) break;
    760             }
    761         }
    762         if(i>=0){
    763             //ポインタ変数の場合
    764             if(IsPtrType(LocalVar[i].type)){
    765                 if(LocalVar[i].SubScripts[0]==-1){
    766                     lstrcpy(lpPtrOffset,array);
    767                     array[0]=0;
    768                 }
    769             }
    770             else{
    771                 if(lpPtrOffset[0]){
    772                     if(bError) SetError(16,variable,cp);
    773                     return -1;
    774                 }
    775             }
    776 
    777             type=LocalVar[i].type;
    778             lpIndex=LocalVar[i].u.index;
    779             pSubScripts=LocalVar[i].SubScripts;
    780 
    781             goto ok;
    782         }
    783     }
    784 
    785     if(pobj_CompilingClass){
    786         ///////////////////////
    787         // クラスメンバの参照
    788         ///////////////////////
    789 
    790         if(lstrcmpi(variable,"This")==0){
    791             //Thisオブジェクト
    792             *plpIndex=(LONG_PTR)pobj_CompilingClass;
    793             return DEF_OBJECT;
    794         }
    795 
    796         if(_memicmp(variable,"This.",5)==0){
    797             //Thisオブジェクトのメンバを参照するとき
    798             SlideString(variable+5,-5);
    799             lstrcpy(VarName,variable);
    800         }
    801         else{
    802             //クラス内メンバを参照するとき(通常)
    803 
    804             for(i=0;i<pobj_CompilingClass->iMemberNum;i++){
    805                 if(lstrcmp(VarName,pobj_CompilingClass->ppobj_Member[i]->name)==0) break;
    806             }
    807             if(i==pobj_CompilingClass->iMemberNum) goto NonClassMember;
    808         }
    809 
    810         return GetMemberType(pobj_CompilingClass,variable,plpIndex,1,bError);
    811     }
    812 
    813 NonClassMember:
    814 
    815     //////////////////////////
    816     // 静的ローカル変数
    817     // ※"Static.Object.Method.Variable"
    818     //////////////////////////
    819 
    820     char temporary[VN_SIZE];
    821     extern SubInfo *pCompilingSubInfo;
    822     if(pCompilingSubInfo){
    823         GetNowStaticVarFullName(VarName,temporary);
    824 
    825         for(i=0;i<MaxGlobalVarNum;i++){
    826             if(lstrcmp(temporary,GlobalVar[i].name)==0) break;
    827         }
    828         if(i!=MaxGlobalVarNum){
    829             goto GlobalOk;
    830         }
    831     }
    832 
    833 
    834     //////////////////////////
    835     // クラスの静的メンバ
    836     //////////////////////////
    837 
    838     if(member[0]){
    839         lstrcpy(temporary,member);
    840         char tempMember[VN_SIZE];
    841         char tempArray[VN_SIZE];
    842         {
    843             CClass::RefType refType;
    844             GetVarFormatString(temporary,tempArray,lpPtrOffset,tempMember,refType);
    845         }
    846 
    847         char temp2[VN_SIZE];
    848         sprintf(temp2,"%s.%s",VarName,temporary);
    849         for(i=0;i<MaxGlobalVarNum;i++){
    850             if(lstrcmp(temp2,GlobalVar[i].name)==0) break;
    851         }
    852 
    853         if(i!=MaxGlobalVarNum){
    854             lstrcpy(member,tempMember);
    855             lstrcpy(array,tempArray);
    856             goto GlobalOk;
    857         }
    858     }
    859 
    860     if(pobj_CompilingClass){
    861         //自身のクラスから静的メンバを参照する場合
    862         char temp2[VN_SIZE];
    863         sprintf(temp2,"%s.%s",pobj_CompilingClass->name,VarName);
    864         for(i=0;i<MaxGlobalVarNum;i++){
    865             if(lstrcmp(temp2,GlobalVar[i].name)==0) break;
    866         }
    867 
    868         if(i!=MaxGlobalVarNum){
    869             goto GlobalOk;
    870         }
    871     }
    872 
    873 
    874     ////////////////////
    875     // グローバル変数
    876     ////////////////////
    877 
    878     for(i=MaxGlobalVarNum-1;i>=0;i--){  //レキシカルスコープを考慮してバックサーチ
    879         if( GlobalVar[i].bLiving                                        //現在のスコープで有効なもの
    880             && GlobalVar[i].ScopeLevel <= obj_LexScopes.GetNowLevel()   //現在のスコープレベルを超さないもの(Returnによる解放処理中を考慮)
    881             ){
    882                 if(lstrcmp(VarName,GlobalVar[i].name)==0) break;
    883         }
    884     }
    885 
    886     if(i>=0){
    887         goto GlobalOk;
    888     }
    889 
    890     //変数として見つからなかったとき
    891     if(bError) SetError(3,variable,cp);
    892     return -1;
    893 
    894 GlobalOk:
    895 
    896     //ポインタ変数の場合
    897     if(IsPtrType(GlobalVar[i].type)){
    898         if(GlobalVar[i].SubScripts[0]==-1){
    899             lstrcpy(lpPtrOffset,array);
    900             array[0]=0;
    901         }
    902     }
    903     else{
    904         if(lpPtrOffset[0]){
    905             if(bError) SetError(16,variable,cp);
    906             return -1;
    907         }
    908     }
    909 
    910     type=GlobalVar[i].type;
    911     lpIndex=GlobalVar[i].u.index;
    912     pSubScripts=GlobalVar[i].SubScripts;
    913 
    914 ok:
    915 
    916     if(member[0]){
    917         if( NATURAL_TYPE(type)==DEF_OBJECT
    918             || NATURAL_TYPE(type)==DEF_STRUCT){
    919                 return GetMemberType((CClass *)lpIndex,member,plpIndex,0,bError);
    920         }
    921     }
    922 
    923     if(array[0]==0&&pSubScripts[0]!=-1){
    924         //配列の先頭ポインタを示す場合
    925         type|=FLAG_PTR;
    926     }
    927 
    928     if(lpPtrOffset[0]){
    929         if(PTR_LEVEL(type)){
    930             type=MAKE_PTR_TYPE(NATURAL_TYPE(type),PTR_LEVEL(type)-1);
    931         }
    932         else{
    933             //エラー
    934             if(bError) SetError(1,NULL,cp);
    935             return -1;
    936         }
    937     }
    938 
    939     *plpIndex=lpIndex;
    940     return type;
    941 }
    942 
    943 BOOL GetVarOffsetReadOnly(const char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss ){
    944     //読み取り専用で変数へアクセス
    945     return GetVarOffset(
    946         true,       //エラー表示有効
    947         false,      //書き込みアクセスは無し
    948         NameBuffer,
    949         pType,
    950         pRelativeVar,
    951         plpIndex,
    952         pss);
    953 }
    954 BOOL GetVarOffsetReadWrite(const char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss ){
    955     //読み書き両用で変数へアクセス
    956     return GetVarOffset(
    957         true,       //エラー表示有効
    958         true,       //書き込みアクセス
    959         NameBuffer,
    960         pType,
    961         pRelativeVar,
    962         plpIndex,
    963         pss);
    964 }
    965 
    966 
    967 
    968 BOOL GetDimentionFormat(const char *buffer, const bool isRef, char *VarName,int *SubScripts,TYPEINFO *pTypeInfo,char *InitBuf,char *ConstractParameter){
    969     int i,i2,i3,IsStr;
    970     char variable[VN_SIZE],temporary[8192];
    971 
    972     for(i=0;;i++){
    973         if((buffer[i]==1&&buffer[i+1]==ESC_AS)||
    974             buffer[i]=='='||
    975             buffer[i]=='\0'){
    976             variable[i]=0;
    977             break;
    978         }
    979         variable[i]=buffer[i];
    980     }
    981 
    982     if(buffer[i]=='='){
    983         ////////////////////////////////////
    984         // 初期化データが指定されいるとき
    985         ////////////////////////////////////
    986 
    987         for(i++,i2=0,IsStr=0;;i++,i2++){
    988             if(buffer[i]=='\"') IsStr^=1;
    989             if(buffer[i]=='('&&IsStr==0){
    990                 i3=GetStringInPare(InitBuf+i2,buffer+i);
    991                 i+=i3-1;
    992                 i2+=i3-1;
    993                 continue;
    994             }
    995             if(buffer[i]=='['&&IsStr==0){
    996                 i3=GetStringInBracket(InitBuf+i2,buffer+i);
    997                 i+=i3-1;
    998                 i2+=i3-1;
    999                 continue;
    1000             }
    1001             if((buffer[i]==1&&buffer[i+1]==ESC_AS)||
    1002                 (buffer[i]==','&&IsStr==0)||
    1003                 buffer[i]=='\0'){
    1004                 InitBuf[i2]=0;
    1005                 break;
    1006             }
    1007             InitBuf[i2]=buffer[i];
    1008         }
    1009     }
    1010     else{
    1011         //初期化データなし
    1012         InitBuf[0]=0;
    1013     }
    1014 
    1015     ConstractParameter[0]=0;
    1016     if(buffer[i]==1&&buffer[i+1]==ESC_AS){
    1017         /////////////////////////////
    1018         // "As ~" による型指定あり
    1019         /////////////////////////////
    1020 
    1021         for(i+=2,i2=0;;i++,i2++){
    1022             if(buffer[i]==','||buffer[i]=='('||buffer[i]=='\0'){
    1023                 temporary[i2]=0;
    1024                 break;
    1025             }
    1026             temporary[i2]=buffer[i];
    1027         }
    1028         pTypeInfo->type=GetTypeFixed(temporary,&pTypeInfo->u.lpIndex);
    1029         if(pTypeInfo->type==-1){
    1030             SetError(3,temporary,cp);
    1031             pTypeInfo->type=DEF_LONG;
    1032         }
    1033 
    1034         if(pTypeInfo->type==DEF_PTR_PROC){
    1035             if(temporary[0]=='*'&&
    1036                 temporary[1]==1&&
    1037                 (temporary[2]==ESC_FUNCTION||temporary[2]==ESC_SUB)){
    1038                 if(buffer[i]!='('){
    1039                     SetError(10,temporary,cp);
    1040                     return 0;
    1041                 }
    1042                 i3=GetStringInPare(temporary+3,buffer+i);
    1043                 i+=i3;
    1044                 i2+=i3;
    1045 
    1046                 if(temporary[2]==ESC_FUNCTION&&buffer[i]==1&&buffer[i+1]==ESC_AS){
    1047                     temporary[i2++]=buffer[i++];
    1048                     temporary[i2++]=buffer[i++];
    1049                     for(;;i++,i2++){
    1050                         if(!IsVariableChar(buffer[i])){
    1051                             temporary[i2]=0;
    1052                             break;
    1053                         }
    1054                         temporary[i2]=buffer[i];
    1055                     }
    1056                 }
    1057             }
    1058             else{
    1059                 //TypeDefをする前のベース型を取得
    1060                 GetOriginalTypeName(temporary);
    1061             }
    1062 
    1063             if(temporary[3]!='('){
    1064                 SetError(10,temporary,cp);
    1065                 return 0;
    1066             }
    1067 
    1068             //関数ポインタ
    1069             pTypeInfo->u.lpIndex=AddProcPtrInfo(temporary+3,temporary[2]);
    1070         }
    1071 
    1072         if(buffer[i]=='('){
    1073             //コンストラクタに渡すパラメータを取得
    1074             i2=GetStringInPare(ConstractParameter,buffer+i);
    1075             i+=i2;
    1076             RemoveStringPare(ConstractParameter);
    1077 
    1078             if(pTypeInfo->type!=DEF_OBJECT){
    1079                 SetError(112,variable,cp);
    1080                 return 0;
    1081             }
    1082         }
    1083     }
    1084     else{
    1085         /////////////////
    1086         // As指定なし
    1087         /////////////////
    1088 
    1089         if( InitBuf[0] == '\0' ){
    1090             //As指定も、初期値指定もない場合
    1091             pTypeInfo->type=GetTypeFromSimpleName(variable);
    1092 
    1093             i2=lstrlen(variable)-1;
    1094             if(i2>=0){
    1095                 if(!(variable[i2]=='#'||variable[i2]=='!'||variable[i2]=='%'||variable[i2]=='$'))
    1096                     SetError(-103,variable,cp);
    1097             }
    1098         }
    1099         else{
    1100             //初期値の型を判別して自動的に型情報を付加する
    1101             TYPEINFO BaseType = GetStringTypeInfo();
    1102             int result = NumOpe_GetType_Old( InitBuf, &BaseType, &pTypeInfo->u.lpIndex );
    1103 
    1104             //エラーの場合
    1105             if( result == -1 ) return 0;
    1106 
    1107             pTypeInfo->type = result;
    1108         }
    1109 
    1110     }
    1111 
    1112     if( InitBuf[0] != '\0' && ConstractParameter[0] != '\0' ){
    1113         //初期値とコンストラクタパラメータが同時に呼び出されているとき
    1114         SetError(132, NULL, cp);
    1115     }
    1116 
    1117     /*
    1118     TODO: 消す
    1119     if( pTypeInfo->type == DEF_OBJECT && InitBuf[0] != '\0' && InitBuf[0] != '[' && isRef == false ){
    1120         if( pTypeInfo->u.pobj_Class->GetCopyConstructorMethod() ){
    1121             //オブジェクトでコピーコンストラクタが存在するとき
    1122             lstrcpy( ConstractParameter, InitBuf );
    1123             InitBuf[0] = 0;
    1124         }
    1125     }*/
    1126 
    1127     GetArrange(variable,VarName,SubScripts);
    1128     return 1;
    1129 }
    1130 
    1131 BOOL GetNowStaticVarFullName(char *VarName,char *FullName){
    1132     extern SubInfo *pCompilingSubInfo;
    1133     if(!pCompilingSubInfo) return 0;
    1134 
    1135     //Static識別
    1136     lstrcpy(FullName,"Static%");
    1137 
    1138     //クラス名
    1139     if(pobj_CompilingClass){
    1140         lstrcat(FullName,pobj_CompilingClass->name);
    1141         lstrcat(FullName,"%");
    1142     }
    1143 
    1144     //関数(またはメソッド)名
    1145     lstrcat(FullName,pCompilingSubInfo->name);
    1146     lstrcat(FullName,"%");
    1147 
    1148     //ID
    1149     char temp[255];
    1150     sprintf(temp,"%x",pCompilingSubInfo->id);
    1151     lstrcat(FullName,temp);
    1152     lstrcat(FullName,"%");
    1153 
    1154     //変数名
    1155     lstrcat(FullName,VarName);
    1156 
    1157     return 1;
    1158 }
    1159 
    1160 
    1161 void AddGlobalVariable(bool isRef, char *name,int *SubScripts,TYPEINFO *pTypeInfo,int TypeSize,char *InitBuf,char *ConstractParameter,DWORD dwFlag){
    1162     /////////////////////////
    1163     // グローバル変数を追加
    1164     /////////////////////////
    1165     extern VARIABLE *GlobalVar;
    1166     extern int MaxGlobalVarNum;
    1167     extern int AllInitGlobalVarSize;
    1168     extern int AllGlobalVarSize;
    1169 
    1170     int i2,i3,VarSize;
    1171 
    1172     for(i2=0;i2<MaxGlobalVarNum;i2++){
    1173         if(GlobalVar[i2].bLiving&&obj_LexScopes.GetNowLevel()==GlobalVar[i2].ScopeLevel){
    1174             if(lstrcmp(GlobalVar[i2].name,name)==0){
    1175                 //2重定義のエラー
    1176                 SetError(15,name,cp);
    1177                 return;
    1178             }
    1179         }
    1180     }
    1181 
    1182     GlobalVar=(VARIABLE *)HeapReAlloc(hHeap,0,GlobalVar,(MaxGlobalVarNum+1)*sizeof(VARIABLE));
    1183     VARIABLE *pVar = &GlobalVar[MaxGlobalVarNum];
    1184     MaxGlobalVarNum++;
    1185 
    1186     if( isRef ){
    1187         //参照型
    1188         pVar->fRef = REF_VARIABLE;
    1189         TypeSize = PTR_SIZE;
    1190     }
    1191     else pVar->fRef=0;
    1192 
    1193     for(i2=1,i3=0;i3<255;i3++){
    1194         //配列要素数
    1195         pVar->SubScripts[i3]=SubScripts[i3];
    1196 
    1197         if(SubScripts[i3]==-1) break;
    1198         i2*=SubScripts[i3]+1;
    1199     }
    1200     VarSize=TypeSize*i2;
    1201     if(VarSize%PTR_SIZE) VarSize+=PTR_SIZE-(VarSize%PTR_SIZE);
    1202 
    1203     lstrcpy(pVar->name,name);
    1204     if(dwFlag & DIMFLAG_CONST) pVar->bConst = true;
    1205     else pVar->bConst = false;
    1206     if(SubScripts[0]==-1) pVar->bArray=0;
    1207     else pVar->bArray=1;
    1208     pVar->type=pTypeInfo->type;
    1209     pVar->u.index=pTypeInfo->u.lpIndex;
    1210 
    1211     //コンストラクタ用パラメータ
    1212     pVar->ConstractParameter=(char *)HeapAlloc(hHeap,0,lstrlen(ConstractParameter)+1);
    1213     lstrcpy(pVar->ConstractParameter,ConstractParameter);
    1214 
    1215     //レキシカルスコープ
    1216     pVar->ScopeLevel=obj_LexScopes.GetNowLevel();
    1217     pVar->ScopeStartAddress=obj_LexScopes.GetStartAddress();
    1218     pVar->bLiving=TRUE;
    1219 
    1220     //エラー用
    1221     pVar->source_code_address=cp;
    1222 
    1223     //アラインメントを考慮
    1224     int alignment = 0;
    1225     if( pVar->type==DEF_STRUCT ){
    1226         alignment = pVar->u.pobj_c->iAlign;
    1227     }
    1228 
    1229     if(InitBuf[0]||dwFlag==DIMFLAG_INITDEBUGVAR){
    1230         //初期バッファがあるとき
    1231 
    1232         if( alignment ){
    1233             if( AllInitGlobalVarSize % alignment ){
    1234                 AllInitGlobalVarSize += alignment - (AllInitGlobalVarSize % alignment);
    1235             }
    1236         }
    1237 
    1238         pVar->offset=AllInitGlobalVarSize;
    1239         AllInitGlobalVarSize+=VarSize;
    1240     }
    1241     else{
    1242         //初期バッファがないとき
    1243 
    1244         if( alignment ){
    1245             if( AllGlobalVarSize % alignment ){
    1246                 AllGlobalVarSize += alignment - (AllGlobalVarSize % alignment);
    1247             }
    1248         }
    1249 
    1250         pVar->offset=AllGlobalVarSize | 0x80000000;
    1251         AllGlobalVarSize+=VarSize;
    1252     }
    1253 
    1254     if(InitBuf[0]){
    1255         int result = 0;
    1256         if( pVar->type != DEF_OBJECT ){
    1257             //初期バッファにデータをセット
    1258             extern BYTE *initGlobalBuf;
    1259             initGlobalBuf=(BYTE *)HeapReAlloc(hHeap,
    1260                 HEAP_ZERO_MEMORY,
    1261                 initGlobalBuf,
    1262                 AllInitGlobalVarSize);
    1263 
    1264             result = SetInitGlobalData(pVar->offset,
    1265                 pVar->type,
    1266                 pVar->u.index,
    1267                 pVar->SubScripts,
    1268                 InitBuf);
    1269         }
    1270 
    1271         if(!result){
    1272             //動的な式だった場合は代入演算を行う
    1273 
    1274             //初期代入時のみ、書き込みアクセスを許可する
    1275             bool bConstBack = pVar->bConst;
    1276             pVar->bConst = false;
    1277 
    1278             //代入
    1279             char temporary[8192];
    1280             sprintf(temporary,"%s=%s",name,InitBuf);
    1281             OpcodeCalc(temporary);
    1282 
    1283             //アクセス制限を元に戻す
    1284             pVar->bConst = bConstBack;
    1285         }
    1286     }
    1287 
    1288 
    1289     if( pTypeInfo->type==DEF_OBJECT ){
    1290         //デストラクタの利用フラグをオンにする
    1291         CMethod *method = pTypeInfo->u.pobj_Class->GetDestructorMethod();
    1292         if( method ){
    1293             method->psi->bUse = 1;
    1294         }
    1295     }
    1296 
    1297 /*
    1298     TODO: 消す
    1299     if(pTypeInfo->type==DEF_OBJECT){
    1300         //利用対象のクラスコンストラクタ、デストラクタに使用チェックをつける
    1301         for(i2=0;i2<pTypeInfo->u.pobj_Class->iMethodNum;i2++){
    1302             if(lstrcmp(pTypeInfo->u.pobj_Class->ppobj_Method[i2]->psi->name,pTypeInfo->u.pobj_Class->name)==0){
    1303                 //コンストラクタ
    1304                 pTypeInfo->u.pobj_Class->ppobj_Method[i2]->psi->bUse=1;
    1305             }
    1306             if(pTypeInfo->u.pobj_Class->ppobj_Method[i2]->psi->name[0]=='~'){
    1307                 //デストラクタ
    1308                 pTypeInfo->u.pobj_Class->ppobj_Method[i2]->psi->bUse=1;
    1309             }
    1310         }
    1311     }*/
    1312 }
  • BasicCompiler_Common/Variable.h

    r64 r75  
     1
     2class Variable : public Type
     3{
     4    string name;
     5    bool isConst;
     6    bool isRef;
     7    bool isArray;
     8    int subScripts[MAX_ARRAYDIM];
     9
     10    bool isParameter;
     11
     12public:
     13    Variable( const string &name, const Type &type, bool isConst = false, bool isRef = false ):
     14        Type( type ),
     15        name( name ),
     16        isConst( isConst ),
     17        isRef( isRef ),
     18        isArray( false ),
     19        isParameter( false)
     20    {
     21        subScripts[0] = -1;
     22    }
     23    Variable( const Variable &var ):
     24        Type( var ),
     25        name( var.name ),
     26        isConst( var.isConst ),
     27        isRef( var.isRef ),
     28        isArray( false ),
     29        isParameter( false )
     30    {
     31        subScripts[0] = -1;
     32        if( var.isArray ){
     33            SetArray( var.subScripts );
     34        }
     35    }
     36    ~Variable(){}
     37
     38    void SetArray( const int *pSubScripts ){
     39        isArray = true;
     40        memcpy( this->subScripts, pSubScripts, sizeof(int) * MAX_ARRAYDIM );
     41    }
     42
     43    const string &GetName() const
     44    {
     45        return name;
     46    }
     47
     48    void ConstOff(){
     49        isConst = false;
     50    }
     51    void ConstOn(){
     52        isConst = true;
     53    }
     54    bool IsConst() const
     55    {
     56        return isConst;
     57    }
     58    bool IsRef() const
     59    {
     60        return isRef;
     61    }
     62    bool IsArray()const
     63    {
     64        return isArray;
     65    }
     66    const int *GetSubScriptsPtr() const
     67    {
     68        return subScripts;
     69    }
     70
     71    void ThisIsParameter(){
     72        isParameter = true;
     73    }
     74    bool IsParameter() const
     75    {
     76        return isParameter;
     77    }
    178
    279
    3 BOOL IsVariableTopChar(char c);
    4 BOOL IsVariableChar(char c);
    5 BOOL IsPtrType(int type);
    6 BOOL IsSignedType(int type);
    7 BOOL IsNaturalWholeNumberType(int type);
    8 BOOL IsWholeNumberType(int type);
    9 BOOL IsRealNumberType(int type);
    10 BOOL Is64Type(int type);
    11 int GetSignedType(int type);
    12 int GetUnsignedType(int type);
    13 int GetTypeSize(int type,LONG_PTR lpIndex);
    14 int GetPtrType(int type,LONG_PTR lpIndex);
    15 int GetTypeFixed(const char *TypeName,LONG_PTR *lpNum);
    16 void GetOriginalTypeName(char *buffer);
    17 BOOL GetTypeName(int type,LONG_PTR lpIndex,char *name);
    18 bool FormatUseProcReturnObject( const char *term, char *procName, char *parameter, CClass::RefType &refType, char *member );
    19 BOOL GetVarFormatString(char *buffer,char *array,char *array2,char *NestMember, CClass::RefType &refType );
    20 void GetArrayElement(char *buffer,char *variable,char *array_element);
    21 BOOL CheckVarNameError(char *name,int NowLine);
    22 int JumpSubScripts(int *ss);
    23 void GetArrange(char *variable,char *variAnswer,int *SubScripts);
    24 int GetTypeFromSimpleName(char *variable);
    25 int GetVarType(const char *NameBuffer,LONG_PTR *plpIndex,BOOL bError);
    26 BOOL GetVarOffsetReadOnly(const char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss=0);
    27 BOOL GetVarOffsetReadWrite(const char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss=0);
    28 BOOL GetDimentionFormat(const char *buffer, const bool isRef, char *VarName,int *SubScripts,TYPEINFO *pTypeInfo,char *InitBuf,char *ConstractParameter);
    29 BOOL GetNowStaticVarFullName(char *VarName,char *FullName);
    30 void AddGlobalVariable(bool isRef, char *name,int *SubScripts,TYPEINFO *pTypeInfo,int TypeSize,char *InitBuf,char *ConstractParameter,DWORD dwFlag);
     80    int GetMemorySize() const
     81    {
     82        if( isRef || isParameter ){
     83            return PTR_SIZE;
     84        }
    3185
     86        int size = Type::GetSize();
     87
     88        if( isArray ){
     89            int num = 1;
     90            for( int i=0; i<MAX_ARRAYDIM; i++){
     91                if(subScripts[i]==-1) break;
     92                num *= subScripts[i]+1;
     93            }
     94            size *= num;
     95        }
     96
     97        if( size % PTR_SIZE ){
     98            size += PTR_SIZE-(size%PTR_SIZE);
     99        }
     100
     101        return size;
     102    }
     103
     104
     105    /* --- オフセット ---
     106
     107        ※グローバル変数で初期バッファがない場合は最上位ビットに1がセットされ、
     108        初期バッファの有無が識別される。
     109        (その後、スケジュール実行により、実際の配置に並び替えられる)*/
     110    int offset;
     111
     112    //コンストラクタ用パラメータ
     113    string paramStrForConstructor;
     114
     115    //レキシカルスコープ用
     116    int ScopeStartAddress;
     117    int ScopeEndAddress;
     118    int ScopeLevel;
     119    BOOL bLiving;
     120
     121
     122    int source_code_address;
     123};
     124
     125class Variables : public vector<Variable *>
     126{
     127public:
     128    Variables(){}
     129    ~Variables(){
     130        clear();
     131    }
     132
     133    void clear(){
     134        for( int i=0; i<(int)this->size(); i++ ){
     135            delete (*this)[i];
     136        }
     137
     138        vector<Variable *>::clear();
     139    }
     140
     141    bool DuplicateCheck( const string &varName ) const
     142    {
     143        //レキシカルスコープを考慮して重複判定
     144        for( int i=(int)this->size()-1; i>=0 ; i-- ){
     145            Variable &var = *(*this)[i];
     146            if( var.bLiving                                         //現在のスコープで有効なもの
     147                && var.ScopeLevel == obj_LexScopes.GetNowLevel()    //現在のスコープと同一レベル
     148                ){
     149                    if( var.GetName() == varName ){
     150                        return true;
     151                    }
     152            }
     153        }
     154        return false;
     155    }
     156
     157    const Variable *BackSearch( const string &varName ) const
     158    {
     159        //レキシカルスコープを考慮してバックサーチ
     160        for( int i=(int)this->size()-1; i>=0 ; i-- ){
     161            Variable &var = *(*this)[i];
     162            if( var.bLiving                                         //現在のスコープで有効なもの
     163                && var.ScopeLevel <= obj_LexScopes.GetNowLevel()    //現在のスコープレベルを超さないもの(Returnによる解放処理中を考慮)
     164                ){
     165                    if( var.GetName() == varName ){
     166                        return &var;
     167                    }
     168            }
     169        }
     170        return NULL;
     171    }
     172
     173    const Variable *Find( const string &varName )const
     174    {
     175        int max = (int)this->size();
     176        for( int i=0; i<max; i++ ){
     177            Variable *pVar = (*this)[i];
     178            if( pVar->GetName() == varName ){
     179                return pVar;
     180            }
     181        }
     182        return NULL;
     183    }
     184};
     185
     186extern Variables globalVars;
     187
     188
  • BasicCompiler_Common/calculation.cpp

    r73 r75  
    390390}
    391391
    392 int StaticCalculation(bool enableerror, const char *Command,int BaseType,_int64 *pi64data,LONG_PTR *plpIndex,BOOL bDebuggingWatchList){
    393     extern HANDLE hHeap;
     392bool StaticCalculation(bool enableerror, const char *Command,int BaseType,_int64 *pi64data,Type &resultType,BOOL bDebuggingWatchList, bool *pIsMemoryAccessError){
    394393    extern int cp;
    395394    int i,i2,i3,PareNum;
     
    406405    int sp,pnum;
    407406
     407    if( pIsMemoryAccessError ) *pIsMemoryAccessError = false;
     408
    408409    *pi64data=0;
    409     if(Command[0]=='\0') return 0;
     410    if(Command[0]=='\0') return false;
    410411
    411412    for(i=0,i2=0,sp=0,pnum=0,PareNum=0;;i++,i2++){
     
    487488                            extern int cp;
    488489                            if(enableerror) SetError(3,temp2,cp);
    489                             return 0;
     490                            return false;
    490491                        }
    491492                        i64nums[pnum]=GetTypeSize(i3,lpIndex);
     
    497498                        if(!GetConstCalcBuffer(temporary,temp2,Parms)){
    498499                            if(enableerror) SetError(3,temporary,cp);
    499                             return 0;
     500                            return false;
    500501                        }
    501502
    502                         type[pnum]=StaticCalculation(true, Parms,BaseType,&i64data,&before_index[pnum]);
    503                         if(IsRealNumberType(type[pnum])){
    504                             //整数型
     503                        Type tempType;
     504                        StaticCalculation(true, Parms,BaseType,&i64data,tempType);
     505                        type[pnum] = tempType.GetBasicType();
     506                        before_index[pnum] = tempType.GetIndex();
     507                        if(tempType.IsReal()){
     508                            //実数型
    505509                            memcpy(&nums[pnum],&i64data,sizeof(double));
    506510                        }
     
    548552
    549553                            RELATIVE_VAR RelativeVar;
    550                             LONG_PTR lpIndex;
    551554                            int ss[MAX_ARRAYDIM];
    552555                            void *offset;
     
    557560                            extern HANDLE hDebugProcess;
    558561
    559                             i3=Debugging_GetVarOffset(Parms,&i2,&RelativeVar,&lpIndex,ss);
     562                            Type tempType;
     563                            i3=Debugging_GetVarOffset(Parms,&RelativeVar,tempType,ss);
    560564                            if(i3==0){
    561565                                //式エラー
    562                                 return 0;
     566                                return false;
    563567                            }
    564568                            if(i3==-1){
    565569                                //メモリにアクセスできないとき
    566                                 return -1;
     570                                if( pIsMemoryAccessError ) *pIsMemoryAccessError = true;
     571                                return false;
    567572                            }
    568573
     
    571576                                offset=(void *)Debugging_GetVarPtr(&RelativeVar);
    572577
    573                                 type[pnum]=i2;
    574 
    575                                 if(i2==DEF_DOUBLE){
     578                                type[pnum]=tempType.GetBasicType();
     579
     580                                if(tempType.IsDouble()){
    576581                                    i3=ReadProcessMemory(hDebugProcess,offset,&nums[pnum],sizeof(double),&stAccBytes);
    577582                                }
    578                                 else if(i2==DEF_SINGLE){
     583                                else if(tempType.IsSingle()){
    579584                                    if(i3=ReadProcessMemory(hDebugProcess,offset,&flt,sizeof(float),&stAccBytes)){
    580585                                        nums[pnum]=(double)flt;
    581586                                    }
    582587                                }
    583                                 else if(IsPtrType(i2)){
     588                                else if(tempType.IsPointer()){
    584589                                    LONG_PTR lpData;
    585590                                    if(i3=ReadProcessMemory(hDebugProcess,offset,&lpData,sizeof(LONG_PTR),&stAccBytes)){
     
    587592                                    }
    588593                                }
    589                                 else if(Is64Type(i2)){
     594                                else if(tempType.Is64()){
    590595                                    type[pnum]=DEF_INT64;
    591596
     
    593598                                }
    594599
    595                                 else if(i2==DEF_LONG){
     600                                else if(tempType.IsLong()){
    596601                                    long lData;
    597602                                    if(i3=ReadProcessMemory(hDebugProcess,offset,&lData,sizeof(long),&stAccBytes)){
     
    599604                                    }
    600605                                }
    601                                 else if(i2==DEF_DWORD){
     606                                else if(tempType.IsDWord()){
    602607                                    if(i3=ReadProcessMemory(hDebugProcess,offset,&dwData,sizeof(DWORD),&stAccBytes)){
    603608                                        i64nums[pnum]=(_int64)dwData;
    604609                                    }
    605610                                }
    606                                 else if(i2==DEF_INTEGER || (isUnicode&&i2==DEF_CHAR)){
     611                                else if(tempType.IsInteger()){
    607612                                    short shortData;
    608613                                    if(i3=ReadProcessMemory(hDebugProcess,offset,&shortData,sizeof(short),&stAccBytes)){
     
    610615                                    }
    611616                                }
    612                                 else if(i2==DEF_WORD){
     617                                else if(tempType.IsWord()){
    613618                                    WORD wData;
    614619                                    if(i3=ReadProcessMemory(hDebugProcess,offset,&wData,sizeof(WORD),&stAccBytes)){
     
    616621                                    }
    617622                                }
    618                                 else if(i2==DEF_SBYTE || (isUnicode==false&&i2==DEF_CHAR)){
     623                                else if(tempType.IsSByte()){
    619624                                    char charData;
    620625                                    if(i3=ReadProcessMemory(hDebugProcess,offset,&charData,sizeof(char),&stAccBytes)){
     
    622627                                    }
    623628                                }
    624                                 else if(i2==DEF_BYTE){
     629                                else if(tempType.IsByte()){
    625630                                    BYTE byteData;
    626631                                    if(i3=ReadProcessMemory(hDebugProcess,offset,&byteData,sizeof(BYTE),&stAccBytes)){
     
    628633                                    }
    629634                                }
    630                                 else if(i2==DEF_BOOLEAN){
     635                                else if(tempType.IsBoolean()){
    631636                                    BYTE byteData;
    632637                                    if(i3=ReadProcessMemory(hDebugProcess,offset,&byteData,sizeof(BYTE),&stAccBytes)){
     
    634639                                    }
    635640                                }
    636                                 else return 0;
     641                                else return false;
    637642
    638643                                if(!i3){
    639644                                    //読み込みに失敗
    640                                     return -1;
     645                                    if( pIsMemoryAccessError ) *pIsMemoryAccessError = true;
     646                                    return false;
    641647                                }
    642648                                goto JumpConst;
     
    672678                                //エラー
    673679                                if(enableerror) SetError(300,NULL,cp);
    674                                 return -1;
     680                                return 0;
    675681                            }
    676682                            goto JumpConst;
     
    685691
    686692                        if(type[pnum]==-1){
    687                             if(bDebuggingWatchList) return -1;
     693                            if(bDebuggingWatchList){
     694                                if( pIsMemoryAccessError ) *pIsMemoryAccessError = true;
     695                                return false;
     696                            }
    688697                            //エラー
    689698                            if(enableerror) SetError(3,Parms,cp);
    690                             return 0;
     699                            return false;
    691700                        }
    692701JumpConst:;
     
    713722                if(!(Command[i]=='+'||Command[i]=='-'||(Command[i]==1&&Command[i+1]==ESC_NOT))){
    714723                    if(enableerror) SetError(1,NULL,cp);
    715                     return 0;
     724                    return false;
    716725                }
    717726                if(Command[i]=='+'){
     
    898907        //文字列ポインタ
    899908        *pi64data=(_int64)stack[0];
    900         *plpIndex=index_stack[0];
    901         return type_stack[0];
     909        resultType.SetType( type_stack[0], index_stack[0] );
     910        return true;
    902911    }
    903912
     
    905914        //実数
    906915        memcpy(pi64data,&dbl_stack[0],sizeof(double));
    907         return type_stack[0];
     916        resultType.SetType( type_stack[0], index_stack[0] );
     917        return true;
    908918    }
    909919
     
    911921    *pi64data=i64stack[0];
    912922
    913     if(plpIndex){
    914         *plpIndex=index_stack[0];
    915         if(*plpIndex==-1){
    916             if(Is64Type(type_stack[0])==0&&IsRealNumberType(type_stack[0])==0){
    917                 //整数(符号有り/無し)
    918                 i64data=*pi64data;
    919 
    920                 *plpIndex=GetLiteralIndex(i64data);
    921             }
    922         }
    923     }
    924 
    925     return type_stack[0];
     923    if(index_stack[0]==-1){
     924        if(Is64Type(type_stack[0])==0&&IsRealNumberType(type_stack[0])==0){
     925            //整数(符号有り/無し)
     926            i64data=*pi64data;
     927
     928            resultType.SetIndex( GetLiteralIndex(i64data) );
     929        }
     930    }
     931    else{
     932        resultType.SetIndex( index_stack[0] );
     933    }
     934
     935    resultType.SetBasicType( type_stack[0] );
     936    return true;
    926937}
    927938
     
    11871198    return -1;
    11881199}
    1189 bool IsStringObjectType(const TYPEINFO &TypeInfo){
    1190     if(TypeInfo.type==DEF_OBJECT){
    1191         if(lstrcmp(TypeInfo.u.pobj_Class->name,"String")==0){
    1192             return 1;
    1193         }
    1194     }
    1195     return 0;
    1196 }
    11971200int IsStrCalculation(char *Command){
    1198     int i,i2,i3,i4,type,PareNum;
     1201    int i,i2,i3,i4,PareNum;
    11991202    char temporary[VN_SIZE],temp2[8192];
    12001203
     
    12451248                }
    12461249                if(Command[i2+i3]=='('){
    1247                     TYPEINFO TypeInfo;
    12481250
    12491251                    //DLL関数の場合
    1250                     DECLAREINFO *pdi;
    1251                     pdi=GetDeclareHash(temporary);
    1252                     if(pdi){
    1253                         TypeInfo.type=pdi->ReturnType;
    1254                         TypeInfo.u.lpIndex=pdi->u.ReturnIndex;
    1255                         if(IsStringObjectType( TypeInfo )) return 1;
     1252                    DllProc *pDllProc;
     1253                    pDllProc=GetDeclareHash(temporary);
     1254                    if(pDllProc){
     1255                        if( pDllProc->ReturnType().IsStringObject() ){
     1256                            return 1;
     1257                        }
    12561258                        return 0;
    12571259                    }
    12581260
    12591261                    //ユーザー定義関数
    1260                     SubInfo *psi;
    1261                     psi=GetSubHash(temporary);
    1262                     if(psi){
    1263                         TypeInfo.type=psi->ReturnType;
    1264                         TypeInfo.u.lpIndex=psi->u.ReturnIndex;
    1265                         if(IsStringObjectType(TypeInfo)) return 1;
     1262                    UserProc *pUserProc;
     1263                    pUserProc=GetSubHash(temporary);
     1264                    if(pUserProc){
     1265                        if( pUserProc->ReturnType().IsStringObject() ){
     1266                            return 1;
     1267                        }
    12661268                        return 0;
    12671269                    }
     
    12971299
    12981300                //変数
    1299                 CClass *pobj_Class;
    1300                 type = GetVarType(Command+i2,(LONG_PTR *)&pobj_Class,1);
    1301                 if(type==-1 || type ==0){
     1301                Type varType;
     1302                if( !GetVarType(Command+i2,varType,1) ){
    13021303                    //エラー
    13031304                    return -1;
    13041305                }
    1305                 if(type==DEF_OBJECT){
    1306                     if(lstrcmp(pobj_Class->name,"String")==0){
    1307                         return 1;
    1308                     }
    1309                     return 0;
     1306                if( varType.IsStringObject() ){
     1307                    return 1;
    13101308                }
    13111309            }
  • BasicCompiler_Common/common.h

    r73 r75  
    3737#include "../BasicCompiler_Common/psapi.h"
    3838#include "../BasicCompiler_Common/BreakPoint.h"
     39#include "../BasicCompiler_Common/LexicalScoping.h"
    3940
    4041
     
    152153#include "Const.h"
    153154
     155// 変数管理用のクラス
     156#include "Variable.h"
     157
    154158// パラメータ管理用のクラス
    155159#include "Parameter.h"
     
    172176
    173177//変数
    174 #define REF_PARAMETER 1
    175 #define OBJECT_PARAMETER 2
    176 #define REF_VARIABLE 4
    177178struct VARIABLE{
    178179    char name[255];
     
    219220};
    220221
    221 struct PARAMETER_INFO{
    222     char *name;
    223     int type;
    224     union{
    225         LONG_PTR index;
    226         CClass *pobj_c;
    227     }u;
    228 
    229     BOOL bByVal;
    230     BOOL bArray;
    231     int SubScripts[MAX_ARRAYDIM];
    232 };
    233 
    234 #define DECLARE_DYNAMIC 1
    235 #define DECLARE_STATIC  2
    236 struct DECLAREINFO{
    237     DWORD dwType;
    238 
    239     char *file;
    240     char *name;
    241     char *alias;
    242     BOOL bCdecl;
    243 
    244     //パラメータ
    245     PARAMETER_INFO *pParmInfo;
    246     int ParmNum;
    247 
    248     //戻り値
    249     int ReturnType;
    250     union{
    251         LONG_PTR ReturnIndex;
    252         CClass *Return_pobj_c;
    253     }u;
    254 
    255     union{
    256         int LookupAddress;
    257         int StaticProc_CodeAddress;
    258     };
    259 
    260     BOOL bUse;
    261 
    262     int pos;
    263 
    264     DECLAREINFO *pNextData;
    265 };
    266 struct PROCPTRINFO{
    267     PARAMETER_INFO *pParmInfo;
    268     int ParmNum;
    269 
    270     int ReturnType;
    271     union{
    272         LONG_PTR ReturnIndex;
    273         CClass *Return_pobj_c;
    274     }u;
    275 };
    276222struct CONSTINFO{
    277223    char *name;
     
    361307#include "../BasicCompiler_Common/PESchedule.h"
    362308#include "../BasicCompiler_Common/DebugSection.h"
    363 #include "../BasicCompiler_Common/LexicalScoping.h"
    364 #include "../BasicCompiler_Common/Variable.h"
     309#include "../BasicCompiler_Common/VariableOpe.h"
    365310#include "../BasicCompiler_Common/Exception.h"
    366311
    367312
    368313
    369 int StaticCalculation(bool enableerror, const char *Command,int BaseType,_int64 *pi64data,LONG_PTR *plpIndex,BOOL bDebuggingWatchList=0);
     314bool StaticCalculation(bool enableerror, const char *Command,int BaseType,_int64 *pi64data,Type &resultType,BOOL bDebuggingWatchList=0, bool *pIsMemoryAccessError=NULL);
    370315
    371316
     
    384329
    385330//hash.cpp
    386 int hash_default(char *name);
     331int hash_default(const char *name);
    387332CONSTINFO *GetConstHash(char *name);
    388 DECLAREINFO *GetDeclareHash(char *name);
    389 SubInfo *GetSubHash(const char *name,BOOL bError=0);
    390 SubInfo *GetMethodHash(char *ObjectName,char *MethodName,char *Parameter,BOOL bError=0);
    391 void GetOverloadSubHash( const char *lpszName, std::vector<SubInfo *> &subs );
     333DllProc *GetDeclareHash(char *name);
     334UserProc *GetSubHash(const char *name,BOOL bError=0);
     335UserProc *GetMethodHash(const char *ObjectName,const char *MethodName,const char *Parameter,BOOL bError=0);
     336void GetOverloadSubHash( const char *lpszName, std::vector<UserProc *> &subs );
    392337
    393338//Object.cpp
    394 void AddClassName(char *Parameter,int NowLine);
    395 void CallConstructor(char *VarName,int *SubScripts,TYPEINFO &TypeInfo,char *Parameter);
     339void CallConstructor( const char *ObjectName,const int *SubScripts, const Type &type,const char *Parameter);
     340bool Operator_New( const char *expression, const Type &baseType, Type &resultType );
    396341
    397342//Overload.sbp
    398 SubInfo *OverloadSolutionWithStrParam(
     343UserProc *OverloadSolutionWithStrParam(
    399344    const char *name,
    400     std::vector<SubInfo *> &subs,
     345    std::vector<UserProc *> &subs,
    401346    const char *Parameter,
    402     const char *ObjectName,
    403     TYPEINFO *pReturnTypeInfo);
    404 SubInfo *OverloadSolution(
     347    const char *ObjectName);
     348UserProc *OverloadSolution(
    405349    const char *name,
    406     std::vector<SubInfo *> &subs,
    407     const PARAMETER_INFO *ppi,
    408     const int ParmNum,
    409     TYPEINFO *pReturnTypeInfo);
     350    std::vector<UserProc *> &subs,
     351    const Parameters &params,
     352    const Type &returnType );
    410353
    411354//Debug.cpp
     
    416359void Debugger_Pause(void);
    417360ULONG_PTR rva_to_real(DWORD p);
    418 SubInfo *GetSubFromObp(ULONG_PTR pos);
     361UserProc *GetSubFromObp(ULONG_PTR pos);
    419362void ReadOpBuffer();
    420363void DebugProgram(void);
     
    428371ULONG_PTR Debugging_GetVarPtr(RELATIVE_VAR *pRelativeVar);
    429372ULONG_PTR Debugging_GetThisPtrOffset(LONG_PTR obp_Rip);
    430 int Debugging_GetVarOffset(char *variable,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss);
     373int Debugging_GetVarOffset( char *variable,RELATIVE_VAR *pRelativeVar, Type &resultType, int *pss);
    431374
    432375//MakeExe.cpp
     
    462405
    463406//CommandFormat.cpp
    464 void ComOpen(char *Parameter,char *buffer,int NowLine);
     407void ComOpen(char *Parameter,char *buffer,int nowLine);
    465408void ComClose(char *Parameter,char *buffer);
    466409void ComField(char *Parameter,char *buffer);
    467 void ComLine(char *Parameter,char *buffer,int NowLine);
    468 void ComCircle(char *Parameter,char *buffer,int NowLine);
    469 void ComPSet(char *Parameter,char *buffer,int NowLine);
    470 void ComPaint(char *Parameter,char *buffer,int NowLine);
     410void ComLine(char *Parameter,char *buffer,int nowLine);
     411void ComCircle(char *Parameter,char *buffer,int nowLine);
     412void ComPSet(char *Parameter,char *buffer,int nowLine);
     413void ComPaint(char *Parameter,char *buffer,int nowLine);
    471414
    472415// StrOperation.cpp
     
    512455BOOL GetConstCalcBuffer(char *name,char *Parameter,char *pCalcBuffer);
    513456DWORD GetConstValue(char *name,double *dbl,char *buffer,LONG_PTR *plpIndex);
    514 bool IsStringObjectType(const TYPEINFO &TypeInfo);
     457bool IsStringObjectType(const Type &TypeInfo);
    515458int IsStrCalculation(char *Command);
    516459BYTE GetCalcId(const char *Command,int *pi);
     
    518461                       char *values[255],long calc[255],long stack[255]);
    519462
    520 //NumOpe_GetType_Old.cpp
     463//NumOpe_GetType.cpp
    521464int AutoBigCast(int BaseType,int CalcType);
    522465BOOL CheckCalcType(int idCalc,int *type,int sp);
    523 int NumOpe_GetType_Old( const char *Command, TYPEINFO *pBaseTypeInfo, LONG_PTR *plpIndex );
    524466bool NumOpe_GetType( const char *expression, const Type &baseType, Type &resultType );
    525467
     
    529471void SplitObjectName(const char *name,char *ObjectName,int *pRefType);
    530472bool SplitMemberName( const char *desc, char *object, char *member );
    531 int CallProc(int idProc,void *pInfo,char *name,char *Parameter,LONG_PTR *plpRetIndex);
    532 BOOL CallPropertyMethod(char *variable,char *RightSide,TYPEINFO *pRetTypeInfo);
    533 int GetReturnTypeOfProc(int idProc,void *pInfo,char *name,char *Parameter,LONG_PTR *plpRetIndex);
    534 BOOL GetReturnTypeOfPropertyMethod(char *variable,char *RightSide,TYPEINFO *pRetTypeInfo);
    535 bool GetReturnTypeOfIndexerGetterProc(CClass *pobj_Class,TYPEINFO &RetTypeInfo);
    536 BOOL CompareParameter(PARAMETER_INFO *ppi1,int pi_num1,PARAMETER_INFO *ppi2,int pi_num2);
    537 SubInfo *AddSubData(char *buffer,int NowLine,BOOL bVirtual,CClass *pobj_c,BOOL bStatic=0);
     473bool CallProc( int kind, const void *pProc, const char *fullCallName, const char *lpszParms, Type &resultType, bool isCallOn = true );
     474bool CallPropertyMethod( const char *variable, const char *rightSide, Type &resultType);
     475bool GetReturnTypeOfPropertyMethod( const char *variable, const char *rightSide, Type &resultType );
     476bool GetReturnTypeOfIndexerGetterProc( const CClass &objClass, Type &resultType );
     477UserProc *AddSubData(char *buffer,int nowLine,BOOL bVirtual,CClass *pobj_c, bool isStatic = false );
    538478void GetSubInfo(void);
    539 void DeleteSubInfo(SubInfo **ppSubHash,char **ppMacroNames,int MacroNum);
     479void DeleteSubInfo(UserProc **ppSubHash,char **ppMacroNames,int MacroNum);
    540480void DeleteDeclareInfo(void);
    541 int AddProcPtrInfo(char *buffer,DWORD dwProcType);
     481int AddProcPtrInfo( char *buffer, DWORD dwProcType, int nowLine );
    542482void DeleteProcPtrInfo(void);
    543483
     
    581521//error.cpp
    582522void SetError(int ErrorNum,const char *KeyWord,int pos);
     523void SetError(int ErrorNum,const string &keyWord,int pos);
    583524void SetError();
    584525void CompileMessage(char *buffer);
    585526bool CheckDifferentType(const int VarType,const LONG_PTR lpVarIndex,const int CalcType,const LONG_PTR lpCalcIndex,const char *pszFuncName,const int ParmNum);
     527bool CheckDifferentType( const Type &varType,const Type &calcType,const char *pszFuncName,const int ParmNum);
    586528
    587529//Compile.cpp
  • BasicCompiler_Common/error.cpp

    r65 r75  
    9393    //日本語
    9494    ////////////////////
    95     if(num==1) lstrcpy(msg,"文法が間違っています");
    96     if(num==2) sprintf(msg,"左のオペランドが、左辺値になっていません");
     95    if(num==1) lstrcpy(msg,"文法が間違っています");
     96    if(num==2) sprintf(msg,"左のオペランドが、左辺値になっていません");
    9797    //num==3は予約されています
    98     if(num==4) sprintf(msg,"%sの相互関係が一致しません",tempKeyWord);
    99     if(num==5) sprintf(msg,"ダブルクォートの数が一致しません");
    100     if(num==6) sprintf(msg,"\"%s\" ジャンプ先が不正です",tempKeyWord);
    101     if(num==7) lstrcpy(msg,"DLL名が長すぎます(拡張子を含め、16文字以下にして下さい)");
    102     if(num==8) lstrcpy(msg,"コンパイラが認識できない文字コードが含まれています");
    103     if(num==9) sprintf(msg,"型が違います");
    104     if(num==10) sprintf(msg,"\"%s\" のパラメータ指定が間違っています",tempKeyWord);
    105     if(num==11) sprintf(msg,"\"%s\" 型が違います",tempKeyWord);
    106     if(num==12) sprintf(msg,"\"%s\" の使い方が不正です",tempKeyWord);
    107     if(num==13) sprintf(msg,"\"%s\" を参照できません",tempKeyWord);
    108     if(num==14) sprintf(msg,"\"%s\" 配列指定が不正です",tempKeyWord);
    109     if(num==15) sprintf(msg,"\"%s\" はすでに定義されています",tempKeyWord);
    110     if(num==16) sprintf(msg,"\"%s\" 配列、またはポインタ以外の変数に添え字が指定されています",tempKeyWord);
    111     if(num==17) sprintf(msg,"リソース データが不正です");
    112     if(num==18) sprintf(msg,"\"%s\"はポインタ変数型です。文字列演算を指定することはできません",tempKeyWord);
    113     if(num==19) sprintf(msg,"\"%s\"は値参照型です。ByVal指定することはできません",tempKeyWord);
    114     if(num==20) lstrcpy(msg,"全角スペースが含まれています(全角スペースはコンパイラが認識できないので、半角スペースまたはタブ文字にしてください)");
    115     if(num==21) sprintf(msg,"If制御のブロック指定が不正です");
    116     if(num==22) sprintf(msg,"\"%s\" に対する \"End %s\" が見つかりません",tempKeyWord,tempKeyWord);
    117     if(num==23) sprintf(msg,"リソース ファイル \"%s\" の読み込みに失敗",tempKeyWord);
    118     if(num==24) lstrcpy(msg,"Export指定の関数のパラメータには実体オブジェクトを利用することはできません(BytePtr型などを利用して下さい)");
    119     if(num==27) sprintf(msg,"\"%s\" は定義されていません",tempKeyWord);
    120     if(num==28) sprintf(msg,"構造体パラメータはポインタ参照にしてください(%s)",tempKeyWord);
    121     if(num==29) sprintf(msg,"配列ポインタを要素と同時に引渡すときは、ポインタ参照(ByRef)にしてください");
     98    if(num==4) sprintf(msg,"%sの相互関係が一致しません。",tempKeyWord);
     99    if(num==5) sprintf(msg,"ダブルクォートの数が一致しません。");
     100    if(num==6) sprintf(msg,"\"%s\" ジャンプ先が不正です。",tempKeyWord);
     101    if(num==7) lstrcpy(msg,"DLL名が長すぎます(拡張子を含め、16文字以下にして下さい)。");
     102    if(num==8) lstrcpy(msg,"コンパイラが認識できない文字コードが含まれています。");
     103    if(num==9) sprintf(msg,"型が違います。");
     104    if(num==10) sprintf(msg,"\"%s\" のパラメータ指定が間違っています。",tempKeyWord);
     105    if(num==11) sprintf(msg,"\"%s\" 型が違います。",tempKeyWord);
     106    if(num==12) sprintf(msg,"\"%s\" の使い方が不正です。",tempKeyWord);
     107    if(num==13) sprintf(msg,"\"%s\" を参照できません。",tempKeyWord);
     108    if(num==14) sprintf(msg,"\"%s\" 配列指定が不正です。",tempKeyWord);
     109    if(num==15) sprintf(msg,"\"%s\" はすでに定義されています。",tempKeyWord);
     110    if(num==16) sprintf(msg,"\"%s\" 配列、またはポインタ以外の変数に添え字が指定されています。",tempKeyWord);
     111    if(num==17) sprintf(msg,"リソース データが不正です。");
     112    if(num==18) sprintf(msg,"\"%s\"はポインタ変数型です。文字列演算を指定することはできません。",tempKeyWord);
     113    if(num==19) sprintf(msg,"\"%s\"は値参照型です。ByVal指定することはできません。",tempKeyWord);
     114    if(num==20) lstrcpy(msg,"全角スペースが含まれています(全角スペースはコンパイラが認識できないので、半角スペースまたはタブ文字にしてください)。");
     115    if(num==21) sprintf(msg,"If制御のブロック指定が不正です。");
     116    if(num==22) sprintf(msg,"\"%s\" に対する \"End %s\" が見つかりません。",tempKeyWord,tempKeyWord);
     117    if(num==23) sprintf(msg,"リソース ファイル \"%s\" の読み込みに失敗。",tempKeyWord);
     118    if(num==24) lstrcpy(msg,"Export指定の関数のパラメータには実体オブジェクトを利用することはできません(BytePtr型などを利用して下さい)。");
     119    if(num==25) sprintf(msg,"DLL関数にオブジェクトを引き渡すことはできません(%s)。",tempKeyWord);
     120    if(num==26) sprintf(msg,"\"%s\" 戻り値の型が指定されていません。",tempKeyWord);
     121    if(num==27) sprintf(msg,"\"%s\" は定義されていません。",tempKeyWord);
     122    if(num==28) sprintf(msg,"構造体パラメータは参照渡しにしてください(%s)。",tempKeyWord);
     123    if(num==29) sprintf(msg,"配列ポインタを要素と同時に引渡すときは、ポインタ参照(ByRef)にしてください。");
    122124    //num==30は予約されています
    123     if(num==31) sprintf(msg,"\"%s\" は構造体です(メンバの参照はピリオド \".\" で区切ってください)",tempKeyWord);
    124     if(num==32) sprintf(msg,"\"%s\" は構造体ポインタです(メンバの参照は \"->\" で区切ってください)",tempKeyWord);
    125     if(num==33) sprintf(msg,"定数式にリテラル値、または定数以外のものが含まれています");
    126     if(num==34) sprintf(msg,"定数はモジュールレベルで宣言して下さい");
    127     if(num==38) sprintf(msg,"\"%s\" 戻り値が存在しないプロシージャです",tempKeyWord);
    128     if(num==39) sprintf(msg,"\"%s\" はオブジェクトポインタではありません(\"->\" 参照はできません)",tempKeyWord);
    129     if(num==40) lstrcpy(msg,"関数の戻り値にオブジェクトを指定することはできません");
    130     if(num==41) lstrcpy(msg,"初期データが不正です");
    131     if(num==42) lstrcpy(msg,"閉じカッコ \")\" の後に不正な文字が含まれています");
    132     if(num==43) lstrcpy(msg,"ダブルクォートの後に不正な文字が含まれています");
    133     if(num==45) sprintf(msg,"実数に対して \"%s\" 演算子は利用できません",tempKeyWord);
    134     if(num==46) lstrcpy(msg,"配列の添え字に整数以外の値が与えられています");
    135     if(num==47) lstrcpy(msg,"As演算子の右辺値に型名以外の識別子が指定されています");
    136     if(num==48) sprintf(msg,"%s演算子に対して型名が指定されています",tempKeyWord);
    137     if(num==49) lstrcpy(msg,"添え字に整数以外の型が指定されています");
    138     if(num==50) sprintf(msg,"%sに変換できません",tempKeyWord);
    139     if(num==51) lstrcpy(msg,"オブジェクト、構造体のアラインメント値は1,2,4,8,16のいずれかでなければなりません");
    140     if(num==52) sprintf(msg,"\"%s\" オーバーロードを解決できません",tempKeyWord);
    141     if(num==53) sprintf(msg,"\"%s\" 出力ファイルの書き込みに失敗しました。実行されている可能性があります",tempKeyWord);
     125    if(num==31) sprintf(msg,"\"%s\" は構造体です(メンバの参照はピリオド \".\" で区切ってください)",tempKeyWord);
     126    if(num==32) sprintf(msg,"\"%s\" は構造体ポインタです(メンバの参照は \"->\" で区切ってください)",tempKeyWord);
     127    if(num==33) sprintf(msg,"定数式にリテラル値、または定数以外のものが含まれています");
     128    if(num==34) sprintf(msg,"定数はモジュールレベルで宣言して下さい");
     129    if(num==38) sprintf(msg,"\"%s\" 戻り値が存在しないプロシージャです",tempKeyWord);
     130    if(num==39) sprintf(msg,"\"%s\" はオブジェクトポインタではありません(\"->\" 参照はできません)",tempKeyWord);
     131    if(num==40) lstrcpy(msg,"DLL関数の戻り値としてオブジェクトを受け取ることはできません。");
     132    if(num==41) lstrcpy(msg,"初期データが不正です");
     133    if(num==42) lstrcpy(msg,"閉じカッコ \")\" の後に不正な文字が含まれています");
     134    if(num==43) lstrcpy(msg,"ダブルクォートの後に不正な文字が含まれています");
     135    if(num==45) sprintf(msg,"実数に対して \"%s\" 演算子は利用できません",tempKeyWord);
     136    if(num==46) lstrcpy(msg,"配列の添え字に整数以外の値が与えられています");
     137    if(num==47) lstrcpy(msg,"As演算子の右辺値に型名以外の識別子が指定されています");
     138    if(num==48) sprintf(msg,"%s演算子に対して型名が指定されています",tempKeyWord);
     139    if(num==49) lstrcpy(msg,"添え字に整数以外の型が指定されています");
     140    if(num==50) sprintf(msg,"%sに変換できません",tempKeyWord);
     141    if(num==51) lstrcpy(msg,"オブジェクト、構造体のアラインメント値は1,2,4,8,16のいずれかでなければなりません");
     142    if(num==52) sprintf(msg,"\"%s\" オーバーロードを解決できません",tempKeyWord);
     143    if(num==53) sprintf(msg,"\"%s\" 出力ファイルの書き込みに失敗しました。実行されている可能性があります",tempKeyWord);
    142144    if(num==54) sprintf(msg,"対応する%sが存在しません。",tempKeyWord);
    143145    if(num==55) sprintf(msg,"\"%s\" は対応するForステートメントで利用されるカウンタ変数ではありません。",tempKeyWord);
     
    152154
    153155    //オブジェクト関連
    154     if(num==102) sprintf(msg,"\"%s\" オブジェクトは定義されていません",tempKeyWord);
    155     if(num==103) sprintf(msg,"\"%s\" メンバは定義されていません",tempKeyWord);
    156     if(num==104) sprintf(msg,"\"%s\" 参照方法が違います",tempKeyWord);
    157     if(num==105) sprintf(msg,"\"%s\" 自身のクラスを継承することはできません",tempKeyWord);
    158     if(num==106) sprintf(msg,"\"%s\" クラスは定義されていません",tempKeyWord);
    159     if(num==107) sprintf(msg,"Privateメンバ \"%s\" にアクセスすることはできません",tempKeyWord);
    160     if(num==108) sprintf(msg,"Protectedメンバ \"%s\" にアクセスすることはできません",tempKeyWord);
    161     if(num==109) sprintf(msg,"Privateメンバ関数 \"%s\" を呼び出すことはできません",tempKeyWord);
    162     if(num==110) sprintf(msg,"Protectedメンバ関数 \"%s\" を呼び出すことはできません",tempKeyWord);
    163     if(num==111) lstrcpy(msg,"InheritsはClass定義内の先頭に記述する必要があります");
    164     if(num==112) sprintf(msg,"\"%s\" はクラス型ではないため、初期パラメータを指定することはできません",tempKeyWord);
    165     if(num==113) sprintf(msg,"\"%s\" コンストラクタへ渡すパラメータが不正です",tempKeyWord);
    166     if(num==114) lstrcpy(msg,"デストラクタはパラメータを持てません");
    167     if(num==115) lstrcpy(msg,"コンストラクタ及びデストラクタは戻り値を持てません");
    168     if(num==116) lstrcpy(msg,"コンストラクタ及びデストラクタはパブリックアクセスにしなければなりません");
    169     if(num==117) lstrcpy(msg,"デストラクタの名前が \"~クラス名\" になっていません");
    170     if(num==118) lstrcpy(msg,"参照する基底クラスが存在しません");
    171     if(num==119) sprintf(msg,"\"%s\" メンバは基底クラスで定義されていません",tempKeyWord);
    172     if(num==120) lstrcpy(msg,"デストラクトするオブジェクトの型が不明です");
    173     if(num==121) lstrcpy(msg,"New演算子にはクラス以外の型を指定できません");
    174     if(num==122) lstrcpy(msg,"Delete演算子にポインタ以外の型が指定されています");
    175     if(num==123) lstrcpy(msg,"ループ継承が行われました");
    176     if(num==124) lstrcpy(msg,"循環参照が行われました");
     156    if(num==102) sprintf(msg,"\"%s\" オブジェクトは定義されていません",tempKeyWord);
     157    if(num==103) sprintf(msg,"\"%s\" メンバは定義されていません",tempKeyWord);
     158    if(num==104) sprintf(msg,"\"%s\" 参照方法が違います",tempKeyWord);
     159    if(num==105) sprintf(msg,"\"%s\" 自身のクラスを継承することはできません",tempKeyWord);
     160    if(num==106) sprintf(msg,"\"%s\" クラスは定義されていません",tempKeyWord);
     161    if(num==107) sprintf(msg,"Privateメンバ \"%s\" にアクセスすることはできません",tempKeyWord);
     162    if(num==108) sprintf(msg,"Protectedメンバ \"%s\" にアクセスすることはできません",tempKeyWord);
     163    if(num==109) sprintf(msg,"Privateメンバ関数 \"%s\" を呼び出すことはできません",tempKeyWord);
     164    if(num==110) sprintf(msg,"Protectedメンバ関数 \"%s\" を呼び出すことはできません",tempKeyWord);
     165    if(num==111) lstrcpy(msg,"InheritsはClass定義内の先頭に記述する必要があります");
     166    if(num==112) sprintf(msg,"\"%s\" はクラス型ではないため、初期パラメータを指定することはできません",tempKeyWord);
     167    if(num==113) sprintf(msg,"\"%s\" コンストラクタへ渡すパラメータが不正です",tempKeyWord);
     168    if(num==114) lstrcpy(msg,"デストラクタはパラメータを持てません");
     169    if(num==115) lstrcpy(msg,"コンストラクタ及びデストラクタは戻り値を持てません");
     170    if(num==116) lstrcpy(msg,"コンストラクタ及びデストラクタはパブリックアクセスにしなければなりません");
     171    if(num==117) lstrcpy(msg,"デストラクタの名前が \"~クラス名\" になっていません");
     172    if(num==118) lstrcpy(msg,"参照する基底クラスが存在しません");
     173    if(num==119) sprintf(msg,"\"%s\" メンバは基底クラスで定義されていません",tempKeyWord);
     174    if(num==120) lstrcpy(msg,"デストラクトするオブジェクトの型が不明です");
     175    if(num==121) lstrcpy(msg,"New演算子にはクラス以外の型を指定できません");
     176    if(num==122) lstrcpy(msg,"Delete演算子にポインタ以外の型が指定されています");
     177    if(num==123) lstrcpy(msg,"ループ継承が行われました");
     178    if(num==124) lstrcpy(msg,"循環参照が行われました");
    177179    if(num==125) sprintf(msg,"\"%s\" は抽象クラスです。インスタンス化することはできません。",tempKeyWord);
    178180    if(num==126) lstrcpy(msg,"オペレータのオーバーロードをクラスの外で行うことはできません。");
     
    186188
    187189    //Enum関連
    188     if(num==150) sprintf(msg,"\"%s\" 値が定義されていません",tempKeyWord);
    189     if(num==151) sprintf(msg,"\"%s\" 列挙リストに登録されていません",tempKeyWord);
     190    if(num==150) sprintf(msg,"\"%s\" 値が定義されていません",tempKeyWord);
     191    if(num==151) sprintf(msg,"\"%s\" 列挙リストに登録されていません",tempKeyWord);
    190192
    191193    //リンカ
    192     if(num==200) sprintf(msg,"\"%s\" 未解決です (リンク エラー)",tempKeyWord);
    193     if(num==201) sprintf(msg,"\"%s\" の読み込みに失敗",tempKeyWord);
     194    if(num==200) sprintf(msg,"\"%s\" 未解決です (リンク エラー)",tempKeyWord);
     195    if(num==201) sprintf(msg,"\"%s\" の読み込みに失敗",tempKeyWord);
    194196
    195197    //原因不明
     
    268270    return 1;
    269271}
     272void SetError(int ErrorNum,const string &keyWord,int pos){
     273    SetError( ErrorNum, keyWord.c_str(), pos );
     274}
    270275void SetError(int num,const char *KeyWord,int pos){
    271276    extern HANDLE hHeap;
     
    523528    return true;
    524529}
     530bool CheckDifferentType( const Type &varType,const Type &calcType,const char *pszFuncName,const int ParmNum){
     531    return CheckDifferentType(
     532        varType.GetBasicType(),
     533        varType.GetIndex(),
     534        calcType.GetBasicType(),
     535        calcType.GetIndex(),
     536        pszFuncName,
     537        ParmNum );
     538}
  • BasicCompiler_Common/gc.cpp

    r11 r75  
    1212void InitGCVariables(void){
    1313    char temporary[255];
    14     int type;
    15     RELATIVE_VAR RelativeVar;
    16     LONG_PTR lpIndex;
    1714
    1815
     
    2421    OpcodeDim(temporary,0);
    2522
    26     GetVarOffsetReadWrite("_System_gc_GlobalRoot_StartPtr",&type,&RelativeVar,&lpIndex);
     23    Type type;
     24    RELATIVE_VAR RelativeVar;
     25    GetVarOffsetReadWrite("_System_gc_GlobalRoot_StartPtr",&RelativeVar,type);
    2726
    2827    //mov rax,ptr
     
    4443    OpcodeDim(temporary,0);
    4544
    46     GetVarOffsetReadWrite("_System_gc_GlobalRoot_Size",&type,&RelativeVar,&lpIndex);
     45    GetVarOffsetReadWrite("_System_gc_GlobalRoot_Size",&RelativeVar,type);
    4746
    4847    //mov rax,ptr
     
    6564    OpcodeDim(temporary,0);
    6665
    67     GetVarOffsetReadWrite("_System_gc_StackRoot_StartPtr",&type,&RelativeVar,&lpIndex);
     66    GetVarOffsetReadWrite("_System_gc_StackRoot_StartPtr",&RelativeVar,type);
    6867
    6968    //mov rax,rsp
  • BasicCompiler_Common/hash.cpp

    r73 r75  
    77#endif
    88
    9 int hash_default(char *name){
     9int hash_default(const char *name){
    1010    int key;
    1111
     
    3535}
    3636
    37 DECLAREINFO *GetDeclareHash(char *name){
     37DllProc *GetDeclareHash(char *name){
    3838    //ハッシュ値を取得
    3939    int key;
     
    4141
    4242    //格納位置を取得
    43     extern DECLAREINFO **ppDeclareHash;
    44     DECLAREINFO *pdi;
    45     pdi=ppDeclareHash[key];
    46     while(pdi){
    47         if(lstrcmp(pdi->name,name)==0) break;
     43    extern DllProc **ppDeclareHash;
     44    DllProc *pDllProc;
     45    pDllProc=ppDeclareHash[key];
     46    while(pDllProc){
     47        if( pDllProc->GetName() == name ){
     48            break;
     49        }
    4850
    49         pdi=pdi->pNextData;
     51        pDllProc=pDllProc->pNextData;
    5052    }
    5153
    52     return pdi;
     54    return pDllProc;
    5355}
    5456
    55 void GetOverloadSubHash( const char *lpszName, std::vector<SubInfo *> &subs ){
     57void GetOverloadSubHash( const char *lpszName, std::vector<UserProc *> &subs ){
    5658    char name[VN_SIZE];
    5759
     
    7274
    7375        bool isStatic = false;
    74         CClass *pobj_c;
     76        const CClass *pobj_c = NULL;
    7577        if(lstrcmpi(ObjName,"Super")==0){
    7678            //クラスメンバ関数内から基底クラスの呼び出し
     
    7981        else{
    8082            //"->"によってオブジェクトを指定する通常のメンバ関数呼び出し
    81             int type = GetVarType(ObjName,(LONG_PTR *)&pobj_c,0);
    82             if(!(NATURAL_TYPE(type)==DEF_OBJECT)){
     83            Type type;
     84            GetVarType(ObjName,type,0);
     85            pobj_c = &type.GetClass();
     86            if((NATURAL_TYPE(type.GetBasicType())!=DEF_OBJECT)){
    8387                pobj_c=pobj_DBClass->check(ObjName);
    8488                if( pobj_c ){
     
    123127
    124128        //格納位置を取得
    125         extern SubInfo **ppSubHash;
    126         SubInfo *psi;
    127         psi=ppSubHash[key];
    128         while(psi){
    129             if(!psi->pobj_ParentClass){
    130                 if(lstrcmp(psi->name,name)==0){
    131                     subs.push_back( psi );
     129        extern UserProc **ppSubHash;
     130        UserProc *pUserProc;
     131        pUserProc=ppSubHash[key];
     132        while(pUserProc){
     133            if(!pUserProc->GetParentClassPtr()){
     134                if( pUserProc->GetName() == name ){
     135                    subs.push_back( pUserProc );
    132136                }
    133137            }
    134138
    135             psi=psi->pNextData;
     139            pUserProc=pUserProc->pNextData;
    136140        }
    137141
     
    140144
    141145//オーバーロードされていない関数を取得(昔のコンパイラソースコードとの互換性保持)
    142 SubInfo *GetSubHash(const char *lpszName,BOOL bError){
    143     std::vector<SubInfo *> subs;
     146UserProc *GetSubHash(const char *lpszName,BOOL bError){
     147    std::vector<UserProc *> subs;
    144148    GetOverloadSubHash(lpszName,subs);
    145149
    146150    //関数が存在しないとき
    147151    if(subs.size() == 0){
     152        if(bError){
     153            SetError(3,lpszName,cp);
     154        }
    148155        return 0;
    149156    }
     
    154161    }
    155162
    156     SubInfo *psi;
    157     psi = subs[0];
     163    UserProc *pUserProc;
     164    pUserProc = subs[0];
    158165
    159     return psi;
     166    return pUserProc;
    160167}
    161 SubInfo *GetMethodHash(char *ObjectName,char *MethodName,char *Parameter,BOOL bError){
     168UserProc *GetMethodHash(const char *ObjectName,const char *MethodName,const char *Parameter,BOOL bError){
    162169    char temporary[VN_SIZE];
    163170    sprintf(temporary,"%s.%s",ObjectName,MethodName);
    164171
    165     std::vector<SubInfo *> subs;
    166     SubInfo *psi;
     172    std::vector<UserProc *> subs;
     173    UserProc *pUserProc;
    167174    GetOverloadSubHash(temporary,subs);
    168175
     
    173180
    174181    //オーバーロードを解決
    175     psi=OverloadSolutionWithStrParam(temporary,subs,Parameter,ObjectName,NULL);
     182    pUserProc=OverloadSolutionWithStrParam(temporary,subs,Parameter,ObjectName);
    176183
    177     return psi;
     184    return pUserProc;
    178185}
Note: See TracChangeset for help on using the changeset viewer.