Ignore:
Timestamp:
Aug 17, 2007, 7:36:51 AM (17 years ago)
Author:
dai_9181
Message:
 
Location:
trunk/abdev/BasicCompiler_Common/src
Files:
5 edited

Legend:

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

    r279 r288  
    1 #include "stdafx.h"
     1#include <string>
     2#include <vector>
     3#include <fstream>
     4
     5#include <windows.h>
     6#include <stdio.h>
     7#include <string.h>
     8#include <math.h>
     9#include <commctrl.h>
     10#include <time.h>
     11#include <limits.h>
     12#include <shlobj.h>
     13
     14//boost libraries
     15#include <boost/foreach.hpp>
     16
     17#include "../common.h"
    218
    319#include <boost/archive/xml_oarchive.hpp>
     
    1632
    1733#include <BoostSerializationSupport.h>
    18 
    19 #include <windows.h>
     34#include <Compiler.h>
    2035
    2136using namespace Jenga::Common;
  • trunk/abdev/BasicCompiler_Common/src/LexicalScope.cpp

    r276 r288  
    7171    CallDestructorsOfScopeEnd();
    7272
    73     Variables &vars = UserProc::IsGlobalAreaCompiling() ?
    74         compiler.GetObjectModule().meta.GetGlobalVars() :
    75         UserProc::CompilingUserProc().GetLocalVars();
     73    Variables *pVars = UserProc::IsGlobalAreaCompiling() ?
     74        &compiler.GetObjectModule().meta.GetGlobalVars() :
     75        &UserProc::CompilingUserProc().GetLocalVars();
    7676
    7777    //使用済みローカル変数の生存チェックを外す
    78     BOOST_FOREACH( Variable *pVar, vars ){
     78    BOOST_FOREACH( Variable *pVar, (*pVars) ){
    7979        if(pVar->bLiving&&pVar->GetScopeLevel()==level){
    8080            pVar->bLiving=0;
     
    9696void LexicalScopes::CallDestructorsOfScopeEnd(){
    9797
    98     Variables &vars = UserProc::IsGlobalAreaCompiling() ?
    99         compiler.GetObjectModule().meta.GetGlobalVars() :
    100         UserProc::CompilingUserProc().GetLocalVars();
     98    Variables *pVariabls = UserProc::IsGlobalAreaCompiling() ?
     99        &compiler.GetObjectModule().meta.GetGlobalVars() :
     100        &UserProc::CompilingUserProc().GetLocalVars();
    101101
    102102
    103103    int i3;
    104104    int indexSystemGC=-1;
    105     for( i3 = (int)vars.size() - 1; i3 >= 0; i3-- ){        //確保したのと逆順序で解放するため、バックサーチにする
     105    for( i3 = (int)pVariabls->size() - 1; i3 >= 0; i3-- ){      //確保したのと逆順序で解放するため、バックサーチにする
    106106
    107         Variable *pVar = vars[i3];
     107        Variable *pVar = (*pVariabls)[i3];
    108108
    109109        if( UserProc::IsGlobalAreaCompiling() && GetNowLevel() == 0 ){
     
    159159    if(indexSystemGC!=-1){
    160160        //_System_GCオブジェクトのデストラクタの呼び出し処理
    161         const CMethod *method = vars[indexSystemGC]->GetType().GetClass().GetDestructorMethod();
     161        const CMethod *method = (*pVariabls)[indexSystemGC]->GetType().GetClass().GetDestructorMethod();
    162162        if( method ){
    163             Opcode_CallProc("",&method->GetUserProc(),0,vars[indexSystemGC]->GetName().c_str(),DEF_OBJECT);
     163            Opcode_CallProc("",&method->GetUserProc(),0,(*pVariabls)[indexSystemGC]->GetName().c_str(),DEF_OBJECT);
    164164        }
    165165    }
  • trunk/abdev/BasicCompiler_Common/src/Linker.cpp

    r287 r288  
    7878void Linker::ResolveGlobalVarSchedules( long rwSectionBaseOffset )
    7979{
    80     int allInitVarSize = compiler.GetObjectModule().meta.GetGlobalVars().GetAllInitSize();
     80    int allInitVarSize = compiler.GetObjectModule().meta.GetGlobalVars().initAreaBuffer.GetSize();
    8181
    8282    BOOST_FOREACH( const Schedule &schedule, nativeCode.GetSchedules() )
  • trunk/abdev/BasicCompiler_Common/src/Meta.cpp

    r287 r288  
    8282
    8383    // グローバル変数
     84    long initAreaBaseOffset = this->globalVars.initAreaBuffer.GetSize();
    8485    BOOST_FOREACH( Variable *pVar, meta.globalVars )
    8586    {
     
    9495        {
    9596            // 初期バッファがあるときはデータテーブルオフセットを適用する
    96             pVar->SetOffsetAddress( pVar->GetOffsetAddress() + dataSectionBaseOffset );
     97            pVar->SetOffsetAddress( pVar->GetOffsetAddress() + initAreaBaseOffset );
    9798
    9899            isResetOffsetAddress = false;
     
    103104    }
    104105    meta.globalVars.PullOutAll();
     106    this->globalVars.initAreaBuffer.Put(
     107        meta.globalVars.initAreaBuffer.GetBuffer(),
     108        meta.globalVars.initAreaBuffer.GetSize()
     109    );
    105110
    106111    // グローバル定数
  • trunk/abdev/BasicCompiler_Common/src/Variable.cpp

    r287 r288  
    3333    //レキシカルスコープを考慮して重複判定
    3434    for( int i=(int)this->size()-1; i>=0 ; i-- ){
    35         Variable &var = *(*this)[i];
    36         if( var.bLiving                                         //現在のスコープで有効なもの
    37             && var.GetScopeLevel() == compiler.codeGenerator.lexicalScopes.GetNowLevel()    //現在のスコープと同一レベル
     35        const Variable *pVar = (*this)[i];
     36        if( pVar->bLiving                                           //現在のスコープで有効なもの
     37            && pVar->GetScopeLevel() == compiler.codeGenerator.lexicalScopes.GetNowLevel()  //現在のスコープと同一レベル
    3838            )
    3939        {
    40             if( var.IsEqualSymbol( symbol ) ){
     40            if( pVar->IsEqualSymbol( symbol ) ){
    4141                return true;
    4242            }
     
    5050    //レキシカルスコープを考慮してバックサーチ
    5151    for( int i=(int)this->size()-1; i>=0 ; i-- ){
    52         Variable &var = *(*this)[i];
    53         if( var.bLiving                                         //現在のスコープで有効なもの
    54             && var.GetScopeLevel() <= compiler.codeGenerator.lexicalScopes.GetNowLevel()    //現在のスコープレベルを超さないもの(Returnによる解放処理中を考慮)
     52        const Variable *pVar = (*this)[i];
     53        if( pVar->bLiving                                           //現在のスコープで有効なもの
     54            && pVar->GetScopeLevel() <= compiler.codeGenerator.lexicalScopes.GetNowLevel()  //現在のスコープレベルを超さないもの(Returnによる解放処理中を考慮)
    5555            ){
    56                 if( var.IsEqualSymbol( symbol ) ){
    57                     return &var;
     56                if( pVar->IsEqualSymbol( symbol ) ){
     57                    return pVar;
    5858                }
    5959        }
     
    7474}
    7575
    76 void Variables::Add( Variable *pVar, bool isResetOffsetAddress )
     76void GlobalVars::Add( Variable *pVar, bool isResetOffsetAddress )
    7777{
    7878    int alignment = 0;
     
    8484        //初期バッファがあるとき
    8585
    86         if( alignment ){
    87             if( allInitSize % alignment ){
    88                 allInitSize += alignment - (allInitSize % alignment);
    89             }
    90         }
    91 
    9286        if( isResetOffsetAddress )
    9387        {
    94             pVar->SetOffsetAddress( allInitSize );
     88            if( alignment ){
     89                if( initAreaBuffer.GetSize() % alignment ){
     90                    initAreaBuffer.Resize( initAreaBuffer.GetSize() + ( alignment - (initAreaBuffer.GetSize() % alignment) ) );
     91                }
     92            }
     93
     94            pVar->SetOffsetAddress( initAreaBuffer.GetSize() );
     95
     96            initAreaBuffer.Resize( initAreaBuffer.GetSize() + pVar->GetMemorySize() );
    9597        }
    96         allInitSize += pVar->GetMemorySize();
    9798    }
    9899    else{
     
    105106        }
    106107
    107         if( !isResetOffsetAddress )
    108         {
    109             Jenga::Throw( "[Variables::Add] 初期バッファがない変数に対してisResetOffsetAddressをfalseにできない" );
    110         }
    111 
    112108        pVar->SetOffsetAddress( allSize | 0x80000000 );
    113109        allSize += pVar->GetMemorySize();
Note: See TracChangeset for help on using the changeset viewer.