Changeset 206 in dev for trunk/abdev/BasicCompiler64


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

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

Location:
trunk/abdev/BasicCompiler64
Files:
25 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler64/BasicCompiler.vcproj

    r198 r206  
    5555                RuntimeLibrary="1"
    5656                RuntimeTypeInfo="true"
    57                 UsePrecompiledHeader="0"
     57                UsePrecompiledHeader="2"
    5858                PrecompiledHeaderFile=".\Debug/BasicCompiler.pch"
    5959                AssemblerListingLocation=".\Debug/"
     
    167167                RuntimeLibrary="1"
    168168                RuntimeTypeInfo="true"
    169                 UsePrecompiledHeader="0"
     169                UsePrecompiledHeader="2"
    170170                PrecompiledHeaderFile=".\Release/BasicCompiler.pch"
    171171                AssemblerListingLocation=".\Release/"
     
    246246            </File>
    247247            <File
    248                 RelativePath="..\BasicCompiler_Common\BasicFixed.h"
    249                 >
    250             </File>
    251             <File
    252248                RelativePath="CommandValue.h"
    253249                >
     
    263259            <File
    264260                RelativePath="..\BasicCompiler_Common\include\option.h"
     261                >
     262            </File>
     263            <File
     264                RelativePath=".\stdafx.h"
    265265                >
    266266            </File>
     
    289289                >
    290290                <File
    291                     RelativePath="..\BasicCompiler_Common\include\ClassImpl.h"
     291                    RelativePath="..\BasicCompiler_Common\include\Class.h"
    292292                    >
    293293                </File>
     
    301301                </File>
    302302                <File
     303                    RelativePath="..\BasicCompiler_Common\include\Const.h"
     304                    >
     305                </File>
     306                <File
    303307                    RelativePath="..\BasicCompiler_Common\include\DataTable.h"
    304308                    >
     
    313317                </File>
    314318                <File
     319                    RelativePath="..\BasicCompiler_Common\include\Member.h"
     320                    >
     321                </File>
     322                <File
    315323                    RelativePath="..\BasicCompiler_Common\include\MetaImpl.h"
    316324                    >
    317325                </File>
    318326                <File
     327                    RelativePath="..\BasicCompiler_Common\include\Method.h"
     328                    >
     329                </File>
     330                <File
    319331                    RelativePath="..\BasicCompiler_Common\include\NamespaceSupporter.h"
    320332                    >
    321333                </File>
    322334                <File
    323                     RelativePath="..\BasicCompiler_Common\include\ProcedureImpl.h"
     335                    RelativePath="..\BasicCompiler_Common\include\Parameter.h"
     336                    >
     337                </File>
     338                <File
     339                    RelativePath="..\BasicCompiler_Common\include\Procedure.h"
    324340                    >
    325341                </File>
     
    329345                </File>
    330346                <File
     347                    RelativePath="..\BasicCompiler_Common\include\Prototype.h"
     348                    >
     349                </File>
     350                <File
    331351                    RelativePath="..\BasicCompiler_Common\include\SmoothieImpl.h"
    332352                    >
    333353                </File>
    334354                <File
     355                    RelativePath="..\BasicCompiler_Common\include\Symbol.h"
     356                    >
     357                </File>
     358                <File
     359                    RelativePath="..\BasicCompiler_Common\include\Type.h"
     360                    >
     361                </File>
     362                <File
    335363                    RelativePath="..\BasicCompiler_Common\include\TypeDef.h"
    336364                    >
    337365                </File>
    338366                <File
    339                     RelativePath="..\BasicCompiler_Common\include\VariableImpl.h"
     367                    RelativePath="..\BasicCompiler_Common\include\Variable.h"
    340368                    >
    341369                </File>
     
    396424                        Name="VCResourceCompilerTool"
    397425                        PreprocessorDefinitions="_DEBUG;JPN;$(NoInherit)"
     426                    />
     427                </FileConfiguration>
     428            </File>
     429            <File
     430                RelativePath=".\stdafx.cpp"
     431                >
     432                <FileConfiguration
     433                    Name="Debug|Win32"
     434                    >
     435                    <Tool
     436                        Name="VCCLCompilerTool"
     437                        UsePrecompiledHeader="1"
     438                    />
     439                </FileConfiguration>
     440                <FileConfiguration
     441                    Name="Release|Win32"
     442                    >
     443                    <Tool
     444                        Name="VCCLCompilerTool"
     445                        UsePrecompiledHeader="1"
    398446                    />
    399447                </FileConfiguration>
     
    9811029                </Filter>
    9821030                <Filter
    983                     Name="Constant"
    984                     >
    985                     <File
    986                         RelativePath="..\BasicCompiler_Common\Const.cpp"
    987                         >
    988                     </File>
    989                     <File
    990                         RelativePath="..\BasicCompiler_Common\Const.h"
    991                         >
    992                     </File>
    993                 </Filter>
    994                 <Filter
    9951031                    Name="Variable"
    9961032                    >
     
    10211057                >
    10221058                <File
    1023                     RelativePath="..\BasicCompiler_Common\src\ClassImpl.cpp"
     1059                    RelativePath="..\BasicCompiler_Common\src\Class.cpp"
    10241060                    >
    10251061                </File>
     
    10331069                </File>
    10341070                <File
     1071                    RelativePath="..\BasicCompiler_Common\src\Const.cpp"
     1072                    >
     1073                </File>
     1074                <File
    10351075                    RelativePath="..\BasicCompiler_Common\src\DataTable.cpp"
    10361076                    >
     
    10451085                </File>
    10461086                <File
     1087                    RelativePath="..\BasicCompiler_Common\src\Method.cpp"
     1088                    >
     1089                </File>
     1090                <File
    10471091                    RelativePath="..\BasicCompiler_Common\src\NamespaceSupporter.cpp"
    10481092                    >
    10491093                </File>
    10501094                <File
    1051                     RelativePath="..\BasicCompiler_Common\src\ProcedureImpl.cpp"
     1095                    RelativePath="..\BasicCompiler_Common\src\Procedure.cpp"
    10521096                    >
    10531097                </File>
     
    10611105                </File>
    10621106                <File
     1107                    RelativePath="..\BasicCompiler_Common\src\Symbol.cpp"
     1108                    >
     1109                </File>
     1110                <File
     1111                    RelativePath="..\BasicCompiler_Common\src\Type.cpp"
     1112                    >
     1113                </File>
     1114                <File
    10631115                    RelativePath="..\BasicCompiler_Common\src\TypeDef.cpp"
    10641116                    >
    10651117                </File>
    10661118                <File
    1067                     RelativePath="..\BasicCompiler_Common\src\VariableImpl.cpp"
     1119                    RelativePath="..\BasicCompiler_Common\src\Variable.cpp"
    10681120                    >
    10691121                </File>
  • trunk/abdev/BasicCompiler64/CLockParameter.cpp

    r3 r206  
     1#include "stdafx.h"
     2
    13#include "../BasicCompiler_Common/common.h"
    24#include "opcode.h"
  • trunk/abdev/BasicCompiler64/CParameter.cpp

    r75 r206  
     1#include "stdafx.h"
     2
    13#include "../BasicCompiler_Common/common.h"
    24#include "opcode.h"
     
    110112
    111113                //call free
    112                 extern UserProc *pSub_free;
     114                extern const UserProc *pSub_free;
    113115                op_call(pSub_free);
    114116            }
     
    133135
    134136        //call calloc
    135         extern UserProc *pSub_calloc;
     137        extern const UserProc *pSub_calloc;
    136138        op_call(pSub_calloc);
    137139
  • trunk/abdev/BasicCompiler64/Compile_Calc.cpp

    r198 r206  
     1#include "stdafx.h"
     2
    13#include <jenga/include/smoothie/Smoothie.h>
    24#include <jenga/include/smoothie/LexicalAnalysis.h>
     
    9496            }
    9597            else{
    96                 if(GetConstHash(variable)){
     98                if( compiler.GetMeta().GetGlobalConsts().IsExist(variable)
     99                    || compiler.GetMeta().GetGlobalConstMacros().IsExist(variable) )
     100                {
    97101                    //定数リストに該当したとき
    98102                    SetError(1,NULL,cp);
     
    234238    if( varType.IsObject() && compiler.GetMeta().GetBlittableTypes().IsExist( calcType ) ){
    235239        // Blittable型をオブジェクトとして扱う
    236         vector<UserProc *> userProcs;
     240        vector<const UserProc *> userProcs;
    237241        compiler.GetMeta().GetBlittableTypes().GetClass( calcType ).GetStaticMethods().Enum( "_Create", userProcs );
    238242        if( userProcs.size() != 1 ){
     
    240244            return;
    241245        }
    242         UserProc *pUserProc = userProcs[0];
     246        const UserProc *pUserProc = userProcs[0];
    243247
    244248        // mov rcx, rax
  • trunk/abdev/BasicCompiler64/Compile_Calc_PushVar.cpp

    r66 r206  
     1#include "stdafx.h"
     2
    13#include "../BasicCompiler_Common/common.h"
    24#include "Opcode.h"
  • trunk/abdev/BasicCompiler64/Compile_CallProc.cpp

    r198 r206  
     1#include "stdafx.h"
     2
    13#include <jenga/include/smoothie/Smoothie.h>
    24
     
    1214void Call_DebugSys_SaveContext(){
    1315    //call _System_GetEip
    14     extern UserProc *pSub_System_GetEip;
     16    extern const UserProc *pSub_System_GetEip;
    1517    op_call(pSub_System_GetEip);
    1618
     
    2224
    2325    //call _DebugSys_SaveContext
    24     extern UserProc *pSub_DebugSys_SaveContext;
     26    extern const UserProc *pSub_DebugSys_SaveContext;
    2527    op_call(pSub_DebugSys_SaveContext);
    2628}
     
    99101}
    100102
    101 bool Opcode_CallProc(const char *Parameter,UserProc *pUserProc,DWORD dwFlags,const char *ObjectName,int RefType){
     103bool Opcode_CallProc(const char *Parameter,const UserProc *pUserProc,DWORD dwFlags,const char *ObjectName,int RefType){
    102104    // TODO: RefTypeは不必要なので削除する
    103105    int i2;
     
    128130            if(lstrcmpi(ObjectName,"Super")==0){
    129131                //クラスメンバ関数内から基底クラスの呼び出し
    130                 pobj_c=Smoothie::Temp::pCompilingClass;
     132                pobj_c=compiler.pCompilingClass;
    131133            }
    132134            else{
     
    153155            else{
    154156                //クラスメンバ関数内から同一クラスのメンバ関数の呼び出し
    155                 pobj_c=Smoothie::Temp::pCompilingClass;
     157                pobj_c=compiler.pCompilingClass;
    156158            }
    157159        }
     
    182184        if(ObjectName[0]){
    183185            //外部からの呼び出し
    184             if(pobj_c==Smoothie::Temp::pCompilingClass){
     186            if(pobj_c==compiler.pCompilingClass){
    185187                //同一クラスオブジェクトの場合はプライベートアクセスを容認する
    186188                if( pMethod->IsNoneAccess() ){
     
    279281
    280282            //call calloc
    281             extern UserProc *pSub_calloc;
     283            extern const UserProc *pSub_calloc;
    282284            op_call(pSub_calloc);
    283285
  • trunk/abdev/BasicCompiler64/Compile_Func.cpp

    r198 r206  
     1#include "stdafx.h"
     2
    13#include <jenga/include/smoothie/Smoothie.h>
    24
     
    4648    }
    4749
    48     int SubScripts[MAX_ARRAYDIM];
     50    Subscripts subscripts;
    4951    RELATIVE_VAR RelativeVar;
    50     if(!GetVarOffsetReadOnly(tempParm,&RelativeVar,type,SubScripts)) return;
     52    if(!GetVarOffsetReadOnly(tempParm,&RelativeVar,type,&subscripts)) return;
    5153
    5254    if(type.GetBasicType()&FLAG_PTR){
     
    5961    int typeSize = type.GetSize();
    6062
    61     if(bArrayHead) typeSize*=JumpSubScripts(SubScripts);
     63    if(bArrayHead) typeSize*=JumpSubScripts(subscripts);
    6264
    6365    //mov rax,TypeSize
     
    6870void Opcode_Func_AddressOf( const char *name ){
    6971    extern int cp;
    70     UserProc *pUserProc;
     72    const UserProc *pUserProc;
    7173
    7274    extern LONG_PTR ProcPtr_BaseIndex;
     
    7476        //左辺の型にのっとり、オーバーロードを解決
    7577
    76         std::vector<UserProc *> subs;
     78        std::vector<const UserProc *> subs;
    7779        GetOverloadSubHash( name, subs );
    7880        if( subs.size() == 0 ){
     
    131133            SetThisPtrToReg(REG_RCX);
    132134
    133             pobj_c=Smoothie::Temp::pCompilingClass;
     135            pobj_c=compiler.pCompilingClass;
    134136        }
    135137
  • trunk/abdev/BasicCompiler64/Compile_Interface.cpp

    r132 r206  
     1#include "stdafx.h"
     2
    13#include "../BasicCompiler_Common/common.h"
    24#include "opcode.h"
  • trunk/abdev/BasicCompiler64/Compile_Object.cpp

    r140 r206  
     1#include "stdafx.h"
     2
    13#include "../BasicCompiler_Common/common.h"
    24#include "opcode.h"
     
    3335    ////////////////////////
    3436
    35     std::vector<UserProc *> subs;
     37    std::vector<const UserProc *> subs;
    3638    pobj_c->GetMethods().Enum( pobj_c->GetName().c_str(), subs );
    3739
    38     UserProc *pUserProc;
     40    const UserProc *pUserProc;
    3941    if( subs.size() > 0 ){
    4042        //オーバーロードを解決
     
    142144
    143145        //call _System_GC_malloc_ForObject
    144         extern UserProc *pSub_System_GC_malloc_ForObject;
     146        extern const UserProc *pSub_System_GC_malloc_ForObject;
    145147        op_call(pSub_System_GC_malloc_ForObject);
    146148    }
     
    150152
    151153        //call _System_GC_malloc_ForObjectPtr
    152         extern UserProc *pSub_System_GC_malloc_ForObjectPtr;
     154        extern const UserProc *pSub_System_GC_malloc_ForObjectPtr;
    153155        op_call(pSub_System_GC_malloc_ForObjectPtr);
    154156    }
     
    185187    op_mov_RV(sizeof(_int64),REG_RCX,0);
    186188    obp-=sizeof(long);
    187     pobj_SubAddrSchedule->add(method->pUserProc,0);
    188     method->pUserProc->Using();
     189    pobj_SubAddrSchedule->add(&method->GetUserProc(),0);
     190    method->GetUserProc().Using();
    189191    obp+=sizeof(long);
    190192
     
    299301    if( isSweeping ){
    300302        //call _System_GC_free_for_SweepingDelete
    301         extern UserProc *pSub_System_GC_free_for_SweepingDelete;
     303        extern const UserProc *pSub_System_GC_free_for_SweepingDelete;
    302304        op_call(pSub_System_GC_free_for_SweepingDelete);
    303305    }
    304306    else{
    305307        //call free
    306         extern UserProc *pSub_free;
     308        extern const UserProc *pSub_free;
    307309        op_call(pSub_free);
    308310    }
  • trunk/abdev/BasicCompiler64/Compile_ProcOp.cpp

    r204 r206  
     1#include "stdafx.h"
     2
    13#include <jenga/include/smoothie/Smoothie.h>
    24#include <jenga/include/smoothie/LexicalAnalysis.h>
     
    57#include <Compiler.h>
    68#include <LexicalScopingImpl.h>
    7 #include <ClassImpl.h>
    8 #include <VariableImpl.h>
     9#include <Class.h>
    910
    1011#include "../BasicCompiler_Common/common.h"
     
    3132        }
    3233
    33         UserProc *pBackUserProc;
    34         pBackUserProc = &UserProc::CompilingUserProc();
     34        const UserProc *pBackUserProc = &UserProc::CompilingUserProc();
    3535        UserProc::CompileStartForGlobalArea();
    3636
     
    5454
    5555        //_System_StartupProgramの呼び出し
    56         extern UserProc *pSub_System_StartupProgram;
     56        extern const UserProc *pSub_System_StartupProgram;
    5757        op_call(pSub_System_StartupProgram);
    5858
     
    8282        StackFrameSchedule=obp-sizeof(long);
    8383
    84         BOOST_FOREACH( Variable *pVar, globalVars ){
     84        BOOST_FOREACH( Variable *pVar, compiler.GetMeta().GetGlobalVars() ){
    8585            if(memicmp(pVar->GetName().c_str(),"Static%",7)==0){
    8686                //コンストラクタ呼び出し
    87                 if( pVar->IsObject() ){
     87                if( pVar->GetType().IsObject() ){
    8888
    8989                    //エラー用
     
    9292                    CallConstructor(
    9393                        pVar->GetName().c_str(),
    94                         pVar->GetSubScriptsPtr(),
    95                         *pVar,
    96                         pVar->paramStrForConstructor.c_str());
     94                        pVar->GetSubscripts(),
     95                        pVar->GetType(),
     96                        pVar->GetParamStrForConstructor().c_str());
    9797                }
    9898            }
     
    113113
    114114
    115         UserProc *pBackUserProc;
    116         pBackUserProc = &UserProc::CompilingUserProc();
     115        const UserProc *pBackUserProc = &UserProc::CompilingUserProc();
    117116        UserProc::CompileStartForGlobalArea();
    118117
     
    212211    }
    213212}
    214 void AutoGeneration(UserProc &userProc){
     213void AutoGeneration(const UserProc &userProc){
    215214    if( userProc.GetName() == "InitializeUserTypes"
    216215        && userProc.HasParentClass()
     
    229228    }
    230229}
    231 void _compile_proc(UserProc *pUserProc){
     230void _compile_proc(const UserProc *pUserProc){
    232231    extern char *basbuf;
    233232    extern HANDLE hHeap;
    234     extern GlobalProc **ppSubHash;
    235233    extern BOOL bDebugCompile;
    236234    int i3,i4;
     
    239237    if( pUserProc->IsUsing() == false || pUserProc->IsCompiled() ) return;
    240238
    241     if( pUserProc->localVars.size() ){
     239    if( pUserProc->GetLocalVars().size() ){
    242240        SetError();
    243241        return;
    244242    }
     243
     244    trace_for_sourcecodestep( "★★★ " << pUserProc->GetFullName() << "のコンパイルを開始" );
    245245
    246246    pUserProc->CompleteCompile();
     
    259259    else bDebugSupportProc=0;
    260260
    261     pUserProc->beginOpAddress=obp;
     261    pUserProc->SetBeginOpAddress( obp );
    262262
    263263    //コンパイル中の関数が属するクラス
    264     Smoothie::Temp::pCompilingClass=pUserProc->GetParentClassPtr();
     264    compiler.pCompilingClass=pUserProc->GetParentClassPtr();
    265265
    266266    //コンパイルスタートをクラス管理クラスに追加
     
    294294        pobj_sf=0;
    295295
    296         pUserProc->endOpAddress=obp;
     296        pUserProc->SetEndOpAddress( obp );
    297297        return;
    298298    }
     
    360360        Parameter &param = *pUserProc->RealParams()[i3];
    361361
    362         Variable *pVar = new VariableImpl( param.GetVarName(), param, false, param.IsRef() );
     362        Variable *pVar = new Variable( param.GetVarName(), param, false, param.IsRef(), "" );
    363363
    364364        if( param.IsArray() ){
    365             pVar->SetArray( param.GetSubScriptsPtr() );
     365            pVar->SetArray( param.GetSubscripts() );
    366366        }
    367367
     
    381381        }
    382382        AllLocalVarSize+=varSize;
    383         pVar->offset=AllLocalVarSize;
     383        pVar->SetOffsetAddress( AllLocalVarSize );
    384384
    385385        //レキシカルスコープ情報
    386         pVar->ScopeLevel=GetLexicalScopes().GetNowLevel();
    387         pVar->ScopeStartAddress=GetLexicalScopes().GetStartAddress();
     386        pVar->SetScopeLevel( GetLexicalScopes().GetNowLevel() );
     387        pVar->SetScopeStartAddress( GetLexicalScopes().GetStartAddress() );
    388388        pVar->bLiving=TRUE;
    389389
    390         pUserProc->localVars.push_back( pVar );
     390        pUserProc->GetLocalVars().push_back( pVar );
    391391    }
    392392
     
    507507
    508508        //call _DebugSys_StartProc
    509         extern UserProc *pSub_DebugSys_StartProc;
     509        extern const UserProc *pSub_DebugSys_StartProc;
    510510        op_call(pSub_DebugSys_StartProc);
    511511    }
    512512
    513     if(Smoothie::Temp::pCompilingClass){
    514         if( pUserProc->GetName() == Smoothie::Temp::pCompilingClass->GetName() ){
     513    if(compiler.pCompilingClass){
     514        if( pUserProc->GetName() == compiler.pCompilingClass->GetName() ){
    515515            ////////////////////////////////////
    516516            // コンストラクタをコンパイルするとき
     
    518518
    519519            //コンストラクタのコンパイル開始を通知
    520             Smoothie::Temp::pCompilingClass->NotifyStartConstructorCompile();
     520            compiler.pCompilingClass->NotifyStartConstructorCompile();
    521521
    522522            //基底クラスかどうかの識別
    523523            //(継承元がインターフェイスの場合も基底クラスと見なす)
    524524            BOOL bThisIsSuperClass;
    525             if( !Smoothie::Temp::pCompilingClass->HasSuperClass() ) bThisIsSuperClass=1;
    526             else if( Smoothie::Temp::pCompilingClass->GetSuperClass().GetConstructorMethod() == NULL ){
     525            if( !compiler.pCompilingClass->HasSuperClass() ) bThisIsSuperClass=1;
     526            else if( compiler.pCompilingClass->GetSuperClass().GetConstructorMethod() == NULL ){
    527527                //インターフェイスを継承したときはコンストラクタを持たない
    528528                bThisIsSuperClass=1;
     
    543543                    temporary[i4]=basbuf[i3];
    544544                }
    545                 if( Smoothie::Temp::pCompilingClass->GetSuperClass().GetName() == temporary ){
     545                if( compiler.pCompilingClass->GetSuperClass().GetName() == temporary ){
    546546                    //基底クラスのコンストラクタを呼び出す
    547547                    cp=i3;
     
    560560                    Type dummyType;
    561561                    CallProc( PROC_DEFAULT
    562                         , Smoothie::Temp::pCompilingClass->GetSuperClass().GetConstructorMethod()->pUserProc
    563                         , Smoothie::Temp::pCompilingClass->GetSuperClass().GetConstructorMethod()->pUserProc->GetName().c_str()
     562                        , &compiler.pCompilingClass->GetSuperClass().GetConstructorMethod()->GetUserProc()
     563                        , compiler.pCompilingClass->GetSuperClass().GetConstructorMethod()->GetUserProc().GetName().c_str()
    564564                        , temporary
    565565                        , dummyType );
     
    568568                    //基底クラスのコンストラクタを暗黙的に呼び出す
    569569                    Opcode_CallProc("",
    570                         Smoothie::Temp::pCompilingClass->GetSuperClass().GetConstructorMethod()->pUserProc,
     570                        &compiler.pCompilingClass->GetSuperClass().GetConstructorMethod()->GetUserProc(),
    571571                        0,
    572572                        "",
     
    576576
    577577            //仮想関数テーブルを初期化
    578             if( Smoothie::Temp::pCompilingClass->IsExistVirtualFunctions()
    579                 && !Smoothie::Temp::pCompilingClass->IsAbstract() ){
     578            if( compiler.pCompilingClass->IsExistVirtualFunctions()
     579                && !compiler.pCompilingClass->IsAbstract() ){
    580580                    //関数テーブルに値をセット
    581                     int offset = (int)Smoothie::Temp::pCompilingClass->GetVtblGlobalOffset();
     581                    int offset = (int)compiler.pCompilingClass->GetVtblGlobalOffset();
    582582
    583583                    //mov rax,offset
     
    598598
    599599            //デストラクタのコンパイル開始を通知
    600             Smoothie::Temp::pCompilingClass->NotifyStartDestructorCompile();
     600            compiler.pCompilingClass->NotifyStartDestructorCompile();
    601601        }
    602602    }
     
    624624    //////////////////////////////////////////
    625625
    626     if( Smoothie::Temp::pCompilingClass ){
    627 
    628         if( Smoothie::Temp::pCompilingClass->IsCompilingConstructor() ){
     626    if( compiler.pCompilingClass ){
     627
     628        if( compiler.pCompilingClass->IsCompilingConstructor() ){
    629629            // コンストラクタをコンパイルしていたとき
    630630
    631631            // コンストラクタのコンパイルが完了したことを通知
    632             Smoothie::Temp::pCompilingClass->NotifyFinishConstructorCompile();
     632            compiler.pCompilingClass->NotifyFinishConstructorCompile();
    633633        }
    634634        else if( pUserProc->IsDestructor() ){
     
    638638
    639639            // デストラクタのコンパイルが完了したことを通知
    640             Smoothie::Temp::pCompilingClass->NotifyFinishDestructorCompile();
    641 
    642             if( Smoothie::Temp::pCompilingClass->HasSuperClass() ){
     640            compiler.pCompilingClass->NotifyFinishDestructorCompile();
     641
     642            if( compiler.pCompilingClass->HasSuperClass() ){
    643643                /* サブクラスのデストラクタをコンパイルしているときは、
    644644                    基底クラスのデストラクタを呼び出す */
    645645
    646                 const CMethod *method = Smoothie::Temp::pCompilingClass->GetSuperClass().GetDestructorMethod();
     646                const CMethod *method = compiler.pCompilingClass->GetSuperClass().GetDestructorMethod();
    647647                if( method ){
    648648                    Opcode_CallProc("",
    649                         method->pUserProc,
     649                        &method->GetUserProc(),
    650650                        0,
    651651                        "",
     
    694694    if(bDebugCompile&&bDebugSupportProc==0){
    695695        //call _DebugSys_EndProc
    696         extern UserProc *pSub_DebugSys_EndProc;
     696        extern const UserProc *pSub_DebugSys_EndProc;
    697697        op_call(pSub_DebugSys_EndProc);
    698698    }
     
    745745    }
    746746    HeapDefaultFree(pLocalVarAddrSchedule);
    747     BOOST_FOREACH( Variable *pVar, pUserProc->localVars ){
     747    BOOST_FOREACH( Variable *pVar, pUserProc->GetLocalVars() ){
    748748        //後にデバッグで利用する
    749         pVar->offset = AllLocalVarSize + pobj_sf->GetFrameSize() - pVar->offset;
     749        pVar->SetOffsetAddress(
     750            AllLocalVarSize + pobj_sf->GetFrameSize() - pVar->GetOffsetAddress()
     751        );
    750752    }
    751753
     
    785787
    786788
    787     pUserProc->endOpAddress=obp;
     789    pUserProc->SetEndOpAddress( obp );
    788790
    789791
     
    793795}
    794796
    795 void CompileBufferInProcedure( UserProc &userProc ){
     797void CompileBufferInProcedure( const UserProc &userProc ){
    796798    if( userProc.IsUsing() == false || userProc.IsCompiled() ) return;
    797799
     
    809811}
    810812void CompileLocal(){
    811     extern GlobalProc **ppSubHash;
    812     int i2;
    813 
    814813    extern BOOL bDll;
    815814    if(bDll){
    816815        //DLLの場合はグローバル変数を初期化するための関数を一番初めにコンパイルする
    817         UserProc *pUserProc=GetSubHash("_System_InitDllGlobalVariables");
     816        const UserProc *pUserProc = GetSubHash("_System_InitDllGlobalVariables");
    818817        if(pUserProc){
    819818            CompileBufferInProcedure( *pUserProc );
     
    823822
    824823    //_System_TypeBase_InitializeUserTypesは一番最後にコンパイル
    825     extern UserProc *pSubStaticMethod_System_TypeBase_InitializeUserTypes;
     824    extern const UserProc *pSubStaticMethod_System_TypeBase_InitializeUserTypes;
    826825    pSubStaticMethod_System_TypeBase_InitializeUserTypes->CompleteCompile();
    827826
    828827    //_System_InitStaticLocalVariablesは一番最後にコンパイル
    829828    //※一般関数内の静的変数オブジェクトをすべて収集しなければならない
    830     extern UserProc *pSub_System_InitStaticLocalVariables;
     829    extern const UserProc *pSub_System_InitStaticLocalVariables;
    831830    pSub_System_InitStaticLocalVariables->CompleteCompile();
    832831
    833832    //_System_Call_Destructor_of_GlobalObjectは一番最後にコンパイル
    834     extern UserProc *pSub_System_Call_Destructor_of_GlobalObject;
     833    extern const UserProc *pSub_System_Call_Destructor_of_GlobalObject;
    835834    pSub_System_Call_Destructor_of_GlobalObject->CompleteCompile();
    836835
    837836repeat:
    838     GlobalProc *pGlobalProc;
    839     for(i2=0;i2<MAX_HASH;i2++){
    840         pGlobalProc=ppSubHash[i2];
    841         while(pGlobalProc){
    842             CompileBufferInProcedure( *pGlobalProc );
    843             pGlobalProc=pGlobalProc->pNextData;
    844         }
     837    compiler.GetMeta().GetUserProcs().Iterator_Reset();
     838    while( compiler.GetMeta().GetUserProcs().Iterator_HasNext() )
     839    {
     840        UserProc *pUserProc = compiler.GetMeta().GetUserProcs().Iterator_GetNext();
     841        CompileBufferInProcedure( *pUserProc );
    845842    }
    846843
     
    856853    if( IsNeedProcCompile() ){
    857854        //プロシージャコンパイルによって、プロシージャコンパイルが必要になる場合
    858         for(i2=0;i2<MAX_HASH;i2++){
    859             pGlobalProc=ppSubHash[i2];
    860             while(pGlobalProc){
    861                 CompileBufferInProcedure( *pGlobalProc );
    862                 pGlobalProc=pGlobalProc->pNextData;
    863             }
     855
     856        compiler.GetMeta().GetUserProcs().Iterator_Reset();
     857        while( compiler.GetMeta().GetUserProcs().Iterator_HasNext() )
     858        {
     859            UserProc *pUserProc = compiler.GetMeta().GetUserProcs().Iterator_GetNext();
     860            CompileBufferInProcedure( *pUserProc );
    864861        }
    865862    }
  • trunk/abdev/BasicCompiler64/Compile_Set_Var.cpp

    r96 r206  
     1#include "stdafx.h"
     2
    13#include "../BasicCompiler_Common/common.h"
    24#include "Opcode.h"
     
    7880
    7981                    //call free
    80                     extern UserProc *pSub_free;
     82                    extern const UserProc *pSub_free;
    8183                    op_call(pSub_free);
    8284                }
  • trunk/abdev/BasicCompiler64/Compile_Statement.cpp

    r198 r206  
     1#include "stdafx.h"
     2
    13#include <jenga/include/smoothie/LexicalAnalysis.h>
    24
     
    911void OpcodeOthers(const char *Command){
    1012    int i,i2;
    11     UserProc *pUserProc;
    1213
    1314    char leftTerm[8192];
     
    5960        //////////////////////////////
    6061
    61         pUserProc=GetSubHash(Command);
     62        const UserProc *pUserProc=GetSubHash(Command);
    6263
    6364        //GetSubHash内でエラー提示が行われた場合
     
    737738
    738739                if(type1.IsObject()){
    739                     std::vector<UserProc *> subs;
     740                    std::vector<const UserProc *> subs;
    740741                    type1.GetClass().GetMethods().Enum( CALC_EQUAL, subs );
    741742                    if( subs.size() == 0 ){
     
    747748
    748749                    //オーバーロードを解決
    749                     UserProc *pUserProc;
    750                     pUserProc=OverloadSolution("==",subs, params, NULL);
     750                    const UserProc *pUserProc = OverloadSolution("==",subs, params, NULL);
    751751
    752752                    delete params[0];
     
    892892
    893893    //call _System_GetEip
    894     extern UserProc *pSub_System_GetEip;
     894    extern const UserProc *pSub_System_GetEip;
    895895    op_call(pSub_System_GetEip);
    896896
     
    953953        //戻り値をセット
    954954        if(Parameter[0]){
    955             UserProc &proc = UserProc::CompilingUserProc();
     955            const UserProc &proc = UserProc::CompilingUserProc();
    956956
    957957            const char *temp = "_System_ReturnValue";
  • trunk/abdev/BasicCompiler64/Compile_Var.cpp

    r198 r206  
     1#include "stdafx.h"
     2
    13#include <jenga/include/smoothie/Smoothie.h>
    24#include <jenga/include/smoothie/LexicalAnalysis.h>
     
    57#include <CodeGenerator.h>
    68#include <Compiler.h>
    7 #include <VariableImpl.h>
     9#include <Variable.h>
    810
    911#include "../BasicCompiler_Common/common.h"
     
    1113
    1214//変数
    13 Variables globalVars;
     15// TODO: xml未完成
    1416int AllGlobalVarSize;
    1517int AllInitGlobalVarSize;
     
    8688    }
    8789}
    88 bool GetArrayOffset(const int *SubScripts,char *array, const Type &type){
     90bool GetArrayOffset(const Subscripts &subscripts,char *array, const Type &type){
    8991    extern HANDLE hHeap;
    9092    int i,i2,i3,i4;
     
    105107        }
    106108        if(array[i]==','||array[i]=='\0'){
    107             if(SubScripts[i3]==-1){
     109            if( i3 >= (int)subscripts.size() )
     110            {
    108111                for(i3--;i3>=0;i3--) HeapDefaultFree(pParm[i3]);
    109112                return false;
     
    118121
    119122            if(array[i]=='\0'){
    120                 if(SubScripts[i3]!=-1){
     123                if( i3 < (int)subscripts.size() )
     124                {
    121125                    for(i3--;i3>=0;i3--) HeapDefaultFree(pParm[i3]);
    122126                    return false;
     
    166170        pobj_sf->pop(REG_R12);
    167171
    168         for(i2=i+1,i4=1;i2<i3;i2++) i4*=SubScripts[i2]+1;
     172        for(i2=i+1,i4=1;i2<i3;i2++) i4*=subscripts[i2]+1;
    169173
    170174        //imul reg,i4
     
    204208    char lpPtrOffset[VN_SIZE];  //第2次配列
    205209    char NestMember[VN_SIZE];   //入れ子メンバ
    206     CClass::RefType refType;
     210    ReferenceKind refType;
    207211    lstrcpy(VarName,member);
    208212    if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember,refType)) return false;
     
    224228
    225229    //アクセシビリティをチェック
    226     if(&objClass==Smoothie::Temp::pCompilingClass){
     230    if(&objClass==compiler.pCompilingClass){
    227231        //同一クラスオブジェクトの場合はプライベートアクセスを容認する
    228232        if(pMember->IsNoneAccess()){
     
    257261    //ポインタ変数の場合
    258262    if( resultType.IsPointer() ){
    259         if(pMember->SubScripts[0]==-1){
     263        if( pMember->GetSubscripts().size() == 0 ){
    260264            lstrcpy(lpPtrOffset,array);
    261265            array[0]=0;
     
    280284    if(array[0]){
    281285        //配列オフセット
    282         if(!GetArrayOffset(pMember->SubScripts,array,pMember->GetType())){
     286        if(!GetArrayOffset(pMember->GetSubscripts(),array,pMember->GetType())){
    283287            if(isErrorEnabled) SetError(14,member,cp);
    284288        }
    285289    }
    286     else if(pMember->SubScripts[0]!=-1){
     290    else if( pMember->GetSubscripts().size() > 0 ){
    287291        resultType.SetBasicType( resultType.GetBasicType() | FLAG_PTR );
    288292    }
     
    292296
    293297        if( resultType.IsObject() || resultType.IsStruct() ){
    294             if( refType != CClass::Dot ){
     298            if( refType != RefDot ){
    295299                if(isErrorEnabled) SetError(104,member,cp);
    296300                return false;
     
    308312                //pObj[n].member
    309313                if( ( resultType.IsObjectPtr() || resultType.IsStructPtr() )
    310                     && refType != CClass::Dot ){
     314                    && refType != RefDot ){
    311315                        if(isErrorEnabled) SetError(104,member,cp);
    312316                        return false;
     
    322326                //pObj->member
    323327                if( (resultType.IsObjectPtr() || resultType.IsStructPtr() )
    324                     && refType != CClass::Pointer ){
     328                    && refType != RefPointer ){
    325329                        if(isErrorEnabled) SetError(104,member,cp);
    326330                        return false;
     
    336340            if(lpPtrOffset[0]){
    337341                //ppObj[n]->member
    338                 if( refType != CClass::Pointer ){
     342                if( refType != RefPointer ){
    339343                    if(isErrorEnabled) SetError(104,member,cp);
    340344                    return false;
     
    385389    SetReg_WholeVariable(DEF_PTR_VOID,&RelativeVar,reg);
    386390}
    387 bool GetVarOffset(bool isErrorEnabled,bool isWriteAccess,const char *NameBuffer,RELATIVE_VAR *pRelativeVar,Type &resultType,int *pss){
     391bool GetVarOffset(bool isErrorEnabled,bool isWriteAccess,const char *NameBuffer,RELATIVE_VAR *pRelativeVar,Type &resultType, Subscripts *pResultSubscripts ){
    388392    char variable[VN_SIZE];
    389393
     
    399403
    400404    // 先頭オブジェクトまたはクラス名と入れ子メンバに分割
    401     CClass::RefType refType;
     405    ReferenceKind refType;
    402406    char member[VN_SIZE],array[VN_SIZE],lpPtrOffset[VN_SIZE];
    403407    GetVarFormatString(simpleName,array,lpPtrOffset,member,refType);
     
    412416    }
    413417
    414     const int *pSubScripts;
     418    const Subscripts *pSubscripts;
    415419    bool bConst = false;
    416420
     
    421425        //////////////////
    422426
    423         const Variable *pVar = UserProc::CompilingUserProc().localVars.BackSearch( VarName );
     427        const Variable *pVar = UserProc::CompilingUserProc().GetLocalVars().BackSearch( Symbol( VarName ) );
    424428        if( pVar ){
    425429            //ポインタ変数の場合
    426             if( pVar->IsPointer() ){
     430            if( pVar->GetType().IsPointer() ){
    427431                if( !pVar->IsArray() ){
    428432                    lstrcpy(lpPtrOffset,array);
     
    438442            }
    439443
    440             pRelativeVar->offset=-pVar->offset;
     444            pRelativeVar->offset=-pVar->GetOffsetAddress();
    441445            pRelativeVar->bOffsetOffset=0;
    442446            if( pVar->IsRef() ){
     
    445449            }
    446450            else pRelativeVar->dwKind=VAR_LOCAL;
    447             resultType = *pVar;
    448             pSubScripts=pVar->GetSubScriptsPtr();
     451            resultType = pVar->GetType();
     452            pSubscripts = &pVar->GetSubscripts();
    449453            bConst = pVar->IsConst();
    450454
     
    454458
    455459
    456     if(Smoothie::Temp::pCompilingClass){
     460    if(compiler.pCompilingClass){
    457461        //////////////////////
    458462        // クラスメンバの参照
     
    465469            pRelativeVar->dwKind=VAR_DIRECTMEM;
    466470
    467             resultType.SetType( DEF_OBJECT, Smoothie::Temp::pCompilingClass );
     471            resultType.SetType( DEF_OBJECT, compiler.pCompilingClass );
    468472            return true;
    469473        }
     
    478482
    479483            bool isFound = false;
    480             BOOST_FOREACH( CMember *pMember, Smoothie::Temp::pCompilingClass->GetDynamicMembers() ){
     484            BOOST_FOREACH( CMember *pMember, compiler.pCompilingClass->GetDynamicMembers() ){
    481485                if( pMember->GetName() == VarName ){
    482486                    isFound = true;
     
    492496        if( isWriteAccess &&
    493497            pMethod->IsConst() &&
    494             Smoothie::Temp::pCompilingClass->IsCompilingConstructor() == false &&
    495             Smoothie::Temp::pCompilingClass->IsCompilingDestructor() == false
     498            compiler.pCompilingClass->IsCompilingConstructor() == false &&
     499            compiler.pCompilingClass->IsCompilingDestructor() == false
    496500            ){
    497501                SetError(131, NULL, cp );
     
    505509            isErrorEnabled,
    506510            isWriteAccess,
    507             *Smoothie::Temp::pCompilingClass,
     511            *compiler.pCompilingClass,
    508512            variable,
    509513            pRelativeVar,
     
    526530            GetNowStaticVarFullName(VarName,temporary);
    527531
    528             pVar = globalVars.Find( temporary );
     532            pVar = compiler.GetMeta().GetGlobalVars().Find( Symbol( temporary ) );
    529533            if( pVar ){
    530534                goto GlobalOk;
     
    545549            char tempArray[VN_SIZE];
    546550            {
    547                 CClass::RefType refType;
     551                ReferenceKind refType;
    548552                GetVarFormatString(temporary,tempArray,lpPtrOffset,tempMember, refType );
    549553            }
     
    557561            char temp2[VN_SIZE];
    558562            sprintf(temp2,"%s.%s",VarName,temporary);
    559             pVar = globalVars.Find( temp2 );
     563            pVar = compiler.GetMeta().GetGlobalVars().Find( Symbol( temp2 ) );
    560564            if( pVar ){
    561565                lstrcpy(member,tempMember);
     
    565569        }
    566570
    567         if(Smoothie::Temp::pCompilingClass){
     571        if(compiler.pCompilingClass){
    568572            //自身のクラスから静的メンバを参照する場合
    569573            char temp2[VN_SIZE];
    570             sprintf(temp2,"%s.%s",Smoothie::Temp::pCompilingClass->GetName().c_str(),VarName);
    571             pVar = globalVars.Find( temp2 );
     574            sprintf(temp2,"%s.%s",compiler.pCompilingClass->GetName().c_str(),VarName);
     575            pVar = compiler.GetMeta().GetGlobalVars().Find( Symbol( temp2 ) );
    572576            if( pVar ){
    573577                goto GlobalOk;
     
    579583        /////////////////////
    580584
    581         pVar = globalVars.BackSearch( VarName );
     585        pVar = compiler.GetMeta().GetGlobalVars().BackSearch( Symbol( VarName ) );
    582586        if( pVar ){
    583587            goto GlobalOk;
     
    592596GlobalOk:
    593597        //ポインタ変数の場合
    594         if( pVar->IsPointer() ){
     598        if( pVar->GetType().IsPointer() ){
    595599            if( !pVar->IsArray() ){
    596600                lstrcpy(lpPtrOffset,array);
     
    606610        }
    607611
    608         pRelativeVar->offset=pVar->offset;
     612        pRelativeVar->offset=pVar->GetOffsetAddress();
    609613        pRelativeVar->bOffsetOffset=0;
    610614        if( pVar->IsRef() ){
     
    613617        }
    614618        else pRelativeVar->dwKind=VAR_GLOBAL;
    615         resultType = *pVar;
    616         pSubScripts=pVar->GetSubScriptsPtr();
     619        resultType = pVar->GetType();
     620        pSubscripts=&pVar->GetSubscripts();
    617621        bConst = pVar->IsConst();
    618622    }
     
    634638    }
    635639
    636     if(array[0]==0&&pSubScripts[0]!=-1){
     640    if( array[0] == 0 && pSubscripts->size() > 0 ){
    637641        //配列の先頭ポインタを示す場合
    638642        resultType.SetBasicType( resultType.GetBasicType() | FLAG_PTR );
    639         if(pss) memcpy(pss,pSubScripts,MAX_ARRAYDIM);
     643
     644        if( pResultSubscripts )
     645        {
     646            (*pResultSubscripts) = *pSubscripts;
     647        }
    640648        return true;
    641649    }
     
    649657    }
    650658    if(array[0]){
    651         if(!GetArrayOffset(pSubScripts,array,resultType)){
     659        if(!GetArrayOffset(*pSubscripts,array,resultType)){
    652660            SetError(14,variable,cp);
    653661            pRelativeVar->dwKind=NON_VAR;
     
    658666        if( resultType.IsObject() || resultType.IsStruct() ){
    659667            //実態オブジェクトのメンバを参照(obj.member)
    660             if( refType != CClass::Dot ){
     668            if( refType != RefDot ){
    661669                SetError(104,VarName,cp);
    662670                pRelativeVar->dwKind=NON_VAR;
     
    673681            if(lpPtrOffset[0]){
    674682                //pObj[n].member
    675                 if( refType != CClass::Dot ){
     683                if( refType != RefDot ){
    676684                    SetError(104,VarName,cp);
    677685                    pRelativeVar->dwKind=NON_VAR;
     
    683691            else{
    684692                //pObj->member
    685                 if( refType != CClass::Pointer ){
     693                if( refType != RefPointer ){
    686694                    SetError(104,VarName,cp);
    687695                    pRelativeVar->dwKind=NON_VAR;
     
    700708            if(lpPtrOffset[0]){
    701709                //ppObj[n]->member
    702                 if( refType != CClass::Pointer ){
     710                if( refType != RefPointer ){
    703711                    SetError(104,VarName,cp);
    704712                    pRelativeVar->dwKind=NON_VAR;
     
    744752}
    745753
    746 bool SetInitGlobalData(int offset,const Type &type,const int *SubScripts,const char *lpszInitBuf){
     754bool SetInitGlobalData(int offset,const Type &type,const Subscripts &subscripts,const char *lpszInitBuf){
    747755    extern BYTE *initGlobalBuf;
    748     int i,i2,i3;
     756    int i2,i3;
    749757    char temporary[VN_SIZE];
    750758    char InitBuf[VN_SIZE];
     
    757765        int typeSize = type.GetSize();
    758766
    759         if(SubScripts[0]!=-1){
    760             typeSize*=JumpSubScripts(SubScripts+1);
    761             i=0;
    762             i2=0;
    763             while(1){
    764                 if(SubScripts[0]<i2){
    765                     SetError(41,0,cp);
    766                     return 0;
    767                 }
    768                 i=GetOneParameter(InitBuf,i,temporary);
    769                 if(!SetInitGlobalData(
    770                     offset+i2*typeSize,
    771                     type,
    772                     SubScripts+1,
    773                     temporary)) return false;
    774                 i2++;
    775                 if(InitBuf[i]=='\0') break;
     767        if( subscripts.size() > 0 ){
     768            Subscripts nestSubscripts;
     769            for( int i=1; i<(int)subscripts.size(); i++ )
     770            {
     771                nestSubscripts.push_back( subscripts[i] );
     772            }
     773
     774            typeSize*=JumpSubScripts( nestSubscripts );
     775            {
     776                int i=0;
     777                i2=0;
     778                while(1){
     779                    if( subscripts[0] < i2 ){
     780                        SetError(41,0,cp);
     781                        return 0;
     782                    }
     783                    i=GetOneParameter(InitBuf,i,temporary);
     784                    if(!SetInitGlobalData(
     785                        offset+i2*typeSize,
     786                        type,
     787                        nestSubscripts,
     788                        temporary)) return false;
     789                    i2++;
     790                    if(InitBuf[i]=='\0') break;
     791                }
    776792            }
    777793            return true;
     
    794810                if(!SetInitGlobalData(offset+i3,
    795811                    pMember->GetType(),
    796                     pMember->SubScripts,
     812                    pMember->GetSubscripts(),
    797813                    temporary)) return false;
    798814            }
     
    815831    }
    816832
    817     if(SubScripts[0]!=-1){
     833    if( subscripts.size() > 0 ){
    818834        SetError(41,0,cp);
    819835        return false;
     
    883899    return true;
    884900}
    885 bool InitLocalVar(int offset,const Type &type,const int *SubScripts,const char *lpszInitBuf){
    886     int i,i2,i3;
     901bool InitLocalVar(int offset,const Type &type,const Subscripts &subscripts,const char *lpszInitBuf){
     902    int i2,i3;
    887903    char temporary[VN_SIZE];
    888904    char InitBuf[VN_SIZE];
     
    895911        int typeSize = type.GetSize();
    896912
    897         if(SubScripts[0]!=-1){
    898             typeSize*=JumpSubScripts(SubScripts+1);
    899             i=0;
    900             i2=0;
    901             while(1){
    902                 if(SubScripts[0]<i2){
    903                     SetError(41,0,cp);
    904                     return false;
    905                 }
    906                 i=GetOneParameter(InitBuf,i,temporary);
    907                 if(!InitLocalVar(
    908                     offset+i2*typeSize,
    909                     type,
    910                     SubScripts+1,
    911                     temporary)) return false;
    912                 i2++;
    913                 if(InitBuf[i]=='\0') break;
     913        if( subscripts.size() > 0 ){
     914            Subscripts nestSubscripts;
     915            for( int i=1; i<(int)subscripts.size(); i++ )
     916            {
     917                nestSubscripts.push_back( subscripts[i] );
     918            }
     919
     920            typeSize*=JumpSubScripts( nestSubscripts );
     921            {
     922                int i=0;
     923                i2=0;
     924                while(1){
     925                    if( subscripts[0] < i2 ){
     926                        SetError(41,0,cp);
     927                        return 0;
     928                    }
     929                    i=GetOneParameter(InitBuf,i,temporary);
     930                    if(!InitLocalVar(
     931                        offset+i2*typeSize,
     932                        type,
     933                        nestSubscripts,
     934                        temporary)) return false;
     935                    i2++;
     936                    if(InitBuf[i]=='\0') break;
     937                }
    914938            }
    915939            return true;
     
    932956                if(!InitLocalVar(offset+i3,
    933957                    pMember->GetType(),
    934                     pMember->SubScripts,
     958                    pMember->GetSubscripts(),
    935959                    temporary)) return false;
    936960
     
    949973    ///////////////////////////////////////
    950974
    951     if(SubScripts[0]!=-1){
     975    if( subscripts.size() > 0 ){
    952976        SetError(41,0,cp);
    953977        return false;
     
    10611085}
    10621086
    1063 void dim( char *VarName,int *SubScripts,Type &type,const char *InitBuf,const char *ConstractParameter,DWORD dwFlags){
     1087void dim( char *VarName, const Subscripts &subscripts, Type &type,const char *InitBuf,const char *ConstractParameter,DWORD dwFlags){
    10641088    if( UserProc::IsGlobalAreaCompiling() ){
    10651089        /////////////////////////
     
    10671091        /////////////////////////
    10681092
    1069         //OpcodeOthers( ( (string)"OutputDebugString(Ex\"" + VarName + "\r\n\")" ).c_str() );
    1070         AddGlobalVariable(VarName,SubScripts,type,InitBuf,ConstractParameter,dwFlags);
     1093        AddGlobalVariable(VarName,subscripts,type,InitBuf,ConstractParameter,dwFlags);
    10711094    }
    10721095    else{
     
    10751098        /////////////////
    10761099
    1077         if( UserProc::CompilingUserProc().localVars.DuplicateCheck( VarName ) ){
     1100        if( UserProc::CompilingUserProc().GetLocalVars().DuplicateCheck( VarName ) ){
    10781101            //2重定義のエラー
    10791102            SetError(15,VarName,cp);
     
    10831106        bool isConst = ( dwFlags & DIMFLAG_CONST ) ? true:false;
    10841107
    1085         Variable *pVar = new VariableImpl( VarName, type, isConst );
    1086 
    1087         if( SubScripts[0] != -1 ){
     1108        Variable *pVar = new Variable( VarName, type, isConst, false, ConstractParameter );
     1109
     1110        if( subscripts.size() > 0 ){
    10881111            //配列あり
    1089             pVar->SetArray( SubScripts );
    1090         }
    1091 
    1092         //コンストラクタ用パラメータ
    1093         pVar->paramStrForConstructor = ConstractParameter;
     1112            pVar->SetArray( subscripts );
     1113        }
    10941114
    10951115        //レキシカルスコープ
    1096         pVar->ScopeLevel=GetLexicalScopes().GetNowLevel();
    1097         pVar->ScopeStartAddress=GetLexicalScopes().GetStartAddress();
     1116        pVar->SetScopeLevel( GetLexicalScopes().GetNowLevel() );
     1117        pVar->SetScopeStartAddress( GetLexicalScopes().GetStartAddress() );
    10981118        pVar->bLiving=TRUE;
    10991119
     
    11021122
    11031123        // 変数を追加
    1104         UserProc::CompilingUserProc().localVars.push_back( pVar );
     1124        UserProc::CompilingUserProc().GetLocalVars().push_back( pVar );
    11051125
    11061126        //アラインメントを考慮
    1107         if( pVar->IsStruct() ){
    1108             int alignment = pVar->GetClass().iAlign;
     1127        if( pVar->GetType().IsStruct() ){
     1128            int alignment = pVar->GetType().GetClass().iAlign;
    11091129
    11101130            if( alignment ){
     
    11261146
    11271147        AllLocalVarSize += pVar->GetMemorySize();
    1128         pVar->offset = AllLocalVarSize;
     1148        pVar->SetOffsetAddress( AllLocalVarSize );
    11291149
    11301150        //レキシカルスコープ
    1131         pVar->ScopeLevel=GetLexicalScopes().GetNowLevel();
    1132         pVar->ScopeStartAddress=GetLexicalScopes().GetStartAddress();
     1151        pVar->SetScopeLevel( GetLexicalScopes().GetNowLevel() );
     1152        pVar->SetScopeStartAddress( GetLexicalScopes().GetStartAddress() );
    11331153        pVar->bLiving=TRUE;
    11341154
     
    11401160
    11411161            int result = 0;
    1142             if( !pVar->IsObject() ){
    1143                 result = InitLocalVar(-pVar->offset,
    1144                     *pVar,
    1145                     pVar->GetSubScriptsPtr(),
     1162            if( !pVar->GetType().IsObject() ){
     1163                result = InitLocalVar(-pVar->GetOffsetAddress(),
     1164                    pVar->GetType(),
     1165                    pVar->GetSubscripts(),
    11461166                    InitBuf);
    11471167            }
     
    11711191
    11721192            //add rcx, offset
    1173             op_add_RV( REG_RCX, -pVar->offset );
     1193            op_add_RV( REG_RCX, -pVar->GetOffsetAddress() );
    11741194            obp-=sizeof(long);
    11751195            AddLocalVarAddrSchedule();
     
    11861206    if( type.IsObject() &&(dwFlags&DIMFLAG_NONCALL_CONSTRACTOR)==0&&InitBuf[0]=='\0'){
    11871207        char objectSize[255];
    1188         if( SubScripts[0] == -1 ){
     1208        if( subscripts.size() == 0 ){
    11891209            objectSize[0] = 0;
    11901210        }
    11911211        else{
    1192             if( SubScripts[1] != -1 ){
     1212            if( subscripts.size() > 1 ){
    11931213                SetError(300,NULL,cp);
    11941214            }
    1195             sprintf( objectSize, "%d", SubScripts[0] );
     1215            sprintf( objectSize, "%d", subscripts[0] );
    11961216        }
    11971217        Operator_New( type.GetClass(), objectSize, ConstractParameter, type );
     
    13041324
    13051325bool Compile_AddGlobalRootsForGc(){
    1306     UserProc *pUserProc_AddGlobalRootPtr = GetClassMethod( "_System_CGarbageCollection", "AddGlobalRootPtr" );
     1326    const UserProc *pUserProc_AddGlobalRootPtr = GetClassMethod( "_System_CGarbageCollection", "AddGlobalRootPtr" );
    13071327    if( !pUserProc_AddGlobalRootPtr ){
    13081328        SetError(3, "_System_CGarbageCollection.AddGlobalRootPtr", -1 );
     
    13101330    }
    13111331
    1312     BOOST_FOREACH( const Variable *pVar, globalVars ){
    1313         if( pVar->IsObject() || pVar->IsPointer() || pVar->IsStruct() ){
     1332    BOOST_FOREACH( const Variable *pVar, compiler.GetMeta().GetGlobalVars() ){
     1333        if( pVar->GetType().IsObject() || pVar->GetType().IsPointer() || pVar->GetType().IsStruct() ){
    13141334            // オブジェクトまたはポインタだったとき
    13151335            // ※構造体も含む(暫定対応)
     
    13211341            // ルートポインタを引き渡す
    13221342            //mov rdx,offset
    1323             op_mov_RV(sizeof(_int64), REG_RDX,(int)pVar->offset);
     1343            op_mov_RV(sizeof(_int64), REG_RDX,(int)pVar->GetOffsetAddress());
    13241344            obp-=sizeof(long);
    13251345            pobj_GlobalVarSchedule->add();
  • trunk/abdev/BasicCompiler64/MakePeHdr.cpp

    r202 r206  
     1#include "stdafx.h"
     2
    13#include <jenga/include/common/Environment.h>
    24
     
    46
    57#include <LexicalScopingImpl.h>
    6 #include <ClassImpl.h>
     8#include <Class.h>
    79#include <Compiler.h>
    810
     11#include <../Enum.h>
     12
    913#include "../BasicCompiler_Common/common.h"
     14#include "../BasicCompiler_Common/DebugSection.h"
    1015#include "Opcode.h"
    1116
     
    1621
    1722// グローバル関数、静的メソッド
    18 UserProc
     23const UserProc
    1924    *pSub_System_StartupProgram,
    2025    *pSub_DebugSys_StartProc,
     
    3641
    3742// 動的メソッド
    38 UserProc
     43const UserProc
    3944    *pUserProc_System_CGarbageCollection_RegisterGlobalRoots;
    4045
     
    160165
    161166    //クラス名を取得(詳細情報はGetAllClassInfoで取得)
    162     //   GetSubInfo関数の中で参照されるオブジェクト名を事前に取得する。
     167    //   CollectUserProcs関数の中で参照されるオブジェクト名を事前に取得する。
    163168    //     ※オブジェクトの内容までは取得しない
    164169    compiler.GetMeta().GetClasses().CollectClassesForNameOnly( Smoothie::Lexical::source );
     
    171176
    172177    //サブルーチン(ユーザー定義、DLL関数)の識別子、アドレスを取得
    173     Smoothie::Temp::pCompilingClass = NULL;
    174     GetSubInfo();
    175 
    176     //クラス情報を取得(※注 - GetSubInfoの後に呼び出す)
     178    compiler.pCompilingClass = NULL;
     179    UserProcs::CollectUserProcs( Smoothie::Lexical::source, compiler.GetMeta().GetUserProcs() );
     180
     181    // クラス情報を取得(※注 - CollectUserProcsの後に呼び出す)
    177182    compiler.GetMeta().GetClasses().GetAllClassInfo();
    178183
    179     compiler.GetMeta().AutoWrite( Jenga::Common::Environment::GetAppDir() + "\\meta_test.xml" );
     184    // サブルーチン(ユーザー定義、DLL関数)のイテレータの準備
     185    compiler.GetMeta().GetUserProcs().Iterator_Init();
     186
     187    /*
     188    if( !compiler.GetMeta().Write( Jenga::Common::Environment::GetAppDir() + "\\meta_test.xml" ) )
     189    {
     190        MessageBox(0,"XML書き込みに失敗","test",0);
     191    }
     192    MetaImpl *pTempMeta = new MetaImpl();
     193    if( !pTempMeta->Read( Jenga::Common::Environment::GetAppDir() + "\\meta_test.xml" ) )
     194    {
     195        MessageBox(0,"XML読み込みに失敗","test",0);
     196    }
     197    compiler.GetMeta() = (*pTempMeta);
     198    */
    180199
    181200    //コードと行番号の関係
     
    347366        extern CStackFrame *pobj_sf;
    348367        pobj_sf=new CStackFrame();
     368
     369        trace_for_sourcecodestep( "★★★ グローバル領域のコンパイルを開始" );
    349370
    350371
     
    399420
    400421        //call _System_Call_Destructor_of_GlobalObject
    401         extern UserProc *pSub_System_Call_Destructor_of_GlobalObject;
     422        extern const UserProc *pSub_System_Call_Destructor_of_GlobalObject;
    402423        op_call(pSub_System_Call_Destructor_of_GlobalObject);
    403424
     
    557578        ExportNamesLength=lstrlen(lpExportNames)+1;
    558579
    559         extern GlobalProc **ppSubHash;
    560         GlobalProc *pUserProc,*psi2;
     580        UserProc *pUserProc,*psi2;
    561581        while(1){
    562582            //辞書順にサーチ
    563583            temporary[0]=0;
    564             for(i=0,psi2=0;i<MAX_HASH;i++){
    565                 pUserProc=ppSubHash[i];
    566                 while(pUserProc){
    567                     if(pUserProc->IsExport()){
    568                         if(temporary[0]=='\0'){
     584            compiler.GetMeta().GetUserProcs().Iterator_Reset();
     585            while( compiler.GetMeta().GetUserProcs().Iterator_HasNext() )
     586            {
     587                pUserProc = compiler.GetMeta().GetUserProcs().Iterator_GetNext();
     588                if(pUserProc->IsExport()){
     589                    if(temporary[0]=='\0'){
     590                        lstrcpy(temporary,pUserProc->GetName().c_str());
     591                        psi2=pUserProc;
     592                    }
     593                    else{
     594                        i3=lstrlen(temporary);
     595                        i4=(int)pUserProc->GetName().size();
     596                        if(i3<i4) i3=i4;
     597                        if(memcmp(temporary,pUserProc->GetName().c_str(),i3)>0){
    569598                            lstrcpy(temporary,pUserProc->GetName().c_str());
    570599                            psi2=pUserProc;
    571600                        }
    572                         else{
    573                             i3=lstrlen(temporary);
    574                             i4=(int)pUserProc->GetName().size();
    575                             if(i3<i4) i3=i4;
    576                             if(memcmp(temporary,pUserProc->GetName().c_str(),i3)>0){
    577                                 lstrcpy(temporary,pUserProc->GetName().c_str());
    578                                 psi2=pUserProc;
    579                             }
    580                         }
    581601                    }
    582                     pUserProc=pUserProc->pNextData;
    583602                }
    584603            }
     
    589608
    590609            if( pUserProc->GetName() == "DllMain" ){
    591                 DllMain_EntryPoint=pUserProc->beginOpAddress;
     610                DllMain_EntryPoint=pUserProc->GetBeginOpAddress();
    592611            }
    593612
    594613            lpdwExportAddressTable=(DWORD *)HeapReAlloc(hHeap,0,lpdwExportAddressTable,(ExportNum+1)*sizeof(DWORD));
    595             lpdwExportAddressTable[ExportNum]=pUserProc->beginOpAddress;
     614            lpdwExportAddressTable[ExportNum]=pUserProc->GetBeginOpAddress();
    596615
    597616            lpdwExportNamePointerTable=(DWORD *)HeapReAlloc(hHeap,0,lpdwExportNamePointerTable,(ExportNum+1)*sizeof(DWORD));
     
    800819    //(デバッグ情報で利用される)
    801820    extern int AllInitGlobalVarSize;
    802     BOOST_FOREACH( Variable *pVar, globalVars ){
    803         if(pVar->offset&0x80000000){
    804             pVar->offset=(pVar->offset&0x7FFFFFFF)+AllInitGlobalVarSize;
     821    BOOST_FOREACH( Variable *pVar, compiler.GetMeta().GetGlobalVars() ){
     822        if(pVar->GetOffsetAddress()&0x80000000){
     823            pVar->SetOffsetAddress(
     824                (pVar->GetOffsetAddress()&0x7FFFFFFF)+AllInitGlobalVarSize
     825            );
    805826        }
    806827    }
     
    10881109    // ※x86はRVAからのオフセット。x64はRPI(実行中アドレス)からのオフセット
    10891110    for(i=0;i<pobj_ImportAddrSchedule->num;i++){
    1090         DllProc *pDllProc;
    1091         pDllProc=pobj_ImportAddrSchedule->ppdi[i];
     1111        const DllProc *pDllProc = pobj_ImportAddrSchedule->ppdi[i];
    10921112        *((long *)(OpBuffer+pobj_ImportAddrSchedule->pObpValues[i]))=
    10931113            MemPos_ImportSection+
     
    11011121    // プロシージャポインタスケジュール
    11021122    for(i=0;i<pobj_SubAddrSchedule->num;i++){
    1103         if(pobj_SubAddrSchedule->ppsi[i]->beginOpAddress==0
    1104             &&pobj_SubAddrSchedule->ppsi[i]->endOpAddress==0){
     1123        if(pobj_SubAddrSchedule->ppsi[i]->GetBeginOpAddress()==0
     1124            &&pobj_SubAddrSchedule->ppsi[i]->GetEndOpAddress()==0){
    11051125            SetError(300,NULL,-1);
    11061126        }
     
    11081128        if(pobj_SubAddrSchedule->pbCall[i]){
    11091129            *((long *)(OpBuffer+pobj_SubAddrSchedule->pObpValues[i]))=
    1110                 pobj_SubAddrSchedule->ppsi[i]->beginOpAddress-(pobj_SubAddrSchedule->pObpValues[i]+sizeof(long));
     1130                pobj_SubAddrSchedule->ppsi[i]->GetBeginOpAddress()-(pobj_SubAddrSchedule->pObpValues[i]+sizeof(long));
    11111131        }
    11121132        else{
    11131133            *((long *)(OpBuffer+pobj_SubAddrSchedule->pObpValues[i]))=
    1114                 pobj_SubAddrSchedule->ppsi[i]->beginOpAddress+ImageBase+MemPos_CodeSection;
     1134                pobj_SubAddrSchedule->ppsi[i]->GetBeginOpAddress()+ImageBase+MemPos_CodeSection;
    11151135        }
    11161136    }
  • trunk/abdev/BasicCompiler64/NumOpe.cpp

    r198 r206  
     1#include "stdafx.h"
     2
    13#include <jenga/include/smoothie/Smoothie.h>
    24#include <jenga/include/smoothie/LexicalAnalysis.h>
     
    164166    // 動的メソッドを検索
    165167    ///////////////////////////////////////////////////////////////////
    166     vector<UserProc *> userProcs;
     168    vector<const UserProc *> userProcs;
    167169
    168170    char methodName[VN_SIZE], lpPtrOffset[VN_SIZE], parameter[VN_SIZE], dummy[1];
    169     CClass::RefType refType;
     171    ReferenceKind refType;
    170172    lstrcpy( methodName, member );
    171173    GetVarFormatString(methodName,parameter,lpPtrOffset,dummy,refType);
    172174
    173175    objClass.GetMethods().Enum( methodName, userProcs );
    174     UserProc *pUserProc;
    175176    if(userProcs.size()){
    176177        //オーバーロードを解決
    177         pUserProc=OverloadSolutionWithStrParam(termFull,userProcs,parameter,termLeft);
     178        const UserProc *pUserProc = OverloadSolutionWithStrParam(termFull,userProcs,parameter,termLeft);
    178179
    179180        if( pUserProc ){
     
    245246    // パース
    246247    char member[VN_SIZE];
    247     CClass::RefType refType;
    248     if( CClass::SplitName( termFull, termLeft, member, refType ) ){
     248    ReferenceKind refType;
     249    if( SplitMemberName( termFull, termLeft, member, refType ) ){
    249250        ///////////////////////////////////////////////////////////////////
    250251        // オブジェクトとメンバに分解できるとき
     
    309310    if(lstrcmpi(termFull,"This")==0 && isProcedureCallOnly == false ){
    310311        //Thisオブジェクト
    311         resultType.SetType( DEF_OBJECT, Smoothie::Temp::pCompilingClass );
     312        resultType.SetType( DEF_OBJECT, compiler.pCompilingClass );
    312313
    313314        SetThisPtrToReg( UseReg );
     
    385386            return true;
    386387        }
    387         else if(GetConstCalcBuffer(procName,parameter,temporary)){
    388             /////////////////////////
    389             // マクロ関数
    390             /////////////////////////
    391 
    392             //閉じカッコ")"に続く文字がNULLでないときはエラーにする
    393             if(termFull[i2+1+i4+1]!='\0') SetError(42,NULL,cp);
    394 
    395             //マクロ関数の場合
    396             NumOpe(&UseReg,temporary,Type(),resultType);
    397 
    398             if(!IS_LITERAL(resultType.GetIndex())){
    399                 //リテラル値ではなかったとき
    400                 isLiteral = false;
    401             }
    402 
    403             return true;
     388
     389        ConstMacro *pConstMacro = compiler.GetMeta().GetGlobalConstMacros().Find( procName );
     390        if( pConstMacro )
     391        {
     392            if( pConstMacro->GetCalcBuffer( parameter, temporary ) )
     393            {
     394                /////////////////////////
     395                // マクロ関数
     396                /////////////////////////
     397
     398                //閉じカッコ")"に続く文字がNULLでないときはエラーにする
     399                if(termFull[i2+1+i4+1]!='\0') SetError(42,NULL,cp);
     400
     401                //マクロ関数の場合
     402                NumOpe(&UseReg, temporary,Type(),resultType);
     403
     404                if(!IS_LITERAL(resultType.GetIndex())){
     405                    //リテラル値ではなかったとき
     406                    isLiteral = false;
     407                }
     408
     409                return true;
     410            }
    404411        }
    405412    }
     
    905912                    //////////////
    906913
    907                     i3 = CDBConst::obj.GetBasicType(term);
     914                    i3 = compiler.GetMeta().GetGlobalConsts().GetBasicType(term);
    908915                    if(i3){
    909                         if( CDBConst::obj.IsStringPtr( term ) ){
     916                        if( compiler.GetMeta().GetGlobalConsts().IsStringPtr( term ) ){
    910917                            //リテラル文字列
    911918
    912                             double dbl = CDBConst::obj.GetDoubleData(term);
     919                            double dbl = compiler.GetMeta().GetGlobalConsts().GetDoubleData(term);
    913920                            memcpy(&i64data,&dbl,sizeof(double));
    914921
     
    924931                        if(IsRealNumberType(i3)){
    925932                            //実数
    926                             double dbl = CDBConst::obj.GetDoubleData(term);
     933                            double dbl = compiler.GetMeta().GetGlobalConsts().GetDoubleData(term);
    927934                            memcpy(&i64data,&dbl,sizeof(double));
    928935                            goto Literal;
     
    930937                        else if(IsWholeNumberType(i3)){
    931938                            //整数
    932                             i64data = CDBConst::obj.GetWholeData(term);
     939                            i64data = compiler.GetMeta().GetGlobalConsts().GetWholeData(term);
    933940                            goto Literal;
    934941                        }
  • trunk/abdev/BasicCompiler64/NumOpe_Arithmetic.cpp

    r198 r206  
     1#include "stdafx.h"
     2
    13#include <Compiler.h>
    24
     
    561563
    562564        //call pow
    563         extern UserProc *pSub_pow;
     565        extern const UserProc *pSub_pow;
    564566        op_call(pSub_pow);
    565567
  • trunk/abdev/BasicCompiler64/NumOpe_Logical.cpp

    r64 r206  
     1#include "stdafx.h"
     2
    13#include "../BasicCompiler_Common/common.h"
    24#include "Opcode.h"
  • trunk/abdev/BasicCompiler64/NumOpe_Relation.cpp

    r36 r206  
     1#include "stdafx.h"
     2
    13#include "../BasicCompiler_Common/common.h"
    24#include "Opcode.h"
  • trunk/abdev/BasicCompiler64/NumOpe_TypeOperation.cpp

    r198 r206  
     1#include "stdafx.h"
     2
    13#include <jenga/include/smoothie/Smoothie.h>
    24
  • trunk/abdev/BasicCompiler64/Opcode.h

    r142 r206  
    1 //Opcode.h
     1#pragma once
     2
     3#include <Type.h>
     4#include <Procedure.h>
    25
    36
     
    323326bool _member_offset(bool isErrorEnabled, bool isWriteAccess, const CClass &objClass, const char *member, RELATIVE_VAR *pRelativeVar, Type &resultType, BOOL bPrivateAccess);
    324327void SetThisPtrToReg(int reg);
    325 bool GetVarOffset(bool isErrorEnabled,bool isWriteAccess,const char *NameBuffer,RELATIVE_VAR *pRelativeVar,Type &resultType,int *pss = NULL);
    326 bool SetInitGlobalData(int offset,const Type &type,const int *SubScripts,const char *InitBuf);
     328bool GetVarOffset(bool isErrorEnabled,bool isWriteAccess,const char *NameBuffer,RELATIVE_VAR *pRelativeVar,Type &resultType, Subscripts *pResultSubscripts = NULL );
     329bool SetInitGlobalData(int offset,const Type &type,const Subscripts &subscripts,const char *InitBuf);
    327330#define DIMFLAG_INITDEBUGVAR            0x01
    328331#define DIMFLAG_NONCALL_CONSTRACTOR     0x02
    329332#define DIMFLAG_STATIC                  0x04
    330333#define DIMFLAG_CONST                   0x08
    331 void dim( char *VarName,int *SubScripts,Type &type, const char *InitBuf,const char *ConstractParameter,DWORD dwFlags);
     334void dim( char *VarName, const Subscripts &subscripts, Type &type, const char *InitBuf,const char *ConstractParameter,DWORD dwFlags);
    332335void SetVarPtrToReg(int reg,RELATIVE_VAR *pRelativeVar);
    333336bool Compile_AddGlobalRootsForGc();
     
    356359
    357360public:
    358     UserProc *_OverloadSolution( const char *name, std::vector<UserProc *> &subs, bool isEnabledReturnType = false );
    359     UserProc *OverloadSolution( const char *name, std::vector<UserProc *> &subs, bool isEnabledReturnType = false );
     361    const UserProc *_OverloadSolution( const char *name, std::vector<const UserProc *> &subs, bool isEnabledReturnType = false );
     362    const UserProc *OverloadSolution( const char *name, std::vector<const UserProc *> &subs, bool isEnabledReturnType = false );
    360363
    361364    void ApplyDefaultParameters( const Parameters &params );
     
    389392#define PROCFLAG_NEW    1
    390393bool Opcode_CallProcPtr(const char *variable, const char *lpszParms,ProcPointer *pProcPointer);
    391 bool Opcode_CallProc(const char *Parameter,UserProc *pUserProc,DWORD dwFlags,const char *ObjectName,int RefType);
     394bool Opcode_CallProc(const char *Parameter,const UserProc *pUserProc,DWORD dwFlags,const char *ObjectName,int RefType);
    392395bool Opcode_CallDllProc( const char *lpszParms,DllProc *pDllProc);
    393396
     
    401404//OperatorProc.cpp
    402405void FreeTempObject(int reg,const CClass *pobj_c);
    403 int CallOperatorProc(int idCalc, const Type &baseType, int *type_stack,LONG_PTR *index_stack,BOOL *bUseHeap,int &sp);
     406int CallOperatorProc(BYTE idCalc, const Type &baseType, int *type_stack,LONG_PTR *index_stack,BOOL *bUseHeap,int &sp);
    404407void CallCastOperatorProc(int reg,Type &calcType,BOOL bCalcUseHeap,const Type &toType);
    405408void CallIndexerGetterProc(int reg,const CClass *pobj_Class,char *ObjectName,char *Parameter,Type &resultType);
     
    512515void op_fld_ptr_esp(int type);
    513516void op_zero_reg(int reg);
    514 void op_call( UserProc *pUserProc );
    515 void op_call( DllProc *pDllProc );
     517void op_call( const UserProc *pUserProc );
     518void op_call( const DllProc *pDllProc );
    516519void op_ret();
  • trunk/abdev/BasicCompiler64/OperatorProc.cpp

    r135 r206  
     1#include "stdafx.h"
     2
     3#include <jenga/include/smoothie/LexicalAnalysis.h>
     4
    15#include "../BasicCompiler_Common/common.h"
    26#include "Opcode.h"
     
    1620
    1721        //call DestructorProcAddr
    18         op_call( method->pUserProc );
     22        op_call( &method->GetUserProc() );
    1923    }
    2024
     
    2327
    2428    //call free
    25     extern UserProc *pSub_free;
     29    extern const UserProc *pSub_free;
    2630    op_call(pSub_free);
    2731}
    2832
    29 int CallOperatorProc(int idCalc, const Type &baseType, int *type_stack,LONG_PTR *index_stack,BOOL *bUseHeap,int &sp){
     33int CallOperatorProc(BYTE idCalc, const Type &baseType, int *type_stack,LONG_PTR *index_stack,BOOL *bUseHeap,int &sp){
    3034    //オーバーロードされたオペレータ関数を呼び出す
    3135    CClass *pobj_c;
    3236    pobj_c=(CClass *)index_stack[sp-2];
    3337
    34     std::vector<UserProc *> subs;
     38    std::vector<const UserProc *> subs;
    3539    pobj_c->GetMethods().Enum( idCalc, subs );
    3640    if( subs.size() == 0 ){
     
    5862    if(idCalc==CALC_EQUAL) lstrcpy(temporary,"==");
    5963    else GetCalcName(idCalc,temporary);
    60     UserProc *pUserProc = OverloadSolution( temporary, subs, params, baseType );
     64    const UserProc *pUserProc = OverloadSolution( temporary, subs, params, baseType );
    6165
    6266    if(!pUserProc){
     
    118122
    119123            //call calloc
    120             extern UserProc *pSub_calloc;
     124            extern const UserProc *pSub_calloc;
    121125            op_call(pSub_calloc);
    122126
     
    319323void CallIndexerGetterProc(int reg,const CClass *pobj_Class,char *ObjectName,char *Parameter,Type &resultType ){
    320324
    321     std::vector<UserProc *> subs;
     325    std::vector<const UserProc *> subs;
    322326    pobj_Class->GetMethods().Enum( CALC_ARRAY_GET, subs );
    323327    if( subs.size() == 0 ){
  • trunk/abdev/BasicCompiler64/Register.cpp

    r131 r206  
     1#include "stdafx.h"
     2
    13#include "../BasicCompiler_Common/common.h"
    24#include "Opcode.h"
  • trunk/abdev/BasicCompiler64/amd64_main.cpp

    r142 r206  
     1#include "stdafx.h"
     2
    13#include "../BasicCompiler_Common/common.h"
    24#include "Opcode.h"
     
    17911793/////////////////////////////
    17921794
    1793 void op_call( UserProc *pUserProc ){
     1795void op_call( const UserProc *pUserProc ){
    17941796    OpBuffer[obp++] = (char)0xE8;
    17951797    pobj_SubAddrSchedule->add( pUserProc, 1 );
     
    17971799    obp += sizeof(long);
    17981800}
    1799 void op_call( DllProc *pDllProc ){
     1801void op_call( const DllProc *pDllProc ){
    18001802    OpBuffer[obp++] = (char)0xFF;
    18011803    OpBuffer[obp++] = (char)0x15;
  • trunk/abdev/BasicCompiler64/increment.cpp

    r129 r206  
     1#include "stdafx.h"
     2
    13#include "../BasicCompiler_Common/common.h"
    24#include "Opcode.h"
  • trunk/abdev/BasicCompiler64/stack_frame.cpp

    r66 r206  
     1#include "stdafx.h"
     2
    13#include "../BasicCompiler_Common/common.h"
    24#include "Opcode.h"
Note: See TracChangeset for help on using the changeset viewer.