Changeset 75 in dev for BasicCompiler64


Ignore:
Timestamp:
Mar 20, 2007, 4:36:16 AM (18 years ago)
Author:
dai_9181
Message:

TYPEINFO→Typeへのリファクタリングを実施。64bitはほぼ完了。32bitが全般的に未完成。

Location:
BasicCompiler64
Files:
19 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler64/BasicCompiler.vcproj

    r71 r75  
    2222            UseOfMFC="0"
    2323            ATLMinimizesCRunTimeLibraryUsage="false"
    24             CharacterSet="0"
     24            CharacterSet="2"
    2525            >
    2626            <Tool
     
    5252                MinimalRebuild="true"
    5353                BasicRuntimeChecks="0"
    54                 RuntimeLibrary="3"
     54                RuntimeLibrary="1"
    5555                UsePrecompiledHeader="0"
    5656                PrecompiledHeaderFile=".\Debug/BasicCompiler.pch"
     
    125125            UseOfMFC="0"
    126126            ATLMinimizesCRunTimeLibraryUsage="false"
    127             CharacterSet="0"
     127            CharacterSet="2"
    128128            >
    129129            <Tool
     
    322322            UseOfMFC="0"
    323323            ATLMinimizesCRunTimeLibraryUsage="false"
    324             CharacterSet="0"
     324            CharacterSet="2"
    325325            >
    326326            <Tool
     
    473473                >
    474474                <File
     475                    RelativePath="..\BasicCompiler_Common\Parameter.h"
     476                    >
     477                </File>
     478                <File
     479                    RelativePath="..\BasicCompiler_Common\Procedure.h"
     480                    >
     481                </File>
     482                <File
    475483                    RelativePath="..\BasicCompiler_Common\Type.h"
     484                    >
     485                </File>
     486                <File
     487                    RelativePath="..\BasicCompiler_Common\Variable.h"
    476488                    >
    477489                </File>
     
    15221534                    >
    15231535                    <File
    1524                         RelativePath="..\BasicCompiler_Common\Variable.cpp"
    1525                         >
    1526                     </File>
    1527                     <File
    1528                         RelativePath="..\BasicCompiler_Common\Variable.h"
     1536                        RelativePath="..\BasicCompiler_Common\VariableOpe.cpp"
     1537                        >
     1538                    </File>
     1539                    <File
     1540                        RelativePath="..\BasicCompiler_Common\VariableOpe.h"
    15291541                        >
    15301542                    </File>
     
    15451557                    Name="Procedure"
    15461558                    >
    1547                     <File
    1548                         RelativePath="..\BasicCompiler_Common\Parameter.h"
    1549                         >
    1550                     </File>
    15511559                    <File
    15521560                        RelativePath="..\BasicCompiler_Common\ParamImpl.cpp"
     
    15631571                >
    15641572                <File
     1573                    RelativePath="..\BasicCompiler_Common\Procedure.cpp"
     1574                    >
     1575                </File>
     1576                <File
    15651577                    RelativePath="..\BasicCompiler_Common\Type.cpp"
     1578                    >
     1579                </File>
     1580                <File
     1581                    RelativePath="..\BasicCompiler_Common\Variable.cpp"
    15661582                    >
    15671583                </File>
  • BasicCompiler64/CParameter.cpp

    r73 r75  
    22#include "opcode.h"
    33
    4 int ParamImpl::NewTempParameters( const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum ){
     4int ParamImpl::NewTempParameters( const string &procName, const Parameters &params, int SecondParmNum ){
     5    if( SecondParmNum == -1 ) SecondParmNum = (int)params.size();
     6
    57    ///////////////////////////////////////////////////////
    68    // 一時オブジェクトをあらかじめスタックに積んでおく
     
    1214
    1315    BOOL bEllipse;
    14     if(pi_num){
    15         if(ppi[pi_num-1].type==DEF_ELLIPSE) bEllipse=1;
     16    if(params.size()){
     17        if(params[params.size()-1]->GetBasicType()==DEF_ELLIPSE) bEllipse=1;
    1618        else bEllipse=0;
    1719    }
     
    2123        useTempParameters[i2] = false;
    2224
    23         if(bEllipse&&i2<=pi_num-2) bEllipse=0;
    24 
    25         if(i2==0&&ppi[i2].name){
    26             if(lstrcmp(ppi[i2].name,"_System_LocalThis")==0){
     25        if(bEllipse&&i2<=(int)params.size()-2) bEllipse=0;
     26
     27        if(i2==0){
     28            if( params[i2]->GetVarName() == "_System_LocalThis" ){
    2729                //オブジェクトメンバの第一パラメータのThisポインタ
    2830                continue;
    2931            }
    3032        }
    31         if((i2==0||i2==1)&&ppi[i2].name){
    32             if(lstrcmp(ppi[i2].name,FuncName)==0){
     33        if( i2==0||i2==1 ){
     34            if( params[i2]->GetVarName() == procName ){
    3335                //オブジェクトメンバの第一または第二パラメータの戻り値用オブジェクト
    3436                continue;
     
    3638        }
    3739
    38         TYPEINFO DummyTypeInfo;
     40        Type dummyType;
    3941        BOOL bByVal;
    4042        if(bEllipse){
    41             DummyTypeInfo.type=NumOpe_GetType(Parms[i2],NULL,&DummyTypeInfo.u.lpIndex);
     43            NumOpe_GetType( Parms[i2], Type(), dummyType );
    4244            bByVal=1;
    4345        }
    4446        else{
    45             DummyTypeInfo.type=ppi[i2].type;
    46             DummyTypeInfo.u.lpIndex=ppi[i2].u.index;
    47             bByVal=ppi[i2].bByVal;
     47            dummyType = *params[i2];
     48            bByVal = ( params[i2]->IsRef() == false ) ? TRUE:FALSE;
    4849        }
    4950
     
    5657            }
    5758
    58             LONG_PTR lpVarIndex;
    59             if( GetVarType( Parms[i2], &lpVarIndex, FALSE ) == -1 ){
     59            if( !GetVarType( Parms[i2], Type(), FALSE ) ){
    6060                //変数ではないとき
    6161                int reg = REG_RAX;
    62                 int type = NumOpe( &reg, Parms[i2], DummyTypeInfo.type, DummyTypeInfo.u.lpIndex, &lpVarIndex );
    63 
    64                 if( type != DEF_STRUCT ){
     62                Type calcType;
     63                NumOpe( &reg, Parms[i2], dummyType, calcType );
     64
     65                if( !calcType.IsStruct() ){
    6566                    //一時参照を作成
    6667                    pobj_sf->push( reg );
     
    7677
    7778                bool result = CheckDifferentType(
    78                     DummyTypeInfo.type,
    79                     DummyTypeInfo.u.lpIndex,
    80                     type,
    81                     lpVarIndex,
    82                     FuncName,
     79                    dummyType,
     80                    calcType,
     81                    procName.c_str(),
    8382                    i2);
    8483
     
    8786                    useTempObject = true;
    8887
    89                     types[i2].type = type;
    90                     types[i2].u.lpIndex = lpVarIndex;
     88                    types[i2] = calcType;
    9189                }
    9290            }
     
    104102    for(int i2=ParmsNum-1;i2>=0;i2--){
    105103        if( useTempParameters[i2] ){
    106             if( types[i2].type == DEF_STRUCT ){
     104            if( types[i2].IsStruct() ){
    107105                // 構造体の一時メモリ
    108106
     
    112110
    113111                //call free
    114                 extern SubInfo *pSub_free;
     112                extern UserProc *pSub_free;
    115113                op_call(pSub_free);
    116114            }
     
    123121}
    124122
    125 void ParamImpl::SetStructParameter(int reg,CClass *pobj_Class,LPSTR Parameter){
     123void ParamImpl::SetStructParameter( int reg, const Type &baseType, const char *expression ){
    126124    //////////////////////////////////////////////////////
    127125    /////    レジスタ資源のバックアップ
     
    129127    //////////////////////////////////////////////////////
    130128
    131         int object_size = pobj_Class->GetSize();
     129        int object_size = baseType.GetClass().GetSize();
    132130
    133131        //mov rcx,object_size
     
    135133
    136134        //call calloc
    137         extern SubInfo *pSub_calloc;
     135        extern UserProc *pSub_calloc;
    138136        op_call(pSub_calloc);
    139137
     
    144142        pobj_sf->push(REG_R11);
    145143
    146         TYPEINFO BaseType={DEF_STRUCT,(LONG_PTR)pobj_Class};
    147         TYPEINFO CalcType;
    148         CalcType.type=NumOpe_GetType(Parameter,&BaseType,&CalcType.u.lpIndex);
    149 
    150         /*
    151         TODO: 消す
    152         if( pobj_Class->GetCopyConstructorMethod()
    153             && CalcType.type==DEF_OBJECT&&CalcType.u.pobj_Class==pobj_Class){
    154             ////////////////////////////////////
    155             // コピーコンストラクタを呼び出す
    156             ////////////////////////////////////
    157 
    158             BOOL bUseHeap;
    159             int temp_reg=REG_RDX;
    160             CalcType.type=NumOpe(&temp_reg,Parameter,DEF_OBJECT,(LONG_PTR)pobj_Class,&CalcType.u.lpIndex,&bUseHeap);
    161 
    162             if(bUseHeap){
    163                 //mov r14,rdx
    164                 op_mov_RR(REG_R14,REG_RDX);
    165             }
    166 
    167             //mov r11,qword ptr[rsp+offset]     ※スタックフレームを利用
    168             pobj_sf->ref(REG_R11);
    169 
    170             //mov rcx,this
    171             op_mov_RR(REG_RCX,REG_R11);
    172 
    173             //call constructor
    174             op_call(pobj_Class->GetCopyConstructorMethod()->psi);
    175 
    176 
    177             if(bUseHeap){
    178                 FreeTempObject(REG_R14,pobj_Class);
    179             }
    180         }
    181         else{
    182             if( pobj_Class->GetConstructorMethod() ){
    183                 ////////////////////////////////
    184                 // コンストラクタを呼び出す
    185                 ////////////////////////////////
    186 
    187                 //mov rcx,this
    188                 op_mov_RR(REG_RCX,REG_R11);
    189 
    190                 //call constructor
    191                 op_call(pobj_Class->GetConstructorMethod()->psi);
    192             }
    193             */
    194 
    195 
    196             BOOL bUseHeap;
    197             int temp_reg=REG_RAX;
    198             CalcType.type=NumOpe(&temp_reg,Parameter,DEF_STRUCT,(LONG_PTR)pobj_Class,&CalcType.u.lpIndex,&bUseHeap);
    199 
    200 
    201             //mov r11,qword ptr[rsp+offset]     ※スタックフレームを利用
    202             pobj_sf->ref(REG_R11);
    203 
    204 
    205             RELATIVE_VAR RelativeVar;
    206             RelativeVar.bOffsetOffset=0;
    207             RelativeVar.offset=0;
    208             RelativeVar.dwKind=VAR_DIRECTMEM;
    209 
    210             SetStructVariableFromRax((LONG_PTR)pobj_Class,CalcType.type,CalcType.u.lpIndex,&RelativeVar,bUseHeap);
    211 
    212         //}
     144
     145        Type calcType;
     146        BOOL bUseHeap;
     147        int temp_reg=REG_RAX;
     148        NumOpe( &temp_reg,
     149            expression,
     150            baseType,
     151            calcType,
     152            &bUseHeap );
     153
     154
     155        //mov r11,qword ptr[rsp+offset]     ※スタックフレームを利用
     156        pobj_sf->ref(REG_R11);
     157
     158
     159        RELATIVE_VAR RelativeVar;
     160        RelativeVar.bOffsetOffset=0;
     161        RelativeVar.offset=0;
     162        RelativeVar.dwKind=VAR_DIRECTMEM;
     163
     164        SetStructVariableFromRax(
     165            baseType,
     166            calcType,
     167            &RelativeVar,bUseHeap);
     168
    213169
    214170        //mov r11,qword ptr[rsp+offset]     ※スタックフレームを利用
     
    225181
    226182
    227 void ParamImpl::SetParameter(const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum){
     183void ParamImpl::SetParameter( const string &procName, const Parameters &params, int SecondParmNum ){
     184    if( SecondParmNum == -1 ) SecondParmNum = (int)params.size();
     185
    228186    ///////////////////////////////////////////////////////////
    229187    // パラメータをレジスタ及びスタックフレームにセット
     
    232190
    233191    BOOL bEllipse;
    234     if(pi_num){
    235         if(ppi[pi_num-1].type==DEF_ELLIPSE) bEllipse=1;
     192    if( params.size() ){
     193        if(params[params.size()-1]->GetBasicType()==DEF_ELLIPSE) bEllipse=1;
    236194        else bEllipse=0;
    237195    }
     
    240198    BOOL bHas_System_LocalThis=0;
    241199    if(ParmsNum>=1){
    242         if(lstrcmp(ppi[0].name,"_System_LocalThis")==0)
     200        if( params[0]->GetVarName() == "_System_LocalThis" ){
    243201            bHas_System_LocalThis=1;
     202        }
    244203    }
    245204
    246205    //戻り値用の変数名を取得
    247     const char *lpszVarNameToReturn = (FuncName[0]==1&&FuncName[1]==ESC_OPERATOR)?"_System_ReturnValue":FuncName;
     206    const char *lpszVarNameToReturn = (procName[0]==1&&procName[1]==ESC_OPERATOR)?"_System_ReturnValue":procName.c_str();
    248207
    249208    //パラメータをレジスタとスタックに格納
    250     int CalcType;
    251     LONG_PTR lpCalcIndex;
    252     BOOL bCalcUseHeap;
    253209    int ParmSize=0;
    254210    int reg,temp_reg;
    255211    RELATIVE_VAR RelativeVar;
    256212    for(i2=ParmsNum-1;i2>=0;i2--){
    257         if(bEllipse&&i2<=pi_num-2) bEllipse=0;
    258 
    259         if(i2==0&&ppi[i2].name){
    260             if(lstrcmp(ppi[i2].name,"_System_LocalThis")==0){
     213        if(bEllipse&&i2<=(int)params.size()-2) bEllipse=0;
     214
     215        if(i2==0){
     216            if( params[i2]->GetVarName() == "_System_LocalThis" ){
    261217                //オブジェクトメンバの第一パラメータのThisポインタ
    262218                continue;
    263219            }
    264220        }
    265         if((i2==0||i2==1)&&ppi[i2].name){
    266             if(lstrcmp(ppi[i2].name,lpszVarNameToReturn)==0){
     221        if(i2==0||i2==1){
     222            if( params[i2]->GetVarName() == lpszVarNameToReturn ){
    267223                //オブジェクトメンバの第一または第二パラメータの戻り値用オブジェクト
    268224                continue;
     
    270226        }
    271227
    272         TYPEINFO DummyTypeInfo;
     228        Type dummyType;
    273229        BOOL bByVal;
    274230        if(bEllipse){
    275             DummyTypeInfo.type=NumOpe_GetType(Parms[i2],NULL,&DummyTypeInfo.u.lpIndex);
     231            NumOpe_GetType( Parms[i2], Type(), dummyType );
    276232            bByVal=1;
    277233        }
    278234        else{
    279             DummyTypeInfo.type=ppi[i2].type;
    280             DummyTypeInfo.u.lpIndex=ppi[i2].u.index;
    281             bByVal=ppi[i2].bByVal;
     235            dummyType = *params[i2];
     236            bByVal = ( params[i2]->IsRef() == false ) ? TRUE:FALSE;
    282237        }
    283238
    284239        int xmm_temp_sw=0;
    285         if(IsRealNumberType(DummyTypeInfo.type)&&bByVal){
     240        if(dummyType.IsReal()&&bByVal){
    286241            //実数型
    287242            if(i2==0) reg=REG_XMM0;
     
    308263            if(Parms[i2][0]==1&&Parms[i2][1]==ESC_BYVAL){
    309264                char temp2[255];
    310                 sprintf(temp2,"%s関数の第%dパラメータ",FuncName,i2+1);
     265                sprintf(temp2,"%s関数の第%dパラメータ",procName,i2+1);
    311266                SetError(19,temp2,cp);
    312267                continue;
    313268            }
    314269
    315             if(DummyTypeInfo.type==DEF_STRUCT){
    316                 SetStructParameter(reg,DummyTypeInfo.u.pobj_Class,Parms[i2]);
     270            if( dummyType.IsStruct() ){
     271                SetStructParameter( reg, dummyType, Parms[i2] );
    317272                goto next;
    318273            }
     
    321276
    322277            extern LONG_PTR ProcPtr_BaseIndex;
    323             LONG_PTR back_ProcPtr_BaseIndex;
    324             back_ProcPtr_BaseIndex=ProcPtr_BaseIndex;
    325             if(DummyTypeInfo.type==DEF_PTR_PROC) ProcPtr_BaseIndex=DummyTypeInfo.u.lpIndex;
    326             else ProcPtr_BaseIndex=-1;
    327 
    328             CalcType=NumOpe(&temp_reg,Parms[i2],DummyTypeInfo.type,DummyTypeInfo.u.lpIndex,&lpCalcIndex,&bCalcUseHeap);
     278            LONG_PTR back_ProcPtr_BaseIndex = ProcPtr_BaseIndex;
     279            if( dummyType.IsProcPtr() ){
     280                ProcPtr_BaseIndex = dummyType.GetIndex();
     281            }
     282            else{
     283                ProcPtr_BaseIndex=-1;
     284            }
     285
     286            BOOL bCalcUseHeap;
     287            Type calcType;
     288            if( !NumOpe( &temp_reg, Parms[i2], dummyType, calcType, &bCalcUseHeap ) ){
     289                break;
     290            }
    329291
    330292            ProcPtr_BaseIndex=back_ProcPtr_BaseIndex;
    331293
    332             if(CalcType==-1) break;
    333 
    334             if(CalcType==DEF_OBJECT){
    335                 if( DummyTypeInfo.type != DEF_OBJECT
     294            if( calcType.IsObject() ){
     295                if( !dummyType.IsObject()
    336296                    ||
    337                     DummyTypeInfo.type == DEF_OBJECT &&
    338                     !DummyTypeInfo.u.pobj_Class->IsEqualsOrSubClass( (CClass *)lpCalcIndex ) ){
     297                    dummyType.IsObject() &&
     298                    !dummyType.GetClass().IsEqualsOrSubClass( &calcType.GetClass() ) ){
    339299                        //キャスト演算子のオーバーロードに対応する
    340                         CallCastOperatorProc(reg,CalcType,lpCalcIndex,bCalcUseHeap,DummyTypeInfo.type,DummyTypeInfo.u.lpIndex);
     300                        CallCastOperatorProc( reg, calcType, bCalcUseHeap,dummyType );
    341301                }
    342302            }
     
    344304
    345305            if(bEllipse){
    346                 if(IsRealNumberType(CalcType)){
     306                if( calcType.IsReal() ){
    347307                    //整数レジスタへコピー
    348308                    //※cdeclの拡張パラメータは実数の場合も汎用レジスタで引渡し
     
    358318                    }
    359319                }
    360                 else if(IsWholeNumberType(CalcType)){
     320                else if( calcType.IsWhole() ){
    361321                    //整数型の場合は、64ビットへ拡張する
    362                     ExtendTypeTo64(CalcType,temp_reg);
     322                    ExtendTypeTo64( calcType.GetBasicType(), temp_reg );
    363323                }
    364324            }
     
    369329                else i3=i2;
    370330                CheckDifferentType(
    371                     DummyTypeInfo.type,
    372                     DummyTypeInfo.u.lpIndex,
    373                     CalcType,
    374                     lpCalcIndex,
    375                     FuncName,
     331                    dummyType,
     332                    calcType,
     333                    procName.c_str(),
    376334                    i3);
    377335
    378 
    379                 if(DummyTypeInfo.type==DEF_DOUBLE){
     336                if( dummyType.IsDouble() ){
    380337                    //Double型へ変換
    381                     ChangeTypeToXmm_Double(CalcType,reg,temp_reg);
    382                 }
    383                 else if(DummyTypeInfo.type==DEF_SINGLE){
     338                    ChangeTypeToXmm_Double(calcType.GetBasicType(),reg,temp_reg);
     339                }
     340                else if( dummyType.IsSingle() ){
    384341                    //Single型へ変換
    385                     ChangeTypeToXmm_Single(CalcType,reg,temp_reg);
    386                 }
    387                 else if(IsWholeNumberType(DummyTypeInfo.type)){
     342                    ChangeTypeToXmm_Single(calcType.GetBasicType(),reg,temp_reg);
     343                }
     344                else if( dummyType.IsWhole() ){
    388345                    //実数型 → 整数型
    389                     ChangeTypeToWhole(CalcType,DummyTypeInfo.type,reg,temp_reg);
     346                    ChangeTypeToWhole(calcType.GetBasicType(),dummyType.GetBasicType(),reg,temp_reg);
    390347                }
    391348            }
     
    397354
    398355                temp_reg=reg;
    399                 CalcType=NumOpe(&temp_reg,Parms[i2]+2,0,0,&lpCalcIndex);
    400                 if(CalcType==-1) break;
    401 
    402                 int ptr_type;
    403                 ptr_type=GetPtrType(DummyTypeInfo.type,DummyTypeInfo.u.lpIndex);
     356                Type calcType;
     357                if( !NumOpe(&temp_reg, Parms[i2]+2, dummyType, calcType) ){
     358                    break;
     359                }
     360
     361                dummyType.PtrLevelUp();
    404362
    405363                //型チェック
     
    407365                else i3=i2;
    408366                CheckDifferentType(
    409                     ptr_type,
    410                     DummyTypeInfo.u.lpIndex,
    411                     CalcType,
    412                     lpCalcIndex,
    413                     FuncName,
     367                    dummyType,
     368                    calcType,
     369                    procName.c_str(),
    414370                    i3);
    415371
    416                 if(IsRealNumberType(CalcType)){
     372                if( calcType.IsReal() ){
    417373                    //実数型 → 整数型
    418                     ChangeTypeToWhole(CalcType,DEF_QWORD,reg,temp_reg);
     374                    ChangeTypeToWhole( calcType.GetBasicType(), DEF_QWORD,reg,temp_reg);
    419375                }
    420376            }
     
    428384                else{
    429385                    //変数のアドレスを取得
    430                     int VarType;
    431                     LONG_PTR lpVarIndex;
     386                    Type varType;
    432387                    if(GetVarOffset(
    433388                        false,
    434389                        false,
    435390                        Parms[i2],
    436                         &VarType,
    437391                        &RelativeVar,
    438                         &lpVarIndex)){
    439 
    440                             if(DummyTypeInfo.type!=DEF_ANY){
     392                        varType)){
     393
     394                            if( !dummyType.IsAny() ){
    441395                                //型チェックを行う
    442                                 if(DummyTypeInfo.type==VarType){
    443                                     if(DummyTypeInfo.type==DEF_OBJECT){
    444                                         if( !DummyTypeInfo.u.pobj_Class->IsEqualsOrSubClass( (CClass *)lpVarIndex ) ){
     396                                if( dummyType.GetBasicType() == varType.GetBasicType() ){
     397                                    if( dummyType.IsObject() ){
     398                                        if( !dummyType.GetClass().IsEqualsOrSubClass( &varType.GetClass() ) ){
    445399                                            SetError(11,Parms[i2],cp);
    446400                                        }
    447401                                    }
    448                                     else if(DummyTypeInfo.type==DEF_STRUCT){
    449                                         if( !DummyTypeInfo.u.pobj_Class->IsEquals( (CClass *)lpVarIndex ) ){
     402                                    else if( dummyType.IsStruct() ){
     403                                        if( !dummyType.GetClass().IsEquals( &varType.GetClass() ) ){
    450404                                            SetError(11,Parms[i2],cp);
    451405                                        }
    452406                                    }
    453407                                }
    454                                 else if((VarType&FLAG_PTR)&&((VarType^FLAG_PTR)==DummyTypeInfo.type)){
     408                                else if( (varType.GetBasicType()&FLAG_PTR)
     409                                    &&((varType.GetBasicType()^FLAG_PTR)==dummyType.GetBasicType())){
    455410                                    //仮引数がポインタ参照で、実引数が配列の先頭ポインタのとき
    456411                                }
     
    494449
    495450    //パラメータが収まるだけのスタックフレームを確保
    496     pobj_sf->parameter_allocate(pi_num*sizeof(_int64)+   sizeof(_int64)/*ret用*/  );
     451    pobj_sf->parameter_allocate((int)params.size()*sizeof(_int64)+   sizeof(_int64)/*ret用*/  );
    497452}
    498453void ParamImpl::BackupParameter(int pi_num){
  • BasicCompiler64/Compile_Calc.cpp

    r64 r75  
    8484            }
    8585
    86             LONG_PTR lp;
    87             if(GetVarType(variable,&lp,0)!=-1){
     86            if(GetVarType(variable,Type(),0)){
    8887                //変数リストに該当したとき
    8988                SetError(1,NULL,cp);
     
    129128
    130129    char ObjName[VN_SIZE],array_element[VN_SIZE];
    131     CClass *pobj_c;
    132130    GetArrayElement(variable,ObjName,array_element);
    133131    if(array_element[0]){
    134         i2=GetVarType(ObjName,(LONG_PTR *)&pobj_c,0);
    135         if(i2==DEF_OBJECT){
     132        Type varType;
     133        if( GetVarType(ObjName,varType,0) && varType.IsObject() ){
    136134            char temporary[VN_SIZE];
    137135            sprintf(temporary,"%s.%c%c%c",ObjName,1,ESC_OPERATOR,CALC_ARRAY_SET);
     
    141139
    142140            int idProc;
    143             void *pInfo;
    144             idProc=GetProc(temporary,&pInfo);
     141            void *pProc;
     142            idProc=GetProc(temporary,(void **)&pProc);
    145143            if(idProc){
    146                 CallProc(idProc,pInfo,temporary,temp2,NULL);
     144                CallProc(idProc,pProc,temporary,temp2,Type());
    147145                return;
    148146            }
     
    161159    ////////////////////////////////////////
    162160
    163     int VarType,CalcType;
    164     LONG_PTR lpVarIndex,lpCalcIndex;
    165     BOOL bCalcUseHeap;
     161    Type varType;
    166162
    167163    //型を識別
    168     VarType=GetVarType(variable,&lpVarIndex,0);
    169     if(VarType==-1){
     164    if( !GetVarType(variable,varType,false) ){
    170165
    171166        // プロパティ用のメソッドを呼び出す
    172         if(!CallPropertyMethod(variable,Command+i+1,NULL)){
     167        if(!CallPropertyMethod( variable, Command+i+1, Type() )){
    173168            //エラーを表示
    174             GetVarType(variable,&lpVarIndex,1);
     169            GetVarType(variable,varType,true);
    175170        }
    176171
     
    179174
    180175    extern LONG_PTR ProcPtr_BaseIndex;
    181     if(VarType==DEF_PTR_PROC) ProcPtr_BaseIndex=lpVarIndex;
     176    if(varType.IsProcPtr()) ProcPtr_BaseIndex=varType.GetIndex();
    182177    else ProcPtr_BaseIndex=-1;
    183178
    184179    //NumOpe...(rax、またはxmm0に答えが格納される)
    185180    int reg=REG_RAX;
    186     CalcType=NumOpe(&reg,Command+i+1,VarType,lpVarIndex,&lpCalcIndex,&bCalcUseHeap);
    187 
    188     if(reg!=REG_RAX&&IsWholeNumberType(CalcType)){
     181    BOOL bCalcUseHeap;
     182    Type calcType;
     183    if( !NumOpe(&reg,Command+i+1,varType,calcType,&bCalcUseHeap) ){
     184        return;
     185    }
     186
     187    if(reg!=REG_RAX&&calcType.IsWhole()||
     188        varType.IsNull()||calcType.IsNull()){
    189189        SetError(300,NULL,cp);
    190190    }
    191 
    192     if(VarType==-1||CalcType==-1) return;
    193191
    194192    //結果を格納しているレジスタをブロッキング
     
    199197    if(!GetVarOffsetReadWrite(
    200198        variable,
    201         &VarType,
    202199        &VarRelativeVar,
    203         &lpVarIndex,
    204         NULL)) return;
     200        varType)) return;
    205201
    206202    //レジスタのブロッキングを解除
    207203    pobj_BlockReg->clear();
    208204
    209     if(VarType&FLAG_PTR){
     205    if(varType.GetBasicType()&FLAG_PTR){
    210206        SetError(14,variable,cp);
    211207        return;
    212208    }
    213209
    214     if(VarType==DEF_STRUCT ){
     210    if( varType.IsStruct() ){
    215211        //構造体インスタンスへの代入
    216         SetStructVariableFromRax(lpVarIndex,CalcType,lpCalcIndex,&VarRelativeVar,bCalcUseHeap);
    217         return;
    218     }
    219 
    220     if(CalcType==DEF_OBJECT && (CalcType!=VarType || lpCalcIndex!=lpVarIndex) ){
     212        SetStructVariableFromRax(varType,calcType,&VarRelativeVar,bCalcUseHeap);
     213        return;
     214    }
     215
     216    if( calcType.IsObject() && !calcType.Equals( varType ) ){
    221217        //キャスト演算子のオーバーロードに対応する
    222         CallCastOperatorProc(REG_RAX,CalcType,lpCalcIndex,bCalcUseHeap,VarType,lpVarIndex);
     218        CallCastOperatorProc(REG_RAX,calcType,bCalcUseHeap,varType);
    223219    }
    224220
     
    228224    /////////////////////////////////
    229225
    230     CheckDifferentType(VarType,lpVarIndex,CalcType,lpCalcIndex,0,0);
     226    CheckDifferentType(varType,calcType,0,0);
    231227
    232228
     
    234230    // rax(実数はxmm0)の内容を変数にコピー
    235231    /////////////////////////////////////////////////
    236     SetVariableFromRax(VarType,CalcType,&VarRelativeVar);
     232    SetVariableFromRax(varType.GetBasicType(),calcType.GetBasicType(),&VarRelativeVar);
    237233}
    238 
    239 // TODO: 消す
    240 /*
    241 void SetRefVariable( const char *varname, const char *expression ){
    242     ////////////////////////////////////////
    243     // 変数のタイプ型を識別して、演算を行う
    244     ////////////////////////////////////////
    245 
    246     int VarType,CalcType;
    247     LONG_PTR lpVarIndex,lpCalcIndex;
    248     BOOL bCalcUseHeap;
    249 
    250     //型を識別
    251     VarType=GetVarType(varname,&lpVarIndex,0);
    252     if(VarType==-1){
    253         SetError(300,NULL,cp);
    254         return;
    255     }
    256 
    257     extern LONG_PTR ProcPtr_BaseIndex;
    258     if(VarType==DEF_PTR_PROC) ProcPtr_BaseIndex=lpVarIndex;
    259     else ProcPtr_BaseIndex=-1;
    260 
    261     //NumOpe...(rax、またはxmm0に答えが格納される)
    262     int reg=REG_RAX;
    263     CalcType=NumOpe(&reg,expression,VarType,lpVarIndex,&lpCalcIndex,&bCalcUseHeap);
    264 
    265     //結果を格納しているレジスタをブロッキング
    266     pobj_BlockReg->lock(reg);
    267 
    268     if(VarType==-1||CalcType==-1) return;
    269 
    270     //変数アドレスを取得
    271     RELATIVE_VAR VarRelativeVar;
    272     if(!GetVarOffsetReadWrite(
    273         varname,
    274         &VarType,
    275         &VarRelativeVar,
    276         &lpVarIndex)) return;
    277 
    278     //レジスタのブロッキングを解除
    279     pobj_BlockReg->clear();
    280 
    281     if(VarType&FLAG_PTR){
    282         SetError(14,varname,cp);
    283         return;
    284     }
    285 
    286     if( VarType == DEF_OBJECT
    287         && (VarRelativeVar.dwKind == VAR_REFLOCAL || VarRelativeVar.dwKind == VAR_REFGLOBAL ) ){
    288         // 参照型オブジェクトへの代入(初期化)はポインタ変数と同様の処理に値する
    289         PTR_LEVEL_UP( VarType );
    290 
    291         if( VarRelativeVar.dwKind == VAR_REFGLOBAL ){
    292             VarRelativeVar.dwKind = VAR_GLOBAL;
    293         }
    294         else if( VarRelativeVar.dwKind == VAR_REFLOCAL ){
    295             VarRelativeVar.dwKind = VAR_LOCAL;
    296         }
    297 
    298         if( CalcType == DEF_OBJECT ){
    299             //右辺値が実体オブジェクトのときは、参照をコピー
    300             PTR_LEVEL_UP( CalcType );
    301         }
    302     }
    303     else{
    304         SetError(300,NULL,cp);
    305     }
    306 
    307 
    308     /////////////////////////////////
    309     // 右辺、左辺の型チェックを行う
    310     /////////////////////////////////
    311 
    312     CheckDifferentType(VarType,lpVarIndex,CalcType,lpCalcIndex,0,0);
    313 
    314 
    315     /////////////////////////////////////////////////
    316     // rax(実数はxmm0)の内容を変数にコピー
    317     /////////////////////////////////////////////////
    318     SetVariableFromRax(VarType,CalcType,&VarRelativeVar);
    319 }
    320 */
  • BasicCompiler64/Compile_CallProc.cpp

    r73 r75  
    88void Call_DebugSys_SaveContext(){
    99    //call _System_GetEip
    10     extern SubInfo *pSub_System_GetEip;
     10    extern UserProc *pSub_System_GetEip;
    1111    op_call(pSub_System_GetEip);
    1212
     
    1818
    1919    //call _DebugSys_SaveContext
    20     extern SubInfo *pSub_DebugSys_SaveContext;
     20    extern UserProc *pSub_DebugSys_SaveContext;
    2121    op_call(pSub_DebugSys_SaveContext);
    2222}
     
    3232
    3333
    34 int Opcode_CallProcPtr(char *variable,char *Parameter,PROCPTRINFO *pi,LONG_PTR *plpIndex){
    35     extern HANDLE hHeap;
    36     int i;
    37 
     34bool Opcode_CallProcPtr( const char *variable, const char *lpszParms,ProcPointer *pProcPointer){
    3835
    3936    extern BOOL bDebugCompile;
     
    4946    //パラメータオブジェクトを生成
    5047    ParamImpl *pobj_parameter=0;
    51     pobj_parameter=new ParamImpl(Parameter);
     48    pobj_parameter=new ParamImpl(lpszParms);
    5249
    5350    //エラーチェック
    54     if( !pobj_parameter->ErrorCheck(variable,pi->pParmInfo,pi->ParmNum,pi->ParmNum) ){
     51    if( !pobj_parameter->ErrorCheck(variable,pProcPointer->Params() ) ){
    5552        //パラメータにエラーがあるときは処理を終える
    56         return pi->ReturnType;
     53        return false;
    5754    }
    5855
    5956    //スタックフレームに存在する既存のパラメータをバックアップ
    60     pobj_parameter->BackupParameter(pi->ParmNum);
     57    pobj_parameter->BackupParameter( (int)pProcPointer->Params().size() );
    6158
    6259    //一時オブジェクトを生成
    63     pobj_parameter->NewTempParameters( variable,pi->pParmInfo,pi->ParmNum,pi->ParmNum );
     60    pobj_parameter->NewTempParameters( variable,pProcPointer->Params() );
    6461
    6562    //レジスタ、スタックフレームにセット
    66     pobj_parameter->SetParameter(variable,pi->pParmInfo,pi->ParmNum,pi->ParmNum);
     63    pobj_parameter->SetParameter(variable,pProcPointer->Params() );
    6764
    6865
    6966
    7067    RELATIVE_VAR RelativeVar;
    71     LONG_PTR lp;
    72     GetVarOffsetReadOnly(variable,&i,&RelativeVar,&lp);
     68    GetVarOffsetReadOnly(variable,&RelativeVar,Type());
    7369    SetVarPtrToReg(REG_RAX,&RelativeVar);
    7470
     
    8884
    8985    //スタックフレームに存在する既存のパラメータを復元
    90     pobj_parameter->RestoreParameter(pi->ParmNum);
     86    pobj_parameter->RestoreParameter( (int)pProcPointer->Params().size() );
    9187
    9288    //パラメータオブジェクトを破棄
    9389    delete pobj_parameter;
    9490
    95     return pi->ReturnType;
     91    return true;
    9692}
    9793
    98 void Opcode_CallProc(const char *Parameter,SubInfo *psi,DWORD dwFlags,char *ObjectName,int RefType){
     94bool Opcode_CallProc(const char *Parameter,UserProc *pUserProc,DWORD dwFlags,const char *ObjectName,int RefType){
    9995    int i2;
    10096
    101     if(psi->dwType==SUBTYPE_MACRO){
    102         if(lstrcmpi(psi->name,"Print")==0){
     97    if( pUserProc->IsMacro() ){
     98        if( lstrcmpi( pUserProc->GetName().c_str(), "Print" ) == 0 ){
    10399            Opcode_Print(Parameter,0);
    104             return;
    105         }
    106         if(lstrcmpi(psi->name,"Input")==0){
     100            return true;
     101        }
     102        if( lstrcmpi( pUserProc->GetName().c_str(), "Input" ) == 0 ){
    107103            Opcode_Input(Parameter);
    108             return;
    109         }
    110         if(lstrcmpi(psi->name,"Write")==0){
     104            return true;
     105        }
     106        if( lstrcmpi( pUserProc->GetName().c_str(), "Write" ) == 0 ){
    111107            Opcode_Print(Parameter,1);
    112             return;
    113         }
    114     }
    115 
    116     psi->bUse=1;
     108            return true;
     109        }
     110    }
     111
     112    pUserProc->Using();
    117113
    118114    bool isStatic = false;
    119     CClass *pobj_c = NULL;
     115    const CClass *pobj_c = NULL;
    120116    CMethod *pMethod = NULL;
    121     if(psi->pobj_ParentClass){
     117    if( pUserProc->GetParentClassPtr() ){
    122118        //クラスのメンバ関数を呼び出す場合はアクセスチェックを行う
    123119        if(ObjectName[0]){
     
    128124            else{
    129125                //"->"によってオブジェクトを指定する通常のメンバ関数呼び出し
    130                 int type = GetVarType(ObjectName,(LONG_PTR *)&pobj_c,0);
    131                 if(!(NATURAL_TYPE(type)==DEF_OBJECT)){
     126                Type varType;
     127                GetVarType( ObjectName, varType, false );
     128                pobj_c = &varType.GetClass();
     129                if( NATURAL_TYPE( varType.GetBasicType() ) != DEF_OBJECT ){
    132130                    pobj_c=pobj_DBClass->check(ObjectName);
    133131                    if( pobj_c ){
     
    143141            if(dwFlags&PROCFLAG_NEW){
    144142                //New演算子によるコンストラクタ呼び出し
    145                 pobj_c=psi->pobj_ParentClass;
     143                pobj_c=pUserProc->GetParentClassPtr();
    146144            }
    147145            else{
     
    156154        /////////////////////////////////
    157155        pMethod = NULL;
    158         if( ! isStatic ) pMethod = pobj_c->GetMethodInfo( psi );
     156        if( ! isStatic ) pMethod = pobj_c->GetMethodInfo( pUserProc );
    159157        if( ! pMethod ){
    160158            //動的メソッドが取得できなかったときは静的メソッドを当たる
    161             pMethod = pobj_c->GetStaticMethodInfo( psi );
     159            pMethod = pobj_c->GetStaticMethodInfo( pUserProc );
    162160            if( !pMethod ){
    163161                SetError(300,NULL,cp);
    164                 return;
     162                return false;
    165163            }
    166164
     
    180178                //同一クラスオブジェクトの場合はプライベートアクセスを容認する
    181179                if(dwAccess==ACCESS_NON){
    182                     SetError(109,psi->name,cp);
    183                     return;
     180                    SetError(109,pUserProc->GetName(),cp);
     181                    return false;
    184182                }
    185183            }
     
    187185                if(dwAccess==ACCESS_PRIVATE||
    188186                    dwAccess==ACCESS_NON){
    189                     SetError(109,psi->name,cp);
    190                     return;
     187                    SetError(109,pUserProc->GetName(),cp);
     188                    return false;
    191189                }
    192190                if(dwAccess==ACCESS_PROTECTED){
    193                     SetError(110,psi->name,cp);
    194                     return;
     191                    SetError(110,pUserProc->GetName(),cp);
     192                    return false;
    195193                }
    196194            }
     
    199197            //クラス内部からの呼び出し(継承によるACCESS_NONのみをエラーとする)
    200198            if(dwAccess==ACCESS_NON){
    201                 SetError(109,psi->name,cp);
    202                 return;
     199                SetError(109,pUserProc->GetName(),cp);
     200                return false;
    203201            }
    204202        }
     
    211209
    212210    char temporary[VN_SIZE]={0};
    213     if( psi->pobj_ParentClass && isStatic == false ){
     211    if( pUserProc->GetParentClassPtr() && isStatic == false ){
    214212        //_System_LocalThis(第一パラメータ)のダミーを作成
    215213        lstrcpy(temporary,"0,");
     
    234232
    235233    //エラーチェック
    236     if( !pobj_parameter->ErrorCheck(psi->name,psi->realParams,psi->SecondParmNum) ){
     234    if( !pobj_parameter->ErrorCheck(pUserProc->GetName(),pUserProc->RealParams(),pUserProc->GetSecondParmNum() ) ){
    237235        //パラメータにエラーがあるときは処理を終える
    238         return;
    239     }
    240 
    241     if(psi->dwType==SUBTYPE_MACRO){
     236        return false;
     237    }
     238
     239    if(pUserProc->IsMacro()){
    242240        //マクロ関数の場合は、パラメータ省略を考慮する
    243         pobj_parameter->MacroParameterSupport(psi->realParams);
     241        pobj_parameter->MacroParameterSupport( pUserProc->RealParams() );
    244242    }
    245243
    246244    //スタックフレームに存在する既存のパラメータをバックアップ
    247     pobj_parameter->BackupParameter(psi->RealParmNum);
     245    pobj_parameter->BackupParameter( (int)pUserProc->RealParams().size() );
    248246
    249247    //一時オブジェクトを生成
    250     pobj_parameter->NewTempParameters( psi->name,psi->realParams,psi->RealSecondParmNum );
     248    pobj_parameter->NewTempParameters( pUserProc->GetName(),pUserProc->RealParams(),pUserProc->GetRealSecondParmNum() );
    251249
    252250    //レジスタ、スタックフレームにセット
    253     pobj_parameter->SetParameter(psi->name,psi->realParams,psi->RealSecondParmNum);
    254 
    255     if(psi->ReturnType==DEF_STRUCT && psi->isReturnRef == false){
     251    pobj_parameter->SetParameter(pUserProc->GetName(),pUserProc->RealParams(),pUserProc->GetRealSecondParmNum() );
     252
     253    if(pUserProc->ReturnType().IsStruct() ){
    256254        //////////////////////////////////////////////////////
    257255        // 戻り値に構造体インスタンスを持つ場合
     
    265263        //////////////////////////////////////////////////////
    266264
    267             int object_size = psi->u.Return_pobj_c->GetSize();
     265            int object_size = pUserProc->ReturnType().GetClass().GetSize();
    268266
    269267            //mov rcx,object_size
     
    271269
    272270            //call calloc
    273             extern SubInfo *pSub_calloc;
     271            extern UserProc *pSub_calloc;
    274272            op_call(pSub_calloc);
    275273
     
    282280        }////////////////////////////////////////////
    283281
    284         if( psi->pobj_ParentClass && isStatic == false ){
     282        if( pUserProc->GetParentClassPtr() && isStatic == false ){
    285283            //mov rdx,r13
    286284            op_mov_RR(REG_RDX,REG_R13);
     
    293291
    294292
    295     if( psi->pobj_ParentClass && isStatic == false ){
     293    if( pUserProc->GetParentClassPtr() && isStatic == false ){
    296294        ///////////////////////////////
    297295        // メンバ関数の場合
     
    305303                if( pMethod->isConst ){
    306304                    //Constアクセスが可能なメソッドの場合
    307                     if( !GetVarOffsetReadOnly( ObjectName, &i2, &RelativeVar, 0 ) ) return;
     305                    if( !GetVarOffsetReadOnly( ObjectName, &RelativeVar, Type() ) ){
     306                        return false;
     307                    }
    308308                }
    309309                else{
    310310                    //Constアクセスが不可能なメソッドの場合
    311                     if( !GetVarOffsetReadWrite( ObjectName, &i2, &RelativeVar, 0 ) ) return;
     311                    if( !GetVarOffsetReadWrite( ObjectName, &RelativeVar, Type() ) ){
     312                        return false;
     313                    }
    312314                }
    313315
     
    334336    }
    335337
    336     if(psi->bVirtual){
     338    if( pUserProc->IsVirtual() ){
    337339        //仮想関数(オブジェクトメソッド)呼び出し
    338340        //pObj->func_table->func1
     
    343345        op_mov_RM(sizeof(_int64),REG_R11,REG_RCX,0,MOD_BASE);
    344346
    345         i2 = pobj_c->GetFuncNumInVtbl( psi );
     347        i2 = pobj_c->GetFuncNumInVtbl( pUserProc );
    346348
    347349        //call qword ptr[r11+func_index]
     
    364366
    365367        //call ProcAddr
    366         op_call(psi);
     368        op_call(pUserProc);
    367369    }
    368370
    369371    /* 64コンパイラでは不要
    370     if(pdi->bCdecl){
     372    if(pDllProc->bCdecl){
    371373        //add esp,ParmSize
    372374    }*/
     
    380382
    381383    //スタックフレームに存在する既存のパラメータを復元
    382     pobj_parameter->RestoreParameter(psi->RealParmNum);
     384    pobj_parameter->RestoreParameter( (int)pUserProc->RealParams().size() );
    383385
    384386    //パラメータオブジェクトを破棄
    385387    delete pobj_parameter;
     388
     389    return true;
    386390}
    387391
    388 int Opcode_CallDllProc(char *Parameter,DECLAREINFO *pdi,LONG_PTR *plpIndex){
    389     char *temporary;
    390 
    391     temporary=(char *)HeapAlloc(hHeap,0,lstrlen(Parameter)+1);
     392bool Opcode_CallDllProc( const char *lpszParms, DllProc *pDllProc ){
    392393
    393394    extern BOOL bDebugCompile;
    394395    extern BOOL bDebugSupportProc;
    395     if(bDebugCompile&&bDebugSupportProc==0&&lstrcmp(pdi->name,"DebugBreak")!=0)
     396    if(bDebugCompile&&bDebugSupportProc==0&& pDllProc->GetName() != "DebugBreak" ){
    396397        Call_DebugSys_SaveContext();
    397 
     398    }
    398399
    399400
     
    404405    //パラメータオブジェクトを生成
    405406    ParamImpl *pobj_parameter=0;
    406     pobj_parameter=new ParamImpl(Parameter);
     407    pobj_parameter=new ParamImpl(lpszParms);
    407408
    408409    //エラーチェック
    409     if( !pobj_parameter->ErrorCheck(pdi->name,pdi->pParmInfo,pdi->ParmNum,pdi->ParmNum) ){
     410    if( !pobj_parameter->ErrorCheck( pDllProc->GetName(), pDllProc->Params() ) ){
    410411        //パラメータにエラーがあるときは処理を終える
    411         return pdi->ReturnType;
     412        return false;
    412413    }
    413414
    414415    //スタックフレームに存在する既存のパラメータをバックアップ
    415     pobj_parameter->BackupParameter(pdi->ParmNum);
     416    pobj_parameter->BackupParameter( (int)pDllProc->Params().size() );
    416417
    417418    //一時オブジェクトを生成
    418     pobj_parameter->NewTempParameters( pdi->name,pdi->pParmInfo,pdi->ParmNum,pdi->ParmNum );
     419    pobj_parameter->NewTempParameters( pDllProc->GetName(), pDllProc->Params() );
    419420
    420421    //レジスタ、スタックフレームにセット
    421     pobj_parameter->SetParameter(pdi->name,pdi->pParmInfo,pdi->ParmNum,pdi->ParmNum);
     422    pobj_parameter->SetParameter(pDllProc->GetName(), pDllProc->Params() );
    422423
    423424
     
    429430
    430431    //call dword ptr[ImportTable]
    431     op_call( pdi );
     432    op_call( pDllProc );
    432433
    433434    /* 64コンパイラでは不要
    434     if(pdi->bCdecl){
     435    if(pDllProc->bCdecl){
    435436        //add esp,ParmSize
    436437    }*/
     
    440441
    441442    //スタックフレームに存在する既存のパラメータを復元
    442     pobj_parameter->RestoreParameter(pdi->ParmNum);
     443    pobj_parameter->RestoreParameter( (int)pDllProc->Params().size() );
    443444
    444445    //パラメータオブジェクトを破棄
    445446    delete pobj_parameter;
    446447
    447     if(plpIndex) *plpIndex=pdi->u.ReturnIndex;
    448 
    449     HeapDefaultFree(temporary);
    450 
    451     return pdi->ReturnType;
     448    return true;
    452449}
  • BasicCompiler64/Compile_Func.cpp

    r73 r75  
    4040}
    4141void Opcode_Func_Len( const char *Parameter ){
    42     int type,TypeSize;
    43     LONG_PTR lpIndex;
    4442    BOOL bArrayHead;
    45 
    46     type=GetVarType(Parameter,&lpIndex,0);
    4743
    4844    const char *tempParm=Parameter;
    4945    char temporary[VN_SIZE];
    5046    char temp2[32];
    51     if(type==-1){
     47    Type type;
     48    if( !GetVarType(Parameter,type,0) ){
    5249        sprintf(temporary,"_System_DummyStr2=%s",Parameter);
    5350        OpcodeCalc(temporary);
     
    5754
    5855        extern CClass *pobj_StringClass;
    59         type=DEF_OBJECT;
    60         lpIndex=(LONG_PTR)pobj_StringClass;
    61     }
    62 
    63     TYPEINFO TypeInfo={type,lpIndex};
    64     if(IsStringObjectType(TypeInfo)){
     56        type.SetType( DEF_OBJECT, pobj_StringClass );
     57    }
     58
     59    if( type.IsStringObject() ){
    6560        //Stringオブジェクトの場合
    6661        sprintf(temporary,"%s.Length",tempParm);
    6762
    6863        int reg=REG_RAX;
    69         NumOpe(&reg,temporary,0,0,NULL,NULL);
     64        NumOpe(&reg,temporary,Type(),Type(),NULL);
    7065        return;
    7166    }
     
    7469    int SubScripts[MAX_ARRAYDIM];
    7570    RELATIVE_VAR RelativeVar;
    76     if(!GetVarOffsetReadOnly(tempParm,&type,&RelativeVar,&lpIndex,SubScripts)) return;
    77 
    78 
    79     if(type&FLAG_PTR){
    80         type&=~FLAG_PTR;
     71    if(!GetVarOffsetReadOnly(tempParm,&RelativeVar,type,SubScripts)) return;
     72
     73
     74    if(type.GetBasicType()&FLAG_PTR){
     75        type.SetBasicType( type.GetBasicType() & ( ~FLAG_PTR ) );
    8176
    8277        bArrayHead=1;
     
    8479    else bArrayHead=0;
    8580
    86     TypeSize=GetTypeSize(type,lpIndex);
    87 
    88     if(bArrayHead) TypeSize*=JumpSubScripts(SubScripts);
     81    int typeSize = type.GetSize();
     82
     83    if(bArrayHead) typeSize*=JumpSubScripts(SubScripts);
    8984
    9085    //mov rax,TypeSize
    91     op_mov_RV(sizeof(_int64),REG_RAX,TypeSize);
     86    op_mov_RV(sizeof(_int64),REG_RAX,typeSize);
    9287
    9388    return;
     
    9590void Opcode_Func_AddressOf( const char *name ){
    9691    extern int cp;
    97     SubInfo *psi;
     92    UserProc *pUserProc;
    9893
    9994    extern LONG_PTR ProcPtr_BaseIndex;
     
    10196        //左辺の型にのっとり、オーバーロードを解決
    10297
    103         std::vector<SubInfo *> subs;
     98        std::vector<UserProc *> subs;
    10499        GetOverloadSubHash( name, subs );
    105100        if( subs.size() == 0 ){
     
    109104
    110105        //オーバーロードを解決
    111         extern PROCPTRINFO *pProcPtrInfo;
    112         psi=OverloadSolution(name,subs,pProcPtrInfo[ProcPtr_BaseIndex].pParmInfo,pProcPtrInfo[ProcPtr_BaseIndex].ParmNum,NULL);
    113 
    114         if(!psi){
     106        extern ProcPointer **ppProcPointer;
     107        pUserProc=OverloadSolution(name,subs,ppProcPointer[ProcPtr_BaseIndex]->Params(), Type() );
     108
     109        if(!pUserProc){
    115110            SetError(27,name,cp);
    116111            return;
     
    118113    }
    119114    else{
    120         psi=GetSubHash(name);
    121         if(!psi){
     115        pUserProc=GetSubHash(name);
     116        if(!pUserProc){
    122117            SetError(27,name,cp);
    123118            return;
     
    125120    }
    126121
    127 
    128     if(psi->bVirtual){
     122    if( pUserProc->IsVirtual() ){
    129123        ///////////////////////////////
    130124        // 仮想関数の場合
     
    142136            else{
    143137                RELATIVE_VAR RelativeVar;
    144                 int type;
    145                 if(!GetVarOffsetReadOnly(ObjectName,&type,&RelativeVar,(LONG_PTR *)&pobj_c)) return;
     138                Type type;
     139                if(!GetVarOffsetReadOnly(ObjectName,&RelativeVar,type)) return;
    146140                SetVarPtrToReg(REG_RCX,&RelativeVar);
    147141
    148142                //参照タイプが整合しているかをチェック
    149                 if(type!=RefType) SetError(104,ObjectName,cp);
    150 
    151                 if(type==DEF_PTR_OBJECT){
     143                if(type.GetBasicType()!=RefType) SetError(104,ObjectName,cp);
     144
     145                if(type.IsObjectPtr()){
    152146                    //mov rcx,qword ptr[rcx]
    153147                    op_mov_RM(sizeof(_int64),REG_RCX,REG_RCX,0,MOD_BASE);
     
    172166        op_mov_RM(sizeof(_int64),REG_R11,REG_RCX,0,MOD_BASE);
    173167
    174         int i2 = pobj_c->GetFuncNumInVtbl( psi );
     168        int i2 = pobj_c->GetFuncNumInVtbl( pUserProc );
    175169
    176170        //mov rax,qword ptr[r11+func_index]
     
    188182        op_mov_RV(sizeof(_int64),REG_RAX,0);
    189183        obp-=sizeof(long);
    190         pobj_SubAddrSchedule->add(psi,0);
     184        pobj_SubAddrSchedule->add(pUserProc,0);
    191185        obp+=sizeof(long);
    192186    }
    193187
    194     psi->bUse=1;
     188    pUserProc->Using();
    195189}
    196190void Opcode_Func_SizeOf( const char *Parameter ){
     
    210204    op_mov_RV(sizeof(_int64),REG_RAX,size);
    211205}
    212 void Opcode_Func_VarPtr( const char *Parameter, TYPEINFO &ReturnTypeInfo ){
     206void Opcode_Func_VarPtr( const char *Parameter, Type &resultType, bool isCallOn ){
     207    if( isCallOn == false ){
     208        // 戻り値の型を取得するだけ
     209
     210        //変数のアドレスを取得
     211        if(!GetVarType( Parameter, resultType, true )) return;
     212
     213        resultType.PtrLevelUp();
     214
     215        return;
     216    }
     217
    213218    RELATIVE_VAR RelativeVar;
    214219
    215220    //変数のアドレスを取得
    216     if(!GetVarOffsetReadOnly( Parameter, &ReturnTypeInfo.type, &RelativeVar, &ReturnTypeInfo.u.lpIndex )) return;
    217 
    218     int beforeType = ReturnTypeInfo.type;
    219 
    220     PTR_LEVEL_UP( ReturnTypeInfo.type );
     221    if(!GetVarOffsetReadOnly( Parameter, &RelativeVar, resultType )) return;
     222
     223    int beforeType = resultType.GetBasicType();
     224
     225    resultType.PtrLevelUp();
    221226
    222227    SetVarPtrToReg(REG_RAX,&RelativeVar);
     
    230235}
    231236void Opcode_Func_GetPtrData( const char *Parameter, const int type ){
    232     int i2;
    233 
    234237    int reg=REG_RAX;
    235     i2=NumOpe(&reg,Parameter,0,0,0);
    236     if(!IsWholeNumberType(i2)){
    237         extern int cp;
     238    Type tempType;
     239    if( !NumOpe(&reg,Parameter,Type(),tempType) ){
     240        return;
     241    }
     242    if(!tempType.IsWhole()){
    238243        SetError(11,Parameter,cp);
    239244        return;
     
    254259}
    255260
    256 void Opcode_CallFunc( const char *Parameter, const int FuncNum, TYPEINFO &ReturnTypeInfo ){
     261bool Opcode_CallFunc( const char *Parameter, const int FuncNum, Type &resultType, bool isCallOn ){
    257262    switch(FuncNum){
    258263        case FUNC_LEN:
    259             Opcode_Func_Len(Parameter);
    260             ReturnTypeInfo.type = DEF_LONG;
     264            if( isCallOn ) Opcode_Func_Len(Parameter);
     265            resultType.SetBasicType( DEF_LONG );
    261266            break;
    262267        case FUNC_ADDRESSOF:
    263             Opcode_Func_AddressOf(Parameter);
    264             ReturnTypeInfo.type = DEF_PTR_VOID;
     268            if( isCallOn ) Opcode_Func_AddressOf(Parameter);
     269            resultType.SetBasicType( DEF_PTR_VOID );
    265270            break;
    266271        case FUNC_SIZEOF:
    267             Opcode_Func_SizeOf(Parameter);
    268             ReturnTypeInfo.type = DEF_LONG;
     272            if( isCallOn ) Opcode_Func_SizeOf(Parameter);
     273            resultType.SetBasicType( DEF_LONG );
    269274            break;
    270275        case FUNC_VARPTR:
    271             Opcode_Func_VarPtr( Parameter, ReturnTypeInfo );
     276            Opcode_Func_VarPtr( Parameter, resultType, isCallOn );
    272277            break;
    273278
    274279        case FUNC_GETDOUBLE:
    275             Opcode_Func_GetPtrData(Parameter,DEF_DOUBLE);
    276             ReturnTypeInfo.type = DEF_DOUBLE;
     280            if( isCallOn ) Opcode_Func_GetPtrData(Parameter,DEF_DOUBLE);
     281            resultType.SetBasicType( DEF_DOUBLE );
    277282            break;
    278283        case FUNC_GETSINGLE:
    279             Opcode_Func_GetPtrData(Parameter,DEF_SINGLE);
    280             ReturnTypeInfo.type = DEF_SINGLE;
     284            if( isCallOn ) Opcode_Func_GetPtrData(Parameter,DEF_SINGLE);
     285            resultType.SetBasicType( DEF_SINGLE );
    281286            break;
    282287        case FUNC_GETQWORD:
    283             Opcode_Func_GetPtrData(Parameter,DEF_QWORD);
    284             ReturnTypeInfo.type = DEF_QWORD;
     288            if( isCallOn ) Opcode_Func_GetPtrData(Parameter,DEF_QWORD);
     289            resultType.SetBasicType( DEF_QWORD );
    285290            break;
    286291        case FUNC_GETDWORD:
    287             Opcode_Func_GetPtrData(Parameter,DEF_DWORD);
    288             ReturnTypeInfo.type = DEF_DWORD;
     292            if( isCallOn ) Opcode_Func_GetPtrData(Parameter,DEF_DWORD);
     293            resultType.SetBasicType( DEF_DWORD );
    289294            break;
    290295        case FUNC_GETWORD:
    291             Opcode_Func_GetPtrData(Parameter,DEF_WORD);
    292             ReturnTypeInfo.type = DEF_WORD;
     296            if( isCallOn ) Opcode_Func_GetPtrData(Parameter,DEF_WORD);
     297            resultType.SetBasicType( DEF_WORD );
    293298            break;
    294299        case FUNC_GETBYTE:
    295             Opcode_Func_GetPtrData(Parameter,DEF_BYTE);
    296             ReturnTypeInfo.type = DEF_BYTE;
    297             break;
    298     }
    299 }
     300            if( isCallOn ) Opcode_Func_GetPtrData(Parameter,DEF_BYTE);
     301            resultType.SetBasicType( DEF_BYTE );
     302            break;
     303        default:
     304            return false;
     305    }
     306    return true;
     307}
  • BasicCompiler64/Compile_Object.cpp

    r73 r75  
    22#include "opcode.h"
    33
    4 void _call_constructor(CClass *pobj_c,const char *CreateParameter,int ObjectSize,BOOL bSomeObjects){
     4void _call_constructor( const CClass *pobj_c,const char *CreateParameter,int ObjectSize,BOOL bSomeObjects){
    55    ////////////////////////////
    66    // コンストラクタの呼び出し
     
    3232    ////////////////////////
    3333
    34     std::vector<SubInfo *> subs;
     34    std::vector<UserProc *> subs;
    3535    pobj_c->EnumMethod( pobj_c->name, subs );
    3636
    37     SubInfo *psi;
     37    UserProc *pUserProc;
    3838    if( subs.size() > 0 ){
    3939        //オーバーロードを解決
    40         psi=OverloadSolutionWithStrParam(pobj_c->name,
    41             subs,CreateParameter,"",NULL);
    42 
    43         if(!psi) return;
     40        pUserProc=OverloadSolutionWithStrParam(pobj_c->name,
     41            subs,CreateParameter,"");
     42
     43        if(!pUserProc) return;
    4444    }
    4545
    4646    //コンストラクタを呼び出す
    4747    Opcode_CallProc(CreateParameter,
    48         psi,
     48        pUserProc,
    4949        PROCFLAG_NEW,"",0);
    5050
     
    7373    }
    7474}
    75 void Operator_New( CClass &classObj, const char *objectSizeStr, const char *parameter, const TYPEINFO &baseTypeInfo ){
     75void Operator_New( const CClass &classObj, const char *objectSizeStr, const char *parameter, const Type &baseType ){
    7676    int typeSize = classObj.GetSize();
    7777
     
    8686
    8787        int reg=REG_RAX;
    88         int type = NumOpe(&reg,objectSizeStr,0,0,0);
    89         if(!IsWholeNumberType(type)) SetError(49,NULL,cp);
     88        Type tempType;
     89        NumOpe(&reg,objectSizeStr,Type(),tempType);
     90        if( !tempType.IsWhole() ) SetError(49,NULL,cp);
    9091
    9192        //※添え字上限値であることを考慮
     
    117118    }
    118119
    119     if( baseTypeInfo.type == DEF_OBJECT ){
    120         //DeleteはGCで処理
     120    if( baseType.IsObject() ){
     121        // オブジェクト インスタンス
     122        // ※DeleteはGCで処理
    121123
    122124        //call _System_GC_malloc_ForObject
    123         extern SubInfo *pSub_System_GC_malloc_ForObject;
     125        extern UserProc *pSub_System_GC_malloc_ForObject;
    124126        op_call(pSub_System_GC_malloc_ForObject);
    125127    }
    126128    else{
    127         //明示的なDeleteが必要
     129        // オブジェクトポインタ
     130        // ※明示的なDeleteが必要
    128131
    129132        //call _System_GC_malloc_ForObjectPtr
    130         extern SubInfo *pSub_System_GC_malloc_ForObjectPtr;
     133        extern UserProc *pSub_System_GC_malloc_ForObjectPtr;
    131134        op_call(pSub_System_GC_malloc_ForObjectPtr);
    132135    }
     
    162165    op_mov_RV(sizeof(_int64),REG_RCX,0);
    163166    obp-=sizeof(long);
    164     pobj_SubAddrSchedule->add(method->psi,0);
    165     method->psi->bUse=1;
     167    pobj_SubAddrSchedule->add(method->pUserProc,0);
     168    method->pUserProc->Using();
    166169    obp+=sizeof(long);
    167170
     
    190193    pobj_sf->pop(REG_RAX);
    191194}
    192 int Operator_New(const char *Parameter,LONG_PTR *plpIndex,const TYPEINFO &baseTypeInfo ){
    193     char TypeName[VN_SIZE],CreateParameter[VN_SIZE],objectSizeStr[VN_SIZE];
    194     int i,i2;
    195 
    196     i=0;
    197 
    198     if(Parameter[0]=='['){
    199         i=GetStringInBracket(objectSizeStr,Parameter);
    200 
    201         SlideString(objectSizeStr+1,-1);
    202         objectSizeStr[i-2]=0;
    203     }
    204     else objectSizeStr[0]=0;
    205 
    206     for(i2=0;;i++,i2++){
    207         if(Parameter[i]=='('){
    208             TypeName[i2]=0;
    209 
    210             //コンストラクタに渡すパラメータを取得
    211             i2=GetStringInPare(CreateParameter,Parameter+i);
    212             RemoveStringPare(CreateParameter);
    213             i+=i2;
    214             if(Parameter[i]!='\0'){
    215                 SetError(42,NULL,cp);
    216                 return 0;
    217             }
    218             break;
    219         }
    220         TypeName[i2]=Parameter[i];
    221         if(Parameter[i]=='\0'){
    222             CreateParameter[0]=0;
    223             break;
    224         }
    225     }
    226 
    227     int type;
    228     type=GetTypeFixed(TypeName,plpIndex);
    229     if(type==-1){
    230         SetError(3,TypeName,cp);
    231         return 0;
    232     }
    233 
    234     if(type!=DEF_OBJECT){
    235         ////////////////////////
    236         // 通常のデータ型の場合
    237         ////////////////////////
    238 
    239         SetError(121,NULL,cp);
    240         return 0;
    241     }
    242 
    243     CClass *pobj_c;
    244     pobj_c=(CClass *)*plpIndex;
    245 
    246     Operator_New( *pobj_c, objectSizeStr, CreateParameter, baseTypeInfo );
    247 
    248     if( baseTypeInfo.type == DEF_OBJECT ){
    249         return DEF_OBJECT;
    250     }
    251     return DEF_PTR_OBJECT;
    252 }
    253 
    254195void OpcodeDelete(const char *Parameter, bool isSweeping){
    255     int type;
    256 
    257196    int reg=REG_RAX;
    258     type=NumOpe(&reg,Parameter,0,0,0);
    259     if(type==-1) return;
    260     if(!(type==DEF_PTR_OBJECT||type==DEF_PTR_VOID)) SetError(122,NULL,cp);
     197    Type tempType;
     198    if( !NumOpe(&reg,Parameter,Type(),tempType) ){
     199        return;
     200    }
     201    if(!( tempType.IsObjectPtr() || tempType.IsVoidPtr() )) SetError(122,NULL,cp);
    261202
    262203    //sub rax,PTR_SIZE*3
     
    328269    if( isSweeping ){
    329270        //call _System_GC_free_for_SweepingDelete
    330         extern SubInfo *pSub_System_GC_free_for_SweepingDelete;
     271        extern UserProc *pSub_System_GC_free_for_SweepingDelete;
    331272        op_call(pSub_System_GC_free_for_SweepingDelete);
    332273    }
    333274    else{
    334275        //call free
    335         extern SubInfo *pSub_free;
     276        extern UserProc *pSub_free;
    336277        op_call(pSub_free);
    337278    }
  • BasicCompiler64/Compile_ProcOp.cpp

    r73 r75  
    22#include "Opcode.h"
    33
    4 void SystemProc(char *name){
     4void SystemProc( const char *name ){
    55    if(lstrcmp(name,"_System_GetEip")==0){
    66        //mov rax,qword ptr[rsp]
     
    2222        }
    2323
    24         extern BOOL bCompilingGlobal;
    25         BOOL bBackCompilingGlobal;
    26         bBackCompilingGlobal=bCompilingGlobal;
    27         bCompilingGlobal=1;
     24        UserProc *pBackUserProc;
     25        pBackUserProc = &UserProc::CompilingUserProc();
     26        UserProc::CompileStartForGlobalArea();
    2827
    2928        int BackCp;
     
    5655        *((long *)(OpBuffer+StackFrameSchedule))=pobj_sf->GetFrameSize();
    5756
    58         bCompilingGlobal=bBackCompilingGlobal;
     57        UserProc::CompileStartForUserProc( pBackUserProc );
    5958        cp=BackCp;
    6059
     
    7069        StackFrameSchedule=obp-sizeof(long);
    7170
    72         extern int MaxGlobalVarNum;
    73         extern VARIABLE *GlobalVar;
    74         int i;
    75         for(i=0;i<MaxGlobalVarNum;i++){
    76             if(memicmp(GlobalVar[i].name,"Static%",7)==0){
     71        foreach( Variable *pVar, globalVars ){
     72            if(memicmp(pVar->GetName().c_str(),"Static%",7)==0){
    7773                //コンストラクタ呼び出し
    78                 if(GlobalVar[i].type==DEF_OBJECT){
     74                if( pVar->IsObject() ){
    7975
    8076                    //エラー用
    81                     cp=GlobalVar[i].source_code_address;
    82 
    83                     TYPEINFO TypeInfo;
    84                     TypeInfo.type=GlobalVar[i].type;
    85                     TypeInfo.u.lpIndex=GlobalVar[i].u.index;
     77                    cp=pVar->source_code_address;
     78
    8679                    CallConstructor(
    87                         GlobalVar[i].name,
    88                         GlobalVar[i].SubScripts,
    89                         TypeInfo,
    90                         GlobalVar[i].ConstractParameter);
     80                        pVar->GetName().c_str(),
     81                        pVar->GetSubScriptsPtr(),
     82                        *pVar,
     83                        pVar->paramStrForConstructor.c_str());
    9184                }
    9285            }
     
    107100
    108101
    109         extern BOOL bCompilingGlobal;
    110         BOOL bBackCompilingGlobal;
    111         bBackCompilingGlobal=bCompilingGlobal;
    112         bCompilingGlobal=1;
     102        UserProc *pBackUserProc;
     103        pBackUserProc = &UserProc::CompilingUserProc();
     104        UserProc::CompileStartForGlobalArea();
    113105
    114106        obj_LexScopes.CallDestructorsOfScopeEnd();
    115107
    116         bCompilingGlobal=bBackCompilingGlobal;
     108        UserProc::CompileStartForUserProc( pBackUserProc );
    117109
    118110
     
    204196    }
    205197}
    206 void CompileBufferInProcedure(SubInfo *psi){
     198void CompileBufferInProcedure(UserProc *pUserProc){
    207199    extern char *basbuf;
    208200    extern HANDLE hHeap;
    209     extern SubInfo **ppSubHash;
     201    extern UserProc **ppSubHash;
    210202    extern BOOL bDebugCompile;
    211     int i3,i4,VarSize,BufferSize;
     203    int i3,i4,BufferSize;
    212204    char temporary[VN_SIZE];
    213205
    214206    BufferSize=128;
    215207
    216     if(psi->bUse==0||psi->bCompile) return;
    217 
    218 
    219     psi->bCompile=1;
     208    if( pUserProc->IsUsing() == false || pUserProc->IsCompiled() ) return;
     209
     210    pUserProc->CompleteCompile();
    220211
    221212    extern BOOL bSystemProc;
    222     if(memcmp(psi->name,"_System_",8)==0) bSystemProc=1;
     213    if(memcmp(pUserProc->GetName().c_str(),"_System_",8)==0) bSystemProc=1;
    223214    else bSystemProc=0;
    224215
    225216    extern BOOL bDebugSupportProc;
    226     if(memcmp(psi->name,"_DebugSys_",10)==0){
     217    if(memcmp(pUserProc->GetName().c_str(),"_DebugSys_",10)==0){
    227218        if(!bDebugCompile){
    228             psi->pVar=(VARIABLE *)HeapAlloc(hHeap,0,1);
    229             psi->VarNum=0;
     219            pUserProc->localVars.clear();
    230220            return;
    231221        }
     
    234224    else bDebugSupportProc=0;
    235225
    236     psi->CompileAddress=obp;
    237 
    238     if(psi->bSystem){
     226    pUserProc->beginOpAddress=obp;
     227
     228    if(pUserProc->IsSystem()){
    239229        ////////////////////
    240230        // 特殊関数
     
    250240        pobj_sf=new CStackFrame();
    251241
    252         SystemProc(psi->name);
     242        SystemProc(pUserProc->GetName().c_str());
    253243
    254244        //スタックフレーム管理用オブジェクトを破棄
     
    256246        pobj_sf=0;
    257247
    258         psi->EndOpAddr=obp;
    259         psi->pVar=(VARIABLE *)HeapAlloc(hHeap,0,1);
    260         psi->VarNum=0;
     248        pUserProc->endOpAddress=obp;
     249        pUserProc->localVars.clear();
    261250        return;
    262251    }
    263252
    264     cp=psi->address;
     253    cp=pUserProc->GetCodePos();
    265254    for(;;cp++){
    266255        if(IsCommandDelimitation(basbuf[cp])) break;
     
    303292
    304293    //ローカル変数に関する情報
    305     extern VARIABLE *LocalVar;
    306     extern int MaxLocalVarNum;
    307294    extern int AllLocalVarSize;
    308     LocalVar=(VARIABLE *)HeapAlloc(hHeap,0,sizeof(VARIABLE));
    309     MaxLocalVarNum=0;
    310295    AllLocalVarSize=0;
     296    pUserProc->localVars.clear();
    311297
    312298    //ローカル変数アドレススケジュール
     
    324310    /////////////////////////////////////
    325311
    326     for(i3=psi->RealParmNum-1;i3>=0;i3--){
    327         //変数データを追加
    328         LocalVar=(VARIABLE *)HeapReAlloc(hHeap,0,LocalVar,(MaxLocalVarNum+1)*sizeof(VARIABLE));
    329 
    330         lstrcpy(LocalVar[MaxLocalVarNum].name,psi->realParams[i3].GetVarName.c_str());
    331 
    332         // TODO: パラメータのConst定義の指定が未完成
    333         LocalVar[MaxLocalVarNum].bConst=false;
    334 
    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();
    339         if(LocalVar[MaxLocalVarNum].type==DEF_OBJECT
    340             ||LocalVar[MaxLocalVarNum].type==DEF_STRUCT){
    341                 if(psi->bExport)
    342                     SetError(24,NULL,cp);
    343         }
    344 
    345         LocalVar[MaxLocalVarNum].u.index=psi->realParams[i3].GetIndex();
    346 
    347         if(psi->realParams[i3].IsRef() == false&&psi->realParams[i3].IsStruct()){
     312    //パラメータ用の変数データを考慮
     313    for(i3=(int)pUserProc->RealParams().size()-1;i3>=0;i3--){
     314        Parameter &param = *pUserProc->RealParams()[i3];
     315
     316        Variable *pVar = new Variable( param.GetVarName(), param, false, param.IsRef() );
     317
     318        if( param.IsArray() ){
     319            pVar->SetArray( param.GetSubScriptsPtr() );
     320        }
     321
     322        int varSize;
     323        if( param.IsRef() == false && param.IsStruct() ){
    348324            //構造体のByValパラメータ
    349             LocalVar[MaxLocalVarNum].fRef=REF_PARAMETER | OBJECT_PARAMETER;
    350             VarSize=PTR_SIZE;
     325            pVar->ThisIsParameter();
     326            varSize=PTR_SIZE;
    351327        }
    352328        else{
    353             if(psi->realParams[i3].IsRef() == false&&psi->realParams[i3].IsArray()){
    354                 LocalVar[MaxLocalVarNum].fRef=0;
    355                 VarSize=GetTypeSize(LocalVar[MaxLocalVarNum].type,LocalVar[MaxLocalVarNum].u.index);
    356                 if(VarSize%PTR_SIZE) VarSize+=PTR_SIZE-(VarSize%PTR_SIZE);
     329            if( param.IsArray() == false ){
     330                varSize = pVar->GetMemorySize();
    357331            }
    358332            else{
    359                 LocalVar[MaxLocalVarNum].fRef=REF_PARAMETER;
    360                 VarSize=PTR_SIZE;
    361             }
    362         }
    363         AllLocalVarSize+=VarSize;
    364         LocalVar[MaxLocalVarNum].offset=AllLocalVarSize;
     333                varSize=PTR_SIZE;
     334            }
     335        }
     336        AllLocalVarSize+=varSize;
     337        pVar->offset=AllLocalVarSize;
    365338
    366339        //レキシカルスコープ情報
    367         LocalVar[MaxLocalVarNum].ScopeLevel=obj_LexScopes.GetNowLevel();
    368         LocalVar[MaxLocalVarNum].ScopeStartAddress=obj_LexScopes.GetStartAddress();
    369         LocalVar[MaxLocalVarNum].bLiving=TRUE;
    370 
    371         MaxLocalVarNum++;
     340        pVar->ScopeLevel=obj_LexScopes.GetNowLevel();
     341        pVar->ScopeStartAddress=obj_LexScopes.GetStartAddress();
     342        pVar->bLiving=TRUE;
     343
     344        pUserProc->localVars.push_back( pVar );
    372345    }
    373346
     
    377350
    378351    //コンパイル中の関数が属するクラス
    379     pobj_CompilingClass=psi->pobj_ParentClass;
    380    
     352    pobj_CompilingClass=pUserProc->GetParentClassPtr();
     353
    381354    //コンパイルスタートをクラス管理クラスに追加
    382     pobj_DBClass->StartCompile( psi );
     355    pobj_DBClass->StartCompile( pUserProc );
    383356
    384357    //コンパイル中の関数
    385     extern SubInfo *pCompilingSubInfo;
    386     pCompilingSubInfo=psi;
     358    UserProc::CompileStartForUserProc( pUserProc );
    387359
    388360    //スタックフレーム管理用クラスを初期化
     
    394366    // ここからコード生成
    395367
    396     for(i3=psi->RealParmNum-1;i3>=0;i3--){
     368    for(i3=(int)pUserProc->RealParams().size()-1;i3>=0;i3--){
     369        Parameter &param = *pUserProc->RealParams()[i3];
    397370        if(i3==3){
    398             if(psi->realParams[i3].IsReal()&&psi->realParams[i3].IsRef() == false){
     371            if(param.IsReal()&&param.IsRef() == false){
    399372                //movsd qword ptr[rsp+0x20],xmm3
    400373                op_movsd_MR(REG_XMM3,REG_RSP,0x20,MOD_BASE_DISP32);
     
    406379        }
    407380        if(i3==2){
    408             if(psi->realParams[i3].IsReal()&&psi->realParams[i3].IsRef() == false){
     381            if(param.IsReal()&&param.IsRef() == false){
    409382                //movsd qword ptr[rsp+0x18],xmm2
    410383                op_movsd_MR(REG_XMM2,REG_RSP,0x18,MOD_BASE_DISP32);
     
    416389        }
    417390        if(i3==1){
    418             if(psi->realParams[i3].IsReal()&&psi->realParams[i3].IsRef() == false){
     391            if(param.IsReal()&&param.IsRef() == false){
    419392                //movsd qword ptr[rsp+0x10],xmm1
    420393                op_movsd_MR(REG_XMM1,REG_RSP,0x10,MOD_BASE_DISP32);
     
    426399        }
    427400        if(i3==0){
    428             if(psi->realParams[i3].IsReal()&&psi->realParams[i3].IsRef() == false){
     401            if(param.IsReal()&&param.IsRef() == false){
    429402                //movsd qword ptr[rsp+0x8],xmm0
    430403                op_movsd_MR(REG_XMM0,REG_RSP,0x8,MOD_BASE_DISP32);
     
    458431    BaseLocalVar=AllLocalVarSize;
    459432
    460     if(psi->ReturnType!=DEF_NON){
     433    if( !pUserProc->ReturnType().IsNull() ){
    461434        //戻り値が存在するとき
    462435
    463         char *temp;
    464         if(psi->name[0]==1&&psi->name[1]==ESC_OPERATOR) temp="_System_ReturnValue";
    465         else temp=psi->name;
    466 
    467         if(psi->ReturnType==DEF_STRUCT && psi->isReturnRef == false){
     436        const char *temp = pUserProc->GetName().c_str();
     437        if( temp[0]==1&&temp[1]==ESC_OPERATOR ){
     438            temp = "_System_ReturnValue";
     439        }
     440
     441        if( pUserProc->ReturnType().IsStruct() ){
    468442            //戻り値用の構造体(値型)はパラメータで引き渡される
    469443        }
    470444        else{
    471445            //戻り値用の変数の定義
    472             if( psi->isReturnRef ){
    473                 sprintf(temporary,"%c%c",1,ESC_BYREF);
    474             }
    475             else temporary[0]=0;
    476 
    477             sprintf(temporary+lstrlen(temporary),"%s%c%c",temp,1,ESC_AS);
    478             GetTypeName(psi->ReturnType,psi->u.ReturnIndex,temporary+lstrlen(temporary));
     446            sprintf(temporary,"%s%c%c%s",temp,1,ESC_AS, pUserProc->ReturnType().ToString().c_str() );
    479447
    480448            OpcodeDim(temporary,0);
     
    497465
    498466        //call _DebugSys_StartProc
    499         extern SubInfo *pSub_DebugSys_StartProc;
     467        extern UserProc *pSub_DebugSys_StartProc;
    500468        op_call(pSub_DebugSys_StartProc);
    501469    }
    502470
    503471    if(pobj_CompilingClass){
    504         if(lstrcmp(psi->name,pobj_CompilingClass->name)==0){
     472        if( pUserProc->GetName() == pobj_CompilingClass->name ){
    505473            ////////////////////////////////////
    506474            // コンストラクタをコンパイルするとき
     
    550518
    551519                    Opcode_CallProc(temporary,
    552                         pobj_CompilingClass->pobj_InheritsClass->GetConstructorMethod()->psi,
     520                        pobj_CompilingClass->pobj_InheritsClass->GetConstructorMethod()->pUserProc,
    553521                        0,
    554522                        "",
     
    558526                    //基底クラスのコンストラクタを暗黙的に呼び出す
    559527                    Opcode_CallProc("",
    560                         pobj_CompilingClass->pobj_InheritsClass->GetConstructorMethod()->psi,
     528                        pobj_CompilingClass->pobj_InheritsClass->GetConstructorMethod()->pUserProc,
    561529                        0,
    562530                        "",
     
    568536            for(i3=0;i3<pobj_CompilingClass->iMemberNum;i3++){
    569537                CMember *pMember = pobj_CompilingClass->ppobj_Member[i3];
    570                 if(pMember->TypeInfo.type==DEF_OBJECT){
     538                if(pMember->IsObject()){
    571539                    // オブジェクトメンバを発見したとき
    572540
     
    574542                        pMember->name,
    575543                        1, ESC_NEW,
    576                         pMember->TypeInfo.u.pobj_Class->name );
     544                        pMember->GetClass().name );
    577545                    OpcodeCalc( temporary );
    578546                }
     
    598566            }
    599567        }
    600         else if(psi->name[0]=='~'){
     568        else if( pUserProc->IsDestructor() ){
    601569            //デストラクタをコンパイルしたとき
    602570
     
    609577    //////////////////////////////////////////
    610578    ////// プロシージャ内をコンパイル ////////
    611     if(psi->dwType==SUBTYPE_SUB) CompileBuffer(ESC_ENDSUB,0);
    612     else if(psi->dwType==SUBTYPE_FUNCTION) CompileBuffer(ESC_ENDFUNCTION,0);
    613     else if(psi->dwType==SUBTYPE_MACRO) CompileBuffer(ESC_ENDMACRO,0);
     579    if(pUserProc->IsMacro()) CompileBuffer(ESC_ENDMACRO,0);
     580    else{
     581        if(pUserProc->IsSub()) CompileBuffer(ESC_ENDSUB,0);
     582        else if(pUserProc->IsFunction()) CompileBuffer(ESC_ENDFUNCTION,0);
     583    }
    614584    //////////////////////////////////////////
    615585    //////////////////////////////////////////
     
    623593            pobj_CompilingClass->NotifyFinishConstructorCompile();
    624594        }
    625         else if(psi->name[0]=='~'){
     595        else if( pUserProc->IsDestructor() ){
    626596            ////////////////////////////////////
    627597            //デストラクタをコンパイルしたとき
     
    638608                if( method ){
    639609                    Opcode_CallProc("",
    640                         method->psi,
     610                        method->pUserProc,
    641611                        0,
    642612                        "",
     
    659629                int offset = pobj_CompilingClass->GetMemberOffset( pMember->name, NULL );
    660630
    661                 if(pMember->TypeInfo.type==DEF_OBJECT){
    662                     CMethod *method = pMember->TypeInfo.u.pobj_Class->GetDestructorMethod();
     631                if(pMember->IsObject()){
     632                    CMethod *method = pMember->GetClass().GetDestructorMethod();
    663633                    if( method ){
    664634                        for(i4=MemberObjectNum-1;i4>=0;i4--){
     
    670640
    671641                            //call destructor
    672                             op_call(method->psi);
     642                            op_call(method->pUserProc);
    673643                        }
    674644                    }
     
    705675    HeapDefaultFree(WithInfo.pWithCp);
    706676
    707     //重複エラー情報管理のメモリを解放
    708     for(i3=0;i3<SynonymErrorNum;i3++) HeapDefaultFree(SynonymErrorWords[i3]);
    709     HeapDefaultFree(SynonymErrorWords);
    710 
    711677    //ローカルオブジェクト(レキシカルスコープレベル=0)の解放処理
    712678    obj_LexScopes.CallDestructorsOfScopeEnd();
     
    720686    if(bDebugCompile&&bDebugSupportProc==0){
    721687        //call _DebugSys_EndProc
    722         extern SubInfo *pSub_DebugSys_EndProc;
     688        extern UserProc *pSub_DebugSys_EndProc;
    723689        op_call(pSub_DebugSys_EndProc);
    724690    }
    725691
    726     if(psi->ReturnType!=DEF_NON){
     692    if( !pUserProc->ReturnType().IsNull() ){
    727693        //////////////////////////////////
    728694        // 戻り値をraxまたはxmm0に設定
     
    730696
    731697        RELATIVE_VAR RelativeVar;
    732         LONG_PTR lpIndex;
    733 
    734         char *temp;
    735         if(psi->name[0]==1&&psi->name[1]==ESC_OPERATOR)
     698
     699        const char *temp = pUserProc->GetName().c_str();
     700        if( temp[0]==1 && temp[1]==ESC_OPERATOR ){
    736701            temp="_System_ReturnValue";
    737         else temp=psi->name;
    738         GetVarOffsetReadWrite(temp,&i3,&RelativeVar,&lpIndex);
    739 
    740         i3=psi->ReturnType;
     702        }
     703        GetVarOffsetReadWrite(temp,&RelativeVar,Type());
     704
     705        i3=pUserProc->ReturnType().GetBasicType();
    741706
    742707        if(i3==DEF_OBJECT || i3==DEF_STRUCT){
     
    772737    }
    773738    HeapDefaultFree(pLocalVarAddrSchedule);
    774     for(i3=0;i3<MaxLocalVarNum;i3++){
     739    foreach( Variable *pVar, pUserProc->localVars ){
    775740        //後にデバッグで利用する
    776         LocalVar[i3].offset=AllLocalVarSize+pobj_sf->GetFrameSize()-LocalVar[i3].offset;
     741        pVar->offset = AllLocalVarSize + pobj_sf->GetFrameSize() - pVar->offset;
    777742    }
    778743
     
    812777
    813778
    814     psi->EndOpAddr=obp;
    815     psi->pVar=LocalVar;
    816     psi->VarNum=MaxLocalVarNum;
    817 
    818     //ローカル変数のネーム情報は後に解放する
     779    pUserProc->endOpAddress=obp;
     780
     781
     782    //重複エラー情報管理のメモリを解放
     783    for(i3=0;i3<SynonymErrorNum;i3++) HeapDefaultFree(SynonymErrorWords[i3]);
     784    HeapDefaultFree(SynonymErrorWords);
    819785}
    820786void CompileLocal(){
    821     extern SubInfo **ppSubHash;
     787    extern UserProc **ppSubHash;
    822788    int i2;
    823     SubInfo *psi;
     789    UserProc *pUserProc;
    824790
    825791    extern BOOL bDll;
    826792    if(bDll){
    827793        //DLLの場合はグローバル変数を初期化するための関数を一番初めにコンパイルする
    828         psi=GetSubHash("_System_InitDllGlobalVariables");
    829         if(psi){
    830             CompileBufferInProcedure(psi);
     794        pUserProc=GetSubHash("_System_InitDllGlobalVariables");
     795        if(pUserProc){
     796            CompileBufferInProcedure(pUserProc);
    831797        }
    832798        else SetError(300,NULL,cp);
     
    835801    //_System_InitStaticLocalVariablesは一番最後にコンパイル
    836802    //※一般関数内の静的変数オブジェクトをすべて収集しなければならない
    837     extern SubInfo *pSub_System_InitStaticLocalVariables;
    838     pSub_System_InitStaticLocalVariables->bCompile=1;
     803    extern UserProc *pSub_System_InitStaticLocalVariables;
     804    pSub_System_InitStaticLocalVariables->CompleteCompile();
    839805
    840806    //_System_Call_Destructor_of_GlobalObjectは一番最後にコンパイル
    841     extern SubInfo *pSub_System_Call_Destructor_of_GlobalObject;
    842     pSub_System_Call_Destructor_of_GlobalObject->bCompile=1;
     807    extern UserProc *pSub_System_Call_Destructor_of_GlobalObject;
     808    pSub_System_Call_Destructor_of_GlobalObject->CompleteCompile();
    843809
    844810Repeat:
    845811    for(i2=0;i2<MAX_HASH;i2++){
    846         psi=ppSubHash[i2];
    847         while(psi){
    848             CompileBufferInProcedure(psi);
    849             psi=psi->pNextData;
     812        pUserProc=ppSubHash[i2];
     813        while(pUserProc){
     814            CompileBufferInProcedure(pUserProc);
     815            pUserProc=pUserProc->pNextData;
    850816        }
    851817    }
     
    853819    //プロシージャコンパイルによって、プロシージャコンパイルが必要になる場合
    854820    for(i2=0;i2<MAX_HASH;i2++){
    855         psi=ppSubHash[i2];
    856         while(psi){
    857             if(psi->bUse&&psi->bCompile==0&&psi->bVirtual==0){
     821        pUserProc=ppSubHash[i2];
     822        while(pUserProc){
     823            if( pUserProc->IsUsing() && pUserProc->IsCompiled() == false ){
    858824                goto Repeat;
    859825            }
    860826
    861             psi=psi->pNextData;
     827            pUserProc=pUserProc->pNextData;
    862828        }
    863829    }
    864830
    865831    //_System_InitStaticLocalVariablesは一番最後にコンパイル
    866     pSub_System_InitStaticLocalVariables->bCompile=0;
     832    pSub_System_InitStaticLocalVariables->KillCompileStatus();
    867833    CompileBufferInProcedure(pSub_System_InitStaticLocalVariables);
    868834
    869835    //_System_Call_Destructor_of_GlobalObjectは一番最後にコンパイル
    870     pSub_System_Call_Destructor_of_GlobalObject->bCompile=0;
     836    pSub_System_Call_Destructor_of_GlobalObject->KillCompileStatus();
    871837    CompileBufferInProcedure(pSub_System_Call_Destructor_of_GlobalObject);
    872838}
  • BasicCompiler64/Compile_Set_Var.cpp

    r73 r75  
    77}
    88
    9 void SetStructVariableFromRax(LONG_PTR lpVarIndex,int CalcType,LONG_PTR lpCalcIndex,RELATIVE_VAR *pRelativeVar,BOOL bUseHeap){
     9void SetStructVariableFromRax( const Type &varType, const Type &calcType, RELATIVE_VAR *pRelativeVar,BOOL bUseHeap){
    1010    int RightTermReg;
    1111    pobj_reg=new CRegister(REG_RCX);
     
    1717
    1818    //右辺
    19     if(IsRealNumberType(CalcType)){
     19    if( calcType.IsReal() ){
    2020        RightTermReg=pobj_reg->LockXmmReg();
    2121
    22         if(CalcType==DEF_DOUBLE){
     22        if( calcType.IsDouble() ){
    2323            //movlsd RightTermReg,xmm0
    2424            op_movsd_RR(RightTermReg,REG_XMM0);
    2525        }
    26         else if(CalcType==DEF_SINGLE){
     26        else if( calcType.IsSingle() ){
    2727            //movlss RightTermReg,xmm0
    2828            op_movss_RR(RightTermReg,REG_XMM0);
     
    6262*/
    6363    //右辺用レジスタを解除
    64     if(IsRealNumberType(CalcType)) pobj_reg->UnlockXmmReg();
     64    if( calcType.IsReal() ) pobj_reg->UnlockXmmReg();
    6565    else pobj_reg->UnlockReg();
    6666
     
    7373
    7474
    75     if( CalcType == DEF_STRUCT ){
    76         CClass *pVarClass = (CClass *)lpVarIndex;
    77         CClass *pCalcClass = (CClass *)lpCalcIndex;
    78 
    79         if( pVarClass->IsEquals( pCalcClass ) ){            //等しい
     75    if( calcType.IsStruct() ){
     76        if( varType.GetClass().IsEquals( &calcType.GetClass() ) ){          //等しい
    8077
    8178                //双方のオブジェクト型が一致、または派生・継承関係にあるとき
     
    8885                op_mov_RR(REG_RDI,VarReg);
    8986
    90                 CClass *pClass = (CClass *)lpVarIndex;
    91                 int object_size = pClass->GetSize();
     87                int object_size = varType.GetClass().GetSize();
    9288
    9389                //mov rcx,object_size
     
    107103
    108104                    //call free
    109                     extern SubInfo *pSub_free;
     105                    extern UserProc *pSub_free;
    110106                    op_call(pSub_free);
    111107                }
  • BasicCompiler64/Compile_Statement.cpp

    r73 r75  
    55    int i,i2;
    66    char buffer[8192];
    7     SubInfo *psi;
     7    UserProc *pUserProc;
    88
    99    for(i=0;;i++){
     
    4141        //////////////////////////////
    4242
    43         psi=GetSubHash(Command);
     43        pUserProc=GetSubHash(Command);
    4444
    4545        //GetSubHash内でエラー提示が行われた場合
    46         if(psi==(SubInfo *)-1) return;
    47 
    48         if(psi==0){
     46        if(pUserProc==(UserProc *)-1) return;
     47
     48        if(pUserProc==0){
    4949            char temporary[VN_SIZE];
    5050            lstrcpy(temporary,Command);
    5151
    5252            CharUpper(temporary);
    53             psi=GetSubHash(temporary);
     53            pUserProc=GetSubHash(temporary);
    5454
    5555            //GetSubHash内でエラー提示が行われた場合
    56             if(psi==(SubInfo *)-1) return;
    57         }
    58 
    59         if(psi){
    60             if(psi->dwType!=SUBTYPE_MACRO) SetError(10,Command,cp);
    61 
    62             Opcode_CallProc("",psi,0,"",0);
     56            if(pUserProc==(UserProc *)-1) return;
     57        }
     58
     59        if(pUserProc){
     60            if( !pUserProc->IsMacro() ) SetError(10,Command,cp);
     61
     62            Opcode_CallProc("",pUserProc,0,"",0);
    6363
    6464            return;
     
    7272
    7373    int idProc;
    74     void *pInfo;
    75     idProc=GetProc(buffer,&pInfo);
     74    void *pProc;
     75    idProc=GetProc(buffer,(void **)&pProc);
    7676
    7777    int i4;
     
    9191        ////////////////
    9292
    93         LONG_PTR lp;
    94         i2=CallProc(idProc,pInfo,buffer,temp2,&lp);
     93        Type resultType;
     94        CallProc(idProc,pProc,buffer,temp2,resultType);
    9595
    9696
     
    9999        /////////////////////
    100100
    101         if(i2==DEF_STRUCT){
     101        if( resultType.IsStruct() ){
    102102            //mov r14,rax
    103103            op_mov_RR(REG_R14,REG_RAX);
    104104
    105             FreeTempObject(REG_R14,(CClass *)lp);
     105            FreeTempObject(REG_R14,&resultType.GetClass());
    106106        }
    107107        return;
     
    116116
    117117void Judgment(char *buffer){
    118     int reg=REG_RAX,type;
    119     type=NumOpe(&reg,buffer,0,0,0);
     118    int reg=REG_RAX;
     119    Type resultType;
     120    if( !NumOpe(&reg,buffer,Type(),resultType) ){
     121        return;
     122    }
    120123
    121124    int offset;
    122125
    123     if(type==DEF_DOUBLE){
     126    if(resultType.IsDouble()){
    124127        double dbl=0;
    125128        offset=dataTable.Add( dbl );
     
    135138        obp+=sizeof(long);
    136139    }
    137     else if(type==DEF_SINGLE){
     140    else if(resultType.IsSingle()){
    138141        float flt=0;
    139142        offset=dataTable.Add( flt );
     
    152155
    153156        //cmp rax,0
    154         op_cmp_value(GetTypeSize(type,-1),REG_RAX,0);
     157        op_cmp_value(resultType.GetSize(),REG_RAX,0);
    155158    }
    156159}
     
    340343void OpcodeFor(char *Parameter){
    341344    extern HANDLE hHeap;
     345    Type resultType;
    342346    int i,i2,i3;
    343347    char temporary[VN_SIZE],variable[VN_SIZE],JudgeNum[VN_SIZE],StepNum[VN_SIZE];
     
    400404    sprintf(temporary,"(%s)>=0",StepNum);
    401405
    402     int reg,type;
     406    int reg;
    403407    reg=REG_RAX;
    404     type=NumOpe(&reg,temporary,0,0,0);
     408    if( !NumOpe(&reg,temporary,Type(),resultType) ){
     409        return;
     410    }
    405411
    406412    //cmp rax,0
    407     op_cmp_value(GetTypeSize(type,-1),REG_RAX,0);
     413    op_cmp_value(resultType.GetSize(),REG_RAX,0);
    408414
    409415    //je [カウンタ減少の場合の判定]
     
    417423
    418424    reg=REG_RAX;
    419     type=NumOpe(&reg,temporary,0,0,0);
     425    NumOpe(&reg,temporary,Type(),Type());
    420426
    421427    //jmp [カウンタ減少の場合の判定を飛び越す]
     
    430436
    431437    reg=REG_RAX;
    432     type=NumOpe(&reg,temporary,0,0,0);
     438    NumOpe(&reg,temporary,Type(),resultType);
    433439
    434440    *((long *)(OpBuffer+i3))=obp-(i3+sizeof(long)); //jmpジャンプ先のオフセット値
    435441
    436442    //cmp rax,0
    437     op_cmp_value(GetTypeSize(type,-1),REG_RAX,0);
     443    op_cmp_value(resultType.GetSize(),REG_RAX,0);
    438444
    439445ErrorStep:
     
    583589    extern HANDLE hHeap;
    584590
    585     extern BOOL bCompilingGlobal;
    586     if(bCompilingGlobal){
     591    if( UserProc::IsGlobalAreaCompiling() ){
    587592        SetError(12,"Exit Sub/Function",cp);
    588593        return;
     
    611616    CaseScheduleNum++;
    612617}
    613 void OpcodeSelect(char *Parameter){
     618void OpcodeSelect( const char *lpszParms ){
    614619    extern DWORD *pCaseSchedule;
    615620    extern int CaseScheduleNum;
     
    631636    NowCaseSchedule=0;
    632637
    633     int reg1=REG_RAX,type1;
    634     LONG_PTR lpIndex;
    635     type1=NumOpe(&reg1,Parameter,0,0,&lpIndex);
    636 
    637     if(type1==DEF_DOUBLE){
     638    int reg1=REG_RAX;
     639    Type type1;
     640    if( !NumOpe(&reg1,lpszParms,Type(), type1 ) ){
     641        return;
     642    }
     643
     644    if(type1.IsDouble()){
    638645        //movsd qword ptr[rsp+offset],xmm_reg       ※スタックフレームを利用
    639646        pobj_sf->push(reg1,sizeof(double));
    640647    }
    641     else if(type1==DEF_SINGLE){
     648    else if(type1.IsSingle()){
    642649        //movss dword ptr[rsp+offset],xmm_reg       ※スタックフレームを利用
    643650        pobj_sf->push(reg1,sizeof(float));
    644651    }
    645652    else{
    646         ExtendTypeTo64(type1,reg1);
     653        ExtendTypeTo64(type1.GetBasicType(),reg1);
    647654
    648655        //mov qword ptr[rsp+offset],reg     ※スタックフレームを利用
     
    712719                cp=NowCaseCp;
    713720
    714                 int reg2=REG_RDX,type2;
    715                 LONG_PTR lpIndex2;
    716                 type2=NumOpe(&reg2,temporary,type1,lpIndex,&lpIndex2);
     721                int reg2=REG_RDX;
     722                Type type2;
     723                if( !NumOpe(&reg2,temporary,type1,type2) ){
     724                    return;
     725                }
    717726
    718727                cp=i2;
    719728
    720                 if(type1==DEF_OBJECT){
    721                     CClass *pobj_c;
    722                     pobj_c=(CClass *)lpIndex;
    723 
    724                     std::vector<SubInfo *> subs;
    725                     pobj_c->EnumMethod( CALC_EQUAL, subs );
     729                if(type1.IsObject()){
     730                    std::vector<UserProc *> subs;
     731                    type1.GetClass().EnumMethod( CALC_EQUAL, subs );
    726732                    if( subs.size() == 0 ){
    727733                        return;
    728734                    }
    729735
    730                     PARAMETER_INFO *ppi = (PARAMETER_INFO *)HeapAlloc(hHeap,0,sizeof(PARAMETER_INFO)*3);
    731                     int iParmNum=0;
    732                     ppi[iParmNum].bArray=0;
    733                     ppi[iParmNum].bByVal=0;
    734                     ppi[iParmNum].name=0;
    735                     ppi[iParmNum].type=type2;
    736                     ppi[iParmNum].u.index=lpIndex2;
    737                     ppi[iParmNum].SubScripts[0]=-1;
    738                     iParmNum++;
     736                    Parameters params;
     737                    params.push_back( new Parameter( "", Type( type2 ) ) );
    739738
    740739                    //オーバーロードを解決
    741                     SubInfo *psi;
    742                     psi=OverloadSolution("==",subs,ppi,iParmNum,NULL);
    743                     HeapDefaultFree(ppi);
    744 
    745                     if(!psi){
     740                    UserProc *pUserProc;
     741                    pUserProc=OverloadSolution("==",subs, params, NULL);
     742
     743                    delete params[0];
     744
     745                    if(!pUserProc){
    746746                        //エラー
    747747                        return;
     
    759759
    760760                    //call operator_proc    ※ ==演算子
    761                     op_call(psi);
     761                    op_call(pUserProc);
    762762
    763763                    //test rax,rax
     
    769769                }
    770770                else{
    771                     if(type1==DEF_DOUBLE){
     771                    if(type1.IsDouble()){
    772772                        int xmm_reg;
    773773                        if(IsXmmReg(reg2)) xmm_reg=reg2;
    774774                        else xmm_reg=REG_XMM5;
    775                         ChangeTypeToXmm_Double(type2,xmm_reg,reg2);
     775                        ChangeTypeToXmm_Double(type2.GetBasicType(),xmm_reg,reg2);
    776776
    777777                        //movsd xmm4,qword ptr[rsp+offset]  ※スタックフレームから参照
     
    781781                        op_comisd(xmm_reg,REG_XMM4);
    782782                    }
    783                     else if(type1==DEF_SINGLE){
     783                    else if(type1.IsSingle()){
    784784                        int xmm_reg;
    785785                        if(IsXmmReg(reg2)) xmm_reg=reg2;
    786786                        else xmm_reg=REG_XMM5;
    787                         ChangeTypeToXmm_Single(type2,xmm_reg,reg2);
     787                        ChangeTypeToXmm_Single(type2.GetBasicType(),xmm_reg,reg2);
    788788
    789789                        //movss xmm4,dword ptr[rsp+offset]  ※スタックフレームから参照
     
    796796                        //その他整数型
    797797
    798                         i2=NeutralizationType(type1,-1,type2,-1);
     798                        i2=NeutralizationType(type1.GetBasicType(),-1,type2.GetBasicType(),-1);
    799799
    800800                        //mov r14,qword ptr[rsp+offset]     ※スタックフレームから参照
     
    883883
    884884    //call _System_GetEip
    885     extern SubInfo *pSub_System_GetEip;
     885    extern UserProc *pSub_System_GetEip;
    886886    op_call(pSub_System_GetEip);
    887887
     
    938938}
    939939void OpcodeReturn(char *Parameter){
    940     extern BOOL bCompilingGlobal;
    941     if(bCompilingGlobal){
     940    if( UserProc::IsGlobalAreaCompiling() ){
    942941        SetError(62,NULL,cp);
    943942    }
     
    945944        //戻り値をセット
    946945        if(Parameter[0]){
    947             extern SubInfo *pCompilingSubInfo;
    948             char *temp;
    949             if(pCompilingSubInfo->name[0]==1&&pCompilingSubInfo->name[1]==ESC_OPERATOR)
    950                 temp="_System_ReturnValue";
    951             else temp=pCompilingSubInfo->name;
    952 
    953             /*
    954             TODO: 消す
    955             if( pCompilingSubInfo->isReturnRef ){
    956                 //参照型
    957                 SetRefVariable( temp, Parameter );
     946            UserProc &proc = UserProc::CompilingUserProc();
     947
     948            const char *temp = "_System_ReturnValue";
     949            if(proc.GetName()[0]==1&&proc.GetName()[1]==ESC_OPERATOR)
     950            {
    958951            }
    959952            else{
    960                 //値型*/
    961                 char temporary[VN_SIZE];
    962                 sprintf(temporary,"%s=%s",temp,Parameter);
    963                 OpcodeCalc(temporary);
    964             //}
     953                temp=proc.GetName().c_str();
     954            }
     955
     956            char temporary[VN_SIZE];
     957            sprintf(temporary,"%s=%s",temp,Parameter);
     958            OpcodeCalc(temporary);
    965959        }
    966960
     
    972966void Opcode_Input(const char *Parameter){
    973967    extern int cp;
    974     int i2,i3,i4,i5,type;
     968    int i2,i3,i4,i5;
    975969    BOOL bFile;
    976970    char temporary[VN_SIZE],temp2[VN_SIZE],buffer[VN_SIZE];
     
    10541048        }
    10551049
    1056         LONG_PTR lpIndex;
    1057         type = GetVarType(temporary, &lpIndex, 1);
     1050        Type varType;
     1051        if( !GetVarType(temporary, varType, 1) ){
     1052            return;
     1053        }
    10581054
    10591055        sprintf(temp2,"_System_InputDataPtr[%d]=VarPtr(%s)",i4,temporary);
    10601056        OpcodeCalc(temp2);
    10611057
    1062         if(type==DEF_LONG) type=DEF_DWORD;
    1063         else if(type==DEF_INTEGER) type=DEF_WORD;
    1064         else if(type==DEF_OBJECT){
    1065             CClass *pobj_Class=(CClass *)lpIndex;
    1066             if(lstrcmp(pobj_Class->name,"String")==0) type=DEF_STRING;
    1067         }
    1068         sprintf(temp2,"_System_InputDataType[%d]=%d",i4,type);
     1058        if(varType.IsLong()) varType.SetBasicType( DEF_DWORD );
     1059        else if(varType.IsInteger()) varType.SetBasicType( DEF_WORD );
     1060        else if(varType.IsObject()){
     1061            varType.SetBasicType( DEF_OBJECT );
     1062            if( varType.IsStringObject() ){
     1063                varType.SetBasicType( DEF_STRING );
     1064            }
     1065        }
     1066        sprintf(temp2,"_System_InputDataType[%d]=%d",i4,varType.GetBasicType());
    10691067        OpcodeCalc(temp2);
    10701068
     
    10751073    OpcodeCalc(temp2);
    10761074
    1077     SubInfo *psi;
    1078     if(bFile) psi=GetSubHash("INPUT_FromFile");
    1079     else psi=GetSubHash("INPUT_FromPrompt");
    1080     if(!psi){
     1075    UserProc *pUserProc;
     1076    if(bFile) pUserProc=GetSubHash("INPUT_FromFile");
     1077    else pUserProc=GetSubHash("INPUT_FromPrompt");
     1078    if(!pUserProc){
    10811079        SetError(3,"Input",cp);
    10821080        return;
    10831081    }
    1084     Opcode_CallProc(buffer,psi,0,"",0);
     1082    Opcode_CallProc(buffer,pUserProc,0,"",0);
    10851083}
    10861084void Opcode_PrintUsing(const char *Parameter,char *buffer,BOOL bFile){
     
    11771175    OpcodeCalc(temp2);
    11781176
    1179     SubInfo *psi;
    1180     if(bFile) psi=GetSubHash("PRINTUSING_ToFile");
    1181     else psi=GetSubHash("PRINTUSING_ToPrompt");
    1182     if(!psi){
     1177    UserProc *pUserProc;
     1178    if(bFile) pUserProc=GetSubHash("PRINTUSING_ToFile");
     1179    else pUserProc=GetSubHash("PRINTUSING_ToPrompt");
     1180    if(!pUserProc){
    11831181        SetError(3,"Print",cp);
    11841182        return;
    11851183    }
    1186     Opcode_CallProc(buffer,psi,0,"",0);
     1184    Opcode_CallProc(buffer,pUserProc,0,"",0);
    11871185}
    11881186void Opcode_Print(const char *Parameter,BOOL bWrite){
     
    12811279    if(sw) lstrcat(buffer,"+Ex\"\\r\\n\"");
    12821280
    1283     SubInfo *psi;
    1284     if(bFile) psi=GetSubHash("PRINT_ToFile");
    1285     else psi=GetSubHash("PRINT_ToPrompt");
    1286     if(!psi){
     1281    UserProc *pUserProc;
     1282    if(bFile) pUserProc=GetSubHash("PRINT_ToFile");
     1283    else pUserProc=GetSubHash("PRINT_ToPrompt");
     1284    if(!pUserProc){
    12871285        SetError(3,"Print",cp);
    12881286        return;
    12891287    }
    1290     Opcode_CallProc(buffer,psi,0,"",0);
     1288    Opcode_CallProc(buffer,pUserProc,0,"",0);
    12911289}
    12921290
     
    12991297
    13001298void OpcodeSetPtrData(char *Parameter,int type){
    1301     int i,i2;
     1299    int i;
    13021300    char temporary[VN_SIZE];
    13031301
     
    13211319
    13221320    int reg_ptr=REG_RAX;
    1323     i2=NumOpe(&reg_ptr,temporary,0,0,0);
    1324     if(!IsWholeNumberType(i2)){
     1321    Type resultType;
     1322    if( !NumOpe(&reg_ptr,temporary,Type(),resultType) ){
     1323        return;
     1324    }
     1325    if(!resultType.IsWhole()){
    13251326        SetError(11,Parameter,cp);
    13261327        return;
     
    13381339
    13391340    int temp_reg=REG_NON;
    1340     i2=NumOpe(&temp_reg,temporary,0,0,0);
     1341    if( !NumOpe(&temp_reg,temporary,Type(),resultType) ){
     1342        return;
     1343    }
    13411344
    13421345    //レジスタのブロッキングを解除
     
    13441347
    13451348    if(type==DEF_DOUBLE){
    1346         ChangeTypeToXmm_Double(i2,REG_XMM0,temp_reg);
     1349        ChangeTypeToXmm_Double(resultType.GetBasicType(),REG_XMM0,temp_reg);
    13471350
    13481351        //movsd qword ptr[reg_ptr],xmm0
     
    13501353    }
    13511354    else if(type==DEF_SINGLE){
    1352         ChangeTypeToXmm_Single(i2,REG_XMM0,temp_reg);
     1355        ChangeTypeToXmm_Single(resultType.GetBasicType(),REG_XMM0,temp_reg);
    13531356
    13541357        //movss dword ptr[reg_ptr],xmm0
     
    13561359    }
    13571360    else{
    1358         ChangeTypeToWhole(i2,type,REG_RCX,temp_reg);
     1361        ChangeTypeToWhole(resultType.GetBasicType(),type,REG_RCX,temp_reg);
    13591362
    13601363        //mov ptr[reg_ptr],rcx
  • BasicCompiler64/Compile_Var.cpp

    r73 r75  
    33
    44//変数
    5 VARIABLE *GlobalVar;
     5Variables globalVars;
    66int MaxGlobalVarNum;
    77int AllGlobalVarSize;
    88int AllInitGlobalVarSize;
    9 VARIABLE *LocalVar;
     9
    1010int MaxLocalVarNum;
    1111int AllLocalVarSize;
    1212
    1313
    14 void SetRelativeOffset(int *pType,LONG_PTR lpIndex,RELATIVE_VAR *pRelativeVar,char *lpPtrOffset){
    15     int i2;
    16 
    17 
     14void SetRelativeOffset( Type &resultType, RELATIVE_VAR *pRelativeVar,const char *lpPtrOffset){
    1815    /////////////////////////////////////////////
    1916    // 先頭ポインタをr12に取得してメモリへ退避
     
    3128
    3229    int reg=REG_NON;
    33     i2=NumOpe(&reg,lpPtrOffset,0,0,0);
    34     if(!IsWholeNumberType(i2)) SetError(46,NULL,cp);
    35     ExtendTypeTo64(i2,reg);
     30    Type type;
     31    NumOpe( &reg, lpPtrOffset, Type(), type );
     32    if( !type.IsWhole() ){
     33        SetError(46,NULL,cp);
     34    }
     35    ExtendTypeTo64(type.GetBasicType(),reg);
    3636
    3737    if(reg==REG_R14){
     
    4040    }
    4141
    42     if(PTR_LEVEL(*pType)){
    43         *pType = PTR_LEVEL_DOWN( *pType );
    44 
    45         i2=GetTypeSize(*pType,lpIndex);
    46         if(i2>=2){
     42    if( resultType.PtrLevel() ){
     43        resultType.PtrLevelDown();
     44
     45        int typeSize = resultType.GetSize();
     46        if(typeSize>=2){
    4747            //imul reg,i2
    48             op_imul_RV(sizeof(_int64),reg,i2);
     48            op_imul_RV(sizeof(_int64),reg,typeSize);
    4949        }
    5050    }
     
    8080    }
    8181}
    82 BOOL GetArrayOffset(int *SubScripts,char *array,int type,LONG_PTR lpIndex){
     82bool GetArrayOffset(const int *SubScripts,char *array, const Type &type){
    8383    extern HANDLE hHeap;
    84     int i,i2,i3,i4,TypeSize;
     84    int i,i2,i3,i4;
    8585    char temporary[VN_SIZE],*pParm[MAX_PARMS];
    8686
     
    101101            if(SubScripts[i3]==-1){
    102102                for(i3--;i3>=0;i3--) HeapDefaultFree(pParm[i3]);
    103                 return 0;
     103                return false;
    104104            }
    105105
     
    114114                if(SubScripts[i3]!=-1){
    115115                    for(i3--;i3>=0;i3--) HeapDefaultFree(pParm[i3]);
    116                     return 0;
     116                    return false;
    117117                }
    118118                break;
     
    136136
    137137        int reg=REG_NON;
    138         TYPEINFO TypeInfo;
     138        Type type;
    139139        BOOL bUseHeap;
    140         TypeInfo.type=NumOpe(&reg,pParm[i],DEF_LONG,-1,&TypeInfo.u.lpIndex,&bUseHeap);
    141         if(TypeInfo.type==DEF_OBJECT){
     140        NumOpe( &reg, pParm[i], Type( DEF_LONG ), type, &bUseHeap );
     141        if( type.IsObject() ){
    142142            //キャスト演算子のオーバーロードに対応する
    143143            CallCastOperatorProc(reg,
    144                 TypeInfo.type,TypeInfo.u.lpIndex,
    145                 bUseHeap,DEF_LONG,-1);
    146             TypeInfo.type=DEF_LONG;
    147         }
    148 
    149         if(!IsWholeNumberType(TypeInfo.type)) SetError(46,NULL,cp);
    150         ExtendTypeTo64(TypeInfo.type,reg);
     144                type,
     145                bUseHeap, Type(DEF_LONG) );
     146            type.SetBasicType( DEF_LONG );
     147        }
     148
     149        if( !type.IsWhole() ){
     150            SetError(46,NULL,cp);
     151        }
     152        ExtendTypeTo64( type.GetBasicType(), reg );
    151153
    152154        if(reg==REG_R14){
     
    168170        HeapDefaultFree(pParm[i]);
    169171    }
    170 
    171     TypeSize=GetTypeSize(type,lpIndex);
    172172
    173173    //imul r12,TypeSize
     
    175175    OpBuffer[obp++]=(char)0x69;
    176176    OpBuffer[obp++]=(char)0xE4;
    177     *((long *)(OpBuffer+obp))=TypeSize;
     177    *((long *)(OpBuffer+obp))=type.GetSize();
    178178    obp+=sizeof(long);
    179179
     
    186186    OpBuffer[obp++]=(char)0xDC;
    187187
    188     return 1;
     188    return true;
    189189}
    190 BOOL GetMemberOffset(bool isErrorEnabled, bool isWriteAccess, CClass *pobj_c, char *member, int *pType, RELATIVE_VAR *pRelativeVar, LONG_PTR *plpNestIndex, BOOL bPrivateAccess){
     190bool _member_offset(bool isErrorEnabled, bool isWriteAccess, const CClass &objClass, const char *member, RELATIVE_VAR *pRelativeVar, Type &resultType, BOOL bPrivateAccess){
    191191    int i;
    192192
     
    202202    CClass::RefType refType;
    203203    lstrcpy(VarName,member);
    204     if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember,refType)) return 0;
     204    if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember,refType)) return false;
    205205
    206206
     
    209209    ////////////////////////////
    210210
    211     int offset = pobj_c->GetMemberOffset( VarName, &i );
    212     if(i==pobj_c->iMemberNum){
     211    int offset = objClass.GetMemberOffset( VarName, &i );
     212    if(i==objClass.iMemberNum){
    213213        if(isErrorEnabled) SetError(103,VarName,cp);
    214         return 0;
    215     }
    216 
    217     CMember *pMember=pobj_c->ppobj_Member[i];
     214        return false;
     215    }
     216
     217    CMember *pMember=objClass.ppobj_Member[i];
    218218
    219219
    220220    //アクセシビリティをチェック
    221     if(pobj_c==pobj_CompilingClass){
     221    if(&objClass==pobj_CompilingClass){
    222222        //同一クラスオブジェクトの場合はプライベートアクセスを容認する
    223223        if(pMember->dwAccess==ACCESS_NON){
    224224            if(isErrorEnabled) SetError(107,VarName,cp);
    225             return 0;
     225            return false;
    226226        }
    227227    }
     
    230230            pMember->dwAccess==ACCESS_NON){
    231231            if(isErrorEnabled) SetError(107,VarName,cp);
    232             return 0;
     232            return false;
    233233        }
    234234        else if(bPrivateAccess==0&&pMember->dwAccess==ACCESS_PROTECTED){
    235235            if(isErrorEnabled) SetError(108,VarName,cp);
    236             return 0;
     236            return false;
    237237        }
    238238    }
     
    242242    if( pMember->IsConst() &&       //定数メンバである
    243243        isWriteAccess &&                            //書き込みアクセスを要求されている
    244         pobj_c->IsCompilingConstructor() == false   //コンストラクタ コンパイル中を除く
     244        objClass.IsCompilingConstructor() == false  //コンストラクタ コンパイル中を除く
    245245        ){
    246246            //Const定義の変数に書き込みアクセスをしようとした場合
     
    248248    }
    249249
    250     *pType=pMember->TypeInfo.type;
    251     *plpNestIndex=pMember->TypeInfo.u.lpIndex;
     250    resultType = *pMember;
    252251
    253252    //ポインタ変数の場合
    254     if(IsPtrType(*pType)){
     253    if( resultType.IsPointer() ){
    255254        if(pMember->SubScripts[0]==-1){
    256255            lstrcpy(lpPtrOffset,array);
     
    261260        if(lpPtrOffset[0]){
    262261            if(isErrorEnabled) SetError(16,member,cp);
    263             return 0;
     262            return false;
    264263        }
    265264    }
     
    276275    if(array[0]){
    277276        //配列オフセット
    278         if(!GetArrayOffset(pMember->SubScripts,array,*pType,pMember->TypeInfo.u.lpIndex)){
     277        if(!GetArrayOffset(pMember->SubScripts,array,*pMember)){
    279278            if(isErrorEnabled) SetError(14,member,cp);
    280279        }
    281280    }
    282281    else if(pMember->SubScripts[0]!=-1){
    283         *pType|=FLAG_PTR;
     282        resultType.SetBasicType( resultType.GetBasicType() | FLAG_PTR );
    284283    }
    285284
     
    287286        //入れ子構造の場合
    288287
    289         if(*pType==DEF_OBJECT || *pType==DEF_STRUCT){
     288        if( resultType.IsObject() || resultType.IsStruct() ){
    290289            if( refType != CClass::Dot ){
    291290                if(isErrorEnabled) SetError(104,member,cp);
    292                 return 0;
    293             }
    294 
    295             if( *pType==DEF_OBJECT ){
     291                return false;
     292            }
     293
     294            if( resultType.IsObject() ){
    296295                // 参照内容へのポインタを抽出
    297296                SetRelativeOffset( *pRelativeVar );
    298297            }
    299298        }
    300         else if(*pType==DEF_PTR_OBJECT||*pType==DEF_PTR_STRUCT){
     299        else if( resultType.IsObjectPtr() || resultType.IsStructPtr() ){
    301300            //構造体ポインタ型メンバ変数
    302301
    303302            if(lpPtrOffset[0]){
    304303                //pObj[n].member
    305                 if( ( *pType==DEF_PTR_OBJECT||*pType==DEF_PTR_STRUCT )&& refType != CClass::Dot ){
    306                     if(isErrorEnabled) SetError(104,member,cp);
    307                     return 0;
     304                if( ( resultType.IsObjectPtr() || resultType.IsStructPtr() )
     305                    && refType != CClass::Dot ){
     306                        if(isErrorEnabled) SetError(104,member,cp);
     307                        return false;
    308308                }
    309309
    310310                //直接参照に切り替え
    311                 SetRelativeOffset(pType,*plpNestIndex,pRelativeVar,lpPtrOffset);
     311                SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset);
    312312                pRelativeVar->dwKind=VAR_DIRECTMEM;
    313313
     
    316316            else{
    317317                //pObj->member
    318                 if( ( *pType==DEF_PTR_OBJECT||*pType==DEF_PTR_STRUCT )&& refType != CClass::Pointer ){
    319                     if(isErrorEnabled) SetError(104,member,cp);
    320                     return 0;
     318                if( (resultType.IsObjectPtr() || resultType.IsStructPtr() )
     319                    && refType != CClass::Pointer ){
     320                        if(isErrorEnabled) SetError(104,member,cp);
     321                        return false;
    321322                }
    322323
     
    324325            }
    325326        }
    326         else if(*pType==MAKE_PTR_TYPE(DEF_OBJECT,2) || *pType==MAKE_PTR_TYPE(DEF_STRUCT,2)){
     327        else if( resultType.GetBasicType() == MAKE_PTR_TYPE(DEF_OBJECT,2)
     328            || resultType.GetBasicType() == MAKE_PTR_TYPE(DEF_STRUCT,2)){
    327329            //構造体ポインタのポインタ型メンバ変数
    328330
     
    331333                if( refType != CClass::Pointer ){
    332334                    if(isErrorEnabled) SetError(104,member,cp);
    333                     return 0;
     335                    return false;
    334336                }
    335337
    336338                //直接参照に切り替え
    337                 SetRelativeOffset(pType,*plpNestIndex,pRelativeVar,lpPtrOffset);
     339                SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset);
    338340                pRelativeVar->dwKind=VAR_DIRECTMEM;
    339341
     
    345347            else{
    346348                if(isErrorEnabled) SetError(104,member,cp);
    347                 return 0;
    348             }
    349         }
    350 
    351         if(!GetMemberOffset(
     349                return false;
     350            }
     351        }
     352
     353        if(!_member_offset(
    352354            isErrorEnabled,
    353355            isWriteAccess,
    354             pMember->TypeInfo.u.pobj_Class,
     356            pMember->GetClass(),
    355357            NestMember,
    356             pType,
    357358            pRelativeVar,
    358             plpNestIndex,
    359             0)) return 0;
     359            resultType,
     360            0)) return false;
    360361    }
    361362
    362363    if(lpPtrOffset[0]){
    363         SetRelativeOffset(pType,*plpNestIndex,pRelativeVar,lpPtrOffset);
     364        SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset);
    364365        pRelativeVar->dwKind=VAR_DIRECTMEM;
    365366    }
    366367
    367     return 1;
     368    return true;
    368369}
    369370void GetWithName(char *buffer){
     
    380381    //自身のオブジェクトのThisポインタをregにコピー
    381382
    382     extern VARIABLE *LocalVar;
    383383    RELATIVE_VAR RelativeVar;
    384384    RelativeVar.dwKind=VAR_LOCAL;
     
    388388    SetReg_WholeVariable(DEF_PTR_VOID,&RelativeVar,reg);
    389389}
    390 BOOL GetVarOffset(bool isErrorEnabled,bool isWriteAccess,const char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss){
    391     extern BOOL bCompilingGlobal;
     390bool GetVarOffset(bool isErrorEnabled,bool isWriteAccess,const char *NameBuffer,RELATIVE_VAR *pRelativeVar,Type &resultType,int *pss){
    392391    int i;
    393     LONG_PTR lpIndex;
    394392    char variable[VN_SIZE],member[VN_SIZE],VarName[VN_SIZE],array[VN_SIZE],lpPtrOffset[VN_SIZE];
    395393
     
    406404
    407405        void *pInfo;
    408         int idProc=GetProc(VarName,&pInfo);
     406        int idProc=GetProc(VarName,(void **)&pInfo);
    409407
    410408        if(idProc){
    411409            pRelativeVar->dwKind=VAR_DIRECTMEM;
     410
     411            Type type;
    412412
    413413            //////////////////////////////////////////////////////
     
    420420                ////////////////
    421421
    422                 *pType=CallProc(idProc,pInfo,VarName,array,&lpIndex);
     422                CallProc(idProc,pInfo,VarName,array,type);
    423423
    424424                //戻り値をr11にコピー
     
    430430            }////////////////////////////////////////////
    431431
    432             LONG_PTR lp2;
    433             if(!GetMemberOffset(
     432            if(!_member_offset(
    434433                isErrorEnabled,
    435434                isWriteAccess,
    436                 (CClass *)lpIndex,
    437                 member,pType,pRelativeVar,&lp2,0)) return 0;
    438             if(plpIndex) *plpIndex=lp2;
    439 
    440             return 1;
     435                type.GetClass(),
     436                member,pRelativeVar,resultType,0)) return false;
     437
     438            return true;
    441439        }
    442440    }
     
    447445    GetVarFormatString(VarName,array,lpPtrOffset,member,refType);
    448446
    449     int *pSubScripts;
     447    const int *pSubScripts;
    450448    bool bConst = false;
    451449
    452450
    453     if(bCompilingGlobal==0){
     451    if( UserProc::IsLocalAreaCompiling() ){
    454452        //////////////////
    455453        // ローカル変数
    456454        //////////////////
    457455
    458         for(i=MaxLocalVarNum-1;i>=0;i--){   //レキシカルスコープを考慮してバックサーチ
    459             if( LocalVar[i].bLiving                                         //現在のスコープで有効なもの
    460                 && LocalVar[i].ScopeLevel <= obj_LexScopes.GetNowLevel()    //現在のスコープレベルを超さないもの(Returnによる解放処理中を考慮)
    461                 ){
    462                     if(lstrcmp(VarName,LocalVar[i].name)==0) break;
    463             }
    464         }
    465         if(i>=0){
     456        const Variable *pVar = UserProc::CompilingUserProc().localVars.BackSearch( VarName );
     457        if( pVar ){
    466458            //ポインタ変数の場合
    467             if(IsPtrType(LocalVar[i].type)){
    468                 if(LocalVar[i].SubScripts[0]==-1){
     459            if( pVar->IsPointer() ){
     460                if( !pVar->IsArray() ){
    469461                    lstrcpy(lpPtrOffset,array);
    470462                    array[0]=0;
     
    475467                    SetError(16,variable,cp);
    476468                    pRelativeVar->dwKind=NON_VAR;
    477                     return 0;
     469                    return false;
    478470                }
    479471            }
    480472
    481             pRelativeVar->offset=-LocalVar[i].offset;
     473            pRelativeVar->offset=-pVar->offset;
    482474            pRelativeVar->bOffsetOffset=0;
    483             if(LocalVar[i].fRef){
     475            if( pVar->IsRef() ){
    484476                // 参照型
    485477                pRelativeVar->dwKind = VAR_REFLOCAL;
    486478            }
    487479            else pRelativeVar->dwKind=VAR_LOCAL;
    488             *pType=LocalVar[i].type;
    489             lpIndex=LocalVar[i].u.index;
    490             if(plpIndex) *plpIndex=lpIndex;
    491             pSubScripts=LocalVar[i].SubScripts;
    492             bConst = LocalVar[i].bConst;
     480            resultType = *pVar;
     481            pSubScripts=pVar->GetSubScriptsPtr();
     482            bConst = pVar->IsConst();
    493483
    494484            goto ok;
     
    506496            SetThisPtrToReg(REG_R11);
    507497
    508             *pType=DEF_OBJECT;
    509498            pRelativeVar->dwKind=VAR_DIRECTMEM;
    510499
    511             if(plpIndex) *plpIndex=(LONG_PTR)pobj_CompilingClass;
    512             return 1;
     500            resultType.SetType( DEF_OBJECT, pobj_CompilingClass );
     501            return true;
    513502        }
    514503
     
    542531
    543532        pRelativeVar->dwKind=VAR_DIRECTMEM;
    544         if(!GetMemberOffset(
     533        if(!_member_offset(
    545534            isErrorEnabled,
    546535            isWriteAccess,
    547             pobj_CompilingClass,
     536            *pobj_CompilingClass,
    548537            variable,
    549             pType,
    550538            pRelativeVar,
    551             &lpIndex,1)) return 0;
    552         if(plpIndex) *plpIndex=lpIndex;
    553         return 1;
     539            resultType,1)) return false;
     540        return true;
    554541    }
    555542
    556543NonClassMember:
    557544
    558     //////////////////////////
    559     // 静的ローカル変数
    560     // ※"Static.Object.Method.Variable"
    561     //////////////////////////
    562 
    563     char temporary[VN_SIZE];
    564     extern SubInfo *pCompilingSubInfo;
    565     if(pCompilingSubInfo){
    566         GetNowStaticVarFullName(VarName,temporary);
    567 
    568         for(i=0;i<MaxGlobalVarNum;i++){
    569             if(lstrcmp(temporary,GlobalVar[i].name)==0) break;
    570         }
    571         if(i!=MaxGlobalVarNum){
     545    {
     546        const Variable *pVar;
     547
     548        //////////////////////////
     549        // 静的ローカル変数
     550        // ※"Static.Object.Method.Variable"
     551        //////////////////////////
     552
     553        char temporary[VN_SIZE];
     554        if( UserProc::IsLocalAreaCompiling() ){
     555            GetNowStaticVarFullName(VarName,temporary);
     556
     557            pVar = globalVars.Find( temporary );
     558            if( pVar ){
     559                goto GlobalOk;
     560            }
     561        }
     562
     563
     564        //////////////////////////
     565        // クラスの静的メンバ
     566        //////////////////////////
     567
     568        if(member[0]){
     569            lstrcpy(temporary,member);
     570
     571            char tempMember[VN_SIZE];
     572            char tempArray[VN_SIZE];
     573            {
     574                CClass::RefType refType;
     575                GetVarFormatString(temporary,tempArray,lpPtrOffset,tempMember, refType );
     576            }
     577
     578            char temp2[VN_SIZE];
     579            sprintf(temp2,"%s.%s",VarName,temporary);
     580            pVar = globalVars.Find( temp2 );
     581            if( pVar ){
     582                lstrcpy(member,tempMember);
     583                lstrcpy(array,tempArray);
     584                goto GlobalOk;
     585            }
     586        }
     587
     588        if(pobj_CompilingClass){
     589            //自身のクラスから静的メンバを参照する場合
     590            char temp2[VN_SIZE];
     591            sprintf(temp2,"%s.%s",pobj_CompilingClass->name,VarName);
     592            pVar = globalVars.Find( temp2 );
     593            if( pVar ){
     594                goto GlobalOk;
     595            }
     596        }
     597
     598        /////////////////////
     599        // グローバル変数
     600        /////////////////////
     601
     602        pVar = globalVars.BackSearch( VarName );
     603        if( pVar ){
    572604            goto GlobalOk;
    573605        }
    574     }
    575 
    576 
    577     //////////////////////////
    578     // クラスの静的メンバ
    579     //////////////////////////
    580 
    581     if(member[0]){
    582         lstrcpy(temporary,member);
    583 
    584         char tempMember[VN_SIZE];
    585         char tempArray[VN_SIZE];
    586         {
    587             CClass::RefType refType;
    588             GetVarFormatString(temporary,tempArray,lpPtrOffset,tempMember, refType );
    589         }
    590 
    591         char temp2[VN_SIZE];
    592         sprintf(temp2,"%s.%s",VarName,temporary);
    593         for(i=0;i<MaxGlobalVarNum;i++){
    594             if(lstrcmp(temp2,GlobalVar[i].name)==0) break;
    595         }
    596 
    597         if(i!=MaxGlobalVarNum){
    598             lstrcpy(member,tempMember);
    599             lstrcpy(array,tempArray);
    600             goto GlobalOk;
    601         }
    602     }
    603 
    604     if(pobj_CompilingClass){
    605         //自身のクラスから静的メンバを参照する場合
    606         char temp2[VN_SIZE];
    607         sprintf(temp2,"%s.%s",pobj_CompilingClass->name,VarName);
    608         for(i=0;i<MaxGlobalVarNum;i++){
    609             if(lstrcmp(temp2,GlobalVar[i].name)==0) break;
    610         }
    611 
    612         if(i!=MaxGlobalVarNum){
    613             goto GlobalOk;
    614         }
    615     }
    616 
    617     /////////////////////
    618     // グローバル変数
    619     /////////////////////
    620 
    621     for(i=MaxGlobalVarNum-1;i>=0;i--){  //レキシカルスコープを考慮してバックサーチ
    622         if( GlobalVar[i].bLiving                                        //現在のスコープで有効なもの
    623             && GlobalVar[i].ScopeLevel <= obj_LexScopes.GetNowLevel()   //現在のスコープレベルを超さないもの(Returnによる解放処理中を考慮)
    624             ){
    625                 if(lstrcmp(VarName,GlobalVar[i].name)==0) break;
    626         }
    627     }
    628     if(i>=0){
    629         goto GlobalOk;
    630     }
    631 
    632     if(isErrorEnabled) SetError(3,variable,cp);
    633     pRelativeVar->dwKind=NON_VAR;
    634     return 0;
     606
     607        if(isErrorEnabled) SetError(3,variable,cp);
     608        pRelativeVar->dwKind=NON_VAR;
     609        return false;
    635610
    636611
    637612
    638613GlobalOk:
    639     //ポインタ変数の場合
    640     if(IsPtrType(GlobalVar[i].type)){
    641         if(GlobalVar[i].SubScripts[0]==-1){
    642             lstrcpy(lpPtrOffset,array);
    643             array[0]=0;
    644         }
    645     }
    646     else{
    647         if(lpPtrOffset[0]){
    648             SetError(16,variable,cp);
    649             pRelativeVar->dwKind=NON_VAR;
    650             return 0;
    651         }
    652     }
    653 
    654     pRelativeVar->offset=GlobalVar[i].offset;
    655     pRelativeVar->bOffsetOffset=0;
    656     if(GlobalVar[i].fRef){
    657         // 参照型
    658         pRelativeVar->dwKind = VAR_REFGLOBAL;
    659     }
    660     else pRelativeVar->dwKind=VAR_GLOBAL;
    661     *pType=GlobalVar[i].type;
    662     lpIndex=GlobalVar[i].u.index;
    663     if(plpIndex) *plpIndex=lpIndex;
    664     pSubScripts=GlobalVar[i].SubScripts;
    665     bConst = GlobalVar[i].bConst;
     614        //ポインタ変数の場合
     615        if( pVar->IsPointer() ){
     616            if( !pVar->IsArray() ){
     617                lstrcpy(lpPtrOffset,array);
     618                array[0]=0;
     619            }
     620        }
     621        else{
     622            if(lpPtrOffset[0]){
     623                SetError(16,variable,cp);
     624                pRelativeVar->dwKind=NON_VAR;
     625                return false;
     626            }
     627        }
     628
     629        pRelativeVar->offset=pVar->offset;
     630        pRelativeVar->bOffsetOffset=0;
     631        if( pVar->IsRef() ){
     632            // 参照型
     633            pRelativeVar->dwKind = VAR_REFGLOBAL;
     634        }
     635        else pRelativeVar->dwKind=VAR_GLOBAL;
     636        resultType = *pVar;
     637        pSubScripts=pVar->GetSubScriptsPtr();
     638        bConst = pVar->IsConst();
     639    }
    666640
    667641
     
    671645    if( bConst && isWriteAccess ){
    672646        //Const定義の変数に書き込みアクセスをしようとした場合
    673         if( *pType == DEF_OBJECT ){
     647        if( resultType.IsObject() ){
    674648            //オブジェクト定数
    675649            SetError(130, VarName, cp );
     
    683657    if(array[0]==0&&pSubScripts[0]!=-1){
    684658        //配列の先頭ポインタを示す場合
    685         *pType|=FLAG_PTR;
     659        resultType.SetBasicType( resultType.GetBasicType() | FLAG_PTR );
    686660        if(pss) memcpy(pss,pSubScripts,MAX_ARRAYDIM);
    687         return 1;
     661        return true;
    688662    }
    689663
     
    696670    }
    697671    if(array[0]){
    698         if(!GetArrayOffset(pSubScripts,array,*pType,lpIndex)){
     672        if(!GetArrayOffset(pSubScripts,array,resultType)){
    699673            SetError(14,variable,cp);
    700674            pRelativeVar->dwKind=NON_VAR;
    701             return 0;
     675            return false;
    702676        }
    703677    }
    704678    if(member[0]){
    705         if(*pType==DEF_OBJECT || *pType==DEF_STRUCT){
     679        if( resultType.IsObject() || resultType.IsStruct() ){
    706680            //実態オブジェクトのメンバを参照(obj.member)
    707681            if( refType != CClass::Dot ){
    708682                SetError(104,VarName,cp);
    709683                pRelativeVar->dwKind=NON_VAR;
    710                 return 0;
    711             }
    712 
    713             if( *pType==DEF_OBJECT ){
     684                return false;
     685            }
     686
     687            if( resultType.IsObject() ){
    714688                // 参照内容へのポインタを抽出
    715689                SetRelativeOffset( *pRelativeVar );
    716690            }
    717691        }
    718         else if(*pType==DEF_PTR_OBJECT || *pType==DEF_PTR_STRUCT){
     692        else if( resultType.IsObjectPtr() || resultType.IsStructPtr() ){
    719693            //ポインタオブジェクトが示すメンバを参照
    720694            if(lpPtrOffset[0]){
     
    723697                    SetError(104,VarName,cp);
    724698                    pRelativeVar->dwKind=NON_VAR;
    725                     return 0;
     699                    return false;
    726700                }
    727                 SetRelativeOffset(pType,lpIndex,pRelativeVar,lpPtrOffset);
     701                SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset);
    728702                pRelativeVar->dwKind=VAR_DIRECTMEM;
    729703            }
     
    733707                    SetError(104,VarName,cp);
    734708                    pRelativeVar->dwKind=NON_VAR;
    735                     return 0;
     709                    return false;
    736710                }
    737711
     
    743717            }
    744718        }
    745         else if(*pType==MAKE_PTR_TYPE(DEF_OBJECT,2) || *pType==MAKE_PTR_TYPE(DEF_STRUCT,2)){
     719        else if( resultType.GetBasicType()==MAKE_PTR_TYPE(DEF_OBJECT,2) || resultType.GetBasicType()==MAKE_PTR_TYPE(DEF_STRUCT,2)){
    746720            //ポインタオブジェクトが示すメンバを参照
    747721            if(lpPtrOffset[0]){
     
    750724                    SetError(104,VarName,cp);
    751725                    pRelativeVar->dwKind=NON_VAR;
    752                     return 0;
     726                    return false;
    753727                }
    754728
    755                 SetRelativeOffset(pType,lpIndex,pRelativeVar,lpPtrOffset);
     729                SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset);
    756730                pRelativeVar->dwKind=VAR_DIRECTMEM;
    757731
     
    765739                SetError(104,VarName,cp);
    766740                pRelativeVar->dwKind=NON_VAR;
    767                 return 0;
     741                return false;
    768742            }
    769743        }
     
    771745            SetError(102,VarName,cp);
    772746            pRelativeVar->dwKind=NON_VAR;
    773             return 0;
    774         }
    775 
    776         LONG_PTR lp2;
    777         if(!GetMemberOffset(
     747            return false;
     748        }
     749
     750        if(!_member_offset(
    778751            isErrorEnabled,
    779752            isWriteAccess,
    780             (CClass *)lpIndex,
    781             member,pType,pRelativeVar,&lp2,0)) return 0;
    782         if(plpIndex) *plpIndex=lp2;
    783 
    784         return 1;
     753            resultType.GetClass(),
     754            member,pRelativeVar,resultType,0)) return false;
     755
     756        return true;
    785757    }
    786758
    787759    if(lpPtrOffset[0]){
    788         SetRelativeOffset(pType,lpIndex,pRelativeVar,lpPtrOffset);
     760        SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset);
    789761        pRelativeVar->dwKind=VAR_DIRECTMEM;
    790762    }
    791763
    792     return 1;
     764    return true;
    793765}
    794766
    795 BOOL SetInitGlobalData(int offset,int type,LONG_PTR lpIndex,int *SubScripts,char *InitBuf){
     767bool SetInitGlobalData(int offset,const Type &type,const int *SubScripts,char *InitBuf){
    796768    extern BYTE *initGlobalBuf;
    797     int i,i2,i3,TypeSize;
     769    int i,i2,i3;
    798770    char temporary[VN_SIZE];
    799771
     
    802774        InitBuf[lstrlen(InitBuf)-1]=0;
    803775
    804         TypeSize=GetTypeSize(type,lpIndex);
     776        int typeSize = type.GetSize();
    805777
    806778        if(SubScripts[0]!=-1){
    807             TypeSize*=JumpSubScripts(SubScripts+1);
     779            typeSize*=JumpSubScripts(SubScripts+1);
    808780            i=0;
    809781            i2=0;
     
    815787                i=GetOneParameter(InitBuf,i,temporary);
    816788                if(!SetInitGlobalData(
    817                     offset+i2*TypeSize,
     789                    offset+i2*typeSize,
    818790                    type,
    819                     lpIndex,
    820791                    SubScripts+1,
    821                     temporary)) return 0;
     792                    temporary)) return false;
    822793                i2++;
    823794                if(InitBuf[i]=='\0') break;
    824795            }
    825             return -1;
    826         }
    827 
    828         if(type==DEF_STRUCT){
    829             CClass *pobj_c;
    830             pobj_c=(CClass *)lpIndex;
    831 
    832             for(i=0,i2=0;i2<pobj_c->iMemberNum;i2++){
     796            return true;
     797        }
     798
     799        if(type.IsStruct()){
     800            const CClass &objClass = type.GetClass();
     801
     802            for(i=0,i2=0;i2<objClass.iMemberNum;i2++){
    833803                i=GetOneParameter(InitBuf,i,temporary);
    834804
    835                 i3=pobj_c->GetMemberOffset( pobj_c->ppobj_Member[i2]->name, NULL );
     805                i3=objClass.GetMemberOffset( objClass.ppobj_Member[i2]->name, NULL );
    836806
    837807                if(!SetInitGlobalData(offset+i3,
    838                     pobj_c->ppobj_Member[i2]->TypeInfo.type,
    839                     pobj_c->ppobj_Member[i2]->TypeInfo.u.lpIndex,
    840                     pobj_c->ppobj_Member[i2]->SubScripts,
    841                     temporary)) return 0;
     808                    *objClass.ppobj_Member[i2],
     809                    objClass.ppobj_Member[i2]->SubScripts,
     810                    temporary)) return false;
    842811
    843812                if(InitBuf[i]=='\0') break;
    844813            }
    845             if(i2+1!=pobj_c->iMemberNum){
     814            if(i2+1!=objClass.iMemberNum){
    846815                SetError(41,0,cp);
    847                 return 0;
    848             }
    849             return 1;
     816                return false;
     817            }
     818            return true;
    850819        }
    851820
    852821        SetError(41,0,cp);
    853         return 0;
     822        return false;
    854823    }
    855824
     
    859828    ///////////////////////////////////////
    860829
    861     if( type == DEF_OBJECT || type == DEF_STRUCT ){
     830    if( type.IsObject() || type.IsStruct() ){
    862831        //オブジェクトまたは構造体の場合はありえない
    863832        SetError(300,NULL,cp);
    864         return 0;
     833        return false;
    865834    }
    866835
    867836    if(SubScripts[0]!=-1){
    868837        SetError(41,0,cp);
    869         return 0;
     838        return false;
    870839    }
    871840
    872841    double dbl;
    873842    _int64 i64data;
    874     int CalcType;
    875     LONG_PTR lpCalcIndex;
    876 
    877     CalcType=StaticCalculation(false, InitBuf,type,&i64data,&lpCalcIndex);
    878     if(!CalcType){
     843    Type calcType;
     844
     845    if( !StaticCalculation(false, InitBuf,type.GetBasicType(),&i64data,calcType) ){
    879846        //動的データだった場合
    880         return 0;
    881     }
    882     if(IsRealNumberType(CalcType)){
     847        return false;
     848    }
     849    if( calcType.IsReal() ){
    883850        memcpy(&dbl,&i64data,sizeof(double));
    884851        i64data=(_int64)dbl;
     
    889856    CheckDifferentType(
    890857        type,
    891         lpIndex,
    892         CalcType,
    893         lpCalcIndex,
     858        calcType,
    894859        0,0);
    895860
    896     if(type==DEF_DOUBLE)
     861    if( type.IsDouble() ){
    897862        *(double *)(initGlobalBuf+offset)=(double)dbl;
    898     else if(type==DEF_SINGLE)
    899             *(float *)(initGlobalBuf+offset)=(float)dbl;
    900     else if(type==DEF_INT64||type==DEF_QWORD||IsPtrType(type)){
    901         if(type==typeOfPtrChar&&lpCalcIndex==LITERAL_STRING){
     863    }
     864    else if( type.IsSingle() ){
     865        *(float *)(initGlobalBuf+offset)=(float)dbl;
     866    }
     867    else if( type.Is64() || type.IsPointer() ){
     868        if(type.GetBasicType()==typeOfPtrChar && type.GetIndex()==LITERAL_STRING){
    902869            //文字列定数のとき
    903870
     
    923890        }
    924891    }
    925     else if(type==DEF_LONG||type==DEF_DWORD)
     892    else if( type.IsDWord() || type.IsLong() ){
    926893        *(DWORD *)(initGlobalBuf+offset)=(DWORD)i64data;
    927     else if(type==DEF_INTEGER||type==DEF_WORD || (isUnicode&&type==DEF_CHAR))
     894    }
     895    else if( type.IsWord() || type.IsInteger() ){
    928896        *(WORD *)(initGlobalBuf+offset)=(WORD)i64data;
    929     else if(type==DEF_SBYTE||type==DEF_BYTE||type==DEF_BOOLEAN || (isUnicode==false&&type==DEF_CHAR))
     897    }
     898    else if( type.IsSByte() || type.IsByte() || type.IsBoolean() ){
    930899        *(BYTE *)(initGlobalBuf+offset)=(BYTE)i64data;
    931 
    932     return 1;
     900    }
     901
     902    return true;
    933903}
    934 BOOL InitLocalVar(int offset,int type,LONG_PTR lpIndex,int *SubScripts,char *InitBuf){
    935     int i,i2,i3,TypeSize;
     904bool InitLocalVar(int offset,const Type &type,const int *SubScripts,char *InitBuf){
     905    int i,i2,i3;
    936906    char temporary[VN_SIZE];
    937907
     
    940910        InitBuf[lstrlen(InitBuf)-1]=0;
    941911
    942         TypeSize=GetTypeSize(type,lpIndex);
     912        int typeSize = type.GetSize();
    943913
    944914        if(SubScripts[0]!=-1){
    945             TypeSize*=JumpSubScripts(SubScripts+1);
     915            typeSize*=JumpSubScripts(SubScripts+1);
    946916            i=0;
    947917            i2=0;
     
    949919                if(SubScripts[0]<i2){
    950920                    SetError(41,0,cp);
    951                     return 0;
     921                    return false;
    952922                }
    953923                i=GetOneParameter(InitBuf,i,temporary);
    954924                if(!InitLocalVar(
    955                     offset+i2*TypeSize,
     925                    offset+i2*typeSize,
    956926                    type,
    957                     lpIndex,
    958927                    SubScripts+1,
    959                     temporary)) return 0;
     928                    temporary)) return false;
    960929                i2++;
    961930                if(InitBuf[i]=='\0') break;
    962931            }
    963             return -1;
    964         }
    965 
    966         if(type==DEF_STRUCT){
    967             CClass *pobj_c;
    968             pobj_c=(CClass *)lpIndex;
    969 
    970             for(i=0,i2=0;i2<pobj_c->iMemberNum;i2++){
     932            return true;
     933        }
     934
     935        if(type.IsStruct()){
     936            const CClass &objClass = type.GetClass();
     937
     938            for(i=0,i2=0;i2<objClass.iMemberNum;i2++){
    971939                i=GetOneParameter(InitBuf,i,temporary);
    972940
    973                 i3=pobj_c->GetMemberOffset( pobj_c->ppobj_Member[i2]->name, NULL );
     941                i3=objClass.GetMemberOffset( objClass.ppobj_Member[i2]->name, NULL );
    974942
    975943                if(!InitLocalVar(offset+i3,
    976                     pobj_c->ppobj_Member[i2]->TypeInfo.type,
    977                     pobj_c->ppobj_Member[i2]->TypeInfo.u.lpIndex,
    978                     pobj_c->ppobj_Member[i2]->SubScripts,
    979                     temporary)) return 0;
     944                    *objClass.ppobj_Member[i2],
     945                    objClass.ppobj_Member[i2]->SubScripts,
     946                    temporary)) return false;
    980947
    981948                if(InitBuf[i]=='\0') break;
    982949            }
    983             if(i2+1!=pobj_c->iMemberNum){
     950            if(i2+1!=objClass.iMemberNum){
    984951                SetError(41,0,cp);
    985952                return 0;
    986953            }
    987             return 1;
     954            return true;
    988955        }
    989956
    990957        SetError(41,0,cp);
    991         return 0;
     958        return false;
    992959    }
    993960
     
    999966    if(SubScripts[0]!=-1){
    1000967        SetError(41,0,cp);
    1001         return 0;
     968        return false;
    1002969    }
    1003970
    1004971    double dbl;
    1005972    _int64 i64data;
    1006     int CalcType;
    1007     LONG_PTR lpCalcIndex;
    1008     CalcType=StaticCalculation(false, InitBuf,type,&i64data,&lpCalcIndex);
    1009     if(!CalcType){
     973    Type calcType;
     974
     975    if( !StaticCalculation(false, InitBuf,type.GetBasicType(),&i64data,calcType) ){
    1010976        //動的データだった場合
    1011         return 0;
    1012     }
    1013     if(IsRealNumberType(CalcType)){
     977        return false;
     978    }
     979    if( calcType.IsReal() ){
    1014980        memcpy(&dbl,&i64data,sizeof(double));
    1015981        i64data=(_int64)dbl;
     
    1020986    CheckDifferentType(
    1021987        type,
    1022         lpIndex,
    1023         CalcType,
    1024         lpCalcIndex,
     988        calcType,
    1025989        0,0);
    1026990
    1027     if(type==DEF_DOUBLE){
     991    if( type.IsDouble() ){
    1028992        memcpy(&i64data,&dbl,sizeof(double));
    1029993
     
    10371001        obp+=sizeof(long);
    10381002    }
    1039     else if(type==DEF_SINGLE){
     1003    else if( type.IsSingle() ){
    10401004        float flt;
    10411005        flt=(float)dbl;
     
    10471011        obp+=sizeof(long)+sizeof(long);
    10481012    }
    1049     else if(type==DEF_INT64||type==DEF_QWORD||IsPtrType(type)){
    1050         if(type==typeOfPtrChar&&lpCalcIndex==LITERAL_STRING){
     1013    else if( type.Is64() || type.IsPointer() ){
     1014        if(type.GetBasicType()==typeOfPtrChar && type.GetIndex()==LITERAL_STRING){
    10511015            //文字列定数のとき
    10521016
     
    10881052        }
    10891053    }
    1090     else if(type==DEF_LONG||type==DEF_DWORD){
     1054    else if( type.IsDWord() || type.IsLong() ){
    10911055        //mov dword ptr[rsp+offset],value
    10921056        op_mov_MV(sizeof(long),REG_RSP,offset,USE_OFFSET,(int)i64data);
     
    10951059        obp+=sizeof(long)+sizeof(long);
    10961060    }
    1097     else if(type==DEF_INTEGER||type==DEF_WORD || (isUnicode&&type==DEF_CHAR)){
     1061    else if( type.IsWord() || type.IsInteger() ){
    10981062        //mov word ptr[rsp+offset],value
    10991063        op_mov_MV(sizeof(short),REG_RSP,offset,USE_OFFSET,(int)i64data);
     
    11021066        obp+=sizeof(long)+sizeof(short);
    11031067    }
    1104     else if(type==DEF_SBYTE||type==DEF_BYTE||type==DEF_BOOLEAN || (isUnicode==false&&type==DEF_CHAR)){
     1068    else if( type.IsSByte() || type.IsByte() || type.IsBoolean() ){
    11051069        //mov byte ptr[rsp+offset],value
    11061070        op_mov_MV(sizeof(char),REG_RSP,offset,USE_OFFSET,(int)i64data);
     
    11091073        obp+=sizeof(long)+sizeof(char);
    11101074    }
    1111     return 1;
     1075    return true;
    11121076}
    11131077
    1114 void dim(bool isRef, char *VarName,int *SubScripts,TYPEINFO &TypeInfo,int TypeSize,char *InitBuf,char *ConstractParameter,DWORD dwFlags){
    1115     extern BOOL bCompilingGlobal;
    1116     if(bCompilingGlobal){
     1078void dim(bool isRef, char *VarName,int *SubScripts,Type &type,char *InitBuf,char *ConstractParameter,DWORD dwFlags){
     1079    if( UserProc::IsGlobalAreaCompiling() ){
    11171080        /////////////////////////
    11181081        // グローバル変数
    11191082        /////////////////////////
    11201083
    1121         AddGlobalVariable(isRef,VarName,SubScripts,&TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlags);
     1084        AddGlobalVariable(isRef,VarName,SubScripts,type,InitBuf,ConstractParameter,dwFlags);
    11221085    }
    11231086    else{
     
    11261089        /////////////////
    11271090
    1128         int i2,i3;
    1129 
    1130         for(i2=0;i2<MaxLocalVarNum;i2++){
    1131             if(LocalVar[i2].bLiving&&obj_LexScopes.GetNowLevel()==LocalVar[i2].ScopeLevel){
    1132                 if(lstrcmp(LocalVar[i2].name,VarName)==0){
    1133                     //2重定義のエラー
    1134                     SetError(15,VarName,cp);
    1135                     return;
    1136                 }
    1137             }
    1138         }
    1139 
    1140         LocalVar=(VARIABLE *)HeapReAlloc(hHeap,0,LocalVar,(MaxLocalVarNum+1)*sizeof(VARIABLE));
    1141         VARIABLE *pVar = &LocalVar[MaxLocalVarNum];
    1142         MaxLocalVarNum++;
    1143 
    1144         if( isRef ){
    1145             //参照型
    1146             pVar->fRef = REF_VARIABLE;
    1147             TypeSize = PTR_SIZE;
    1148         }
    1149         else pVar->fRef=0;
    1150 
    1151         for(i2=1,i3=0;i3<255;i3++){
    1152             //配列要素数
    1153             pVar->SubScripts[i3]=SubScripts[i3];
    1154 
    1155             if(SubScripts[i3]==-1) break;
    1156             i2*=SubScripts[i3]+1;
    1157         }
    1158         int VarSize=TypeSize*i2;
    1159         if(VarSize%8) VarSize+=8-(VarSize%8);
    1160 
    1161         //変数データを追加
    1162         lstrcpy(pVar->name,VarName);
    1163         if(dwFlags & DIMFLAG_CONST) pVar->bConst = true;
    1164         else pVar->bConst = false;
    1165         if(SubScripts[0]==-1) pVar->bArray=0;
    1166         else pVar->bArray=1;
    1167         pVar->type=TypeInfo.type;
    1168         pVar->u.index=TypeInfo.u.lpIndex;
     1091        if( UserProc::CompilingUserProc().localVars.DuplicateCheck( VarName ) ){
     1092            //2重定義のエラー
     1093            SetError(15,VarName,cp);
     1094            return;
     1095        }
     1096
     1097        bool isConst = ( dwFlags & DIMFLAG_CONST ) ? true:false;
     1098
     1099        Variable *pVar = new Variable( VarName, type, isConst, isRef );
     1100
     1101        if( SubScripts[0] != -1 ){
     1102            //配列あり
     1103            pVar->SetArray( SubScripts );
     1104        }
     1105
     1106        //コンストラクタ用パラメータ
     1107        pVar->paramStrForConstructor = ConstractParameter;
     1108
     1109        //レキシカルスコープ
     1110        pVar->ScopeLevel=obj_LexScopes.GetNowLevel();
     1111        pVar->ScopeStartAddress=obj_LexScopes.GetStartAddress();
     1112        pVar->bLiving=TRUE;
     1113
     1114        //エラー用
     1115        pVar->source_code_address=cp;
     1116
     1117        // 変数を追加
     1118        UserProc::CompilingUserProc().localVars.push_back( pVar );
    11691119
    11701120        //アラインメントを考慮
    1171         if( pVar->type==DEF_STRUCT ){
    1172             int alignment = pVar->u.pobj_c->iAlign;
     1121        if( pVar->IsStruct() ){
     1122            int alignment = pVar->GetClass().iAlign;
    11731123            if( alignment ){
    11741124                if( AllLocalVarSize % alignment ){
     
    11781128        }
    11791129
    1180         AllLocalVarSize+=VarSize;
    1181         pVar->offset=AllLocalVarSize;
     1130        AllLocalVarSize += pVar->GetMemorySize();
     1131        pVar->offset = AllLocalVarSize;
    11821132
    11831133        //レキシカルスコープ
     
    11881138        if(InitBuf[0]){
    11891139            //初期代入時のみ、書き込みアクセスを許可する
    1190             bool bConstBack = pVar->bConst;
    1191             pVar->bConst = false;
     1140            if( isConst ){
     1141                pVar->ConstOff();
     1142            }
    11921143
    11931144            int result = 0;
    1194             if( pVar->type != DEF_OBJECT ){
     1145            if( !pVar->IsObject() ){
    11951146                result = InitLocalVar(-pVar->offset,
    1196                     pVar->type,
    1197                     pVar->u.index,
    1198                     pVar->SubScripts,
     1147                    *pVar,
     1148                    pVar->GetSubScriptsPtr(),
    11991149                    InitBuf);
    12001150            }
     
    12071157            }
    12081158
    1209             pVar->bConst = bConstBack;
     1159            if( isConst ){
     1160                pVar->ConstOn();
     1161            }
    12101162        }
    12111163        else{
     
    12161168
    12171169            //mov rdx, VarSize
    1218             op_mov_RV( sizeof(_int64), REG_RDX, VarSize );
     1170            op_mov_RV( sizeof(_int64), REG_RDX, pVar->GetMemorySize() );
    12191171
    12201172            //mov rcx, rsp
     
    12281180
    12291181            //call FillMemory
    1230             DECLAREINFO *pdi;
    1231             pdi=GetDeclareHash("FillMemory");
    1232             op_call( pdi );
     1182            DllProc *pDllProc;
     1183            pDllProc=GetDeclareHash("FillMemory");
     1184            op_call( pDllProc );
    12331185        }
    12341186    }
    12351187
    12361188    //コンストラクタ呼び出し
    1237     if(TypeInfo.type==DEF_OBJECT&&(dwFlags&DIMFLAG_NONCALL_CONSTRACTOR)==0&&InitBuf[0]=='\0'){
     1189    if( type.IsObject() &&(dwFlags&DIMFLAG_NONCALL_CONSTRACTOR)==0&&InitBuf[0]=='\0'){
    12381190        char objectSize[255];
    12391191        if( SubScripts[0] == -1 ){
     
    12461198            sprintf( objectSize, "%d", SubScripts[0] );
    12471199        }
    1248         Operator_New( *TypeInfo.u.pobj_Class, objectSize, ConstractParameter, TypeInfo );
    1249 
    1250         int type;
    1251         LONG_PTR lpIndex;
     1200        Operator_New( type.GetClass(), objectSize, ConstractParameter, type );
     1201
     1202        Type tempType;
    12521203        RELATIVE_VAR RelativeVar;
    1253         GetVarOffset( true, false, VarName, &type, &RelativeVar, &lpIndex );
     1204        GetVarOffset( true, false, VarName, &RelativeVar, tempType );
    12541205        if( RelativeVar.dwKind == VAR_DIRECTMEM ){
    12551206            SetError();
     
    12581209    }
    12591210
    1260     if(TypeInfo.type==DEF_OBJECT){
    1261         if(TypeInfo.u.pobj_Class->IsAbstract()){
     1211    if( type.IsObject() ){
     1212        if( type.GetClass().IsAbstract() ){
    12621213            //抽象クラスだったとき
    1263             SetError(125,TypeInfo.u.pobj_Class->name,cp);
     1214            SetError(125,type.GetClass().name,cp);
    12641215        }
    12651216    }
    12661217}
    1267 void dim(char *Parameter,DWORD dwFlags){
    1268     extern BOOL bCompilingGlobal;
    1269     extern HANDLE hHeap;
    1270     int i2;
    1271     char VarName[VN_SIZE];
    1272 
    1273     //参照型かどうか
    1274     bool isRef = false;
    1275 
    1276     i2 = 0;
    1277 
    1278     if( Parameter[i2] == 1 && Parameter[i2+1] == ESC_BYREF ){
    1279         //参照型
    1280         isRef = true;
    1281         Parameter += 2;
    1282     }
    1283 
    1284     if(dwFlags & DIMFLAG_CONST){
    1285 
    1286         //////////////////////////////////
    1287         // 定数変数の場合を考慮
    1288         //////////////////////////////////
    1289         for(;;i2++){
    1290             if(Parameter[i2] == '=' ||
    1291                 Parameter[i2] == 1 && Parameter[i2] == ESC_AS ||
    1292                 Parameter[i2] =='('){
    1293                     VarName[i2] = 0;
    1294                     break;
    1295             }
    1296             VarName[i2] = Parameter[i2];
    1297         }
    1298 
    1299         //定数と2重定義されていないる場合は抜け出す
    1300         if(CDBConst::obj.GetType(VarName)){
    1301             return;
    1302         }
    1303 
    1304         //定数マクロとして定義されている場合は抜け出す
    1305         if(GetConstHash(VarName)){
    1306             return;
    1307         }
    1308     }
    1309 
    1310 
    1311     //構文を解析
    1312     int SubScripts[MAX_ARRAYDIM];
    1313     TYPEINFO TypeInfo;
    1314     char InitBuf[8192];
    1315     char ConstractParameter[VN_SIZE];
    1316     if(!GetDimentionFormat(Parameter, isRef , VarName,SubScripts,&TypeInfo,InitBuf,ConstractParameter))
    1317         return;
    1318 
    1319 
    1320     //定数と2重定義されていないかを調べる
    1321     if(CDBConst::obj.GetType(VarName)){
    1322         SetError(15,VarName,cp);
    1323         return;
    1324     }
    1325 
    1326     //定数マクロとして定義されている場合
    1327     if(GetConstHash(VarName)){
    1328         SetError(15,VarName,cp);
    1329         return;
    1330     }
    1331 
    1332 
    1333     //タイプサイズを取得
    1334     int TypeSize;
    1335     TypeSize=GetTypeSize(TypeInfo.type,TypeInfo.u.lpIndex);
    1336 
    1337     extern BOOL bCompilingGlobal;
    1338     if(dwFlags&DIMFLAG_STATIC){
    1339         if(bCompilingGlobal){
    1340             SetError(60,NULL,cp);
    1341             return;
    1342         }
    1343 
    1344         /////////////////////
    1345         // Static変数
    1346         // ※"Static.Object.Method.Variable"
    1347         /////////////////////
    1348 
    1349         char temporary[VN_SIZE];
    1350         GetNowStaticVarFullName(VarName,temporary);
    1351 
    1352         dim( isRef,temporary,SubScripts,TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlags );
    1353 
    1354         /*
    1355         Note: 静的変数のコンストラクタ呼び出しは
    1356             _System_InitStaticLocalVariables関数内で一括して行う
    1357         */
    1358     }
    1359     else{
    1360         dim( isRef,VarName,SubScripts,TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlags );
    1361     }
    1362 }
    1363 void OpcodeDim(char *Parameter,DWORD dwFlags){
    1364     int i,i2,i3,IsStr=0;
    1365     char temporary[8192];
    1366 
    1367     for(i=0,i2=0;;i++,i2++){
    1368         if(Parameter[i]=='\"') IsStr^=1;
    1369         if(Parameter[i]=='('&&IsStr==0){
    1370             i3=GetStringInPare(temporary+i2,Parameter+i);
    1371             i+=i3-1;
    1372             i2+=i3-1;
    1373             continue;
    1374         }
    1375         if(Parameter[i]=='['&&IsStr==0){
    1376             i3=GetStringInBracket(temporary+i2,Parameter+i);
    1377             i+=i3-1;
    1378             i2+=i3-1;
    1379             continue;
    1380         }
    1381         if((Parameter[i]==','&&IsStr==0)||
    1382             Parameter[i]=='\0'){
    1383             temporary[i2]=0;
    1384 
    1385             dim(temporary,dwFlags);
    1386 
    1387             if(Parameter[i]=='\0') break;
    1388             i2=-1;
    1389             continue;
    1390         }
    1391         temporary[i2]=Parameter[i];
    1392     }
    1393 }
    1394 
    13951218void SetVarPtrToReg(int reg,RELATIVE_VAR *pRelativeVar){
    13961219    if(!IsGeneralReg(reg)) SetError(300,NULL,cp);
  • BasicCompiler64/MakePeHdr.cpp

    r73 r75  
    66// 特殊関数の構造体ポインタ
    77////////////////////////////
    8 SubInfo
     8UserProc
    99    *pSub_System_StartupProgram,
    1010    *pSub_DebugSys_StartProc,
     
    136136
    137137    //関数ポインタ情報を初期化
    138     extern PROCPTRINFO *pProcPtrInfo;
     138    extern ProcPointer **ppProcPointer;
    139139    extern int ProcPtrInfoNum;
    140     pProcPtrInfo=(PROCPTRINFO *)HeapAlloc(hHeap,0,1);
     140    ppProcPointer=(ProcPointer **)HeapAlloc(hHeap,0,1);
    141141    ProcPtrInfoNum=0;
    142142
     
    170170
    171171    if(pSub_System_StartupProgram=GetSubHash("_System_StartupProgram",1))
    172         pSub_System_StartupProgram->bUse=1;
     172        pSub_System_StartupProgram->Using();
    173173
    174174    if(pSub_DebugSys_StartProc=GetSubHash("_DebugSys_StartProc",1))
    175         pSub_DebugSys_StartProc->bUse=1;
     175        pSub_DebugSys_StartProc->Using();
    176176
    177177    if(pSub_DebugSys_EndProc=GetSubHash("_DebugSys_EndProc",1))
    178         pSub_DebugSys_EndProc->bUse=1;
     178        pSub_DebugSys_EndProc->Using();
    179179
    180180    if(pSub_DebugSys_SaveContext=GetSubHash("_DebugSys_SaveContext",1))
    181         pSub_DebugSys_SaveContext->bUse=1;
     181        pSub_DebugSys_SaveContext->Using();
    182182
    183183    if(pSub_System_GetEip=GetSubHash("_System_GetEip",1)){
    184         pSub_System_GetEip->bUse=1;
    185         pSub_System_GetEip->bSystem=1;
     184        pSub_System_GetEip->Using();
     185        pSub_System_GetEip->ThisIsSystemProc();
    186186    }
    187187
    188188    if(pSub_System_InitDllGlobalVariables=GetSubHash("_System_InitDllGlobalVariables",1)){
    189         pSub_System_InitDllGlobalVariables->bUse=1;
    190         pSub_System_InitDllGlobalVariables->bSystem=1;
     189        pSub_System_InitDllGlobalVariables->Using();
     190        pSub_System_InitDllGlobalVariables->ThisIsSystemProc();
    191191    }
    192192
    193193    if(pSub_System_InitStaticLocalVariables=GetSubHash("_System_InitStaticLocalVariables",1)){
    194         pSub_System_InitStaticLocalVariables->bUse=1;
    195         pSub_System_InitStaticLocalVariables->bSystem=1;
     194        pSub_System_InitStaticLocalVariables->Using();
     195        pSub_System_InitStaticLocalVariables->ThisIsSystemProc();
    196196    }
    197197
    198198    if(pSub_System_Call_Destructor_of_GlobalObject=GetSubHash("_System_Call_Destructor_of_GlobalObject",1)){
    199         pSub_System_Call_Destructor_of_GlobalObject->bUse=1;
    200         pSub_System_Call_Destructor_of_GlobalObject->bSystem=1;
     199        pSub_System_Call_Destructor_of_GlobalObject->Using();
     200        pSub_System_Call_Destructor_of_GlobalObject->ThisIsSystemProc();
    201201    }
    202202
    203203    if(pSub_System_GetSp=GetSubHash("_System_GetSp",1)){
    204         pSub_System_GetSp->bUse=1;
    205         pSub_System_GetSp->bSystem=1;
     204        pSub_System_GetSp->Using();
     205        pSub_System_GetSp->ThisIsSystemProc();
    206206    }
    207207
    208208    if(pSub_pow=GetSubHash("pow",1))
    209         pSub_pow->bUse=1;
     209        pSub_pow->Using();
    210210
    211211    if(pSub_calloc=GetSubHash("calloc",1))
    212         pSub_calloc->bUse=1;
     212        pSub_calloc->Using();
    213213
    214214    if(pSub_realloc=GetSubHash("realloc",1))
    215         pSub_realloc->bUse=1;
     215        pSub_realloc->Using();
    216216
    217217    if(pSub_free=GetSubHash("free",1))
    218         pSub_free->bUse=1;
     218        pSub_free->Using();
    219219
    220220    if( pSub_System_GC_malloc_ForObject = GetSubHash( "_System_GC_malloc_ForObject",1 ) )
    221         pSub_System_GC_malloc_ForObject->bUse = 1;
     221        pSub_System_GC_malloc_ForObject->Using();
    222222
    223223    if( pSub_System_GC_malloc_ForObjectPtr = GetSubHash( "_System_GC_malloc_ForObjectPtr",1 ) )
    224         pSub_System_GC_malloc_ForObjectPtr->bUse = 1;
     224        pSub_System_GC_malloc_ForObjectPtr->Using();
    225225
    226226    if( pSub_System_GC_free_for_SweepingDelete = GetSubHash( "_System_GC_free_for_SweepingDelete",1 ) )
    227         pSub_System_GC_free_for_SweepingDelete->bUse = 1;
     227        pSub_System_GC_free_for_SweepingDelete->Using();
    228228
    229229
     
    271271
    272272    cp=-1;
    273     extern BOOL bCompilingGlobal;
    274     bCompilingGlobal=1;
     273    UserProc::CompileStartForGlobalArea();
    275274
    276275    if(!bDll){
     
    352351
    353352        //call _System_Call_Destructor_of_GlobalObject
    354         extern SubInfo *pSub_System_Call_Destructor_of_GlobalObject;
     353        extern UserProc *pSub_System_Call_Destructor_of_GlobalObject;
    355354        op_call(pSub_System_Call_Destructor_of_GlobalObject);
    356355
     
    405404    /////////////////////
    406405
    407     bCompilingGlobal=0;
    408 
    409406    //プロシージャをコンパイル開始
    410407    cp=0;
     
    429426    ////////////////////////////////
    430427    for(i=0;i<MAX_HASH;i++){
    431         extern DECLAREINFO **ppDeclareHash;
    432         DECLAREINFO *pdi;
    433         pdi=ppDeclareHash[i];
    434         while(pdi){
    435             if(pdi->bUse==0){
    436                 pdi=pdi->pNextData;
     428        extern DllProc **ppDeclareHash;
     429        const DllProc *pDllProc = ppDeclareHash[i];
     430        while(pDllProc){
     431            if( !pDllProc->IsUsing() ){
     432                pDllProc=pDllProc->pNextData;
    437433                continue;
    438434            }
     
    440436            //エラーチェック
    441437            HINSTANCE hLib;
    442             hLib=LoadLibrary(pdi->file);
     438            hLib=LoadLibrary( pDllProc->GetDllFileName().c_str() );
    443439            if(!hLib){
    444440                extern char OutputFileName[MAX_PATH];
     
    446442                _splitpath(OutputFileName,temp2,temp3,NULL,NULL);
    447443                lstrcat(temp2,temp3);
    448                 lstrcpy(temp3,pdi->file);
     444                lstrcpy(temp3,pDllProc->GetDllFileName().c_str());
    449445                GetFullPath(temp3,temp2);
    450446                hLib=LoadLibrary(temp3);
    451447
    452448                if(!hLib){
    453                     SetError(-106,pdi->file,pdi->pos);
     449                    SetError(-106,pDllProc->GetDllFileName().c_str(),pDllProc->GetCodePos());
    454450                }
    455451            }
    456452
    457453            if(hLib){
    458                 if(!GetProcAddress(hLib,pdi->alias)){
     454                if(!GetProcAddress(hLib,pDllProc->GetAlias().c_str())){
    459455                    FreeLibrary(hLib);
    460                     SetError(-107,pdi->alias,pdi->pos);
     456                    SetError(-107,pDllProc->GetAlias(),pDllProc->GetCodePos());
    461457                }
    462458                FreeLibrary(hLib);
    463459            }
    464460
    465             pdi=pdi->pNextData;
     461            pDllProc=pDllProc->pNextData;
    466462        }
    467463    }
     
    500496        ExportNamesLength=lstrlen(lpExportNames)+1;
    501497
    502         extern SubInfo **ppSubHash;
    503         SubInfo *psi,*psi2;
     498        extern UserProc **ppSubHash;
     499        UserProc *pUserProc,*psi2;
    504500        while(1){
    505501            //辞書順にサーチ
    506502            temporary[0]=0;
    507503            for(i=0,psi2=0;i<MAX_HASH;i++){
    508                 psi=ppSubHash[i];
    509                 while(psi){
    510                     if(psi->bExport){
     504                pUserProc=ppSubHash[i];
     505                while(pUserProc){
     506                    if(pUserProc->IsExport()){
    511507                        if(temporary[0]=='\0'){
    512                             lstrcpy(temporary,psi->name);
    513                             psi2=psi;
     508                            lstrcpy(temporary,pUserProc->GetName().c_str());
     509                            psi2=pUserProc;
    514510                        }
    515511                        else{
    516512                            i3=lstrlen(temporary);
    517                             i4=lstrlen(psi->name);
     513                            i4=(int)pUserProc->GetName().size();
    518514                            if(i3<i4) i3=i4;
    519                             if(memcmp(temporary,psi->name,i3)>0){
    520                                 lstrcpy(temporary,psi->name);
    521                                 psi2=psi;
     515                            if(memcmp(temporary,pUserProc->GetName().c_str(),i3)>0){
     516                                lstrcpy(temporary,pUserProc->GetName().c_str());
     517                                psi2=pUserProc;
    522518                            }
    523519                        }
    524520                    }
    525                     psi=psi->pNextData;
     521                    pUserProc=pUserProc->pNextData;
    526522                }
    527523            }
    528524            if(psi2==0) break;
    529             psi=psi2;
    530 
    531             psi->bExport=0;
    532 
    533             if(lstrcmpi(psi->name,"DllMain")==0)
    534                 DllMain_EntryPoint=psi->CompileAddress;
     525            pUserProc=psi2;
     526
     527            pUserProc->ExportOff();
     528
     529            if( pUserProc->GetName() == "DllMain" ){
     530                DllMain_EntryPoint=pUserProc->beginOpAddress;
     531            }
    535532
    536533            lpdwExportAddressTable=(DWORD *)HeapReAlloc(hHeap,0,lpdwExportAddressTable,(ExportNum+1)*sizeof(DWORD));
    537             lpdwExportAddressTable[ExportNum]=psi->CompileAddress;
     534            lpdwExportAddressTable[ExportNum]=pUserProc->beginOpAddress;
    538535
    539536            lpdwExportNamePointerTable=(DWORD *)HeapReAlloc(hHeap,0,lpdwExportNamePointerTable,(ExportNum+1)*sizeof(DWORD));
     
    543540            lpwExportOrdinalTable[ExportNum]=ExportNum;
    544541
    545             lstrcpy(lpExportNames+ExportNamesLength,psi->name);
     542            lstrcpy(lpExportNames+ExportNamesLength,pUserProc->GetName().c_str());
    546543            ExportNamesLength+=lstrlen(lpExportNames+ExportNamesLength)+1;
    547544
     
    576573    //インポートDLL情報
    577574    /////////////////////
    578     extern DECLAREINFO **ppDeclareHash;
    579     DECLAREINFO *pdi;
     575    extern DllProc **ppDeclareHash;
     576    DllProc *pDllProc;
    580577    char **ppDllNames;
    581578    int ImportDllNum;
     
    613610    ImportDllNum=0;
    614611    for(i=0;i<MAX_HASH;i++){
    615         pdi=ppDeclareHash[i];
    616         while(pdi){
    617             if(pdi->dwType==DECLARE_STATIC||
    618                 pdi->bUse==0){
    619                 pdi=pdi->pNextData;
     612        const DllProc *pDllProc=ppDeclareHash[i];
     613        while(pDllProc){
     614            if( !pDllProc->IsUsing() ){
     615                pDllProc=pDllProc->pNextData;
    620616                continue;
    621617            }
    622618
    623             if(lstrlen(pdi->file)>16){
     619            if( pDllProc->GetDllFileName().size() > 16 ){
    624620                SetError(7,NULL,cp);
    625621                break;
    626622            }
    627623            for(i2=0;i2<ImportDllNum;i2++){
    628                 if(lstrcmp(ppDllNames[i2],pdi->file)==0) break;
     624                if( pDllProc->GetDllFileName() == ppDllNames[i2] ){
     625                    break;
     626                }
    629627            }
    630628            if(i2==ImportDllNum){
    631629                ppDllNames=(char **)HeapReAlloc(hHeap,0,ppDllNames,(ImportDllNum+1)*sizeof(char **));
    632630                ppDllNames[ImportDllNum]=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,16);
    633                 lstrcpy(ppDllNames[ImportDllNum],pdi->file);
     631                lstrcpy(ppDllNames[ImportDllNum],pDllProc->GetDllFileName().c_str());
    634632                ImportDllNum++;
    635633            }
    636634
    637             pdi=pdi->pNextData;
     635            pDllProc=pDllProc->pNextData;
    638636        }
    639637    }
     
    651649        pImportDescriptor[i].Name=i*0x10;   //※すぐ下で再計算
    652650        for(i2=0;i2<MAX_HASH;i2++){
    653             pdi=ppDeclareHash[i2];
    654             while(pdi){
    655                 if(pdi->dwType==DECLARE_STATIC||
    656                     pdi->bUse==0){
    657                     pdi=pdi->pNextData;
     651            pDllProc=ppDeclareHash[i2];
     652            while(pDllProc){
     653                if( !pDllProc->IsUsing() ){
     654                    pDllProc=pDllProc->pNextData;
    658655                    continue;
    659656                }
    660657
    661                 if(lstrcmp(ppDllNames[i],pdi->file)==0){
     658                if( pDllProc->GetDllFileName() == ppDllNames[i] ){
    662659                    //ルックアップデータのサイズを追加
    663660                    LookupSize+=sizeof(_int64);
    664661                }
    665662
    666                 pdi=pdi->pNextData;
     663                pDllProc=pDllProc->pNextData;
    667664            }
    668665        }
     
    691688    for(i=0,i5=0;i<ImportDllNum;i++){
    692689        for(i2=0;i2<MAX_HASH;i2++){
    693             pdi=ppDeclareHash[i2];
    694             while(pdi){
    695                 if(pdi->dwType==DECLARE_STATIC||
    696                     pdi->bUse==0){
    697                     pdi=pdi->pNextData;
     690            pDllProc=ppDeclareHash[i2];
     691            while(pDllProc){
     692                if( !pDllProc->IsUsing() ){
     693                    pDllProc=pDllProc->pNextData;
    698694                    continue;
    699695                }
    700696
    701                 if(lstrcmp(ppDllNames[i],pdi->file)==0){
     697                if( pDllProc->GetDllFileName() == ppDllNames[i] ){
    702698                    //ルックアップの位置をセット(後にインポート アドレス テーブルにセットしなおされる)
    703                     pdi->LookupAddress=i5*sizeof(_int64);
     699                    pDllProc->SetLookupAddress( i5*sizeof(_int64) );
    704700
    705701                    //ルックアップ テーブルの値をセット
     
    714710                    pHintTable[HintSize++]=0;
    715711                    pHintTable[HintSize++]=0;
    716                     lstrcpy(pHintTable+HintSize,pdi->alias);
    717                     i4=lstrlen(pdi->alias);
     712                    lstrcpy(pHintTable+HintSize,pDllProc->GetAlias().c_str());
     713                    i4=(int)pDllProc->GetAlias().size();
    718714                    HintSize+=i4+1;
    719715                    if(i4%2==0) pHintTable[HintSize++]=0;
     
    725721                }
    726722
    727                 pdi=pdi->pNextData;
     723                pDllProc=pDllProc->pNextData;
    728724            }
    729725        }
     
    742738    //グローバル変数情報を扱う構造体も初期バッファの有無による配置を行う
    743739    //(デバッグ情報で利用される)
    744     extern int MaxGlobalVarNum;
    745     extern VARIABLE *GlobalVar;
    746740    extern int AllInitGlobalVarSize;
    747     for(i=0;i<MaxGlobalVarNum;i++){
    748         if(GlobalVar[i].offset&0x80000000){
    749             GlobalVar[i].offset=(GlobalVar[i].offset&0x7FFFFFFF)+AllInitGlobalVarSize;
     741    foreach( Variable *pVar, globalVars ){
     742        if(pVar->offset&0x80000000){
     743            pVar->offset=(pVar->offset&0x7FFFFFFF)+AllInitGlobalVarSize;
    750744        }
    751745    }
     
    997991
    998992        for(i2=0;i2<MAX_HASH;i2++){
    999             pdi=ppDeclareHash[i2];
    1000             while(pdi){
    1001                 if(pdi->bUse==0){
    1002                     pdi=pdi->pNextData;
     993            const DllProc *pDllProc=ppDeclareHash[i2];
     994            while(pDllProc){
     995                if( !pDllProc->IsUsing() ){
     996                    pDllProc=pDllProc->pNextData;
    1003997                    continue;
    1004998                }
    1005999
    1006                 if(lstrcmp(ppDllNames[i],pdi->file)==0){
     1000                if( pDllProc->GetDllFileName() == ppDllNames[i] ){
    10071001                    //ルックアップ テーブル
    10081002                    pLookupTable[i5++]+=MemPos_ImportSection;
    10091003                }
    10101004
    1011                 pdi=pdi->pNextData;
     1005                pDllProc=pDllProc->pNextData;
    10121006            }
    10131007        }
     
    10331027    // ※x86はRVAからのオフセット。x64はRPI(実行中アドレス)からのオフセット
    10341028    for(i=0;i<pobj_ImportAddrSchedule->num;i++){
    1035         DECLAREINFO *pdi;
    1036         pdi=pobj_ImportAddrSchedule->ppdi[i];
     1029        DllProc *pDllProc;
     1030        pDllProc=pobj_ImportAddrSchedule->ppdi[i];
    10371031        *((long *)(OpBuffer+pobj_ImportAddrSchedule->pObpValues[i]))=
    10381032            MemPos_ImportSection+
    1039             pdi->LookupAddress
     1033            pDllProc->GetLookupAddress()
    10401034            -(MemPos_CodeSection+pobj_ImportAddrSchedule->pObpValues[i]+sizeof(long));
    10411035    }
     
    10461040    // プロシージャポインタスケジュール
    10471041    for(i=0;i<pobj_SubAddrSchedule->num;i++){
    1048         if(pobj_SubAddrSchedule->ppsi[i]->CompileAddress==0
    1049             &&pobj_SubAddrSchedule->ppsi[i]->EndOpAddr==0){
     1042        if(pobj_SubAddrSchedule->ppsi[i]->beginOpAddress==0
     1043            &&pobj_SubAddrSchedule->ppsi[i]->endOpAddress==0){
    10501044            SetError(300,NULL,-1);
    10511045        }
     
    10531047        if(pobj_SubAddrSchedule->pbCall[i]){
    10541048            *((long *)(OpBuffer+pobj_SubAddrSchedule->pObpValues[i]))=
    1055                 pobj_SubAddrSchedule->ppsi[i]->CompileAddress-(pobj_SubAddrSchedule->pObpValues[i]+sizeof(long));
     1049                pobj_SubAddrSchedule->ppsi[i]->beginOpAddress-(pobj_SubAddrSchedule->pObpValues[i]+sizeof(long));
    10561050        }
    10571051        else{
    10581052            *((long *)(OpBuffer+pobj_SubAddrSchedule->pObpValues[i]))=
    1059                 pobj_SubAddrSchedule->ppsi[i]->CompileAddress+ImageBase+MemPos_CodeSection;
     1053                pobj_SubAddrSchedule->ppsi[i]->beginOpAddress+ImageBase+MemPos_CodeSection;
    10601054        }
    10611055    }
     
    10981092    //グローバル変数情報を扱う構造体も初期バッファの有無による配置を行う
    10991093    //(デバッグ情報で利用される)
    1100     extern int MaxGlobalVarNum;
    1101     extern VARIABLE *GlobalVar;
    1102     for(i=0;i<MaxGlobalVarNum;i++){
    1103         if(GlobalVar[i].offset&0x80000000){
    1104             GlobalVar[i].offset=(GlobalVar[i].offset&0x7FFFFFFF)+AllInitGlobalVarSize;
     1094    foreach( Variable *pVar, globalVars ){
     1095        if(pVar->offset&0x80000000){
     1096            pVar->offset=(pVar->offset&0x7FFFFFFF)+AllInitGlobalVarSize;
    11051097        }
    11061098    }
  • BasicCompiler64/NumOpe.cpp

    r69 r75  
    1919
    2020        extern CClass *pobj_StringClass;
    21         TYPEINFO baseTypeInfo = { DEF_OBJECT, (LONG_PTR)pobj_StringClass };
    22         Operator_New( *pobj_StringClass, "", parameter, baseTypeInfo );
     21        Operator_New( *pobj_StringClass, "", parameter, Type( DEF_OBJECT, *pobj_StringClass ) );
    2322
    2423        free( parameter );
     
    7069}
    7170
    72 int NumOpe(int *pReg,const char *Command,int BaseType,LONG_PTR lpBaseIndex,LONG_PTR *plpIndex,BOOL *pbUseHeap){
    73     extern HANDLE hHeap;
     71void ExtendRegToBigType( int reg, int bigBasicType, int baseBasicType ){
     72    switch( Type::GetBasicSize( bigBasicType ) ){
     73        case sizeof(_int64):
     74            ExtendTypeTo64(baseBasicType,reg);
     75            break;
     76        case sizeof(long):
     77            ExtendTypeTo32(baseBasicType,reg);
     78            break;
     79        case sizeof(short):
     80            ExtendTypeTo16(baseBasicType,reg);
     81            break;
     82    }
     83}
     84
     85bool NumOpe( int *pReg,
     86            const char *expression,
     87            const Type &baseType,
     88            Type &resultType,
     89            BOOL *pbUseHeap ){
     90
    7491    int i,i2,i3,i4;
    7592    char temporary[1024],temp2[1024],temp3[1024];
    7693
    77     if(Command[0]=='\0'){
     94    if(expression[0]=='\0'){
    7895        SetError(1,NULL,cp);
    79         return 0;
    80     }
    81 
    82     if(Command[0]==1&& Command[1]==ESC_NEW ){
     96        return false;
     97    }
     98
     99    if(expression[0]==1&& expression[1]==ESC_NEW ){
    83100        //New演算子(オブジェクト生成)
    84         TYPEINFO baseTypeInfo = { BaseType, lpBaseIndex };
    85         int resultType = Operator_New(Command+2,plpIndex, baseTypeInfo );
     101
     102        if( !Operator_New( expression+2, baseType, resultType ) ){
     103            return false;
     104        }
    86105
    87106        //mov reg,rax
    88107        op_mov_RR( *pReg, REG_RAX );
    89108
    90         return resultType;
     109        return true;
    91110    }
    92111
     
    100119    long stack[255];
    101120    int pnum;
    102     if(!GetNumOpeElements(Command,&pnum,values,calc,stack)){
     121    if(!GetNumOpeElements(expression,&pnum,values,calc,stack)){
    103122        for(i=0;i<pnum;i++){
    104123            if(values[i]) HeapDefaultFree(values[i]);
     
    156175    double dbl;
    157176    int sp;
    158     int type[255];
     177    int type_stack[255];
    159178    LONG_PTR index_stack[255];
    160179    BOOL bUseHeap[255];
     
    167186
    168187        if(idCalc){
    169             if(type[sp-2]==DEF_OBJECT){
     188            if(type_stack[sp-2]==DEF_OBJECT){
    170189                //オーバーロードされたオペレータを呼び出す
    171                 TYPEINFO BaseTypeInfo={BaseType,lpBaseIndex};
    172                 i2=CallOperatorProc(idCalc,&BaseTypeInfo,type,index_stack,bUseHeap,sp);
     190                i2=CallOperatorProc(idCalc,baseType,type_stack,index_stack,bUseHeap,sp);
    173191                if(i2==0){
    174192                    if(idCalc==CALC_EQUAL) lstrcpy(temp2,"==");
     
    183201            }
    184202
    185             if(!CheckCalcType(idCalc,type,sp)) goto error;
     203            if(!CheckCalcType(idCalc,type_stack,sp)) goto error;
    186204        }
    187205
     
    209227StrLiteral:
    210228                   
    211                     if(BaseType==DEF_OBJECT){
    212                         CClass *pobj_Class;
    213                         pobj_Class=(CClass *)lpBaseIndex;
    214                         TYPEINFO BaseTypeInfo = {BaseType,lpBaseIndex};
    215                         if(IsStringObjectType(BaseTypeInfo)){
     229                    if( baseType.IsObject() ){
     230                        if( baseType.IsStringObject() ){
    216231                            //要求タイプがStringのとき
    217232
     
    220235
    221236                            extern CClass *pobj_StringClass;
    222                             type[sp]=DEF_OBJECT;
     237                            type_stack[sp]=DEF_OBJECT;
    223238                            index_stack[sp]=(LONG_PTR)pobj_StringClass;
    224239                            bLiteralCalculation=0;
     
    232247                    }
    233248
    234                     type[sp]=typeOfPtrChar;
     249                    type_stack[sp]=typeOfPtrChar;
    235250                    bLiteralCalculation=0;
    236251
     
    277292                        int idProc;
    278293                        void *pInfo;
    279                         idProc=GetProc(temporary,&pInfo);
    280 
     294                        idProc=GetProc(temporary,(void **)&pInfo);
     295
     296                        Type resultType;
    281297                        if(idProc){
    282298                            //閉じカッコ")"に続く文字がNULLでないとき
     
    302318                                ////////////////
    303319
    304                                 i2=CallProc(idProc,pInfo,temporary,temp2,&index_stack[sp]);
    305                                 if(i2==-1){
     320                                CallProc(idProc,pInfo,temporary,temp2,resultType);
     321                                if(resultType.IsNull()){
    306322                                    //戻り値が存在しないとき
    307323                                    for(i2=2;;i2++){
     
    325341
    326342                                //大きな型への暗黙の変換
    327                                 type[sp]=AutoBigCast(BaseType,i2);
     343                                type_stack[sp]=AutoBigCast(baseType.GetBasicType(),resultType.GetBasicType());
     344                                index_stack[sp] = resultType.GetIndex();
    328345                                bLiteralCalculation=0;
    329346
    330                                 SetUseRegFromRax(i2,UseReg,XmmReg);
    331 
    332                                 if(IsRealNumberType(i2)) bXmm=1;
     347                                if( type_stack[sp] != resultType.GetBasicType() ){
     348                                    // 大きな型へ変換された場合
     349                                    // ※レジスタの値をキャストする
     350                                    ExtendRegToBigType( REG_RAX, type_stack[sp], resultType.GetBasicType() );
     351                                }
     352
     353                                SetUseRegFromRax(resultType.GetBasicType(),UseReg,XmmReg);
     354
     355                                if(resultType.IsReal()) bXmm=1;
    333356                                else bXmm=0;
    334357
     
    342365                            else pobj_reg->LockReg();
    343366
    344                             if(i2==DEF_STRUCT){
     367                            if(resultType.IsStruct()){
    345368                                //構造体が戻ったときはヒープ領域にインスタンスが格納されている
    346369                                //※後にfreeする必要あり
     
    360383
    361384                            //マクロ関数の場合
    362                             i2=NumOpe(&UseReg,temp3,0,0,&index_stack[sp]);
    363 
    364                             if(!IS_LITERAL(index_stack[sp])){
     385                            NumOpe(&UseReg,temp3,Type(),resultType);
     386
     387                            if(!IS_LITERAL(resultType.GetIndex())){
    365388                                //リテラル値ではなかったとき
    366389                                bLiteralCalculation=0;
    367390                            }
    368391
    369                             type[sp]=i2;
    370 
    371                             if(IsRealNumberType(i2)) pobj_reg->LockXmmReg();
     392                            type_stack[sp] = resultType.GetBasicType();
     393                            index_stack[sp] = resultType.GetIndex();
     394
     395                            if(resultType.IsReal()) pobj_reg->LockXmmReg();
    372396                            else pobj_reg->LockReg();
    373397
     
    381405                    //インデクサ(getアクセサ)
    382406                    char variable[VN_SIZE],array_element[VN_SIZE];
    383                     CClass *pobj_c;
    384407                    GetArrayElement(term,variable,array_element);
    385408                    if(array_element[0]){
    386                         i2=GetVarType(variable,(LONG_PTR *)&pobj_c,0);
    387                         if(i2==DEF_OBJECT){
    388                             TYPEINFO RetTypeInfo;
    389                             CallIndexerGetterProc(UseReg,pobj_c,variable,array_element,RetTypeInfo);
    390                             type[sp]=RetTypeInfo.type;
    391                             index_stack[sp]=RetTypeInfo.u.lpIndex;
     409                        Type resultType;
     410                        GetVarType(variable,resultType,0);
     411                        if( resultType.IsObject() ){
     412                            CallIndexerGetterProc(UseReg,&resultType.GetClass(),variable,array_element,resultType);
     413                            type_stack[sp]=resultType.GetBasicType();
     414                            index_stack[sp]=resultType.GetIndex();
    392415                            bLiteralCalculation=0;
    393416
    394                             if(IsRealNumberType(RetTypeInfo.type)) pobj_reg->LockXmmReg();
     417                            if(resultType.IsReal()) pobj_reg->LockXmmReg();
    395418                            else pobj_reg->LockReg();
    396419                            sp++;
     
    402425                    // Nothing
    403426                    if( lstrcmp( term, "Nothing" ) == 0 ){
    404                         type[sp] = DEF_OBJECT;
    405                         if( BaseType == DEF_OBJECT ){
    406                             index_stack[sp] = lpBaseIndex;
     427                        type_stack[sp] = DEF_OBJECT;
     428                        if( baseType.IsObject() ){
     429                            index_stack[sp] = baseType.GetIndex();
    407430                        }
    408431                        else{
     
    427450
    428451                    RELATIVE_VAR RelativeVar;
     452                    Type varType;
    429453                    if(GetVarOffset(
    430454                        false,  //エラー表示あり
    431455                        false,  //読み込み専用
    432456                        term,
    433                         &i2,&RelativeVar,&index_stack[sp])){
     457                        &RelativeVar,varType)){
    434458                        //////////
    435459                        // 変数
     
    437461
    438462                        //大きな型への暗黙の変換
    439                         type[sp]=AutoBigCast(BaseType,i2);
     463                        type_stack[sp]=AutoBigCast(baseType.GetBasicType(),varType.GetBasicType());
     464                        index_stack[sp] = varType.GetIndex();
    440465                        bLiteralCalculation=0;
    441466
    442                         if(type[sp]!=i2){
    443                             //大きな型へ変換された場合(レジスタを0に初期化する)
    444 
    445                             //xor reg,reg
    446                             op_zero_reg(UseReg);
    447                         }
    448 
    449                         if(i2&FLAG_PTR){
     467                        if(varType.GetBasicType()&FLAG_PTR){
    450468                            //配列ポインタ
    451                             type[sp]=GetPtrType(i2^FLAG_PTR,index_stack[sp]);
     469                            type_stack[sp]=GetPtrType(varType.GetBasicType()^FLAG_PTR);
    452470
    453471                            SetVarPtrToReg(UseReg,&RelativeVar);
    454472                        }
    455                         else if(IsRealNumberType(i2)){
     473                        else if(varType.IsReal()){
    456474                            //実数型
    457475                            bXmm=1;
    458476
    459                             if(i2==DEF_DOUBLE)
     477                            if( varType.IsDouble() )
    460478                                SetXmmReg_DoubleVariable(&RelativeVar,XmmReg);
    461                             if(i2==DEF_SINGLE)
     479                            if( varType.IsSingle() )
    462480                                SetXmmReg_SingleVariable(&RelativeVar,XmmReg);
    463481                        }
    464                         else if(IsWholeNumberType(i2) || i2==DEF_OBJECT){
     482                        else if( varType.IsWhole() || varType.IsObject()){
    465483                            //整数型
    466                             SetReg_WholeVariable(i2,&RelativeVar,UseReg);
    467                         }
    468                         else if(i2==DEF_STRUCT){
     484                            SetReg_WholeVariable(varType.GetBasicType(),&RelativeVar,UseReg);
     485                        }
     486                        else if( varType.IsStruct() ){
    469487                            //構造体ポインタをUseRegへ格納(構造体は値型)
    470488                            SetVarPtrToReg(UseReg,&RelativeVar);
    471489                        }
    472490                        else SetError(11,term,cp);
     491
     492                        if( type_stack[sp] != varType.GetBasicType() ){
     493                            // 大きな型へ変換された場合
     494                            // ※レジスタの値をキャストする
     495                            ExtendRegToBigType( UseReg, type_stack[sp], varType.GetBasicType() );
     496                        }
    473497
    474498                        if(bXmm==0&&UseReg==REG_R14){
     
    477501                        }
    478502                        if(bXmm&&XmmReg==REG_XMM4){
    479                             if(i2==DEF_DOUBLE){
     503                            if(varType.IsDouble()){
    480504                                //movsd qword ptr[rsp+offset],xmm4  ※スタックフレームを利用
    481505                                pobj_sf->push(REG_XMM4,sizeof(double));
    482506                            }
    483                             if(i2==DEF_SINGLE){
     507                            if(varType.IsSingle()){
    484508                                //movss dword ptr[rsp+offset],xmm4  ※スタックフレームを利用
    485509                                pobj_sf->push(REG_XMM4,sizeof(float));
     
    500524                    i3 = CDBConst::obj.GetType(term);
    501525                    if(i3){
    502                         type[sp] = i3;
     526                        type_stack[sp] = i3;
    503527                        if(IsRealNumberType(i3)){
    504528                            //実数
     
    536560                    i3=GetTypeFixed(term,&lp);
    537561                    if(i3!=-1){
    538                         type[sp]=i3|FLAG_CAST;
     562                        type_stack[sp]=i3|FLAG_CAST;
    539563                        index_stack[sp]=lp;
    540564                        sp++;
     
    559583                        //////////////////////////////////////////////////////
    560584
    561                             TYPEINFO RetTypeInfo;
    562                             CallPropertyMethod(term,NULL,&RetTypeInfo);
     585                            Type resultType;
     586                            CallPropertyMethod(term,NULL,resultType);
    563587
    564588                            //大きな型への暗黙の変換
    565                             type[sp]=AutoBigCast(BaseType,RetTypeInfo.type);
    566 
    567                             index_stack[sp]=RetTypeInfo.u.lpIndex;
     589                            type_stack[sp]=AutoBigCast(baseType.GetBasicType(),resultType.GetBasicType());
     590                            index_stack[sp]=resultType.GetIndex();
    568591                            bLiteralCalculation=0;
    569592
    570                             SetUseRegFromRax(RetTypeInfo.type,UseReg,XmmReg);
    571 
    572                             if(IsRealNumberType(type[sp])) bXmm=1;
     593                            if( type_stack[sp] != resultType.GetBasicType() ){
     594                                // 大きな型へ変換された場合
     595                                // ※レジスタの値をキャストする
     596                                ExtendRegToBigType( REG_RAX, type_stack[sp], resultType.GetBasicType() );
     597                            }
     598
     599                            SetUseRegFromRax(resultType.GetBasicType(),UseReg,XmmReg);
     600
     601                            if(IsRealNumberType(type_stack[sp])) bXmm=1;
    573602                            else bXmm=0;
    574603
     
    578607                        }////////////////////////////////////////////
    579608
    580                         if(type[sp]==DEF_STRUCT){
     609                        if(type_stack[sp]==DEF_STRUCT){
    581610                            //構造体が戻ったときはヒープ領域にインスタンスが格納されている
    582611                            //※後にfreeする必要あり
     
    595624                    bError=1;
    596625                    SetError(3,term,cp);
    597                     type[sp]=DEF_DOUBLE;
     626                    type_stack[sp]=DEF_DOUBLE;
    598627                }
    599628                else{
    600629                    //リテラル値
    601                     type[sp]=GetLiteralValue(term,&i64data,BaseType);
     630                    type_stack[sp]=GetLiteralValue(term,&i64data,baseType.GetBasicType());
    602631Literal:
    603                     if(type[sp]==DEF_DOUBLE){
     632                    if(type_stack[sp]==DEF_DOUBLE){
    604633                        //64ビット浮動小数型
    605634                        bXmm=1;
     
    627656                        }
    628657                    }
    629                     else if(type[sp]==DEF_SINGLE){
     658                    else if(type_stack[sp]==DEF_SINGLE){
    630659                        //32ビット浮動小数型
    631660                        bXmm=1;
     
    680709            case CALC_OR:
    681710            case CALC_AND:
    682                 if(!CalcTwoTerm_Logical(idCalc,type,index_stack,&sp)) goto error;
     711                if(!CalcTwoTerm_Logical(idCalc,type_stack,index_stack,&sp)) goto error;
    683712                break;
    684713            case CALC_NOT:
    685714                //value[sp-1]=Not value[sp-1]
    686715                //NOT演算子
    687                 if(!Calc_Not(type,sp)) goto error;
     716                if(!Calc_Not(type_stack,sp)) goto error;
    688717                break;
    689718
     
    695724            case CALC_NOTEQUAL: //value[sp-2] <> value[sp-1]
    696725            case CALC_EQUAL:    //value[sp-2] =  value[sp-1]               
    697                 if(!CalcTwoTerm_Relational(idCalc,type,index_stack,&sp)) goto error;
     726                if(!CalcTwoTerm_Relational(idCalc,type_stack,index_stack,&sp)) goto error;
    698727                break;
    699728
     
    701730            case CALC_SHL:  //value[sp-2] << value[sp-1]
    702731            case CALC_SHR:  //value[sp-2] >> value[sp-1]
    703                 if(!Calc_Shift(idCalc,type,&sp)) goto error;
     732                if(!Calc_Shift(idCalc,type_stack,&sp)) goto error;
    704733                break;
    705734
     
    708737            case CALC_SUBTRACTION:
    709738            case CALC_PRODUCT:
    710                 if(!CalcTwoTerm_Arithmetic(idCalc,type,index_stack,&sp)) goto error;
     739                if(!CalcTwoTerm_Arithmetic(idCalc,type_stack,index_stack,&sp)) goto error;
    711740                break;
    712741            case CALC_MOD:
    713742                //value[sp-2]%=value[sp-1]
    714743                //剰余演算
    715                 if(!Calc_Mod(type,index_stack,&sp)) goto error;
     744                if(!Calc_Mod(type_stack,index_stack,&sp)) goto error;
    716745                break;
    717746            case CALC_QUOTIENT:
    718747                //value[sp-2]/=value[sp-1];
    719748                //除算
    720                 if(!Calc_Divide(type,&sp,BaseType)) goto error;
     749                if(!Calc_Divide(type_stack,&sp,baseType.GetBasicType())) goto error;
    721750                break;
    722751            case CALC_INTQUOTIENT:
    723752                //value[sp-2]/=value[sp-1]
    724753                //整数除算
    725                 if(!Calc_IntDivide(type,index_stack,&sp)) goto error;
     754                if(!Calc_IntDivide(type_stack,index_stack,&sp)) goto error;
    726755                break;
    727756            case CALC_MINUSMARK:
    728757                //value[sp-1]=-value[sp-1]
    729758                //符号反転
    730                 if(!Calc_MinusMark(type,sp)) goto error;
     759                if(!Calc_MinusMark(type_stack,sp)) goto error;
    731760                break;
    732761            case CALC_POWER:
    733762                //べき乗演算(浮動小数点演算のみ)
    734                 if(!Calc_Power(type,&sp)) goto error;
     763                if(!Calc_Power(type_stack,&sp)) goto error;
    735764                break;
    736765            case CALC_AS:
    737766                //キャスト
    738                 if(!Calc_Cast(type,index_stack,&sp)) goto error;
     767                if(!Calc_Cast(type_stack,index_stack,&sp)) goto error;
    739768                break;
    740769            case CALC_BYVAL:
    741770                //ポインタ型→参照型
    742                 if( PTR_LEVEL( type[sp-1] ) <= 0 ){
     771                if( PTR_LEVEL( type_stack[sp-1] ) <= 0 ){
    743772                    //ポインタ型ではないとき
    744773                    SetError( 3, NULL, cp );
     
    746775                }
    747776
    748                 type[sp-1] = PTR_LEVEL_DOWN( type[sp-1] );
     777                type_stack[sp-1] = PTR_LEVEL_DOWN( type_stack[sp-1] );
    749778
    750779                break;
     
    765794    if(bLiteralCalculation){
    766795        //右辺値が数値の定数式の場合
    767         LONG_PTR lpClassIndex;
    768         i2=StaticCalculation(true, Command,BaseType,&i64data,&lpClassIndex);
     796        Type resultType;
     797        StaticCalculation(true, expression,baseType.GetBasicType(),&i64data,resultType);
    769798
    770799        obp=BeforeObp;
     
    775804        *pobj_reg=objReg_Backup;
    776805
    777         if(IsRealNumberType(i2)){
    778             if(IsRealNumberType(BaseType)) i2=BaseType;
     806        if(resultType.IsReal()){
     807            if(baseType.IsReal()) resultType=baseType;
    779808
    780809            XmmReg=pobj_reg->LockXmmReg();
    781810
    782             if(i2==DEF_DOUBLE){
     811            if(resultType.IsDouble()){
    783812                i3 = dataTable.Add( i64data );
    784813
     
    793822                obp+=sizeof(long);
    794823            }
    795             if(i2==DEF_SINGLE){
     824            if(resultType.IsSingle()){
    796825                memcpy(&dbl,&i64data,sizeof(_int64));
    797826
     
    815844        }
    816845        else{
    817             if(!Is64Type(i2)){
     846            if(!resultType.Is64()){
    818847                //整数(符号有り/無し)
    819848
    820849                i3=(long)i64data;
    821850
    822                 if(GetTypeSize(i2,-1)==sizeof(char)) i3=i3&0x000000FF;
    823                 if(GetTypeSize(i2,-1)==sizeof(short)) i3=i3&0x0000FFFF;
     851                if(resultType.GetBasicSize()==sizeof(char)) i3=i3&0x000000FF;
     852                if(resultType.GetBasicSize()==sizeof(short)) i3=i3&0x0000FFFF;
    824853
    825854                i64data=(_int64)i3;
     
    832861        }
    833862
    834         type[0]=i2;
    835         index_stack[0]=lpClassIndex;
     863        type_stack[0]=resultType.GetBasicType();
     864        index_stack[0]=resultType.GetIndex();
    836865    }
    837866    else{
     
    840869    }
    841870
    842     if(plpIndex) *plpIndex=index_stack[0];
    843871    if(pbUseHeap) *pbUseHeap=bUseHeap[0];
    844872
    845     if(IsRealNumberType(type[0]))
     873    if(IsRealNumberType(type_stack[0]))
    846874        *pReg=pobj_reg->UnlockXmmReg();
    847875    else
     
    858886    }
    859887
    860     int RetType;
    861     RetType=type[0];
     888    resultType.SetType( type_stack[0], index_stack[0] );
     889
     890    bool isSuccessful = true;
    862891    goto finish;
    863892
     
    878907    }
    879908
    880     RetType=-1;
     909    isSuccessful = false;
    881910    goto finish;
    882911
     
    893922    delete pobj_BackReloc;
    894923
    895     return RetType;
     924    return isSuccessful;
    896925}
  • BasicCompiler64/NumOpe_Arithmetic.cpp

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

    r73 r75  
    251251
    252252//NumOpe.cpp
    253 int NumOpe(int *pReg,const char *Command,int BaseType,LONG_PTR lpBaseIndex,LONG_PTR *plpIndex,BOOL *pbUseHeap=0);
     253bool NumOpe( int *pReg,
     254           const char *Command,
     255           const Type &baseType,
     256           Type &resultType,
     257           BOOL *pbUseHeap = NULL );
    254258
    255259//NumOpe_Arithmetic.cpp
     
    286290//Compile_Set_Var.cpp
    287291BOOL IsUse_r11(RELATIVE_VAR *pRelativeVar);
    288 void SetStructVariableFromRax(LONG_PTR lpVarIndex,int CalcType,LONG_PTR lpCalcIndex,RELATIVE_VAR *pRelativeVar,BOOL bUseHeap);
     292void SetStructVariableFromRax( const Type &varType, const Type &calcType, RELATIVE_VAR *pRelativeVar,BOOL bUseHeap);
    289293void SetRealVariable(int VarType, int CalcType, RELATIVE_VAR *pRelativeVar);
    290294void SetBooleanVariable(int type,RELATIVE_VAR *pRelative);
     
    307311
    308312//Compile_Object.cpp
    309 void Operator_New( CClass &classObj, const char *objectSizeStr, const char *parameter,const TYPEINFO &baseTypeInfo );
    310 int Operator_New(const char *Parameter,LONG_PTR *plpIndex,const TYPEINFO &baseTypeInfo );
     313void Operator_New( const CClass &classObj, const char *objectSizeStr, const char *parameter,const Type &baseTypeInfo );
    311314void OpcodeDelete(const char *Parameter, bool isSweeping);
    312315
     
    314317void GetWithName(char *buffer);
    315318void SetThisPtrToReg(int reg);
    316 BOOL GetVarOffset(bool isErrorEnabled,bool isWriteAccess,const char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss=0);
    317 BOOL SetInitGlobalData(int offset,int type,LONG_PTR lpIndex,int *SubScripts,char *InitBuf);
     319bool GetVarOffset(bool isErrorEnabled,bool isWriteAccess,const char *NameBuffer,RELATIVE_VAR *pRelativeVar,Type &resultType,int *pss = NULL);
     320bool SetInitGlobalData(int offset,const Type &type,const int *SubScripts,char *InitBuf);
    318321#define DIMFLAG_INITDEBUGVAR            0x01
    319322#define DIMFLAG_NONCALL_CONSTRACTOR     0x02
    320323#define DIMFLAG_STATIC                  0x04
    321324#define DIMFLAG_CONST                   0x08
    322 void dim(bool isRef, char *VarName,int *SubScripts,TYPEINFO &TypeInfo,int TypeSize,char *InitBuf,char *ConstractParameter,DWORD dwFlags);
    323 void OpcodeDim(char *Parameter,DWORD dwFlag);
     325void dim(bool isRef, char *VarName,int *SubScripts,Type &type,char *InitBuf,char *ConstractParameter,DWORD dwFlags);
    324326void SetVarPtrToReg(int reg,RELATIVE_VAR *pRelativeVar);
    325327
     
    333335class ParamImpl{
    334336    char *Parms[255];
    335     TYPEINFO types[255];
     337    vector<Type> types;
    336338    int ParmsNum;
    337339
    338     TYPEINFO ReturnTypeInfo;
     340    Type returnType;
    339341
    340342    //一時オブジェクト管理用
     
    345347public:
    346348    ParamImpl(const char *buffer);
    347     ParamImpl(const PARAMETER_INFO *pParamInfo, const int ParmNum);
     349    ParamImpl(const Parameters &params);
    348350    ~ParamImpl();
    349     void SetReturnType(TYPEINFO *pTypeInfo);
     351    void SetReturnType( const Type &returnType );
    350352
    351353private:
    352     BOOL _overload_check( Parameters &params, TYPEINFO *pReturnTypeInfo,int overload_level);
    353     SubInfo *OverloadSolutionWithReturnType( const char *name, std::vector<SubInfo *> &subs );
     354    bool _overload_check( int level, const Parameters &params, const Type &returnType );
     355    UserProc *OverloadSolutionWithReturnType( const char *name, std::vector<UserProc *> &subs );
    354356public:
    355     SubInfo *OverloadSolution( const char *name, std::vector<SubInfo *> &subs );
    356 
    357     BOOL ErrorCheck(const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum);
    358     void MacroParameterSupport(PARAMETER_INFO *ppi);
    359     void SetStructParameter(int reg,CClass *pobj_Class,LPSTR Parameter);
     357    UserProc *OverloadSolution( const char *name, std::vector<UserProc *> &subs );
     358
     359    bool ErrorCheck( const string &procName, const Parameters &params, int SecondParmNum = -1 );
     360    void MacroParameterSupport( const Parameters &params );
     361    void SetStructParameter( int reg, const Type &baseType, const char *expression );
     362    void SetParameter( const string &procName, const Parameters &params, int SecondParmNum = -1 );
    360363
    361364    //一時オブジェクトパラメータの生成と破棄
    362     int NewTempParameters( const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum );
     365    int NewTempParameters( const string &procName, const Parameters &params, int SecondParmNum = -1 );
    363366    void DeleteTempParameters();
    364 
    365     void SetParameter(const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum);
    366367
    367368    void BackupParameter(int pi_num);
     
    384385void AddLocalVarAddrSchedule();
    385386#define PROCFLAG_NEW    1
    386 int 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);
    388 int Opcode_CallDllProc(char *Parameter,DECLAREINFO *pdi,LONG_PTR *plpIndex);
     387bool Opcode_CallProcPtr(const char *variable, const char *lpszParms,ProcPointer *pProcPointer);
     388bool Opcode_CallProc(const char *Parameter,UserProc *pUserProc,DWORD dwFlags,const char *ObjectName,int RefType);
     389bool Opcode_CallDllProc( const char *lpszParms,DllProc *pDllProc);
    389390
    390391//Compile_ProcOp.cpp
     
    394395int GetFunctionType(int FuncNum);
    395396int GetFunctionFromName(char *FuncName);
    396 void Opcode_CallFunc( const char *Parameter, const int FuncNum, TYPEINFO &ReturnTypeInfo );
     397bool Opcode_CallFunc( const char *Parameter, const int FuncNum, Type &ReturnTypeInfo, bool isCallOn = true );
    397398
    398399//OperatorProc.cpp
    399 void FreeTempObject(int reg,CClass *pobj_c);
    400 int CallOperatorProc(int idCalc,TYPEINFO *pBaseTypeInfo,int *type,LONG_PTR *index_stack,BOOL *bUseHeap,int &sp);
    401 void CallCastOperatorProc(int reg,int &CalcType,LONG_PTR &lpCalcIndex,BOOL bCalcUseHeap,int ToType,LONG_PTR lpToIndex);
    402 void CallIndexerGetterProc(int reg,CClass *pobj_Class,char *ObjectName,char *Parameter,TYPEINFO &RetTypeInfo);
     400void FreeTempObject(int reg,const CClass *pobj_c);
     401int CallOperatorProc(int idCalc, const Type &baseType, int *type_stack,LONG_PTR *index_stack,BOOL *bUseHeap,int &sp);
     402void CallCastOperatorProc(int reg,Type &calcType,BOOL bCalcUseHeap,const Type &toType);
     403void CallIndexerGetterProc(int reg,const CClass *pobj_Class,char *ObjectName,char *Parameter,Type &resultType);
    403404
    404405//Compile_Statement.cpp
     
    411412void OpcodeContinue(void);
    412413void OpcodeExitSub(void);
    413 void OpcodeSelect(char *Parameter);
     414void OpcodeSelect( const char *Parameter );
    414415void OpcodeCase(char *Parameter);
    415416void OpcodeGosub(char *Parameter);
     
    512513void op_fld_ptr_esp(int type);
    513514void op_zero_reg(int reg);
    514 void op_call( SubInfo *psi );
    515 void op_call( DECLAREINFO *pdi );
     515void op_call( UserProc *pUserProc );
     516void op_call( DllProc *pDllProc );
  • BasicCompiler64/OperatorProc.cpp

    r73 r75  
    22#include "Opcode.h"
    33
    4 void FreeTempObject(int reg,CClass *pobj_c){
     4void FreeTempObject(int reg,const CClass *pobj_c){
    55    if(!IsSafeReg(reg)) SetError(300,NULL,cp);
    66
     
    1616
    1717        //call DestructorProcAddr
    18         op_call( method->psi );
     18        op_call( method->pUserProc );
    1919    }
    2020
     
    2323
    2424    //call free
    25     extern SubInfo *pSub_free;
     25    extern UserProc *pSub_free;
    2626    op_call(pSub_free);
    2727}
    2828
    29 int CallOperatorProc(int idCalc,TYPEINFO *pBaseTypeInfo,int *type,LONG_PTR *index_stack,BOOL *bUseHeap,int &sp){
     29int CallOperatorProc(int idCalc, const Type &baseType, int *type_stack,LONG_PTR *index_stack,BOOL *bUseHeap,int &sp){
    3030    //オーバーロードされたオペレータ関数を呼び出す
    3131    CClass *pobj_c;
    3232    pobj_c=(CClass *)index_stack[sp-2];
    3333
    34     std::vector<SubInfo *> subs;
     34    std::vector<UserProc *> subs;
    3535    pobj_c->EnumMethod( idCalc, subs );
    3636    if( subs.size() == 0 ){
     
    4545
    4646    int i;
    47     BOOL bReturnTypeIsObject=1;
    48     TYPEINFO ReturnType={DEF_OBJECT,subs[0]->u.ReturnIndex};
    49     for(i=0;i<subs.size();i++){
    50         if(subs[i]->ReturnType!=DEF_OBJECT)
    51             bReturnTypeIsObject=0;
    52     }
    53 
    54     if(bReturnTypeIsObject==0){
    55         if(pBaseTypeInfo){
    56             if(pBaseTypeInfo->type==DEF_OBJECT){
    57                 ReturnType.u.lpIndex=pBaseTypeInfo->u.lpIndex;
    58             }
    59         }
    60     }
    61 
    6247
    6348
     
    6651    /////////////////////////////////////////////
    6752
    68     PARAMETER_INFO *ppi = (PARAMETER_INFO *)HeapAlloc(hHeap,0,sizeof(PARAMETER_INFO)*3);
    69     int iParmNum=0;
    70 
    71     if(bTwoTerm){
    72         ppi[iParmNum].bArray=0;
    73         ppi[iParmNum].bByVal=0;
    74         ppi[iParmNum].name=0;
    75         ppi[iParmNum].type=type[sp-1];
    76         ppi[iParmNum].u.index=index_stack[sp-1];
    77         ppi[iParmNum].SubScripts[0]=-1;
    78         iParmNum++;
    79     }
    80 
     53    Parameters params;
     54
     55    if(bTwoTerm){
     56        params.push_back( new Parameter( "", Type( type_stack[sp-1], index_stack[sp-1] ) ) );
     57    }
    8158
    8259    //オーバーロードを解決
     
    8461    if(idCalc==CALC_EQUAL) lstrcpy(temporary,"==");
    8562    else GetCalcName(idCalc,temporary);
    86     SubInfo *psi;
    87     psi=OverloadSolution(temporary,subs,ppi,iParmNum,pBaseTypeInfo);
    88 
    89 
    90     if(!psi){
    91         HeapDefaultFree(ppi);
     63    UserProc *pUserProc = OverloadSolution( temporary, subs, params, baseType );
     64
     65    if(!pUserProc){
     66        if(bTwoTerm){
     67            delete params[0];
     68        }
    9269        return -1;
    9370    }
    9471    else{
    9572        //オーバーロードされていないが、パラメータ個数が一致しないとき
    96         if(iParmNum!=psi->params.size()){
    97             HeapDefaultFree(ppi);
     73        if(params.size()!=pUserProc->Params().size()){
     74            if(bTwoTerm){
     75                delete params[0];
     76            }
    9877            return -1;
    9978        }
    10079    }
    10180
    102     for(i=0;i<iParmNum;i++){
     81    for(i=0;i<(int)params.size();i++){
    10382        CheckDifferentType(
    104             psi->params[i]->GetBasicType(),
    105             psi->params[i]->GetIndex(),
    106             ppi[i].type,
    107             ppi[i].u.index,
     83            pUserProc->Params()[i]->GetBasicType(),
     84            pUserProc->Params()[i]->GetIndex(),
     85            params[i]->GetBasicType(),
     86            params[i]->GetIndex(),
    10887            "",
    10988            i);
    11089    }
    11190
    112     HeapDefaultFree(ppi);
    113 
    114     if(bTwoTerm){
    115         if( psi->realParams[1]->IsStruct() && psi->realParams[1]->IsRef() == false ){
     91    if(bTwoTerm){
     92        delete params[0];
     93    }
     94
     95    int right_side_size = GetTypeSize(type_stack[sp-1],index_stack[sp-1]);
     96
     97    if(bTwoTerm){
     98        if( pUserProc->RealParams()[1]->IsStruct() &&pUserProc->RealParams()[1]->IsRef() == false ){
    11699            //一時オブジェクトはメソッド内で破棄される
    117100            bUseHeap[sp-1]=0;
     
    119102    }
    120103
    121     if(psi->ReturnType==DEF_STRUCT){
     104
     105    if( pUserProc->ReturnType().IsStruct() ){
    122106        //////////////////////////////////////////////////////
    123107        // 戻り値に構造体インスタンスを持つ場合
     
    131115        //////////////////////////////////////////////////////
    132116
    133             int object_size = psi->u.Return_pobj_c->GetSize();
     117            int object_size = pUserProc->ReturnType().GetClass().GetSize();
    134118
    135119            //mov rcx,object_size
     
    137121
    138122            //call calloc
    139             extern SubInfo *pSub_calloc;
     123            extern UserProc *pSub_calloc;
    140124            op_call(pSub_calloc);
    141125
     
    152136    if(bTwoTerm){
    153137        //右の項(実数の場合が未完成)
    154         SetOneTermToReg_Whole64Calc(type[sp-1],&reg2);
     138        SetOneTermToReg_Whole64Calc(type_stack[sp-1],&reg2);
    155139        pobj_reg->UnlockReg();
    156         if( !psi->realParams[1]->IsRef() == false ){
     140        if( !pUserProc->RealParams()[1]->IsRef() == false ){
    157141            //一時参照を作成
    158142            pobj_sf->push( reg2 );
     
    190174
    191175        if(bTwoTerm){
    192             if(psi->ReturnType==DEF_STRUCT){
     176            if( pUserProc->ReturnType().IsStruct() ){
    193177                //mov r8,reg2
    194178                op_mov_RR(REG_R8,reg2);
     
    200184        }
    201185
    202         if(psi->ReturnType==DEF_STRUCT){
     186        if( pUserProc->ReturnType().IsStruct() ){
    203187            //mov rdx,r13
    204188            op_mov_RR(REG_RDX,REG_R13);
     
    209193
    210194        //call operator_proc
    211         op_call(psi);
    212 
    213         if(psi->ReturnType!=DEF_NON){
     195        op_call(pUserProc);
     196
     197        if( !pUserProc->ReturnType().IsNull() ){
    214198            //戻り値を一時的に退避
    215199
     
    253237
    254238    if(bTwoTerm){
    255         if( !psi->realParams[1]->IsRef() == false ){
     239        if( !pUserProc->RealParams()[1]->IsRef() == false ){
    256240            //一時参照を破棄
    257241            pobj_sf->pop();
     
    259243    }
    260244
    261     if(psi->ReturnType!=DEF_NON){
     245    if( !pUserProc->ReturnType().IsNull() ){
    262246        //戻り値をreg1にセット
    263247        reg1=pobj_reg->LockReg();
     
    268252
    269253    sp--;
    270     type[sp-1]=psi->ReturnType;
    271     index_stack[sp-1]=psi->u.ReturnIndex;
    272 
    273     if(psi->ReturnType==DEF_STRUCT){
     254    type_stack[sp-1]=pUserProc->ReturnType().GetBasicType();
     255    index_stack[sp-1]=pUserProc->ReturnType().GetIndex();
     256
     257    if( pUserProc->ReturnType().IsStruct() ){
    274258        //構造体が戻ったときはヒープ領域にインスタンスが格納されている
    275259        //※後にfreeする必要あり
     
    281265}
    282266
    283 void CallCastOperatorProc(int reg,int &CalcType,LONG_PTR &lpCalcIndex,BOOL bCalcUseHeap,int ToType,LONG_PTR lpToIndex){
    284     int type[10];
     267void CallCastOperatorProc(int reg,Type &calcType,BOOL bCalcUseHeap,const Type &toType){
     268    int type_stack[10];
    285269    LONG_PTR index_stack[10];
    286270    BOOL array_bUseHeap[10];
     
    304288
    305289        //左辺
    306         type[0]=CalcType;
    307         index_stack[0]=lpCalcIndex;
     290        type_stack[0]=calcType.GetBasicType();
     291        index_stack[0]=calcType.GetIndex();
    308292        array_bUseHeap[0]=0;
    309         type[1]=ToType;
    310         index_stack[1]=lpToIndex;
     293        type_stack[1]=toType.GetBasicType();
     294        index_stack[1]=toType.GetIndex();
    311295        array_bUseHeap[1]=0;
    312296
    313         TYPEINFO BaseTypeInfo={ToType,lpToIndex};
    314 
    315         iRet=CallOperatorProc(CALC_AS,&BaseTypeInfo,type,index_stack,array_bUseHeap,sp);
     297        iRet=CallOperatorProc(CALC_AS,toType,type_stack,index_stack,array_bUseHeap,sp);
    316298
    317299        pobj_reg->UnlockReg();
     
    325307    if(iRet==1){
    326308        //成功したとき
    327         CalcType=type[0];
    328         lpCalcIndex=index_stack[0];
     309        calcType.SetType( type_stack[0], index_stack[0] );
    329310        return;
    330311    }
     
    339320
    340321//インデクサ(getter)を呼び出す
    341 void CallIndexerGetterProc(int reg,CClass *pobj_Class,char *ObjectName,char *Parameter,TYPEINFO &RetTypeInfo){
    342 
    343     std::vector<SubInfo *> subs;
     322void CallIndexerGetterProc(int reg,const CClass *pobj_Class,char *ObjectName,char *Parameter,Type &resultType ){
     323
     324    std::vector<UserProc *> subs;
    344325    pobj_Class->EnumMethod( CALC_ARRAY_GET, subs );
    345326    if( subs.size() == 0 ){
     
    353334
    354335        Opcode_CallProc(Parameter,subs[0],0,ObjectName,DEF_OBJECT);
    355         RetTypeInfo.type = subs[0]->ReturnType;
    356         RetTypeInfo.u.lpIndex = subs[0]->u.ReturnIndex;
     336        resultType = subs[0]->ReturnType();
    357337
    358338        //mov reg,rax
  • BasicCompiler64/WatchList.cpp

    r73 r75  
    55#include "../BasicCompiler_Common/debug.h"
    66
    7 int Debugging_GetArray(int *SubScripts,char *array,int type,LONG_PTR lpIndex,LONG_PTR *plpOffset);
     7int Debugging_GetArray( const int *SubScripts,char *array,const Type &type,LONG_PTR *plpOffset);
    88
    99ULONG_PTR Debugging_GetVarPtr(RELATIVE_VAR *pRelativeVar){
     
    6161}
    6262
    63 BOOL Debugging_SetRelativeOffset(int *pType,LONG_PTR lpIndex,RELATIVE_VAR *pRelativeVar,char *lpPtrOffset){
     63bool Debugging_SetRelativeOffset( Type &type,RELATIVE_VAR *pRelativeVar,char *lpPtrOffset){
    6464    int array_num;
    6565
    6666    _int64 i64data;
    67     int type;
    68     type=StaticCalculation(true, lpPtrOffset,0,&i64data,0,1);
    69     if(!type) return 0;
    70     if(IsRealNumberType(type)){
     67    if( !StaticCalculation( true, lpPtrOffset, 0, &i64data, Type(), 1 ) ){
     68        return false;
     69    }
     70    if( type.IsReal() ){
    7171        double dbl;
    7272        memcpy(&dbl,&i64data,sizeof(double));
     
    7676    array_num=(int)i64data;
    7777
    78     if(PTR_LEVEL(*pType)){
    79         *pType=MAKE_PTR_TYPE(NATURAL_TYPE(*pType),PTR_LEVEL(*pType)-1);
    80         array_num *= GetTypeSize(*pType,-1);
     78    if( type.PtrLevel() ){
     79        type.PtrLevelDown();
     80        array_num *= type.GetSize();
    8181    }
    8282    else{
    8383        //エラー
    84         return 0;
     84        return false;
    8585    }
    8686
     
    8989    SIZE_T stAccBytes;
    9090    lpData=Debugging_GetVarPtr(pRelativeVar);
    91     if(!ReadProcessMemory(hDebugProcess,(void *)lpData,&pRelativeVar->offset,sizeof(LONG_PTR),&stAccBytes)) return 0;
     91    if(!ReadProcessMemory(hDebugProcess,(void *)lpData,&pRelativeVar->offset,sizeof(LONG_PTR),&stAccBytes)){
     92        return false;
     93    }
    9294    pRelativeVar->dwKind=VAR_DIRECTMEM;
    9395
    9496    pRelativeVar->offset+=array_num;
    95     return 1;
     97    return true;
    9698}
    9799
    98 BOOL Debugging_GetMember(CClass *pobj_c,char *member,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpNestIndex,BOOL bPrivateAccess){
     100int Debugging_GetMember( const CClass &objClass,char *member,RELATIVE_VAR *pRelativeVar, Type &resultType, BOOL bPrivateAccess){
    99101    int i,i2;
    100102
     
    117119    ////////////////////////////
    118120
    119     int offset = pobj_c->GetMemberOffset( VarName, &i );
    120     if(i==pobj_c->iMemberNum) return 0;
     121    int offset = objClass.GetMemberOffset( VarName, &i );
     122    if(i==objClass.iMemberNum) return 0;
    121123
    122124
    123125    //アクセシビリティをチェック
    124     if((bPrivateAccess==0&&pobj_c->ppobj_Member[i]->dwAccess==ACCESS_PRIVATE)||
    125         pobj_c->ppobj_Member[i]->dwAccess==ACCESS_NON){
     126    if((bPrivateAccess==0&&objClass.ppobj_Member[i]->dwAccess==ACCESS_PRIVATE)||
     127        objClass.ppobj_Member[i]->dwAccess==ACCESS_NON){
    126128        return 0;
    127129    }
    128     else if(bPrivateAccess==0&&pobj_c->ppobj_Member[i]->dwAccess==ACCESS_PROTECTED)
     130    else if(bPrivateAccess==0&&objClass.ppobj_Member[i]->dwAccess==ACCESS_PROTECTED)
    129131        return 0;
    130132
    131     *pType=pobj_c->ppobj_Member[i]->TypeInfo.type;
    132     *plpNestIndex=pobj_c->ppobj_Member[i]->TypeInfo.u.lpIndex;
     133    resultType = *objClass.ppobj_Member[i];
    133134
    134135    //ポインタ変数の場合
    135     if(IsPtrType(*pType)){
    136         if(pobj_c->ppobj_Member[i]->SubScripts[0]==-1){
     136    if( resultType.IsPointer() ){
     137        if(objClass.ppobj_Member[i]->SubScripts[0]==-1){
    137138            lstrcpy(lpPtrOffset,array);
    138139            array[0]=0;
     
    148149        //配列オフセット
    149150        i2=Debugging_GetArray(
    150             pobj_c->ppobj_Member[i]->SubScripts,
     151            objClass.ppobj_Member[i]->SubScripts,
    151152            array,
    152             *pType,
    153             pobj_c->ppobj_Member[i]->TypeInfo.u.lpIndex,
     153            resultType,
    154154            &pRelativeVar->offset);
    155155        if(i2==0){
     
    162162        }
    163163    }
    164     else if(pobj_c->ppobj_Member[i]->SubScripts[0]!=-1){
    165         *pType|=FLAG_PTR;
     164    else if(objClass.ppobj_Member[i]->SubScripts[0]!=-1){
     165        resultType.SetBasicType( resultType.GetBasicType() | FLAG_PTR );
    166166    }
    167167
     
    169169        //入れ子構造の場合
    170170
    171         if(*pType==DEF_OBJECT || *pType==DEF_STRUCT){
     171        if( resultType.IsObject() || resultType.IsStruct() ){
    172172            if( refType != CClass::Dot ) return 0;
    173173
    174             if( *pType==DEF_OBJECT ){
     174            if( resultType.IsObject() ){
    175175                extern HANDLE hDebugProcess;
    176176                LONG_PTR lpData;
     
    181181            }
    182182        }
    183         else if(*pType==DEF_PTR_OBJECT || *pType==DEF_PTR_STRUCT){
     183        else if( resultType.IsObjectPtr() || resultType.IsStructPtr() ){
    184184            //構造体ポインタ型メンバ変数
    185185
     
    188188
    189189                //直接参照に切り替え
    190                 Debugging_SetRelativeOffset(pType,*plpNestIndex,pRelativeVar,lpPtrOffset);
     190                Debugging_SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset);
    191191
    192192                lpPtrOffset[0]=0;
     
    204204        }
    205205
    206         i2=Debugging_GetMember(pobj_c->ppobj_Member[i]->TypeInfo.u.pobj_Class,
     206        i2=Debugging_GetMember(objClass.ppobj_Member[i]->GetClass(),
    207207            NestMember,
    208             pType,
    209208            pRelativeVar,
    210             plpNestIndex,
     209            resultType,
    211210            0);
    212211        if(i2==0){
     
    221220
    222221    if(lpPtrOffset[0]){
    223         Debugging_SetRelativeOffset(pType,*plpNestIndex,pRelativeVar,lpPtrOffset);
     222        Debugging_SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset);
    224223    }
    225224
    226225    return 1;
    227226}
    228 int Debugging_GetArray(int *SubScripts,char *array,int type,LONG_PTR lpIndex,LONG_PTR *plpOffset){
     227int Debugging_GetArray( const int *SubScripts,char *array,const Type &type,LONG_PTR *plpOffset){
    229228    extern HANDLE hHeap;
    230     int i,i2,i3,i4,i5,array_offset,TypeSize;
     229    int i,i2,i3,i4,i5,array_offset;
    231230    char temporary[VN_SIZE],*pParm[MAX_PARMS];
    232231
     
    275274    for(i=i3-1;i>=0;i--){
    276275        _int64 i64data;
    277         i2=StaticCalculation(true, pParm[i],0,&i64data,0,1);
    278         if(i2==0){
     276        Type resultType;
     277        bool isMemoryAccessError;
     278        if( !StaticCalculation(true, pParm[i],0,&i64data,resultType,1, &isMemoryAccessError ) ){
    279279            //式エラー
    280280            return 0;
    281281        }
    282         if(i2==-1){
     282        if(isMemoryAccessError){
    283283            //アクセスエラー
    284284            return -1;
    285285        }
    286286
    287         if(IsRealNumberType(i2)){
     287        if(resultType.IsReal()){
    288288            double dbl;
    289289            memcpy(&dbl,&i64data,sizeof(double));
     
    299299    }
    300300
    301     TypeSize=GetTypeSize(type,lpIndex);
    302 
    303     array_offset*=TypeSize;
     301    array_offset *= type.GetSize();
    304302
    305303    *plpOffset+=array_offset;
     
    308306}
    309307ULONG_PTR Debugging_GetThisPtrOffset(LONG_PTR obp_Rip){
    310     int i;
    311     SubInfo *psi;
    312 
    313     //ripからプロシージャを取得
    314     psi=GetSubFromObp(obp_Rip);
    315 
    316     for(i=0;i<psi->VarNum;i++){
    317         if(lstrcmp(psi->pVar[i].name,"_System_LocalThis")==0) break;
    318     }
    319     if(i==psi->VarNum) return 0;
    320 
    321     return psi->pVar[i].offset;
     308    UserProc *pUserProc = GetSubFromObp(obp_Rip);
     309
     310    foreach( Variable *pVar, pUserProc->localVars ){
     311        if( pVar->GetName() == "_System_LocalThis" ){
     312            return pVar->offset;
     313        }
     314    }
     315    return 0;
    322316}
    323 int Debugging_GetVarOffset(char *variable,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss){
     317int Debugging_GetVarOffset( char *variable,RELATIVE_VAR *pRelativeVar, Type &resultType, int *pss){
    324318    extern HANDLE hDebugProcess;
    325319    int i,i2,i3;
     
    332326    GetVarFormatString(VarName,array,lpPtrOffset,member,refType);
    333327
    334     LONG_PTR lpIndex;
    335     int *pSubScripts;
    336     BOOL bArray;
     328    const int *pSubScripts;
     329    bool isArray;
    337330
    338331
     
    340333    // ローカル変数
    341334    /////////////////
    342     extern VARIABLE *LocalVar;
    343     extern int MaxLocalVarNum;
    344     for(i=0;i<MaxLocalVarNum;i++){
    345         if(lstrcmp(VarName,LocalVar[i].name)==0) break;
    346     }
    347     if(i!=MaxLocalVarNum){
     335    const Variable *pVar = UserProc::CompilingUserProc().localVars.Find( VarName );
     336    if( pVar ){
    348337        //ポインタ変数の場合
    349         if(IsPtrType(LocalVar[i].type)){
    350             if(!LocalVar[i].bArray){
     338        if( pVar->IsPointer() ){
     339            if( !pVar->IsArray() ){
    351340                lstrcpy(lpPtrOffset,array);
    352341                array[0]=0;
     
    357346        }
    358347
    359         pRelativeVar->offset=LocalVar[i].offset;
    360         if(LocalVar[i].fRef) pRelativeVar->dwKind=VAR_REFLOCAL;
    361         else pRelativeVar->dwKind=VAR_LOCAL;
    362         *pType=LocalVar[i].type;
    363         lpIndex=LocalVar[i].u.index;
    364         *plpIndex=lpIndex;
    365         bArray=LocalVar[i].bArray;
    366         pSubScripts=LocalVar[i].SubScripts;
     348        pRelativeVar->offset = pVar->offset;
     349        if( pVar->IsRef() ){
     350            pRelativeVar->dwKind=VAR_REFLOCAL;
     351        }
     352        else{
     353            pRelativeVar->dwKind=VAR_LOCAL;
     354        }
     355        resultType = *pVar;
     356        isArray = pVar->IsArray();
     357        pSubScripts = pVar->GetSubScriptsPtr();
    367358    }
    368359    else{
     
    406397            pRelativeVar->dwKind=VAR_DIRECTMEM;
    407398
    408             LONG_PTR lp2;
    409             i3=Debugging_GetMember(pobj_CompilingClass,variable,pType,pRelativeVar,&lp2,1);
     399            i3=Debugging_GetMember(*pobj_CompilingClass,variable,pRelativeVar,resultType,1);
    410400            if(i3==0){
    411401                //式エラー
     
    417407            }
    418408
    419             *plpIndex=lp2;
    420409            return 1;
    421410        }
     
    426415        // グローバル変数
    427416        ///////////////////
    428         extern VARIABLE *GlobalVar;
    429         extern int MaxGlobalVarNum;
    430 
    431         for(i=0;i<MaxGlobalVarNum;i++){
    432             if(lstrcmp(VarName,GlobalVar[i].name)==0) break;
    433         }
    434         if(i==MaxGlobalVarNum){
     417
     418        const Variable *pVar = globalVars.Find( VarName );
     419        if( !pVar ){
    435420            //一致しないとき
    436421            return 0;
     
    438423
    439424        //ポインタ変数の場合
    440         if(IsPtrType(GlobalVar[i].type)){
    441             if(!GlobalVar[i].bArray){
     425        if( pVar->IsPointer() ){
     426            if( !pVar->IsArray() ){
    442427                lstrcpy(lpPtrOffset,array);
    443428                array[0]=0;
     
    448433        }
    449434
    450         pRelativeVar->offset=GlobalVar[i].offset;
    451         if(GlobalVar[i].fRef) pRelativeVar->dwKind=VAR_REFGLOBAL;
     435        pRelativeVar->offset=pVar->offset;
     436        if(pVar->IsRef()) pRelativeVar->dwKind=VAR_REFGLOBAL;
    452437        else pRelativeVar->dwKind=VAR_GLOBAL;
    453         *pType=GlobalVar[i].type;
    454         lpIndex=GlobalVar[i].u.index;
    455         *plpIndex=lpIndex;
    456         bArray=GlobalVar[i].bArray;
    457         pSubScripts=GlobalVar[i].SubScripts;
    458     }
    459 
    460 
    461     if(array[0]==0&&bArray){
     438        resultType = *pVar;
     439        isArray = pVar->IsArray();
     440        pSubScripts=pVar->GetSubScriptsPtr();
     441    }
     442
     443
     444    if(array[0]==0&&isArray){
    462445        //配列の先頭ポインタを示す場合
    463         *pType|=FLAG_PTR;
    464         if(pss) memcpy(pss,pSubScripts,MAX_ARRAYDIM);
     446        resultType.SetBasicType( resultType.GetBasicType() | FLAG_PTR );
     447        if(pss) memcpy(pss,pSubScripts,MAX_ARRAYDIM*sizeof(int));
    465448        return 1;
    466449    }
    467450
    468451    if(array[0]){
    469         i3=Debugging_GetArray(pSubScripts,array,*pType,lpIndex,&pRelativeVar->offset);
     452        i3=Debugging_GetArray(pSubScripts,array,resultType,&pRelativeVar->offset);
    470453        if(i3==0){
    471454            //式エラー
     
    478461    }
    479462    if(member[0]){
    480         if(*pType==DEF_OBJECT || *pType==DEF_STRUCT){
     463        if( resultType.IsObject() || resultType.IsStruct() ){
    481464            //実態オブジェクトのメンバを参照(obj.member)
    482465            if( refType != CClass::Dot ){
     
    484467            }
    485468
    486             LONG_PTR lp2;
    487             i3=Debugging_GetMember((CClass *)lpIndex,member,pType,pRelativeVar,&lp2,0);
     469            i3=Debugging_GetMember(resultType.GetClass(),member,pRelativeVar,resultType,0);
    488470            if(i3==0){
    489471                //式エラー
     
    494476                return -1;
    495477            }
    496 
    497             *plpIndex=lp2;
    498         }
    499         else if(*pType==DEF_PTR_OBJECT || *pType==DEF_PTR_STRUCT){
     478        }
     479        else if( resultType.IsObjectPtr() || resultType.IsStructPtr() ){
    500480            //ポインタオブジェクトが示すメンバを参照
    501481            if(lpPtrOffset[0]){
    502482                //pObj[n].member
    503483                if( refType != CClass::Dot ) return 0;
    504                 Debugging_SetRelativeOffset(pType,lpIndex,pRelativeVar,lpPtrOffset);
    505 
    506                 LONG_PTR lp2;
    507                 i3=Debugging_GetMember((CClass *)lpIndex,member,pType,pRelativeVar,&lp2,0);
     484                Debugging_SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset);
     485
     486                i3=Debugging_GetMember(resultType.GetClass(),member,pRelativeVar,resultType,0);
    508487                if(i3==0){
    509488                    //式エラー
     
    514493                    return -1;
    515494                }
    516 
    517                 *plpIndex=lp2;
    518495            }
    519496            else{
     
    527504                pRelativeVar->offset=lpData;
    528505
    529                 LONG_PTR lp2;
    530                 i3=Debugging_GetMember((CClass *)lpIndex,member,pType,pRelativeVar,&lp2,0);
     506                i3=Debugging_GetMember(resultType.GetClass(),member,pRelativeVar,resultType,0);
    531507                if(i3==0){
    532508                    //式エラー
     
    537513                    return -1;
    538514                }
    539 
    540                 *plpIndex=lp2;
    541515            }
    542516        }
     
    548522
    549523    if(lpPtrOffset[0]){
    550         if(!Debugging_SetRelativeOffset(pType,lpIndex,pRelativeVar,lpPtrOffset)) return 0;
     524        if(!Debugging_SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset)) return 0;
    551525    }
    552526
  • BasicCompiler64/amd64_main.cpp

    r73 r75  
    17911791/////////////////////////////
    17921792
    1793 void op_call( SubInfo *psi ){
     1793void op_call( UserProc *pUserProc ){
    17941794    OpBuffer[obp++] = (char)0xE8;
    1795     pobj_SubAddrSchedule->add( psi, 1 );
    1796     psi->bUse = 1;
     1795    pobj_SubAddrSchedule->add( pUserProc, 1 );
     1796    pUserProc->Using();
    17971797    obp += sizeof(long);
    17981798}
    1799 void op_call( DECLAREINFO *pdi ){
     1799void op_call( DllProc *pDllProc ){
    18001800    OpBuffer[obp++] = (char)0xFF;
    18011801    OpBuffer[obp++] = (char)0x15;
    1802     pobj_ImportAddrSchedule->add(pdi);
     1802    pobj_ImportAddrSchedule->add(pDllProc);
    18031803    obp += sizeof(long);
    18041804
    1805     pdi->bUse=1;
    1806 }
     1805    pDllProc->Using();
     1806}
  • BasicCompiler64/increment.cpp

    r11 r75  
    33
    44void IncDec(int idCalc, char *lpszLeft, char *lpszRight){
    5     int VarType;
    6     LONG_PTR lpVarIndex;
    7     RELATIVE_VAR VarRelativeVar;
    8 
    95
    106    ///////////////////////////
     
    128    ///////////////////////////
    139
     10    RELATIVE_VAR VarRelativeVar;
     11    Type varType;
    1412    if(!GetVarOffsetReadWrite(
    1513        lpszLeft,
    16         &VarType,
    1714        &VarRelativeVar,
    18         &lpVarIndex)) return;
     15        varType)) return;
    1916
    2017    //変数オフセットを一時退避
     
    3027
    3128    int reg;
    32     if(VarType==DEF_DOUBLE){
     29    if( varType.IsDouble() ){
    3330        reg=REG_XMM0;
    3431        SetXmmReg_DoubleVariable(&VarRelativeVar,reg);
    3532    }
    36     else if(VarType==DEF_SINGLE){
     33    else if( varType.IsSingle() ){
    3734        reg=REG_XMM0;
    3835        SetXmmReg_SingleVariable(&VarRelativeVar,reg);
     
    4037    else{
    4138        reg=REG_RAX;
    42         SetReg_WholeVariable(VarType,&VarRelativeVar,reg);
     39        SetReg_WholeVariable(varType.GetBasicType(),&VarRelativeVar,reg);
    4340    }
    4441
    4542
    46     if(IsWholeNumberType(VarType)&&lstrcmp(lpszRight,"1")==0&&
     43    if(varType.IsWhole()&&lstrcmp(lpszRight,"1")==0&&
    4744        (idCalc==CALC_ADDITION||idCalc==CALC_SUBTRACTION)){
    4845            if(idCalc==CALC_ADDITION){
     
    6057
    6158        //右辺を計算
    62         int CalcType;
    63         LONG_PTR lpCalcIndex;
     59        Type calcType;
    6460        if(reg==REG_RAX) reg=REG_RCX;
    6561        else reg=REG_RAX;
    66         CalcType=NumOpe(&reg,lpszRight,VarType,lpVarIndex,&lpCalcIndex);
     62        NumOpe(&reg,lpszRight,varType,calcType);
    6763
    6864        //レジスタのブロッキングを解除
     
    7066
    7167
    72         if(IsPtrType(VarType)&&IsWholeNumberType(CalcType)&&(!IsPtrType(CalcType))){
     68        if(varType.IsPointer()&&calcType.IsWhole()&&(!calcType.IsPointer())){
    7369            //左辺がポインタ型、右辺が整数型の場合は、エラーをださないようにする
    74             CalcType=VarType;
    75             lpCalcIndex=lpVarIndex;
     70            calcType = varType;
    7671        }
    7772
     
    8176        /////////////////////////////////
    8277
    83         CheckDifferentType(VarType,lpVarIndex,CalcType,lpCalcIndex,0,0);
     78        CheckDifferentType(varType,calcType,0,0);
    8479
    8580
     
    8883
    8984        //左辺用レジスタ
    90         if(IsRealNumberType(VarType))
     85        if(varType.IsReal())
    9186            pobj_reg->LockXmmReg();
    9287        else
     
    9489
    9590        //右辺値レジスタ
    96         if(VarType==DEF_DOUBLE)
    97             ChangeTypeToXmm_Double(CalcType,
     91        if(varType.IsDouble())
     92            ChangeTypeToXmm_Double(calcType.GetBasicType(),
    9893                pobj_reg->LockXmmReg(),
    9994                pobj_reg->GetNextReg());
    100         else if(VarType==DEF_SINGLE)
    101             ChangeTypeToXmm_Single(CalcType,
     95        else if(varType.IsSingle())
     96            ChangeTypeToXmm_Single(calcType.GetBasicType(),
    10297                pobj_reg->LockXmmReg(),
    10398                pobj_reg->GetNextReg());
    10499        else
    105             ChangeTypeToWhole(CalcType,VarType,
     100            ChangeTypeToWhole(calcType.GetBasicType(),varType.GetBasicType(),
    106101                pobj_reg->LockReg(),
    107102                pobj_reg->GetNextXmmReg());
    108103
    109         int type[255],sp;
     104        int type_stack[255],sp;
    110105        LONG_PTR index_stack[255];
    111         type[0]=VarType;
    112         type[1]=VarType;
    113         index_stack[0]=lpVarIndex;
    114         index_stack[1]=lpVarIndex;
     106        type_stack[0]=varType.GetBasicType();
     107        type_stack[1]=varType.GetBasicType();
     108        index_stack[0]=varType.GetIndex();
     109        index_stack[1]=varType.GetIndex();
    115110        sp=2;
    116111
     
    119114            case CALC_OR:
    120115            case CALC_AND:
    121                 CalcTwoTerm_Logical(idCalc,type,index_stack,&sp);
     116                CalcTwoTerm_Logical(idCalc,type_stack,index_stack,&sp);
    122117                break;
    123118            case CALC_SHL:
    124119            case CALC_SHR:
    125                 Calc_Shift(idCalc,type,&sp);
     120                Calc_Shift(idCalc,type_stack,&sp);
    126121                break;
    127122            case CALC_ADDITION:
    128123            case CALC_SUBTRACTION:
    129124            case CALC_PRODUCT:
    130                 CalcTwoTerm_Arithmetic(idCalc,type,index_stack,&sp);
     125                CalcTwoTerm_Arithmetic(idCalc,type_stack,index_stack,&sp);
    131126                break;
    132127            case CALC_MOD:
    133                 Calc_Mod(type,index_stack,&sp);
     128                Calc_Mod(type_stack,index_stack,&sp);
    134129                break;
    135130            case CALC_QUOTIENT:
    136                 Calc_Divide(type,&sp,VarType);
     131                Calc_Divide(type_stack,&sp,varType.GetBasicType());
    137132                break;
    138133            case CALC_INTQUOTIENT:
    139                 Calc_IntDivide(type,index_stack,&sp);
     134                Calc_IntDivide(type_stack,index_stack,&sp);
    140135                break;
    141136            case CALC_POWER:
    142                 Calc_Power(type,&sp);
     137                Calc_Power(type_stack,&sp);
    143138                break;
    144139        }
     
    160155    }
    161156
    162     SetVariableFromRax(VarType,VarType,&VarRelativeVar);
     157    SetVariableFromRax(varType.GetBasicType(),varType.GetBasicType(),&VarRelativeVar);
    163158}
  • BasicCompiler64/varlist.cpp

    r73 r75  
    77HWND hVarTree_Global,hVarTree_Local,hVarTree_This;
    88
    9 int VarList_Array(HWND hVarTree,HTREEITEM hParent,LONG_PTR offset,int type,int *SubScripts,LONG_PTR lpIndex);
    10 void VarList_Member(HWND hVarTree,HTREEITEM hParent,LONG_PTR pTopOffset,CClass *pobj_c,BOOL bPtr);
    11 void VarList_Insert(HWND hVarTree,TV_INSERTSTRUCT *lptv,char *VarName,int type,LONG_PTR offset,LONG_PTR lpIndex){
     9int VarList_Array(HWND hVarTree,HTREEITEM hParent,LONG_PTR offset,const Type &type,const int *SubScripts);
     10void VarList_Member(HWND hVarTree,HTREEITEM hParent,LONG_PTR pTopOffset,const CClass &objClass,BOOL bPtr);
     11void VarList_Insert(HWND hVarTree,TV_INSERTSTRUCT *lptv,const char *VarName,const Type &type,LONG_PTR offset){
    1212    extern HANDLE hDebugProcess;
    1313    int i2;
     
    2222    _int64 i64data;
    2323
    24     if(type==DEF_OBJECT||type==DEF_STRUCT){
    25         if( type==DEF_OBJECT ){
     24    if( type.IsObject() || type.IsStruct() ){
     25        if( type.IsObject() ){
    2626            // 参照型ということを考慮する
    2727            ReadProcessMemory(hDebugProcess,(void *)offset,&pData,sizeof(void *),&stAccBytes);
     
    3434        hParent=TreeView_InsertItem(hVarTree,lptv);
    3535
    36         VarList_Member(hVarTree,hParent,offset,(CClass *)lpIndex,0);
     36        VarList_Member(hVarTree,hParent,offset,type.GetClass(),0);
    3737        return;
    3838    }
    39     if(type==DEF_PTR_OBJECT||type==DEF_PTR_STRUCT){
     39    else if( type.IsObjectPtr() || type.IsStructPtr() ){
    4040        i2=ReadProcessMemory(hDebugProcess,(void *)offset,&pData,sizeof(void *),&stAccBytes);
    4141
     
    4545        hParent=TreeView_InsertItem(hVarTree,lptv);
    4646
    47         if(i2) VarList_Member(hVarTree,hParent,pData,(CClass *)lpIndex,1);
     47        if(i2) VarList_Member(hVarTree,hParent,pData,type.GetClass(),1);
    4848        return;
    4949    }
    5050    else{
    51         if(type==MAKE_PTR_TYPE(DEF_SBYTE,1)||type==MAKE_PTR_TYPE(DEF_BYTE,1)){
     51        if(type.GetBasicType()==MAKE_PTR_TYPE(DEF_SBYTE,1)||type.GetBasicType()==MAKE_PTR_TYPE(DEF_BYTE,1)){
    5252            if(ReadProcessMemory(hDebugProcess,(void *)offset,&pData,sizeof(void *),&stAccBytes)){
    5353                for(i2=0;;i2++){
     
    6767            else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
    6868        }
    69         else if(type==DEF_DOUBLE){
     69        else if(type.IsDouble()){
    7070            if(ReadProcessMemory(hDebugProcess,(void *)offset,&dbl,sizeof(double),&stAccBytes)){
    7171                sprintf(lptv->item.pszText,"%s %.15g",VarName,dbl);
     
    7373            else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
    7474        }
    75         else if(type==DEF_SINGLE){
     75        else if(type.IsSingle()){
    7676            if(ReadProcessMemory(hDebugProcess,(void *)offset,&flt,sizeof(float),&stAccBytes)){
    7777                sprintf(lptv->item.pszText,"%s %.6g",VarName,flt);
     
    7979            else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
    8080        }
    81         else if(type==DEF_INT64){
     81        else if(type.IsInt64()){
    8282            _int64 i64data;
    8383            if(ReadProcessMemory(hDebugProcess,(void *)offset,&i64data,sizeof(_int64),&stAccBytes)){
     
    8989            else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
    9090        }
    91         else if(type==DEF_QWORD||IsPtrType(type)){
     91        else if(type.IsQWord()||type.IsPointer()){
    9292            if(ReadProcessMemory(hDebugProcess,(void *)offset,&i64data,sizeof(_int64),&stAccBytes)){
    9393                _ui64toa(i64data,temporary,10);
     
    9898            else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
    9999        }
    100         else if(type==DEF_LONG){
     100        else if(type.IsLong()){
    101101            if(ReadProcessMemory(hDebugProcess,(void *)offset,&i64data,sizeof(_int64),&stAccBytes)){
    102102                sprintf(lptv->item.pszText,"%s %d(&H%X)",VarName,i64data,i64data);
     
    104104            else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
    105105        }
    106         else if(type==DEF_DWORD){
     106        else if(type.IsDWord()){
    107107            if(ReadProcessMemory(hDebugProcess,(void *)offset,&i64data,sizeof(_int64),&stAccBytes)){
    108108                sprintf(lptv->item.pszText,"%s %u(&H%X)",VarName,i64data,i64data);
     
    110110            else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
    111111        }
    112         else if(type==DEF_INTEGER || (isUnicode&&type==DEF_CHAR)){
     112        else if(type.IsInteger()){
    113113            if(ReadProcessMemory(hDebugProcess,(void *)offset,&wData,sizeof(WORD),&stAccBytes)){
    114114                sprintf(lptv->item.pszText,"%s %d(&H%X)",VarName,(short)wData,(short)wData);
     
    116116            else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
    117117        }
    118         else if(type==DEF_WORD){
     118        else if(type.IsWord()){
    119119            if(ReadProcessMemory(hDebugProcess,(void *)offset,&wData,sizeof(WORD),&stAccBytes)){
    120120                sprintf(lptv->item.pszText,"%s %u(&H%X)",VarName,wData,wData);
     
    122122            else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
    123123        }
    124         else if(type==DEF_SBYTE || (isUnicode==false&&type==DEF_CHAR)){
     124        else if(type.IsSByte()){
    125125            if(ReadProcessMemory(hDebugProcess,(void *)offset,&byteData,sizeof(BYTE),&stAccBytes)){
    126126                temporary[0]=byteData;
     
    130130            else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
    131131        }
    132         else if(type==DEF_BYTE){
     132        else if(type.IsByte()){
    133133            if(ReadProcessMemory(hDebugProcess,(void *)offset,&byteData,sizeof(BYTE),&stAccBytes)){
    134134                temporary[0]=byteData;
     
    138138            else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
    139139        }
    140         else if(type==DEF_BOOLEAN){
     140        else if(type.IsBoolean()){
    141141            if(ReadProcessMemory(hDebugProcess,(void *)offset,&byteData,sizeof(BYTE),&stAccBytes)){
    142142                if( byteData ) lstrcpy( temporary, "True" );
     
    152152    TreeView_InsertItem(hVarTree,lptv);
    153153}
    154 void VarList_Member(HWND hVarTree,HTREEITEM hParent,LONG_PTR pTopOffset,CClass *pobj_c,BOOL bPtr){
     154void VarList_Member(HWND hVarTree,HTREEITEM hParent,LONG_PTR pTopOffset,const CClass &objClass,BOOL bPtr){
    155155    int i,i2;
    156156    char VarData[VN_SIZE],VarName[VN_SIZE];
     
    163163    tv.item.pszText=VarData;
    164164
    165     for(i=0;i<pobj_c->iMemberNum;i++){
     165    for(i=0;i<objClass.iMemberNum;i++){
    166166        if(bPtr){
    167167            lstrcpy(VarName,"->");
    168             lstrcat(VarName,pobj_c->ppobj_Member[i]->name);
     168            lstrcat(VarName,objClass.ppobj_Member[i]->name);
    169169        }
    170170        else{
    171171            lstrcpy(VarName,".");
    172             lstrcat(VarName,pobj_c->ppobj_Member[i]->name);
     172            lstrcat(VarName,objClass.ppobj_Member[i]->name);
    173173        }
    174174
    175175        LONG_PTR offset;
    176         offset=pobj_c->GetMemberOffset( pobj_c->ppobj_Member[i]->name, &i2 );
    177 
    178         if(pobj_c->ppobj_Member[i]->SubScripts[0]!=-1){
     176        offset=objClass.GetMemberOffset( objClass.ppobj_Member[i]->name, &i2 );
     177
     178        if(objClass.ppobj_Member[i]->SubScripts[0]!=-1){
    179179            //構造体内の配列
    180180            sprintf(VarData,"%s %s(&H%X)",VarName,STRING_ARRAY,pTopOffset+offset);
     
    185185            i2=VarList_Array(hVarTree,hParent,
    186186                pTopOffset+offset,
    187                 pobj_c->ppobj_Member[i]->TypeInfo.type,
    188                 pobj_c->ppobj_Member[i]->SubScripts,
    189                 pobj_c->ppobj_Member[i]->TypeInfo.u.lpIndex);
     187                *objClass.ppobj_Member[i],
     188                objClass.ppobj_Member[i]->SubScripts);
    190189        }
    191190        else{
     
    194193                &tv,
    195194                VarName,
    196                 pobj_c->ppobj_Member[i]->TypeInfo.type,
    197                 pTopOffset+offset,
    198                 pobj_c->ppobj_Member[i]->TypeInfo.u.lpIndex);
    199         }
    200     }
    201 }
    202 int VarList_Array(HWND hVarTree,HTREEITEM hParent,LONG_PTR offset,int type,int *SubScripts,LONG_PTR lpIndex){
    203     int i,i2,i3,ElementNum,MemCounter,UseCount[255],TypeSize;
     195                *objClass.ppobj_Member[i],
     196                pTopOffset+offset);
     197        }
     198    }
     199}
     200int VarList_Array(HWND hVarTree,HTREEITEM hParent,LONG_PTR offset,const Type &type,const int *SubScripts ){
     201    int i,i2,i3,ElementNum,MemCounter,UseCount[255];
    204202    char temporary[VN_SIZE],temp2[DIGIT_SIZE];
    205203
     
    210208    tv.hParent=hParent;
    211209    tv.item.pszText=temporary;
    212 
    213     TypeSize=GetTypeSize(type,lpIndex);
    214210
    215211    for(i=0;i<255;i++){
     
    240236
    241237            VarList_Insert(hVarTree,&tv,temporary,type,
    242                 offset+MemCounter*TypeSize,
    243                 lpIndex);
     238                offset+MemCounter*type.GetSize());
    244239        }
    245240
     
    254249void RefreshGlobalVar(void){
    255250    extern DWORD ImageBase;
    256     int i;
    257251    char temporary[VN_SIZE];
    258252    TV_INSERTSTRUCT tv;
     
    269263    extern HANDLE hDebugProcess;
    270264    extern int MemPos_RWSection;
    271     extern int MaxGlobalVarNum;
    272     extern VARIABLE *GlobalVar;
    273 
    274     for(i=0;i<MaxGlobalVarNum;i++){
    275         VARIABLE *pVar=&GlobalVar[i];
     265
     266    foreach( Variable *pVar, globalVars ){
    276267
    277268        //スコープ外の場合は無視
     
    289280
    290281        if(!pobj_nv->bShow_DefaultSystem_Var){
    291             if(memcmp(pVar->name,"_System_",8)==0||
    292                 memcmp(pVar->name,"_DebugSys_",10)==0||
    293                 memcmp(pVar->name,"_PromptSys_",11)==0) continue;
     282            if(memcmp(pVar->GetName().c_str(),"_System_",8)==0||
     283                memcmp(pVar->GetName().c_str(),"_DebugSys_",10)==0||
     284                memcmp(pVar->GetName().c_str(),"_PromptSys_",11)==0) continue;
    294285        }
    295286        if(!pobj_nv->bShow_Rad_Var){
    296             if(memcmp(pVar->name,"_RadSys_",8)==0) continue;
     287            if(memcmp(pVar->GetName().c_str(),"_RadSys_",8)==0) continue;
    297288        }
    298289        if(!pobj_nv->bShow_GUID_Var){
    299             if(memcmp(pVar->name,"GUID_",5)==0||
    300                 memcmp(pVar->name,"IID_",4)==0||
    301                 memcmp(pVar->name,"CLSID_",6)==0) continue;
     290            if(memcmp(pVar->GetName().c_str(),"GUID_",5)==0||
     291                memcmp(pVar->GetName().c_str(),"IID_",4)==0||
     292                memcmp(pVar->GetName().c_str(),"CLSID_",6)==0) continue;
    302293        }
    303294
    304295        //静的メンバ
    305         if(strstr(pVar->name,".")) continue;
    306 
    307         if(pVar->bArray){
     296        if(strstr(pVar->GetName().c_str(),".")) continue;
     297
     298        if(pVar->IsArray()){
    308299            sprintf(temporary,"%s %s(&H%X)",
    309                 pVar->name,
     300                pVar->GetName().c_str(),
    310301                STRING_ARRAY,
    311302                ImageBase+MemPos_RWSection+pVar->offset);
     
    316307            VarList_Array(hVarTree_Global,hParent,
    317308                (LONG_PTR)(ImageBase+MemPos_RWSection+pVar->offset),
    318                 pVar->type,
    319                 pVar->SubScripts,
    320                 pVar->u.index);
     309                *pVar,
     310                pVar->GetSubScriptsPtr());
    321311        }
    322312        else{
    323313            VarList_Insert(hVarTree_Global,
    324314                &tv,
    325                 pVar->name,
    326                 pVar->type,
    327                 (LONG_PTR)(ImageBase+MemPos_RWSection+pVar->offset),
    328                 pVar->u.index);
     315                pVar->GetName().c_str(),
     316                *pVar,
     317                (LONG_PTR)(ImageBase+MemPos_RWSection+pVar->offset));
    329318        }
    330319    }
     
    354343    if(pobj_dti->lplpSpBase[i2]==0) return;
    355344
    356     extern SubInfo **ppSubHash;
    357     SubInfo *psi;
     345    extern UserProc **ppSubHash;
     346    UserProc *pUserProc;
    358347    for(i3=0,sw=0;i3<MAX_HASH;i3++){
    359         psi=ppSubHash[i3];
    360         while(psi){
    361             if(rva_to_real(psi->CompileAddress) <= pobj_dti->lplpObp[i2]  &&
    362                 pobj_dti->lplpObp[i2] < rva_to_real(psi->EndOpAddr)){
     348        pUserProc=ppSubHash[i3];
     349        while(pUserProc){
     350            if(rva_to_real(pUserProc->beginOpAddress) <= pobj_dti->lplpObp[i2]  &&
     351                pobj_dti->lplpObp[i2] < rva_to_real(pUserProc->endOpAddress)){
    363352                sw=1;
    364353                break;
    365354            }
    366355
    367             psi=psi->pNextData;
     356            pUserProc=pUserProc->pNextData;
    368357        }
    369358        if(sw) break;
    370359    }
    371     if(!psi) return;
    372 
    373     for(i=0;i<psi->VarNum;i++){
    374         VARIABLE *pVar=&psi->pVar[i];
     360    if(!pUserProc) return;
     361
     362    foreach( Variable *pVar, UserProc::CompilingUserProc().localVars ){
    375363
    376364        //スコープ外の場合は無視
     
    386374        }
    387375
    388         if(pVar->bArray){
     376        if(pVar->IsArray()){
    389377            sprintf(temporary,"%s %s(&H%X)",
    390                 pVar->name,
     378                pVar->GetName().c_str(),
    391379                STRING_ARRAY,
    392380                pobj_dti->lplpSpBase[i2]+pVar->offset);
     
    397385            VarList_Array(hVarTree_Local,hParent,
    398386                pobj_dti->lplpSpBase[i2]+pVar->offset,
    399                 pVar->type,
    400                 pVar->SubScripts,
    401                 pVar->u.index);
     387                *pVar,
     388                pVar->GetSubScriptsPtr());
    402389        }
    403390        else{
    404391            offset=pobj_dti->lplpSpBase[i2]+pVar->offset;
    405             if(pVar->fRef){
     392            if(pVar->IsRef()){
    406393                ReadProcessMemory(hDebugProcess,(void *)offset,&lpData,sizeof(LONG_PTR),&stAccBytes);
    407394                offset=lpData;
    408395            }
    409396            VarList_Insert(hVarTree_Local,&tv,
    410                 pVar->name,
    411                 pVar->type,
    412                 offset,
    413                 pVar->u.index);
     397                pVar->GetName().c_str(),
     398                *pVar,
     399                offset);
    414400        }
    415401    }
     
    422408
    423409    TreeView_DeleteAllItems(hVarTree_This);
    424     if(!psi->pobj_ParentClass) return;
     410    if(!pUserProc->GetParentClassPtr()) return;
    425411
    426412    //Thisポインタを取得
    427413    LONG_PTR pThis;
    428     for(i=0;i<psi->VarNum;i++){
    429         if(lstrcmp(psi->pVar[i].name,"_System_LocalThis")==0) break;
    430     }
    431     if(i==psi->VarNum) return;
    432     lpData=pobj_dti->lplpSpBase[i2]+psi->pVar[i].offset;
     414    const Variable *pVar = UserProc::CompilingUserProc().localVars.Find( "_System_LocalThis" );
     415    if( !pVar ){
     416        return;
     417    }
     418    lpData=pobj_dti->lplpSpBase[i2]+pVar->offset;
    433419    ReadProcessMemory(hDebugProcess,(void *)lpData,&pThis,sizeof(LONG_PTR),&stAccBytes);
    434420
    435     for(i=0;i<psi->pobj_ParentClass->iMemberNum;i++){
    436         offset=psi->pobj_ParentClass->GetMemberOffset( psi->pobj_ParentClass->ppobj_Member[i]->name,&i2);
    437 
    438         if(psi->pobj_ParentClass->ppobj_Member[i]->SubScripts[0]!=-1){
     421    for(i=0;i<pUserProc->GetParentClassPtr()->iMemberNum;i++){
     422        offset=pUserProc->GetParentClassPtr()->GetMemberOffset( pUserProc->GetParentClassPtr()->ppobj_Member[i]->name,&i2);
     423
     424        if(pUserProc->GetParentClassPtr()->ppobj_Member[i]->SubScripts[0]!=-1){
    439425            //配列
    440426            sprintf(temporary,"%s %s(&H%X)",
    441                 psi->pobj_ParentClass->ppobj_Member[i]->name,
     427                pUserProc->GetParentClassPtr()->ppobj_Member[i]->name,
    442428                STRING_ARRAY,
    443429                (DWORD64)offset);
     
    448434            VarList_Array(hVarTree_This,hParent,
    449435                pThis+offset,
    450                 psi->pobj_ParentClass->ppobj_Member[i]->TypeInfo.type,
    451                 psi->pobj_ParentClass->ppobj_Member[i]->SubScripts,
    452                 psi->pobj_ParentClass->ppobj_Member[i]->TypeInfo.u.lpIndex);
     436                *pUserProc->GetParentClassPtr()->ppobj_Member[i],
     437                pUserProc->GetParentClassPtr()->ppobj_Member[i]->SubScripts);
    453438        }
    454439        else{
    455440            VarList_Insert(hVarTree_This,&tv,
    456                 psi->pobj_ParentClass->ppobj_Member[i]->name,
    457                 psi->pobj_ParentClass->ppobj_Member[i]->TypeInfo.type,
    458                 pThis+offset,
    459                 psi->pobj_ParentClass->ppobj_Member[i]->TypeInfo.u.lpIndex);
     441                pUserProc->GetParentClassPtr()->ppobj_Member[i]->name,
     442                *pUserProc->GetParentClassPtr()->ppobj_Member[i],
     443                pThis+offset);
    460444        }
    461445    }
     
    489473
    490474void SetCalcToWatchList(HWND hListView,int iItem,char *buffer){
    491     int i;
    492475    char temporary[255],temp2[255];
    493476
     
    498481
    499482    //カッコを相互チェック
    500     if(!CheckParenthesis2(buffer)){
    501         ListView_SetItemText(hListView,iItem,1,"式の解析に失敗");
     483    if(!CheckParenthesis2(buffer)){ListView_SetItemText(hListView,iItem,1,"式の解析に失敗");
    502484        return;
    503485    }
     
    505487    double dbl;
    506488    _int64 i64data;
    507     i=StaticCalculation(true, buffer,0,&i64data,0,1);
    508     if(IsRealNumberType(i)){
    509         memcpy(&dbl,&i64data,sizeof(double));
    510     }
    511 
    512     if(i==0){
     489    Type resultType;
     490    bool isMemoryAccessError;
     491    if( !StaticCalculation(true, buffer,0,&i64data,resultType,1,&isMemoryAccessError) ){
    513492        ListView_SetItemText(hListView,iItem,1,"式の解析に失敗");
    514493    }
    515     else if(i==-1){
     494    else if(isMemoryAccessError){
    516495        ListView_SetItemText(hListView,iItem,1,"アクセスできません");
    517496    }
    518497    else{
    519         if(IsRealNumberType(i))
     498        if(resultType.IsReal()){
     499            memcpy(&dbl,&i64data,sizeof(double));
    520500            sprintf(temporary,"%.15g (&H%08X)",dbl,(int)dbl);
    521         else if(Is64Type(i)){
     501        }
     502        else if(resultType.Is64()){
    522503            _i64toa(i64data,temporary,10);
    523504            _i64toa(i64data,temp2,16);
     
    586567
    587568    //プロシージャ コンボボックス
    588     extern SubInfo **ppSubHash;
    589     SubInfo *psi;
     569    extern UserProc **ppSubHash;
     570    UserProc *pUserProc;
    590571    int sw;
    591572    SendMessage(hProcCombo,CB_RESETCONTENT,0,0);
    592573    for(i2=pobj_dti->iProcLevel;i2>=0;i2--){
    593574        for(i3=0,sw=0;i3<MAX_HASH;i3++){
    594             psi=ppSubHash[i3];
    595             while(psi){
    596                 if(rva_to_real(psi->CompileAddress) <= pobj_dti->lplpObp[i2]  &&
    597                     pobj_dti->lplpObp[i2] < rva_to_real(psi->EndOpAddr)){
    598                     lstrcpy(temporary,psi->name);
    599                     sw=1;
    600                     break;
     575            pUserProc=ppSubHash[i3];
     576            while(pUserProc){
     577                if(rva_to_real(pUserProc->beginOpAddress) <= pobj_dti->lplpObp[i2]  &&
     578                    pobj_dti->lplpObp[i2] < rva_to_real(pUserProc->endOpAddress)){
     579                        lstrcpy(temporary,pUserProc->GetName().c_str());
     580                        sw=1;
     581                        break;
    601582                }
    602                 psi=psi->pNextData;
     583                pUserProc=pUserProc->pNextData;
    603584            }
    604585            if(sw) break;
    605586        }
    606         if(!psi){
     587        if(!pUserProc){
    607588            if(i2==0){
    608589                lstrcpy(temporary,"Global");
     
    699680    ///////////////////////////////////////////////
    700681
    701     extern VARIABLE *LocalVar;
    702     extern int MaxLocalVarNum;
    703682    int sw;
    704 
    705     MaxLocalVarNum=0;
    706683
    707684    i2=(int)SendDlgItemMessage(hDebugWnd,IDC_PROCCOMBO,CB_GETCURSEL,0,0);
     
    709686
    710687    if(pobj_dti->lplpSpBase[i2]){
    711         extern SubInfo **ppSubHash;
    712         SubInfo *psi;
     688        extern UserProc **ppSubHash;
     689        UserProc *pUserProc;
    713690        for(i3=0,sw=0;i3<MAX_HASH;i3++){
    714             psi=ppSubHash[i3];
    715             while(psi){
    716                 if(rva_to_real(psi->CompileAddress) <= pobj_dti->lplpObp[i2]  &&
    717                     pobj_dti->lplpObp[i2] < rva_to_real(psi->EndOpAddr)){
     691            pUserProc=ppSubHash[i3];
     692            while(pUserProc){
     693                if(rva_to_real(pUserProc->beginOpAddress) <= pobj_dti->lplpObp[i2]  &&
     694                    pobj_dti->lplpObp[i2] < rva_to_real(pUserProc->endOpAddress)){
    718695                    sw=1;
    719696                    break;
    720697                }
    721698
    722                 psi=psi->pNextData;
     699                pUserProc=pUserProc->pNextData;
    723700            }
    724701            if(sw) break;
     
    726703
    727704
    728         if(psi){
    729             LocalVar=psi->pVar;
    730             MaxLocalVarNum=psi->VarNum;
    731 
    732             pobj_CompilingClass=psi->pobj_ParentClass;
     705        if(pUserProc){
     706            pobj_CompilingClass=pUserProc->GetParentClassPtr();
     707            UserProc::CompileStartForUserProc( pUserProc );
    733708        }
    734709    }
Note: See TracChangeset for help on using the changeset viewer.