Ignore:
Timestamp:
Jul 12, 2007, 2:58:26 AM (17 years ago)
Author:
dai_9181
Message:

コード全体のリファクタリングを実施

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler_Common/src/LexicalScopingImpl.cpp

    r184 r206  
     1#include "stdafx.h"
     2
    13#include <LexicalScopingImpl.h>
     4#include <Compiler.h>
    25
    36#include "../common.h"
     
    2932}
    3033
     34void LexicalScopesImpl::End(){
     35    if( level <= 0 ){
     36        SetError();
     37        return;
     38    }
     39
     40    //デストラクタを呼ぶ
     41    CallDestructorsOfScopeEnd();
     42
     43    Variables &vars = UserProc::IsGlobalAreaCompiling() ?
     44        compiler.GetMeta().GetGlobalVars() :
     45        UserProc::CompilingUserProc().GetLocalVars();
     46
     47    //使用済みローカル変数の生存チェックを外す
     48    BOOST_FOREACH( Variable *pVar, vars ){
     49        if(pVar->bLiving&&pVar->GetScopeLevel()==level){
     50            pVar->bLiving=0;
     51            extern int obp;
     52            pVar->SetScopeEndAddress( obp );
     53        }
     54    }
     55
     56
     57    //スコープ抜け出しスケジュール
     58    ppScopes[level]->RunScheduleOfBreak();
     59
     60
     61    //スコープレベルを下げる
     62    delete ppScopes[level];
     63    level--;
     64}
     65
    3166// スコープ終了時のデストラクタ呼び出し
    3267void LexicalScopesImpl::CallDestructorsOfScopeEnd(){
    3368
    34     Variables &vars = UserProc::IsGlobalAreaCompiling()?
    35         globalVars :
    36         UserProc::CompilingUserProc().localVars;
     69    Variables &vars = UserProc::IsGlobalAreaCompiling() ?
     70        compiler.GetMeta().GetGlobalVars() :
     71        UserProc::CompilingUserProc().GetLocalVars();
    3772
    3873
     
    5287        //同一レベルのレキシカルスコープのみを検知
    5388        if(!pVar->bLiving) continue;
    54         if( pVar->ScopeLevel != GetNowLevel() ) continue;
     89        if( pVar->GetScopeLevel() != GetNowLevel() ) continue;
    5590
    56         if( pVar->IsStruct() && pVar->IsParameter() ){
     91        if( pVar->GetType().IsStruct() && pVar->IsParameter() ){
    5792            //構造体パラメータを持つとき
    5893
     
    6499            //mov rcx,qword ptr[rsp+offset]
    65100            op_mov_RM(sizeof(_int64),REG_RCX,REG_RSP,
    66                 -pVar->offset,
     101                -pVar->GetOffsetAddress(),
    67102                MOD_BASE_DISP32);
    68103            obp-=sizeof(long);
     
    73108
    74109            //mov ecx,dword ptr[ebp+offset]
    75             op_mov_RM(sizeof(long),REG_ECX,REG_EBP,-pVar->offset,MOD_BASE_DISP32);
     110            op_mov_RM(sizeof(long),REG_ECX,REG_EBP,-pVar->GetOffsetAddress(),MOD_BASE_DISP32);
    76111            obp-=sizeof(long);
    77112            AddLocalVarAddrSchedule();
     
    83118
    84119            //call free
    85             extern UserProc *pSub_free;
     120            extern const UserProc *pSub_free;
    86121            op_call(pSub_free);
    87122
     
    96131    if(indexSystemGC!=-1){
    97132        //_System_GCオブジェクトのデストラクタの呼び出し処理
    98         const CMethod *method = vars[indexSystemGC]->GetClass().GetDestructorMethod();
     133        const CMethod *method = vars[indexSystemGC]->GetType().GetClass().GetDestructorMethod();
    99134        if( method ){
    100             Opcode_CallProc("",method->pUserProc,0,vars[indexSystemGC]->GetName().c_str(),DEF_OBJECT);
     135            Opcode_CallProc("",&method->GetUserProc(),0,vars[indexSystemGC]->GetName().c_str(),DEF_OBJECT);
    101136        }
    102137    }
Note: See TracChangeset for help on using the changeset viewer.