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

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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    }
Note: See TracChangeset for help on using the changeset viewer.