Changeset 76 in dev for BasicCompiler32/Compile_ProcOp.cpp


Ignore:
Timestamp:
Mar 21, 2007, 9:26:56 PM (17 years ago)
Author:
dai_9181
Message:

TYPEINFO→Typeへのリファクタリングを実施。32bitが未完成。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler32/Compile_ProcOp.cpp

    r75 r76  
    2626        }
    2727
    28         extern BOOL bCompilingGlobal;
    29         BOOL bBackCompilingGlobal;
    30         bBackCompilingGlobal=bCompilingGlobal;
    31         bCompilingGlobal=1;
     28        UserProc *pBackUserProc;
     29        pBackUserProc = &UserProc::CompilingUserProc();
     30        UserProc::CompileStartForGlobalArea();
    3231
    3332        int BackCp;
     
    4948        GetGlobalDataForDll();
    5049
    51         bCompilingGlobal=bBackCompilingGlobal;
     50        UserProc::CompileStartForUserProc( pBackUserProc );
    5251        cp=BackCp;
    5352
     
    5857        //静的ローカルオブジェクトのコンストラクタ呼び出し
    5958
    60         extern int MaxGlobalVarNum;
    61         extern VARIABLE *GlobalVar;
    62         int i;
    63         for(i=0;i<MaxGlobalVarNum;i++){
    64             if(_memicmp(GlobalVar[i].name,"Static%",7)==0){
     59        foreach( Variable *pVar, globalVars ){
     60            if(memicmp(pVar->GetName().c_str(),"Static%",7)==0){
    6561                //コンストラクタ呼び出し
    66                 if(GlobalVar[i].type==DEF_OBJECT){
     62                if( pVar->IsObject() ){
    6763
    6864                    //エラー用
    69                     cp=GlobalVar[i].source_code_address;
    70 
    71                     Type TypeInfo;
    72                     TypeInfo.type=GlobalVar[i].type;
    73                     TypeInfo.u.lpIndex=GlobalVar[i].u.index;
     65                    cp=pVar->source_code_address;
     66
    7467                    CallConstructor(
    75                         GlobalVar[i].name,
    76                         GlobalVar[i].SubScripts,
    77                         TypeInfo,
    78                         GlobalVar[i].ConstractParameter);
     68                        pVar->GetName().c_str(),
     69                        pVar->GetSubScriptsPtr(),
     70                        *pVar,
     71                        pVar->paramStrForConstructor.c_str());
    7972                }
    8073            }
     
    8679    else if(lstrcmp(name,"_System_Call_Destructor_of_GlobalObject")==0){
    8780
    88         extern BOOL bCompilingGlobal;
    89         BOOL bBackCompilingGlobal;
    90         bBackCompilingGlobal=bCompilingGlobal;
    91         bCompilingGlobal=1;
     81        UserProc *pBackUserProc;
     82        pBackUserProc = &UserProc::CompilingUserProc();
     83        UserProc::CompileStartForGlobalArea();
    9284
    9385        obj_LexScopes.CallDestructorsOfScopeEnd();
    9486
    95         bCompilingGlobal=bBackCompilingGlobal;
     87        UserProc::CompileStartForUserProc( pBackUserProc );
    9688
    9789
     
    219211    extern UserProc **ppSubHash;
    220212    extern BOOL bDebugCompile;
    221     int i3,i4,VarSize,LocalVarSchedule,EspOffsetSchedule,BufferSize,BaseOffset;
     213    int i3,i4,LocalVarSchedule,EspOffsetSchedule,BaseOffset;
    222214    char temporary[VN_SIZE];
    223215
    224     BufferSize=128;
    225 
    226216    if( pUserProc->IsUsing() == false || pUserProc->IsCompiled() ) return;
     217
     218    if( pUserProc->localVars.size() ){
     219        SetError();
     220        return;
     221    }
    227222
    228223    pUserProc->CompleteCompile();
     
    235230    if(memcmp(pUserProc->GetName().c_str(),"_DebugSys_",10)==0){
    236231        if(!bDebugCompile){
    237             pUserProc->pVar=(VARIABLE *)HeapAlloc(hHeap,0,1);
    238             pUserProc->VarNum=0;
    239232            return;
    240233        }
     
    246239
    247240    if(pUserProc->IsSystem()){
    248         extern int MaxLocalVarNum;
    249241        extern int AllLocalVarSize;
    250         MaxLocalVarNum=0;
    251242        AllLocalVarSize=0;
    252243
     
    254245
    255246        pUserProc->endOpAddress=obp;
    256         pUserProc->pVar=(VARIABLE *)HeapAlloc(hHeap,0,1);
    257         pUserProc->VarNum=0;
    258247        return;
    259248    }
     
    266255
    267256    //ローカル変数に関する情報
    268     extern VARIABLE *LocalVar;
    269     extern int MaxLocalVarNum;
    270257    extern int AllLocalVarSize;
    271     LocalVar=(VARIABLE *)HeapAlloc(hHeap,0,1);
    272     MaxLocalVarNum=0;
    273258    AllLocalVarSize=0;
    274259
     
    283268        Parameter &param = *pUserProc->RealParams()[i3];
    284269
    285         //変数データを追加
    286         LocalVar=(VARIABLE *)HeapReAlloc(hHeap,0,LocalVar,(MaxLocalVarNum+1)*sizeof(VARIABLE));
    287 
    288         lstrcpy( LocalVar[MaxLocalVarNum].name,param.GetVarName().c_str() );
    289 
    290         // TODO: パラメータのConst定義の指定が未完成
    291         LocalVar[MaxLocalVarNum].bConst=false;
    292 
    293         LocalVar[MaxLocalVarNum].bArray=param.IsArray()?TRUE:FALSE;
    294         memcpy(LocalVar[MaxLocalVarNum].SubScripts,param.GetSubScriptsPtr(),MAX_ARRAYDIM*sizeof(int));
    295 
    296         LocalVar[MaxLocalVarNum].type=param.GetBasicType();
    297         if(LocalVar[MaxLocalVarNum].type==DEF_OBJECT
    298             ||LocalVar[MaxLocalVarNum].type==DEF_STRUCT){
    299                 if(pUserProc->IsExport())
    300                     SetError(24,NULL,cp);
    301         }
    302 
    303         LocalVar[MaxLocalVarNum].u.index=param.GetIndex();
    304 
     270        Variable *pVar = new Variable( param.GetVarName(), param, false, param.IsRef() );
     271
     272        if( param.IsArray() ){
     273            pVar->SetArray( param.GetSubScriptsPtr() );
     274        }
     275
     276        int varSize;
    305277        if( param.IsRef() == false && param.IsStruct() ){
    306278            //構造体のByValパラメータ
    307             LocalVar[MaxLocalVarNum].fRef=REF_PARAMETER | OBJECT_PARAMETER;
    308             VarSize=PTR_SIZE;
     279            pVar->ThisIsParameter();
     280            varSize=PTR_SIZE;
    309281        }
    310282        else{
    311             if( param.IsRef() == false && param.IsArray() == false ){
    312                 LocalVar[MaxLocalVarNum].fRef=0;
    313                 VarSize=GetTypeSize(LocalVar[MaxLocalVarNum].type,LocalVar[MaxLocalVarNum].u.index);
    314                 if(VarSize%PTR_SIZE) VarSize+=PTR_SIZE-(VarSize%PTR_SIZE);
     283            if( param.IsArray() == false ){
     284                varSize = pVar->GetMemorySize();
    315285            }
    316286            else{
    317                 LocalVar[MaxLocalVarNum].fRef=REF_PARAMETER;
    318                 VarSize=PTR_SIZE;
    319             }
    320         }
    321         AllLocalVarSize+=VarSize;
    322         LocalVar[MaxLocalVarNum].offset=AllLocalVarSize;
     287                varSize=PTR_SIZE;
     288            }
     289        }
     290        AllLocalVarSize+=varSize;
     291        pVar->offset=AllLocalVarSize;
    323292
    324293        //レキシカルスコープ情報
    325         LocalVar[MaxLocalVarNum].ScopeLevel=obj_LexScopes.GetNowLevel();
    326         LocalVar[MaxLocalVarNum].ScopeStartAddress=obj_LexScopes.GetStartAddress();
    327         LocalVar[MaxLocalVarNum].bLiving=TRUE;
    328 
    329         MaxLocalVarNum++;
     294        pVar->ScopeLevel=obj_LexScopes.GetNowLevel();
     295        pVar->ScopeStartAddress=obj_LexScopes.GetStartAddress();
     296        pVar->bLiving=TRUE;
     297
     298        pUserProc->localVars.push_back( pVar );
    330299    }
    331300
     
    346315
    347316    //コンパイル中の関数
    348     extern UserProc *pCompilingUserProc;
    349     pCompilingUserProc=pUserProc;
     317    UserProc::CompileStartForUserProc( pUserProc );
    350318
    351319
     
    507475            }
    508476
    509 
    510477            //実体クラスを持つメンバのコンストラクタ(引数有りを除く)を呼び出す
    511478            for(i3=0;i3<pobj_CompilingClass->iMemberNum;i3++){
    512479                CMember *pMember = pobj_CompilingClass->ppobj_Member[i3];
    513                 if(pMember->TypeInfo.type==DEF_OBJECT){
     480                if(pMember->IsObject()){
    514481                    // オブジェクトメンバを発見したとき
    515482
     
    517484                        pMember->name,
    518485                        1, ESC_NEW,
    519                         pMember->TypeInfo.u.pobj_Class->name );
     486                        pMember->GetClass().name );
    520487                    OpcodeCalc( temporary );
    521488                }
    522489            }
    523 
    524490
    525491            //仮想関数テーブルを初期化
     
    686652        //戻り値をeax、edxに設定
    687653        RELATIVE_VAR RelativeVar;
    688         LONG_PTR lpIndex;
    689654
    690655        const char *temp = pUserProc->GetName().c_str();
     
    692657            temp="_System_ReturnValue";
    693658        }
    694         GetVarOffsetReadWrite(temp,&i3,&RelativeVar,&lpIndex);
     659        GetVarOffsetReadWrite(temp,&RelativeVar,Type());
    695660
    696661        i3=pUserProc->ReturnType().GetBasicType();
     
    773738    }
    774739    HeapDefaultFree(pLocalVarAddrSchedule);
    775     for(i3=0;i3<MaxLocalVarNum;i3++){
    776         LocalVar[i3].offset=AllLocalVarSize-LocalVar[i3].offset;//後にデバッグで利用する
     740    foreach( Variable *pVar, pUserProc->localVars ){
     741        //後にデバッグで利用する
     742        pVar->offset = AllLocalVarSize - pVar->offset;
    777743    }
    778744
     
    828794    }
    829795
     796
    830797    pUserProc->endOpAddress=obp;
    831     pUserProc->pVar=LocalVar;
    832     pUserProc->VarNum=MaxLocalVarNum;
    833798
    834799
Note: See TracChangeset for help on using the changeset viewer.