Changeset 73 in dev


Ignore:
Timestamp:
Mar 16, 2007, 11:07:14 PM (17 years ago)
Author:
dai_9181
Message:

Parameterクラスを適用。32bit側は動くようになったので、64bitのほうを調整する。

Files:
54 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler32/BasicCompiler.vcproj

    r71 r73  
    11141114                        >
    11151115                    </File>
    1116                     <File
    1117                         RelativePath="..\BasicCompiler_Common\Type.h"
    1118                         >
    1119                     </File>
    11201116                </Filter>
    11211117                <Filter
     
    12781274                    Name="Procedure"
    12791275                    >
    1280                     <File
    1281                         RelativePath="..\BasicCompiler_Common\Parameter.h"
    1282                         >
    1283                     </File>
    12841276                    <File
    12851277                        RelativePath="..\BasicCompiler_Common\ParamImpl.cpp"
     
    19261918                        />
    19271919                    </FileConfiguration>
     1920                </File>
     1921            </Filter>
     1922            <Filter
     1923                Name="CommonClasses"
     1924                >
     1925                <File
     1926                    RelativePath="..\BasicCompiler_Common\Procedure.cpp"
     1927                    >
     1928                </File>
     1929                <File
     1930                    RelativePath="..\BasicCompiler_Common\Type.cpp"
     1931                    >
    19281932                </File>
    19291933            </Filter>
     
    19741978                <File
    19751979                    RelativePath="..\BasicCompiler_Common\TypeDef.h"
     1980                    >
     1981                </File>
     1982            </Filter>
     1983            <Filter
     1984                Name="CommonClasses"
     1985                >
     1986                <File
     1987                    RelativePath="..\BasicCompiler_Common\Parameter.h"
     1988                    >
     1989                </File>
     1990                <File
     1991                    RelativePath="..\BasicCompiler_Common\Procedure.h"
     1992                    >
     1993                </File>
     1994                <File
     1995                    RelativePath="..\BasicCompiler_Common\Type.h"
    19761996                    >
    19771997                </File>
  • BasicCompiler32/CParameter.cpp

    r71 r73  
    4040        BOOL bByVal;
    4141        if(bEllipse){
    42             DummyTypeInfo.type=NumOpe_GetType(Parms[i2],NULL,&DummyTypeInfo.u.lpIndex);
     42            DummyTypeInfo.type=NumOpe_GetType_Old(Parms[i2],NULL,&DummyTypeInfo.u.lpIndex);
    4343            bByVal=1;
    4444        }
     
    9696    return nCountOfTempObjects * PTR_SIZE;
    9797}
     98int ParamImpl::NewTempParameters( const char *procName, const Parameters &params, int SecondParmNum ){
     99    ///////////////////////////////////////////////////////
     100    // 一時オブジェクトをあらかじめスタックに積んでおく
     101    ///////////////////////////////////////////////////////
     102
     103    useTempObject = false;
     104
     105    //一時参照の数
     106    nCountOfTempObjects = 0;
     107
     108    BOOL bEllipse;
     109    if(params.size()){
     110        if(params[params.size()-1]->GetBasicType()==DEF_ELLIPSE) bEllipse=1;
     111        else bEllipse=0;
     112    }
     113    else bEllipse=0;
     114
     115    for(int i2=ParmsNum-1;i2>=0;i2--){
     116        useTempParameters[i2] = false;
     117
     118        if(bEllipse&&i2<=(int)params.size()-2) bEllipse=0;
     119
     120        if(i2==0){
     121            if( params[i2]->GetVarName() == "_System_LocalThis" ){
     122                //オブジェクトメンバの第一パラメータのThisポインタ
     123                continue;
     124            }
     125        }
     126        if( i2==0||i2==1 ){
     127            if( params[i2]->GetVarName() == procName ){
     128                //オブジェクトメンバの第一または第二パラメータの戻り値用オブジェクト
     129                continue;
     130            }
     131        }
     132
     133        TYPEINFO DummyTypeInfo;
     134        BOOL bByVal;
     135        if(bEllipse){
     136            DummyTypeInfo.type=NumOpe_GetType_Old(Parms[i2],NULL,&DummyTypeInfo.u.lpIndex);
     137            bByVal=1;
     138        }
     139        else{
     140            DummyTypeInfo.type=params[i2]->GetBasicType();
     141            DummyTypeInfo.u.lpIndex=params[i2]->GetIndex();
     142            bByVal = ( params[i2]->IsRef() == false ) ? TRUE:FALSE;
     143        }
     144
     145
     146        if( !bByVal ){
     147            //ポインタ参照
     148            if(Parms[i2][0]==1&&Parms[i2][1]==ESC_BYVAL){
     149                //ポインタ指定
     150                continue;
     151            }
     152
     153            LONG_PTR lpVarIndex;
     154            if( GetVarType( Parms[i2], &lpVarIndex, FALSE ) == -1 ){
     155                //変数ではないとき
     156                int reg = REG_RAX;
     157                int type = NumOpe( Parms[i2], DummyTypeInfo.type, DummyTypeInfo.u.lpIndex, &lpVarIndex );
     158                //↑ここでスタックに積む
     159
     160                nCountOfTempObjects++;
     161
     162                if( type != DEF_STRUCT ){
     163                    //一時参照を作成
     164
     165                    //push esp
     166                    op_push( REG_ESP );
     167
     168                    nCountOfTempObjects++;
     169                }
     170
     171                bool result = CheckDifferentType(
     172                    DummyTypeInfo.type,
     173                    DummyTypeInfo.u.lpIndex,
     174                    type,
     175                    lpVarIndex,
     176                    procName,
     177                    i2);
     178
     179                if( result ){
     180                    useTempParameters[i2] = true;
     181                    useTempObject = true;
     182
     183                    types[i2].type = type;
     184                    types[i2].u.lpIndex = lpVarIndex;
     185                }
     186            }
     187        }
     188    }
     189
     190    return nCountOfTempObjects * PTR_SIZE;
     191}
    98192
    99193void ParamImpl::DeleteTempParameters(){
     
    111205
    112206                //call free
    113                 extern SUBINFO *pSub_free;
     207                extern SubInfo *pSub_free;
    114208                op_call(pSub_free);
    115209            }
     
    138232
    139233    //call calloc
    140     extern SUBINFO *pSub_calloc;
     234    extern SubInfo *pSub_calloc;
    141235    op_call(pSub_calloc);
    142236
     
    147241    TYPEINFO BaseType={DEF_STRUCT,(LONG_PTR)pobj_Class};
    148242    TYPEINFO CalcType;
    149     CalcType.type=NumOpe_GetType(Parameter,&BaseType,&CalcType.u.lpIndex);
     243    CalcType.type=NumOpe_GetType_Old(Parameter,&BaseType,&CalcType.u.lpIndex);
    150244
    151245    /*
     
    267361        BOOL bByVal;
    268362        if(bEllipse){
    269             DummyTypeInfo.type=NumOpe_GetType(Parms[i2],NULL,&DummyTypeInfo.u.lpIndex);
     363            DummyTypeInfo.type=NumOpe_GetType_Old(Parms[i2],NULL,&DummyTypeInfo.u.lpIndex);
    270364            bByVal=1;
    271365        }
     
    436530    return ParmSize;
    437531}
     532int ParamImpl::SetParameter( const char *procName, const Parameters &params, int SecondParmNum ){
     533    ///////////////////////////////////////////////////////////
     534    // パラメータをレジスタ及びスタックフレームにセット
     535    ///////////////////////////////////////////////////////////
     536    int i2,i3;
     537
     538    BOOL bEllipse;
     539    if( params.size() ){
     540        if(params[params.size()-1]->GetBasicType()==DEF_ELLIPSE) bEllipse=1;
     541        else bEllipse=0;
     542    }
     543    else bEllipse=0;
     544
     545    BOOL bHas_System_LocalThis=0;
     546    if(ParmsNum>=1){
     547        if( params[0]->GetVarName() == "_System_LocalThis" ){
     548            bHas_System_LocalThis=1;
     549        }
     550    }
     551
     552    //戻り値用の変数名を取得
     553    const char *lpszVarNameToReturn = (procName[0]==1&&procName[1]==ESC_OPERATOR)?"_System_ReturnValue":procName;
     554
     555    //パラメータをレジスタとスタックに格納
     556    int CalcType;
     557    LONG_PTR lpCalcIndex;
     558    BOOL bCalcUseHeap;
     559    int ParmSize=0;
     560    RELATIVE_VAR RelativeVar;
     561    int nCountOfNowTempObjects = 0;
     562    for(i2=ParmsNum-1;i2>=0;i2--){
     563        if(bEllipse&&i2<=(int)params.size()-2) bEllipse=0;
     564
     565        if(i2==0){
     566            if( params[i2]->GetVarName() == "_System_LocalThis" ){
     567                //オブジェクトメンバの第一パラメータのThisポインタ
     568                continue;
     569            }
     570        }
     571        if(i2==0||i2==1){
     572            if( params[i2]->GetVarName() == lpszVarNameToReturn ){
     573                //オブジェクトメンバの第一または第二パラメータの戻り値用オブジェクト
     574                continue;
     575            }
     576        }
     577
     578        TYPEINFO DummyTypeInfo;
     579        BOOL bByVal;
     580        if(bEllipse){
     581            DummyTypeInfo.type=NumOpe_GetType_Old(Parms[i2],NULL,&DummyTypeInfo.u.lpIndex);
     582            bByVal=1;
     583        }
     584        else{
     585            DummyTypeInfo.type=params[i2]->GetBasicType();
     586            DummyTypeInfo.u.lpIndex=params[i2]->GetIndex();
     587            bByVal = (params[i2]->IsRef() == false ) ? TRUE:FALSE;
     588        }
     589
     590        if(bByVal==1){
     591            //値参照
     592
     593            if(Parms[i2][0]==1&&Parms[i2][1]==ESC_BYVAL){
     594                char temp2[255];
     595                sprintf(temp2,"%s関数の第%dパラメータ",procName,i2+1);
     596                SetError(19,temp2,cp);
     597                continue;
     598            }
     599
     600            if(DummyTypeInfo.type==DEF_STRUCT){
     601                SetStructParameter(DummyTypeInfo.u.pobj_Class,Parms[i2]);
     602                goto next;
     603            }
     604
     605
     606            extern LONG_PTR ProcPtr_BaseIndex;
     607            LONG_PTR back_ProcPtr_BaseIndex;
     608            back_ProcPtr_BaseIndex=ProcPtr_BaseIndex;
     609            if(DummyTypeInfo.type==DEF_PTR_PROC) ProcPtr_BaseIndex=DummyTypeInfo.u.lpIndex;
     610            else ProcPtr_BaseIndex=-1;
     611
     612            CalcType=NumOpe(Parms[i2],DummyTypeInfo.type,DummyTypeInfo.u.lpIndex,&lpCalcIndex,&bCalcUseHeap);
     613
     614            ProcPtr_BaseIndex=back_ProcPtr_BaseIndex;
     615
     616            if(CalcType==-1) break;
     617
     618            if(CalcType==DEF_OBJECT){
     619                if( DummyTypeInfo.type != DEF_OBJECT
     620                    ||
     621                    DummyTypeInfo.type == DEF_OBJECT &&
     622                    !DummyTypeInfo.u.pobj_Class->IsEqualsOrSubClass( (CClass *)lpCalcIndex ) ){
     623                        //キャスト演算子のオーバーロードに対応する
     624                        CallCastOperatorProc(CalcType,lpCalcIndex,bCalcUseHeap,DummyTypeInfo.type,DummyTypeInfo.u.lpIndex);
     625                }
     626            }
     627
     628            if(!bEllipse){
     629                //型チェック
     630                if(bHas_System_LocalThis) i3=i2-1;
     631                else i3=i2;
     632                CheckDifferentType(
     633                    DummyTypeInfo.type,
     634                    DummyTypeInfo.u.lpIndex,
     635                    CalcType,
     636                    lpCalcIndex,
     637                    procName,
     638                    i3);
     639            }
     640
     641            if(DummyTypeInfo.type==DEF_DOUBLE){
     642                ChangeTypeToDouble(CalcType);
     643                ParmSize+=sizeof(long)*2;
     644            }
     645            else if(DummyTypeInfo.type==DEF_SINGLE){
     646                ChangeTypeToSingle(CalcType);
     647                ParmSize+=sizeof(long);
     648            }
     649            else if(DummyTypeInfo.type==DEF_INT64||DummyTypeInfo.type==DEF_QWORD){
     650                ChangeTypeToInt64(CalcType);
     651                ParmSize+=sizeof(long)*2;
     652            }
     653            else if(DummyTypeInfo.type==DEF_LONG||DummyTypeInfo.type==DEF_DWORD||DummyTypeInfo.type==DEF_OBJECT||DummyTypeInfo.type==DEF_STRUCT||
     654                (IsPtrType(DummyTypeInfo.type)/*&&DummyTypeInfo.type!=DEF_PTR_VOID&&DummyTypeInfo.type!=DEF_PTR_BYTE*/)){
     655                ChangeTypeToLong(CalcType);
     656                ParmSize+=sizeof(long);
     657            }
     658            else if(DummyTypeInfo.type==DEF_INTEGER||DummyTypeInfo.type==DEF_WORD || (isUnicode&&DummyTypeInfo.type==DEF_CHAR)){
     659                ChangeTypeToInteger(CalcType);
     660                ParmSize+=sizeof(long);
     661            }
     662            else if(DummyTypeInfo.type==DEF_SBYTE||DummyTypeInfo.type==DEF_BYTE||DummyTypeInfo.type==DEF_BOOLEAN || (isUnicode==false&&DummyTypeInfo.type==DEF_CHAR)){
     663                ChangeTypeToByte(CalcType);
     664                ParmSize+=sizeof(long);
     665            }
     666            else{
     667                SetError(300,NULL,cp);
     668            }
     669        }
     670        else{
     671            //ポインタ参照
     672            if(Parms[i2][0]==1&&Parms[i2][1]==ESC_BYVAL){
     673                //ポインタ指定
     674                i3=NumOpe(Parms[i2]+2,0,0,0);
     675
     676                ChangeTypeToLong(i3);
     677            }
     678            else{
     679                if( useTempParameters[i2] ){
     680                    //一時オブジェクトをコピー
     681
     682                    if( types[i2].type != DEF_STRUCT ){
     683                        // 一時参照のための領域を考慮する
     684                        nCountOfNowTempObjects++;
     685                    }
     686
     687                    nCountOfNowTempObjects++;
     688
     689                    //mov eax, dword ptr[esp+offset]
     690                    op_mov_RM(
     691                        sizeof(long),
     692                        REG_EAX,
     693                        REG_ESP,
     694                        ( ( ParmsNum - i2 - 1 ) + ( nCountOfTempObjects - nCountOfNowTempObjects ) ) * PTR_SIZE,
     695                        MOD_BASE_DISP32 );
     696
     697                    //push eax
     698                    op_push(REG_EAX);
     699                }
     700                else{
     701                    //変数のアドレスを取得
     702                    int VarType;
     703                    LONG_PTR lpVarIndex;
     704                    if(GetVarOffset(
     705                        false,
     706                        false,
     707                        Parms[i2],
     708                        &VarType,
     709                        &RelativeVar,
     710                        &lpVarIndex)){
     711                            if(DummyTypeInfo.type!=DEF_ANY){
     712                                //型チェックを行う
     713                                if(DummyTypeInfo.type==VarType){
     714                                    if(DummyTypeInfo.type==DEF_OBJECT){
     715                                        if( !DummyTypeInfo.u.pobj_Class->IsEqualsOrSubClass( (CClass *)lpVarIndex ) ){
     716                                            SetError(11,Parms[i2],cp);
     717                                        }
     718                                    }
     719                                    else if(DummyTypeInfo.type==DEF_STRUCT){
     720                                        if( !DummyTypeInfo.u.pobj_Class->IsEquals( (CClass *)lpVarIndex ) ){
     721                                            SetError(11,Parms[i2],cp);
     722                                        }
     723                                    }
     724                                }
     725                                else if((VarType&FLAG_PTR)&&((int)(VarType^FLAG_PTR)==DummyTypeInfo.type)){
     726                                    //仮引数がポインタ参照で、実引数が配列の先頭ポインタのとき
     727                                }
     728                                else{
     729                                    SetError(11,Parms[i2],cp);
     730                                }
     731                            }
     732
     733                            //変数アドレスをレジスタにセット
     734                            SetVarPtrToEax(&RelativeVar);
     735
     736                            //push eax
     737                            op_push(REG_EAX);
     738                    }
     739                }
     740            }
     741
     742            ParmSize+=PTR_SIZE;
     743        }
     744
     745next:;
     746    }
     747
     748    return ParmSize;
     749}
  • BasicCompiler32/Compile_CallProc.cpp

    r71 r73  
    88void Call_DebugSys_SaveContext(){
    99    //call _System_GetEip
    10     extern SUBINFO *pSub_System_GetEip;
     10    extern SubInfo *pSub_System_GetEip;
    1111    op_call(pSub_System_GetEip);
    1212
     
    1818
    1919    //call _DebugSys_SaveContext
    20     extern SUBINFO *pSub_DebugSys_SaveContext;
     20    extern SubInfo *pSub_DebugSys_SaveContext;
    2121    op_call(pSub_DebugSys_SaveContext);
    2222}
     
    9494}
    9595
    96 void Opcode_CallProc(const char *Parameter,SUBINFO *psi,DWORD dwFlags,char *ObjectName,int RefType){
     96void Opcode_CallProc(const char *Parameter,SubInfo *psi,DWORD dwFlags,char *ObjectName,int RefType){
    9797    int i2;
    9898
     
    230230
    231231    //エラーチェック
    232     if( !pobj_parameter->ErrorCheck(psi->name,psi->pRealParmInfo,psi->RealParmNum,psi->SecondParmNum) ){
     232    if( !pobj_parameter->ErrorCheck(psi->name,psi->realParams,psi->SecondParmNum) ){
    233233        //パラメータにエラーがあるときは処理を終える
    234234        return;
     
    237237    if(psi->dwType==SUBTYPE_MACRO){
    238238        //マクロ関数の場合は、パラメータ省略を考慮する
    239         pobj_parameter->MacroParameterSupport(psi->pRealParmInfo);
     239        pobj_parameter->MacroParameterSupport( psi->realParams );
    240240    }
    241241
    242242    //一時オブジェクトを生成
    243     int tempSize = pobj_parameter->NewTempParameters( psi->name,psi->pRealParmInfo,psi->RealParmNum,psi->RealSecondParmNum );
     243    int tempSize = pobj_parameter->NewTempParameters( psi->name,psi->realParams,psi->RealSecondParmNum );
    244244
    245245    //レジスタ、スタックフレームにセット
    246246    int ParmSize;
    247     ParmSize=pobj_parameter->SetParameter(psi->name,psi->pRealParmInfo,psi->RealParmNum,psi->RealSecondParmNum);
     247    ParmSize=pobj_parameter->SetParameter(psi->name,psi->realParams,psi->RealSecondParmNum);
    248248
    249249    if(psi->ReturnType==DEF_STRUCT && psi->isReturnRef == false){
     
    259259
    260260        //call calloc
    261         extern SUBINFO *pSub_calloc;
     261        extern SubInfo *pSub_calloc;
    262262        op_call(pSub_calloc);
    263263
  • BasicCompiler32/Compile_Func.cpp

    r64 r73  
    243243void Opcode_Func_AddressOf(const char *name){
    244244    extern int cp;
    245     SUBINFO *psi;
     245    SubInfo *psi;
    246246
    247247    extern LONG_PTR ProcPtr_BaseIndex;
     
    249249        //左辺の型にのっとり、オーバーロードを解決
    250250
    251         std::vector<SUBINFO *> subs;
     251        std::vector<SubInfo *> subs;
    252252        GetOverloadSubHash( name, subs );
    253253        if( subs.size() == 0 ){
  • BasicCompiler32/Compile_Object.cpp

    r68 r73  
    3131    ////////////////////////
    3232
    33     std::vector<SUBINFO *> subs;
     33    std::vector<SubInfo *> subs;
    3434    pobj_c->EnumMethod( pobj_c->name, subs );
    3535
    36     SUBINFO *psi;
     36    SubInfo *psi;
    3737    if( subs.size() > 0 ){
    3838        //オーバーロードを解決
     
    133133
    134134        //call _System_GC_malloc_ForObject
    135         extern SUBINFO *pSub_System_GC_malloc_ForObject;
     135        extern SubInfo *pSub_System_GC_malloc_ForObject;
    136136        op_call(pSub_System_GC_malloc_ForObject);
    137137    }
     
    140140
    141141        //call _System_GC_malloc_ForObjectPtr
    142         extern SUBINFO *pSub_System_GC_malloc_ForObjectPtr;
     142        extern SubInfo *pSub_System_GC_malloc_ForObjectPtr;
    143143        op_call(pSub_System_GC_malloc_ForObjectPtr);
    144144    }
     
    208208    // コンストラクタの呼び出し
    209209    ////////////////////////////
    210 
    211     if( lstrcmp(classObj.name,"proc")==0){
    212         int i=0;
    213     }
    214210
    215211    BOOL bSomeObjects;
     
    380376    if( isSweeping ){
    381377        //call _System_GC_free_for_SweepingDelete
    382         extern SUBINFO *pSub_System_GC_free_for_SweepingDelete;
     378        extern SubInfo *pSub_System_GC_free_for_SweepingDelete;
    383379        op_call(pSub_System_GC_free_for_SweepingDelete);
    384380    }
    385381    else{
    386382        //call free
    387         extern SUBINFO *pSub_free;
     383        extern SubInfo *pSub_free;
    388384        op_call(pSub_free);
    389385    }
  • BasicCompiler32/Compile_ProcOp.cpp

    r64 r73  
    214214}
    215215
    216 void CompileBufferInProcedure(SUBINFO *psi){
     216void CompileBufferInProcedure(SubInfo *psi){
    217217    extern char *basbuf;
    218218    extern HANDLE hHeap;
    219     extern SUBINFO **ppSubHash;
     219    extern SubInfo **ppSubHash;
    220220    extern BOOL bDebugCompile;
    221221    int i3,i4,VarSize,LocalVarSchedule,EspOffsetSchedule,BufferSize,BaseOffset;
     
    280280
    281281    //パラメータ用の変数データを考慮
    282     for(i3=psi->RealParmNum-1;i3>=0;i3--){
     282    for(i3=psi->realParams.size()-1;i3>=0;i3--){
     283        Parameter &param = *psi->realParams[i3];
     284
    283285        //変数データを追加
    284286        LocalVar=(VARIABLE *)HeapReAlloc(hHeap,0,LocalVar,(MaxLocalVarNum+1)*sizeof(VARIABLE));
    285287
    286         lstrcpy(LocalVar[MaxLocalVarNum].name,psi->pRealParmInfo[i3].name);
     288        lstrcpy( LocalVar[MaxLocalVarNum].name,param.GetVarName().c_str() );
    287289
    288290        // TODO: パラメータのConst定義の指定が未完成
    289291        LocalVar[MaxLocalVarNum].bConst=false;
    290292
    291         LocalVar[MaxLocalVarNum].bArray=psi->pRealParmInfo[i3].bArray;
    292         memcpy(LocalVar[MaxLocalVarNum].SubScripts,psi->pRealParmInfo[i3].SubScripts,MAX_ARRAYDIM*sizeof(int));
    293 
    294         LocalVar[MaxLocalVarNum].type=psi->pRealParmInfo[i3].type;
     293        LocalVar[MaxLocalVarNum].bArray=param.IsArray()?TRUE:FALSE;
     294        memcpy(LocalVar[MaxLocalVarNum].SubScripts,param.GetSubScriptsPtr(),MAX_ARRAYDIM*sizeof(int));
     295
     296        LocalVar[MaxLocalVarNum].type=param.GetBasicType();
    295297        if(LocalVar[MaxLocalVarNum].type==DEF_OBJECT
    296298            ||LocalVar[MaxLocalVarNum].type==DEF_STRUCT){
     
    299301        }
    300302
    301         LocalVar[MaxLocalVarNum].u.index=psi->pRealParmInfo[i3].u.index;
    302 
    303         if(psi->pRealParmInfo[i3].bByVal&&psi->pRealParmInfo[i3].type==DEF_STRUCT){
     303        LocalVar[MaxLocalVarNum].u.index=param.GetIndex();
     304
     305        if( param.IsRef() == false && param.IsStruct() ){
    304306            //構造体のByValパラメータ
    305307            LocalVar[MaxLocalVarNum].fRef=REF_PARAMETER | OBJECT_PARAMETER;
     
    307309        }
    308310        else{
    309             if(psi->pRealParmInfo[i3].bByVal&&psi->pRealParmInfo[i3].bArray==0){
     311            if( param.IsRef() == false && param.IsArray() == false ){
    310312                LocalVar[MaxLocalVarNum].fRef=0;
    311313                VarSize=GetTypeSize(LocalVar[MaxLocalVarNum].type,LocalVar[MaxLocalVarNum].u.index);
     
    344346
    345347    //コンパイル中の関数
    346     extern SUBINFO *pCompilingSubInfo;
     348    extern SubInfo *pCompilingSubInfo;
    347349    pCompilingSubInfo=psi;
    348350
     
    442444
    443445        //call _DebugSys_StartProc
    444         extern SUBINFO *pSub_DebugSys_StartProc;
     446        extern SubInfo *pSub_DebugSys_StartProc;
    445447        op_call(pSub_DebugSys_StartProc);
    446448    }
     
    684686
    685687        //call _DebugSys_EndProc
    686         extern SUBINFO *pSub_DebugSys_EndProc;
     688        extern SubInfo *pSub_DebugSys_EndProc;
    687689        op_call(pSub_DebugSys_EndProc);
    688690    }
     
    806808
    807809        //call _esp_error
    808         extern SUBINFO *pSub_esp_error;
     810        extern SubInfo *pSub_esp_error;
    809811        op_call( pSub_esp_error );
    810812
     
    840842}
    841843void CompileLocal(){
    842     extern SUBINFO **ppSubHash;
     844    extern SubInfo **ppSubHash;
    843845    int i2;
    844     SUBINFO *psi;
     846    SubInfo *psi;
    845847
    846848    extern BOOL bDll;
     
    856858    //_System_InitStaticLocalVariablesは一番最後にコンパイル
    857859    //※一般関数内の静的変数オブジェクトをすべて収集しなければならない
    858     extern SUBINFO *pSub_System_InitStaticLocalVariables;
     860    extern SubInfo *pSub_System_InitStaticLocalVariables;
    859861    pSub_System_InitStaticLocalVariables->bCompile=1;
    860862
    861863    //_System_Call_Destructor_of_GlobalObjectは一番最後にコンパイル
    862     extern SUBINFO *pSub_System_Call_Destructor_of_GlobalObject;
     864    extern SubInfo *pSub_System_Call_Destructor_of_GlobalObject;
    863865    pSub_System_Call_Destructor_of_GlobalObject->bCompile=1;
    864866
  • BasicCompiler32/Compile_Set_Var.cpp

    r67 r73  
    7171
    7272                    //call free
    73                     extern SUBINFO *pSub_free;
     73                    extern SubInfo *pSub_free;
    7474                    op_call(pSub_free);
    7575                }
  • BasicCompiler32/Compile_Statement.cpp

    r67 r73  
    55    int i,i2;
    66    char buffer[8192];
    7     SUBINFO *psi;
     7    SubInfo *psi;
    88
    99    for(i=0;;i++){
     
    4444
    4545        //GetSubHash内でエラー提示が行われた場合
    46         if(psi==(SUBINFO *)-1) return;
     46        if(psi==(SubInfo *)-1) return;
    4747
    4848        if(psi==0){
     
    5454
    5555            //GetSubHash内でエラー提示が行われた場合
    56             if(psi==(SUBINFO *)-1) return;
     56            if(psi==(SubInfo *)-1) return;
    5757        }
    5858
     
    10761076                    pobj_c=(CClass *)lpIndex;
    10771077
    1078                     std::vector<SUBINFO *> subs;
     1078                    std::vector<SubInfo *> subs;
    10791079                    pobj_c->EnumMethod( CALC_EQUAL, subs );
    10801080                    if( subs.size() == 0 ){
     
    10931093
    10941094                    //オーバーロードを解決
    1095                     SUBINFO *psi;
     1095                    SubInfo *psi;
    10961096                    psi=OverloadSolution("==",subs,ppi,iParmNum,NULL);
    10971097                    HeapDefaultFree(ppi);
     
    13301330        //戻り値をセット
    13311331        if(Parameter[0]){
    1332             extern SUBINFO *pCompilingSubInfo;
     1332            extern SubInfo *pCompilingSubInfo;
    13331333            char *temp;
    13341334            if(pCompilingSubInfo->name[0]==1&&pCompilingSubInfo->name[1]==ESC_OPERATOR)
     
    14601460    OpcodeCalc(temp2);
    14611461
    1462     SUBINFO *psi;
     1462    SubInfo *psi;
    14631463    if(bFile) psi=GetSubHash("INPUT_FromFile");
    14641464    else psi=GetSubHash("INPUT_FromPrompt");
     
    15621562    OpcodeCalc(temp2);
    15631563
    1564     SUBINFO *psi;
     1564    SubInfo *psi;
    15651565    if(bFile) psi=GetSubHash("PRINTUSING_ToFile");
    15661566    else psi=GetSubHash("PRINTUSING_ToPrompt");
     
    16661666    if(sw) lstrcat(buffer,"+Ex\"\\r\\n\"");
    16671667
    1668     SUBINFO *psi;
     1668    SubInfo *psi;
    16691669    if(bFile) psi=GetSubHash("PRINT_ToFile");
    16701670    else psi=GetSubHash("PRINT_ToPrompt");
  • BasicCompiler32/Compile_Var.cpp

    r69 r73  
    520520
    521521    char temporary[VN_SIZE];
    522     extern SUBINFO *pCompilingSubInfo;
     522    extern SubInfo *pCompilingSubInfo;
    523523    if(pCompilingSubInfo){
    524524        GetNowStaticVarFullName(VarName,temporary);
  • BasicCompiler32/MakePeHdr.cpp

    r67 r73  
    88// 特殊関数の構造体ポインタ
    99////////////////////////////
    10 SUBINFO
     10SubInfo
    1111    *pSub_System_StartupProgram,
    1212    *pSub_DebugSys_StartProc,
     
    391391
    392392        //call _System_Call_Destructor_of_GlobalObject
    393         extern SUBINFO *pSub_System_Call_Destructor_of_GlobalObject;
     393        extern SubInfo *pSub_System_Call_Destructor_of_GlobalObject;
    394394        op_call(pSub_System_Call_Destructor_of_GlobalObject);
    395395
     
    522522        ExportNamesLength=lstrlen(lpExportNames)+1;
    523523
    524         extern SUBINFO **ppSubHash;
    525         SUBINFO *psi,*psi2;
     524        extern SubInfo **ppSubHash;
     525        SubInfo *psi,*psi2;
    526526        while(1){
    527527            //辞書順にサーチ
  • BasicCompiler32/NumOpe_Arithmetic.cpp

    r67 r73  
    270270
    271271            //call _allmul
    272             extern SUBINFO *pSub_allmul;
     272            extern SubInfo *pSub_allmul;
    273273            op_call(pSub_allmul);
    274274
     
    460460
    461461            //call _aullrem
    462             extern SUBINFO *pSub_aullrem;
     462            extern SubInfo *pSub_aullrem;
    463463            op_call(pSub_aullrem);
    464464        }
     
    467467
    468468            //call _allrem
    469             extern SUBINFO *pSub_allrem;
     469            extern SubInfo *pSub_allrem;
    470470            op_call(pSub_allrem);
    471471        }
     
    720720
    721721            //call _aulldiv
    722             extern SUBINFO *pSub_aulldiv;
     722            extern SubInfo *pSub_aulldiv;
    723723            op_call(pSub_aulldiv);
    724724        }
     
    727727
    728728            //call _alldiv
    729             extern SUBINFO *pSub_alldiv;
     729            extern SubInfo *pSub_alldiv;
    730730            op_call(pSub_alldiv);
    731731        }
     
    10001000
    10011001    //call pow
    1002     extern SUBINFO *pSub_pow;
     1002    extern SubInfo *pSub_pow;
    10031003    op_call(pSub_pow);
    10041004
     
    11561156
    11571157        //call _allshl
    1158         extern SUBINFO *pSub_allshl;
     1158        extern SubInfo *pSub_allshl;
    11591159        op_call(pSub_allshl);
    11601160
     
    13611361
    13621362            //call _aullshr
    1363             extern SUBINFO *pSub_aullshr;
     1363            extern SubInfo *pSub_aullshr;
    13641364            op_call(pSub_aullshr);
    13651365        }
     
    13681368
    13691369            //call _allshr
    1370             extern SUBINFO *pSub_allshr;
     1370            extern SubInfo *pSub_allshr;
    13711371            op_call(pSub_allshr);
    13721372        }
  • BasicCompiler32/Opcode.h

    r71 r73  
    214214    ParamImpl(const char *buffer);
    215215    ParamImpl(const PARAMETER_INFO *pParamInfo, const int ParmNum);
     216    ParamImpl::ParamImpl(const Parameters &params);
    216217    ~ParamImpl();
    217218    void SetReturnType(TYPEINFO *pTypeInfo);
    218219
    219220private:
    220     BOOL _overload_check(PARAMETER_INFO *ppi,int pi_num,TYPEINFO *pReturnTypeInfo,int overload_level);
    221     SUBINFO *OverloadSolutionWithReturnType( const char *name, std::vector<SUBINFO *> &subs );
     221    BOOL _overload_check( Parameters &params,TYPEINFO *pReturnTypeInfo,int overload_level);
     222    SubInfo *OverloadSolutionWithReturnType( const char *name, std::vector<SubInfo *> &subs );
    222223public:
    223     SUBINFO *OverloadSolution( const char *name, std::vector<SUBINFO *> &subs );
     224    SubInfo *OverloadSolution( const char *name, std::vector<SubInfo *> &subs );
    224225
    225226    BOOL ErrorCheck(const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum);
     227    bool ErrorCheck( const char *procName, const Parameters &params, int SecondParmNum );
    226228    void MacroParameterSupport(PARAMETER_INFO *ppi);
     229    void MacroParameterSupport( const Parameters &params );
    227230    void SetStructParameter(CClass *pobj_Class,LPSTR Parameter);
    228231    int SetParameter(const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum);
     232    int SetParameter( const char *procName, const Parameters &params, int SecondParmNum );
    229233
    230234    //一時オブジェクトパラメータの生成と破棄
    231235    int NewTempParameters( const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum );
     236    int NewTempParameters( const char *procName, const Parameters &params, int SecondParmNum );
    232237    void DeleteTempParameters();
    233238};
     
    237242#define PROCFLAG_NEW    1
    238243int Opcode_CallProcPtr(char *variable,char *Parameter,PROCPTRINFO *pi,LONG_PTR *plpIndex);
    239 void Opcode_CallProc(const char *Parameter,SUBINFO *psi,DWORD dwFlags,char *ObjectName,int RefType);
     244void Opcode_CallProc(const char *Parameter,SubInfo *psi,DWORD dwFlags,char *ObjectName,int RefType);
    240245int Opcode_CallDllProc(char *Parameter,DECLAREINFO *pdi,LONG_PTR *plpIndex);
    241246
     
    339344void fpu_cast_end();
    340345
    341 void op_call(SUBINFO *psi);
     346void op_call(SubInfo *psi);
  • BasicCompiler32/OperatorProc.cpp

    r67 r73  
    1818
    1919    //call free
    20     extern SUBINFO *pSub_free;
     20    extern SubInfo *pSub_free;
    2121    op_call(pSub_free);
    2222}
     
    2727    pobj_c=(CClass *)index_stack[sp-2];
    2828
    29     std::vector<SUBINFO *> subs;
     29    std::vector<SubInfo *> subs;
    3030    pobj_c->EnumMethod( idCalc, subs );
    3131    if( subs.size() == 0 ){
     
    4242    BOOL bReturnTypeIsObject=1;
    4343    TYPEINFO ReturnType={DEF_OBJECT,subs[0]->u.ReturnIndex};
    44     foreach( SUBINFO *psi, subs ){
     44    foreach( SubInfo *psi, subs ){
    4545        if(psi->ReturnType!=DEF_OBJECT)
    4646            bReturnTypeIsObject=0;
     
    7979    if(idCalc==CALC_EQUAL) lstrcpy(temporary,"==");
    8080    else GetCalcName(idCalc,temporary);
    81     SUBINFO *psi;
     81    SubInfo *psi;
    8282    psi=OverloadSolution(temporary,subs,ppi,iParmNum,pBaseTypeInfo);
    8383
     
    8888    else{
    8989        //オーバーロードされていないが、パラメータ個数が一致しないとき
    90         if(iParmNum!=psi->ParmNum){
     90        if(iParmNum!=psi->params.size()){
    9191            HeapDefaultFree(ppi);
    9292            return -1;
     
    9696    for(i=0;i<iParmNum;i++){
    9797        CheckDifferentType(
    98             psi->pParmInfo[i].type,
    99             psi->pParmInfo[i].u.index,
     98            psi->params[i]->GetBasicType(),
     99            psi->params[i]->GetIndex(),
    100100            ppi[i].type,
    101101            ppi[i].u.index,
     
    109109
    110110    if(bTwoTerm){
    111         if(psi->pRealParmInfo[1].type==DEF_STRUCT&&psi->pRealParmInfo[1].bByVal){
     111        if( psi->realParams[1]->IsStruct() &&psi->realParams[1]->IsRef() == false ){
    112112            //一時オブジェクトはメソッド内で破棄される
    113113            bUseHeap[sp-1]=0;
     
    128128
    129129        //call calloc
    130         extern SUBINFO *pSub_calloc;
     130        extern SubInfo *pSub_calloc;
    131131        op_call(pSub_calloc);
    132132
     
    180180        }
    181181
    182         if( !psi->pRealParmInfo[1].bByVal ){
     182        if( psi->realParams[1]->IsRef() ){
    183183            //一時参照を作成
    184184
     
    203203
    204204    if(bTwoTerm){
    205         if( !psi->pRealParmInfo[1].bByVal ){
     205        if( psi->realParams[1]->IsRef() ){
    206206            //一時参照を破棄
    207207            op_pop( REG_NON );
     
    273273}
    274274void CallIndexerGetterProc(CClass *pobj_Class,char *ObjectName,char *Parameter,TYPEINFO &RetTypeInfo){
    275     std::vector<SUBINFO *> subs;
     275    std::vector<SubInfo *> subs;
    276276    pobj_Class->EnumMethod( CALC_ARRAY_GET, subs );
    277277    if( subs.size() == 0 ){
  • BasicCompiler32/VarList.cpp

    r69 r73  
    348348    if(pobj_dti->lplpSpBase[i2]==0) return;
    349349
    350     extern SUBINFO **ppSubHash;
    351     SUBINFO *psi;
     350    extern SubInfo **ppSubHash;
     351    SubInfo *psi;
    352352    for(i3=0,sw=0;i3<MAX_HASH;i3++){
    353353        psi=ppSubHash[i3];
     
    583583
    584584    //プロシージャ コンボボックス
    585     extern SUBINFO **ppSubHash;
    586     SUBINFO *psi;
     585    extern SubInfo **ppSubHash;
     586    SubInfo *psi;
    587587    int sw;
    588588    SendMessage(hProcCombo,CB_RESETCONTENT,0,0);
     
    706706
    707707    if(pobj_dti->lplpSpBase[i2]){
    708         extern SUBINFO **ppSubHash;
    709         SUBINFO *psi;
     708        extern SubInfo **ppSubHash;
     709        SubInfo *psi;
    710710        for(i3=0,sw=0;i3<MAX_HASH;i3++){
    711711            psi=ppSubHash[i3];
  • BasicCompiler32/WatchList.cpp

    r64 r73  
    308308ULONG_PTR Debugging_GetThisPtrOffset(LONG_PTR obp_Rip){
    309309    int i;
    310     SUBINFO *psi;
     310    SubInfo *psi;
    311311
    312312    //ripからプロシージャを取得
  • BasicCompiler32/op32_main.cpp

    r67 r73  
    974974/////////////////////////////
    975975
    976 void op_call(SUBINFO *psi){
     976void op_call(SubInfo *psi){
    977977    OpBuffer[obp++]=(char)0xE8;
    978978    pobj_SubAddrSchedule->add(psi,1);
  • BasicCompiler64/CParameter.cpp

    r71 r73  
    112112
    113113                //call free
    114                 extern SUBINFO *pSub_free;
     114                extern SubInfo *pSub_free;
    115115                op_call(pSub_free);
    116116            }
     
    135135
    136136        //call calloc
    137         extern SUBINFO *pSub_calloc;
     137        extern SubInfo *pSub_calloc;
    138138        op_call(pSub_calloc);
    139139
  • BasicCompiler64/Compile_CallProc.cpp

    r71 r73  
    88void Call_DebugSys_SaveContext(){
    99    //call _System_GetEip
    10     extern SUBINFO *pSub_System_GetEip;
     10    extern SubInfo *pSub_System_GetEip;
    1111    op_call(pSub_System_GetEip);
    1212
     
    1818
    1919    //call _DebugSys_SaveContext
    20     extern SUBINFO *pSub_DebugSys_SaveContext;
     20    extern SubInfo *pSub_DebugSys_SaveContext;
    2121    op_call(pSub_DebugSys_SaveContext);
    2222}
     
    9696}
    9797
    98 void Opcode_CallProc(const char *Parameter,SUBINFO *psi,DWORD dwFlags,char *ObjectName,int RefType){
     98void Opcode_CallProc(const char *Parameter,SubInfo *psi,DWORD dwFlags,char *ObjectName,int RefType){
    9999    int i2;
    100100
     
    234234
    235235    //エラーチェック
    236     if( !pobj_parameter->ErrorCheck(psi->name,psi->pRealParmInfo,psi->RealParmNum,psi->SecondParmNum) ){
     236    if( !pobj_parameter->ErrorCheck(psi->name,psi->realParams,psi->SecondParmNum) ){
    237237        //パラメータにエラーがあるときは処理を終える
    238238        return;
     
    241241    if(psi->dwType==SUBTYPE_MACRO){
    242242        //マクロ関数の場合は、パラメータ省略を考慮する
    243         pobj_parameter->MacroParameterSupport(psi->pRealParmInfo);
     243        pobj_parameter->MacroParameterSupport(psi->realParams);
    244244    }
    245245
     
    248248
    249249    //一時オブジェクトを生成
    250     pobj_parameter->NewTempParameters( psi->name,psi->pRealParmInfo,psi->RealParmNum,psi->RealSecondParmNum );
     250    pobj_parameter->NewTempParameters( psi->name,psi->realParams,psi->RealSecondParmNum );
    251251
    252252    //レジスタ、スタックフレームにセット
    253     pobj_parameter->SetParameter(psi->name,psi->pRealParmInfo,psi->RealParmNum,psi->RealSecondParmNum);
     253    pobj_parameter->SetParameter(psi->name,psi->realParams,psi->RealSecondParmNum);
    254254
    255255    if(psi->ReturnType==DEF_STRUCT && psi->isReturnRef == false){
     
    271271
    272272            //call calloc
    273             extern SUBINFO *pSub_calloc;
     273            extern SubInfo *pSub_calloc;
    274274            op_call(pSub_calloc);
    275275
  • BasicCompiler64/Compile_Func.cpp

    r64 r73  
    9595void Opcode_Func_AddressOf( const char *name ){
    9696    extern int cp;
    97     SUBINFO *psi;
     97    SubInfo *psi;
    9898
    9999    extern LONG_PTR ProcPtr_BaseIndex;
     
    101101        //左辺の型にのっとり、オーバーロードを解決
    102102
    103         std::vector<SUBINFO *> subs;
     103        std::vector<SubInfo *> subs;
    104104        GetOverloadSubHash( name, subs );
    105105        if( subs.size() == 0 ){
  • BasicCompiler64/Compile_Object.cpp

    r64 r73  
    3232    ////////////////////////
    3333
    34     std::vector<SUBINFO *> subs;
     34    std::vector<SubInfo *> subs;
    3535    pobj_c->EnumMethod( pobj_c->name, subs );
    3636
    37     SUBINFO *psi;
     37    SubInfo *psi;
    3838    if( subs.size() > 0 ){
    3939        //オーバーロードを解決
     
    121121
    122122        //call _System_GC_malloc_ForObject
    123         extern SUBINFO *pSub_System_GC_malloc_ForObject;
     123        extern SubInfo *pSub_System_GC_malloc_ForObject;
    124124        op_call(pSub_System_GC_malloc_ForObject);
    125125    }
     
    128128
    129129        //call _System_GC_malloc_ForObjectPtr
    130         extern SUBINFO *pSub_System_GC_malloc_ForObjectPtr;
     130        extern SubInfo *pSub_System_GC_malloc_ForObjectPtr;
    131131        op_call(pSub_System_GC_malloc_ForObjectPtr);
    132132    }
     
    328328    if( isSweeping ){
    329329        //call _System_GC_free_for_SweepingDelete
    330         extern SUBINFO *pSub_System_GC_free_for_SweepingDelete;
     330        extern SubInfo *pSub_System_GC_free_for_SweepingDelete;
    331331        op_call(pSub_System_GC_free_for_SweepingDelete);
    332332    }
    333333    else{
    334334        //call free
    335         extern SUBINFO *pSub_free;
     335        extern SubInfo *pSub_free;
    336336        op_call(pSub_free);
    337337    }
  • BasicCompiler64/Compile_ProcOp.cpp

    r64 r73  
    204204    }
    205205}
    206 void CompileBufferInProcedure(SUBINFO *psi){
     206void CompileBufferInProcedure(SubInfo *psi){
    207207    extern char *basbuf;
    208208    extern HANDLE hHeap;
    209     extern SUBINFO **ppSubHash;
     209    extern SubInfo **ppSubHash;
    210210    extern BOOL bDebugCompile;
    211211    int i3,i4,VarSize,BufferSize;
     
    328328        LocalVar=(VARIABLE *)HeapReAlloc(hHeap,0,LocalVar,(MaxLocalVarNum+1)*sizeof(VARIABLE));
    329329
    330         lstrcpy(LocalVar[MaxLocalVarNum].name,psi->pRealParmInfo[i3].name);
     330        lstrcpy(LocalVar[MaxLocalVarNum].name,psi->realParams[i3].GetVarName.c_str());
    331331
    332332        // TODO: パラメータのConst定義の指定が未完成
    333333        LocalVar[MaxLocalVarNum].bConst=false;
    334334
    335         LocalVar[MaxLocalVarNum].bArray=psi->pRealParmInfo[i3].bArray;
    336         memcpy(LocalVar[MaxLocalVarNum].SubScripts,psi->pRealParmInfo[i3].SubScripts,MAX_ARRAYDIM*sizeof(int));
    337 
    338         LocalVar[MaxLocalVarNum].type=psi->pRealParmInfo[i3].type;
     335        LocalVar[MaxLocalVarNum].bArray=psi->realParams[i3].IsArray()?TRUE:FALSE;
     336        memcpy(LocalVar[MaxLocalVarNum].SubScripts,psi->realParams[i3].GetSubScriptsPtr(),MAX_ARRAYDIM*sizeof(int));
     337
     338        LocalVar[MaxLocalVarNum].type=psi->realParams[i3].GetBasicType();
    339339        if(LocalVar[MaxLocalVarNum].type==DEF_OBJECT
    340340            ||LocalVar[MaxLocalVarNum].type==DEF_STRUCT){
     
    343343        }
    344344
    345         LocalVar[MaxLocalVarNum].u.index=psi->pRealParmInfo[i3].u.index;
    346 
    347         if(psi->pRealParmInfo[i3].bByVal&&psi->pRealParmInfo[i3].type==DEF_STRUCT){
     345        LocalVar[MaxLocalVarNum].u.index=psi->realParams[i3].GetIndex();
     346
     347        if(psi->realParams[i3].IsRef() == false&&psi->realParams[i3].IsStruct()){
    348348            //構造体のByValパラメータ
    349349            LocalVar[MaxLocalVarNum].fRef=REF_PARAMETER | OBJECT_PARAMETER;
     
    351351        }
    352352        else{
    353             if(psi->pRealParmInfo[i3].bByVal&&psi->pRealParmInfo[i3].bArray==0){
     353            if(psi->realParams[i3].IsRef() == false&&psi->realParams[i3].IsArray()){
    354354                LocalVar[MaxLocalVarNum].fRef=0;
    355355                VarSize=GetTypeSize(LocalVar[MaxLocalVarNum].type,LocalVar[MaxLocalVarNum].u.index);
     
    383383
    384384    //コンパイル中の関数
    385     extern SUBINFO *pCompilingSubInfo;
     385    extern SubInfo *pCompilingSubInfo;
    386386    pCompilingSubInfo=psi;
    387387
     
    396396    for(i3=psi->RealParmNum-1;i3>=0;i3--){
    397397        if(i3==3){
    398             if(IsRealNumberType(psi->pRealParmInfo[i3].type)&&psi->pRealParmInfo[i3].bByVal){
     398            if(psi->realParams[i3].IsReal()&&psi->realParams[i3].IsRef() == false){
    399399                //movsd qword ptr[rsp+0x20],xmm3
    400400                op_movsd_MR(REG_XMM3,REG_RSP,0x20,MOD_BASE_DISP32);
     
    406406        }
    407407        if(i3==2){
    408             if(IsRealNumberType(psi->pRealParmInfo[i3].type)&&psi->pRealParmInfo[i3].bByVal){
     408            if(psi->realParams[i3].IsReal()&&psi->realParams[i3].IsRef() == false){
    409409                //movsd qword ptr[rsp+0x18],xmm2
    410410                op_movsd_MR(REG_XMM2,REG_RSP,0x18,MOD_BASE_DISP32);
     
    416416        }
    417417        if(i3==1){
    418             if(IsRealNumberType(psi->pRealParmInfo[i3].type)&&psi->pRealParmInfo[i3].bByVal){
     418            if(psi->realParams[i3].IsReal()&&psi->realParams[i3].IsRef() == false){
    419419                //movsd qword ptr[rsp+0x10],xmm1
    420420                op_movsd_MR(REG_XMM1,REG_RSP,0x10,MOD_BASE_DISP32);
     
    426426        }
    427427        if(i3==0){
    428             if(IsRealNumberType(psi->pRealParmInfo[i3].type)&&psi->pRealParmInfo[i3].bByVal){
     428            if(psi->realParams[i3].IsReal()&&psi->realParams[i3].IsRef() == false){
    429429                //movsd qword ptr[rsp+0x8],xmm0
    430430                op_movsd_MR(REG_XMM0,REG_RSP,0x8,MOD_BASE_DISP32);
     
    497497
    498498        //call _DebugSys_StartProc
    499         extern SUBINFO *pSub_DebugSys_StartProc;
     499        extern SubInfo *pSub_DebugSys_StartProc;
    500500        op_call(pSub_DebugSys_StartProc);
    501501    }
     
    720720    if(bDebugCompile&&bDebugSupportProc==0){
    721721        //call _DebugSys_EndProc
    722         extern SUBINFO *pSub_DebugSys_EndProc;
     722        extern SubInfo *pSub_DebugSys_EndProc;
    723723        op_call(pSub_DebugSys_EndProc);
    724724    }
     
    819819}
    820820void CompileLocal(){
    821     extern SUBINFO **ppSubHash;
     821    extern SubInfo **ppSubHash;
    822822    int i2;
    823     SUBINFO *psi;
     823    SubInfo *psi;
    824824
    825825    extern BOOL bDll;
     
    835835    //_System_InitStaticLocalVariablesは一番最後にコンパイル
    836836    //※一般関数内の静的変数オブジェクトをすべて収集しなければならない
    837     extern SUBINFO *pSub_System_InitStaticLocalVariables;
     837    extern SubInfo *pSub_System_InitStaticLocalVariables;
    838838    pSub_System_InitStaticLocalVariables->bCompile=1;
    839839
    840840    //_System_Call_Destructor_of_GlobalObjectは一番最後にコンパイル
    841     extern SUBINFO *pSub_System_Call_Destructor_of_GlobalObject;
     841    extern SubInfo *pSub_System_Call_Destructor_of_GlobalObject;
    842842    pSub_System_Call_Destructor_of_GlobalObject->bCompile=1;
    843843
  • BasicCompiler64/Compile_Set_Var.cpp

    r66 r73  
    107107
    108108                    //call free
    109                     extern SUBINFO *pSub_free;
     109                    extern SubInfo *pSub_free;
    110110                    op_call(pSub_free);
    111111                }
  • BasicCompiler64/Compile_Statement.cpp

    r64 r73  
    55    int i,i2;
    66    char buffer[8192];
    7     SUBINFO *psi;
     7    SubInfo *psi;
    88
    99    for(i=0;;i++){
     
    4444
    4545        //GetSubHash内でエラー提示が行われた場合
    46         if(psi==(SUBINFO *)-1) return;
     46        if(psi==(SubInfo *)-1) return;
    4747
    4848        if(psi==0){
     
    5454
    5555            //GetSubHash内でエラー提示が行われた場合
    56             if(psi==(SUBINFO *)-1) return;
     56            if(psi==(SubInfo *)-1) return;
    5757        }
    5858
     
    722722                    pobj_c=(CClass *)lpIndex;
    723723
    724                     std::vector<SUBINFO *> subs;
     724                    std::vector<SubInfo *> subs;
    725725                    pobj_c->EnumMethod( CALC_EQUAL, subs );
    726726                    if( subs.size() == 0 ){
     
    739739
    740740                    //オーバーロードを解決
    741                     SUBINFO *psi;
     741                    SubInfo *psi;
    742742                    psi=OverloadSolution("==",subs,ppi,iParmNum,NULL);
    743743                    HeapDefaultFree(ppi);
     
    883883
    884884    //call _System_GetEip
    885     extern SUBINFO *pSub_System_GetEip;
     885    extern SubInfo *pSub_System_GetEip;
    886886    op_call(pSub_System_GetEip);
    887887
     
    945945        //戻り値をセット
    946946        if(Parameter[0]){
    947             extern SUBINFO *pCompilingSubInfo;
     947            extern SubInfo *pCompilingSubInfo;
    948948            char *temp;
    949949            if(pCompilingSubInfo->name[0]==1&&pCompilingSubInfo->name[1]==ESC_OPERATOR)
     
    10751075    OpcodeCalc(temp2);
    10761076
    1077     SUBINFO *psi;
     1077    SubInfo *psi;
    10781078    if(bFile) psi=GetSubHash("INPUT_FromFile");
    10791079    else psi=GetSubHash("INPUT_FromPrompt");
     
    11771177    OpcodeCalc(temp2);
    11781178
    1179     SUBINFO *psi;
     1179    SubInfo *psi;
    11801180    if(bFile) psi=GetSubHash("PRINTUSING_ToFile");
    11811181    else psi=GetSubHash("PRINTUSING_ToPrompt");
     
    12811281    if(sw) lstrcat(buffer,"+Ex\"\\r\\n\"");
    12821282
    1283     SUBINFO *psi;
     1283    SubInfo *psi;
    12841284    if(bFile) psi=GetSubHash("PRINT_ToFile");
    12851285    else psi=GetSubHash("PRINT_ToPrompt");
  • BasicCompiler64/Compile_Var.cpp

    r69 r73  
    562562
    563563    char temporary[VN_SIZE];
    564     extern SUBINFO *pCompilingSubInfo;
     564    extern SubInfo *pCompilingSubInfo;
    565565    if(pCompilingSubInfo){
    566566        GetNowStaticVarFullName(VarName,temporary);
  • BasicCompiler64/MakePeHdr.cpp

    r67 r73  
    66// 特殊関数の構造体ポインタ
    77////////////////////////////
    8 SUBINFO
     8SubInfo
    99    *pSub_System_StartupProgram,
    1010    *pSub_DebugSys_StartProc,
     
    352352
    353353        //call _System_Call_Destructor_of_GlobalObject
    354         extern SUBINFO *pSub_System_Call_Destructor_of_GlobalObject;
     354        extern SubInfo *pSub_System_Call_Destructor_of_GlobalObject;
    355355        op_call(pSub_System_Call_Destructor_of_GlobalObject);
    356356
     
    500500        ExportNamesLength=lstrlen(lpExportNames)+1;
    501501
    502         extern SUBINFO **ppSubHash;
    503         SUBINFO *psi,*psi2;
     502        extern SubInfo **ppSubHash;
     503        SubInfo *psi,*psi2;
    504504        while(1){
    505505            //辞書順にサーチ
  • BasicCompiler64/NumOpe_Arithmetic.cpp

    r64 r73  
    559559
    560560        //call pow
    561         extern SUBINFO *pSub_pow;
     561        extern SubInfo *pSub_pow;
    562562        op_call(pSub_pow);
    563563
  • BasicCompiler64/Opcode.h

    r71 r73  
    350350
    351351private:
    352     BOOL _overload_check(PARAMETER_INFO *ppi,int pi_num,TYPEINFO *pReturnTypeInfo,int overload_level);
    353     SUBINFO *OverloadSolutionWithReturnType( const char *name, std::vector<SUBINFO *> &subs );
     352    BOOL _overload_check( Parameters &params, TYPEINFO *pReturnTypeInfo,int overload_level);
     353    SubInfo *OverloadSolutionWithReturnType( const char *name, std::vector<SubInfo *> &subs );
    354354public:
    355     SUBINFO *OverloadSolution( const char *name, std::vector<SUBINFO *> &subs );
     355    SubInfo *OverloadSolution( const char *name, std::vector<SubInfo *> &subs );
    356356
    357357    BOOL ErrorCheck(const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum);
     
    385385#define PROCFLAG_NEW    1
    386386int Opcode_CallProcPtr(char *variable,char *Parameter,PROCPTRINFO *pi,LONG_PTR *plpIndex);
    387 void Opcode_CallProc(const char *Parameter,SUBINFO *psi,DWORD dwFlags,char *ObjectName,int RefType);
     387void Opcode_CallProc(const char *Parameter,SubInfo *psi,DWORD dwFlags,char *ObjectName,int RefType);
    388388int Opcode_CallDllProc(char *Parameter,DECLAREINFO *pdi,LONG_PTR *plpIndex);
    389389
     
    512512void op_fld_ptr_esp(int type);
    513513void op_zero_reg(int reg);
    514 void op_call( SUBINFO *psi );
     514void op_call( SubInfo *psi );
    515515void op_call( DECLAREINFO *pdi );
  • BasicCompiler64/OperatorProc.cpp

    r64 r73  
    2323
    2424    //call free
    25     extern SUBINFO *pSub_free;
     25    extern SubInfo *pSub_free;
    2626    op_call(pSub_free);
    2727}
     
    3232    pobj_c=(CClass *)index_stack[sp-2];
    3333
    34     std::vector<SUBINFO *> subs;
     34    std::vector<SubInfo *> subs;
    3535    pobj_c->EnumMethod( idCalc, subs );
    3636    if( subs.size() == 0 ){
     
    8484    if(idCalc==CALC_EQUAL) lstrcpy(temporary,"==");
    8585    else GetCalcName(idCalc,temporary);
    86     SUBINFO *psi;
     86    SubInfo *psi;
    8787    psi=OverloadSolution(temporary,subs,ppi,iParmNum,pBaseTypeInfo);
    8888
     
    9494    else{
    9595        //オーバーロードされていないが、パラメータ個数が一致しないとき
    96         if(iParmNum!=psi->ParmNum){
     96        if(iParmNum!=psi->params.size()){
    9797            HeapDefaultFree(ppi);
    9898            return -1;
     
    102102    for(i=0;i<iParmNum;i++){
    103103        CheckDifferentType(
    104             psi->pParmInfo[i].type,
    105             psi->pParmInfo[i].u.index,
     104            psi->params[i]->GetBasicType(),
     105            psi->params[i]->GetIndex(),
    106106            ppi[i].type,
    107107            ppi[i].u.index,
     
    113113
    114114    if(bTwoTerm){
    115         if(psi->pRealParmInfo[1].type==DEF_STRUCT&&psi->pRealParmInfo[1].bByVal){
     115        if( psi->realParams[1]->IsStruct() && psi->realParams[1]->IsRef() == false ){
    116116            //一時オブジェクトはメソッド内で破棄される
    117117            bUseHeap[sp-1]=0;
     
    137137
    138138            //call calloc
    139             extern SUBINFO *pSub_calloc;
     139            extern SubInfo *pSub_calloc;
    140140            op_call(pSub_calloc);
    141141
     
    154154        SetOneTermToReg_Whole64Calc(type[sp-1],&reg2);
    155155        pobj_reg->UnlockReg();
    156         if( !psi->pRealParmInfo[1].bByVal ){
     156        if( !psi->realParams[1]->IsRef() == false ){
    157157            //一時参照を作成
    158158            pobj_sf->push( reg2 );
     
    253253
    254254    if(bTwoTerm){
    255         if( !psi->pRealParmInfo[1].bByVal ){
     255        if( !psi->realParams[1]->IsRef() == false ){
    256256            //一時参照を破棄
    257257            pobj_sf->pop();
     
    341341void CallIndexerGetterProc(int reg,CClass *pobj_Class,char *ObjectName,char *Parameter,TYPEINFO &RetTypeInfo){
    342342
    343     std::vector<SUBINFO *> subs;
     343    std::vector<SubInfo *> subs;
    344344    pobj_Class->EnumMethod( CALC_ARRAY_GET, subs );
    345345    if( subs.size() == 0 ){
  • BasicCompiler64/WatchList.cpp

    r64 r73  
    309309ULONG_PTR Debugging_GetThisPtrOffset(LONG_PTR obp_Rip){
    310310    int i;
    311     SUBINFO *psi;
     311    SubInfo *psi;
    312312
    313313    //ripからプロシージャを取得
  • BasicCompiler64/amd64_main.cpp

    r64 r73  
    17911791/////////////////////////////
    17921792
    1793 void op_call( SUBINFO *psi ){
     1793void op_call( SubInfo *psi ){
    17941794    OpBuffer[obp++] = (char)0xE8;
    17951795    pobj_SubAddrSchedule->add( psi, 1 );
  • BasicCompiler64/varlist.cpp

    r69 r73  
    354354    if(pobj_dti->lplpSpBase[i2]==0) return;
    355355
    356     extern SUBINFO **ppSubHash;
    357     SUBINFO *psi;
     356    extern SubInfo **ppSubHash;
     357    SubInfo *psi;
    358358    for(i3=0,sw=0;i3<MAX_HASH;i3++){
    359359        psi=ppSubHash[i3];
     
    586586
    587587    //プロシージャ コンボボックス
    588     extern SUBINFO **ppSubHash;
    589     SUBINFO *psi;
     588    extern SubInfo **ppSubHash;
     589    SubInfo *psi;
    590590    int sw;
    591591    SendMessage(hProcCombo,CB_RESETCONTENT,0,0);
     
    709709
    710710    if(pobj_dti->lplpSpBase[i2]){
    711         extern SUBINFO **ppSubHash;
    712         SUBINFO *psi;
     711        extern SubInfo **ppSubHash;
     712        SubInfo *psi;
    713713        for(i3=0,sw=0;i3<MAX_HASH;i3++){
    714714            psi=ppSubHash[i3];
  • BasicCompiler_Common/BasicCompiler.h

    r69 r73  
    2424DWORD ImageBase;
    2525INCLUDEFILEINFO IncludeFileInfo;
    26 SUBINFO **ppSubHash;
     26SubInfo **ppSubHash;
    2727int SubNum;
    2828char **ppMacroNames;
  • BasicCompiler_Common/Class.cpp

    r71 r73  
    267267    staticMembers.push_back( member );
    268268}
    269 void CClass::AddMethod( SUBINFO *psi,DWORD dwAccess, bool isConst, BOOL bAbstract, BOOL bVirtual ){
     269void CClass::AddMethod( SubInfo *psi,DWORD dwAccess, bool isConst, BOOL bAbstract, BOOL bVirtual ){
    270270    CMethod *method = new CMethod();
    271271    method->psi = psi;
     
    278278    methods.push_back( method );
    279279}
    280 void CClass::AddStaticMethod(SUBINFO *psi,DWORD dwAccess){
     280void CClass::AddStaticMethod(SubInfo *psi,DWORD dwAccess){
    281281    CMethod *method = new CMethod();
    282282    method->psi=psi;
     
    322322    return 0;
    323323}
    324 CMethod *CClass::GetMethodInfo( SUBINFO *psi ){
     324CMethod *CClass::GetMethodInfo( SubInfo *psi ){
    325325    for( int i=(int)methods.size()-1; i>=0; i-- ){
    326326        if( psi == methods[i]->psi ) return methods[i];
     
    328328    return NULL;
    329329}
    330 CMethod *CClass::GetStaticMethodInfo( SUBINFO *psi ){
     330CMethod *CClass::GetStaticMethodInfo( SubInfo *psi ){
    331331    for( int i=(int)staticMethods.size()-1; i>=0; i-- ){
    332332        if( psi == staticMethods[i]->psi ) return staticMethods[i];
     
    347347}
    348348
    349 void CClass::EnumStaticMethod( const char *methodName, std::vector<SUBINFO *> &subs ) const
     349void CClass::EnumStaticMethod( const char *methodName, std::vector<SubInfo *> &subs ) const
    350350{
    351351    foreach( CMethod *method, staticMethods ){
     
    356356}
    357357
    358 void CClass::EnumMethod( const char *methodName, std::vector<SUBINFO *> &subs ) const
     358void CClass::EnumMethod( const char *methodName, std::vector<SubInfo *> &subs ) const
    359359{
    360360    //オブジェクトのメンバ関数の場合
     
    367367}
    368368
    369 void CClass::EnumMethod( const BYTE idOperatorCalc, std::vector<SUBINFO *> &subs ) const
     369void CClass::EnumMethod( const BYTE idOperatorCalc, std::vector<SubInfo *> &subs ) const
    370370{
    371371    //オブジェクトのメンバ関数の場合
    372372    //※オーバーライドされた関数を先にサーチする必要があるため、バックサーチを行う
    373373    for( int i=(int)methods.size()-1; i>=0; i-- ){
    374         SUBINFO *psi = methods[i]->psi;
     374        SubInfo *psi = methods[i]->psi;
    375375        char *temp = psi->name;
    376376        if(temp[0]==1&&temp[1]==ESC_OPERATOR){
     
    508508
    509509
    510 int CClass::GetFuncNumInVtbl( const SUBINFO *psi ) const
     510int CClass::GetFuncNumInVtbl( const SubInfo *psi ) const
    511511{
    512512    int n = 0;
     
    527527    //////////////////////////////////////
    528528
    529     SUBINFO **ppsi;
    530     ppsi=(SUBINFO **)HeapAlloc(hHeap,0,vtbl_num*sizeof(SUBINFO *));
     529    SubInfo **ppsi;
     530    ppsi=(SubInfo **)HeapAlloc(hHeap,0,vtbl_num*sizeof(SubInfo *));
    531531
    532532    //関数テーブルに値をセット
     
    565565    int i;
    566566    for(i=0;i<vtbl_num;i++){
    567         SUBINFO *psi;
    568         psi=(SUBINFO *)pVtbl[i];
     567        SubInfo *psi;
     568        psi=(SubInfo *)pVtbl[i];
    569569        if(!psi) continue;
    570570        pVtbl[i]=psi->CompileAddress+ImageBase+MemPos_CodeSection;
     
    835835
    836836    //関数ハッシュへ登録
    837     SUBINFO *psi;
     837    SubInfo *psi;
    838838    psi=AddSubData(buffer,NowLine,bVirtual,pobj_c,bStatic);
    839839    if(!psi) return;
     
    849849
    850850        //標準コンストラクタ(引数なし)
    851         if(psi->ParmNum==0) fConstructor=1;
     851        if(psi->params.size()==0) fConstructor=1;
    852852
    853853        //強制的にConst修飾子をつける
     
    894894
    895895        if(lstrcmp(temporary,method->psi->name)==0){
    896             if(CompareParameter(
    897                 method->psi->pParmInfo,method->psi->ParmNum,
    898                 psi->pParmInfo,psi->ParmNum
    899                 )==0){
     896            if( Parameter::Equals( method->psi->params, psi->params ) ){
    900897                //関数名、パラメータ属性が合致したとき
    901898                SetError(15,psi->name,NowLine);
     
    911908    foreach( CMethod *method, pobj_c->methods ){
    912909        if(lstrcmp(temporary,method->psi->name)==0){
    913             if(CompareParameter(
    914                 method->psi->pParmInfo,method->psi->ParmNum,
    915                 psi->pParmInfo,psi->ParmNum
    916                 )==0){
     910            if( Parameter::Equals( method->psi->params, psi->params ) ){
    917911
    918912                if(method->psi->bVirtual){
     
    14441438}
    14451439
    1446 void CDBClass::StartCompile( SUBINFO *psi ){
     1440void CDBClass::StartCompile( SubInfo *psi ){
    14471441    pCompilingClass = psi->pobj_ParentClass;
    14481442    if( pCompilingClass ){
  • BasicCompiler_Common/Class.h

    r71 r73  
    22
    33class CClass;
    4 struct SUBINFO;
     4class SubInfo;
    55
    66//データ型
     
    4848class CMethod{
    4949public:
    50     SUBINFO *psi;
     50    SubInfo *psi;
    5151    DWORD dwAccess;
    5252    BOOL bAbstract;
     
    116116    void AddMember( DWORD dwAccess, bool idConst, bool isRef, char *buffer );
    117117    void AddStaticMember( DWORD dwAccess, bool isConst, bool isRef, char *buffer, int NowLine );
    118     void AddMethod( SUBINFO *psi,DWORD dwAccess, bool isConst, BOOL bAbstract, BOOL bVirtual );
    119     void AddStaticMethod(SUBINFO *psi,DWORD dwAccess);
     118    void AddMethod( SubInfo *psi,DWORD dwAccess, bool isConst, BOOL bAbstract, BOOL bVirtual );
     119    void AddStaticMethod(SubInfo *psi,DWORD dwAccess);
    120120
    121121    //重複チェック
     
    124124
    125125    //メソッド取得
    126     CMethod *GetMethodInfo( SUBINFO *psi );
    127     CMethod *GetStaticMethodInfo( SUBINFO *psi );
     126    CMethod *GetMethodInfo( SubInfo *psi );
     127    CMethod *GetStaticMethodInfo( SubInfo *psi );
    128128
    129129    //メソッドの存在を確認
     
    132132
    133133    //メソッドを列挙
    134     void EnumStaticMethod( const char *methodName, std::vector<SUBINFO *> &subs ) const;
    135     void EnumMethod( const char *methodName, std::vector<SUBINFO *> &subs ) const;
    136     void EnumMethod( const BYTE idOperatorCalc, std::vector<SUBINFO *> &subs ) const;
     134    void EnumStaticMethod( const char *methodName, std::vector<SubInfo *> &subs ) const;
     135    void EnumMethod( const char *methodName, std::vector<SubInfo *> &subs ) const;
     136    void EnumMethod( const BYTE idOperatorCalc, std::vector<SubInfo *> &subs ) const;
    137137
    138138    //デフォルト コンストラクタ メソッドを取得
     
    157157    long vtbl_offset;
    158158public:
    159     int GetFuncNumInVtbl( const SUBINFO *psi ) const;
     159    int GetFuncNumInVtbl( const SubInfo *psi ) const;
    160160    LONG_PTR GetVtblGlobalOffset(void);
    161161    void ActionVtblSchedule(LONG_PTR ImageBase, LONG_PTR MemPos_CodeSection);
     
    245245public:
    246246    //コンパイル開始の通知を受け取るメソッド
    247     void StartCompile( SUBINFO *psi );
     247    void StartCompile( SubInfo *psi );
    248248
    249249    //現在コンパイル中のメソッド情報を取得
  • BasicCompiler_Common/Debug.cpp

    r4 r73  
    224224    SendDlgItemMessage(hMainDlg,IDC_DEBUGLIST,EM_REPLACESEL,0,(LPARAM)buffer);
    225225}
    226 SUBINFO *GetSubFromObp(ULONG_PTR pos){
    227     extern SUBINFO **ppSubHash;
    228     SUBINFO *psi;
     226SubInfo *GetSubFromObp(ULONG_PTR pos){
     227    extern SubInfo **ppSubHash;
     228    SubInfo *psi;
    229229    int i2;
    230230
     
    447447    pobj_dti=new CDebugThreadInfo();
    448448
    449     SUBINFO *psi;
     449    SubInfo *psi;
    450450
    451451    extern DWORD dwStepRun;
     
    681681                        if(!bRet) MessageBox(hMainDlg,"プロセスメモリーの読み込みに失敗","error",MB_OK);
    682682
    683                         extern SUBINFO *pSub_DebugSys_EndProc;
     683                        extern SubInfo *pSub_DebugSys_EndProc;
    684684                        if((BYTE)temporary[0]==0xE8&&
    685685                            *((long *)(temporary+1))+5==(long)rva_to_real(pSub_DebugSys_EndProc->CompileAddress)-(long)EIP_RIP(Context)){
  • BasicCompiler_Common/DebugMiddleFile.cpp

    r64 r73  
    213213
    214214    //プロシージャ情報
    215     extern SUBINFO **ppSubHash;
     215    extern SubInfo **ppSubHash;
    216216    extern int SubNum;
    217     SUBINFO *psi;
     217    SubInfo *psi;
    218218    *(long *)(buffer+i2)=SubNum;
    219219    i2+=sizeof(long);
     
    585585
    586586    //プロシージャ情報
    587     SUBINFO *psi;
     587    SubInfo *psi;
    588588    SubNum=*(long *)(buffer+i2);
    589589    i2+=sizeof(long);
    590     ppSubHash=(SUBINFO **)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,MAX_HASH*sizeof(SUBINFO *));
     590    ppSubHash=(SubInfo **)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,MAX_HASH*sizeof(SubInfo *));
    591591    for(i3=0;i3<SubNum;i3++){
    592         psi=(SUBINFO *)HeapAlloc(hHeap,0,sizeof(SUBINFO));
     592        psi = new SubInfo();
    593593        psi->pNextData=0;
    594594
     
    618618        i2+=sizeof(long);
    619619
    620         psi->ParmNum=0;
    621         psi->pParmInfo=0;
    622         psi->RealParmNum=0;
    623         psi->pRealParmInfo=0;
    624620        psi->bCompile=1;
    625621
     
    677673        i4=hash_default(psi->name);
    678674
    679         SUBINFO *psi2;
     675        SubInfo *psi2;
    680676        if(ppSubHash[i4]){
    681677            psi2=ppSubHash[i4];
     
    804800
    805801
    806     extern SUBINFO **ppSubHash;
     802    extern SubInfo **ppSubHash;
    807803    ppSubHash=this->ppSubHash;
    808804    pSub_DebugSys_EndProc=GetSubHash("_DebugSys_EndProc");
     
    973969    extern char **ppMacroNames;
    974970    ppMacroNames=0;
    975     extern SUBINFO **ppSubHash;
     971    extern SubInfo **ppSubHash;
    976972    extern int SubNum;
    977973    ppSubHash=this->ppSubHash;
    978974    SubNum=this->SubNum;
    979975
    980     extern SUBINFO *pSub_DebugSys_EndProc;
     976    extern SubInfo *pSub_DebugSys_EndProc;
    981977    pSub_DebugSys_EndProc=this->pSub_DebugSys_EndProc;
    982978
     
    998994
    999995    //ローカル変数に関する情報を解放
    1000     SUBINFO *psi;
     996    SubInfo *psi;
    1001997    for(i2=0;i2<MAX_HASH;i2++){
    1002998        psi=ppSubHash[i2];
  • BasicCompiler_Common/DebugSection.h

    r15 r73  
    4949
    5050    //プロシージャ
    51     SUBINFO **ppSubHash;
     51    SubInfo **ppSubHash;
    5252    int SubNum;
    5353
    54     SUBINFO *pSub_DebugSys_EndProc;
     54    SubInfo *pSub_DebugSys_EndProc;
    5555
    5656    //ネイティブコードバッファ
  • BasicCompiler_Common/LexicalScoping.cpp

    r64 r73  
    226226
    227227            //call free
    228             extern SUBINFO *pSub_free;
     228            extern SubInfo *pSub_free;
    229229            op_call(pSub_free);
    230230
  • BasicCompiler_Common/MakeExe.cpp

    r15 r73  
    223223
    224224    //ローカル変数に関する情報を解放
    225     extern SUBINFO **ppSubHash;
    226     SUBINFO *psi;
     225    extern SubInfo **ppSubHash;
     226    SubInfo *psi;
    227227    for(i2=0;i2<MAX_HASH;i2++){
    228228        psi=ppSubHash[i2];
     
    238238
    239239    //サブルーチン(ユーザー定義)情報のメモリ解放
    240     extern SUBINFO **ppSubHash;
     240    extern SubInfo **ppSubHash;
    241241    extern char **ppMacroNames;
    242242    extern int MacroNum;
  • BasicCompiler_Common/NumOpe_GetType.cpp

    r69 r73  
    193193    pobj_c=(CClass *)index_stack[sp-2];
    194194
    195     std::vector<SUBINFO *> subs;
     195    std::vector<SubInfo *> subs;
    196196    pobj_c->EnumMethod( idCalc, subs );
    197197    if( subs.size() == 0 ){
     
    230230    if(idCalc==CALC_EQUAL) lstrcpy(temporary,"==");
    231231    else GetCalcName(idCalc,temporary);
    232     SUBINFO *psi;
     232    SubInfo *psi;
    233233    psi=OverloadSolution(temporary,subs,ppi,iParmNum,pBaseTypeInfo);
    234234
     
    240240    else{
    241241        //オーバーロードされていないが、パラメータ個数が一致しないとき
    242         if(iParmNum!=psi->ParmNum){
     242        if(iParmNum!=psi->params.size()){
    243243            HeapDefaultFree(ppi);
    244244            return 0;
     
    299299}
    300300
    301 int NumOpe_GetType(char *Command,TYPEINFO *pBaseType,LONG_PTR *plpIndex){
     301int NumOpe_GetType_Old( const char *Command,TYPEINFO *pBaseType,LONG_PTR *plpIndex){
    302302    extern int cp;
    303303    int i,i2,i3,i4;
     
    454454
    455455                            //マクロ関数の場合
    456                             i2=NumOpe_GetType(temp3,NULL,&index_stack[sp]);
     456                            i2=NumOpe_GetType_Old(temp3,NULL,&index_stack[sp]);
    457457
    458458                            if(!IS_LITERAL(index_stack[sp])){
     
    740740    return RetType;
    741741}
     742
     743bool NumOpe_GetType( const char *expression, const Type &baseType, Type &resultType ){
     744    TYPEINFO baseTypeInfo = {
     745        baseType.GetBasicType(),
     746        baseType.GetIndex()
     747    };
     748    LONG_PTR lpIndex;
     749    int basicType = NumOpe_GetType_Old( expression,
     750        baseType.IsNull() ? NULL:&baseTypeInfo,
     751        &lpIndex );
     752
     753    resultType.SetBasicType( basicType );
     754    resultType.SetIndex( lpIndex );
     755
     756    return ( basicType != -1 );
     757}
  • BasicCompiler_Common/Object.cpp

    r63 r73  
    1919    pobj_c=(CClass *)TypeInfo.u.lpIndex;
    2020
    21     SUBINFO *psi;
     21    SubInfo *psi;
    2222    psi=GetMethodHash(ObjectName,pobj_c->name,Parameter);
    2323    if(!psi){
  • BasicCompiler_Common/Overload.cpp

    r71 r73  
    77#endif
    88
    9 SUBINFO *OverloadSolutionWithStrParam(
     9SubInfo *OverloadSolutionWithStrParam(
    1010    const char *name,
    11     std::vector<SUBINFO *> &subs,
     11    std::vector<SubInfo *> &subs,
    1212    const char *Parameter,
    1313    const char *ObjectName,
     
    3737*/
    3838        //パラメータオブジェクトを生成
     39        if(lstrcmp(Parameter,"\"test\"")==0){
     40            int i=0;
     41        }
    3942        pobj_parameter=new ParamImpl(Parameter);
    4043        if(pReturnTypeInfo) pobj_parameter->SetReturnType(pReturnTypeInfo);
    4144
    4245
    43         SUBINFO *psi;
     46        SubInfo *psi;
    4447        psi=pobj_parameter->OverloadSolution(name,subs);
    4548
     
    5255}
    5356
    54 SUBINFO *OverloadSolution(
     57SubInfo *OverloadSolution(
    5558    const char *name,
    56     std::vector<SUBINFO *> &subs,
     59    std::vector<SubInfo *> &subs,
    5760    const PARAMETER_INFO *ppi,
    5861    const int ParmNum,
     
    6871        if(pReturnTypeInfo) pobj_Parameter->SetReturnType(pReturnTypeInfo);
    6972
    70         SUBINFO *psi;
     73        SubInfo *psi;
    7174        psi=pobj_Parameter->OverloadSolution(name,subs);
    7275
  • BasicCompiler_Common/PESchedule.cpp

    r44 r73  
    220220
    221221CSubAddrSchedule::CSubAddrSchedule(){
    222     ppsi=(SUBINFO **)HeapAlloc(hHeap,0,1);
     222    ppsi=(SubInfo **)HeapAlloc(hHeap,0,1);
    223223    pbCall=(BOOL *)HeapAlloc(hHeap,0,1);
    224224}
     
    228228}
    229229
    230 void CSubAddrSchedule::add(SUBINFO *psi,BOOL bCall){
     230void CSubAddrSchedule::add(SubInfo *psi,BOOL bCall){
    231231    if(!psi) return;
    232232
    233     ppsi=(SUBINFO **)HeapReAlloc(hHeap,0,ppsi,(num+1)*sizeof(SUBINFO *));
     233    ppsi=(SubInfo **)HeapReAlloc(hHeap,0,ppsi,(num+1)*sizeof(SubInfo *));
    234234    ppsi[num]=psi;
    235235    pbCall=(BOOL *)HeapReAlloc(hHeap,0,pbCall,(num+1)*sizeof(BOOL));
     
    282282CTempSchedule *pobj_TempSchedule;
    283283
     284
  • BasicCompiler_Common/PESchedule.h

    r34 r73  
    7979class CSubAddrSchedule:public CSchedule{
    8080public:
    81     SUBINFO **ppsi;
     81    SubInfo **ppsi;
    8282    BOOL *pbCall;
    8383
     
    8585    ~CSubAddrSchedule();
    8686
    87     void add(SUBINFO *psi,BOOL bCall);
     87    void add(SubInfo *psi,BOOL bCall);
    8888};
    8989extern CSubAddrSchedule *pobj_SubAddrSchedule;
  • BasicCompiler_Common/ParamImpl.cpp

    r71 r73  
    7373    ReturnTypeInfo.u.lpIndex=-1;
    7474}
     75ParamImpl::ParamImpl(const Parameters &params){
     76    int count = 0;
     77    foreach( Parameter *pParam, params ){
     78        types[count].type = pParam->GetBasicType();
     79        types[count].u.lpIndex = pParam->GetIndex();
     80        count++;
     81    }
     82    this->ParmsNum=params.size();
     83
     84    ReturnTypeInfo.type=DEF_NON;
     85    ReturnTypeInfo.u.lpIndex=-1;
     86}
    7587ParamImpl::~ParamImpl(){
    7688    int i2;
     
    88100}
    89101
    90 BOOL ParamImpl::_overload_check(PARAMETER_INFO *ppi,int pi_num,TYPEINFO *pReturnTypeInfo,int overload_level){
     102BOOL ParamImpl::_overload_check( Parameters &params,TYPEINFO *pReturnTypeInfo,int overload_level){
    91103    //パラメータを識別してオーバーロードを解決
    92104
    93105    //パラメータの個数が不一致の場合
    94     if(pi_num!=ParmsNum) return 0;
    95 
    96     int i,type;
    97     LONG_PTR lpIndex;
    98     for(i=0;i<pi_num;i++){
     106    int max = (int)params.size();
     107    if(max!=ParmsNum) return 0;
     108
     109    Type argType;
     110    for(int i=0;i<max;i++){
     111        Parameter &param = *params[i];
     112
    99113        if(Parms[i]){
    100             TYPEINFO BaseType={ppi[i].type,ppi[i].u.index};
    101             type=NumOpe_GetType(Parms[i],
    102                 (overload_level==OVERLOAD_LEVEL0) ? NULL : &BaseType,
    103                 &lpIndex);
     114            Type nullParam( DEF_NON );
     115
     116            NumOpe_GetType(Parms[i],
     117                (overload_level==OVERLOAD_LEVEL0)? nullParam : param,
     118                argType);
    104119        }
    105120        else{
    106             type=types[i].type;
    107             lpIndex=types[i].u.lpIndex;
    108         }
    109 
    110         if(type!=ppi[i].type){
     121            argType.SetType( types[i].type, types[i].u.lpIndex );
     122        }
     123
     124        if(argType.GetBasicType()!=param.GetBasicType()){
    111125            if(overload_level==OVERLOAD_LEVEL1 || overload_level == OVERLOAD_LEVEL0){
    112126                return 0;
     
    114128            else if(overload_level==OVERLOAD_LEVEL2){
    115129                if(!(
    116                     IsWholeNumberType(type)&&IsWholeNumberType(ppi[i].type)||
    117                     IsRealNumberType(type)&&IsRealNumberType(ppi[i].type)
     130                    IsWholeNumberType(argType.GetBasicType())&&IsWholeNumberType(param.GetBasicType())||
     131                    IsRealNumberType(argType.GetBasicType())&&IsRealNumberType(param.GetBasicType())
    118132                    )) return 0;
    119133            }
    120134            else if(overload_level==OVERLOAD_LEVEL3){
    121                 if(type==DEF_OBJECT||ppi[i].type==DEF_OBJECT) return 0;
     135                if(argType.GetBasicType()==DEF_OBJECT||param.GetBasicType()==DEF_OBJECT) return 0;
    122136            }
    123137        }
    124138        else{
    125             if(NATURAL_TYPE(type)==DEF_OBJECT || NATURAL_TYPE(type)==DEF_STRUCT){
    126                 if(lpIndex!=ppi[i].u.index) return 0;
     139            if(NATURAL_TYPE(argType.GetBasicType())==DEF_OBJECT || NATURAL_TYPE(argType.GetBasicType())==DEF_STRUCT){
     140                if(argType.GetIndex()!=param.GetIndex()) return 0;
    127141            }
    128142        }
     
    143157}
    144158
    145 SUBINFO *ParamImpl::OverloadSolutionWithReturnType( const char *name, std::vector<SUBINFO *> &subs ){
     159SubInfo *ParamImpl::OverloadSolutionWithReturnType( const char *name, std::vector<SubInfo *> &subs ){
    146160    int sw=0;
    147     SUBINFO *psi;
     161    SubInfo *psi;
    148162    psi=0;
    149163
    150164    for( int level=OVERLOAD_MIN_LEVEL; level<=OVERLOAD_MAX_LEVEL; level++ ){
    151         foreach( SUBINFO *temp_psi, subs ){
     165        foreach( SubInfo *temp_psi, subs ){
    152166
    153167            TYPEINFO ReturnTypeInfo;
     
    156170
    157171            //エラーチェック
    158             if(_overload_check(temp_psi->pParmInfo,temp_psi->ParmNum,&ReturnTypeInfo,level)){
     172            if(_overload_check(temp_psi->params,&ReturnTypeInfo,level)){
    159173                if(sw){
    160174                    SetError(52,name,cp);
     
    178192    return psi;
    179193}
    180 SUBINFO *ParamImpl::OverloadSolution( const char *name, std::vector<SUBINFO *> &subs ){
     194SubInfo *ParamImpl::OverloadSolution( const char *name, std::vector<SubInfo *> &subs ){
    181195    int sw=0;
    182     SUBINFO *psi;
     196    SubInfo *psi;
    183197    psi=0;
    184198
    185199    for( int level=OVERLOAD_MIN_LEVEL; level<=OVERLOAD_MAX_LEVEL; level++ ){
    186200
    187         foreach( SUBINFO *temp_psi, subs ){
     201        foreach( SubInfo *temp_psi, subs ){
    188202
    189203            //エラーチェック
    190             if(_overload_check(temp_psi->pParmInfo,temp_psi->ParmNum,NULL,level)){
     204            if(_overload_check(temp_psi->params,NULL,level)){
    191205                if(sw){
    192206                    return OverloadSolutionWithReturnType(name,subs);
     
    202216
    203217    if(!sw){
    204         SUBINFO *temp_psi;
     218        SubInfo *temp_psi;
    205219        foreach( temp_psi, subs ){
    206220
    207221            //エラーチェック
    208             if(temp_psi->ParmNum==this->ParmsNum){
     222            if(temp_psi->params.size()==this->ParmsNum){
    209223                if(sw){
    210224                    sw=0;
     
    258272    return 1;
    259273}
     274bool ParamImpl::ErrorCheck( const char *procName, const Parameters &params, int SecondParmNum ){
     275    if(ParmsNum>(int)params.size()){
     276        if(params[params.size()-1]->GetBasicType()!=DEF_ELLIPSE){
     277            //パラメータが多すぎるとき
     278            SetError(10,procName,cp);
     279            return false;
     280        }
     281    }
     282    else if(ParmsNum<(int)params.size()){
     283        if(ParmsNum<SecondParmNum){
     284            if(params[ParmsNum]->GetBasicType()==DEF_ELLIPSE){
     285                return true;
     286            }
     287
     288            //パラメータが少なすぎるとき
     289            SetError(10,procName,cp);
     290            return false;
     291        }
     292
     293        //省略パラメータに "0" を指定する
     294        for(;ParmsNum < (int)params.size();ParmsNum++){
     295            extern HANDLE hHeap;
     296            char temporary[64];
     297            if(params[ParmsNum]->IsRef() == false) lstrcpy(temporary,"0");
     298            else sprintf(temporary,"%c%c0",1,ESC_BYVAL);
     299            Parms[ParmsNum]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
     300            lstrcpy(Parms[ParmsNum],temporary);
     301        }
     302    }
     303
     304    return true;
     305}
    260306
    261307void ParamImpl::MacroParameterSupport(PARAMETER_INFO *ppi){
    262     int i;
    263     for(i=0;i<ParmsNum;i++){
     308    for(int i=0;i<ParmsNum;i++){
    264309        if(Parms[i][0]=='\0'){
    265310            extern HANDLE hHeap;
     
    273318    }
    274319}
     320void ParamImpl::MacroParameterSupport( const Parameters &params ){
     321    for(int i=0;i<ParmsNum;i++){
     322        if(Parms[i][0]=='\0'){
     323            extern HANDLE hHeap;
     324            char temporary[64];
     325            if( params[i]->IsRef() == false ) lstrcpy(temporary,"0");
     326            else sprintf(temporary,"%c%c0",1,ESC_BYVAL);
     327            HeapDefaultFree(Parms[i]);
     328            Parms[i]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
     329            lstrcpy(Parms[i],temporary);
     330        }
     331    }
     332}
  • BasicCompiler_Common/Parameter.h

    r71 r73  
    55
    66class Parameter;
    7 typedef vector<Parameter> Parameters;
     7typedef vector<Parameter *> Parameters;
    88
    99class Parameter : public Type
     
    1616public:
    1717    Parameter( const string &varName, const Type &type, bool isRef = false ):
    18         Type( type )
     18        Type( type ),
     19        varName( varName ),
     20        isRef( isRef ),
     21        isArray( false )
    1922    {
    20         this->varName = varName;
    21         this->isRef = isRef;
    22         isArray = false;
     23        subScripts[0] = -1;
     24    }
     25    Parameter( const Parameter &param ):
     26        Type( param ),
     27        varName( param.varName ),
     28        isRef( param.isRef ),
     29        isArray( false )
     30    {
     31        subScripts[0] = -1;
     32        if( param.isArray ){
     33            SetArray( param.subScripts );
     34        }
    2335    }
    2436    ~Parameter(){}
     
    2739        isArray = true;
    2840        memcpy( this->subScripts, pSubScripts, sizeof(int) * MAX_ARRAYDIM );
     41    }
     42
     43    const string &GetVarName() const
     44    {
     45        return varName;
    2946    }
    3047
     
    4663        else{
    4764
    48             if( this->isRef && this->BasicType() == DEF_ANY &&
     65            if( this->isRef && this->GetBasicType() == DEF_ANY &&
    4966                param.isRef == false && param.IsPointer()
    5067                ||
    5168                this->isRef == false && this->IsPointer() &&
    52                 param.isRef && param.BasicType() == DEF_ANY ){
     69                param.isRef && param.GetBasicType() == DEF_ANY ){
    5370                    /* ByRef var As Any
    5471                            と
     
    7188        int max = (int)paramsA.size();
    7289        for( int i=0; i<max; i++ ){
    73             if( !paramsA[i].Equals( paramsB[i] ) ){
     90            if( !paramsA[i]->Equals( *paramsB[i] ) ){
    7491                return false;
    7592            }
  • BasicCompiler_Common/Subroutine.cpp

    r69 r73  
    88
    99//コンパイル中の関数情報
    10 SUBINFO *pCompilingSubInfo;
     10SubInfo *pCompilingSubInfo;
    1111
    1212int GetCallProcName(char *buffer,char *name){
     
    114114        /////////////////////
    115115
    116         SUBINFO *psi;
    117         psi=(SUBINFO *)pInfo;
     116        SubInfo *pSub;
     117        pSub=(SubInfo *)pInfo;
    118118
    119119        //GetSubHash内でエラー提示が行われた場合
    120         if(psi==(SUBINFO *)-1) return -1;
     120        if(pSub==(SubInfo *)-1) return -1;
    121121
    122122
     
    131131        ////////////////////////
    132132
    133         std::vector<SUBINFO *> subs;
     133        std::vector<SubInfo *> subs;
    134134        GetOverloadSubHash(name,subs);
    135135        if(subs.size()){
    136136            //オーバーロードを解決
    137             psi=OverloadSolutionWithStrParam(name,subs,Parameter,ObjectName,NULL);
    138 
    139             if(!psi) return 0;
    140         }
    141 
    142 
    143         Opcode_CallProc(Parameter,psi,0,ObjectName,RefType);
     137            pSub=OverloadSolutionWithStrParam(name,subs,Parameter,ObjectName,NULL);
     138
     139            if(!pSub) return 0;
     140        }
     141
     142
     143        Opcode_CallProc(Parameter,pSub,0,ObjectName,RefType);
    144144        if( plpRetIndex ){
    145             *plpRetIndex = psi->u.ReturnIndex;
    146         }
    147         return psi->ReturnType;
     145            *plpRetIndex = pSub->u.ReturnIndex;
     146        }
     147        return pSub->ReturnType;
    148148    }
    149149    else if(idProc==PROC_DLL){
     
    197197
    198198    //オーバーロード用の関数リストを作成
    199     std::vector<SUBINFO *> subs;
     199    std::vector<SubInfo *> subs;
    200200    GetOverloadSubHash(VarName,subs);
    201201    if(subs.size()==0){
     
    213213
    214214    //オーバーロードを解決
    215     SUBINFO *psi;
    216     psi=OverloadSolutionWithStrParam(VarName,subs,Parameter,ObjectName,NULL);
    217 
    218     if(psi){
     215    SubInfo *pSub;
     216    pSub=OverloadSolutionWithStrParam(VarName,subs,Parameter,ObjectName,NULL);
     217
     218    if(pSub){
    219219        //呼び出し
    220         Opcode_CallProc(Parameter,psi,0,ObjectName,RefType);
     220        Opcode_CallProc(Parameter,pSub,0,ObjectName,RefType);
    221221
    222222        if( pRetTypeInfo ){
    223             pRetTypeInfo->type = psi->ReturnType;
    224             pRetTypeInfo->u.lpIndex = psi->u.ReturnIndex;
     223            pRetTypeInfo->type = pSub->ReturnType;
     224            pRetTypeInfo->u.lpIndex = pSub->u.ReturnIndex;
    225225        }
    226226    }
     
    240240        /////////////////////
    241241
    242         SUBINFO *psi;
    243         psi=(SUBINFO *)pInfo;
     242        SubInfo *pSub;
     243        pSub=(SubInfo *)pInfo;
    244244
    245245        //GetSubHash内でエラー提示が行われた場合
    246         if(psi==(SUBINFO *)-1) return -1;
     246        if(pSub==(SubInfo *)-1) return -1;
    247247
    248248
     
    257257        ////////////////////////
    258258
    259         std::vector<SUBINFO *> subs;
     259        std::vector<SubInfo *> subs;
    260260        GetOverloadSubHash(name,subs);
    261261        if( subs.size() > 0 ){
    262262            //オーバーロードを解決
    263             psi=OverloadSolutionWithStrParam(name,subs,Parameter,ObjectName,NULL);
    264 
    265             if(!psi) return 0;
    266         }
    267 
    268 
    269         ret_type=psi->ReturnType;
    270         *plpRetIndex=psi->u.ReturnIndex;
     263            pSub=OverloadSolutionWithStrParam(name,subs,Parameter,ObjectName,NULL);
     264
     265            if(!pSub) return 0;
     266        }
     267
     268
     269        ret_type=pSub->ReturnType;
     270        *plpRetIndex=pSub->u.ReturnIndex;
    271271    }
    272272    else if(idProc==PROC_DLL){
     
    318318
    319319    //オーバーロード用の関数リストを作成
    320     std::vector<SUBINFO *> subs;
     320    std::vector<SubInfo *> subs;
    321321    GetOverloadSubHash(VarName,subs);
    322322    if(subs.size()==0){
     
    334334
    335335    //オーバーロードを解決
    336     SUBINFO *psi;
    337     psi=OverloadSolutionWithStrParam(VarName,subs,Parameter,ObjectName,NULL);
    338 
    339     if(psi){
     336    SubInfo *pSub;
     337    pSub=OverloadSolutionWithStrParam(VarName,subs,Parameter,ObjectName,NULL);
     338
     339    if(pSub){
    340340        if(pRetTypeInfo){
    341             pRetTypeInfo->type=psi->ReturnType;
    342             pRetTypeInfo->u.lpIndex=psi->u.ReturnIndex;
     341            pRetTypeInfo->type=pSub->ReturnType;
     342            pRetTypeInfo->u.lpIndex=pSub->u.ReturnIndex;
    343343        }
    344344    }
     
    349349//インデクサ(getter)の戻り値を取得
    350350bool GetReturnTypeOfIndexerGetterProc(CClass *pobj_Class,TYPEINFO &RetTypeInfo){
    351     std::vector<SUBINFO *> subs;
     351    std::vector<SubInfo *> subs;
    352352    pobj_Class->EnumMethod( CALC_ARRAY_GET, subs );
    353353    if( subs.size() == 0 ){
     
    644644    return 0;
    645645}
    646 SUBINFO *AddSubData(char *buffer,int NowLine,BOOL bVirtual,CClass *pobj_c,BOOL bStatic){
     646SubInfo *AddSubData(char *buffer,int NowLine,BOOL bVirtual,CClass *pobj_c,BOOL bStatic){
    647647    int i,i2,i3,sw;
    648648    DWORD dwType;
     
    761761    SubNum++;
    762762
    763     SUBINFO *psi;
    764     psi=(SUBINFO *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,sizeof(SUBINFO));
     763    SubInfo *pSub = new SubInfo();
    765764
    766765    //クラス名
    767     psi->pobj_ParentClass=pobj_c;
     766    pSub->pobj_ParentClass=pobj_c;
    768767
    769768    //ID
    770769    static int id_base=0;
    771     psi->id=(id_base++);
     770    pSub->id=(id_base++);
    772771
    773772    //関数名
    774     psi->name=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
    775     lstrcpy(psi->name,temporary);
     773    pSub->name=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
     774    lstrcpy(pSub->name,temporary);
    776775
    777776    //ソースコードの位置
    778     psi->address=NowLine;
    779 
    780     psi->bExport=bExport;
    781     psi->bCdecl=bCdecl;
    782     psi->bVirtual=bVirtual;
    783     if(bExport) psi->bUse=1;
    784     else psi->bUse=0;
    785     psi->bCompile=0;
    786     psi->bSystem=0;
    787 
    788     psi->dwType=dwType;
    789 
    790 
    791     if(psi->dwType==SUBTYPE_FUNCTION){
     777    pSub->address=NowLine;
     778
     779    pSub->bExport=bExport;
     780    pSub->bCdecl=bCdecl;
     781    pSub->bVirtual=bVirtual;
     782    if(bExport) pSub->bUse=1;
     783    else pSub->bUse=0;
     784    pSub->bCompile=0;
     785    pSub->bSystem=0;
     786
     787    pSub->dwType=dwType;
     788
     789
     790    if(pSub->dwType==SUBTYPE_FUNCTION){
    792791        ///////////////////
    793792        // 戻り値を取得
    794793        ///////////////////
    795794
    796         psi->isReturnRef = false;
     795        pSub->isReturnRef = false;
    797796
    798797        if(pobj_c){
    799             if(lstrcmp(psi->name,pobj_c->name)==0||
    800                 psi->name[0]=='~'){
     798            if(lstrcmp(pSub->name,pobj_c->name)==0||
     799                pSub->name[0]=='~'){
    801800                //クラスのコンストラクタ、デストラクタがFunction定義の場合はエラーをだす
    802801                SetError(115,NULL,NowLine);
     
    814813                if( buffer[i2-2] == 1 && buffer[i2-1] == ESC_BYREF ){
    815814                    //参照型
    816                     psi->isReturnRef = true;
     815                    pSub->isReturnRef = true;
    817816                }
    818817
     
    827826                    temporary[i3]=buffer[i2];
    828827                }
    829                 psi->ReturnType=GetTypeFixed(temporary,&psi->u.ReturnIndex);
    830                 if(psi->ReturnType==DEF_NON) SetError(3,temporary,NowLine);
     828                pSub->ReturnType=GetTypeFixed(temporary,&pSub->u.ReturnIndex);
     829                if(pSub->ReturnType==DEF_NON) SetError(3,temporary,NowLine);
    831830
    832831                sw_as=1;
     
    836835
    837836        if(!sw_as){
    838             SetError(-104,psi->name,NowLine);
    839 
    840             psi->ReturnType=DEF_DOUBLE;
     837            SetError(-104,pSub->name,NowLine);
     838
     839            pSub->ReturnType=DEF_DOUBLE;
    841840        }
    842841    }
    843842    else{
    844843        //戻り値なしのSub定義
    845         psi->ReturnType=DEF_NON;
    846         psi->u.ReturnIndex=-1;
    847     }
    848 
    849 
    850 
    851     psi->pParmInfo=(PARAMETER_INFO *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,sizeof(PARAMETER_INFO)*2);
    852     psi->ParmNum=0;
     844        pSub->ReturnType=DEF_NON;
     845        pSub->u.ReturnIndex=-1;
     846    }
    853847
    854848    //パラメータ
     
    860854    if(buffer[i]!=')'&&pobj_c){
    861855        //クラスのメンバ関数の場合のみ、デストラクタにパラメータがある場合にエラーをだす
    862         if(psi->name[0]=='~'){
     856        if(pSub->name[0]=='~'){
    863857            SetError(114,NULL,NowLine);
    864858            i=JumpStringInPare(buffer,i);
     
    868862        if(buffer[i]==')') break;
    869863
    870         psi->pParmInfo=(PARAMETER_INFO *)HeapReAlloc(hHeap,0,psi->pParmInfo,(psi->ParmNum+1)*sizeof(PARAMETER_INFO));
    871 
    872         //ByVal
     864        //ByRef
     865        bool isRef;
    873866        if(buffer[i]==1&&buffer[i+1]==ESC_BYVAL){
    874             psi->pParmInfo[psi->ParmNum].bByVal=1;
     867            isRef = false;
    875868            i+=2;
    876869        }
    877870        else if(buffer[i]==1&&buffer[i+1]==ESC_BYREF){
    878             psi->pParmInfo[psi->ParmNum].bByVal=0;
     871            isRef = true;
    879872            i+=2;
    880873        }
    881         else psi->pParmInfo[psi->ParmNum].bByVal=1;
     874        else isRef = false;
    882875
    883876        //パラメータ名
     877        bool isArray = false;
     878        int subScripts[MAX_ARRAYDIM];
     879        char name[VN_SIZE];
    884880        sw=0;
    885881        for(i2=0;;i++,i2++){
     
    887883                if(!sw) sw=1;
    888884
    889                 i3=GetStringInPare(temporary+i2,buffer+i);
     885                i3=GetStringInPare(name+i2,buffer+i);
    890886                i2+=i3-1;
    891887                i+=i3-1;
     
    895891                if(!sw) sw=1;
    896892
    897                 i3=GetStringInBracket(temporary+i2,buffer+i);
     893                i3=GetStringInBracket(name+i2,buffer+i);
    898894                i2+=i3-1;
    899895                i+=i3-1;
     
    901897            }
    902898            if(!IsVariableChar(buffer[i])){
    903                 temporary[i2]=0;
     899                name[i2]=0;
    904900                break;
    905901            }
    906             temporary[i2]=buffer[i];
     902            name[i2]=buffer[i];
    907903        }
    908904        if(sw){
    909905            //配列パラメータ
    910             if(psi->pParmInfo[psi->ParmNum].bByVal) SetError(29,NULL,NowLine);
    911             psi->pParmInfo[psi->ParmNum].bArray=1;
    912 
    913             if((temporary[i2-2]=='('&&temporary[i2-1]==')')||
    914                 (temporary[i2-2]=='['&&temporary[i2-1]==']')){
    915                 psi->pParmInfo[psi->ParmNum].SubScripts[0]=LONG_MAX;
    916                 psi->pParmInfo[psi->ParmNum].SubScripts[1]=-1;
    917 
    918                 temporary[i2-2]=0;
     906            if( isRef == false ) SetError(29,NULL,NowLine);
     907            isArray = true;
     908
     909            if((name[i2-2]=='('&&name[i2-1]==')')||
     910                (name[i2-2]=='['&&name[i2-1]==']')){
     911                subScripts[0]=LONG_MAX;
     912                subScripts[1]=-1;
     913
     914                name[i2-2]=0;
    919915            }
    920916            else{
    921                 GetArrange(temporary,temp2,psi->pParmInfo[psi->ParmNum].SubScripts);
    922                 lstrcpy(temporary,temp2);
    923             }
    924 
    925             i2=lstrlen(temporary);
    926         }
    927         else{
    928             psi->pParmInfo[psi->ParmNum].bArray=0;
    929             psi->pParmInfo[psi->ParmNum].SubScripts[0]=-1;
    930         }
    931         psi->pParmInfo[psi->ParmNum].name=(char *)HeapAlloc(hHeap,0,i2+1);
    932         lstrcpy(psi->pParmInfo[psi->ParmNum].name,temporary);
     917                GetArrange(name,temp2,subScripts);
     918                lstrcpy(name,temp2);
     919            }
     920
     921            i2=lstrlen(name);
     922        }
    933923
    934924        //型
     925        Type type( DEF_NON );
    935926        if(buffer[i]==1&&buffer[i+1]==ESC_AS){
    936927            i+=2;
     
    955946            }
    956947
    957             psi->pParmInfo[psi->ParmNum].type=
    958                 GetTypeFixed(temporary,&psi->pParmInfo[psi->ParmNum].u.index);
     948            Type::StringToType( temporary, type );
    959949
    960950            if(temporary[0]=='*'&&
     
    963953                if(buffer[i]!='('){
    964954                    SetError(10,temporary,NowLine);
    965                     return 0;
     955                    break;
    966956                }
    967957                i3=GetStringInPare(temporary+i2,buffer+i);
     
    986976            }
    987977
    988             if(psi->pParmInfo[psi->ParmNum].type==-1){
     978            if( type.IsNull() ){
    989979                SetError(3,temporary,NowLine);
    990                 psi->pParmInfo[psi->ParmNum].type=DEF_PTR_VOID;
    991             }
    992 
    993             /*未完成(構造体パラメータを値参照として渡してよいものか!?)
    994             if(psi->pParmInfo[psi->ParmNum].type==DEF_OBJECT){
    995                 if(psi->pParmInfo[psi->ParmNum].bByVal) SetError(28,temporary,NowLine);
    996             }*/
     980                type.SetBasicType( DEF_PTR_VOID );
     981            }
    997982        }
    998983        else{
    999             psi->pParmInfo[psi->ParmNum].type=GetTypeFromSimpleName(temporary);
     984            type.SetBasicType( GetTypeFromSimpleName(temporary) );
    1000985            SetError(-103,temporary,NowLine);
    1001986        }
    1002987
    1003         if(psi->pParmInfo[psi->ParmNum].type==DEF_PTR_PROC){
     988        if( type.IsProcPtr() ){
    1004989            //関数ポインタの場合
    1005             psi->pParmInfo[psi->ParmNum].u.index=AddProcPtrInfo(temporary+3,temporary[2]);
    1006         }
    1007 
    1008         //パラメータの数を更新
    1009         psi->ParmNum++;
     990            type.SetIndex( AddProcPtrInfo(temporary+3,temporary[2]) );
     991        }
     992
     993        Parameter *pParam = new Parameter( name, type, isRef );
     994        if( isArray ){
     995            pParam->SetArray( subScripts );
     996        }
     997
     998        //パラメータを追加
     999        pSub->params.push_back( pParam );
    10101000
    10111001        if(buffer[i]==','){
     
    10161006        else{
    10171007            SetError(1,NULL,NowLine);
    1018             return 0;
    1019         }
    1020     }
    1021     psi->SecondParmNum=psi->ParmNum;
     1008            break;
     1009        }
     1010    }
     1011    pSub->SecondParmNum = (int)pSub->params.size();
    10221012    i++;
    10231013    if(buffer[i]=='('){
     
    10261016            if(buffer[i]==')') break;
    10271017
    1028             psi->pParmInfo=(PARAMETER_INFO *)HeapReAlloc(hHeap,0,psi->pParmInfo,(psi->ParmNum+1)*sizeof(PARAMETER_INFO));
    1029 
    1030             //ByVal
     1018            //ByRef
     1019            bool isRef;
    10311020            if(buffer[i]==1&&buffer[i+1]==ESC_BYVAL){
    1032                 psi->pParmInfo[psi->ParmNum].bByVal=1;
     1021                isRef = false;
    10331022                i+=2;
    10341023            }
    10351024            else if(buffer[i]==1&&buffer[i+1]==ESC_BYREF){
    1036                 psi->pParmInfo[psi->ParmNum].bByVal=0;
     1025                isRef = true;
    10371026                i+=2;
    10381027            }
    1039             else psi->pParmInfo[psi->ParmNum].bByVal=1;
     1028            else isRef = false;
    10401029
    10411030            //パラメータ名
     1031            bool isArray = false;
     1032            int subScripts[MAX_ARRAYDIM];
     1033            char name[VN_SIZE];
    10421034            sw=0;
    10431035            for(i2=0;;i++,i2++){
     
    10451037                    if(!sw) sw=1;
    10461038
    1047                     i3=GetStringInPare(temporary+i2,buffer+i);
     1039                    i3=GetStringInPare(name+i2,buffer+i);
    10481040                    i2+=i3-1;
    10491041                    i+=i3-1;
     
    10531045                    if(!sw) sw=1;
    10541046
    1055                     i3=GetStringInBracket(temporary+i2,buffer+i);
     1047                    i3=GetStringInBracket(name+i2,buffer+i);
    10561048                    i2+=i3-1;
    10571049                    i+=i3-1;
     
    10591051                }
    10601052                if(!IsVariableChar(buffer[i])){
    1061                     temporary[i2]=0;
     1053                    name[i2]=0;
    10621054                    break;
    10631055                }
    1064                 temporary[i2]=buffer[i];
     1056                name[i2]=buffer[i];
    10651057            }
    10661058            if(sw){
    10671059                //配列パラメータ
    1068                 if(psi->pParmInfo[psi->ParmNum].bByVal) SetError(29,NULL,NowLine);
    1069                 psi->pParmInfo[psi->ParmNum].bArray=1;
    1070 
    1071                 if((temporary[i2-2]=='('&&temporary[i2-1]==')')||
    1072                     (temporary[i2-2]=='['&&temporary[i2-1]==']')){
    1073                     psi->pParmInfo[psi->ParmNum].SubScripts[0]=LONG_MAX;
    1074                     psi->pParmInfo[psi->ParmNum].SubScripts[1]=-1;
    1075 
    1076                     temporary[i2-2]=0;
     1060                if( isRef == false ) SetError(29,NULL,NowLine);
     1061                isArray = true;
     1062
     1063                if((name[i2-2]=='('&&name[i2-1]==')')||
     1064                    (name[i2-2]=='['&&name[i2-1]==']')){
     1065                    subScripts[0]=LONG_MAX;
     1066                    subScripts[1]=-1;
     1067
     1068                    name[i2-2]=0;
    10771069                }
    10781070                else{
    1079                     GetArrange(temporary,temp2,psi->pParmInfo[psi->ParmNum].SubScripts);
    1080                     lstrcpy(temporary,temp2);
    1081                 }
    1082 
    1083                 i2=lstrlen(temporary);
    1084             }
    1085             else{
    1086                 psi->pParmInfo[psi->ParmNum].bArray=0;
    1087                 psi->pParmInfo[psi->ParmNum].SubScripts[0]=-1;
    1088             }
    1089             psi->pParmInfo[psi->ParmNum].name=(char *)HeapAlloc(hHeap,0,i2+1);
    1090             lstrcpy(psi->pParmInfo[psi->ParmNum].name,temporary);
     1071                    GetArrange(name,temp2,subScripts);
     1072                    lstrcpy(name,temp2);
     1073                }
     1074
     1075                i2=lstrlen(name);
     1076            }
    10911077
    10921078            //型
     1079            Type type( DEF_NON );
    10931080            if(buffer[i]==1&&buffer[i+1]==ESC_AS){
    10941081                i+=2;
     1082
    10951083                i2=0;
    10961084                while(buffer[i]=='*'){
     
    11011089                for(;;i++,i2++){
    11021090                    if(!IsVariableChar(buffer[i])){
     1091                        if(buffer[i]==1&&(buffer[i+1]==ESC_FUNCTION||buffer[i+1]==ESC_SUB)){
     1092                            temporary[i2++]=buffer[i++];
     1093                            temporary[i2]=buffer[i];
     1094                            continue;
     1095                        }
    11031096                        temporary[i2]=0;
    11041097                        break;
     
    11061099                    temporary[i2]=buffer[i];
    11071100                }
    1108                 psi->pParmInfo[psi->ParmNum].type=
    1109                     GetTypeFixed(temporary,&psi->pParmInfo[psi->ParmNum].u.index);
    1110                 if(psi->pParmInfo[psi->ParmNum].type==-1) SetError(3,temporary,NowLine);
     1101
     1102                Type::StringToType( temporary, type );
     1103
     1104                if(temporary[0]=='*'&&
     1105                    temporary[1]==1&&
     1106                    (temporary[2]==ESC_FUNCTION||temporary[2]==ESC_SUB)){
     1107                    if(buffer[i]!='('){
     1108                        SetError(10,temporary,NowLine);
     1109                        break;
     1110                    }
     1111                    i3=GetStringInPare(temporary+i2,buffer+i);
     1112                    i+=i3;
     1113                    i2+=i3;
     1114
     1115                    if(temporary[2]==ESC_FUNCTION&&buffer[i]==1&&buffer[i+1]==ESC_AS){
     1116                        temporary[i2++]=buffer[i++];
     1117                        temporary[i2++]=buffer[i++];
     1118                        for(;;i++,i2++){
     1119                            if(!IsVariableChar(buffer[i])){
     1120                                temporary[i2]=0;
     1121                                break;
     1122                            }
     1123                            temporary[i2]=buffer[i];
     1124                        }
     1125                    }
     1126                }
     1127                else{
     1128                    //TypeDefをする前のベース型を取得
     1129                    GetOriginalTypeName(temporary);
     1130                }
     1131
     1132                if( type.IsNull() ){
     1133                    SetError(3,temporary,NowLine);
     1134                    type.SetBasicType( DEF_PTR_VOID );
     1135                }
    11111136            }
    11121137            else{
    1113                 psi->pParmInfo[psi->ParmNum].type=GetTypeFromSimpleName(temporary);
     1138                type.SetBasicType( GetTypeFromSimpleName(temporary) );
    11141139                SetError(-103,temporary,NowLine);
    11151140            }
    11161141
    1117             psi->ParmNum++;
     1142            if( type.IsProcPtr() ){
     1143                //関数ポインタの場合
     1144                type.SetIndex( AddProcPtrInfo(temporary+3,temporary[2]) );
     1145            }
     1146
     1147            Parameter *pParam = new Parameter( name, type, isRef );
     1148            if( isArray ){
     1149                pParam->SetArray( subScripts );
     1150            }
     1151
     1152            //パラメータを追加
     1153            pSub->params.push_back( pParam );
    11181154
    11191155            if(buffer[i]==','){
     
    11241160            else{
    11251161                SetError(1,NULL,NowLine);
    1126                 return 0;
     1162                break;
    11271163            }
    11281164        }
     
    11301166    }
    11311167
    1132     //リアルパラメータ領域を取得(_System_LocalThisを考慮して2つだけ多く確保する)
    1133     psi->pRealParmInfo=(PARAMETER_INFO *)HeapAlloc(hHeap,0,(psi->ParmNum+2)*sizeof(PARAMETER_INFO));
    1134     psi->RealParmNum=0;
     1168    //リアルパラメータ領域を取得(_System_LocalThisを考慮して2つだけ多く確保する場合がある)
    11351169
    11361170    if(pobj_c&&bStatic==0){
    1137         i = psi->RealParmNum;
    1138 
    11391171        //オブジェクトメンバの場合は、第一パラメータを_System_LocalThis引き渡し用として利用
    1140         psi->pRealParmInfo[i].name = "_System_LocalThis";
    1141         psi->pRealParmInfo[i].type=DEF_PTR_VOID;
    1142         psi->pRealParmInfo[i].u.index=-1;
    1143         psi->pRealParmInfo[i].bByVal=1;
    1144         psi->pRealParmInfo[i].bArray=0;
    1145         psi->pRealParmInfo[i].SubScripts[0]=-1;
    1146 
    1147         psi->RealParmNum++;
    1148     }
    1149 
    1150     if(psi->ReturnType==DEF_STRUCT){
    1151         i = psi->RealParmNum;
    1152 
     1172        string name = "_System_LocalThis";
     1173        Type type( DEF_PTR_VOID );
     1174        pSub->realParams.push_back( new Parameter( name, type ) );
     1175    }
     1176
     1177    if(pSub->ReturnType==DEF_STRUCT){
    11531178        //構造体を戻り値として持つ場合
    11541179        //※第一パラメータ(Thisポインタありの場合は第二パラメータ)を戻り値用の参照宣言にする
    11551180
    1156         if(psi->name[0]==1&&psi->name[1]==ESC_OPERATOR)
    1157             psi->pRealParmInfo[i].name="_System_ReturnValue";
    1158         else psi->pRealParmInfo[i].name=psi->name;
    1159         psi->pRealParmInfo[i].type=DEF_STRUCT;
    1160         psi->pRealParmInfo[i].u.index=psi->u.ReturnIndex;
    1161         psi->pRealParmInfo[i].bByVal=0;
    1162         psi->pRealParmInfo[i].bArray=0;
    1163         psi->pRealParmInfo[i].SubScripts[0]=-1;
    1164        
    1165         psi->RealParmNum++;
     1181        string name = pSub->name;
     1182        if(pSub->name[0]==1&&pSub->name[1]==ESC_OPERATOR){
     1183            name="_System_ReturnValue";
     1184        }
     1185        Type type( DEF_STRUCT, pSub->u.ReturnIndex );
     1186        pSub->realParams.push_back( new Parameter( name, type, true ) );
    11661187    }
    11671188
    11681189    //パラメータをコピー
    1169     for( i = 0; i < psi->ParmNum; i++, psi->RealParmNum++ ){
    1170         psi->pRealParmInfo[psi->RealParmNum]=psi->pParmInfo[i];
     1190    foreach( Parameter *pParam, pSub->params ){
     1191        pSub->realParams.push_back( new Parameter( *pParam ) );
    11711192    }
    11721193
     
    11771198
    11781199    int key;
    1179     key=hash_default(psi->name);
    1180 
    1181     extern SUBINFO **ppSubHash;
     1200    key=hash_default(pSub->name);
     1201
     1202    extern SubInfo **ppSubHash;
    11821203    if(ppSubHash[key]){
    1183         SUBINFO *psi2;
     1204        SubInfo *psi2;
    11841205        psi2=ppSubHash[key];
    11851206        while(1){
    11861207            if(pobj_c==psi2->pobj_ParentClass){
    11871208                //重複エラーチェックを行う
    1188                 if(lstrcmp(psi2->name,psi->name)==0){
    1189                     if(CompareParameter(psi2->pParmInfo,psi2->ParmNum,psi->pParmInfo,psi->ParmNum)==0){
    1190                         SetError(15,psi->name,NowLine);
     1209                if(lstrcmp(psi2->name,pSub->name)==0){
     1210                    if( Parameter::Equals( psi2->params, pSub->params ) ){
     1211                        SetError(15,pSub->name,NowLine);
    11911212                        return 0;
    11921213                    }
     
    11971218            psi2=psi2->pNextData;
    11981219        }
    1199         psi2->pNextData=psi;
     1220        psi2->pNextData=pSub;
    12001221    }
    12011222    else{
    1202         ppSubHash[key]=psi;
    1203     }
    1204 
    1205     return psi;
     1223        ppSubHash[key]=pSub;
     1224    }
     1225
     1226    return pSub;
    12061227}
    12071228
     
    12171238
    12181239    //サブルーチン(ユーザー定義)情報を初期化
    1219     extern SUBINFO **ppSubHash;
     1240    extern SubInfo **ppSubHash;
    12201241    extern int SubNum;
    1221     ppSubHash=(SUBINFO **)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,MAX_HASH*sizeof(SUBINFO *));
     1242    ppSubHash=(SubInfo **)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,MAX_HASH*sizeof(SubInfo *));
    12221243    SubNum=0;
    12231244
     
    13131334    AddSubData(temporary,0,0,0);
    13141335}
    1315 void Delete_si(SUBINFO *psi){
    1316     int i2;
    1317 
    1318     for(i2=0;i2<psi->ParmNum;i2++){
    1319         HeapDefaultFree(psi->pParmInfo[i2].name);
    1320     }
    1321     HeapDefaultFree(psi->pRealParmInfo);
    1322     if(psi->pParmInfo) HeapDefaultFree(psi->pParmInfo);
    1323     psi->pRealParmInfo=0;
    1324     psi->pParmInfo=0;
    1325 
    1326     if(psi->pNextData) Delete_si(psi->pNextData);
    1327 
    1328     HeapDefaultFree(psi->name);
    1329     HeapDefaultFree(psi);
    1330 }
    1331 void DeleteSubInfo(SUBINFO **ppSubHash,char **ppMacroNames,int MacroNum){   //サブルーチン情報のメモリ解放
     1336void Delete_si(SubInfo *pSub){
     1337    foreach( Parameter *pParam, pSub->params ){
     1338        delete pParam;
     1339    }
     1340
     1341    foreach( Parameter *pParam, pSub->realParams ){
     1342        delete pParam;
     1343    }
     1344
     1345    if(pSub->pNextData) Delete_si(pSub->pNextData);
     1346
     1347    HeapDefaultFree(pSub->name);
     1348    delete pSub;
     1349}
     1350void DeleteSubInfo(SubInfo **ppSubHash,char **ppMacroNames,int MacroNum){   //サブルーチン情報のメモリ解放
    13321351    int i;
    13331352    for(i=0;i<MAX_HASH;i++){
  • BasicCompiler_Common/Type.cpp

    r71 r73  
    108108    return false;
    109109}
     110
     111
     112bool Type::Equals( const Type &type ) const
     113{
     114    if( basicType == type.basicType ){
     115        if( NATURAL_TYPE( basicType ) == DEF_OBJECT
     116            || NATURAL_TYPE( basicType ) == DEF_STRUCT ){
     117
     118                if( index == type.index ){
     119                    return true;
     120                }
     121
     122        }
     123        else{
     124            return true;
     125        }
     126    }
     127    return false;
     128}
     129
     130bool Type::IsNull() const{
     131  if( basicType == DEF_NON ){
     132      return true;
     133  }
     134  return false;
     135}
     136bool Type::IsPointer() const
     137{
     138    if(PTR_LEVEL( basicType )|| basicType == DEF_PTR_VOID || basicType == DEF_PTR_PROC
     139        || ( basicType & FLAG_PTR ) ){
     140            return true;
     141    }
     142
     143    return false;
     144}
     145bool Type::IsSigned() const
     146{
     147    switch( basicType ){
     148        case DEF_SBYTE:
     149        case DEF_INTEGER:
     150        case DEF_LONG:
     151        case DEF_INT64:
     152        case DEF_SINGLE:
     153        case DEF_DOUBLE:
     154            return true;
     155        default:
     156            break;
     157    }
     158    return false;
     159}
     160bool Type::IsNaturalWhole() const
     161{
     162    switch( basicType ){
     163        case DEF_SBYTE:
     164        case DEF_BYTE:
     165        case DEF_INTEGER:
     166        case DEF_WORD:
     167        case DEF_LONG:
     168        case DEF_DWORD:
     169        case DEF_INT64:
     170        case DEF_QWORD:
     171            return true;
     172        default:
     173            break;
     174    }
     175    return false;
     176}
     177bool Type::IsWhole() const
     178{
     179    return (
     180        IsNaturalWhole()
     181        || IsPtrType( basicType )
     182        || basicType == DEF_BOOLEAN
     183        );
     184}
     185bool Type::IsReal() const
     186{
     187    switch( basicType ){
     188        case DEF_SINGLE:
     189        case DEF_DOUBLE:
     190            return true;
     191        default:
     192            break;
     193    }
     194    return false;
     195}
     196bool Type::Is64() const
     197{
     198    switch( basicType ){
     199        case DEF_QWORD:
     200        case DEF_INT64:
     201            return true;
     202        default:
     203            break;
     204    }
     205    return false;
     206}
     207bool Type::IsProcPtr() const
     208{
     209    if( basicType == DEF_PTR_PROC ){
     210        return true;
     211    }
     212    return false;
     213}
     214bool Type::IsStruct() const
     215{
     216    if( basicType == DEF_STRUCT ){
     217        return true;
     218    }
     219    return false;
     220}
  • BasicCompiler_Common/Type.h

    r71 r73  
    44
    55class Type{
     6    static const int basicTypeList[];
     7    static const string basicTypeNameList[];
     8
     9
    610    int basicType;
    711    union{
     
    1014    };
    1115
    12     static const int basicTypeList[];
    13     static const string basicTypeNameList[];
    14 
    1516public:
    1617
     18    static bool StringToBasicType( const string &typeName, int &basicType );
     19    static bool StringToType( const string &typeName, Type &type );
     20
     21    Type():
     22      basicType( DEF_NON ),
     23      index( -1 ){}
    1724    Type( int basicType ):
    1825      basicType( basicType ),
     
    3138      index( type.index ){}
    3239
    33     int BasicType() const
     40    int GetBasicType() const
    3441    {
     42#ifdef _DEBUG
     43        if( basicType<-10000 ){
     44            DebugBreak();
     45        }
     46#endif
    3547        return basicType;
    3648    }
     
    4456    }
    4557
     58    void SetBasicType( int basicType ){
     59        this->basicType = basicType;
     60    }
     61    void SetIndex( LONG_PTR index ){
     62        this->index = index;
     63    }
     64    void SetNull(){
     65        SetBasicType( DEF_NON );
     66    }
     67    void SetType( int basicType, LONG_PTR index ){
     68        SetBasicType( basicType );
     69        SetIndex( index );
     70    }
     71    void SetType( int basicType, CClass *pClass ){
     72        SetBasicType( basicType );
     73        this->pClass = pClass;
     74    }
     75
    4676    void PtrLevelUp(){
    4777        PTR_LEVEL_UP( basicType );
    4878    }
    4979
    50     bool Equals( const Type &type ) const
    51     {
    52         if( basicType == type.basicType ){
    53             if( NATURAL_TYPE( basicType ) == DEF_OBJECT
    54                 || NATURAL_TYPE( basicType ) == DEF_STRUCT ){
     80    bool Equals( const Type &type ) const;
    5581
    56                     if( index == type.index ){
    57                         return true;
    58                     }
     82    bool IsNull() const;
     83    bool IsPointer() const;
     84    bool IsSigned() const;
     85    bool IsNaturalWhole() const;
     86    bool IsWhole() const;
     87    bool IsReal() const;
     88    bool Is64() const;
     89    bool IsProcPtr() const;
     90    bool IsStruct() const;
    5991
    60             }
    61             else{
    62                 return true;
    63             }
    64         }
    65         return false;
    66     }
    67 
    68     bool IsPointer() const
    69     {
    70         if(PTR_LEVEL( basicType )|| basicType == DEF_PTR_VOID || basicType == DEF_PTR_PROC
    71             || ( basicType & FLAG_PTR ) ){
    72                 return true;
    73         }
    74 
    75         return false;
    76     }
    77 
    78 
    79 
    80     static bool StringToBasicType( const string &typeName, int &basicType );
    81     static bool StringToType( const string &typeName, Type &type );
    8292};
    8393
  • BasicCompiler_Common/Variable.cpp

    r68 r73  
    819819
    820820    char temporary[VN_SIZE];
    821     extern SUBINFO *pCompilingSubInfo;
     821    extern SubInfo *pCompilingSubInfo;
    822822    if(pCompilingSubInfo){
    823823        GetNowStaticVarFullName(VarName,temporary);
     
    11001100            //初期値の型を判別して自動的に型情報を付加する
    11011101            TYPEINFO BaseType = GetStringTypeInfo();
    1102             int result = NumOpe_GetType( InitBuf, &BaseType, &pTypeInfo->u.lpIndex );
     1102            int result = NumOpe_GetType_Old( InitBuf, &BaseType, &pTypeInfo->u.lpIndex );
    11031103
    11041104            //エラーの場合
     
    11301130
    11311131BOOL GetNowStaticVarFullName(char *VarName,char *FullName){
    1132     extern SUBINFO *pCompilingSubInfo;
     1132    extern SubInfo *pCompilingSubInfo;
    11331133    if(!pCompilingSubInfo) return 0;
    11341134
  • BasicCompiler_Common/calculation.cpp

    r69 r73  
    11951195    return 0;
    11961196}
    1197 BOOL IsStringSubsituation(CClass *pobj_c){
    1198     //String受け入れ可能な "=" 演算子をオーバーロードしているかどうかを調べる
    1199     BOOL bRet=0;
    1200 
    1201     std::vector<SUBINFO *> subs;
    1202     pobj_c->EnumMethod( CALC_SUBSITUATION, subs );
    1203     if( subs.size() == 0 ){
    1204         bRet=0;
    1205         goto finish;
    1206     }
    1207 
    1208     foreach( SUBINFO *psi, subs ){
    1209         if(psi->ParmNum==2){
    1210             TYPEINFO TypeInfo={psi->pParmInfo[1].type,psi->pParmInfo[1].u.index};
    1211             if(IsStringObjectType( TypeInfo )){
    1212                 bRet=1;
    1213                 goto finish;
    1214             }
    1215         }
    1216     }
    1217 
    1218 finish:
    1219     return bRet;
    1220 }
    12211197int IsStrCalculation(char *Command){
    12221198    int i,i2,i3,i4,type,PareNum;
     
    12821258
    12831259                    //ユーザー定義関数
    1284                     SUBINFO *psi;
     1260                    SubInfo *psi;
    12851261                    psi=GetSubHash(temporary);
    12861262                    if(psi){
  • BasicCompiler_Common/common.h

    r71 r73  
    155155#include "Parameter.h"
    156156
     157// プロシージャ管理用のクラス
     158#include "Procedure.h"
     159
    157160
    158161
     
    229232};
    230233
    231 #define SUBTYPE_SUB         1
    232 #define SUBTYPE_FUNCTION    2
    233 #define SUBTYPE_MACRO       3
    234 struct SUBINFO{
    235     DWORD dwType;
    236 
    237     //クラス情報
    238     CClass *pobj_ParentClass;
    239 
    240     long id;
    241 
    242     char *name;
    243     long address;
    244 
    245     //パラメータ
    246     PARAMETER_INFO *pParmInfo;
    247     int ParmNum;
    248     int SecondParmNum;
    249     PARAMETER_INFO *pRealParmInfo;
    250     int RealParmNum;
    251     int RealSecondParmNum;
    252 
    253     /*
    254     //パラメータ
    255     Parameters params;
    256     int SecondParmNum;
    257     Parameters realParams;
    258     int RealSecondParmNum;*/
    259 
    260     //戻り値
    261     int ReturnType;
    262     union{
    263         LONG_PTR ReturnIndex;
    264         CClass *Return_pobj_c;
    265     }u;
    266     bool isReturnRef;
    267 
    268     DWORD CompileAddress;
    269     DWORD EndOpAddr;
    270     VARIABLE *pVar;
    271     int VarNum;
    272 
    273     BOOL bExport;
    274     BOOL bCdecl;
    275     BOOL bVirtual;
    276     BOOL bUse;
    277     BOOL bCompile;
    278     BOOL bSystem;
    279 
    280     SUBINFO *pNextData;
    281 };
    282234#define DECLARE_DYNAMIC 1
    283235#define DECLARE_STATIC  2
     
    435387CONSTINFO *GetConstHash(char *name);
    436388DECLAREINFO *GetDeclareHash(char *name);
    437 SUBINFO *GetSubHash(const char *name,BOOL bError=0);
    438 SUBINFO *GetMethodHash(char *ObjectName,char *MethodName,char *Parameter,BOOL bError=0);
    439 void GetOverloadSubHash( const char *lpszName, std::vector<SUBINFO *> &subs );
     389SubInfo *GetSubHash(const char *name,BOOL bError=0);
     390SubInfo *GetMethodHash(char *ObjectName,char *MethodName,char *Parameter,BOOL bError=0);
     391void GetOverloadSubHash( const char *lpszName, std::vector<SubInfo *> &subs );
    440392
    441393//Object.cpp
     
    444396
    445397//Overload.sbp
    446 SUBINFO *OverloadSolutionWithStrParam(
     398SubInfo *OverloadSolutionWithStrParam(
    447399    const char *name,
    448     std::vector<SUBINFO *> &subs,
     400    std::vector<SubInfo *> &subs,
    449401    const char *Parameter,
    450402    const char *ObjectName,
    451403    TYPEINFO *pReturnTypeInfo);
    452 SUBINFO *OverloadSolution(
     404SubInfo *OverloadSolution(
    453405    const char *name,
    454     std::vector<SUBINFO *> &subs,
     406    std::vector<SubInfo *> &subs,
    455407    const PARAMETER_INFO *ppi,
    456408    const int ParmNum,
     
    464416void Debugger_Pause(void);
    465417ULONG_PTR rva_to_real(DWORD p);
    466 SUBINFO *GetSubFromObp(ULONG_PTR pos);
     418SubInfo *GetSubFromObp(ULONG_PTR pos);
    467419void ReadOpBuffer();
    468420void DebugProgram(void);
     
    561513DWORD GetConstValue(char *name,double *dbl,char *buffer,LONG_PTR *plpIndex);
    562514bool IsStringObjectType(const TYPEINFO &TypeInfo);
    563 BOOL IsStringSubsituation(CClass *pobj_c);
    564515int IsStrCalculation(char *Command);
    565516BYTE GetCalcId(const char *Command,int *pi);
     
    567518                       char *values[255],long calc[255],long stack[255]);
    568519
    569 //NumOpe_GetType.cpp
     520//NumOpe_GetType_Old.cpp
    570521int AutoBigCast(int BaseType,int CalcType);
    571522BOOL CheckCalcType(int idCalc,int *type,int sp);
    572 int NumOpe_GetType(char *Command,TYPEINFO *pBaseType,LONG_PTR *plpIndex);
     523int NumOpe_GetType_Old( const char *Command, TYPEINFO *pBaseTypeInfo, LONG_PTR *plpIndex );
     524bool NumOpe_GetType( const char *expression, const Type &baseType, Type &resultType );
    573525
    574526//Subroutine.cpp
     
    583535bool GetReturnTypeOfIndexerGetterProc(CClass *pobj_Class,TYPEINFO &RetTypeInfo);
    584536BOOL CompareParameter(PARAMETER_INFO *ppi1,int pi_num1,PARAMETER_INFO *ppi2,int pi_num2);
    585 SUBINFO *AddSubData(char *buffer,int NowLine,BOOL bVirtual,CClass *pobj_c,BOOL bStatic=0);
     537SubInfo *AddSubData(char *buffer,int NowLine,BOOL bVirtual,CClass *pobj_c,BOOL bStatic=0);
    586538void GetSubInfo(void);
    587 void DeleteSubInfo(SUBINFO **ppSubHash,char **ppMacroNames,int MacroNum);
     539void DeleteSubInfo(SubInfo **ppSubHash,char **ppMacroNames,int MacroNum);
    588540void DeleteDeclareInfo(void);
    589541int AddProcPtrInfo(char *buffer,DWORD dwProcType);
  • BasicCompiler_Common/hash.cpp

    r51 r73  
    5353}
    5454
    55 void GetOverloadSubHash( const char *lpszName, std::vector<SUBINFO *> &subs ){
    56     extern SUBINFO *pSubInfo;
    57     extern int SubInfoNum;
    58     extern int cp;
    59 
     55void GetOverloadSubHash( const char *lpszName, std::vector<SubInfo *> &subs ){
    6056    char name[VN_SIZE];
    6157
     
    127123
    128124        //格納位置を取得
    129         extern SUBINFO **ppSubHash;
    130         SUBINFO *psi;
     125        extern SubInfo **ppSubHash;
     126        SubInfo *psi;
    131127        psi=ppSubHash[key];
    132128        while(psi){
     
    144140
    145141//オーバーロードされていない関数を取得(昔のコンパイラソースコードとの互換性保持)
    146 SUBINFO *GetSubHash(const char *lpszName,BOOL bError){
    147     std::vector<SUBINFO *> subs;
     142SubInfo *GetSubHash(const char *lpszName,BOOL bError){
     143    std::vector<SubInfo *> subs;
    148144    GetOverloadSubHash(lpszName,subs);
    149145
     
    158154    }
    159155
    160     SUBINFO *psi;
     156    SubInfo *psi;
    161157    psi = subs[0];
    162158
    163159    return psi;
    164160}
    165 SUBINFO *GetMethodHash(char *ObjectName,char *MethodName,char *Parameter,BOOL bError){
     161SubInfo *GetMethodHash(char *ObjectName,char *MethodName,char *Parameter,BOOL bError){
    166162    char temporary[VN_SIZE];
    167163    sprintf(temporary,"%s.%s",ObjectName,MethodName);
    168164
    169     std::vector<SUBINFO *> subs;
    170     SUBINFO *psi;
     165    std::vector<SubInfo *> subs;
     166    SubInfo *psi;
    171167    GetOverloadSubHash(temporary,subs);
    172168
  • ProjectEditor/DocumentAdvice.cpp

    r24 r73  
    129129
    130130    for(i=0;;i++){
    131         if(memcmp(buffer+i,"#include",8)==0&&(!IsVariableChar(buffer[i+8]))){
     131        if( ( memcmp(buffer+i,"#include",8)==0 || memcmp(buffer+i,"#require",8)==0 )&&(!IsVariableChar(buffer[i+8]))){
    132132            i2=i+8;
    133133            while(buffer[i2]==' '||buffer[i2]=='\t') i2++;
Note: See TracChangeset for help on using the changeset viewer.