Ignore:
Timestamp:
Jul 29, 2007, 12:33:04 PM (17 years ago)
Author:
dai_9181
Message:

BreakPertialScheduleをリファクタリング

File:
1 moved

Legend:

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

    r245 r248  
    11#include "stdafx.h"
    22
    3 #include <LexicalScopingImpl.h>
     3#include <LexicalScope.h>
    44#include <Compiler.h>
    55
     
    1313
    1414
    15 void ScopeImpl::Break(){
     15void LexicalScope::Break(){
    1616    //未解放のローカルオブジェクトを解放する
    17     GetLexicalScopes().CallDestructorsOfReturn( level );
     17    compiler.codeGenerator.lexicalScopes.CallDestructorsOfReturn( level );
    1818
    1919    //jmp ...(Next addr)
    20     OpBuffer[obp++]=(char)0xE9;
    21 
    22     pBreakSchedule=(DWORD *)realloc( pBreakSchedule, ( nBreakSchedule + 1 ) * sizeof(DWORD) );
    23     pBreakSchedule[nBreakSchedule]=obp;
    24     nBreakSchedule++;
    25 
    26     obp+=sizeof(long);
     20    breakPertialSchedules.push_back(
     21        compiler.codeGenerator.op_jmp( 0, sizeof(long), true )
     22    );
    2723}
    28 void ScopeImpl::RunScheduleOfBreak(){
    29     for(int i=0;i<nBreakSchedule;i++){
    30         *((long *)(OpBuffer+pBreakSchedule[i]))=obp-(pBreakSchedule[i]+sizeof(long));
     24void LexicalScope::RunScheduleOfBreak(){
     25    BOOST_FOREACH( const PertialSchedule *pBreakPertialSchedule, breakPertialSchedules )
     26    {
     27        compiler.codeGenerator.opfix_JmpPertialSchedule( pBreakPertialSchedule );
    3128    }
    3229}
    3330
    34 void LexicalScopesImpl::End(){
     31
     32
     33LexicalScope *LexicalScopes::SearchScope( LexicalScope::SCOPE_TYPE TypeOfStatement ){
     34    for( int i = level; i>=0; i-- ){
     35        if( ppScopes[i]->GetTypeOfStatement() == TypeOfStatement ){
     36            return ppScopes[i];
     37        }
     38    }
     39    return NULL;
     40}
     41
     42void LexicalScopes::Init(int addr){
     43    // TODO: エラーチェック
     44
     45    level = -1;
     46    Start( addr, LexicalScope::SCOPE_TYPE_BASE );
     47}
     48void LexicalScopes::Start( int addr, LexicalScope::SCOPE_TYPE TypeOfStatement ){
     49    level++;
     50    ppScopes = (LexicalScope **)realloc( ppScopes, ( level + 1 ) * sizeof( LexicalScope * ) );
     51    ppScopes[level] = new LexicalScope( level, addr, TypeOfStatement );
     52}
     53
     54int LexicalScopes::GetNowLevel(){
     55    return level;
     56}
     57void LexicalScopes::SetNowLevel( int level ){
     58    this->level = level;
     59}
     60int LexicalScopes::GetStartAddress(){
     61    return ppScopes[level]->GetStartAddress();
     62}
     63
     64void LexicalScopes::End(){
    3565    if( level <= 0 ){
    3666        SetError();
     
    6595
    6696// スコープ終了時のデストラクタ呼び出し
    67 void LexicalScopesImpl::CallDestructorsOfScopeEnd(){
     97void LexicalScopes::CallDestructorsOfScopeEnd(){
    6898
    6999    Variables &vars = UserProc::IsGlobalAreaCompiling() ?
     
    134164
    135165// Returnステートメントで発行されるデストラクタを生成
    136 void LexicalScopesImpl::CallDestructorsOfReturn( int BaseLevel ){
     166void LexicalScopes::CallDestructorsOfReturn( int BaseLevel ){
    137167    //現在のスコープレベルを退避
    138168    int backupScopeLevel = GetNowLevel();
     
    147177    SetNowLevel( backupScopeLevel );
    148178}
    149 
    150 LexicalScopesImpl &GetLexicalScopes()
    151 {
    152     static LexicalScopesImpl *pTemp = NULL;
    153     if( !pTemp )
    154     {
    155         pTemp = (LexicalScopesImpl *)Smoothie::Temp::pLexicalScopes;
    156     }
    157     return *pTemp;
    158 }
Note: See TracChangeset for help on using the changeset viewer.