Changeset 64 in dev


Ignore:
Timestamp:
Mar 8, 2007, 2:49:34 AM (17 years ago)
Author:
dai_9181
Message:

すべてのオブジェクトを参照型に切り替えた。

Files:
57 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler32/CParameter.cpp

    r63 r64  
    22#include "opcode.h"
    33
    4 void CParameter::NewTempParameters( const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum ){
     4int CParameter::NewTempParameters( const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum ){
    55    ///////////////////////////////////////////////////////
    66    // 一時オブジェクトをあらかじめスタックに積んでおく
    77    ///////////////////////////////////////////////////////
    8     //TODO: 64ビットコードのままなので、32ビット用に書き換える
    98
    109    useTempObject = false;
    1110
    12     //一時オブジェクトの数
     11    //一時参照の数
    1312    nCountOfTempObjects = 0;
    1413
     
    6463                int type = NumOpe( Parms[i2], DummyTypeInfo.type, DummyTypeInfo.u.lpIndex, &lpVarIndex );
    6564                //↑ここでスタックに積む
     65
     66                nCountOfTempObjects++;
     67
     68                if( type == DEF_OBJECT ){
     69                    //一時参照を作成
     70
     71                    //push esp
     72                    op_push( REG_ESP );
     73
     74                    nCountOfTempObjects++;
     75                }
    6676
    6777                bool result = CheckDifferentType(
     
    8090                    types[i2].u.lpIndex = lpVarIndex;
    8191                }
    82 
    83                 nCountOfTempObjects++;
    84             }
    85         }
    86     }
     92            }
     93        }
     94    }
     95
     96    return nCountOfTempObjects * PTR_SIZE;
    8797}
     98
    8899void CParameter::DeleteTempParameters(){
    89100    ///////////////////////////////////////////////////////
    90101    // 一時オブジェクトを破棄
    91102    ///////////////////////////////////////////////////////
    92     //TODO: 64ビットコードのままなので、32ビット用に書き換える
    93 
    94103    if( !useTempObject ) return;
    95104
    96105    for(int i2=ParmsNum-1;i2>=0;i2--){
    97106        if( useTempParameters[i2] ){
    98             //スタックフレームから取得
    99             // ※関数呼び出し時も値が普遍のebxを利用する
    100             op_pop(REG_EBX);
    101 
    102 
    103             ///////////////////////////
    104             // デストラクタを呼び出す
    105             ///////////////////////////
    106 
    107             //push ebx
    108             op_push(REG_EBX);
    109 
    110             //call destructor
    111             CMethod *method = types[i2].u.pobj_Class->GetDestructorMethod();
    112             if( method ){
    113                 op_call( method->psi );
    114             }
    115 
    116 
    117             /////////////////////////
    118             // メモリを解放する
    119             /////////////////////////
    120 
    121             //push ebx
    122             op_push(REG_EBX);
    123 
    124             //call free
    125             extern SUBINFO *pSub_free;
    126             op_call(pSub_free);
     107            if( types[i2].type == DEF_STRUCT ){
     108                // 構造体の一時メモリ
     109
     110                //メモリを解放する
     111
     112                //call free
     113                extern SUBINFO *pSub_free;
     114                op_call(pSub_free);
     115            }
     116            else if( types[i2].type == DEF_OBJECT ){
     117                op_pop( REG_NON );
     118                op_pop( REG_NON );
     119            }
     120            else{
     121                SetError(300,NULL,cp);
     122            }
     123
    127124        }
    128125    }
    129126}
    130127
    131 void CParameter::SetObjectParameter(CClass *pobj_Class,LPSTR Parameter){
     128void CParameter::SetStructParameter(CClass *pobj_Class,LPSTR Parameter){
    132129    int object_size = pobj_Class->GetSize();
    133130
     
    143140
    144141
    145     TYPEINFO BaseType={DEF_OBJECT,(LONG_PTR)pobj_Class};
     142    TYPEINFO BaseType={DEF_STRUCT,(LONG_PTR)pobj_Class};
    146143    TYPEINFO CalcType;
    147144    CalcType.type=NumOpe_GetType(Parameter,&BaseType,&CalcType.u.lpIndex);
    148145
     146    /*
     147    TODO: 消す
    149148    if( pobj_Class->GetCopyConstructorMethod()
    150149        && CalcType.type==DEF_OBJECT&&CalcType.u.pobj_Class==pobj_Class){
     
    185184        }
    186185    }
    187     else{
     186    else{*/
     187
     188
    188189        //push eax
    189190        op_push(REG_EAX);
    190191
    191 
     192/*
     193            TODO: 消す
    192194            if( pobj_Class->GetConstructorMethod() ){
    193195                ////////////////////////////////
     
    201203                op_call(pobj_Class->GetConstructorMethod()->psi);
    202204            }
    203 
    204 
    205             TYPEINFO CalcType;
     205*/
     206
    206207            BOOL bUseHeap;
    207             CalcType.type=NumOpe(Parameter,DEF_OBJECT,(LONG_PTR)pobj_Class,&CalcType.u.lpIndex,&bUseHeap);
    208 
    209 
    210 
    211         SetObjectVariable((LONG_PTR)pobj_Class,CalcType.type,CalcType.u.lpIndex,bUseHeap);
    212     }
     208            CalcType.type=NumOpe(Parameter,DEF_STRUCT,(LONG_PTR)pobj_Class,&CalcType.u.lpIndex,&bUseHeap);
     209
     210
     211
     212        SetStructVariable((LONG_PTR)pobj_Class,CalcType.type,CalcType.u.lpIndex,bUseHeap);
     213    //}
    213214}
    214215
     
    280281            }
    281282
    282             if(DummyTypeInfo.type==DEF_OBJECT){
    283                 SetObjectParameter(DummyTypeInfo.u.pobj_Class,Parms[i2]);
     283            if(DummyTypeInfo.type==DEF_STRUCT){
     284                SetStructParameter(DummyTypeInfo.u.pobj_Class,Parms[i2]);
    284285                goto next;
    285286            }
     
    299300
    300301            if(CalcType==DEF_OBJECT){
    301                 //キャスト演算子のオーバーロードに対応する
    302                 CallCastOperatorProc(CalcType,lpCalcIndex,bCalcUseHeap,DummyTypeInfo.type,DummyTypeInfo.u.lpIndex);
     302                if( DummyTypeInfo.type != DEF_OBJECT
     303                    ||
     304                    DummyTypeInfo.type == DEF_OBJECT &&
     305                    !DummyTypeInfo.u.pobj_Class->IsEqualsOrSubClass( (CClass *)lpCalcIndex ) ){
     306                        //キャスト演算子のオーバーロードに対応する
     307                        CallCastOperatorProc(CalcType,lpCalcIndex,bCalcUseHeap,DummyTypeInfo.type,DummyTypeInfo.u.lpIndex);
     308                }
    303309            }
    304310
     
    328334                ParmSize+=sizeof(long)*2;
    329335            }
    330             else if(DummyTypeInfo.type==DEF_LONG||DummyTypeInfo.type==DEF_DWORD||
     336            else if(DummyTypeInfo.type==DEF_LONG||DummyTypeInfo.type==DEF_DWORD||DummyTypeInfo.type==DEF_OBJECT||DummyTypeInfo.type==DEF_STRUCT||
    331337                (IsPtrType(DummyTypeInfo.type)/*&&DummyTypeInfo.type!=DEF_PTR_VOID&&DummyTypeInfo.type!=DEF_PTR_BYTE*/)){
    332338                ChangeTypeToLong(CalcType);
     
    354360            }
    355361            else{
    356                 //変数のアドレスを取得
    357                 int VarType;
    358                 LONG_PTR lpVarIndex;
    359                 if(GetVarOffset(
    360                     false,
    361                     false,
    362                     Parms[i2],
    363                     &VarType,
    364                     &RelativeVar,
    365                     &lpVarIndex)){
    366                         if(DummyTypeInfo.type!=DEF_ANY){
    367                             //型チェックを行う
    368                             if(DummyTypeInfo.type==VarType){
    369                                 if(DummyTypeInfo.type==DEF_OBJECT){
    370                                     if( !DummyTypeInfo.u.pobj_Class->IsEqualsOrSubClass( (CClass *)lpVarIndex ) ){
    371                                         SetError(11,Parms[i2],cp);
    372                                     }
    373                                 }
    374                             }
    375                             else if((VarType&FLAG_PTR)&&((int)(VarType^FLAG_PTR)==DummyTypeInfo.type)){
    376                                 //仮引数がポインタ参照で、実引数が配列の先頭ポインタのとき
    377                             }
    378                             else{
    379                                 SetError(11,Parms[i2],cp);
    380                             }
    381                         }
    382 
    383                         //変数アドレスをレジスタにセット
    384                         SetVarPtrToEax(&RelativeVar);
    385 
    386                         //push eax
    387                         op_push(REG_EAX);
    388                 }
    389                 else{
     362                if( useTempParameters[i2] ){
    390363                    //一時オブジェクトをコピー
     364
     365                    if( types[i2].type == DEF_OBJECT ){
     366                        // 一時参照のための領域を考慮する
     367                        nCountOfNowTempObjects++;
     368                    }
     369
     370                    nCountOfNowTempObjects++;
    391371
    392372                    //mov eax, dword ptr[esp+offset]
     
    395375                        REG_EAX,
    396376                        REG_ESP,
    397                         ( ( ParmsNum - i2 - 1 ) + ( nCountOfTempObjects - nCountOfNowTempObjects - 1 ) ) * PTR_SIZE,
     377                        ( ( ParmsNum - i2 - 1 ) + ( nCountOfTempObjects - nCountOfNowTempObjects ) ) * PTR_SIZE,
    398378                        MOD_BASE_DISP32 );
    399 
    400                     nCountOfNowTempObjects++;
    401379
    402380                    //push eax
    403381                    op_push(REG_EAX);
    404 
    405                     //VarType = NumOpe( Parms[i2], DummyTypeInfo.type, DummyTypeInfo.u.lpIndex, &lpVarIndex );
     382                }
     383                else{
     384                    //変数のアドレスを取得
     385                    int VarType;
     386                    LONG_PTR lpVarIndex;
     387                    if(GetVarOffset(
     388                        false,
     389                        false,
     390                        Parms[i2],
     391                        &VarType,
     392                        &RelativeVar,
     393                        &lpVarIndex)){
     394                            if(DummyTypeInfo.type!=DEF_ANY){
     395                                //型チェックを行う
     396                                if(DummyTypeInfo.type==VarType){
     397                                    if(DummyTypeInfo.type==DEF_OBJECT){
     398                                        if( !DummyTypeInfo.u.pobj_Class->IsEqualsOrSubClass( (CClass *)lpVarIndex ) ){
     399                                            SetError(11,Parms[i2],cp);
     400                                        }
     401                                    }
     402                                    else if(DummyTypeInfo.type==DEF_STRUCT){
     403                                        if( !DummyTypeInfo.u.pobj_Class->IsEquals( (CClass *)lpVarIndex ) ){
     404                                            SetError(11,Parms[i2],cp);
     405                                        }
     406                                    }
     407                                }
     408                                else if((VarType&FLAG_PTR)&&((int)(VarType^FLAG_PTR)==DummyTypeInfo.type)){
     409                                    //仮引数がポインタ参照で、実引数が配列の先頭ポインタのとき
     410                                }
     411                                else{
     412                                    SetError(11,Parms[i2],cp);
     413                                }
     414                            }
     415
     416                            //変数アドレスをレジスタにセット
     417                            SetVarPtrToEax(&RelativeVar);
     418
     419                            //push eax
     420                            op_push(REG_EAX);
     421                    }
    406422                }
    407423            }
  • BasicCompiler32/Compile_Calc.cpp

    r62 r64  
    364364    //push eax
    365365    op_push(REG_EAX);
     366}
     367
     368
     369
     370
     371
     372
     373
     374
     375
     376void RestoreDefaultRegisterFromStackMemory( int type ){
     377    //現在のスタックの内容を実数レジスタに保存する
     378    //NumOpeの直後専用
     379    if(type==DEF_DOUBLE){
     380        //fld qword ptr[esp]
     381        op_fld_ptr_esp(DEF_DOUBLE);
     382
     383        //add esp,8
     384        op_add_esp(8);
     385    }
     386    else if(type==DEF_SINGLE){
     387        //fld dword ptr[esp]
     388        op_fld_ptr_esp(DEF_SINGLE);
     389
     390        //add esp,4
     391        op_add_esp(4);
     392    }
     393    else if( Is64Type( type ) ){
     394        //pop eax
     395        op_pop(REG_EAX);
     396
     397        //pop edx
     398        op_pop(REG_EDX);
     399    }
     400    else{
     401        //pop eax
     402        op_pop(REG_EAX);
     403    }
     404}
     405
     406void SetVariableFromEax(int VarType,int CalcType,RELATIVE_VAR *pRelativeVar){
     407    /////////////////////////////////////////////////
     408    // eaxの内容を変数にコピーするコードを抽出
     409    /////////////////////////////////////////////////
     410
     411    if(VarType==DEF_BOOLEAN){
     412        //bool
     413        SetBooleanVariable(CalcType,pRelativeVar);
     414    }
     415    else if( IsRealNumberType( VarType ) ){
     416        // Double/Single型変数へレジスタの値を代入
     417        SetRealVariable(VarType, CalcType, pRelativeVar);
     418    }
     419    else if( IsWholeNumberType( VarType ) || VarType == DEF_OBJECT ){
     420        int typeSize = GetTypeSize( VarType, -1 );
     421
     422        //整数変数へraxの値を格納する
     423        SetWholeVariable( typeSize, CalcType, pRelativeVar );
     424    }
     425    else{
     426        SetError(300,NULL,cp);
     427    }
    366428}
    367429
     
    485547    }
    486548
     549
     550    if( lstrcmpi( variable, "This" ) == 0 ){
     551        SetError(133,NULL,cp);
     552        return;
     553    }
     554
     555
    487556    ////////////////////////////////////////
    488557    // 変数のタイプ型を識別して、演算を行う
     
    511580    else ProcPtr_BaseIndex=-1;
    512581
    513     if(VarType==DEF_OBJECT){
    514         //代入演算のオーバーロード オペレータに備える
     582    if(VarType==DEF_STRUCT){
     583        //代入コピーに備える
    515584
    516585        //変数アドレスを取得
     
    544613    }
    545614
    546     if(VarType==DEF_OBJECT){
     615    if(VarType==DEF_STRUCT){
    547616        //オブジェクトインスタンスへの代入
    548         SetObjectVariable(lpVarIndex,CalcType,lpCalcIndex,bCalcUseHeap);
     617        SetStructVariable(lpVarIndex,CalcType,lpCalcIndex,bCalcUseHeap);
    549618        return;
    550619    }
    551620
    552     if(CalcType==DEF_OBJECT){
     621    if(CalcType==DEF_OBJECT && (CalcType!=VarType || lpCalcIndex!=lpVarIndex) ){
    553622        //キャスト演算子のオーバーロードに対応する
    554623        CallCastOperatorProc(CalcType,lpCalcIndex,bCalcUseHeap,VarType,lpVarIndex);
     
    568637    /////////////////////////////////////////////////
    569638
     639    //eax、edx:eax、またはst(0)にスタック上のデータを取り出す
     640    RestoreDefaultRegisterFromStackMemory( CalcType );
     641
     642    SetVariableFromEax( VarType, CalcType, &VarRelativeVar );
     643/*
     644    TODO: 消す
    570645    if(VarType==DEF_BOOLEAN){
    571646        //bool
     
    598673        //Single型変数へスタックの内容を格納する
    599674        SetSingleVariable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset);
    600     }
    601 }
    602 
     675    }*/
     676}
     677
     678
     679// TODO: 消す
     680/*
    603681void SetRefVariable( const char *varname, const char *expression ){
    604682    ////////////////////////////////////////
     
    721799    }
    722800}
     801*/
  • BasicCompiler32/Compile_CallProc.cpp

    r63 r64  
    9494}
    9595
    96 void Opcode_CallProc(char *Parameter,SUBINFO *psi,DWORD dwFlags,char *ObjectName,int RefType){
     96void Opcode_CallProc(const char *Parameter,SUBINFO *psi,DWORD dwFlags,char *ObjectName,int RefType){
    9797    int i2;
    9898
     
    206206
    207207    ///////////////////////////////////////////////////////////////
    208     // _System_LocalThis、_System_ReturnObjectのダミーをセット
     208    // _System_LocalThisのダミーをセット
    209209    ///////////////////////////////////////////////////////////////
    210210
     
    215215    }
    216216
    217     if(psi->ReturnType==DEF_OBJECT && psi->isReturnRef == false ){
    218         //_System_ReturnObject(第一または第二パラメータのダミーを作成)
    219         sprintf(temporary+lstrlen(temporary),"%c%c0,",1,ESC_BYVAL);
    220     }
    221 
    222217    if(Parameter[0]=='\0'&&temporary[0])
    223218        temporary[lstrlen(temporary)-1]=0;
     
    246241
    247242    //一時オブジェクトを生成
    248     pobj_parameter->NewTempParameters( psi->name,psi->pRealParmInfo,psi->RealParmNum,psi->RealSecondParmNum );
     243    int tempSize = pobj_parameter->NewTempParameters( psi->name,psi->pRealParmInfo,psi->RealParmNum,psi->RealSecondParmNum );
    249244
    250245    //レジスタ、スタックフレームにセット
     
    252247    ParmSize=pobj_parameter->SetParameter(psi->name,psi->pRealParmInfo,psi->RealParmNum,psi->RealSecondParmNum);
    253248
    254 
    255     if(psi->ReturnType==DEF_OBJECT && psi->isReturnRef == false){
     249    if(psi->ReturnType==DEF_STRUCT && psi->isReturnRef == false){
    256250        //////////////////////////////////////////////////////
    257         // 戻り値にオブジェクト インスタンスを持つ場合
    258         // ※ByRef _System_ReturnObject パラメータをセット
     251        // 戻り値に構造体インスタンスを持つ場合
     252        // ※ByRef _System_ReturnValue パラメータをセット
    259253        //////////////////////////////////////////////////////
    260254
     
    294288                SetVarPtrToEax(&RelativeVar);
    295289
    296                 //参照タイプが "->" の場合
    297                 if(RefType==DEF_PTR_OBJECT){
    298                     //mov eax,dword ptr[eax]
    299                     OpBuffer[obp++]=(char)0x8B;
    300                     OpBuffer[obp++]=(char)0x00;
    301                 }
    302 
    303                 //mov ecx,eax
    304                 OpBuffer[obp++]=(char)0x8B;
    305                 OpBuffer[obp++]=(char)0xC8;
     290                // 参照を実体ポインタにする
     291                op_mov_RM( sizeof(long), REG_ECX, REG_EAX, 0, MOD_BASE );
    306292            }
    307293        }
     
    310296            if(dwFlags&PROCFLAG_NEW){
    311297                //New演算子によるコンストラクタ呼び出しの場合
     298
    312299                //mov ecx,dword ptr[esp+ParmSize]
    313                 OpBuffer[obp++]=(char)0x8B;
    314                 OpBuffer[obp++]=(char)0x8C;
    315                 OpBuffer[obp++]=(char)0x24;
    316                 *((long *)(OpBuffer+obp))=ParmSize;
    317                 obp+=sizeof(long);
     300                op_mov_RM( sizeof(long), REG_ECX, REG_ESP, ParmSize + tempSize, MOD_BASE_DISP32 );
    318301            }
    319302            else{
  • BasicCompiler32/Compile_Func.cpp

    r51 r64  
    208208
    209209    TYPEINFO TypeInfo={type,lpIndex};
    210     if(IsStringObjectType(&TypeInfo)){
     210    if(IsStringObjectType(TypeInfo)){
    211211        //Stringオブジェクトの場合
    212212        char temporary[VN_SIZE];
     
    346346}
    347347void Opcode_Func_SizeOf(const char *Parameter){
    348     int type,size;
    349348    LONG_PTR lpIndex;
    350 
    351     type=GetTypeFixed(Parameter,&lpIndex);
    352     if(type==-1){
    353         extern int cp;
    354         SetError(3,Parameter,cp);
    355         return;
    356     }
    357     size=GetTypeSize(type,lpIndex);
     349    int type = GetTypeFixed(Parameter,&lpIndex);
     350
     351    int size;
     352    if( type == DEF_OBJECT ){
     353        CClass *pClass = (CClass *)lpIndex;
     354        size = pClass->GetSize();
     355    }
     356    else{
     357        size=GetTypeSize(type,lpIndex);
     358    }
    358359
    359360    //mov eax,size
    360     OpBuffer[obp++]=(char)0xB8;
    361     *((long *)(OpBuffer+obp))=size;
    362     obp+=sizeof(long);
     361    op_mov_RV( REG_EAX, size );
    363362}
    364363void Opcode_Func_VarPtr( const char *Parameter, TYPEINFO &ReturnTypeInfo ){
     
    368367    if(!GetVarOffsetReadOnly( Parameter, &ReturnTypeInfo.type, &RelativeVar, &ReturnTypeInfo.u.lpIndex )) return;
    369368
     369    int beforeType = ReturnTypeInfo.type;
     370
    370371    PTR_LEVEL_UP( ReturnTypeInfo.type );
    371372
    372373    SetVarPtrToEax(&RelativeVar);
     374
     375    if( beforeType == DEF_OBJECT && lstrcmpi( Parameter, "This" ) != 0 ){
     376        //参照をオブジェクトポインタに変更
     377
     378        //mov eax,dword ptr[eax]
     379        op_mov_RM( sizeof(long), REG_EAX, REG_EAX, 0, MOD_BASE );
     380    }
    373381}
    374382void Opcode_Func_GetPtrData(const char *Parameter,const int type){
  • BasicCompiler32/Compile_Object.cpp

    r51 r64  
    22#include "opcode.h"
    33
    4 void _call_constructor(CClass *pobj_c,char *CreateParameter,int ObjectSize,BOOL bSomeObjects){
     4void _call_constructor(CClass *pobj_c, const char *CreateParameter,int ObjectSize,BOOL bSomeObjects){
    55    ////////////////////////////
    66    // コンストラクタの呼び出し
     
    7474    }
    7575}
    76 int Operator_New(const char *Parameter,LONG_PTR *plpIndex){
    77     char TypeName[VN_SIZE],CreateParameter[VN_SIZE],ObjectSize[VN_SIZE];
     76void Operator_New( CClass &classObj, const char *objectSizeStr, const char *parameter, const TYPEINFO &baseTypeInfo ){
     77    int typeSize = classObj.GetSize();
     78
     79    if(classObj.IsAbstract()){
     80        //抽象クラスだったとき
     81        SetError(125,classObj.name,cp);
     82    }
     83
     84    if(objectSizeStr[0]){
     85        int type = NumOpe(objectSizeStr,0,0,0);
     86        ChangeTypeToLong(type);
     87
     88        //pop eax
     89        op_pop(REG_EAX);
     90
     91        //※添え字上限値であることを考慮
     92        //add eax,1
     93        OpBuffer[obp++]=(char)0x83;
     94        OpBuffer[obp++]=(char)0xC0;
     95        OpBuffer[obp++]=(char)0x01;
     96
     97        //オブジェクトの個数をebxに一時保持
     98        //※ebxは関数が呼ばれても不変
     99        //mov ebx,eax
     100        OpBuffer[obp++]=(char)0x8B;
     101        OpBuffer[obp++]=(char)0xD8;
     102
     103        //imul eax,size
     104        OpBuffer[obp++]=(char)0x69;
     105        OpBuffer[obp++]=(char)0xC0;
     106        *((long *)(OpBuffer+obp))=typeSize;
     107        obp+=sizeof(long);
     108
     109        //add eax,sizeof(DWORD)*2
     110        OpBuffer[obp++]=(char)0x05;
     111        *((long *)(OpBuffer+obp))=sizeof(DWORD)*3;
     112        obp+=sizeof(long);
     113
     114        //push eax
     115        op_push(REG_EAX);
     116    }
     117    else{
     118        //オブジェクトの個数をebxに一時保持
     119        //※ebxは関数が呼ばれても不変
     120        //mov ebx,1
     121        OpBuffer[obp++]=(char)0xBB;
     122        *((long *)(OpBuffer+obp))=1;
     123        obp+=sizeof(long);
     124
     125        //push size
     126        OpBuffer[obp++]=(char)0x68;
     127        *((long *)(OpBuffer+obp))=typeSize+sizeof(DWORD)*3;
     128        obp+=sizeof(long);
     129    }
     130
     131    if( baseTypeInfo.type == DEF_OBJECT ){
     132        //DeleteはGCで処理
     133
     134        //call _System_GC_malloc_ForObject
     135        extern SUBINFO *pSub_System_GC_malloc_ForObject;
     136        op_call(pSub_System_GC_malloc_ForObject);
     137    }
     138    else{
     139        //明示的なDeleteが必要
     140
     141        //call _System_GC_malloc_ForObjectPtr
     142        extern SUBINFO *pSub_System_GC_malloc_ForObjectPtr;
     143        op_call(pSub_System_GC_malloc_ForObjectPtr);
     144    }
     145
     146
     147    /*
     148    確保されたヒープ領域のポインタ(callocの戻り値eax)をpPtrとすると、
     149    pPtr-=sizeof(DWORD)*3
     150    pPtr[0]=オブジェクトの個数
     151    pPtr[1]=オブジェクトのサイズ
     152    pPtr[2]=デストラクタの関数ポインタ
     153    */
     154
     155
     156    //mov dword ptr[eax],ebx(オブジェクトの個数)
     157    OpBuffer[obp++]=(char)0x89;
     158    OpBuffer[obp++]=(char)0x18;
     159
     160    //add eax,sizeof(DWORD)
     161    OpBuffer[obp++]=(char)0x05;
     162    *((long *)(OpBuffer+obp))=sizeof(DWORD);
     163    obp+=sizeof(long);
     164
     165
     166    //mov ecx,TypeSize
     167    OpBuffer[obp++]=(char)0xB9;
     168    *((long *)(OpBuffer+obp))=typeSize;
     169    obp+=sizeof(long);
     170
     171    //mov dword ptr[eax],ecx
     172    OpBuffer[obp++]=(char)0x89;
     173    OpBuffer[obp++]=(char)0x08;
     174
     175    //add eax,sizeof(DWORD)
     176    OpBuffer[obp++]=(char)0x05;
     177    *((long *)(OpBuffer+obp))=sizeof(DWORD);
     178    obp+=sizeof(long);
     179
     180
     181    CMethod *method = classObj.GetDestructorMethod();
     182    if( method == NULL ) return;
     183
     184    //mov ecx,DestructorProcAddr
     185    OpBuffer[obp++]=(char)0xB9;
     186    pobj_SubAddrSchedule->add(method->psi,0);
     187    method->psi->bUse=1;
     188    obp+=sizeof(long);
     189
     190    //mov dword ptr[eax],ecx
     191    OpBuffer[obp++]=(char)0x89;
     192    OpBuffer[obp++]=(char)0x08;
     193
     194    //add eax,sizeof(DWORD)
     195    OpBuffer[obp++]=(char)0x05;
     196    *((long *)(OpBuffer+obp))=sizeof(DWORD);
     197    obp+=sizeof(long);
     198
     199
     200    // ※ここでプッシュされた値はNew演算子の戻り値となる
     201    //push eax
     202    op_push(REG_EAX);
     203
     204
     205    /////////////////////////////////////////////////////////////////////
     206
     207    ////////////////////////////
     208    // コンストラクタの呼び出し
     209    ////////////////////////////
     210
     211    BOOL bSomeObjects;
     212    if(objectSizeStr[0]) bSomeObjects=1;
     213    else bSomeObjects=0;
     214    _call_constructor(&classObj,parameter,typeSize,bSomeObjects);
     215}
     216int Operator_New(const char *Parameter,LONG_PTR *plpIndex,const TYPEINFO &baseTypeInfo ){
     217    char TypeName[VN_SIZE],CreateParameter[VN_SIZE],objectSizeStr[VN_SIZE];
    78218    int i,i2;
    79219
     
    81221
    82222    if(Parameter[0]=='['){
    83         i=GetStringInBracket(ObjectSize,Parameter);
    84 
    85         SlideString(ObjectSize+1,-1);
    86         ObjectSize[i-2]=0;
    87     }
    88     else ObjectSize[0]=0;
     223        i=GetStringInBracket(objectSizeStr,Parameter);
     224
     225        SlideString(objectSizeStr+1,-1);
     226        objectSizeStr[i-2]=0;
     227    }
     228    else objectSizeStr[0]=0;
    89229
    90230    for(i2=0;;i++,i2++){
     
    129269    pobj_c=(CClass *)*plpIndex;
    130270
    131     if(pobj_c->IsAbstract()){
    132         //抽象クラスだったとき
    133         SetError(125,pobj_c->name,cp);
    134     }
    135 
    136     if(ObjectSize[0]){
    137         i2=NumOpe(ObjectSize,0,0,0);
    138         ChangeTypeToLong(i2);
    139 
    140         //pop eax
    141         op_pop(REG_EAX);
    142 
    143         //※添え字上限値であることを考慮
    144         //add eax,1
    145         OpBuffer[obp++]=(char)0x83;
    146         OpBuffer[obp++]=(char)0xC0;
    147         OpBuffer[obp++]=(char)0x01;
    148 
    149         //オブジェクトの個数をebxに一時保持
    150         //※ebxは関数が呼ばれても不変
    151         //mov ebx,eax
    152         OpBuffer[obp++]=(char)0x8B;
    153         OpBuffer[obp++]=(char)0xD8;
    154 
    155         //imul eax,size
    156         OpBuffer[obp++]=(char)0x69;
    157         OpBuffer[obp++]=(char)0xC0;
    158         *((long *)(OpBuffer+obp))=TypeSize;
    159         obp+=sizeof(long);
    160 
    161         //add eax,sizeof(DWORD)*2
    162         OpBuffer[obp++]=(char)0x05;
    163         *((long *)(OpBuffer+obp))=sizeof(DWORD)*3;
    164         obp+=sizeof(long);
    165 
    166         //push eax
    167         op_push(REG_EAX);
    168     }
    169     else{
    170         //オブジェクトの個数をebxに一時保持
    171         //※ebxは関数が呼ばれても不変
    172         //mov ebx,1
    173         OpBuffer[obp++]=(char)0xBB;
    174         *((long *)(OpBuffer+obp))=1;
    175         obp+=sizeof(long);
    176 
    177         //push size
    178         OpBuffer[obp++]=(char)0x68;
    179         *((long *)(OpBuffer+obp))=TypeSize+sizeof(DWORD)*3;
    180         obp+=sizeof(long);
    181     }
    182 
    183     //call calloc
    184     extern SUBINFO *pSub_calloc;
    185     op_call(pSub_calloc);
    186 
    187 
    188     /*
    189     確保されたヒープ領域のポインタ(callocの戻り値eax)をpPtrとすると、
    190     pPtr-=sizeof(DWORD)*3
    191     pPtr[0]=オブジェクトの個数
    192     pPtr[1]=オブジェクトのサイズ
    193     pPtr[2]=デストラクタの関数ポインタ
    194     */
    195 
    196 
    197     //mov dword ptr[eax],ebx(オブジェクトの個数)
    198     OpBuffer[obp++]=(char)0x89;
    199     OpBuffer[obp++]=(char)0x18;
    200 
    201     //add eax,sizeof(DWORD)
    202     OpBuffer[obp++]=(char)0x05;
    203     *((long *)(OpBuffer+obp))=sizeof(DWORD);
    204     obp+=sizeof(long);
    205 
    206 
    207     //mov ecx,TypeSize
    208     OpBuffer[obp++]=(char)0xB9;
    209     *((long *)(OpBuffer+obp))=TypeSize;
    210     obp+=sizeof(long);
    211 
    212     //mov dword ptr[eax],ecx
    213     OpBuffer[obp++]=(char)0x89;
    214     OpBuffer[obp++]=(char)0x08;
    215 
    216     //add eax,sizeof(DWORD)
    217     OpBuffer[obp++]=(char)0x05;
    218     *((long *)(OpBuffer+obp))=sizeof(DWORD);
    219     obp+=sizeof(long);
    220 
    221 
    222     CMethod *method = pobj_c->GetDestructorMethod();
    223     if( method == NULL ) return 0;
    224 
    225     //mov ecx,DestructorProcAddr
    226     OpBuffer[obp++]=(char)0xB9;
    227     pobj_SubAddrSchedule->add(method->psi,0);
    228     method->psi->bUse=1;
    229     obp+=sizeof(long);
    230 
    231     //mov dword ptr[eax],ecx
    232     OpBuffer[obp++]=(char)0x89;
    233     OpBuffer[obp++]=(char)0x08;
    234 
    235     //add eax,sizeof(DWORD)
    236     OpBuffer[obp++]=(char)0x05;
    237     *((long *)(OpBuffer+obp))=sizeof(DWORD);
    238     obp+=sizeof(long);
    239 
    240 
    241     // ※ここでプッシュされた値はNew演算子の戻り値となる
    242     //push eax
    243     op_push(REG_EAX);
    244 
    245 
    246     /////////////////////////////////////////////////////////////////////
    247 
    248     ////////////////////////////
    249     // コンストラクタの呼び出し
    250     ////////////////////////////
    251 
    252     BOOL bSomeObjects;
    253     if(ObjectSize[0]) bSomeObjects=1;
    254     else bSomeObjects=0;
    255     _call_constructor(pobj_c,CreateParameter,TypeSize,bSomeObjects);
    256 
     271    Operator_New( *pobj_c, objectSizeStr, CreateParameter, baseTypeInfo );
     272
     273    if( baseTypeInfo.type == DEF_OBJECT ){
     274        return DEF_OBJECT;
     275    }
    257276    return DEF_PTR_OBJECT;
    258277}
    259278
    260 void OpcodeDelete(char *Parameter){
     279void OpcodeDelete(const char *Parameter, bool isSweeping){
    261280    int type;
    262281
     
    355374    //////////////////////////////////////////
    356375
    357     //call free
    358     extern SUBINFO *pSub_free;
    359     op_call(pSub_free);
     376    if( isSweeping ){
     377        //call _System_GC_free_for_SweepingDelete
     378        extern SUBINFO *pSub_System_GC_free_for_SweepingDelete;
     379        op_call(pSub_System_GC_free_for_SweepingDelete);
     380    }
     381    else{
     382        //call free
     383        extern SUBINFO *pSub_free;
     384        op_call(pSub_free);
     385    }
    360386}
  • BasicCompiler32/Compile_ProcOp.cpp

    r63 r64  
    293293
    294294        LocalVar[MaxLocalVarNum].type=psi->pRealParmInfo[i3].type;
    295         if(LocalVar[MaxLocalVarNum].type==DEF_OBJECT){
    296             if(psi->bExport)
    297                 SetError(24,NULL,cp);
     295        if(LocalVar[MaxLocalVarNum].type==DEF_OBJECT
     296            ||LocalVar[MaxLocalVarNum].type==DEF_STRUCT){
     297                if(psi->bExport)
     298                    SetError(24,NULL,cp);
    298299        }
    299300
    300301        LocalVar[MaxLocalVarNum].u.index=psi->pRealParmInfo[i3].u.index;
    301302
    302         if(psi->pRealParmInfo[i3].bByVal&&psi->pRealParmInfo[i3].type==DEF_OBJECT){
    303             //実態オブジェクトのByValパラメータ
     303        if(psi->pRealParmInfo[i3].bByVal&&psi->pRealParmInfo[i3].type==DEF_STRUCT){
     304            //構造体のByValパラメータ
    304305            LocalVar[MaxLocalVarNum].fRef=REF_PARAMETER | OBJECT_PARAMETER;
    305306            VarSize=PTR_SIZE;
     
    370371    OpBuffer[obp++]=(char)0x57;
    371372
    372     if(psi->ReturnType!=-1){
     373    if(psi->ReturnType!=DEF_NON){
    373374        //戻り値が存在するとき
    374375
     
    377378        else temp=psi->name;
    378379
    379         if(psi->ReturnType==DEF_OBJECT && psi->isReturnRef == false){
    380             //戻り値用オブジェクトのコンストラクタを呼び出す
    381             if( psi->u.Return_pobj_c->GetConstructorMethod() ){
    382                 sprintf(temporary,"%s.%s()",temp,psi->u.Return_pobj_c->name);
    383                 OpcodeOthers(temporary);
    384             }
     380        if(psi->ReturnType==DEF_STRUCT && psi->isReturnRef == false){
     381            //戻り値用の構造体(値型)はパラメータで引き渡される
    385382        }
    386383        else{
     
    517514            for(i3=0;i3<pobj_CompilingClass->iMemberNum;i3++){
    518515                CMember *pMember = pobj_CompilingClass->ppobj_Member[i3];
    519                 int MemberTypeSize=
    520                     GetTypeSize(pMember->TypeInfo.type,
    521                         pMember->TypeInfo.u.lpIndex);
    522 
    523                 int MemberObjectNum=
    524                     JumpSubScripts(pMember->SubScripts);
    525 
    526                 int offset = pobj_CompilingClass->GetMemberOffset( pMember->name, NULL );
    527 
    528                 if(pMember->TypeInfo.type==DEF_OBJECT && pMember->IsRef() == false){
    529                     CMethod *method = pMember->TypeInfo.u.pobj_Class->GetConstructorMethod();
    530                     if( method ){
    531                         if( method->psi->RealParmNum == 1 ){    //Thisポインタを第一引数に持ち合わせるため、引数なしの場合はこの値が1になる
    532                             for(i4=0;i4<MemberObjectNum;i4++){
    533                                 //Thisポインタをecxにコピー
    534                                 SetThisPtrToReg(REG_ECX);
    535 
    536                                 //add ecx,offset
    537                                 OpBuffer[obp++]=(char)0x81;
    538                                 OpBuffer[obp++]=(char)0xC1;
    539                                 *((long *)(OpBuffer+obp))=offset+i4*MemberTypeSize;
    540                                 obp+=sizeof(long);
    541 
    542                                 //push ecx
    543                                 op_push(REG_ECX);
    544 
    545                                 //call constructor
    546                                 op_call( method->psi );
    547                             }
    548                         }
    549                     }
     516                if(pMember->TypeInfo.type==DEF_OBJECT){
     517                    // オブジェクトメンバを発見したとき
     518
     519                    sprintf(temporary, "This.%s=%c%c%s()",
     520                        pMember->name,
     521                        1, ESC_NEW,
     522                        pMember->TypeInfo.u.pobj_Class->name );
     523                    OpcodeCalc( temporary );
    550524                }
    551525            }
     
    619593            }
    620594
    621             //実体クラスを持つメンバのデストラクタを呼び出す
     595            //実体クラスを持つメンバのデストラクタ呼び出しはGCに任せる
     596            /*
    622597            //※コンストラクタと逆順序で呼び出す
    623598            int offset;
     
    658633                    }
    659634                }
    660             }
     635            }*/
    661636        }
    662637    }
     
    706681
    707682    if(bDebugCompile&&bDebugSupportProc==0){
    708         *((long *)(OpBuffer+EspOffsetSchedule))=AllLocalVarSize-BaseOffset;
     683        *((long *)(OpBuffer+EspOffsetSchedule))=AllLocalVarSize-BaseOffset-sizeof(long);
    709684
    710685        //call _DebugSys_EndProc
     
    713688    }
    714689
    715     if(psi->ReturnType!=-1){
     690    if(psi->ReturnType!=DEF_NON){
    716691        //戻り値をeax、edxに設定
    717692        RELATIVE_VAR RelativeVar;
     
    726701        i3=psi->ReturnType;
    727702
    728         if(i3==DEF_OBJECT){
     703        if(i3==DEF_OBJECT || i3==DEF_STRUCT){
    729704            SetVarPtrToEax(&RelativeVar);
     705            if( i3==DEF_OBJECT ){
     706                //mov eax,dword ptr[eax]
     707                op_mov_RM( sizeof(long), REG_EAX, REG_EAX, 0, MOD_BASE );
     708            }
    730709        }
    731710        else if(i3==DEF_DOUBLE){
     
    818797    op_pop(REG_EBX);
    819798
     799    if(bDebugCompile){
     800        //cmp esp,ebp
     801        op_cmp_RR( REG_ESP, REG_EBP );
     802
     803        //jz 6(次のcallとbreakpointを飛び越す)
     804        OpBuffer[obp++]=(char)0x74;
     805        OpBuffer[obp++]=(char)0x06;
     806
     807        //call _esp_error
     808        extern SUBINFO *pSub_esp_error;
     809        op_call( pSub_esp_error );
     810
     811        breakpoint;
     812    }
     813
    820814    //mov esp,ebp
    821815    OpBuffer[obp++]=(char)0x8B;
  • BasicCompiler32/Compile_Set_Var.cpp

    r63 r64  
    77}
    88
    9 void SetObjectVariable(LONG_PTR lpVarIndex,int CalcType,LONG_PTR lpCalcIndex,BOOL bUseHeap){
     9void SetStructVariable(LONG_PTR lpVarIndex,int CalcType,LONG_PTR lpCalcIndex,BOOL bUseHeap){
     10/*
     11    TODO: 消す
    1012    ///////////////////////////////////////////////////////////////////
    1113    // オペレータ '=' のオーバーロード関数を呼ぶ
     
    3234        //成功したとき、またはエラーが発行されたとき
    3335        return;
    34     }
    35 
    36 
    37     if( CalcType == DEF_OBJECT ){
     36    }*/
     37
     38
     39    if( CalcType == DEF_STRUCT ){
    3840        CClass *pVarClass = (CClass *)lpVarIndex;
    3941        CClass *pCalcClass = (CClass *)lpCalcIndex;
    4042
    4143
    42         if( pVarClass->IsEquals( pCalcClass )           //等しい
    43             || pVarClass->IsSubClass( pCalcClass ) ){   //派生・継承関係
     44        if( pVarClass->IsEquals( pCalcClass ) ){        //等しい
    4445
    4546                //双方のオブジェクト型が一致、または派生・継承関係にあるとき
     
    8182}
    8283
     84
     85void SetRealVariable(int VarType,int CalcType,RELATIVE_VAR *pRelativeVar){
     86    if( !IsRealNumberType( CalcType ) ){
     87        // 実数へ変換
     88        // 64bit edx:eax -> st(0)
     89        // 32bit     eax -> st(0)
     90
     91        if( Is64Type( CalcType ) ){
     92            //64ビット整数型
     93
     94            //push edx
     95            op_push( REG_EDX );
     96
     97            //push eax
     98            op_push( REG_EAX );
     99
     100            //fild qword ptr[esp]
     101            op_fld_ptr_esp(DEF_INT64);
     102
     103            //pop
     104            op_pop( REG_NON );
     105
     106            //pop
     107            op_pop( REG_NON );
     108        }
     109        else{
     110            //push eax
     111            op_push( REG_EAX );
     112
     113            //fild qword ptr[esp]
     114            op_fld_ptr_esp(DEF_LONG);
     115
     116            //pop
     117            op_pop( REG_NON );
     118        }
     119    }
     120
     121    if(pRelativeVar->dwKind==VAR_GLOBAL){
     122        if(pRelativeVar->bOffsetOffset){
     123            //fstp ptr[ecx+offset]
     124            op_fstp_base_offset(VarType,REG_ECX,(int)pRelativeVar->offset);
     125            obp-=sizeof(long);
     126            pobj_GlobalVarSchedule->add();
     127            obp+=sizeof(long);
     128        }
     129        else{
     130            //mov ecx,offset
     131            op_mov_RV(REG_ECX,(int)pRelativeVar->offset);
     132            obp-=sizeof(long);
     133            pobj_GlobalVarSchedule->add();
     134            obp+=sizeof(long);
     135
     136            //fstp ptr[ecx]
     137            op_fstp_basereg(VarType,REG_ECX);
     138        }
     139    }
     140    else if(pRelativeVar->dwKind==VAR_REFGLOBAL){
     141        if(pRelativeVar->bOffsetOffset){
     142            //add ecx,qword ptr[offset]
     143            op_add_RM(sizeof(long),REG_ECX,REG_NON,(int)pRelativeVar->offset,MOD_DISP32);
     144        }
     145        else{
     146            //mov ecx,qword ptr[offset]
     147            op_mov_RM(sizeof(long),REG_ECX,REG_NON,(int)pRelativeVar->offset,MOD_DISP32);
     148        }
     149        obp-=sizeof(long);
     150        pobj_GlobalVarSchedule->add();
     151        obp+=sizeof(long);
     152
     153        goto directmem;
     154    }
     155    else if(pRelativeVar->dwKind==VAR_LOCAL){
     156        if(pRelativeVar->bOffsetOffset){
     157            //fstp ptr[ebp+ecx+offset]
     158            op_fstp_base_offset_ex(VarType,REG_EBP,REG_ECX,(int)pRelativeVar->offset,USE_OFFSET);
     159        }
     160        else{
     161            //fstp ptr[ebp+offset]
     162            op_fstp_base_offset(VarType,REG_EBP,(int)pRelativeVar->offset);
     163        }
     164        obp-=sizeof(long);
     165        AddLocalVarAddrSchedule();
     166        obp+=sizeof(long);
     167    }
     168    else if(pRelativeVar->dwKind==VAR_REFLOCAL){
     169        if(pRelativeVar->bOffsetOffset){
     170            //add ecx,qword ptr[ebp+offset]
     171            op_add_RM(sizeof(long),REG_ECX,REG_EBP,(int)pRelativeVar->offset,MOD_BASE_DISP32);
     172        }
     173        else{
     174            //mov ecx,qword ptr[ebp+offset]
     175            op_mov_RM(sizeof(long),REG_ECX,REG_EBP,(int)pRelativeVar->offset,MOD_BASE_DISP32);
     176        }
     177        obp-=sizeof(long);
     178        AddLocalVarAddrSchedule();
     179        obp+=sizeof(long);
     180
     181        goto directmem;
     182    }
     183    else if(pRelativeVar->dwKind==VAR_DIRECTMEM){
     184directmem:
     185        //fstp ptr[ecx]
     186        op_fstp_basereg(VarType,REG_ECX);
     187    }
     188}
     189
     190void SetBooleanVariable(int type,RELATIVE_VAR *pRelative){
     191    if(type==DEF_DOUBLE){
     192        // TODO: 実装
     193        SetError();
     194    }
     195    else if(type==DEF_SINGLE){
     196        // TODO: 実装
     197        SetError();
     198    }
     199    else if(type==DEF_INT64||type==DEF_QWORD){
     200        //cmp eax,0
     201        op_cmp_value(GetTypeSize(type,-1),REG_EAX,0);
     202
     203        //setne al
     204        op_setne( REG_EAX );
     205
     206        //cmp edx,0
     207        op_cmp_value(GetTypeSize(type,-1),REG_EDX,0);
     208
     209        //setne cl
     210        op_setne( REG_ECX );
     211
     212        //or al,cl
     213        op_or_RR( sizeof( _int8 ), REG_EAX, REG_ECX );
     214    }
     215    else{
     216        if(!IsWholeNumberType(type)){
     217            //不正な型の場合
     218            SetError(9,NULL,cp);
     219            return;
     220        }
     221    }
     222
     223    //cmp eax,0
     224    op_cmp_value(GetTypeSize(type,-1),REG_EAX,0);
     225
     226    //setne al
     227    op_setne( REG_EAX );
     228
     229    SetWholeVariable( sizeof(char), DEF_BYTE, pRelative );
     230}
     231
     232void ExtendTypeTo32(int type,int reg);
     233void ExtendTypeTo64(int type){
     234    if(Is64Type(type)) return;
     235
     236    ExtendTypeTo32(type,REG_EAX);
     237
     238    if(IsSignedType(type)){
     239        //cdq
     240        op_cdq();
     241    }
     242    else{
     243        //xor edx,edx
     244        op_zero_reg(REG_EDX);
     245    }
     246}
     247void ExtendTypeTo32(int type,int reg){
     248    if(type==DEF_INTEGER || (isUnicode&&type==DEF_CHAR)){
     249        //movsx reg32,reg16
     250        op_movsx_R32R16(reg,reg);
     251    }
     252    else if(type==DEF_WORD){
     253        //and reg,0000FFFFh
     254        op_and_RV(reg,(int)0x0000FFFF);
     255    }
     256    else if(type==DEF_SBYTE || (isUnicode==false&&type==DEF_CHAR)){
     257        //movsx reg32,reg8
     258        op_movsx_R32R8(reg,reg);
     259    }
     260    else if(type==DEF_BYTE||type==DEF_BOOLEAN){
     261        //and reg,000000FFh
     262        op_and_RV(reg,(int)0xFF);
     263    }
     264}
     265void ExtendTypeTo16(int type,int reg){
     266    if(type==DEF_SBYTE || (isUnicode==false&&type==DEF_CHAR)){
     267        //movsx reg16,reg8
     268        op_movsx_R16R8(reg,reg);
     269    }
     270    else if(type==DEF_BYTE||type==DEF_BOOLEAN){
     271        //and reg,000000FFh
     272        op_and_RV(reg,(int)0xFF);
     273    }
     274}
     275
     276void SetWholeVariable(int var_size,int type,RELATIVE_VAR *pRelative){
     277    if(type==DEF_DOUBLE){
     278        //Double型
     279        // st(0)の内容をedx:eaxに変換
     280
     281        //TODO: 実装
     282        SetError();
     283    }
     284    else if(type==DEF_SINGLE){
     285        //Single型
     286        // st(0)の内容をeaxに変換
     287
     288        //TODO: 実装
     289        SetError();
     290    }
     291    else{
     292        //その他の整数
     293
     294        if(var_size==sizeof(_int64)){
     295            //eaxの値を64ビット(edx:eax)に拡張する
     296            ExtendTypeTo64(type);
     297        }
     298        else if(var_size==sizeof(long)){
     299            //レジスタの値を32ビット(eax)に拡張する
     300            ExtendTypeTo32(type,REG_EAX);
     301        }
     302        else if(var_size==sizeof(short)){
     303            //レジスタの値を16ビット(ax)に拡張する
     304            ExtendTypeTo16(type,REG_EAX);
     305        }
     306        //8ビットは拡張なし
     307    }
     308
     309    if(var_size==sizeof(_int64)){
     310        //下位32ビット
     311        SetWholeVariable(sizeof(long),DEF_LONG,pRelative);
     312
     313        //mov eax,edx
     314        op_mov_RR( REG_EAX, REG_EDX );
     315
     316        //上位32ビット
     317        if( pRelative->dwKind == VAR_DIRECTMEM ){
     318            //add ecx,sizeof(long)
     319            op_add_RV8( REG_ECX, sizeof(long) );
     320        }
     321        pRelative->offset+=sizeof(long);
     322        SetWholeVariable(sizeof(long),DEF_LONG,pRelative);
     323        pRelative->offset-=sizeof(long);
     324
     325        return;
     326    }
     327
     328    if(pRelative->dwKind==VAR_GLOBAL){
     329        if(pRelative->bOffsetOffset){
     330            //mov ptr[ecx+offset],eax/ax/al
     331            op_mov_MR(var_size,REG_EAX,REG_ECX,(int)pRelative->offset,MOD_BASE_DISP32);
     332        }
     333        else{
     334            //mov ptr[offset],eax/ax/al
     335            op_mov_MR(var_size,REG_EAX,0,(int)pRelative->offset,MOD_DISP32);
     336        }
     337        obp-=sizeof(long);
     338        pobj_GlobalVarSchedule->add();
     339        obp+=sizeof(long);
     340    }
     341    else if(pRelative->dwKind==VAR_REFGLOBAL){
     342        if(pRelative->bOffsetOffset){
     343            //add ecx,qword ptr[offset]
     344            op_add_RM(var_size,REG_ECX,REG_NON,(int)pRelative->offset,MOD_DISP32);
     345        }
     346        else{
     347            //mov ecx,qword ptr[offset]
     348            op_mov_RM(var_size,REG_ECX,REG_NON,(int)pRelative->offset,MOD_DISP32);
     349        }
     350        obp-=sizeof(long);
     351        pobj_GlobalVarSchedule->add();
     352        obp+=sizeof(long);
     353
     354        goto directmem;
     355    }
     356    else if(pRelative->dwKind==VAR_LOCAL){
     357        if(pRelative->bOffsetOffset){
     358            //mov ptr[ebp+ecx+offset],eax/ax/al
     359            op_mov_MR_ex(var_size,REG_EAX,REG_EBP,REG_ECX,(int)pRelative->offset,USE_OFFSET);
     360        }
     361        else{
     362            //mov ptr[ebp+offset],eax/ax/al
     363            op_mov_MR(var_size,REG_EAX,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32);
     364        }
     365        obp-=sizeof(long);
     366        AddLocalVarAddrSchedule();
     367        obp+=sizeof(long);
     368    }
     369    else if(pRelative->dwKind==VAR_REFLOCAL){
     370        if(pRelative->bOffsetOffset){
     371            //add ecx,qword ptr[ebp+offset]
     372            op_add_RM(var_size,REG_ECX,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32);
     373        }
     374        else{
     375            //mov ecx,qword ptr[ebp+offset]
     376            op_mov_RM(var_size,REG_ECX,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32);
     377        }
     378        obp-=sizeof(long);
     379        AddLocalVarAddrSchedule();
     380        obp+=sizeof(long);
     381
     382        goto directmem;
     383    }
     384    else if(pRelative->dwKind==VAR_DIRECTMEM){
     385directmem:
     386
     387        //mov ptr[ecx],eax/ax/al
     388        op_mov_MR(var_size,REG_EAX,REG_ECX,0,MOD_BASE);
     389    }
     390}
     391
     392
     393
     394
     395
     396
     397
     398
     399
     400
     401
     402
     403
     404
     405
     406
     407
     408
     409
     410
     411
     412
     413
     414
     415
     416/*
     417TODO: 消す
    83418void SetDoubleVariable(int type,DWORD VarKind,DWORD offset,BOOL bOffsetOffset){
    84419    ChangeTypeToDouble(type);
     
    9721307    }
    9731308}
    974 void SetBooleanVariable(int type,RELATIVE_VAR *pRelative){
    975     if(type==DEF_DOUBLE){
    976         // TODO: 実装
    977     }
    978     else if(type==DEF_SINGLE){
    979         // TODO: 実装
    980     }
    981     else if(type==DEF_INT64||type==DEF_QWORD){
    982         // TODO: 実装
    983 
    984         //pop eax
    985         op_pop(REG_EAX);
    986 
    987         //cmp eax,0
    988         op_cmp_value(GetTypeSize(type,-1),REG_EAX,0);
    989 
    990         //setne al
    991         op_setne( REG_EAX );
    992 
    993         //pop ecx
    994         op_pop(REG_ECX);
    995 
    996         //cmp ecx,0
    997         op_cmp_value(GetTypeSize(type,-1),REG_ECX,0);
    998 
    999         //setne cl
    1000         op_setne( REG_ECX );
    1001 
    1002         //or al,cl
    1003         op_or_RR( sizeof( _int8 ), REG_EAX, REG_ECX );
    1004     }
    1005     else{
    1006         if(!IsWholeNumberType(type)){
    1007             //不正な型の場合
    1008             SetError(9,NULL,cp);
    1009             return;
    1010         }
    1011 
    1012         //pop eax
    1013         op_pop(REG_EAX);
    1014     }
    1015 
    1016     //cmp eax,0
    1017     op_cmp_value(GetTypeSize(type,-1),REG_EAX,0);
    1018 
    1019     //setne al
    1020     op_setne( REG_EAX );
    1021 
    1022     //push eax
    1023     op_push(REG_EAX);
    1024 
    1025     Set8Variable(DEF_BYTE,pRelative->dwKind,pRelative->offset,pRelative->bOffsetOffset);
    1026 }
     1309*/
  • BasicCompiler32/Compile_Statement.cpp

    r55 r64  
    105105            OpBuffer[obp++]=(char)0xD8;
    106106        }
    107         if(i2==DEF_OBJECT){
     107        if(i2==DEF_STRUCT){
    108108            //mov ebx,eax
    109109            op_mov_RR(REG_EBX,REG_EAX);
     
    13361336            else temp=pCompilingSubInfo->name;
    13371337
     1338            /*
     1339            TODO: 消す
    13381340            if( pCompilingSubInfo->isReturnRef ){
    13391341                //参照型
     
    13411343            }
    13421344            else{
    1343                 //値型
     1345                //値型*/
    13441346                char temporary[VN_SIZE];
    13451347                sprintf(temporary,"%s=%s",temp,Parameter);
    13461348                OpcodeCalc(temporary);
    1347             }
     1349            //}
    13481350        }
    13491351
     
    13531355}
    13541356
    1355 void Opcode_Input(char *Parameter){
     1357void Opcode_Input(const char *Parameter){
    13561358    extern int cp;
    13571359    int i2,i3,i4,i5,type;
    13581360    BOOL bFile;
    13591361    char temporary[VN_SIZE],temp2[VN_SIZE],buffer[VN_SIZE];
    1360 
    1361     KillStringSpaces(Parameter);
    13621362
    13631363    if(Parameter[0]=='#'){
     
    14691469    Opcode_CallProc(buffer,psi,0,"",0);
    14701470}
    1471 void Opcode_PrintUsing(char *Parameter,char *buffer,BOOL bFile){
     1471void Opcode_PrintUsing(const char *Parameter,char *buffer,BOOL bFile){
    14721472    extern int cp;
    14731473    int i2,i3,i4,i5;
     
    14751475    BOOL bReturnLine;
    14761476
    1477     i2=lstrlen(Parameter);
    1478     if(Parameter[i2-1]==';'){
     1477    char parms[8192];
     1478    lstrcpy( parms, Parameter );
     1479
     1480    i2=lstrlen(parms);
     1481    if(parms[i2-1]==';'){
    14791482        bReturnLine=0;
    1480         Parameter[i2-1]=0;
     1483        parms[i2-1]=0;
    14811484    }
    14821485    else bReturnLine=1;
     
    14841487    i3=lstrlen(buffer);
    14851488    for(i2=0;;i2++,i3++){
    1486         if(Parameter[i2]==';'){
     1489        if(parms[i2]==';'){
    14871490            buffer[i3]=0;
    14881491            break;
    14891492        }
    1490         buffer[i3]=Parameter[i2];
    1491         if(Parameter[i2]=='\0') break;
    1492     }
    1493     if(Parameter[i2]==';') i2++;
     1493        buffer[i3]=parms[i2];
     1494        if(parms[i2]=='\0') break;
     1495    }
     1496    if(parms[i2]==';') i2++;
    14941497
    14951498    if(bReturnLine) lstrcat(buffer,"+Ex\"\\r\\n\"");
     
    14991502    while(1){
    15001503        for(i3=0;;i2++,i3++){
    1501             if(Parameter[i2]=='\"'){
    1502                 temporary[i3]=Parameter[i2];
     1504            if(parms[i2]=='\"'){
     1505                temporary[i3]=parms[i2];
    15031506                for(i2++,i3++;;i2++,i3++){
    1504                     temporary[i3]=Parameter[i2];
    1505                     if(Parameter[i2]=='\"') break;
     1507                    temporary[i3]=parms[i2];
     1508                    if(parms[i2]=='\"') break;
    15061509                }
    15071510                continue;
    15081511            }
    1509             if(Parameter[i2]=='('){
    1510                 i5=GetStringInPare(temporary+i3,Parameter+i2);
     1512            if(parms[i2]=='('){
     1513                i5=GetStringInPare(temporary+i3,parms+i2);
    15111514                i2+=i5-1;
    15121515                i3+=i5-1;
    15131516                continue;
    15141517            }
    1515             if(Parameter[i2]=='['){
    1516                 i5=GetStringInBracket(temporary+i3,Parameter+i2);
     1518            if(parms[i2]=='['){
     1519                i5=GetStringInBracket(temporary+i3,parms+i2);
    15171520                i2+=i5-1;
    15181521                i3+=i5-1;
    15191522                continue;
    15201523            }
    1521             if(Parameter[i2]==','){
     1524            if(parms[i2]==','){
    15221525                temporary[i3]=0;
    15231526                i2++;
    15241527                break;
    15251528            }
    1526             temporary[i3]=Parameter[i2];
    1527             if(Parameter[i2]=='\0') break;
     1529            temporary[i3]=parms[i2];
     1530            if(parms[i2]=='\0') break;
    15281531        }
    15291532        if(temporary[0]=='\0'){
     
    15541557
    15551558        i4++;
    1556         if(Parameter[i2]=='\0') break;
     1559        if(parms[i2]=='\0') break;
    15571560    }
    15581561    sprintf(temp2,"_System_UsingDataType[%d]=-1",i4);
     
    15681571    Opcode_CallProc(buffer,psi,0,"",0);
    15691572}
    1570 void Opcode_Print(char *Parameter,BOOL bWrite){
     1573void Opcode_Print(const char *Parameter,BOOL bWrite){
    15711574    int i2,i3,i4,sw;
    15721575    char temporary[VN_SIZE],buffer[VN_SIZE];
    15731576    BOOL bFile;
    1574 
    1575     KillStringSpaces(Parameter);
    15761577
    15771578    if(Parameter[0]=='#'){
  • BasicCompiler32/Compile_Var.cpp

    r63 r64  
    2323
    2424    if(PTR_LEVEL(*pType)){
    25         *pType=MAKE_PTR_TYPE(NATURAL_TYPE(*pType),PTR_LEVEL(*pType)-1);
    26         if((*pType)==DEF_OBJECT){
    27             CClass *pClass = (CClass *)lpIndex;
    28             int objsize = pClass->GetSize();
    29 
    30             //imul ebx,objsize
    31             OpBuffer[obp++]=(char)0x69;
    32             OpBuffer[obp++]=(char)0xDB;
    33             *((long *)(OpBuffer+obp))=objsize;
    34             obp+=sizeof(long);
    35         }
    36         else{
    37             i2=GetTypeSize(*pType,-1);
    38             if(i2>=2){
    39                 //imul ebx,i2
    40                 OpBuffer[obp++]=(char)0x6B;
    41                 OpBuffer[obp++]=(char)0xDB;
    42                 OpBuffer[obp++]=(char)i2;
    43             }
     25        *pType = PTR_LEVEL_DOWN( *pType );
     26
     27        i2=GetTypeSize(*pType,-1);
     28        if(i2>=2){
     29            //imul ebx,i2
     30            op_imul_RV( REG_EBX, i2 );
    4431        }
    4532    }
     
    5643    OpBuffer[obp++]=(char)0x03;
    5744    OpBuffer[obp++]=(char)0xCB;
     45}
     46void SetRelativeOffset( RELATIVE_VAR &relativeVar ){
     47    if(relativeVar.dwKind==VAR_DIRECTMEM){
     48        //mov ecx,dword ptr[ecx]
     49        op_mov_RM( sizeof(long), REG_ECX, REG_ECX, 0, MOD_BASE );
     50    }
     51    else{
     52        //直接参照に切り替え
     53        SetVarPtrToEax(&relativeVar);
     54        relativeVar.dwKind=VAR_DIRECTMEM;
     55
     56        //mov ecx,dword ptr[eax]
     57        op_mov_RM( sizeof(long), REG_ECX, REG_EAX, 0, MOD_BASE );
     58    }
    5859}
    5960BOOL GetArrayOffset(int *SubScripts,char *array,int type,LONG_PTR lpIndex){
     
    168169    char lpPtrOffset[VN_SIZE];  //第2次配列
    169170    char NestMember[VN_SIZE];   //入れ子メンバ
    170     int RefType;                //"."参照のときは0、"->"参照のときは1
     171    CClass::RefType refType;
    171172    lstrcpy(VarName,member);
    172     if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember,&RefType)) return 0;
     173    if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember,refType)) return 0;
    173174
    174175    ////////////////////////////
     
    251252        //入れ子構造の場合
    252253
    253         if(*pType==DEF_OBJECT){
    254             if(RefType!=DEF_OBJECT){
     254        if(*pType==DEF_OBJECT || *pType==DEF_STRUCT){
     255            if( refType != CClass::Dot ){
    255256                if(isErrorEnabled) SetError(104,member,cp);
    256257                return 0;
    257258            }
    258         }
    259         else if(*pType==DEF_PTR_OBJECT){
     259
     260            if( *pType==DEF_OBJECT ){
     261                // 参照内容へのポインタを抽出
     262                SetRelativeOffset( *pRelativeVar );
     263            }
     264        }
     265        else if(*pType==DEF_PTR_OBJECT||*pType==DEF_PTR_STRUCT){
    260266            //構造体ポインタ型メンバ変数
    261267
    262268            if(lpPtrOffset[0]){
    263269                //pObj[n].member
    264                 if(RefType!=DEF_OBJECT){
     270                if( ( *pType==DEF_PTR_OBJECT||*pType==DEF_PTR_STRUCT )&& refType != CClass::Dot ){
    265271                    if(isErrorEnabled) SetError(104,member,cp);
    266272                    return 0;
     
    275281            else{
    276282                //pObj->member
    277                 if(RefType!=DEF_PTR_OBJECT){
     283                if( ( *pType==DEF_PTR_OBJECT||*pType==DEF_PTR_STRUCT )&& refType != CClass::Pointer ){
    278284                    if(isErrorEnabled) SetError(104,member,cp);
    279285                    return 0;
    280286                }
    281287
    282                 if(pRelativeVar->dwKind==VAR_DIRECTMEM){
    283                     //mov ecx,dword ptr[ecx]
    284                     OpBuffer[obp++]=(char)0x8B;
    285                     OpBuffer[obp++]=(char)0x09;
    286                 }
    287                 else{
    288                     //直接参照に切り替え
    289                     SetVarPtrToEax(pRelativeVar);
    290                     pRelativeVar->dwKind=VAR_DIRECTMEM;
    291 
    292                     //mov ecx,dword ptr[eax]
    293                     OpBuffer[obp++]=(char)0x8B;
    294                     OpBuffer[obp++]=(char)0x08;
    295                 }
    296             }
    297         }
    298         else if(*pType==MAKE_PTR_TYPE(DEF_OBJECT,2)){
     288                SetRelativeOffset( *pRelativeVar );
     289            }
     290        }
     291        else if(*pType==MAKE_PTR_TYPE(DEF_OBJECT,2) || *pType==MAKE_PTR_TYPE(DEF_STRUCT,2)){
    299292            //構造体ポインタのポインタ型メンバ変数
    300293
    301294            if(lpPtrOffset[0]){
    302295                //ppObj[n]->member
    303                 if(RefType!=DEF_PTR_OBJECT){
     296                if( refType != CClass::Pointer ){
    304297                    if(isErrorEnabled) SetError(104,member,cp);
    305298                    return 0;
     
    364357BOOL GetVarOffset(bool isErrorEnabled, bool isWriteAccess, const char *NameBuffer, int *pType, RELATIVE_VAR *pRelativeVar, LONG_PTR *plpIndex, int *pss){
    365358    extern BOOL bCompilingGlobal;
    366     int i,RefType;
     359    int i;
    367360    LONG_PTR lpIndex;
    368361    char variable[VN_SIZE],member[VN_SIZE],VarName[VN_SIZE],array[VN_SIZE],lpPtrOffset[VN_SIZE];
     
    374367    else lstrcpy(variable,NameBuffer);
    375368
    376 
    377     if( FormatUseProcReturnObject( variable, VarName, array, RefType, member ) ){
     369    CClass::RefType refType;
     370    if( FormatUseProcReturnObject( variable, VarName, array, refType, member ) ){
    378371        // 戻り値オブジェクトのメンバを直接参照しているとき
    379372        //例: func().member
     
    410403
    411404    lstrcpy(VarName,variable);
    412     GetVarFormatString(VarName,array,lpPtrOffset,member,&RefType);
     405    GetVarFormatString(VarName,array,lpPtrOffset,member,refType);
    413406
    414407    int *pSubScripts;
     
    546539    if(member[0]){
    547540        lstrcpy(temporary,member);
     541
    548542        char tempMember[VN_SIZE];
    549543        char tempArray[VN_SIZE];
    550         GetVarFormatString(temporary,tempArray,lpPtrOffset,tempMember,&i);
     544        {
     545            CClass::RefType refType;
     546            GetVarFormatString(temporary,tempArray,lpPtrOffset,tempMember, refType );
     547        }
    551548
    552549        char temp2[VN_SIZE];
     
    665662    }
    666663    if(member[0]){
    667         if(*pType==DEF_OBJECT){
     664        if(*pType==DEF_OBJECT || *pType==DEF_STRUCT){
    668665            //実態オブジェクトのメンバを参照(obj.member)
    669             if(RefType!=DEF_OBJECT){
     666            if( refType != CClass::Dot ){
    670667                SetError(104,VarName,cp);
    671668                pRelativeVar->dwKind=NON_VAR;
    672669                return 0;
    673670            }
    674         }
    675         else if(*pType==DEF_PTR_OBJECT){
     671
     672            if( *pType==DEF_OBJECT ){
     673                // 参照内容へのポインタを抽出
     674                SetRelativeOffset( *pRelativeVar );
     675            }
     676        }
     677        else if(*pType==DEF_PTR_OBJECT || *pType==DEF_PTR_STRUCT){
    676678            //ポインタオブジェクトが示すメンバを参照
    677679            if(lpPtrOffset[0]){
    678680                //pObj[n].member
    679                 if(RefType!=DEF_OBJECT){
     681                if( refType != CClass::Dot ){
    680682                    SetError(104,VarName,cp);
    681683                    pRelativeVar->dwKind=NON_VAR;
     
    687689            else{
    688690                //pObj->member
    689                 if(RefType!=DEF_PTR_OBJECT){
     691                if( refType != CClass::Pointer ){
    690692                    SetError(104,VarName,cp);
    691693                    pRelativeVar->dwKind=NON_VAR;
     
    701703            }
    702704        }
    703         else if(*pType==MAKE_PTR_TYPE(DEF_OBJECT,2)){
     705        else if(*pType==MAKE_PTR_TYPE(DEF_OBJECT,2) || *pType==MAKE_PTR_TYPE(DEF_STRUCT,2)){
    704706            //ポインタオブジェクトが示すメンバを参照
    705707            if(lpPtrOffset[0]){
    706708                //ppObj[n]->member
    707                 if(RefType!=DEF_PTR_OBJECT){
     709                if( refType != CClass::Pointer ){
    708710                    SetError(104,VarName,cp);
    709711                    pRelativeVar->dwKind=NON_VAR;
     
    785787        }
    786788
    787         if(type==DEF_OBJECT){
     789        if(type==DEF_STRUCT){
    788790            CClass *pobj_c;
    789791            pobj_c=(CClass *)lpIndex;
     
    818820    ///////////////////////////////////////
    819821
    820     if( type == DEF_OBJECT){
    821         //オブジェクトの場合はありえない
     822    if( type == DEF_OBJECT || type == DEF_STRUCT ){
     823        //オブジェクトまたは構造体の場合はありえない
    822824        SetError(300,NULL,cp);
    823825        return 0;
     
    855857        *(_int64 *)(initGlobalBuf+offset)=i64data;
    856858    else if(type==DEF_LONG||type==DEF_DWORD||IsPtrType(type)){
    857         if(type==DEF_PTR_BYTE&&lpCalcIndex==LITERAL_STRING){
     859        if(type==DEF_PTR_CHAR&&lpCalcIndex==LITERAL_STRING){
    858860            //文字列定数のとき
    859861
     
    918920        }
    919921
    920         if(type==DEF_OBJECT){
     922        if(type==DEF_STRUCT){
    921923            CClass *pobj_c;
    922924            pobj_c=(CClass *)lpIndex;
     
    10451047    }
    10461048    else if(type==DEF_LONG||type==DEF_DWORD||IsPtrType(type)){
    1047         if(type==DEF_PTR_BYTE&&lpCalcIndex==LITERAL_STRING){
     1049        if(type==DEF_PTR_CHAR&&lpCalcIndex==LITERAL_STRING){
    10481050            //文字列定数のとき
    10491051
     
    11021104}
    11031105
     1106void dim(bool isRef, char *VarName,int *SubScripts,TYPEINFO &TypeInfo,int TypeSize,char *InitBuf,char *ConstractParameter,DWORD dwFlags){
     1107    extern BOOL bCompilingGlobal;
     1108    if(bCompilingGlobal){
     1109        /////////////////////////
     1110        // グローバル変数
     1111        /////////////////////////
     1112
     1113        AddGlobalVariable(isRef,VarName,SubScripts,&TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlags);
     1114    }
     1115    else{
     1116        /////////////////
     1117        // ローカル変数
     1118        /////////////////
     1119
     1120        int i2,i3;
     1121
     1122        for(i2=0;i2<MaxLocalVarNum;i2++){
     1123            if(LocalVar[i2].bLiving&&obj_LexScopes.GetNowLevel()==LocalVar[i2].ScopeLevel){
     1124                if(lstrcmp(LocalVar[i2].name,VarName)==0){
     1125                    //2重定義のエラー
     1126                    SetError(15,VarName,cp);
     1127                    return;
     1128                }
     1129            }
     1130        }
     1131
     1132        LocalVar=(VARIABLE *)HeapReAlloc(hHeap,0,LocalVar,(MaxLocalVarNum+1)*sizeof(VARIABLE));
     1133        VARIABLE *pVar = &LocalVar[MaxLocalVarNum];
     1134        MaxLocalVarNum++;
     1135
     1136        if( isRef ){
     1137            //参照型
     1138            pVar->fRef = REF_VARIABLE;
     1139            TypeSize = PTR_SIZE;
     1140        }
     1141        else pVar->fRef=0;
     1142
     1143        for(i2=1,i3=0;i3<255;i3++){
     1144            //配列要素数
     1145            pVar->SubScripts[i3]=SubScripts[i3];
     1146
     1147            if(SubScripts[i3]==-1) break;
     1148            i2*=SubScripts[i3]+1;
     1149        }
     1150        int VarSize=TypeSize*i2;
     1151        if(VarSize%4) VarSize+=4-(VarSize%4);
     1152
     1153        //変数データを追加
     1154        lstrcpy(pVar->name,VarName);
     1155        if(dwFlags & DIMFLAG_CONST) pVar->bConst = true;
     1156        else pVar->bConst = false;
     1157        if(SubScripts[0]==-1) pVar->bArray=0;
     1158        else pVar->bArray=1;
     1159        pVar->type=TypeInfo.type;
     1160        pVar->u.index=TypeInfo.u.lpIndex;
     1161        AllLocalVarSize+=VarSize;
     1162        pVar->offset=AllLocalVarSize;
     1163
     1164        //レキシカルスコープ
     1165        pVar->ScopeLevel=obj_LexScopes.GetNowLevel();
     1166        pVar->ScopeStartAddress=obj_LexScopes.GetStartAddress();
     1167        pVar->bLiving=TRUE;
     1168
     1169        if(InitBuf[0]){
     1170            //初期代入時のみ、書き込みアクセスを許可する
     1171            bool bConstBack = pVar->bConst;
     1172            pVar->bConst = false;
     1173
     1174            int result = 0;
     1175            if( pVar->type != DEF_OBJECT ){
     1176                result = InitLocalVar(-pVar->offset,
     1177                    pVar->type,
     1178                    pVar->u.index,
     1179                    pVar->SubScripts,
     1180                    InitBuf);
     1181            }
     1182
     1183            if(!result){
     1184                //動的な式だった場合は代入演算を行う
     1185                char temporary[8192];
     1186                sprintf(temporary,"%s=%s",VarName,InitBuf);
     1187                OpcodeCalc(temporary);
     1188            }
     1189
     1190            pVar->bConst = bConstBack;
     1191        }
     1192        else{
     1193            //push 0
     1194            op_push_value(0);
     1195
     1196            //push VarSize
     1197            op_push_value(VarSize);
     1198
     1199            //mov eax,ebp
     1200            OpBuffer[obp++]=(char)0x8B;
     1201            OpBuffer[obp++]=(char)0xC5;
     1202
     1203            //add eax,offset
     1204            OpBuffer[obp++]=(char)0x05;
     1205            *((long *)(OpBuffer+obp))=-pVar->offset;
     1206            AddLocalVarAddrSchedule();
     1207            obp+=sizeof(long);
     1208
     1209            //push eax
     1210            op_push(REG_EAX);
     1211
     1212            //call FillMemory
     1213            OpBuffer[obp++]=(char)0xFF;
     1214            OpBuffer[obp++]=(char)0x15;
     1215            DECLAREINFO *pdi;
     1216            pdi=GetDeclareHash("FillMemory");
     1217            pdi->bUse=1;
     1218            pobj_ImportAddrSchedule->add(pdi);
     1219            obp+=sizeof(long);
     1220        }
     1221    }
     1222
     1223    //New呼び出し
     1224    if(TypeInfo.type==DEF_OBJECT&&(dwFlags&DIMFLAG_NONCALL_CONSTRACTOR)==0&&InitBuf[0]=='\0'){
     1225        char objectSize[255];
     1226        if( SubScripts[0] == -1 ){
     1227            objectSize[0] = 0;
     1228        }
     1229        else{
     1230            if( SubScripts[1] != -1 ){
     1231                SetError(300,NULL,cp);
     1232            }
     1233            sprintf( objectSize, "%d", SubScripts[0] );
     1234        }
     1235        Operator_New( *TypeInfo.u.pobj_Class, objectSize, ConstractParameter, TypeInfo );
     1236
     1237        //pop eax
     1238        op_pop( REG_EAX );
     1239
     1240        int type;
     1241        LONG_PTR lpIndex;
     1242        RELATIVE_VAR RelativeVar;
     1243        GetVarOffset( true, false, VarName, &type, &RelativeVar, &lpIndex );
     1244        if( RelativeVar.dwKind == VAR_DIRECTMEM ){
     1245            SetError();
     1246        }
     1247        SetVariableFromEax( DEF_OBJECT, DEF_OBJECT, &RelativeVar );
     1248    }
     1249
     1250    if(TypeInfo.type==DEF_OBJECT){
     1251        if(TypeInfo.u.pobj_Class->IsAbstract()){
     1252            //抽象クラスだったとき
     1253            SetError(125,TypeInfo.u.pobj_Class->name,cp);
     1254        }
     1255    }
     1256}
    11041257void dim(char *Parameter,DWORD dwFlags){
    11051258    extern BOOL bCompilingGlobal;
    11061259    extern HANDLE hHeap;
    1107     int i2,i3,VarSize;
     1260    int i2;
    11081261    char VarName[VN_SIZE];
    11091262
     
    11871340        GetNowStaticVarFullName(VarName,temporary);
    11881341
    1189         AddGlobalVariable(isRef, temporary,SubScripts,&TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlags);
     1342        dim( isRef,temporary,SubScripts,TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlags );
    11901343
    11911344        /*
     
    11951348    }
    11961349    else{
    1197         if(bCompilingGlobal){
    1198             /////////////////////////
    1199             // グローバル変数
    1200             /////////////////////////
    1201 
    1202             AddGlobalVariable(isRef, VarName,SubScripts,&TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlags);
    1203         }
    1204         else{
    1205             /////////////////
    1206             // ローカル変数
    1207             /////////////////
    1208 
    1209             for(i2=0;i2<MaxLocalVarNum;i2++){
    1210                 if(LocalVar[i2].bLiving&&obj_LexScopes.GetNowLevel()==LocalVar[i2].ScopeLevel){
    1211                     if(lstrcmp(LocalVar[i2].name,VarName)==0){
    1212                         //2重定義のエラー
    1213                         SetError(15,VarName,cp);
    1214                         return;
    1215                     }
    1216                 }
    1217             }
    1218 
    1219             LocalVar=(VARIABLE *)HeapReAlloc(hHeap,0,LocalVar,(MaxLocalVarNum+1)*sizeof(VARIABLE));
    1220             VARIABLE *pVar = &LocalVar[MaxLocalVarNum];
    1221             MaxLocalVarNum++;
    1222 
    1223             if( isRef ){
    1224                 //参照型
    1225                 pVar->fRef = REF_VARIABLE;
    1226                 TypeSize = PTR_SIZE;
    1227             }
    1228             else pVar->fRef=0;
    1229 
    1230             for(i2=1,i3=0;i3<255;i3++){
    1231                 //配列要素数
    1232                 pVar->SubScripts[i3]=SubScripts[i3];
    1233 
    1234                 if(SubScripts[i3]==-1) break;
    1235                 i2*=SubScripts[i3]+1;
    1236             }
    1237             VarSize=TypeSize*i2;
    1238             if(VarSize%4) VarSize+=4-(VarSize%4);
    1239 
    1240             //変数データを追加
    1241             lstrcpy(pVar->name,VarName);
    1242             if(dwFlags & DIMFLAG_CONST) pVar->bConst = true;
    1243             else pVar->bConst = false;
    1244             if(SubScripts[0]==-1) pVar->bArray=0;
    1245             else pVar->bArray=1;
    1246             pVar->type=TypeInfo.type;
    1247             pVar->u.index=TypeInfo.u.lpIndex;
    1248             AllLocalVarSize+=VarSize;
    1249             pVar->offset=AllLocalVarSize;
    1250 
    1251             //レキシカルスコープ
    1252             pVar->ScopeLevel=obj_LexScopes.GetNowLevel();
    1253             pVar->ScopeStartAddress=obj_LexScopes.GetStartAddress();
    1254             pVar->bLiving=TRUE;
    1255 
    1256             if(InitBuf[0]){
    1257                 //初期代入時のみ、書き込みアクセスを許可する
    1258                 bool bConstBack = pVar->bConst;
    1259                 pVar->bConst = false;
    1260 
    1261                 int result = InitLocalVar(-pVar->offset,
    1262                     pVar->type,
    1263                     pVar->u.index,
    1264                     pVar->SubScripts,
    1265                     InitBuf);
    1266 
    1267                 if(!result){
    1268                     if( isRef ){
    1269                         SetRefVariable( VarName, InitBuf );
    1270                     }
    1271                     else{
    1272                         char temporary[8192];
    1273                         sprintf(temporary,"%s=%s",VarName,InitBuf);
    1274                         OpcodeCalc(temporary);
    1275                     }
    1276                 }
    1277 
    1278                 pVar->bConst = bConstBack;
    1279             }
    1280             else{
    1281                 //push 0
    1282                 op_push_value(0);
    1283 
    1284                 //push VarSize
    1285                 op_push_value(VarSize);
    1286 
    1287                 //mov eax,ebp
    1288                 OpBuffer[obp++]=(char)0x8B;
    1289                 OpBuffer[obp++]=(char)0xC5;
    1290 
    1291                 //add eax,offset
    1292                 OpBuffer[obp++]=(char)0x05;
    1293                 *((long *)(OpBuffer+obp))=-pVar->offset;
    1294                 AddLocalVarAddrSchedule();
    1295                 obp+=sizeof(long);
    1296 
    1297                 //push eax
    1298                 op_push(REG_EAX);
    1299 
    1300                 //call FillMemory
    1301                 OpBuffer[obp++]=(char)0xFF;
    1302                 OpBuffer[obp++]=(char)0x15;
    1303                 DECLAREINFO *pdi;
    1304                 pdi=GetDeclareHash("FillMemory");
    1305                 pdi->bUse=1;
    1306                 pobj_ImportAddrSchedule->add(pdi);
    1307                 obp+=sizeof(long);
    1308             }
    1309         }
    1310 
    1311         //コンストラクタ呼び出し
    1312         if(TypeInfo.type==DEF_OBJECT&&(dwFlags&DIMFLAG_NONCALL_CONSTRACTOR)==0&& isRef == false ){
    1313             CallConstructor(VarName,SubScripts,TypeInfo,ConstractParameter);
    1314         }
    1315     }
    1316 
    1317     if(TypeInfo.type==DEF_OBJECT){
    1318         if(TypeInfo.u.pobj_Class->IsAbstract()){
    1319             //抽象クラスだったとき
    1320             SetError(125,TypeInfo.u.pobj_Class->name,cp);
    1321         }
     1350        dim( isRef,VarName,SubScripts,TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlags );
    13221351    }
    13231352}
  • BasicCompiler32/MakePeHdr.cpp

    r56 r64  
    2222    *pSub_realloc,
    2323    *pSub_free,
     24    *pSub_System_GC_malloc_ForObject,
     25    *pSub_System_GC_malloc_ForObjectPtr,
     26    *pSub_System_GC_free_for_SweepingDelete,
    2427
    2528    *pSub_allrem,
     
    3033    *pSub_allshl,
    3134    *pSub_allshr,
    32     *pSub_aullshr;
     35    *pSub_aullshr,
     36   
     37    *pSub_esp_error;
    3338
    3439
     
    227232        pSub_free->bUse=1;
    228233
     234    if( pSub_System_GC_malloc_ForObject = GetSubHash( "_System_GC_malloc_ForObject",1 ) )
     235        pSub_System_GC_malloc_ForObject->bUse = 1;
     236
     237    if( pSub_System_GC_malloc_ForObjectPtr = GetSubHash( "_System_GC_malloc_ForObjectPtr",1 ) )
     238        pSub_System_GC_malloc_ForObjectPtr->bUse = 1;
     239
     240    if( pSub_System_GC_free_for_SweepingDelete = GetSubHash( "_System_GC_free_for_SweepingDelete",1 ) )
     241        pSub_System_GC_free_for_SweepingDelete->bUse = 1;
     242
    229243    pSub_allrem=GetSubHash("_allrem");
    230244    pSub_allrem->bUse=1;
     
    258272    pSub_aullshr->bUse=1;
    259273    pSub_aullshr->bSystem=1;
     274
     275    pSub_esp_error=GetSubHash("_esp_error");
     276    pSub_esp_error->bUse=1;
     277
     278
    260279
    261280
  • BasicCompiler32/NumOpe.cpp

    r63 r64  
    66    //※この処理内では、esi、ediは使用不可
    77
    8     if(type==DEF_OBJECT){
     8    if(type==DEF_OBJECT || type==DEF_STRUCT){
    99        //push eax
    1010        op_push(REG_EAX);
     
    6262        op_push(REG_EAX);
    6363    }
    64     else if(type==DEF_PTR_BYTE){
    65         //push eax
    66         op_push(REG_EAX);
     64    else{
     65        SetError();
    6766    }
    6867}
     
    7170    ///////////////////////////////////////////////////////
    7271    // lpszTextを元にStringオブジェクトを生成し、
    73     // オブジェクトポインタをスタックに格納する
     72    // オブジェクトポインタをregに格納する
    7473    ///////////////////////////////////////////////////////
    7574
     75    char *parameter = (char *)malloc( lstrlen( lpszText ) + 3 );
     76    lstrcpy( parameter, lpszText );
     77    SetStringQuotes( parameter );
     78
    7679    extern CClass *pobj_StringClass;
    77     int object_size = pobj_StringClass->GetSize();
    78 
    79     //push object_size
    80     op_push_value(object_size);
    81 
    82     //call calloc
    83     extern SUBINFO *pSub_calloc;
    84     op_call(pSub_calloc);
    85 
    86     //push eax
    87     op_push(REG_EAX);
    88 
    89     //push eax
    90     op_push(REG_EAX);
    91 
    92     {
    93         //push eax
    94         op_push(REG_EAX);
    95 
    96         //call constructor
    97         op_call(pobj_StringClass->GetConstructorMethod()->psi);
    98     }
    99 
    100     // TODO: Ex表記による文字列長に対応する
    101     int i2 = dataTable.AddString( lpszText );
    102 
    103     //push lpszPtr
    104     OpBuffer[obp++]=(char)0x68;
    105     *((long *)(OpBuffer+obp))=i2;
    106     pobj_DataTableSchedule->add();
    107     obp+=sizeof(long);
    108 
    109 
    110     SetObjectVariable((LONG_PTR)pobj_StringClass,DEF_PTR_BYTE,-1,0);
     80    TYPEINFO baseTypeInfo = { DEF_OBJECT, (LONG_PTR)pobj_StringClass };
     81    Operator_New( *pobj_StringClass, "", parameter, baseTypeInfo );
     82
     83    free( parameter );
    11184}
    11285
     
    12295    }
    12396
    124     if(Command[0]==1&&Command[1]==ESC_NEW){
     97    if(Command[0]==1&& Command[1]==ESC_NEW ){
    12598        //New演算子(オブジェクト生成)
    126         return Operator_New(Command+2,plpIndex);
     99        TYPEINFO baseTypeInfo = { BaseType, lpBaseIndex };
     100        int resultType = Operator_New(Command+2,plpIndex, baseTypeInfo );
     101
     102        return resultType;
    127103    }
    128104
     
    221197                        TYPEINFO BaseTypeInfo = {BaseType,lpBaseIndex};
    222198                        if(IsStringSubsituation(pobj_Class)
    223                             || IsStringObjectType(&BaseTypeInfo)){
     199                            || IsStringObjectType(BaseTypeInfo)){
    224200                            //要求タイプがオブジェクトであり、Stringの受け入れが可能な場合
    225201
     
    239215
    240216
    241                     type[sp]=DEF_PTR_BYTE;
     217                    type[sp]=DEF_PTR_CHAR;
    242218                    index_stack[sp]=LITERAL_STRING;
    243219                    bLiteralCalculation=0;
     
    329305                            }
    330306
    331                             if(i2==DEF_OBJECT){
    332                                 //Object型が戻ったときはヒープ領域にインスタンスが格納されている
     307                            if(i2==DEF_STRUCT){
     308                                //構造体が戻ったときはヒープ領域にインスタンスが格納されている
    333309                                //※後にfreeする必要あり
    334310                                bUseHeap[sp]=1;
     
    413389                        }
    414390                        else if(i2==DEF_LONG||i2==DEF_DWORD||i2==DEF_SINGLE||
    415                             IsPtrType(i2)){
     391                            IsPtrType(i2) || i2==DEF_OBJECT){
    416392                            //32ビット型
    417393                            PushLongVariable(&RelativeVar);
     
    429405                            PushByteVariable(&RelativeVar);
    430406                        }
    431                         else if(i2==DEF_OBJECT){
    432                             //オブジェクト ポインタをeaxへ格納
     407                        else if(i2==DEF_STRUCT){
     408                            //構造体ポインタをeaxへ格納(構造体は値型)
    433409                            SetVarPtrToEax(&RelativeVar);
    434410
     
    436412                            op_push(REG_EAX);
    437413                        }
     414                        else SetError(11,term,cp);
    438415
    439416                        if(Is64Type(type[sp])&&IsWholeNumberType(i2)&&GetTypeSize(i2,-1)<=sizeof(long)){
     
    517494                        PushReturnValue(RetTypeInfo.type);
    518495
    519                         if(type[sp]==DEF_OBJECT){
    520                             //Object型が戻ったときはヒープ領域にインスタンスが格納されている
     496                        if(type[sp]==DEF_STRUCT){
     497                            //構造体が戻ったときはヒープ領域にインスタンスが格納されている
    521498                            //※後にfreeする必要あり
    522499                            bUseHeap[sp]=1;
  • BasicCompiler32/NumOpe_Relation.cpp

    r36 r64  
    13131313        OpBuffer[obp++]=(char)0xC3;
    13141314
    1315         //jnz 4(次のxorとjmpを飛び越す)
     1315        //jz 4(次のxorとjmpを飛び越す)
    13161316        OpBuffer[obp++]=(char)0x74;
    13171317        OpBuffer[obp++]=(char)0x04;
  • BasicCompiler32/Opcode.h

    r62 r64  
    9797void ChangeTypeToInteger(int OldType);
    9898void ChangeTypeToByte(int OldType);
     99void SetVariableFromEax(int VarType,int CalcType,RELATIVE_VAR *pRelativeVar);
    99100void OpcodeCalc(char *Command);
    100 void SetRefVariable( const char *varname, const char *expression );
    101101
    102102//NumOpe.cpp
     
    136136//Compile_Set_Var.cpp
    137137BOOL IsUse_ecx(RELATIVE_VAR *pRelativeVar);
    138 void SetObjectVariable(LONG_PTR lpVarIndex,int CalcType,LONG_PTR lpCalcIndex,BOOL bUseHeap);
     138void SetStructVariable(LONG_PTR lpVarIndex,int CalcType,LONG_PTR lpCalcIndex,BOOL bUseHeap);
     139void SetRealVariable(int VarType, int CalcType, RELATIVE_VAR *pRelativeVar);
     140void SetWholeVariable(int var_size,int type,RELATIVE_VAR *pRelative);
     141
    139142void SetDoubleVariable(int type,DWORD VarKind,DWORD offset,BOOL bOffsetOffset);
    140143void SetSingleVariable(int type,DWORD VarKind,DWORD offset,BOOL bOffsetOffset);
     
    171174
    172175//Compile_Object.cpp
    173 int Operator_New(const char *Parameter,LONG_PTR *plpIndex);
    174 void OpcodeDelete(char *Parameter);
     176void Operator_New( CClass &classObj, const char *objectSizeStr, const char *parameter, const TYPEINFO &baseTypeInfo );
     177int Operator_New(const char *Parameter,LONG_PTR *plpIndex,const TYPEINFO &baseTypeInfo );
     178void OpcodeDelete(const char *Parameter, bool isSweeping);
    175179
    176180//Compile_Var.cpp
     
    183187#define DIMFLAG_STATIC                  4
    184188#define DIMFLAG_CONST                   8
     189void dim(bool isRef, char *VarName,int *SubScripts,TYPEINFO &TypeInfo,int TypeSize,char *InitBuf,char *ConstractParameter,DWORD dwFlags);
    185190void OpcodeDim(char *Parameter,DWORD dwFlag);
    186191void SetVarPtrToEax(RELATIVE_VAR *pRelativeVar);
    187192
    188193//CParameter.cpp
     194#define OVERLOAD_MIN_LEVEL 0
     195#define OVERLOAD_MAX_LEVEL 3
     196#define OVERLOAD_LEVEL0 0
    189197#define OVERLOAD_LEVEL1 1
    190198#define OVERLOAD_LEVEL2 2
     
    216224    BOOL ErrorCheck(const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum);
    217225    void MacroParameterSupport(PARAMETER_INFO *ppi);
    218     void SetObjectParameter(CClass *pobj_Class,LPSTR Parameter);
     226    void SetStructParameter(CClass *pobj_Class,LPSTR Parameter);
    219227    int SetParameter(const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum);
    220228
    221229    //一時オブジェクトパラメータの生成と破棄
    222     void NewTempParameters( const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum );
     230    int NewTempParameters( const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum );
    223231    void DeleteTempParameters();
    224232};
     
    228236#define PROCFLAG_NEW    1
    229237int Opcode_CallProcPtr(char *variable,char *Parameter,PROCPTRINFO *pi,LONG_PTR *plpIndex);
    230 void Opcode_CallProc(char *Parameter,SUBINFO *psi,DWORD dwFlags,char *ObjectName,int RefType);
     238void Opcode_CallProc(const char *Parameter,SUBINFO *psi,DWORD dwFlags,char *ObjectName,int RefType);
    231239int Opcode_CallDllProc(char *Parameter,DECLAREINFO *pdi,LONG_PTR *plpIndex);
    232240
     
    258266void OpcodeGosub(char *Parameter);
    259267void OpcodeReturn(char *Parameter);
    260 void Opcode_Input(char *Parameter);
    261 void Opcode_Print(char *Parameter,BOOL bWrite);
     268void Opcode_Input(const char *Parameter);
     269void Opcode_Print(const char *Parameter,BOOL bWrite);
    262270void OpcodeCallPtr(char *Parameter);
    263271void OpcodeSetPtrData(char *Parameter,int type);
     
    300308void op_sbb_RV8         (int reg,char cValue);
    301309void op_sbb_RR          ( int reg1, int reg2 );
     310void op_imul_RR         (int reg1,int reg2);
     311void op_imul_RV         (int reg,int i32data);
    302312void op_and_RV          (int reg,int value);
    303313void op_or_RR           ( int op_size, int reg1, int reg2 );
     
    312322void op_add_esp(int num);
    313323void op_sub_esp(int num);
     324void op_cmp_RR( int reg1, int reg2 );
    314325void op_cmp_value(int op_size,int reg,char byte_data);
    315326void op_setne( int reg );
  • BasicCompiler32/OperatorProc.cpp

    r63 r64  
    5050        if(pBaseTypeInfo){
    5151            if(pBaseTypeInfo->type==DEF_OBJECT){
    52                 bReturnTypeIsObject=1;
    5352                ReturnType.u.lpIndex=pBaseTypeInfo->u.lpIndex;
    5453            }
     
    107106    HeapDefaultFree(ppi);
    108107
    109     int right_side_size;
    110     if(type[sp-1]==DEF_OBJECT) right_side_size=PTR_SIZE;
    111     else right_side_size=GetTypeSize(type[sp-1],index_stack[sp-1]);
    112 
    113     if(bTwoTerm){
    114         if(psi->pParmInfo[1].type==DEF_OBJECT&&psi->pParmInfo[1].bByVal){
     108    int right_side_size = GetTypeSize(type[sp-1],index_stack[sp-1]);
     109
     110    if(bTwoTerm){
     111        if(psi->pRealParmInfo[1].type==DEF_STRUCT&&psi->pRealParmInfo[1].bByVal){
    115112            //一時オブジェクトはメソッド内で破棄される
    116113            bUseHeap[sp-1]=0;
     
    119116
    120117
    121     if(psi->ReturnType==DEF_OBJECT){
     118    if(psi->ReturnType==DEF_STRUCT){
    122119        //////////////////////////////////////////////////////
    123         // 戻り値にオブジェクト インスタンスを持つ場合
    124         // ※ByRef _System_ReturnObject パラメータ用領域を取得
     120        // 戻り値に構造体インスタンスを持つ場合
     121        // ※ByRef _System_ReturnValue パラメータ用領域を取得
    125122        //////////////////////////////////////////////////////
    126123
     
    182179            op_push(REG_EAX);
    183180        }
    184     }
    185 
    186     if(psi->ReturnType==DEF_OBJECT){
     181
     182        if( !psi->pRealParmInfo[1].bByVal ){
     183            //一時参照を作成
     184
     185            //mov eax,esp
     186            op_mov_RR( REG_EAX, REG_ESP );
     187
     188            //push eax
     189            op_push( REG_EAX );
     190        }
     191    }
     192
     193    if(psi->ReturnType==DEF_STRUCT){
    187194        //push ebx
    188195        op_push(REG_EBX);
     
    195202    op_call(psi);
    196203
    197     if(psi->ReturnType!=-1){
     204    if(bTwoTerm){
     205        if( !psi->pRealParmInfo[1].bByVal ){
     206            //一時参照を破棄
     207            op_pop( REG_NON );
     208        }
     209    }
     210
     211    if(psi->ReturnType!=DEF_NON){
    198212        //スタックへプッシュ
    199213        PushReturnValue(psi->ReturnType);
     
    211225    index_stack[sp-1]=psi->u.ReturnIndex;
    212226
    213     if(psi->ReturnType==DEF_OBJECT){
    214         //Object型が戻ったときはヒープ領域にインスタンスが格納されている
     227    if(psi->ReturnType==DEF_STRUCT){
     228        //構造体が戻ったときはヒープ領域にインスタンスが格納されている
    215229        //※後にfreeする必要あり
    216230        bUseHeap[sp-1]=1;
  • BasicCompiler32/VarList.cpp

    r63 r64  
    2020    HTREEITEM hParent;
    2121
    22     if(type==DEF_OBJECT){
     22    if(type==DEF_OBJECT||type==DEF_STRUCT){
     23        if( type==DEF_OBJECT ){
     24            // 参照型ということを考慮する
     25            ReadProcessMemory(hDebugProcess,(void *)offset,&dwData,sizeof(void *),&dwAccessByte);
     26            offset = dwData;
     27        }
     28
    2329        sprintf(lptv->item.pszText,"%s %s(&H%X)",VarName,STRING_OBJECT,offset);
    2430        lptv->item.iImage=1;
     
    2935        return;
    3036    }
    31     if(type==DEF_PTR_OBJECT){
     37    if(type==DEF_PTR_OBJECT||type==DEF_PTR_STRUCT){
    3238        i2=ReadProcessMemory(hDebugProcess,(void *)offset,&dwData,sizeof(DWORD),&dwAccessByte);
    3339
     
    4147    }
    4248    else{
    43         if(type==DEF_PTR_BYTE){
     49        if(type==DEF_PTR_CHAR||type==MAKE_PTR_TYPE(DEF_BYTE,1)){
    4450            if(ReadProcessMemory(hDebugProcess,(void *)offset,&dwData,sizeof(DWORD),&dwAccessByte)){
    4551                for(i2=0;;i2++){
  • BasicCompiler32/WatchList.cpp

    r63 r64  
    7878    if(PTR_LEVEL(*pType)){
    7979        *pType=MAKE_PTR_TYPE(NATURAL_TYPE(*pType),PTR_LEVEL(*pType)-1);
    80         if((*pType)==DEF_OBJECT){
    81             CClass *pClass = (CClass *)lpIndex;
    82             array_num *= pClass->GetSize();
    83         }
    84         else{
    85             array_num *= GetTypeSize(*pType,-1);
    86         }
     80        array_num *= GetTypeSize(*pType,-1);
    8781    }
    8882    else{
     
    114108    char lpPtrOffset[VN_SIZE];  //第2次配列
    115109    char NestMember[VN_SIZE];   //入れ子メンバ
    116     int RefType;                //"."参照のときは0、"->"参照のときは1
     110    CClass::RefType refType;
    117111    lstrcpy(VarName,member);
    118     if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember,&RefType)) return 0;
     112    if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember,refType)) return 0;
    119113
    120114
     
    175169        //入れ子構造の場合
    176170
    177         if(*pType==DEF_OBJECT){
    178             if(RefType!=DEF_OBJECT) return 0;
    179         }
    180         else if(*pType==DEF_PTR_OBJECT){
     171        if(*pType==DEF_OBJECT || *pType==DEF_STRUCT){
     172            if( refType != CClass::Dot ) return 0;
     173
     174            if( *pType==DEF_OBJECT ){
     175                extern HANDLE hDebugProcess;
     176                LONG_PTR lpData;
     177                SIZE_T stAccBytes;
     178                lpData=Debugging_GetVarPtr(pRelativeVar);
     179                if(!ReadProcessMemory(hDebugProcess,(void *)lpData,&pRelativeVar->offset,sizeof(LONG_PTR),&stAccBytes)) return -1;
     180                pRelativeVar->dwKind=VAR_DIRECTMEM;
     181            }
     182        }
     183        else if(*pType==DEF_PTR_OBJECT || *pType==DEF_PTR_STRUCT){
    181184            //構造体ポインタ型メンバ変数
    182185
    183186            if(lpPtrOffset[0]){
    184                 if(RefType!=DEF_OBJECT) return 0;
     187                if( refType != CClass::Dot ) return 0;
    185188
    186189                //直接参照に切り替え
     
    190193            }
    191194            else{
    192                 if(RefType!=DEF_PTR_OBJECT) return 0;
     195                if( refType != CClass::Pointer ) return 0;
    193196
    194197                extern HANDLE hDebugProcess;
     
    319322int Debugging_GetVarOffset(char *variable,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss){
    320323    extern HANDLE hDebugProcess;
    321     int i,i2,i3,RefType;
     324    int i,i2,i3;
    322325    char member[VN_SIZE],VarName[VN_SIZE],array[VN_SIZE],lpPtrOffset[VN_SIZE];
    323326    ULONG_PTR lpData;
     
    325328
    326329    lstrcpy(VarName,variable);
    327     GetVarFormatString(VarName,array,lpPtrOffset,member,&RefType);
     330    CClass::RefType refType;
     331    GetVarFormatString(VarName,array,lpPtrOffset,member,refType);
    328332
    329333    LONG_PTR lpIndex;
     
    470474    }
    471475    if(member[0]){
    472         if(*pType==DEF_OBJECT){
     476        if(*pType==DEF_OBJECT || *pType==DEF_STRUCT){
    473477            //実態オブジェクトのメンバを参照(obj.member)
    474             if(RefType!=DEF_OBJECT){
     478            if( refType != CClass::Dot ){
    475479                return 0;
    476480            }
     
    489493            *plpIndex=lp2;
    490494        }
    491         else if(*pType==DEF_PTR_OBJECT){
     495        else if(*pType==DEF_PTR_OBJECT || *pType==DEF_PTR_STRUCT){
    492496            //ポインタオブジェクトが示すメンバを参照
    493497            if(lpPtrOffset[0]){
    494498                //pObj[n].member
    495                 if(RefType!=DEF_OBJECT) return 0;
     499                if( refType != CClass::Dot ) return 0;
    496500                Debugging_SetRelativeOffset(pType,lpIndex,pRelativeVar,lpPtrOffset);
    497501
     
    511515            else{
    512516                //pObj->member
    513                 if(RefType!=DEF_PTR_OBJECT) return 0;
     517                if( refType != CClass::Pointer ) return 0;
    514518
    515519                pRelativeVar->offset=Debugging_GetVarPtr(pRelativeVar);
  • BasicCompiler32/commandvalue.h

    r3 r64  
    1919#define COM_LET     0x1066
    2020#define COM_DELETE  0x1068
     21#define COM_SWEEPINGDELETE  0x1069
    2122
    2223//その他
  • BasicCompiler32/increment.cpp

    r62 r64  
    11#include "../BasicCompiler_Common/common.h"
    22#include "Opcode.h"
    3 
    4 
    5 void SetRealVariable(int type,RELATIVE_VAR *pRelativeVar){
    6     if(pRelativeVar->dwKind==VAR_GLOBAL){
    7         if(pRelativeVar->bOffsetOffset){
    8             //fstp ptr[ecx+offset]
    9             op_fstp_base_offset(type,REG_ECX,(int)pRelativeVar->offset);
    10             obp-=sizeof(long);
    11             pobj_GlobalVarSchedule->add();
    12             obp+=sizeof(long);
    13         }
    14         else{
    15             //mov ecx,offset
    16             op_mov_RV(REG_ECX,(int)pRelativeVar->offset);
    17             obp-=sizeof(long);
    18             pobj_GlobalVarSchedule->add();
    19             obp+=sizeof(long);
    20 
    21             //fstp ptr[ecx]
    22             op_fstp_basereg(type,REG_ECX);
    23         }
    24     }
    25     else if(pRelativeVar->dwKind==VAR_REFGLOBAL){
    26         if(pRelativeVar->bOffsetOffset){
    27             //add ecx,qword ptr[offset]
    28             op_add_RM(sizeof(long),REG_ECX,REG_NON,(int)pRelativeVar->offset,MOD_DISP32);
    29         }
    30         else{
    31             //mov ecx,qword ptr[offset]
    32             op_mov_RM(sizeof(long),REG_ECX,REG_NON,(int)pRelativeVar->offset,MOD_DISP32);
    33         }
    34         obp-=sizeof(long);
    35         pobj_GlobalVarSchedule->add();
    36         obp+=sizeof(long);
    37 
    38         goto directmem;
    39     }
    40     else if(pRelativeVar->dwKind==VAR_LOCAL){
    41         if(pRelativeVar->bOffsetOffset){
    42             //fstp ptr[ebp+ecx+offset]
    43             op_fstp_base_offset_ex(type,REG_EBP,REG_ECX,(int)pRelativeVar->offset,USE_OFFSET);
    44         }
    45         else{
    46             //fstp ptr[ebp+offset]
    47             op_fstp_base_offset(type,REG_EBP,(int)pRelativeVar->offset);
    48         }
    49         obp-=sizeof(long);
    50         AddLocalVarAddrSchedule();
    51         obp+=sizeof(long);
    52     }
    53     else if(pRelativeVar->dwKind==VAR_REFLOCAL){
    54         if(pRelativeVar->bOffsetOffset){
    55             //add ecx,qword ptr[ebp+offset]
    56             op_add_RM(sizeof(long),REG_ECX,REG_EBP,(int)pRelativeVar->offset,MOD_BASE_DISP32);
    57         }
    58         else{
    59             //mov ecx,qword ptr[ebp+offset]
    60             op_mov_RM(sizeof(long),REG_ECX,REG_EBP,(int)pRelativeVar->offset,MOD_BASE_DISP32);
    61         }
    62         obp-=sizeof(long);
    63         AddLocalVarAddrSchedule();
    64         obp+=sizeof(long);
    65 
    66         goto directmem;
    67     }
    68     else if(pRelativeVar->dwKind==VAR_DIRECTMEM){
    69 directmem:
    70         //fstp ptr[ecx]
    71         op_fstp_basereg(type,REG_ECX);
    72     }
    73 }
    74 
    75 void ExtendTypeTo32(int type,int reg);
    76 void ExtendTypeTo64(int type){
    77     if(Is64Type(type)) return;
    78 
    79     ExtendTypeTo32(type,REG_EAX);
    80 
    81     if(IsSignedType(type)){
    82         //cdq
    83         op_cdq();
    84     }
    85     else{
    86         //xor edx,edx
    87         op_zero_reg(REG_EDX);
    88     }
    89 }
    90 void ExtendTypeTo32(int type,int reg){
    91     if(type==DEF_INTEGER || (isUnicode&&type==DEF_CHAR)){
    92         //movsx reg32,reg16
    93         op_movsx_R32R16(reg,reg);
    94     }
    95     else if(type==DEF_WORD){
    96         //and reg,0000FFFFh
    97         op_and_RV(reg,(int)0x0000FFFF);
    98     }
    99     else if(type==DEF_SBYTE || (isUnicode==false&&type==DEF_CHAR)){
    100         //movsx reg32,reg8
    101         op_movsx_R32R8(reg,reg);
    102     }
    103     else if(type==DEF_BYTE||type==DEF_BOOLEAN){
    104         //and reg,000000FFh
    105         op_and_RV(reg,(int)0xFF);
    106     }
    107 }
    108 void ExtendTypeTo16(int type,int reg){
    109     if(type==DEF_SBYTE || (isUnicode==false&&type==DEF_CHAR)){
    110         //movsx reg16,reg8
    111         op_movsx_R16R8(reg,reg);
    112     }
    113     else if(type==DEF_BYTE||type==DEF_BOOLEAN){
    114         //and reg,000000FFh
    115         op_and_RV(reg,(int)0xFF);
    116     }
    117 }
    118 
    119 void SetWholeVariable(int var_size,int type,RELATIVE_VAR *pRelative,int reg){
    120     if(type==DEF_DOUBLE){
    121         //Double型
    122 
    123     }
    124     else if(type==DEF_SINGLE){
    125         //Single型
    126 
    127     }
    128     else{
    129         //その他の整数
    130 
    131         if(var_size==sizeof(_int64)){
    132             //eaxの値を64ビット(edx:eax)に拡張する
    133             ExtendTypeTo64(type);
    134         }
    135         else if(var_size==sizeof(long)){
    136             //レジスタの値を32ビット(eax)に拡張する
    137             ExtendTypeTo32(type,reg);
    138         }
    139         else if(var_size==sizeof(short)){
    140             //レジスタの値を16ビット(ax)に拡張する
    141             ExtendTypeTo16(type,reg);
    142         }
    143         //8ビットは拡張なし
    144     }
    145 
    146     if(var_size==sizeof(_int64)){
    147         //下位32ビット
    148         SetWholeVariable(sizeof(long),DEF_LONG,pRelative,REG_EAX);
    149 
    150         //上位32ビット
    151         pRelative->offset+=sizeof(long);
    152         SetWholeVariable(sizeof(long),DEF_LONG,pRelative,REG_EDX);
    153         pRelative->offset-=sizeof(long);
    154 
    155         return;
    156     }
    157 
    158     if(pRelative->dwKind==VAR_GLOBAL){
    159         if(pRelative->bOffsetOffset){
    160             //mov ptr[ecx+offset],eax/ax/al
    161             op_mov_MR(var_size,reg,REG_ECX,(int)pRelative->offset,MOD_BASE_DISP32);
    162         }
    163         else{
    164             //mov ptr[offset],eax/ax/al
    165             op_mov_MR(var_size,reg,0,(int)pRelative->offset,MOD_DISP32);
    166         }
    167         obp-=sizeof(long);
    168         pobj_GlobalVarSchedule->add();
    169         obp+=sizeof(long);
    170     }
    171     else if(pRelative->dwKind==VAR_REFGLOBAL){
    172         if(pRelative->bOffsetOffset){
    173             //add ecx,qword ptr[offset]
    174             op_add_RM(var_size,REG_ECX,REG_NON,(int)pRelative->offset,MOD_DISP32);
    175         }
    176         else{
    177             //mov ecx,qword ptr[offset]
    178             op_mov_RM(var_size,REG_ECX,REG_NON,(int)pRelative->offset,MOD_DISP32);
    179         }
    180         obp-=sizeof(long);
    181         pobj_GlobalVarSchedule->add();
    182         obp+=sizeof(long);
    183 
    184         goto directmem;
    185     }
    186     else if(pRelative->dwKind==VAR_LOCAL){
    187         if(pRelative->bOffsetOffset){
    188             //mov ptr[ebp+ecx+offset],eax/ax/al
    189             op_mov_MR_ex(var_size,reg,REG_EBP,REG_ECX,(int)pRelative->offset,USE_OFFSET);
    190         }
    191         else{
    192             //mov ptr[ebp+offset],eax/ax/al
    193             op_mov_MR(var_size,reg,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32);
    194         }
    195         obp-=sizeof(long);
    196         AddLocalVarAddrSchedule();
    197         obp+=sizeof(long);
    198     }
    199     else if(pRelative->dwKind==VAR_REFLOCAL){
    200         if(pRelative->bOffsetOffset){
    201             //add ecx,qword ptr[ebp+offset]
    202             op_add_RM(var_size,REG_ECX,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32);
    203         }
    204         else{
    205             //mov ecx,qword ptr[ebp+offset]
    206             op_mov_RM(var_size,REG_ECX,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32);
    207         }
    208         obp-=sizeof(long);
    209         AddLocalVarAddrSchedule();
    210         obp+=sizeof(long);
    211 
    212         goto directmem;
    213     }
    214     else if(pRelative->dwKind==VAR_DIRECTMEM){
    215 directmem:
    216 
    217         //mov ptr[ecx],eax/ax/al
    218         op_mov_MR(var_size,reg,REG_ECX,0,MOD_BASE);
    219     }
    220 }
    221 
    222 void SetVariableFromReg(int VarType,int CalcType,RELATIVE_VAR *pRelativeVar){
    223     /////////////////////////////////////////////////
    224     // raxの内容を変数にコピーするコードを抽出
    225     /////////////////////////////////////////////////
    226 
    227     if(VarType==DEF_DOUBLE){
    228         //Double型変数へスタックの内容を格納する
    229         SetRealVariable(VarType,pRelativeVar);
    230     }
    231     else if(VarType==DEF_SINGLE){
    232         //Single型変数へスタックの内容を格納する
    233         SetRealVariable(VarType,pRelativeVar);
    234     }
    235     else{
    236         //整数型
    237         SetWholeVariable(GetTypeSize(VarType,-1),CalcType,pRelativeVar,REG_EAX);
    238     }
    239 }
    240 
    2413
    2424void IncDec(int idCalc, char *lpszLeft, char *lpszRight){
     
    438200    }
    439201
    440     SetVariableFromReg(VarType,VarType,&VarRelativeVar);
     202    SetVariableFromEax(VarType,VarType,&VarRelativeVar);
    441203}
  • BasicCompiler32/op32_main.cpp

    r36 r64  
    372372
    373373
     374////////////////////////
     375// imul関連
     376////////////////////////
     377
     378void op_imul_RR(int reg1,int reg2){
     379    //imul reg1,reg2
     380
     381    //オペコード
     382    OpBuffer[obp++]=(char)0x0F;
     383    OpBuffer[obp++]=(char)0xAF;
     384
     385    //レジスタ
     386    OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(reg1)<<3 | REGISTER_OPERAND(reg2));
     387}
     388
     389void op_imul_RV(int reg,int i32data){
     390    //imul reg,i32data
     391
     392    if(-128<=i32data&&i32data<=127){
     393        //オペコード
     394        OpBuffer[obp++]=(char)0x6B;
     395
     396        //レジスタ
     397        OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(reg)<<3 | REGISTER_OPERAND(reg));
     398
     399        //値
     400        OpBuffer[obp++]=(char)i32data;
     401    }
     402    else{
     403        //オペコード
     404        OpBuffer[obp++]=(char)0x69;
     405
     406        //レジスタ
     407        OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(reg)<<3 | REGISTER_OPERAND(reg));
     408
     409        //値
     410        *((long *)(OpBuffer+obp))=i32data;
     411        obp+=sizeof(long);
     412    }
     413}
     414
     415
    374416
    375417//////////////////////
     
    468510void op_push(int reg){
    469511    //push reg
     512
     513    if( reg == REG_NON ){
     514        op_sub_esp( PTR_SIZE );
     515        return;
     516    }
    470517
    471518    //オペコード、レジスタ
     
    489536    //pop reg
    490537
     538    if( reg == REG_NON ){
     539        op_add_esp( PTR_SIZE );
     540        return;
     541    }
     542
    491543    //オペコード、レジスタ
    492544    __op_format(0,(char)0x58,reg);
     
    532584// cmp関連
    533585/////////////////////
     586void op_cmp_RR( int reg1, int reg2 ){
     587    //オペコード
     588    OpBuffer[obp++]=(char)0x3B;
     589
     590    //レジスタ
     591    OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(reg1)<<3 | REGISTER_OPERAND(reg2));
     592}
    534593void op_cmp_value(int op_size,int reg,char byte_data){
    535594    //cmp reg,byte_data
  • BasicCompiler64/CParameter.cpp

    r63 r64  
    22#include "opcode.h"
    33
    4 void CParameter::NewTempParameters( const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum ){
     4int CParameter::NewTempParameters( const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum ){
    55    ///////////////////////////////////////////////////////
    66    // 一時オブジェクトをあらかじめスタックに積んでおく
    77    ///////////////////////////////////////////////////////
     8
     9    int stackItemNum = 0;
    810
    911    useTempObject = false;
     
    6062                int type = NumOpe( &reg, Parms[i2], DummyTypeInfo.type, DummyTypeInfo.u.lpIndex, &lpVarIndex );
    6163
     64                if( type == DEF_OBJECT ){
     65                    //一時参照を作成
     66                    pobj_sf->push( reg );
     67                    pobj_sf->mov_sp( reg );
     68
     69                    stackItemNum++;
     70                }
     71
    6272                //スタックフレームへコピー
    6373                StackOffsetOfTempObject[i2] = pobj_sf->push(reg);
     74
     75                stackItemNum++;
    6476
    6577                bool result = CheckDifferentType(
     
    8193        }
    8294    }
     95
     96    return stackItemNum * PTR_SIZE;
    8397}
    8498void CParameter::DeleteTempParameters(){
     
    90104    for(int i2=ParmsNum-1;i2>=0;i2--){
    91105        if( useTempParameters[i2] ){
    92             //スタックフレームから取得
    93             pobj_sf->ref(REG_RCX);
    94 
    95             //デストラクタを呼び出す
    96 
    97             //call destructor
    98             CMethod *method = types[i2].u.pobj_Class->GetDestructorMethod();
    99             if( method ){
    100                 op_call( method->psi );
    101             }
    102 
    103             //メモリを解放する
    104 
    105             pobj_sf->pop(REG_RCX);
    106 
    107             //call free
    108             extern SUBINFO *pSub_free;
    109             op_call(pSub_free);
     106            if( types[i2].type == DEF_STRUCT ){
     107                // 構造体の一時メモリ
     108
     109                //メモリを解放する
     110
     111                pobj_sf->pop( REG_RCX );
     112
     113                //call free
     114                extern SUBINFO *pSub_free;
     115                op_call(pSub_free);
     116            }
     117            else if( types[i2].type == DEF_OBJECT ){
     118                pobj_sf->pop();
     119                pobj_sf->pop();
     120            }
     121            else{
     122                SetError(300,NULL,cp);
     123            }
    110124        }
    111125    }
    112126}
    113127
    114 void CParameter::SetObjectParameter(int reg,CClass *pobj_Class,LPSTR Parameter){
     128void CParameter::SetStructParameter(int reg,CClass *pobj_Class,LPSTR Parameter){
    115129    //////////////////////////////////////////////////////
    116130    /////    レジスタ資源のバックアップ
     
    133147        pobj_sf->push(REG_R11);
    134148
    135         TYPEINFO BaseType={DEF_OBJECT,(LONG_PTR)pobj_Class};
     149        TYPEINFO BaseType={DEF_STRUCT,(LONG_PTR)pobj_Class};
    136150        TYPEINFO CalcType;
    137151        CalcType.type=NumOpe_GetType(Parameter,&BaseType,&CalcType.u.lpIndex);
    138152
     153        /*
     154        TODO: 消す
    139155        if( pobj_Class->GetCopyConstructorMethod()
    140156            && CalcType.type==DEF_OBJECT&&CalcType.u.pobj_Class==pobj_Class){
     
    178194                op_call(pobj_Class->GetConstructorMethod()->psi);
    179195            }
     196            */
    180197
    181198
    182199            BOOL bUseHeap;
    183200            int temp_reg=REG_RAX;
    184             CalcType.type=NumOpe(&temp_reg,Parameter,DEF_OBJECT,(LONG_PTR)pobj_Class,&CalcType.u.lpIndex,&bUseHeap);
     201            CalcType.type=NumOpe(&temp_reg,Parameter,DEF_STRUCT,(LONG_PTR)pobj_Class,&CalcType.u.lpIndex,&bUseHeap);
    185202
    186203
     
    194211            RelativeVar.dwKind=VAR_DIRECTMEM;
    195212
    196             SetObjectVariableFromRax((LONG_PTR)pobj_Class,CalcType.type,CalcType.u.lpIndex,&RelativeVar,bUseHeap);
    197 
    198         }
     213            SetStructVariableFromRax((LONG_PTR)pobj_Class,CalcType.type,CalcType.u.lpIndex,&RelativeVar,bUseHeap);
     214
     215        //}
    199216
    200217        //mov r11,qword ptr[rsp+offset]     ※スタックフレームを利用
     
    209226    op_mov_RR(reg,REG_R11);
    210227}
     228
    211229
    212230void CParameter::SetParameter(const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum){
     
    298316            }
    299317
    300             if(DummyTypeInfo.type==DEF_OBJECT){
    301                 SetObjectParameter(reg,DummyTypeInfo.u.pobj_Class,Parms[i2]);
     318            if(DummyTypeInfo.type==DEF_STRUCT){
     319                SetStructParameter(reg,DummyTypeInfo.u.pobj_Class,Parms[i2]);
    302320                goto next;
    303321            }
     
    318336
    319337            if(CalcType==DEF_OBJECT){
    320                 //キャスト演算子のオーバーロードに対応する
    321                 CallCastOperatorProc(reg,CalcType,lpCalcIndex,bCalcUseHeap,DummyTypeInfo.type,DummyTypeInfo.u.lpIndex);
     338                if( DummyTypeInfo.type != DEF_OBJECT
     339                    ||
     340                    DummyTypeInfo.type == DEF_OBJECT &&
     341                    !DummyTypeInfo.u.pobj_Class->IsEqualsOrSubClass( (CClass *)lpCalcIndex ) ){
     342                        //キャスト演算子のオーバーロードに対応する
     343                        CallCastOperatorProc(reg,CalcType,lpCalcIndex,bCalcUseHeap,DummyTypeInfo.type,DummyTypeInfo.u.lpIndex);
     344                }
    322345            }
    323346
     
    419442                                    }
    420443                                }
     444                                else if(DummyTypeInfo.type==DEF_STRUCT){
     445                                    if( !DummyTypeInfo.u.pobj_Class->IsEquals( (CClass *)lpVarIndex ) ){
     446                                        SetError(11,Parms[i2],cp);
     447                                    }
     448                                }
    421449                            }
    422450                            else if((VarType&FLAG_PTR)&&((VarType^FLAG_PTR)==DummyTypeInfo.type)){
     
    442470            }
    443471        }
     472
    444473next:
     474
    445475        if(reg==REG_RAX){
    446476            //スタックフレームへコピー
  • BasicCompiler64/CommandValue.h

    r3 r64  
    1919#define COM_LET     0x1066
    2020#define COM_DELETE  0x1068
     21#define COM_SWEEPINGDELETE  0x1069
    2122
    2223//その他
  • BasicCompiler64/Compile_Calc.cpp

    r62 r64  
    1111        SetBooleanVariable(CalcType,pRelativeVar);
    1212    }
    13     else if(VarType==DEF_SBYTE||VarType==DEF_BYTE || (isUnicode==false&&VarType==DEF_CHAR)){
    14         //8ビット変数へalレジスタの内容を格納する
    15         SetWholeVariable(sizeof(char),CalcType,pRelativeVar);
    16     }
    17     else if(VarType==DEF_INTEGER||VarType==DEF_WORD || (isUnicode&&VarType==DEF_CHAR)){
    18         //16ビット変数へaxレジスタの内容を格納する
    19         SetWholeVariable(sizeof(short),CalcType,pRelativeVar);
    20     }
    21     else if(VarType==DEF_LONG||VarType==DEF_DWORD){
    22         //32ビット変数へeaxレジスタの内容を格納する
    23         SetWholeVariable(sizeof(long),CalcType,pRelativeVar);
    24     }
    25     else if(VarType==DEF_INT64||VarType==DEF_QWORD||IsPtrType(VarType)){
    26         //64ビット変数へraxレジスタの内容を格納する
    27         SetWholeVariable(sizeof(_int64),CalcType,pRelativeVar);
    28     }
    29     else if(VarType==DEF_DOUBLE){
    30         //Double型変数へスタックの内容を格納する
    31         SetDoubleVariable(CalcType,pRelativeVar);
    32     }
    33     else if(VarType==DEF_SINGLE){
    34         //Single型変数へスタックの内容を格納する
    35         SetSingleVariable(CalcType,pRelativeVar);
     13    else if( IsRealNumberType( VarType ) ){
     14        // Double/Single型変数へレジスタの値を代入
     15        SetRealVariable(VarType, CalcType, pRelativeVar);
     16    }
     17    else if( IsWholeNumberType( VarType ) || VarType == DEF_OBJECT ){
     18        int typeSize = GetTypeSize( VarType, -1 );
     19
     20        //整数変数へraxの値を格納する
     21        SetWholeVariable( typeSize, CalcType, pRelativeVar );
    3622    }
    3723    else{
     
    165151
    166152
     153    if( lstrcmpi( variable, "This" ) == 0 ){
     154        SetError(133,NULL,cp);
     155        return;
     156    }
     157
    167158
    168159    ////////////////////////////////////////
     
    195186    CalcType=NumOpe(&reg,Command+i+1,VarType,lpVarIndex,&lpCalcIndex,&bCalcUseHeap);
    196187
     188    if(reg!=REG_RAX&&IsWholeNumberType(CalcType)){
     189        SetError(300,NULL,cp);
     190    }
     191
     192    if(VarType==-1||CalcType==-1) return;
     193
    197194    //結果を格納しているレジスタをブロッキング
    198195    pobj_BlockReg->lock(reg);
    199 
    200     if(VarType==-1||CalcType==-1) return;
    201196
    202197    //変数アドレスを取得
     
    206201        &VarType,
    207202        &VarRelativeVar,
    208         &lpVarIndex)) return;
     203        &lpVarIndex,
     204        NULL)) return;
    209205
    210206    //レジスタのブロッキングを解除
     
    216212    }
    217213
    218     if(VarType==DEF_OBJECT){
    219         //オブジェクトインスタンスへの代入
    220         SetObjectVariableFromRax(lpVarIndex,CalcType,lpCalcIndex,&VarRelativeVar,bCalcUseHeap);
    221         return;
    222     }
    223 
    224     if(CalcType==DEF_OBJECT){
     214    if(VarType==DEF_STRUCT ){
     215        //構造体インスタンスへの代入
     216        SetStructVariableFromRax(lpVarIndex,CalcType,lpCalcIndex,&VarRelativeVar,bCalcUseHeap);
     217        return;
     218    }
     219
     220    if(CalcType==DEF_OBJECT && (CalcType!=VarType || lpCalcIndex!=lpVarIndex) ){
    225221        //キャスト演算子のオーバーロードに対応する
    226222        CallCastOperatorProc(REG_RAX,CalcType,lpCalcIndex,bCalcUseHeap,VarType,lpVarIndex);
     
    241237}
    242238
     239// TODO: 消す
     240/*
    243241void SetRefVariable( const char *varname, const char *expression ){
    244242    ////////////////////////////////////////
     
    320318    SetVariableFromRax(VarType,CalcType,&VarRelativeVar);
    321319}
     320*/
  • BasicCompiler64/Compile_CallProc.cpp

    r63 r64  
    1212
    1313    //mov rdx,rax
    14     op_mov64_ToReg_FromReg(REG_RDX,REG_RAX);
     14    op_mov_RR(REG_RDX,REG_RAX);
    1515
    1616    //mov rcx,rsp
    17     op_mov64_ToReg_FromReg(REG_RCX,REG_RSP);
     17    op_mov_RR(REG_RCX,REG_RSP);
    1818
    1919    //call _DebugSys_SaveContext
     
    9696}
    9797
    98 void Opcode_CallProc(char *Parameter,SUBINFO *psi,DWORD dwFlags,char *ObjectName,int RefType){
     98void Opcode_CallProc(const char *Parameter,SUBINFO *psi,DWORD dwFlags,char *ObjectName,int RefType){
    9999    int i2;
    100100
     
    207207
    208208    ///////////////////////////////////////////////////////////////
    209     // _System_LocalThis、_System_ReturnObjectのダミーをセット
     209    // _System_LocalThisのダミーをセット
    210210    ///////////////////////////////////////////////////////////////
    211211
     
    216216    }
    217217
    218     if(psi->ReturnType==DEF_OBJECT && psi->isReturnRef == false ){
    219         //_System_ReturnObject(第一または第二パラメータのダミーを作成)
    220         sprintf(temporary+lstrlen(temporary),"%c%c0,",1,ESC_BYVAL);
    221     }
    222 
    223218    if(Parameter[0]=='\0'&&temporary[0])
    224219        temporary[lstrlen(temporary)-1]=0;
    225220    else lstrcat(temporary,Parameter);
     221
     222
     223    //パラメータセット前のspオフセットを取得(Newの場合はここにThisポインタが格納されている)
     224    int this_sp_offset = pobj_sf->GetNowSp();
    226225
    227226
     
    254253    pobj_parameter->SetParameter(psi->name,psi->pRealParmInfo,psi->RealParmNum,psi->RealSecondParmNum);
    255254
    256 
    257     if(psi->ReturnType==DEF_OBJECT && psi->isReturnRef == false){
     255    if(psi->ReturnType==DEF_STRUCT && psi->isReturnRef == false){
    258256        //////////////////////////////////////////////////////
    259         // 戻り値にオブジェクト インスタンスを持つ場合
    260         // ※ByRef _System_ReturnObject パラメータをセット
     257        // 戻り値に構造体インスタンスを持つ場合
     258        // ※ByRef _System_ReturnValue パラメータをセット
    261259        //////////////////////////////////////////////////////
    262260
     
    316314                SetVarPtrToReg(REG_RCX,&RelativeVar);
    317315
    318                 //参照タイプが "->" の場合
    319                 if(RefType==DEF_PTR_OBJECT){
    320                     //mov rcx,qword ptr[rcx]
    321                     op_mov_RM(sizeof(_int64),REG_RCX,REG_RCX,0,MOD_BASE);
    322                 }
     316                // 参照を実体ポインタにする
     317                //mov rcx,qword ptr[rcx]
     318                op_mov_RM(sizeof(_int64),REG_RCX,REG_RCX,0,MOD_BASE);
    323319            }
    324320        }
     
    329325
    330326                //mov rcx,qword ptr[rsp+offset]     ※スタックフレームを利用
    331                 pobj_sf->ref(REG_RCX);
     327                pobj_sf->ref_offset_data(REG_RCX, this_sp_offset);
    332328            }
    333329            else{
  • BasicCompiler64/Compile_Func.cpp

    r51 r64  
    6262
    6363    TYPEINFO TypeInfo={type,lpIndex};
    64     if(IsStringObjectType(&TypeInfo)){
     64    if(IsStringObjectType(TypeInfo)){
    6565        //Stringオブジェクトの場合
    6666        sprintf(temporary,"%s.Length",tempParm);
     
    195195}
    196196void Opcode_Func_SizeOf( const char *Parameter ){
    197     int type,size;
    198197    LONG_PTR lpIndex;
    199 
    200     type=GetTypeFixed(Parameter,&lpIndex);
    201     size=GetTypeSize(type,lpIndex);
     198    int type = GetTypeFixed(Parameter,&lpIndex);
     199
     200    int size;
     201    if( type == DEF_OBJECT ){
     202        CClass *pClass = (CClass *)lpIndex;
     203        size = pClass->GetSize();
     204    }
     205    else{
     206        size=GetTypeSize(type,lpIndex);
     207    }
    202208
    203209    //mov rax,size
     
    210216    if(!GetVarOffsetReadOnly( Parameter, &ReturnTypeInfo.type, &RelativeVar, &ReturnTypeInfo.u.lpIndex )) return;
    211217
     218    int beforeType = ReturnTypeInfo.type;
     219
    212220    PTR_LEVEL_UP( ReturnTypeInfo.type );
    213221
    214222    SetVarPtrToReg(REG_RAX,&RelativeVar);
     223
     224    if( beforeType == DEF_OBJECT && lstrcmpi( Parameter, "This" ) != 0 ){
     225        //参照をオブジェクトポインタに変更
     226
     227        //mov rax,qword ptr[rax]
     228        op_mov_RM( sizeof(_int64), REG_RAX, REG_RAX, 0, MOD_BASE );
     229    }
    215230}
    216231void Opcode_Func_GetPtrData( const char *Parameter, const int type ){
  • BasicCompiler64/Compile_Object.cpp

    r51 r64  
    22#include "opcode.h"
    33
    4 void _call_constructor(CClass *pobj_c,char *CreateParameter,int ObjectSize,BOOL bSomeObjects){
     4void _call_constructor(CClass *pobj_c,const char *CreateParameter,int ObjectSize,BOOL bSomeObjects){
    55    ////////////////////////////
    66    // コンストラクタの呼び出し
     
    7373    }
    7474}
    75 int Operator_New(const char *Parameter,LONG_PTR *plpIndex){
    76     char TypeName[VN_SIZE],CreateParameter[VN_SIZE],ObjectSize[VN_SIZE];
     75void Operator_New( CClass &classObj, const char *objectSizeStr, const char *parameter, const TYPEINFO &baseTypeInfo ){
     76    int typeSize = classObj.GetSize();
     77
     78    if(classObj.IsAbstract()){
     79        //抽象クラスだったとき
     80        SetError(125,classObj.name,cp);
     81    }
     82
     83    BOOL bSomeObjects=0;
     84    if(objectSizeStr[0]){
     85        bSomeObjects=1;
     86
     87        int reg=REG_RAX;
     88        int type = NumOpe(&reg,objectSizeStr,0,0,0);
     89        if(!IsWholeNumberType(type)) SetError(49,NULL,cp);
     90
     91        //※添え字上限値であることを考慮
     92        //add rax,1
     93        op_add_RV(REG_RAX,1);
     94
     95        //オブジェクトの個数をrbxに一時保持
     96        //※rbxは関数が呼ばれても不変
     97        //mov rbx,rax
     98        op_mov_RR(REG_RBX,REG_RAX);
     99
     100        //imul rax,size
     101        op_imul_RV(sizeof(_int64),REG_RAX,typeSize);
     102
     103        //add rax,PTR_SIZE*3
     104        op_add_RV(REG_RAX,PTR_SIZE*3);
     105
     106        //mov rcx,rax
     107        op_mov_RR(REG_RCX,REG_RAX);
     108    }
     109    else{
     110        //オブジェクトの個数をrbxに一時保持
     111        //※rbxは関数が呼ばれても不変
     112        //mov rbx,1
     113        op_mov_RV(sizeof(_int64),REG_RBX,1);
     114
     115        //mov rcx,typeSize+PTR_SIZE*3
     116        op_mov_RV(sizeof(_int64),REG_RCX,typeSize+PTR_SIZE*3);
     117    }
     118
     119    if( baseTypeInfo.type == DEF_OBJECT ){
     120        //DeleteはGCで処理
     121
     122        //call _System_GC_malloc_ForObject
     123        extern SUBINFO *pSub_System_GC_malloc_ForObject;
     124        op_call(pSub_System_GC_malloc_ForObject);
     125    }
     126    else{
     127        //明示的なDeleteが必要
     128
     129        //call _System_GC_malloc_ForObjectPtr
     130        extern SUBINFO *pSub_System_GC_malloc_ForObjectPtr;
     131        op_call(pSub_System_GC_malloc_ForObjectPtr);
     132    }
     133
     134
     135    /*
     136    確保されたヒープ領域のポインタ(callocの戻り値eax)をpPtrとすると、
     137    pPtr-=sizeof(DWORD)*3
     138    pPtr[0]=オブジェクトの個数
     139    pPtr[1]=オブジェクトのサイズ
     140    pPtr[2]=デストラクタの関数ポインタ
     141    */
     142
     143
     144    //mov qword ptr[rax],rbx(オブジェクトの個数)
     145    op_mov_MR(sizeof(_int64),REG_RBX,REG_RAX,0,MOD_BASE);
     146
     147    //add rax,PTR_SIZE
     148    op_add_RV(REG_RAX,PTR_SIZE);
     149
     150
     151    //mov qword ptr[rax],typeSize(オブジェクトのサイズ)
     152    op_mov_MV(sizeof(_int64),REG_RAX,0,NON_OFFSET,typeSize);
     153
     154    //add rax,PTR_SIZE
     155    op_add_RV(REG_RAX,PTR_SIZE);
     156
     157
     158    CMethod *method = classObj.GetDestructorMethod();
     159    if( method == NULL ) return;
     160
     161    //mov rcx,DestructorProcAddr
     162    op_mov_RV(sizeof(_int64),REG_RCX,0);
     163    obp-=sizeof(long);
     164    pobj_SubAddrSchedule->add(method->psi,0);
     165    method->psi->bUse=1;
     166    obp+=sizeof(long);
     167
     168    //mov qword ptr[rax],rcx
     169    op_mov_MR(sizeof(_int64),REG_RCX,REG_RAX,0,MOD_BASE);
     170
     171    //add rax,PTR_SIZE
     172    op_add_RV(REG_RAX,PTR_SIZE);
     173
     174
     175    // ※ここでプッシュされた値はNew演算子の戻り値となる
     176    //mov qword ptr[rsp+offset],rax     ※スタックフレームを利用
     177    pobj_sf->push(REG_RAX);
     178
     179
     180    /////////////////////////////////////////////////////////////////////
     181
     182    ////////////////////////////
     183    // コンストラクタの呼び出し
     184    ////////////////////////////
     185
     186    _call_constructor(&classObj,parameter,typeSize,bSomeObjects);
     187
     188
     189    //mov rax,qword ptr[rsp+offset]     ※スタックフレームを利用
     190    pobj_sf->pop(REG_RAX);
     191}
     192int Operator_New(const char *Parameter,LONG_PTR *plpIndex,const TYPEINFO &baseTypeInfo ){
     193    char TypeName[VN_SIZE],CreateParameter[VN_SIZE],objectSizeStr[VN_SIZE];
    77194    int i,i2;
    78     int reg;
    79195
    80196    i=0;
    81197
    82198    if(Parameter[0]=='['){
    83         i=GetStringInBracket(ObjectSize,Parameter);
    84 
    85         SlideString(ObjectSize+1,-1);
    86         ObjectSize[i-2]=0;
    87     }
    88     else ObjectSize[0]=0;
     199        i=GetStringInBracket(objectSizeStr,Parameter);
     200
     201        SlideString(objectSizeStr+1,-1);
     202        objectSizeStr[i-2]=0;
     203    }
     204    else objectSizeStr[0]=0;
    89205
    90206    for(i2=0;;i++,i2++){
     
    109225    }
    110226
    111     int type,TypeSize;
     227    int type;
    112228    type=GetTypeFixed(TypeName,plpIndex);
    113229    if(type==-1){
     
    115231        return 0;
    116232    }
    117     TypeSize=GetTypeSize(type,*plpIndex);
    118233
    119234    if(type!=DEF_OBJECT){
     
    129244    pobj_c=(CClass *)*plpIndex;
    130245
    131     if(pobj_c->IsAbstract()){
    132         //抽象クラスだったとき
    133         SetError(125,pobj_c->name,cp);
    134     }
    135 
    136     BOOL bSomeObjects=0;
    137     if(ObjectSize[0]){
    138         bSomeObjects=1;
    139 
    140         reg=REG_RAX;
    141         i2=NumOpe(&reg,ObjectSize,0,0,0);
    142         if(!IsWholeNumberType(i2)) SetError(49,NULL,cp);
    143 
    144         //※添え字上限値であることを考慮
    145         //add rax,1
    146         op_add64_value(REG_RAX,1);
    147 
    148         //オブジェクトの個数をrbxに一時保持
    149         //※rbxは関数が呼ばれても不変
    150         //mov rbx,rax
    151         op_mov64_ToReg_FromReg(REG_RBX,REG_RAX);
    152 
    153         //imul rax,size
    154         op_imul_value(sizeof(_int64),REG_RAX,TypeSize);
    155 
    156         //add rax,PTR_SIZE*3
    157         op_add64_value(REG_RAX,PTR_SIZE*3);
    158 
    159         //mov rcx,rax
    160         op_mov64_ToReg_FromReg(REG_RCX,REG_RAX);
    161     }
    162     else{
    163         //オブジェクトの個数をrbxに一時保持
    164         //※rbxは関数が呼ばれても不変
    165         //mov rbx,1
    166         op_mov_RV(sizeof(_int64),REG_RBX,1);
    167 
    168         //mov rcx,TypeSize+PTR_SIZE*3
    169         op_mov_RV(sizeof(_int64),REG_RCX,TypeSize+PTR_SIZE*3);
    170     }
    171 
    172     //call calloc
    173     extern SUBINFO *pSub_calloc;
    174     op_call(pSub_calloc);
    175 
    176 
    177     /*
    178     確保されたヒープ領域のポインタ(callocの戻り値eax)をpPtrとすると、
    179     pPtr-=sizeof(DWORD)*3
    180     pPtr[0]=オブジェクトの個数
    181     pPtr[1]=オブジェクトのサイズ
    182     pPtr[2]=デストラクタの関数ポインタ
    183     */
    184 
    185 
    186     //mov qword ptr[rax],rbx(オブジェクトの個数)
    187     op_mov_MR(sizeof(_int64),REG_RBX,REG_RAX,0,MOD_BASE);
    188 
    189     //add rax,PTR_SIZE
    190     op_add64_value(REG_RAX,PTR_SIZE);
    191 
    192 
    193     //mov qword ptr[rax],TypeSize(オブジェクトのサイズ)
    194     op_mov_MV(sizeof(_int64),REG_RAX,0,NON_OFFSET,TypeSize);
    195 
    196     //add rax,PTR_SIZE
    197     op_add64_value(REG_RAX,PTR_SIZE);
    198 
    199 
    200     CMethod *method = pobj_c->GetDestructorMethod();
    201     if( method == NULL ) return 0;
    202 
    203     //mov rcx,DestructorProcAddr
    204     op_mov_RV(sizeof(_int64),REG_RCX,0);
    205     obp-=sizeof(long);
    206     pobj_SubAddrSchedule->add(method->psi,0);
    207     method->psi->bUse=1;
    208     obp+=sizeof(long);
    209 
    210     //mov qword ptr[rax],rcx
    211     op_mov_MR(sizeof(_int64),REG_RCX,REG_RAX,0,MOD_BASE);
    212 
    213     //add rax,PTR_SIZE
    214     op_add64_value(REG_RAX,PTR_SIZE);
    215 
    216 
    217     // ※ここでプッシュされた値はNew演算子の戻り値となる
    218     //mov qword ptr[rsp+offset],rax     ※スタックフレームを利用
    219     pobj_sf->push(REG_RAX);
    220 
    221 
    222     /////////////////////////////////////////////////////////////////////
    223 
    224     ////////////////////////////
    225     // コンストラクタの呼び出し
    226     ////////////////////////////
    227 
    228     _call_constructor(pobj_c,CreateParameter,TypeSize,bSomeObjects);
    229 
    230 
    231     //mov rax,qword ptr[rsp+offset]     ※スタックフレームを利用
    232     pobj_sf->pop(REG_RAX);
    233 
     246    Operator_New( *pobj_c, objectSizeStr, CreateParameter, baseTypeInfo );
     247
     248    if( baseTypeInfo.type == DEF_OBJECT ){
     249        return DEF_OBJECT;
     250    }
    234251    return DEF_PTR_OBJECT;
    235252}
    236253
    237 void OpcodeDelete(const char *Parameter){
     254void OpcodeDelete(const char *Parameter, bool isSweeping){
    238255    int type;
    239256
     
    254271
    255272    //add rax,PTR_SIZE
    256     op_add64_value(REG_RAX,PTR_SIZE);
     273    op_add_RV(REG_RAX,PTR_SIZE);
    257274
    258275
     
    261278
    262279    //add rax,PTR_SIZE
    263     op_add64_value(REG_RAX,PTR_SIZE);
     280    op_add_RV(REG_RAX,PTR_SIZE);
    264281
    265282
     
    268285
    269286    //add rax,PTR_SIZE
    270     op_add64_value(REG_RAX,PTR_SIZE);
     287    op_add_RV(REG_RAX,PTR_SIZE);
    271288
    272289
    273290    //mov rcx,rax
    274     op_mov64_ToReg_FromReg(REG_RCX,REG_RAX);
     291    op_mov_RR(REG_RCX,REG_RAX);
    275292
    276293
     
    279296    jnz_back=obp;
    280297
    281     //mov qword ptr[rsp+offset],rax     ※スタックフレームを利用
    282     pobj_sf->push(REG_RAX);
     298    //mov qword ptr[rsp+offset],rcx     ※スタックフレームを利用
     299    pobj_sf->push(REG_RCX);
    283300
    284301    //call rdi
     
    309326    pobj_sf->pop(REG_RCX);
    310327
    311     //call free
    312     extern SUBINFO *pSub_free;
    313     op_call(pSub_free);
     328    if( isSweeping ){
     329        //call _System_GC_free_for_SweepingDelete
     330        extern SUBINFO *pSub_System_GC_free_for_SweepingDelete;
     331        op_call(pSub_System_GC_free_for_SweepingDelete);
     332    }
     333    else{
     334        //call free
     335        extern SUBINFO *pSub_free;
     336        op_call(pSub_free);
     337    }
    314338}
  • BasicCompiler64/Compile_ProcOp.cpp

    r63 r64  
    5151
    5252        //add rsp,スタックフレームサイズ
    53         op_add64_value(REG_RSP,pobj_sf->GetFrameSize());
     53        op_add_RV(REG_RSP,pobj_sf->GetFrameSize());
    5454
    5555        //スタックフレームスケジュール(subコマンドに渡す値)
     
    9494
    9595        //add rsp,スタックフレームサイズ
    96         op_add64_value(REG_RSP,pobj_sf->GetFrameSize());
     96        op_add_RV(REG_RSP,pobj_sf->GetFrameSize());
    9797
    9898        //スタックフレームスケジュール(subコマンドに渡す値)
     
    118118
    119119        //add rsp,8
    120         op_add64_value(REG_RSP,0x8);
     120        op_add_RV(REG_RSP,0x8);
    121121
    122122        //ret
     
    128128
    129129        //add rax,PTR_SIZE
    130         op_add64_value(REG_RAX,PTR_SIZE);
     130        op_add_RV(REG_RAX,PTR_SIZE);
    131131
    132132        //ret
     
    337337
    338338        LocalVar[MaxLocalVarNum].type=psi->pRealParmInfo[i3].type;
    339         if(LocalVar[MaxLocalVarNum].type==DEF_OBJECT){
    340             if(psi->bExport)
    341                 SetError(24,NULL,cp);
     339        if(LocalVar[MaxLocalVarNum].type==DEF_OBJECT
     340            ||LocalVar[MaxLocalVarNum].type==DEF_STRUCT){
     341                if(psi->bExport)
     342                    SetError(24,NULL,cp);
    342343        }
    343344
    344345        LocalVar[MaxLocalVarNum].u.index=psi->pRealParmInfo[i3].u.index;
    345346
    346         if(psi->pRealParmInfo[i3].bByVal&&psi->pRealParmInfo[i3].type==DEF_OBJECT){
    347             //実態オブジェクトのByValパラメータ
     347        if(psi->pRealParmInfo[i3].bByVal&&psi->pRealParmInfo[i3].type==DEF_STRUCT){
     348            //構造体のByValパラメータ
    348349            LocalVar[MaxLocalVarNum].fRef=REF_PARAMETER | OBJECT_PARAMETER;
    349350            VarSize=PTR_SIZE;
     
    457458    BaseLocalVar=AllLocalVarSize;
    458459
    459     if(psi->ReturnType!=-1){
     460    if(psi->ReturnType!=DEF_NON){
    460461        //戻り値が存在するとき
    461462
     
    464465        else temp=psi->name;
    465466
    466         if(psi->ReturnType==DEF_OBJECT && psi->isReturnRef == false){
    467             //戻り値用オブジェクトのコンストラクタを呼び出す
    468             if( psi->u.Return_pobj_c->GetConstructorMethod() ){
    469                 sprintf(temporary,"%s.%s()",temp,psi->u.Return_pobj_c->name);
    470                 OpcodeOthers(temporary);
    471             }
     467        if(psi->ReturnType==DEF_STRUCT && psi->isReturnRef == false){
     468            //戻り値用の構造体(値型)はパラメータで引き渡される
    472469        }
    473470        else{
     
    493490
    494491        //mov rcx,rsp
    495         op_mov64_ToReg_FromReg(REG_RCX,REG_RSP);
     492        op_mov_RR(REG_RCX,REG_RSP);
    496493
    497494        //add rcx,スタックフレームサイズ+sizeof(_int64) ※ret用のサイズを考慮
    498         op_add64_value(REG_RCX,0);
     495        op_add_RV(REG_RCX,0);
    499496        RspOffsetSchedule2=obp-sizeof(long);
    500497
     
    571568            for(i3=0;i3<pobj_CompilingClass->iMemberNum;i3++){
    572569                CMember *pMember = pobj_CompilingClass->ppobj_Member[i3];
    573                 int MemberTypeSize=
    574                     GetTypeSize(pMember->TypeInfo.type,
    575                         pMember->TypeInfo.u.lpIndex);
    576 
    577                 int MemberObjectNum=
    578                     JumpSubScripts(pMember->SubScripts);
    579 
    580                 int offset = pobj_CompilingClass->GetMemberOffset( pMember->name, NULL );
    581 
    582                 if(pMember->TypeInfo.type==DEF_OBJECT && pMember->IsRef() == false){
    583                     CMethod *method = pMember->TypeInfo.u.pobj_Class->GetConstructorMethod();
    584                     if( method ){
    585                         if( method->psi->RealParmNum == 1 ){    //Thisポインタを第一引数に持ち合わせるため、引数なしの場合はこの値が1になる
    586                             for(i4=0;i4<MemberObjectNum;i4++){
    587                                 //Thisポインタをrcxにコピー
    588                                 SetThisPtrToReg(REG_RCX);
    589 
    590                                 //add rcx,offset
    591                                 op_add64_value(REG_RCX,offset+i4*MemberTypeSize);
    592 
    593                                 //call constructor
    594                                 op_call( method->psi );
    595                             }
    596                         }
    597                     }
     570                if(pMember->TypeInfo.type==DEF_OBJECT){
     571                    // オブジェクトメンバを発見したとき
     572
     573                    sprintf(temporary, "This.%s=%c%c%s()",
     574                        pMember->name,
     575                        1, ESC_NEW,
     576                        pMember->TypeInfo.u.pobj_Class->name );
     577                    OpcodeCalc( temporary );
    598578                }
    599579            }
     
    665645            }
    666646
    667             //実体クラスを持つメンバのデストラクタを呼び出す
     647            //実体クラスを持つメンバのデストラクタ呼び出しはGCに任せる
     648            /*
    668649            //※コンストラクタと逆順序で呼び出す
    669650            for(i3=pobj_CompilingClass->iMemberNum-1;i3>=0;i3--){
     
    678659                int offset = pobj_CompilingClass->GetMemberOffset( pMember->name, NULL );
    679660
    680                 if(pMember->TypeInfo.type==DEF_OBJECT && pMember->IsRef() == false){
     661                if(pMember->TypeInfo.type==DEF_OBJECT){
    681662                    CMethod *method = pMember->TypeInfo.u.pobj_Class->GetDestructorMethod();
    682663                    if( method ){
     
    686667
    687668                            //add rcx,offset
    688                             op_add64_value(REG_RCX,offset+i4*MemberTypeSize);
     669                            op_add_RV(REG_RCX,offset+i4*MemberTypeSize);
    689670
    690671                            //call destructor
     
    693674                    }
    694675                }
    695             }
     676            }*/
    696677        }
    697678    }
     
    743724    }
    744725
    745     if(psi->ReturnType!=-1){
     726    if(psi->ReturnType!=DEF_NON){
    746727        //////////////////////////////////
    747728        // 戻り値をraxまたはxmm0に設定
     
    759740        i3=psi->ReturnType;
    760741
    761         if(i3==DEF_OBJECT){
     742        if(i3==DEF_OBJECT || i3==DEF_STRUCT){
    762743            SetVarPtrToReg(REG_RAX,&RelativeVar);
     744            if( i3==DEF_OBJECT ){
     745                //mov rax,qword ptr[rax]
     746                op_mov_RM( sizeof(_int64), REG_RAX, REG_RAX, 0, MOD_BASE );
     747            }
    763748        }
    764749        else if(i3==DEF_DOUBLE){
  • BasicCompiler64/Compile_Set_Var.cpp

    r63 r64  
    77}
    88
    9 void SetObjectVariableFromRax(LONG_PTR lpVarIndex,int CalcType,LONG_PTR lpCalcIndex,RELATIVE_VAR *pRelativeVar,BOOL bUseHeap){
     9void SetStructVariableFromRax(LONG_PTR lpVarIndex,int CalcType,LONG_PTR lpCalcIndex,RELATIVE_VAR *pRelativeVar,BOOL bUseHeap){
    1010    int RightTermReg;
    1111    pobj_reg=new CRegister(REG_RCX);
     
    3636    }
    3737
    38 
     38/*
     39    TODO: 消す
    3940    ///////////////////////////////////////////////////////////////////
    4041    // オペレータ '=' のオーバーロード関数を呼ぶ
     
    5960    int iRet;
    6061    iRet=CallOperatorProc(CALC_SUBSITUATION,NULL,type,index_stack,array_bUseHeap,sp);
    61 
     62*/
    6263    //右辺用レジスタを解除
    6364    if(IsRealNumberType(CalcType)) pobj_reg->UnlockXmmReg();
     
    7172    pobj_reg=0;
    7273
    73     if(iRet==-1||iRet==1){
    74         //成功したとき、またはエラーが発行されたとき
    75         return;
    76     }
    77 
    78 
    79     if( CalcType == DEF_OBJECT ){
     74
     75    if( CalcType == DEF_STRUCT ){
    8076        CClass *pVarClass = (CClass *)lpVarIndex;
    8177        CClass *pCalcClass = (CClass *)lpCalcIndex;
    8278
    83         if( pVarClass->IsEquals( pCalcClass )           //等しい
    84             || pVarClass->IsSubClass( pCalcClass ) ){   //派生・継承関係
     79        if( pVarClass->IsEquals( pCalcClass ) ){            //等しい
    8580
    8681                //双方のオブジェクト型が一致、または派生・継承関係にあるとき
     
    122117    SetError(1,NULL,cp);
    123118}
     119
    124120
    125121void SetDoubleVariable(int type,RELATIVE_VAR *pRelative){
     
    305301    }
    306302}
     303void SetRealVariable(int VarType, int CalcType, RELATIVE_VAR *pRelativeVar){
     304    if(VarType==DEF_DOUBLE){
     305        //Double型変数へスタックの内容を格納する
     306        SetDoubleVariable(CalcType,pRelativeVar);
     307    }
     308    else if(VarType==DEF_SINGLE){
     309        //Single型変数へスタックの内容を格納する
     310        SetSingleVariable(CalcType,pRelativeVar);
     311    }
     312}
    307313void SetBooleanVariable(int type,RELATIVE_VAR *pRelative){
    308314    if(type==DEF_DOUBLE){
  • BasicCompiler64/Compile_Statement.cpp

    r56 r64  
    9999        /////////////////////
    100100
    101         if(i2==DEF_OBJECT){
     101        if(i2==DEF_STRUCT){
    102102            //mov r14,rax
    103103            op_mov_RR(REG_R14,REG_RAX);
     
    888888    //add rax,offset(Gosubステートメントの最終ポイント)
    889889    int schedule=obp,schedule2;
    890     op_add64_value(REG_RAX,0);
     890    op_add_RV(REG_RAX,0);
    891891    schedule2=obp-sizeof(long);
    892892
     
    951951            else temp=pCompilingSubInfo->name;
    952952
     953            /*
     954            TODO: 消す
    953955            if( pCompilingSubInfo->isReturnRef ){
    954956                //参照型
     
    956958            }
    957959            else{
    958                 //値型
     960                //値型*/
    959961                char temporary[VN_SIZE];
    960962                sprintf(temporary,"%s=%s",temp,Parameter);
    961963                OpcodeCalc(temporary);
    962             }
     964            //}
    963965        }
    964966
     
    968970}
    969971
    970 void Opcode_Input(char *Parameter){
     972void Opcode_Input(const char *Parameter){
    971973    extern int cp;
    972974    int i2,i3,i4,i5,type;
    973975    BOOL bFile;
    974976    char temporary[VN_SIZE],temp2[VN_SIZE],buffer[VN_SIZE];
    975 
    976     KillStringSpaces(Parameter);
    977977
    978978    if(Parameter[0]=='#'){
     
    10841084    Opcode_CallProc(buffer,psi,0,"",0);
    10851085}
    1086 void Opcode_PrintUsing(char *Parameter,char *buffer,BOOL bFile){
     1086void Opcode_PrintUsing(const char *Parameter,char *buffer,BOOL bFile){
    10871087    extern int cp;
    10881088    int i2,i3,i4,i5;
     
    10901090    BOOL bReturnLine;
    10911091
    1092     i2=lstrlen(Parameter);
    1093     if(Parameter[i2-1]==';'){
     1092    char parms[8192];
     1093    lstrcpy( parms, Parameter );
     1094
     1095    i2=lstrlen(parms);
     1096    if(parms[i2-1]==';'){
    10941097        bReturnLine=0;
    1095         Parameter[i2-1]=0;
     1098        parms[i2-1]=0;
    10961099    }
    10971100    else bReturnLine=1;
     
    10991102    i3=lstrlen(buffer);
    11001103    for(i2=0;;i2++,i3++){
    1101         if(Parameter[i2]==';'){
     1104        if(parms[i2]==';'){
    11021105            buffer[i3]=0;
    11031106            break;
    11041107        }
    1105         buffer[i3]=Parameter[i2];
    1106         if(Parameter[i2]=='\0') break;
    1107     }
    1108     if(Parameter[i2]==';') i2++;
     1108        buffer[i3]=parms[i2];
     1109        if(parms[i2]=='\0') break;
     1110    }
     1111    if(parms[i2]==';') i2++;
    11091112
    11101113    if(bReturnLine) lstrcat(buffer,"+Ex\"\\r\\n\"");
     
    11141117    while(1){
    11151118        for(i3=0;;i2++,i3++){
    1116             if(Parameter[i2]=='\"'){
    1117                 temporary[i3]=Parameter[i2];
     1119            if(parms[i2]=='\"'){
     1120                temporary[i3]=parms[i2];
    11181121                for(i2++,i3++;;i2++,i3++){
    1119                     temporary[i3]=Parameter[i2];
    1120                     if(Parameter[i2]=='\"') break;
     1122                    temporary[i3]=parms[i2];
     1123                    if(parms[i2]=='\"') break;
    11211124                }
    11221125                continue;
    11231126            }
    1124             if(Parameter[i2]=='('){
    1125                 i5=GetStringInPare(temporary+i3,Parameter+i2);
     1127            if(parms[i2]=='('){
     1128                i5=GetStringInPare(temporary+i3,parms+i2);
    11261129                i2+=i5-1;
    11271130                i3+=i5-1;
    11281131                continue;
    11291132            }
    1130             if(Parameter[i2]=='['){
    1131                 i5=GetStringInBracket(temporary+i3,Parameter+i2);
     1133            if(parms[i2]=='['){
     1134                i5=GetStringInBracket(temporary+i3,parms+i2);
    11321135                i2+=i5-1;
    11331136                i3+=i5-1;
    11341137                continue;
    11351138            }
    1136             if(Parameter[i2]==','){
     1139            if(parms[i2]==','){
    11371140                temporary[i3]=0;
    11381141                i2++;
    11391142                break;
    11401143            }
    1141             temporary[i3]=Parameter[i2];
    1142             if(Parameter[i2]=='\0') break;
     1144            temporary[i3]=parms[i2];
     1145            if(parms[i2]=='\0') break;
    11431146        }
    11441147        if(temporary[0]=='\0'){
     
    11691172
    11701173        i4++;
    1171         if(Parameter[i2]=='\0') break;
     1174        if(parms[i2]=='\0') break;
    11721175    }
    11731176    sprintf(temp2,"_System_UsingDataType[%d]=-1",i4);
     
    11831186    Opcode_CallProc(buffer,psi,0,"",0);
    11841187}
    1185 void Opcode_Print(char *Parameter,BOOL bWrite){
     1188void Opcode_Print(const char *Parameter,BOOL bWrite){
    11861189    int i2,i3,i4,sw;
    11871190    char temporary[VN_SIZE],buffer[VN_SIZE];
    11881191    BOOL bFile;
    1189 
    1190     KillStringSpaces(Parameter);
    11911192
    11921193    if(Parameter[0]=='#'){
  • BasicCompiler64/Compile_Var.cpp

    r63 r64  
    4141
    4242    if(PTR_LEVEL(*pType)){
    43         *pType=MAKE_PTR_TYPE(NATURAL_TYPE(*pType),PTR_LEVEL(*pType)-1);
    44         if((*pType)==DEF_OBJECT){
    45             CClass *pClass = (CClass *)lpIndex;
    46             //imul reg,objsize
    47             op_imul_value( sizeof(_int64), reg, pClass->GetSize() );
    48         }
    49         else{
    50             i2=GetTypeSize(*pType,-1);
    51             if(i2>=2){
    52                 //imul reg,i2
    53                 op_imul_value(sizeof(_int64),reg,i2);
    54             }
     43        *pType = PTR_LEVEL_DOWN( *pType );
     44
     45        i2=GetTypeSize(*pType,-1);
     46        if(i2>=2){
     47            //imul reg,i2
     48            op_imul_RV(sizeof(_int64),reg,i2);
    5549        }
    5650    }
     
    7165    //add r11,reg
    7266    op_add64_reg(REG_R11,reg);
     67}
     68void SetRelativeOffset( RELATIVE_VAR &relativeVar ){
     69    if(relativeVar.dwKind==VAR_DIRECTMEM){
     70        //mov r11,qword ptr[r11]
     71        op_mov_RM(sizeof(_int64),REG_R11,REG_R11,0,MOD_BASE);
     72    }
     73    else{
     74        //直接参照に切り替え
     75        SetVarPtrToReg(REG_R12,&relativeVar);
     76        relativeVar.dwKind=VAR_DIRECTMEM;
     77
     78        //mov r11,qword ptr[r12]
     79        op_mov_RM(sizeof(_int64),REG_R11,REG_R12,0,MOD_BASE);
     80    }
    7381}
    7482BOOL GetArrayOffset(int *SubScripts,char *array,int type,LONG_PTR lpIndex){
     
    153161
    154162        //imul reg,i4
    155         op_imul_value(sizeof(_int64),reg,i4);
     163        op_imul_RV(sizeof(_int64),reg,i4);
    156164
    157165        //add r12,reg
     
    192200    char lpPtrOffset[VN_SIZE];  //第2次配列
    193201    char NestMember[VN_SIZE];   //入れ子メンバ
    194     int RefType;                //"."参照のときは0、"->"参照のときは1
     202    CClass::RefType refType;
    195203    lstrcpy(VarName,member);
    196     if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember,&RefType)) return 0;
     204    if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember,refType)) return 0;
    197205
    198206
     
    279287        //入れ子構造の場合
    280288
    281         if(*pType==DEF_OBJECT && pMember->IsRef() == false){
    282             if(RefType!=DEF_OBJECT){
     289        if(*pType==DEF_OBJECT || *pType==DEF_STRUCT){
     290            if( refType != CClass::Dot ){
    283291                if(isErrorEnabled) SetError(104,member,cp);
    284292                return 0;
    285293            }
    286         }
    287         else if(*pType==DEF_PTR_OBJECT || ( *pType==DEF_OBJECT && pMember->IsRef() )){
     294
     295            if( *pType==DEF_OBJECT ){
     296                // 参照内容へのポインタを抽出
     297                SetRelativeOffset( *pRelativeVar );
     298            }
     299        }
     300        else if(*pType==DEF_PTR_OBJECT||*pType==DEF_PTR_STRUCT){
    288301            //構造体ポインタ型メンバ変数
    289302
    290303            if(lpPtrOffset[0]){
    291304                //pObj[n].member
    292                 if(*pType==DEF_PTR_OBJECT&&RefType!=DEF_OBJECT){
     305                if( ( *pType==DEF_PTR_OBJECT||*pType==DEF_PTR_STRUCT )&& refType != CClass::Dot ){
    293306                    if(isErrorEnabled) SetError(104,member,cp);
    294307                    return 0;
     
    303316            else{
    304317                //pObj->member
    305                 if(*pType==DEF_PTR_OBJECT&&RefType!=DEF_PTR_OBJECT){
     318                if( ( *pType==DEF_PTR_OBJECT||*pType==DEF_PTR_STRUCT )&& refType != CClass::Pointer ){
    306319                    if(isErrorEnabled) SetError(104,member,cp);
    307320                    return 0;
    308321                }
    309322
    310                 if(pRelativeVar->dwKind==VAR_DIRECTMEM){
    311                     //mov r11,qword ptr[r11]
    312                     op_mov_RM(sizeof(_int64),REG_R11,REG_R11,0,MOD_BASE);
    313                 }
    314                 else{
    315                     //直接参照に切り替え
    316                     SetVarPtrToReg(REG_R12,pRelativeVar);
    317                     pRelativeVar->dwKind=VAR_DIRECTMEM;
    318 
    319                     //mov r11,qword ptr[r12]
    320                     op_mov_RM(sizeof(_int64),REG_R11,REG_R12,0,MOD_BASE);
    321                 }
    322             }
    323         }
    324         else if(*pType==MAKE_PTR_TYPE(DEF_OBJECT,2)){
     323                SetRelativeOffset( *pRelativeVar );
     324            }
     325        }
     326        else if(*pType==MAKE_PTR_TYPE(DEF_OBJECT,2) || *pType==MAKE_PTR_TYPE(DEF_STRUCT,2)){
    325327            //構造体ポインタのポインタ型メンバ変数
    326328
    327329            if(lpPtrOffset[0]){
    328330                //ppObj[n]->member
    329                 if(RefType!=DEF_PTR_OBJECT){
     331                if( refType != CClass::Pointer ){
    330332                    if(isErrorEnabled) SetError(104,member,cp);
    331333                    return 0;
     
    388390BOOL GetVarOffset(bool isErrorEnabled,bool isWriteAccess,const char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss){
    389391    extern BOOL bCompilingGlobal;
    390     int i,RefType;
     392    int i;
    391393    LONG_PTR lpIndex;
    392394    char variable[VN_SIZE],member[VN_SIZE],VarName[VN_SIZE],array[VN_SIZE],lpPtrOffset[VN_SIZE];
     
    398400    else lstrcpy(variable,NameBuffer);
    399401
    400     if( FormatUseProcReturnObject( variable, VarName, array, RefType, member ) ){
     402    CClass::RefType refType;
     403    if( FormatUseProcReturnObject( variable, VarName, array, refType, member ) ){
    401404        // 戻り値オブジェクトのメンバを直接参照しているとき
    402405        //例: func().member
     
    442445
    443446    lstrcpy(VarName,variable);
    444     GetVarFormatString(VarName,array,lpPtrOffset,member,&RefType);
     447    GetVarFormatString(VarName,array,lpPtrOffset,member,refType);
    445448
    446449    int *pSubScripts;
     
    581584        char tempMember[VN_SIZE];
    582585        char tempArray[VN_SIZE];
    583         GetVarFormatString(temporary,tempArray,lpPtrOffset,tempMember,&i);
     586        {
     587            CClass::RefType refType;
     588            GetVarFormatString(temporary,tempArray,lpPtrOffset,tempMember, refType );
     589        }
    584590
    585591        char temp2[VN_SIZE];
     
    697703    }
    698704    if(member[0]){
    699         if(*pType==DEF_OBJECT){
     705        if(*pType==DEF_OBJECT || *pType==DEF_STRUCT){
    700706            //実態オブジェクトのメンバを参照(obj.member)
    701             if(RefType!=DEF_OBJECT){
     707            if( refType != CClass::Dot ){
    702708                SetError(104,VarName,cp);
    703709                pRelativeVar->dwKind=NON_VAR;
    704710                return 0;
    705711            }
    706         }
    707         else if(*pType==DEF_PTR_OBJECT){
     712
     713            if( *pType==DEF_OBJECT ){
     714                // 参照内容へのポインタを抽出
     715                SetRelativeOffset( *pRelativeVar );
     716            }
     717        }
     718        else if(*pType==DEF_PTR_OBJECT || *pType==DEF_PTR_STRUCT){
    708719            //ポインタオブジェクトが示すメンバを参照
    709720            if(lpPtrOffset[0]){
    710721                //pObj[n].member
    711                 if(RefType!=DEF_OBJECT){
     722                if( refType != CClass::Dot ){
    712723                    SetError(104,VarName,cp);
    713724                    pRelativeVar->dwKind=NON_VAR;
     
    719730            else{
    720731                //pObj->member
    721                 if(RefType!=DEF_PTR_OBJECT){
     732                if( refType != CClass::Pointer ){
    722733                    SetError(104,VarName,cp);
    723734                    pRelativeVar->dwKind=NON_VAR;
     
    732743            }
    733744        }
    734         else if(*pType==MAKE_PTR_TYPE(DEF_OBJECT,2)){
     745        else if(*pType==MAKE_PTR_TYPE(DEF_OBJECT,2) || *pType==MAKE_PTR_TYPE(DEF_STRUCT,2)){
    735746            //ポインタオブジェクトが示すメンバを参照
    736747            if(lpPtrOffset[0]){
    737748                //ppObj[n]->member
    738                 if(RefType!=DEF_PTR_OBJECT){
     749                if( refType != CClass::Pointer ){
    739750                    SetError(104,VarName,cp);
    740751                    pRelativeVar->dwKind=NON_VAR;
     
    815826        }
    816827
    817         if(type==DEF_OBJECT){
     828        if(type==DEF_STRUCT){
    818829            CClass *pobj_c;
    819830            pobj_c=(CClass *)lpIndex;
     
    848859    ///////////////////////////////////////
    849860
    850     if( type == DEF_OBJECT){
    851         //オブジェクトの場合はありえない
     861    if( type == DEF_OBJECT || type == DEF_STRUCT ){
     862        //オブジェクトまたは構造体の場合はありえない
    852863        SetError(300,NULL,cp);
    853864        return 0;
     
    888899            *(float *)(initGlobalBuf+offset)=(float)dbl;
    889900    else if(type==DEF_INT64||type==DEF_QWORD||IsPtrType(type)){
    890         if(type==DEF_PTR_BYTE&&lpCalcIndex==LITERAL_STRING){
     901        if(type==DEF_PTR_CHAR&&lpCalcIndex==LITERAL_STRING){
    891902            //文字列定数のとき
    892903
     
    953964        }
    954965
    955         if(type==DEF_OBJECT){
     966        if(type==DEF_STRUCT){
    956967            CClass *pobj_c;
    957968            pobj_c=(CClass *)lpIndex;
     
    10371048    }
    10381049    else if(type==DEF_INT64||type==DEF_QWORD||IsPtrType(type)){
    1039         if(type==DEF_PTR_BYTE&&lpCalcIndex==LITERAL_STRING){
     1050        if(type==DEF_PTR_CHAR&&lpCalcIndex==LITERAL_STRING){
    10401051            //文字列定数のとき
    10411052
     
    11011112}
    11021113
    1103 
     1114void dim(bool isRef, char *VarName,int *SubScripts,TYPEINFO &TypeInfo,int TypeSize,char *InitBuf,char *ConstractParameter,DWORD dwFlags){
     1115    extern BOOL bCompilingGlobal;
     1116    if(bCompilingGlobal){
     1117        /////////////////////////
     1118        // グローバル変数
     1119        /////////////////////////
     1120
     1121        AddGlobalVariable(isRef,VarName,SubScripts,&TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlags);
     1122    }
     1123    else{
     1124        /////////////////
     1125        // ローカル変数
     1126        /////////////////
     1127
     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;
     1169
     1170        //アラインメントを考慮
     1171        if( pVar->type==DEF_STRUCT ){
     1172            int alignment = pVar->u.pobj_c->iAlign;
     1173            if( alignment ){
     1174                if( AllLocalVarSize % alignment ){
     1175                    AllLocalVarSize += alignment - (AllLocalVarSize % alignment);
     1176                }
     1177            }
     1178        }
     1179
     1180        AllLocalVarSize+=VarSize;
     1181        pVar->offset=AllLocalVarSize;
     1182
     1183        //レキシカルスコープ
     1184        pVar->ScopeLevel=obj_LexScopes.GetNowLevel();
     1185        pVar->ScopeStartAddress=obj_LexScopes.GetStartAddress();
     1186        pVar->bLiving=TRUE;
     1187
     1188        if(InitBuf[0]){
     1189            //初期代入時のみ、書き込みアクセスを許可する
     1190            bool bConstBack = pVar->bConst;
     1191            pVar->bConst = false;
     1192
     1193            int result = 0;
     1194            if( pVar->type != DEF_OBJECT ){
     1195                result = InitLocalVar(-pVar->offset,
     1196                    pVar->type,
     1197                    pVar->u.index,
     1198                    pVar->SubScripts,
     1199                    InitBuf);
     1200            }
     1201
     1202            if(!result){
     1203                //動的な式だった場合は代入演算を行う
     1204                char temporary[8192];
     1205                sprintf(temporary,"%s=%s",VarName,InitBuf);
     1206                OpcodeCalc(temporary);
     1207            }
     1208
     1209            pVar->bConst = bConstBack;
     1210        }
     1211        else{
     1212            //0初期化
     1213
     1214            //mov r8, 0
     1215            op_zero_reg( REG_R8 );
     1216
     1217            //mov rdx, VarSize
     1218            op_mov_RV( sizeof(_int64), REG_RDX, VarSize );
     1219
     1220            //mov rcx, rsp
     1221            op_mov_RR( REG_RCX, REG_RSP );
     1222
     1223            //add rcx, offset
     1224            op_add_RV( REG_RCX, -pVar->offset );
     1225            obp-=sizeof(long);
     1226            AddLocalVarAddrSchedule();
     1227            obp+=sizeof(long);
     1228
     1229            //call FillMemory
     1230            DECLAREINFO *pdi;
     1231            pdi=GetDeclareHash("FillMemory");
     1232            op_call( pdi );
     1233        }
     1234    }
     1235
     1236    //コンストラクタ呼び出し
     1237    if(TypeInfo.type==DEF_OBJECT&&(dwFlags&DIMFLAG_NONCALL_CONSTRACTOR)==0&&InitBuf[0]=='\0'){
     1238        char objectSize[255];
     1239        if( SubScripts[0] == -1 ){
     1240            objectSize[0] = 0;
     1241        }
     1242        else{
     1243            if( SubScripts[1] != -1 ){
     1244                SetError(300,NULL,cp);
     1245            }
     1246            sprintf( objectSize, "%d", SubScripts[0] );
     1247        }
     1248        Operator_New( *TypeInfo.u.pobj_Class, objectSize, ConstractParameter, TypeInfo );
     1249
     1250        int type;
     1251        LONG_PTR lpIndex;
     1252        RELATIVE_VAR RelativeVar;
     1253        GetVarOffset( true, false, VarName, &type, &RelativeVar, &lpIndex );
     1254        if( RelativeVar.dwKind == VAR_DIRECTMEM ){
     1255            SetError();
     1256        }
     1257        SetVariableFromRax( DEF_OBJECT, DEF_OBJECT, &RelativeVar );
     1258    }
     1259
     1260    if(TypeInfo.type==DEF_OBJECT){
     1261        if(TypeInfo.u.pobj_Class->IsAbstract()){
     1262            //抽象クラスだったとき
     1263            SetError(125,TypeInfo.u.pobj_Class->name,cp);
     1264        }
     1265    }
     1266}
    11041267void dim(char *Parameter,DWORD dwFlags){
    11051268    extern BOOL bCompilingGlobal;
    11061269    extern HANDLE hHeap;
    1107     int i2,i3,VarSize;
     1270    int i2;
    11081271    char VarName[VN_SIZE];
    11091272
     
    11721335    TypeSize=GetTypeSize(TypeInfo.type,TypeInfo.u.lpIndex);
    11731336
     1337    extern BOOL bCompilingGlobal;
    11741338    if(dwFlags&DIMFLAG_STATIC){
    11751339        if(bCompilingGlobal){
     
    11861350        GetNowStaticVarFullName(VarName,temporary);
    11871351
    1188         AddGlobalVariable(isRef,temporary,SubScripts,&TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlags);
     1352        dim( isRef,temporary,SubScripts,TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlags );
    11891353
    11901354        /*
     
    11941358    }
    11951359    else{
    1196         if(bCompilingGlobal){
    1197             /////////////////////////
    1198             // グローバル変数
    1199             /////////////////////////
    1200 
    1201             AddGlobalVariable(isRef,VarName,SubScripts,&TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlags);
    1202         }
    1203         else{
    1204             /////////////////
    1205             // ローカル変数
    1206             /////////////////
    1207 
    1208             for(i2=0;i2<MaxLocalVarNum;i2++){
    1209                 if(LocalVar[i2].bLiving&&obj_LexScopes.GetNowLevel()==LocalVar[i2].ScopeLevel){
    1210                     if(lstrcmp(LocalVar[i2].name,VarName)==0){
    1211                         //2重定義のエラー
    1212                         SetError(15,VarName,cp);
    1213                         return;
    1214                     }
    1215                 }
    1216             }
    1217 
    1218             LocalVar=(VARIABLE *)HeapReAlloc(hHeap,0,LocalVar,(MaxLocalVarNum+1)*sizeof(VARIABLE));
    1219             VARIABLE *pVar = &LocalVar[MaxLocalVarNum];
    1220             MaxLocalVarNum++;
    1221 
    1222             if( isRef ){
    1223                 //参照型
    1224                 pVar->fRef = REF_VARIABLE;
    1225                 TypeSize = PTR_SIZE;
    1226             }
    1227             else pVar->fRef=0;
    1228 
    1229             for(i2=1,i3=0;i3<255;i3++){
    1230                 //配列要素数
    1231                 pVar->SubScripts[i3]=SubScripts[i3];
    1232 
    1233                 if(SubScripts[i3]==-1) break;
    1234                 i2*=SubScripts[i3]+1;
    1235             }
    1236             VarSize=TypeSize*i2;
    1237             if(VarSize%8) VarSize+=8-(VarSize%8);
    1238 
    1239             //変数データを追加
    1240             lstrcpy(pVar->name,VarName);
    1241             if(dwFlags & DIMFLAG_CONST) pVar->bConst = true;
    1242             else pVar->bConst = false;
    1243             if(SubScripts[0]==-1) pVar->bArray=0;
    1244             else pVar->bArray=1;
    1245             pVar->type=TypeInfo.type;
    1246             pVar->u.index=TypeInfo.u.lpIndex;
    1247             AllLocalVarSize+=VarSize;
    1248             pVar->offset=AllLocalVarSize;
    1249 
    1250             //レキシカルスコープ
    1251             pVar->ScopeLevel=obj_LexScopes.GetNowLevel();
    1252             pVar->ScopeStartAddress=obj_LexScopes.GetStartAddress();
    1253             pVar->bLiving=TRUE;
    1254 
    1255             if(InitBuf[0]){
    1256                 //初期代入時のみ、書き込みアクセスを許可する
    1257                 bool bConstBack = pVar->bConst;
    1258                 pVar->bConst = false;
    1259 
    1260                 int result = InitLocalVar(-pVar->offset,
    1261                     pVar->type,
    1262                     pVar->u.index,
    1263                     pVar->SubScripts,
    1264                     InitBuf);
    1265 
    1266                 if(!result){
    1267                     //動的な式だった場合は代入演算を行う
    1268                     if( isRef ){
    1269                         SetRefVariable( VarName, InitBuf );
    1270                     }
    1271                     else{
    1272                         char temporary[8192];
    1273                         sprintf(temporary,"%s=%s",VarName,InitBuf);
    1274                         OpcodeCalc(temporary);
    1275                     }
    1276                 }
    1277 
    1278                 pVar->bConst = bConstBack;
    1279             }
    1280             else{
    1281                 //0初期化
    1282 
    1283                 //mov r8, 0
    1284                 op_zero_reg( REG_R8 );
    1285 
    1286                 //mov rdx, VarSize
    1287                 op_mov_RV( sizeof(_int64), REG_RDX, VarSize );
    1288 
    1289                 //mov rcx, rsp
    1290                 op_mov_RR( REG_RCX, REG_RSP );
    1291 
    1292                 //add rcx, offset
    1293                 op_add64_value( REG_RCX, -pVar->offset );
    1294                 obp-=sizeof(long);
    1295                 AddLocalVarAddrSchedule();
    1296                 obp+=sizeof(long);
    1297 
    1298                 //call FillMemory
    1299                 DECLAREINFO *pdi;
    1300                 pdi=GetDeclareHash("FillMemory");
    1301                 op_call( pdi );
    1302             }
    1303         }
    1304 
    1305         //コンストラクタ呼び出し
    1306         if(TypeInfo.type==DEF_OBJECT&&(dwFlags&DIMFLAG_NONCALL_CONSTRACTOR)==0&& isRef == false ){
    1307             CallConstructor(VarName,SubScripts,TypeInfo,ConstractParameter);
    1308         }
    1309     }
    1310 
    1311     if(TypeInfo.type==DEF_OBJECT){
    1312         if(TypeInfo.u.pobj_Class->IsAbstract()){
    1313             //抽象クラスだったとき
    1314             SetError(125,TypeInfo.u.pobj_Class->name,cp);
    1315         }
     1360        dim( isRef,VarName,SubScripts,TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlags );
    13161361    }
    13171362}
     
    13621407
    13631408            //mov reg,r11
    1364             op_mov64_ToReg_FromReg(reg,REG_R11);
     1409            op_mov_RR(reg,REG_R11);
    13651410        }
    13661411        else{
     
    14041449
    14051450            //mov reg,r11
    1406             op_mov64_ToReg_FromReg(reg,REG_R11);
     1451            op_mov_RR(reg,REG_R11);
    14071452        }
    14081453        else{
    14091454            //mov reg,rsp
    1410             op_mov64_ToReg_FromReg(reg,REG_RSP);
     1455            op_mov_RR(reg,REG_RSP);
    14111456
    14121457            //add reg,offset
    1413             op_add64_value(reg,(int)pRelativeVar->offset);
     1458            op_add_RV(reg,(int)pRelativeVar->offset);
    14141459            obp-=sizeof(long);
    14151460            AddLocalVarAddrSchedule();
     
    14411486directmem:
    14421487        //mov reg,r11
    1443         op_mov64_ToReg_FromReg(reg,REG_R11);
     1488        op_mov_RR(reg,REG_R11);
    14441489    }
    14451490}
  • BasicCompiler64/MakePeHdr.cpp

    r56 r64  
    1919    *pSub_calloc,
    2020    *pSub_realloc,
    21     *pSub_free;
     21    *pSub_free,
     22    *pSub_System_GC_malloc_ForObject,
     23    *pSub_System_GC_malloc_ForObjectPtr,
     24    *pSub_System_GC_free_for_SweepingDelete;
    2225
    2326
     
    215218        pSub_free->bUse=1;
    216219
     220    if( pSub_System_GC_malloc_ForObject = GetSubHash( "_System_GC_malloc_ForObject",1 ) )
     221        pSub_System_GC_malloc_ForObject->bUse = 1;
     222
     223    if( pSub_System_GC_malloc_ForObjectPtr = GetSubHash( "_System_GC_malloc_ForObjectPtr",1 ) )
     224        pSub_System_GC_malloc_ForObjectPtr->bUse = 1;
     225
     226    if( pSub_System_GC_free_for_SweepingDelete = GetSubHash( "_System_GC_free_for_SweepingDelete",1 ) )
     227        pSub_System_GC_free_for_SweepingDelete->bUse = 1;
     228
    217229
    218230
     
    345357
    346358        //add rsp,スタックフレームサイズ
    347         op_add64_value(REG_RSP,pobj_sf->GetFrameSize());
     359        op_add_RV(REG_RSP,pobj_sf->GetFrameSize());
    348360
    349361        //xor rax,rax(raxを0に初期化する)
  • BasicCompiler64/NumOpe.cpp

    r63 r64  
    1414    //////////////////////////////////////////////////////
    1515
     16        char *parameter = (char *)malloc( lstrlen( lpszText ) + 3 );
     17        lstrcpy( parameter, lpszText );
     18        SetStringQuotes( parameter );
     19
    1620        extern CClass *pobj_StringClass;
    17         int object_size = pobj_StringClass->GetSize();
    18 
    19         //mov rcx,object_size
    20         op_mov_RV(sizeof(_int64),REG_RCX,object_size);
    21 
    22         //call calloc
    23         extern SUBINFO *pSub_calloc;
    24         op_call(pSub_calloc);
    25 
    26         //mov r11,rax
    27         op_mov_RR(REG_R11,REG_RAX);
    28 
    29         //mov qword ptr[rsp+offset],r11     ※スタックフレームを利用
    30         pobj_sf->push(REG_R11);
    31 
    32         //mov rcx,rax
    33         op_mov_RR(REG_RCX,REG_RAX);
    34 
    35         //call constructor
    36         op_call(pobj_StringClass->GetConstructorMethod()->psi);
    37 
    38         // TODO: Ex表記による文字列長に対応する
    39         int i2 = dataTable.AddString( lpszText );
    40 
    41         //mov rax,i2
    42         op_mov_RV(sizeof(_int64),REG_RAX,i2);
    43         obp-=sizeof(long);
    44         pobj_DataTableSchedule->add();
    45         obp+=sizeof(long);
    46 
    47 
    48         //mov r11,qword ptr[rsp+offset]     ※スタックフレームを利用
    49         pobj_sf->ref(REG_R11);
    50 
    51 
    52         RELATIVE_VAR RelativeVar;
    53         RelativeVar.bOffsetOffset=0;
    54         RelativeVar.offset=0;
    55         RelativeVar.dwKind=VAR_DIRECTMEM;
    56 
    57         SetObjectVariableFromRax((LONG_PTR)pobj_StringClass,DEF_PTR_BYTE,-1,&RelativeVar,0);
    58 
    59         //mov r11,qword ptr[rsp+offset]     ※スタックフレームを利用
    60         pobj_sf->pop(REG_R11);
    61 
     21        TYPEINFO baseTypeInfo = { DEF_OBJECT, (LONG_PTR)pobj_StringClass };
     22        Operator_New( *pobj_StringClass, "", parameter, baseTypeInfo );
     23
     24        free( parameter );
     25
     26        //mov reg,rax
     27        op_mov_RR( reg, REG_RAX );
    6228
    6329    /////////////////////////////////////////////
     
    6531        RESTORE_REGISTER_RESOURCE
    6632    }////////////////////////////////////////////
    67 
    68     //mov reg,r11
    69     op_mov_RR(reg,REG_R11);
    7033}
    7134
     
    10265        else{
    10366            //mov reg,rax
    104             op_mov64_ToReg_FromReg(UseReg,REG_RAX);
     67            op_mov_RR(UseReg,REG_RAX);
    10568        }
    10669    }
     
    11780    }
    11881
    119     if(Command[0]==1&&Command[1]==ESC_NEW){
     82    if(Command[0]==1&& Command[1]==ESC_NEW ){
    12083        //New演算子(オブジェクト生成)
    121         return Operator_New(Command+2,plpIndex);
     84        TYPEINFO baseTypeInfo = { BaseType, lpBaseIndex };
     85        int resultType = Operator_New(Command+2,plpIndex, baseTypeInfo );
     86
     87        //mov reg,rax
     88        op_mov_RR( *pReg, REG_RAX );
     89
     90        return resultType;
    12291    }
    12392
     
    245214                        TYPEINFO BaseTypeInfo = {BaseType,lpBaseIndex};
    246215                        if(IsStringSubsituation(pobj_Class)
    247                             || IsStringObjectType(&BaseTypeInfo)){
     216                            || IsStringObjectType(BaseTypeInfo)){
    248217                            //要求タイプがオブジェクトであり、Stringの受け入れが可能な場合
    249218
     
    265234                    }
    266235
    267                     type[sp]=DEF_PTR_BYTE;
     236                    type[sp]=DEF_PTR_CHAR;
    268237                    bLiteralCalculation=0;
    269238
     
    375344                            else pobj_reg->LockReg();
    376345
    377                             if(i2==DEF_OBJECT){
    378                                 //Object型が戻ったときはヒープ領域にインスタンスが格納されている
     346                            if(i2==DEF_STRUCT){
     347                                //構造体が戻ったときはヒープ領域にインスタンスが格納されている
    379348                                //※後にfreeする必要あり
    380349                                bUseHeap[sp]=1;
     
    469438                                SetXmmReg_SingleVariable(&RelativeVar,XmmReg);
    470439                        }
    471                         else if(IsWholeNumberType(i2)){
     440                        else if(IsWholeNumberType(i2) || i2==DEF_OBJECT){
    472441                            //整数型
    473442                            SetReg_WholeVariable(i2,&RelativeVar,UseReg);
    474443                        }
    475                         else if(i2==DEF_OBJECT){
    476                             //オブジェクト ポインタをUseRegへ格納
     444                        else if(i2==DEF_STRUCT){
     445                            //構造体ポインタをUseRegへ格納(構造体は値型)
    477446                            SetVarPtrToReg(UseReg,&RelativeVar);
    478447                        }
     
    585554                        }////////////////////////////////////////////
    586555
    587                         if(type[sp]==DEF_OBJECT){
    588                             //Object型が戻ったときはヒープ領域にインスタンスが格納されている
     556                        if(type[sp]==DEF_STRUCT){
     557                            //構造体が戻ったときはヒープ領域にインスタンスが格納されている
    589558                            //※後にfreeする必要あり
    590559                            bUseHeap[sp]=1;
  • BasicCompiler64/NumOpe_Arithmetic.cpp

    r56 r64  
    108108        else if(idCalc==CALC_PRODUCT){
    109109            //mul reg1,reg2
    110             op_imul_reg(sizeof(_int64),reg1,reg2);
     110            op_imul_RR(sizeof(_int64),reg1,reg2);
    111111        }
    112112
     
    131131        else if(idCalc==CALC_PRODUCT){
    132132            //mul reg1,reg2
    133             op_imul_reg(sizeof(long),reg1,reg2);
     133            op_imul_RR(sizeof(long),reg1,reg2);
    134134        }
    135135
     
    177177    if(reg2==REG_RAX||reg2==REG_RDX){
    178178        //mov r15,reg2
    179         op_mov64_ToReg_FromReg(REG_R15,reg2);
     179        op_mov_RR(REG_R15,reg2);
    180180
    181181        reg2=REG_R15;
     
    203203
    204204        //mov rax,reg1
    205         op_mov64_ToReg_FromReg(REG_RAX,reg1);
     205        op_mov_RR(REG_RAX,reg1);
    206206
    207207        if(IsSignedType(type[sp-2])){
     
    231231
    232232        //mov reg1,rdx
    233         op_mov64_ToReg_FromReg(reg1,REG_RDX);
     233        op_mov_RR(reg1,REG_RDX);
    234234
    235235    }
     
    353353    if(reg2==REG_RAX||reg2==REG_RDX){
    354354        //mov r15,reg2
    355         op_mov64_ToReg_FromReg(REG_R15,reg2);
     355        op_mov_RR(REG_R15,reg2);
    356356
    357357        reg2=REG_R15;
     
    379379
    380380        //mov rax,reg1
    381         op_mov64_ToReg_FromReg(REG_RAX,reg1);
     381        op_mov_RR(REG_RAX,reg1);
    382382
    383383        if(IsSignedType(type[sp-2])){
     
    407407
    408408        //mov reg1,rax
    409         op_mov64_ToReg_FromReg(reg1,REG_RAX);
     409        op_mov_RR(reg1,REG_RAX);
    410410
    411411    }
     
    495495
    496496        //imul reg,-1
    497         op_imul_value(sizeof(_int64),reg,-1);
     497        op_imul_RV(sizeof(_int64),reg,-1);
    498498
    499499        if(reg==REG_R14){
     
    508508
    509509        //imul reg,-1
    510         op_imul_value(sizeof(long),reg,-1);
     510        op_imul_RV(sizeof(long),reg,-1);
    511511
    512512        if(reg==REG_R14){
     
    617617    if(reg1==REG_RCX){
    618618        //mov r15,rcx
    619         op_mov64_ToReg_FromReg(REG_R15,REG_RCX);
     619        op_mov_RR(REG_R15,REG_RCX);
    620620
    621621        reg1=REG_R15;
     
    629629
    630630    //mov rcx,reg2
    631     op_mov64_ToReg_FromReg(REG_RCX,reg2);
     631    op_mov_RR(REG_RCX,reg2);
    632632
    633633    if(idCalc==CALC_SHL){
     
    662662    if(sw==0){
    663663        //mov rcx,r15
    664         op_mov64_ToReg_FromReg(REG_RCX,REG_R15);
     664        op_mov_RR(REG_RCX,REG_R15);
    665665    }
    666666    else{
  • BasicCompiler64/NumOpe_Logical.cpp

    r36 r64  
    112112
    113113        //add rax, 1
    114         op_add64_value( REG_RAX, 1 );
     114        op_add_RV( REG_RAX, 1 );
    115115
    116116        if( reg != REG_RAX ){
  • BasicCompiler64/Opcode.h

    r62 r64  
    125125    void SetLocalParmSize(int size);
    126126    int GetFrameSize();
     127    int GetNowSp();
     128    void mov_sp( int reg );
    127129    int push(int reg);
    128130    void push(int xmm_reg,int var_size);
     
    130132    void ref(int reg);
    131133    void ref(int xmm_reg,int var_size);
    132     void pop(int reg);
     134    void pop(int reg = REG_NON);
    133135    void pop(int xmm_reg,int var_size);
    134136    void parameter_allocate(int size);
     
    247249void SetVariableFromRax(int VarType,int CalcType,RELATIVE_VAR *pRelativeVar);
    248250void OpcodeCalc(char *Command);
    249 void SetRefVariable( const char *varname, const char *expression );
    250251
    251252//NumOpe.cpp
     
    285286//Compile_Set_Var.cpp
    286287BOOL IsUse_r11(RELATIVE_VAR *pRelativeVar);
    287 void SetObjectVariableFromRax(LONG_PTR lpVarIndex,int CalcType,LONG_PTR lpCalcIndex,RELATIVE_VAR *pRelativeVar,BOOL bUseHeap);
    288 void SetDoubleVariable(int type,RELATIVE_VAR *pRelative);
    289 void SetSingleVariable(int type,RELATIVE_VAR *pRelative);
     288void SetStructVariableFromRax(LONG_PTR lpVarIndex,int CalcType,LONG_PTR lpCalcIndex,RELATIVE_VAR *pRelativeVar,BOOL bUseHeap);
     289void SetRealVariable(int VarType, int CalcType, RELATIVE_VAR *pRelativeVar);
    290290void SetBooleanVariable(int type,RELATIVE_VAR *pRelative);
    291291void SetWholeVariable(int var_size,int type,RELATIVE_VAR *pRelative);
     
    307307
    308308//Compile_Object.cpp
    309 int Operator_New(const char *Parameter,LONG_PTR *plpIndex);
    310 void OpcodeDelete(const char *Parameter);
     309void Operator_New( CClass &classObj, const char *objectSizeStr, const char *parameter,const TYPEINFO &baseTypeInfo );
     310int Operator_New(const char *Parameter,LONG_PTR *plpIndex,const TYPEINFO &baseTypeInfo );
     311void OpcodeDelete(const char *Parameter, bool isSweeping);
    311312
    312313//Compile_Var.cpp
     
    319320#define DIMFLAG_STATIC                  0x04
    320321#define DIMFLAG_CONST                   0x08
     322void dim(bool isRef, char *VarName,int *SubScripts,TYPEINFO &TypeInfo,int TypeSize,char *InitBuf,char *ConstractParameter,DWORD dwFlags);
    321323void OpcodeDim(char *Parameter,DWORD dwFlag);
    322324void SetVarPtrToReg(int reg,RELATIVE_VAR *pRelativeVar);
    323325
    324326//CParameter.cpp
     327#define OVERLOAD_MIN_LEVEL 0
     328#define OVERLOAD_MAX_LEVEL 3
     329#define OVERLOAD_LEVEL0 0
    325330#define OVERLOAD_LEVEL1 1
    326331#define OVERLOAD_LEVEL2 2
     
    352357    BOOL ErrorCheck(const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum);
    353358    void MacroParameterSupport(PARAMETER_INFO *ppi);
    354     void SetObjectParameter(int reg,CClass *pobj_Class,LPSTR Parameter);
     359    void SetStructParameter(int reg,CClass *pobj_Class,LPSTR Parameter);
    355360
    356361    //一時オブジェクトパラメータの生成と破棄
    357     void NewTempParameters( const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum );
     362    int NewTempParameters( const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum );
    358363    void DeleteTempParameters();
    359364
     
    380385#define PROCFLAG_NEW    1
    381386int Opcode_CallProcPtr(char *variable,char *Parameter,PROCPTRINFO *pi,LONG_PTR *plpIndex);
    382 void Opcode_CallProc(char *Parameter,SUBINFO *psi,DWORD dwFlags,char *ObjectName,int RefType);
     387void Opcode_CallProc(const char *Parameter,SUBINFO *psi,DWORD dwFlags,char *ObjectName,int RefType);
    383388int Opcode_CallDllProc(char *Parameter,DECLAREINFO *pdi,LONG_PTR *plpIndex);
    384389
     
    410415void OpcodeGosub(char *Parameter);
    411416void OpcodeReturn(char *Parameter);
    412 void Opcode_Input(char *Parameter);
    413 void Opcode_Print(char *Parameter,BOOL bWrite);
     417void Opcode_Input(const char *Parameter);
     418void Opcode_Print(const char *Parameter,BOOL bWrite);
    414419void OpcodeCallPtr(char *Parameter);
    415420void OpcodeSetPtrData(char *Parameter,int type);
     
    450455void op_mov64_ToReg             (int reg,_int64 i64data);
    451456void op_mov64_ToReg             (int reg,int i32data);
    452 void op_mov64_ToReg_FromReg     (int reg1,int reg2);
    453457void op_movsxd                  (int reg64,int reg32);
    454458void op_movsx64_FromReg16       (int reg64,int reg16);
     
    460464void op_dec                     (int reg);
    461465void op_add_RM                  (int op_size,int reg,int base_reg,int offset,char mod);
    462 void op_add64_value             (int reg,int offset);
     466void op_add_RV              (int reg,int offset);
    463467void op_add64_reg               (int reg1,int reg2);
    464468void op_add32_reg               (int reg1,int reg2);
     
    467471void op_sub32_reg               (int reg1,int reg2);
    468472void op_sbb_RR                  ( int op_size, int reg1, int reg2 );
    469 void op_imul_reg                (int op_size,int reg1,int reg2);
    470 void op_imul_value              (int op_size,int reg,int i32data);
     473void op_imul_RR             (int op_size,int reg1,int reg2);
     474void op_imul_RV             (int op_size,int reg,int i32data);
    471475void op_div64_reg               (int reg);
    472476void op_idiv64_reg              (int reg);
  • BasicCompiler64/OperatorProc.cpp

    r63 r64  
    5555        if(pBaseTypeInfo){
    5656            if(pBaseTypeInfo->type==DEF_OBJECT){
    57                 bReturnTypeIsObject=1;
    5857                ReturnType.u.lpIndex=pBaseTypeInfo->u.lpIndex;
    5958            }
     
    113112    HeapDefaultFree(ppi);
    114113
    115     int right_side_size;
    116     if(type[sp-1]==DEF_OBJECT) right_side_size=PTR_SIZE;
    117     else right_side_size=GetTypeSize(type[sp-1],index_stack[sp-1]);
    118 
    119114    if(bTwoTerm){
    120         if(psi->pParmInfo[1].type==DEF_OBJECT&&psi->pParmInfo[1].bByVal){
     115        if(psi->pRealParmInfo[1].type==DEF_STRUCT&&psi->pRealParmInfo[1].bByVal){
    121116            //一時オブジェクトはメソッド内で破棄される
    122117            bUseHeap[sp-1]=0;
     
    124119    }
    125120
    126 
    127     if(psi->ReturnType==DEF_OBJECT){
    128         //////////////////////////////////////////////////////
    129         // 戻り値にオブジェクト インスタンスを持つ場合
    130         // ※ByRef _System_ReturnObject パラメータ用領域を取得
     121    if(psi->ReturnType==DEF_STRUCT){
     122        //////////////////////////////////////////////////////
     123        // 戻り値に構造体インスタンスを持つ場合
     124        // ※ByRef _System_ReturnValue パラメータ用領域を取得
    131125        //////////////////////////////////////////////////////
    132126
     
    154148        }////////////////////////////////////////////
    155149    }
    156 
    157150
    158151    int reg1,reg2;
     
    161154        SetOneTermToReg_Whole64Calc(type[sp-1],&reg2);
    162155        pobj_reg->UnlockReg();
     156        if( !psi->pRealParmInfo[1].bByVal ){
     157            //一時参照を作成
     158            pobj_sf->push( reg2 );
     159            pobj_sf->mov_sp( reg2 );
     160        }
    163161    }
    164162
     
    192190
    193191        if(bTwoTerm){
    194             if(psi->ReturnType==DEF_OBJECT){
     192            if(psi->ReturnType==DEF_STRUCT){
    195193                //mov r8,reg2
    196194                op_mov_RR(REG_R8,reg2);
     
    202200        }
    203201
    204         if(psi->ReturnType==DEF_OBJECT){
     202        if(psi->ReturnType==DEF_STRUCT){
    205203            //mov rdx,r13
    206204            op_mov_RR(REG_RDX,REG_R13);
     
    213211        op_call(psi);
    214212
    215         if(psi->ReturnType!=-1){
     213        if(psi->ReturnType!=DEF_NON){
    216214            //戻り値を一時的に退避
    217215
     
    254252    }
    255253
    256     if(psi->ReturnType!=-1){
     254    if(bTwoTerm){
     255        if( !psi->pRealParmInfo[1].bByVal ){
     256            //一時参照を破棄
     257            pobj_sf->pop();
     258        }
     259    }
     260
     261    if(psi->ReturnType!=DEF_NON){
    257262        //戻り値をreg1にセット
    258263        reg1=pobj_reg->LockReg();
     
    266271    index_stack[sp-1]=psi->u.ReturnIndex;
    267272
    268     if(psi->ReturnType==DEF_OBJECT){
    269         //Object型が戻ったときはヒープ領域にインスタンスが格納されている
     273    if(psi->ReturnType==DEF_STRUCT){
     274        //構造体が戻ったときはヒープ領域にインスタンスが格納されている
    270275        //※後にfreeする必要あり
    271276        bUseHeap[sp-1]=1;
  • BasicCompiler64/WatchList.cpp

    r63 r64  
    7878    if(PTR_LEVEL(*pType)){
    7979        *pType=MAKE_PTR_TYPE(NATURAL_TYPE(*pType),PTR_LEVEL(*pType)-1);
    80         if((*pType)==DEF_OBJECT){
    81             CClass *pClass = (CClass *)lpIndex;
    82             array_num *= pClass->GetSize();
    83         }
    84         else{
    85             array_num *= GetTypeSize(*pType,-1);
    86         }
     80        array_num *= GetTypeSize(*pType,-1);
    8781    }
    8882    else{
     
    114108    char lpPtrOffset[VN_SIZE];  //第2次配列
    115109    char NestMember[VN_SIZE];   //入れ子メンバ
    116     int RefType;                //"."参照のときは0、"->"参照のときは1
     110    CClass::RefType refType;
    117111    lstrcpy(VarName,member);
    118     if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember,&RefType)) return 0;
     112    if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember, refType ) ) return 0;
    119113
    120114
     
    175169        //入れ子構造の場合
    176170
    177         if(*pType==DEF_OBJECT){
    178             if(RefType!=DEF_OBJECT) return 0;
    179         }
    180         else if(*pType==DEF_PTR_OBJECT){
     171        if(*pType==DEF_OBJECT || *pType==DEF_STRUCT){
     172            if( refType != CClass::Dot ) return 0;
     173
     174            if( *pType==DEF_OBJECT ){
     175                extern HANDLE hDebugProcess;
     176                LONG_PTR lpData;
     177                SIZE_T stAccBytes;
     178                lpData=Debugging_GetVarPtr(pRelativeVar);
     179                if(!ReadProcessMemory(hDebugProcess,(void *)lpData,&pRelativeVar->offset,sizeof(LONG_PTR),&stAccBytes)) return -1;
     180                pRelativeVar->dwKind=VAR_DIRECTMEM;
     181            }
     182        }
     183        else if(*pType==DEF_PTR_OBJECT || *pType==DEF_PTR_STRUCT){
    181184            //構造体ポインタ型メンバ変数
    182185
    183186            if(lpPtrOffset[0]){
    184                 if(RefType!=DEF_OBJECT) return 0;
     187                if( refType != CClass::Dot ) return 0;
    185188
    186189                //直接参照に切り替え
     
    190193            }
    191194            else{
    192                 if(RefType!=DEF_PTR_OBJECT) return 0;
     195                if( refType != CClass::Pointer ) return 0;
    193196
    194197                extern HANDLE hDebugProcess;
     
    320323int Debugging_GetVarOffset(char *variable,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss){
    321324    extern HANDLE hDebugProcess;
    322     int i,i2,i3,RefType;
     325    int i,i2,i3;
    323326    char member[VN_SIZE],VarName[VN_SIZE],array[VN_SIZE],lpPtrOffset[VN_SIZE];
    324327    LONG_PTR lpData;
     
    326329
    327330    lstrcpy(VarName,variable);
    328     GetVarFormatString(VarName,array,lpPtrOffset,member,&RefType);
     331    CClass::RefType refType;
     332    GetVarFormatString(VarName,array,lpPtrOffset,member,refType);
    329333
    330334    LONG_PTR lpIndex;
     
    474478    }
    475479    if(member[0]){
    476         if(*pType==DEF_OBJECT){
     480        if(*pType==DEF_OBJECT || *pType==DEF_STRUCT){
    477481            //実態オブジェクトのメンバを参照(obj.member)
    478             if(RefType!=DEF_OBJECT){
     482            if( refType != CClass::Dot ){
    479483                return 0;
    480484            }
     
    493497            *plpIndex=lp2;
    494498        }
    495         else if(*pType==DEF_PTR_OBJECT){
     499        else if(*pType==DEF_PTR_OBJECT || *pType==DEF_PTR_STRUCT){
    496500            //ポインタオブジェクトが示すメンバを参照
    497501            if(lpPtrOffset[0]){
    498502                //pObj[n].member
    499                 if(RefType!=DEF_OBJECT) return 0;
     503                if( refType != CClass::Dot ) return 0;
    500504                Debugging_SetRelativeOffset(pType,lpIndex,pRelativeVar,lpPtrOffset);
    501505
     
    515519            else{
    516520                //pObj->member
    517                 if(RefType!=DEF_PTR_OBJECT) return 0;
     521                if( refType != CClass::Pointer ) return 0;
    518522
    519523                pRelativeVar->offset=Debugging_GetVarPtr(pRelativeVar);
  • BasicCompiler64/amd64_main.cpp

    r36 r64  
    424424
    425425void op_mov_RR(int reg1,int reg2){
    426     op_mov64_ToReg_FromReg(reg1,reg2);
     426    //mov reg1,reg2
     427    char RexByte=-1;
     428
     429    if(reg1==reg2) return;
     430
     431    if(REG_RAX<=reg1&&reg1<=REG_RDI){
     432        if(REG_RAX<=reg2&&reg2<=REG_RDI) RexByte=(char)0x48;
     433        if(REG_R8<=reg2&&reg2<=REG_R15) RexByte=(char)0x49;
     434    }
     435    if(REG_R8<=reg1&&reg1<=REG_R15){
     436        if(REG_RAX<=reg2&&reg2<=REG_RDI) RexByte=(char)0x4C;
     437        if(REG_R8<=reg2&&reg2<=REG_R15) RexByte=(char)0x4D;
     438    }
     439
     440    if(RexByte==-1) SetError(300,NULL,cp);
     441
     442    // [8bit rex] 1000 1011 11xx xbbb
     443    OpBuffer[obp++]=RexByte;
     444    OpBuffer[obp++]=(char)0x8B;
     445    OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(reg1)<<3 | REGISTER_OPERAND(reg2));
    427446}
    428447
     
    475494    }
    476495}
    477 void op_mov64_ToReg_FromReg(int reg1,int reg2){
    478     //mov reg1,reg2
    479     char RexByte=-1;
    480 
    481     if(reg1==reg2) return;
    482 
    483     if(REG_RAX<=reg1&&reg1<=REG_RDI){
    484         if(REG_RAX<=reg2&&reg2<=REG_RDI) RexByte=(char)0x48;
    485         if(REG_R8<=reg2&&reg2<=REG_R15) RexByte=(char)0x49;
    486     }
    487     if(REG_R8<=reg1&&reg1<=REG_R15){
    488         if(REG_RAX<=reg2&&reg2<=REG_RDI) RexByte=(char)0x4C;
    489         if(REG_R8<=reg2&&reg2<=REG_R15) RexByte=(char)0x4D;
    490     }
    491 
    492     if(RexByte==-1) SetError(300,NULL,cp);
    493 
    494     // [8bit rex] 1000 1011 11xx xbbb
    495     OpBuffer[obp++]=RexByte;
    496     OpBuffer[obp++]=(char)0x8B;
    497     OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(reg1)<<3 | REGISTER_OPERAND(reg2));
    498 }
    499496void op_movsxd(int reg64,int reg32){
    500497    //movsxd reg64,reg32
     
    686683}
    687684
    688 void op_add64_value(int reg,int offset){
     685void op_add_RV(int reg,int offset){
    689686    //add reg,offset
    690687    char RexByte=-1;
     
    843840////////////////////////
    844841
    845 void op_imul_reg(int op_size,int reg1,int reg2){
     842void op_imul_RR(int op_size,int reg1,int reg2){
    846843    //imul reg1,reg2
    847844    char RexByte=-1;
     
    881878    OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(reg1)<<3 | REGISTER_OPERAND(reg2));
    882879}
    883 void op_imul_value(int op_size,int reg,int i32data){
     880void op_imul_RV(int op_size,int reg,int i32data){
    884881    //imul reg,i32data
    885882    char RexByte=-1;
  • BasicCompiler64/stack_frame.cpp

    r20 r64  
    3838    }
    3939    return -(answer_sp-0x08);
     40}
     41int CStackFrame::GetNowSp(){
     42    return now_sp;
     43}
     44void CStackFrame::mov_sp( int reg ){
     45    //mov reg,rsp
     46    op_mov_RR( reg, REG_RSP );
     47
     48    //add reg,now_sp
     49    op_add_RV( reg, now_sp );
     50
     51    //スケジュールをセット
     52    obp-=sizeof(long);
     53    add();
     54    obp+=sizeof(long);
    4055}
    4156int CStackFrame::push(int reg){
  • BasicCompiler64/varlist.cpp

    r63 r64  
    2222    _int64 i64data;
    2323
    24     if(type==DEF_OBJECT){
     24    if(type==DEF_OBJECT||type==DEF_STRUCT){
     25        if( type==DEF_OBJECT ){
     26            // 参照型ということを考慮する
     27            ReadProcessMemory(hDebugProcess,(void *)offset,&pData,sizeof(void *),&stAccBytes);
     28            offset = pData;
     29        }
     30
    2531        sprintf(lptv->item.pszText,"%s %s(&H%X)",VarName,STRING_OBJECT,(DWORD64)offset);
    2632        lptv->item.iImage=1;
     
    3137        return;
    3238    }
    33     if(type==DEF_PTR_OBJECT){
     39    if(type==DEF_PTR_OBJECT||type==DEF_PTR_STRUCT){
    3440        i2=ReadProcessMemory(hDebugProcess,(void *)offset,&pData,sizeof(void *),&stAccBytes);
    3541
     
    4349    }
    4450    else{
    45         if(type==DEF_PTR_BYTE){
     51        if(type==DEF_PTR_CHAR||type==MAKE_PTR_TYPE(DEF_BYTE,1)){
    4652            if(ReadProcessMemory(hDebugProcess,(void *)offset,&pData,sizeof(void *),&stAccBytes)){
    4753                for(i2=0;;i2++){
  • BasicCompiler_Common/BasicFixed.h

    r55 r64  
    1313// 型
    1414////////////////
     15
     16#define DEF_NON         -1
    1517
    1618/* basic\command.sbp内の "_System_Type_***" 定数と同期が必要 */
     
    4850#define DEF_ANY         0x00000015
    4951#define DEF_OBJECT      0x00000016
     52#define DEF_STRUCT      0x00000017
    5053#define DEF_ELLIPSE     0x00000018
    5154
     
    6063#define PTR_LEVEL_DOWN(t)   t = MAKE_PTR_TYPE(NATURAL_TYPE(t),PTR_LEVEL(t)-1)
    6164
    62 #define DEF_PTR_BYTE    MAKE_PTR_TYPE(DEF_BYTE,1)
     65#define DEF_PTR_CHAR    MAKE_PTR_TYPE(DEF_CHAR,1)
    6366#define DEF_PTR_OBJECT  MAKE_PTR_TYPE(DEF_OBJECT,1)
     67#define DEF_PTR_STRUCT  MAKE_PTR_TYPE(DEF_STRUCT,1)
    6468
    6569
     
    191195#define ESC_ENDINTERFACE    (char)0xAA
    192196#define ESC_OPERATOR        (char)0xAB
    193 
  • BasicCompiler_Common/Class.cpp

    r63 r64  
    101101
    102102int CMember::GetSize(){
    103     if( IsRef() ){
    104         // 参照型
    105         return PTR_SIZE;
    106     }
    107 
    108103    //メンバサイズを取得
    109104    return GetTypeSize(TypeInfo.type,TypeInfo.u.lpIndex);
     
    126121            char temporary[VN_SIZE];
    127122            sprintf(temporary,"%s.%s",pobj_c->name,member->name);
    128             AddGlobalVariable(
     123            dim(
    129124                false,
    130125                temporary,
    131126                member->SubScripts,
    132                 &member->TypeInfo,
     127                member->TypeInfo,
    133128                GetTypeSize(member->TypeInfo.type,member->TypeInfo.u.lpIndex),
    134129                member->InitBuf,
    135130                member->ConstractParameter,
    136131                0);
    137 
    138             if(member->TypeInfo.type==DEF_OBJECT){
    139                 //エラー用
    140                 cp=member->source_code_address;
    141 
    142                 CallConstructor(temporary,
    143                     member->SubScripts,
    144                     member->TypeInfo,
    145                     member->ConstractParameter);
    146             }
    147132
    148133            //ネイティブコードバッファの再確保
     
    220205    }
    221206}
     207
     208bool CClass::IsStructure() const
     209{
     210    return classType == CClass::Structure;
     211}
     212
    222213void CClass::Inherits( CClass *pInheritsClass ){
    223214    int i3;
     
    437428        //アラインメントを算出
    438429        int member_size;
    439         if(pMember->TypeInfo.type==DEF_OBJECT){
     430        if(pMember->TypeInfo.type==DEF_STRUCT){
    440431            //メンバクラスのアラインメントを取得
    441432            member_size=pMember->TypeInfo.u.pobj_Class->GetAlignment();
     
    500491        CMember *pMember = ppobj_Member[i];
    501492
    502         if(pMember->TypeInfo.type==DEF_OBJECT && pMember->IsRef() == false){
     493        if(pMember->TypeInfo.type==DEF_STRUCT){
    503494            //メンバクラスのアラインメントを取得
    504495            member_size=pMember->TypeInfo.u.pobj_Class->GetAlignment();
     
    598589    //コンポジションの関係にあるメンバも検査する
    599590    for(int i=0;i < iMemberNum;i++){
    600         if(ppobj_Member[i]->TypeInfo.type==DEF_OBJECT && ppobj_Member[i]->IsRef() == false){
     591        if(ppobj_Member[i]->TypeInfo.type==DEF_OBJECT){
    601592            if(ppobj_Member[i]->TypeInfo.u.pobj_Class->IsAbstract())
    602593                return true;
     
    805796
    806797                //クラスを追加
    807                 pobj_DBClass->AddClass(temporary,NowLine);
     798                CClass *pClass = pobj_DBClass->AddClass(temporary,NowLine);
     799                if( pClass ){
     800                    if( basbuf[NowLine+1] == ESC_CLASS ){
     801                        pClass->classType = CClass::Class;
     802                    }
     803                    else if( basbuf[NowLine+1] == ESC_INTERFACE ){
     804                        pClass->classType = CClass::Interface;
     805                    }
     806                    else{
     807                        pClass->classType = CClass::Structure;
     808                    }
     809                }
    808810        }
    809811    }
     
    843845        if(psi->ParmNum==0) fConstructor=1;
    844846
     847        // TODO: 消す
    845848        //コピーコンストラクタ
    846849        if(psi->ParmNum==1){
     
    953956    for(i=0;i<pobj_c->iMemberNum;i++){
    954957        CMember *pMember = pobj_c->ppobj_Member[i];
    955         if(pMember->TypeInfo.type==DEF_OBJECT && pMember->IsRef()==false ){
     958        if(pMember->TypeInfo.type==DEF_OBJECT){
    956959            //循環参照でないかをチェック
    957960            if(pobj_LoopRefCheck->check(pMember->TypeInfo.u.pobj_Class->name)){
     
    976979    extern char *basbuf;
    977980    int i,i2,i3,sub_address,top_pos;
    978     DWORD dwClassType;
    979981    DWORD dwAccess;
    980982    char temporary[8192];
     
    11321134            top_pos=i;
    11331135
    1134             dwClassType=basbuf[i+1];
     1136            const DWORD dwClassType=basbuf[i+1];
    11351137
    11361138            i+=2;
     
    12631265                    i += 2;
    12641266                }
    1265 
     1267/*
    12661268                //Ref修飾子
    12671269                bool isRef = false;
     
    12691271                    isRef = true;
    12701272                    i += 2;
    1271                 }
     1273                }*/
    12721274
    12731275                if(basbuf[i]==1&&(
     
    13481350                        //静的メンバを追加
    13491351                        cp=i;   //エラー用
    1350                         pobj_c->AddStaticMember( dwAccess, isConst, isRef, temporary, i);
     1352                        pobj_c->AddStaticMember( dwAccess, isConst, false, temporary, i);
    13511353                    }
    13521354                    else{
    13531355                        //メンバを追加
    13541356                        cp=i;   //エラー用
    1355                         pobj_c->AddMember( dwAccess, isConst, isRef, temporary );
    1356 
    1357 
    1358                         if(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->TypeInfo.type==DEF_OBJECT){
     1357                        pobj_c->AddMember( dwAccess, isConst, false, temporary );
     1358
     1359
     1360                        if(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->TypeInfo.type==DEF_OBJECT||
     1361                            pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->TypeInfo.type==DEF_STRUCT){
    13591362                            if(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->TypeInfo.u.pobj_Class->ppobj_Member==0){
    13601363                                //参照先が読み取られていないとき
     
    13761379                }
    13771380                else{
    1378                     // 文法エラーチェック
    1379                     if( isRef ){
    1380                         SetError(1,NULL,cp);
    1381                     }
    1382 
    13831381                    //メソッドを追加
    13841382                    cp=i;   //エラー用
  • BasicCompiler_Common/Class.h

    r63 r64  
    7979    std::vector<CMethod *> staticMethods;
    8080
     81    enum ClassType{
     82        Class,
     83        Structure,
     84        Interface,
     85    };
     86
     87    ClassType classType;
     88
    8189public:
    8290    //クラス名
     
    100108    CClass(const char *name);
    101109    ~CClass();
     110
     111    bool IsStructure() const;
    102112
    103113    //継承させる
     
    186196    //線形リスト用
    187197    CClass *pobj_NextClass;
     198
     199
     200    //メンバの参照方法
     201    enum RefType{
     202        Dot,            // obj.member
     203        Pointer,        // obj->member
     204        Non,            // no reference member
     205    };
    188206};
    189207
  • BasicCompiler_Common/Compile.cpp

    r56 r64  
    243243            break;
    244244        case COM_DELETE:
    245             OpcodeDelete(Command+2);
     245            OpcodeDelete(Command+2, false);
     246            break;
     247        case COM_SWEEPINGDELETE:
     248            OpcodeDelete(Command+2, true);
    246249            break;
    247250
  • BasicCompiler_Common/DebugMiddleFile.cpp

    r53 r64  
    1111
    1212void SetLpIndex_DebugFile(char *buffer,int *p,int type,LONG_PTR lpIndex){
    13     if(NATURAL_TYPE(type)==DEF_OBJECT){
     13    if(NATURAL_TYPE(type)==DEF_OBJECT || NATURAL_TYPE(type)==DEF_STRUCT){
    1414        lstrcpy(buffer+(*p),((CClass *)lpIndex)->name);
    1515        (*p)+=lstrlen(buffer+(*p))+1;
     
    2323
    2424void GetLpIndex_DebugFile(char *buffer,int *p,int type,LONG_PTR *plpIndex){
    25     if(NATURAL_TYPE(type)==DEF_OBJECT){
     25    if(NATURAL_TYPE(type)==DEF_OBJECT || NATURAL_TYPE(type)==DEF_STRUCT){
    2626        char szClassName[VN_SIZE];
    2727        lstrcpy(szClassName,buffer+(*p));
  • BasicCompiler_Common/Intermediate_Step1.cpp

    r54 r64  
    22
    33void ChangeReturnCode(char *buffer){
     4
     5#ifdef _DEBUG
     6    //改行コードの整合性チェック
     7    for( int i=0; ; i++ ){
     8        if( buffer[i] == '\0' ){
     9            break;
     10        }
     11        if( buffer[i]!='\r' && buffer[i+1]=='\n'
     12            ||  buffer[i]=='\r' && buffer[i+1]!='\n' ){
     13                char temporary[255];
     14                strncpy( temporary, buffer + i-100, 130 );
     15                temporary[130] = 0;
     16                for(int i2=0; ;i2++){
     17                    if(temporary[i2]=='\r') temporary[i2]='A';
     18                    if(temporary[i2]=='\n') temporary[i2]='B';
     19                    if(temporary[i2]=='\0') break;
     20                }
     21                MessageBox( hOwnerEditor, temporary, "改行コードの整合性チェック", MB_OK | MB_ICONEXCLAMATION );
     22        }
     23    }
     24#endif
     25
    426    //改行コードのCRLFをLFに変換
    5     int i,i2;
    6     for(i=0,i2=0;;i++,i2++){
     27    for(int i=0,i2=0;;i++,i2++){
    728        if(buffer[i]=='\r'&&buffer[i+1]=='\n') i++;
    829        buffer[i2]=buffer[i];
  • BasicCompiler_Common/Intermediate_Step2.cpp

    r43 r64  
    582582        ComNum=COM_DELETE;
    583583    }
     584    else if( lstrcmpi( com, "_System_SweepingDelete" ) == 0 ){
     585        KillSpaces(Command+i,pam);
     586        ComNum=COM_SWEEPINGDELETE;
     587    }
    584588
    585589    //その他
  • BasicCompiler_Common/LexicalScoping.cpp

    r51 r64  
    182182
    183183
    184     int i3,i4;
     184    int i3;
    185185    int indexSystemGC=-1;
    186186    for( i3 = num - 1; i3 >= 0; i3-- ){     //確保したのと逆順序で解放するため、バックサーチにする
     
    197197        if( pVar[i3].ScopeLevel != GetNowLevel() ) continue;
    198198
    199         if(pVar[i3].type==DEF_OBJECT&&pVar[i3].fRef&OBJECT_PARAMETER){
    200             //実態オブジェクトのパラメータを持つとき
    201 
    202             //デストラクタを呼び出す
    203             CMethod *method = pVar[i3].u.pobj_c->GetDestructorMethod();
    204             if( method ){
    205                 Opcode_CallProc("", method->psi,0,pVar[i3].name,DEF_OBJECT);
    206             }
     199        if(pVar[i3].type==DEF_STRUCT&&pVar[i3].fRef&OBJECT_PARAMETER){
     200            //構造体パラメータを持つとき
    207201
    208202            //メモリを解放する
     
    241235            }
    242236        }
     237
     238        /*
     239        TODO: 消す
    243240        else if(pVar[i3].type==DEF_OBJECT&&pVar[i3].fRef==0){
    244241            //デストラクタの呼び出し
     
    285282            }
    286283        }
     284        */
    287285    }
    288286
  • BasicCompiler_Common/NumOpe_GetType.cpp

    r55 r64  
    255255}
    256256
     257int Operator_New_GetType(const char *Parameter,LONG_PTR *plpIndex,const TYPEINFO &baseTypeInfo ){
     258    char TypeName[VN_SIZE],CreateParameter[VN_SIZE],objectSizeStr[VN_SIZE];
     259    int i,i2;
     260
     261    i=0;
     262
     263    if(Parameter[0]=='['){
     264        i=GetStringInBracket(objectSizeStr,Parameter);
     265
     266        SlideString(objectSizeStr+1,-1);
     267        objectSizeStr[i-2]=0;
     268    }
     269    else objectSizeStr[0]=0;
     270
     271    for(i2=0;;i++,i2++){
     272        if(Parameter[i]=='('){
     273            TypeName[i2]=0;
     274
     275            //コンストラクタに渡すパラメータを取得
     276            i2=GetStringInPare(CreateParameter,Parameter+i);
     277            RemoveStringPare(CreateParameter);
     278            i+=i2;
     279            if(Parameter[i]!='\0'){
     280                SetError(42,NULL,cp);
     281                return 0;
     282            }
     283            break;
     284        }
     285        TypeName[i2]=Parameter[i];
     286        if(Parameter[i]=='\0'){
     287            CreateParameter[0]=0;
     288            break;
     289        }
     290    }
     291
     292    int type;
     293    type=GetTypeFixed(TypeName,plpIndex);
     294
     295    if( baseTypeInfo.type == DEF_OBJECT ){
     296        return DEF_OBJECT;
     297    }
     298    return DEF_PTR_OBJECT;
     299}
     300
    257301int NumOpe_GetType(char *Command,TYPEINFO *pBaseType,LONG_PTR *plpIndex){
    258302    extern int cp;
     
    265309    }
    266310
    267     if(Command[0]==1&&Command[1]==ESC_NEW){
     311    if(Command[0]==1&& Command[1]==ESC_NEW ){
    268312        //New演算子(オブジェクト生成)
    269         return DEF_PTR_OBJECT;
     313        return Operator_New_GetType(Command+2,plpIndex, *pBaseType );
    270314    }
    271315
     
    333377                        if(pBaseType->type==DEF_OBJECT){
    334378                            if(IsStringSubsituation(pBaseType->u.pobj_Class)
    335                                 || IsStringObjectType(pBaseType)){
     379                                || IsStringObjectType(*pBaseType)){
    336380                                //要求タイプがオブジェクトであり、Stringの受け入れが可能な場合
    337381                                extern CClass *pobj_StringClass;
     
    346390                    }
    347391
    348                     type[sp]=DEF_PTR_BYTE;
     392                    type[sp]=DEF_PTR_CHAR;
    349393                    bLiteralCalculation=0;
    350394                }
  • BasicCompiler_Common/Overload.cpp

    r50 r64  
    2828        char MethodName[VN_SIZE];
    2929        if( !SplitMemberName( name, NULL, MethodName ) ) lstrcpy( MethodName, name );
    30 
     30/*
    3131        //メソッドの場合は静的かどうかを調べる
    3232        bool isStatic = false;
     
    3535            isStatic = pClass->IsExistStaticMethod( MethodName );
    3636        }
    37 
     37*/
    3838        //パラメータオブジェクトを生成
    3939        pobj_parameter=new CParameter(Parameter);
  • BasicCompiler_Common/Parameter.cpp

    r52 r64  
    5858    }
    5959
    60     ReturnTypeInfo.type=0;
    61     ReturnTypeInfo.u.lpIndex=0;
     60    ReturnTypeInfo.type=DEF_NON;
     61    ReturnTypeInfo.u.lpIndex=-1;
    6262}
    6363CParameter::CParameter(const PARAMETER_INFO *pParamInfo,const int ParmNum){
     
    7070    this->ParmsNum=ParmNum;
    7171
    72     ReturnTypeInfo.type=0;
    73     ReturnTypeInfo.u.lpIndex=0;
     72    ReturnTypeInfo.type=DEF_NON;
     73    ReturnTypeInfo.u.lpIndex=-1;
    7474}
    7575CParameter::~CParameter(){
     
    9999        if(Parms[i]){
    100100            TYPEINFO BaseType={ppi[i].type,ppi[i].u.index};
    101             type=NumOpe_GetType(Parms[i],&BaseType,&lpIndex);
     101            type=NumOpe_GetType(Parms[i],
     102                (overload_level==OVERLOAD_LEVEL0) ? NULL : &BaseType,
     103                &lpIndex);
    102104        }
    103105        else{
     
    107109
    108110        if(type!=ppi[i].type){
    109             if(overload_level==OVERLOAD_LEVEL1){
     111            if(overload_level==OVERLOAD_LEVEL1 || overload_level == OVERLOAD_LEVEL0){
    110112                return 0;
    111113            }
     
    121123        }
    122124        else{
    123             if(NATURAL_TYPE(type)==DEF_OBJECT){
     125            if(NATURAL_TYPE(type)==DEF_OBJECT || NATURAL_TYPE(type)==DEF_STRUCT){
    124126                if(lpIndex!=ppi[i].u.index) return 0;
    125127            }
     
    130132        //戻り値も比較対象にする
    131133        if(ReturnTypeInfo.type==pReturnTypeInfo->type){
    132             if(NATURAL_TYPE(ReturnTypeInfo.type)==DEF_OBJECT){
    133                 if(ReturnTypeInfo.u.lpIndex != pReturnTypeInfo->u.lpIndex) return 0;
     134            if(NATURAL_TYPE(ReturnTypeInfo.type)==DEF_OBJECT
     135                || NATURAL_TYPE(ReturnTypeInfo.type)==DEF_STRUCT ){
     136                    if(ReturnTypeInfo.u.lpIndex != pReturnTypeInfo->u.lpIndex) return 0;
    134137            }
    135138        }
     
    145148    psi=0;
    146149
    147     foreach( psi, subs ){
    148 
    149         TYPEINFO ReturnTypeInfo;
    150         ReturnTypeInfo.type=psi->ReturnType;
    151         ReturnTypeInfo.u.lpIndex=psi->u.ReturnIndex;
    152 
    153         //エラーチェック
    154         if(_overload_check(psi->pParmInfo,psi->ParmNum,&ReturnTypeInfo,OVERLOAD_LEVEL1)){
    155             if(sw){
    156                 SetError(52,name,cp);
    157                 return 0;
    158             }
    159             sw=1;
    160             break;
    161         }
    162     }
    163 
    164     if(!sw){
    165         foreach( psi, subs ){
     150    for( int level=OVERLOAD_MIN_LEVEL; level<=OVERLOAD_MAX_LEVEL; level++ ){
     151        foreach( SUBINFO *temp_psi, subs ){
    166152
    167153            TYPEINFO ReturnTypeInfo;
    168             ReturnTypeInfo.type=psi->ReturnType;
    169             ReturnTypeInfo.u.lpIndex=psi->u.ReturnIndex;
     154            ReturnTypeInfo.type=temp_psi->ReturnType;
     155            ReturnTypeInfo.u.lpIndex=temp_psi->u.ReturnIndex;
    170156
    171157            //エラーチェック
    172             if(_overload_check(psi->pParmInfo,psi->ParmNum,&ReturnTypeInfo,OVERLOAD_LEVEL2)){
     158            if(_overload_check(temp_psi->pParmInfo,temp_psi->ParmNum,&ReturnTypeInfo,level)){
    173159                if(sw){
    174160                    SetError(52,name,cp);
     
    176162                }
    177163                sw=1;
     164
     165                psi = temp_psi;
    178166                break;
    179167            }
    180168        }
    181     }
    182 
    183     if(!sw){
    184         foreach( psi, subs ){
    185 
    186             TYPEINFO ReturnTypeInfo;
    187             ReturnTypeInfo.type=psi->ReturnType;
    188             ReturnTypeInfo.u.lpIndex=psi->u.ReturnIndex;
    189 
    190             //エラーチェック
    191             if(_overload_check(psi->pParmInfo,psi->ParmNum,&ReturnTypeInfo,OVERLOAD_LEVEL3)){
    192                 if(sw){
    193                     SetError(52,name,cp);
    194                     return 0;
    195                 }
    196                 sw=1;
    197                 break;
    198             }
    199         }
     169
     170        if( sw ) break;
    200171    }
    201172
     
    212183    psi=0;
    213184
    214     foreach( psi, subs ){
    215 
    216         //エラーチェック
    217         if(_overload_check(psi->pParmInfo,psi->ParmNum,NULL,OVERLOAD_LEVEL1)){
    218             if(sw){
    219                 return OverloadSolutionWithReturnType(name,subs);
    220             }
    221             sw=1;
    222             break;
    223         }
    224     }
    225 
    226     if(!sw){
    227         foreach( psi, subs ){
     185    for( int level=OVERLOAD_MIN_LEVEL; level<=OVERLOAD_MAX_LEVEL; level++ ){
     186
     187        foreach( SUBINFO *temp_psi, subs ){
    228188
    229189            //エラーチェック
    230             if(_overload_check(psi->pParmInfo,psi->ParmNum,NULL,OVERLOAD_LEVEL2)){
     190            if(_overload_check(temp_psi->pParmInfo,temp_psi->ParmNum,NULL,level)){
    231191                if(sw){
    232192                    return OverloadSolutionWithReturnType(name,subs);
    233193                }
    234194                sw=1;
    235                 break;
    236             }
    237         }
    238     }
    239 
    240     if(!sw){
    241         foreach( psi, subs ){
    242 
    243             //エラーチェック
    244             if(_overload_check(psi->pParmInfo,psi->ParmNum,NULL,OVERLOAD_LEVEL3)){
    245                 if(sw){
    246                     return OverloadSolutionWithReturnType(name,subs);
    247                 }
    248                 sw=1;
    249                 break;
    250             }
    251         }
     195
     196                psi = temp_psi;
     197            }
     198        }
     199
     200        if( sw ) break;
    252201    }
    253202
  • BasicCompiler_Common/Subroutine.cpp

    r54 r64  
    460460    _int64 i64data;
    461461    type = StaticCalculation( true, temporary, 0, &i64data, &lpIndex );
    462     if( type != DEF_PTR_BYTE ){
     462    if( type != DEF_PTR_CHAR ){
    463463        SetError(1,NULL,NowLine);
    464464        return;
     
    483483    if( temporary[0] ){
    484484        type = StaticCalculation( true, temporary, 0, &i64data, &lpIndex );
    485         if( type != DEF_PTR_BYTE ){
     485        if( type != DEF_PTR_CHAR ){
    486486            SetError(1,NULL,NowLine);
    487487            return;
     
    604604        i+=2;
    605605        pdi->ReturnType=GetTypeFixed(buffer+i,&pdi->u.ReturnIndex);
    606         if(pdi->ReturnType==-1) SetError(3,buffer+i,NowLine);
     606        if(pdi->ReturnType==DEF_NON) SetError(3,buffer+i,NowLine);
    607607        if(pdi->ReturnType==DEF_OBJECT) SetError(40,NULL,NowLine);
    608608    }
    609609    else if(buffer[i]) SetError(1,NULL,NowLine);
    610     else pdi->ReturnType=-1;
     610    else pdi->ReturnType=DEF_NON;
    611611
    612612    pdi->pos=NowLine;
     
    635635        }
    636636        else{
    637             if(NATURAL_TYPE(ppi1[i].type)==DEF_OBJECT){
     637            if(NATURAL_TYPE(ppi1[i].type)==DEF_OBJECT
     638                || NATURAL_TYPE(ppi1[i].type)==DEF_STRUCT ){
    638639                if(ppi1[i].u.index!=ppi2[i].u.index) return 1;
    639640            }
     
    827828                }
    828829                psi->ReturnType=GetTypeFixed(temporary,&psi->u.ReturnIndex);
    829                 if(psi->ReturnType==-1) SetError(3,temporary,NowLine);
     830                if(psi->ReturnType==DEF_NON) SetError(3,temporary,NowLine);
    830831
    831832                sw_as=1;
     
    842843    else{
    843844        //戻り値なしのSub定義
    844         psi->ReturnType=-1;
     845        psi->ReturnType=DEF_NON;
    845846        psi->u.ReturnIndex=-1;
    846847    }
     
    11291130    }
    11301131
    1131     //リアルパラメータ領域を取得(_System_LocalThis、_System_ReturnValueを考慮して2つだけ多く確保する)
     1132    //リアルパラメータ領域を取得(_System_LocalThisを考慮して2つだけ多く確保する)
    11321133    psi->pRealParmInfo=(PARAMETER_INFO *)HeapAlloc(hHeap,0,(psi->ParmNum+2)*sizeof(PARAMETER_INFO));
    11331134    psi->RealParmNum=0;
     
    11471148    }
    11481149
    1149     if(psi->ReturnType==DEF_OBJECT && psi->isReturnRef == false){
     1150    if(psi->ReturnType==DEF_STRUCT){
    11501151        i = psi->RealParmNum;
    11511152
    1152         //実体オブジェクトを戻り値として持つ場合
     1153        //構造体を戻り値として持つ場合
    11531154        //※第一パラメータ(Thisポインタありの場合は第二パラメータ)を戻り値用の参照宣言にする
    11541155
     
    11561157            psi->pRealParmInfo[i].name="_System_ReturnValue";
    11571158        else psi->pRealParmInfo[i].name=psi->name;
    1158         psi->pRealParmInfo[i].type=DEF_OBJECT;
     1159        psi->pRealParmInfo[i].type=DEF_STRUCT;
    11591160        psi->pRealParmInfo[i].u.index=psi->u.ReturnIndex;
    11601161        psi->pRealParmInfo[i].bByVal=0;
     
    15211522            }
    15221523            pi->ReturnType=GetTypeFixed(temporary,&pi->u.ReturnIndex);
    1523             if(pi->ReturnType==-1) SetError(3,temporary,cp);
    1524             if(pi->ReturnType==DEF_OBJECT) SetError(40,NULL,cp);
     1524            if(pi->ReturnType==DEF_NON) SetError(3,temporary,cp);
    15251525        }
    15261526        else pi->ReturnType=DEF_DOUBLE;
    15271527    }
    1528     else pi->ReturnType=-1;
     1528    else pi->ReturnType=DEF_NON;
    15291529
    15301530    return ProcPtrInfoNum-1;
  • BasicCompiler_Common/Variable.cpp

    r63 r64  
    157157    else if(IsPtrType(type))        return PTR_SIZE;
    158158
    159     else if(type==DEF_OBJECT){
     159    else if( type == DEF_STRUCT ){
    160160        CClass *pobj_c;
    161161        pobj_c=(CClass *)lpIndex;
    162         if(!pobj_c) return 0;
     162        if(!pobj_c){
     163            SetError(300,NULL,cp);
     164            return 0;
     165        }
     166
    163167        return pobj_c->GetSize();
     168    }
     169
     170    else if(type==DEF_OBJECT){
     171        return PTR_SIZE;
    164172    }
    165173    else{
     
    232240    if(pobj_c){
    233241        *lpNum=(LONG_PTR)pobj_c;
    234         return DEF_OBJECT;
     242
     243        if( pobj_c->IsStructure() ){
     244            return DEF_STRUCT;
     245        }
     246        else{
     247            return DEF_OBJECT;
     248        }
    235249    }
    236250
     
    282296
    283297    //オブジェクト
    284     else if(type==DEF_OBJECT){
     298    else if(type==DEF_OBJECT || type==DEF_STRUCT){
    285299        if(lpIndex==0) lstrcpy(name,"non");
    286300        else{
     
    296310        else{
    297311            extern PROCPTRINFO *pProcPtrInfo;
    298             if(pProcPtrInfo[lpIndex].ReturnType==-1)
     312            if(pProcPtrInfo[lpIndex].ReturnType==DEF_NON)
    299313                lstrcpy(name,"*Sub");
    300314            else lstrcpy(name,"*Function");
     
    316330}
    317331
    318 bool FormatUseProcReturnObject( const char *term, char *procName, char *parameter, int &RefType, char *member ){
     332bool FormatUseProcReturnObject( const char *term, char *procName, char *parameter, CClass::RefType &refType, char *member ){
    319333    int p1 = 0, p2 = 0;
    320334
     
    323337        if( term[i] == '[' ){
    324338            i = JumpStringInBracket( term, i + 1 );
     339            if( term[i] == '\0' ) break;
    325340            continue;
    326341        }
     
    328343            int temp_p = i;
    329344            i = JumpStringInPare( term, i + 1 ) + 1;
     345            if( term[i] == '\0' ) break;
    330346            if( term[i] == '.'
    331347                || term[i] == 1 && term[i] == ESC_PSMEM ){
     
    348364    //参照タイプ
    349365    if( term[p2] == '.' ){
    350         RefType = DEF_OBJECT;
     366        refType = CClass::Dot;
    351367    }
    352368    else{
    353         RefType = DEF_PTR_OBJECT;
     369        refType = CClass::Pointer;
    354370        p2++;
    355371    }
     
    361377}
    362378
    363 BOOL GetVarFormatString(char *buffer,char *array,char *array2,char *NestMember,int *pRefType){
     379BOOL GetVarFormatString(char *buffer,char *array,char *array2,char *NestMember,CClass::RefType &refType){
    364380    extern int cp;
    365381    int i,i2,i3;
     
    369385    array2[0]=0;
    370386    NestMember[0]=0;
    371     *pRefType=0;
    372387    for(i=0;;i++){
    373388        if(buffer[i]=='\"'){
     
    428443        if(buffer[i]=='.'){
    429444            lstrcpy(NestMember,buffer+i+1);
    430             *pRefType=DEF_OBJECT;
     445            refType = CClass::Dot;
    431446            buffer[i]=0;
    432447            break;
     
    434449        if(buffer[i]==1&&buffer[i+1]==ESC_PSMEM){
    435450            lstrcpy(NestMember,buffer+i+2);
    436             *pRefType=DEF_PTR_OBJECT;
     451            refType = CClass::Pointer;
    437452            buffer[i]=0;
    438453            break;
     
    614629    char lpPtrOffset[VN_SIZE];      //第2次配列
    615630    char NestMember[VN_SIZE];   //入れ子メンバ
    616     int object_type;            //"."参照のときは0、"->"参照のときは1
     631    CClass::RefType refType = CClass::Non;
    617632    lstrcpy(VarName,member);
    618     if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember,&object_type)) return 0;
     633    if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember,refType)) return 0;
    619634
    620635    for(i=0;i<pobj_c->iMemberNum;i++){
     
    664679    }
    665680
    666     if(object_type){
     681    if( refType != CClass::Non ){
    667682        //入れ子構造の場合
    668683
     
    704719
    705720
    706     int RefType;
    707     if( FormatUseProcReturnObject( variable, VarName, array, RefType, member ) ){
     721    CClass::RefType refType;
     722    if( FormatUseProcReturnObject( variable, VarName, array, refType, member ) ){
    708723        // 戻り値オブジェクトのメンバを直接参照しているとき
    709724        //例: func().member
     
    723738
    724739    lstrcpy(VarName,variable);
    725     GetVarFormatString(VarName,array,lpPtrOffset,member,&RefType);
     740    GetVarFormatString(VarName,array,lpPtrOffset,member,refType);
    726741
    727742    int *pSubScripts;
     
    825840        char tempMember[VN_SIZE];
    826841        char tempArray[VN_SIZE];
    827         GetVarFormatString(temporary,tempArray,lpPtrOffset,tempMember,&i);
     842        {
     843            CClass::RefType refType;
     844            GetVarFormatString(temporary,tempArray,lpPtrOffset,tempMember,refType);
     845        }
    828846
    829847        char temp2[VN_SIZE];
     
    897915
    898916    if(member[0]){
    899         if(NATURAL_TYPE(type)==DEF_OBJECT)
    900             return GetMemberType((CClass *)lpIndex,member,plpIndex,0,bError);
     917        if( NATURAL_TYPE(type)==DEF_OBJECT
     918            || NATURAL_TYPE(type)==DEF_STRUCT){
     919                return GetMemberType((CClass *)lpIndex,member,plpIndex,0,bError);
     920        }
    901921    }
    902922
     
    921941}
    922942
    923 BOOL GetVarOffsetReadOnly(const char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss){
     943BOOL GetVarOffsetReadOnly(const char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss ){
    924944    //読み取り専用で変数へアクセス
    925945    return GetVarOffset(
     
    932952        pss);
    933953}
    934 BOOL GetVarOffsetReadWrite(const char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss){
     954BOOL GetVarOffsetReadWrite(const char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss ){
    935955    //読み書き両用で変数へアクセス
    936956    return GetVarOffset(
     
    10951115    }
    10961116
     1117    /*
     1118    TODO: 消す
    10971119    if( pTypeInfo->type == DEF_OBJECT && InitBuf[0] != '\0' && InitBuf[0] != '[' && isRef == false ){
    10981120        if( pTypeInfo->u.pobj_Class->GetCopyConstructorMethod() ){
     
    11011123            InitBuf[0] = 0;
    11021124        }
    1103     }
     1125    }*/
    11041126
    11051127    GetArrange(variable,VarName,SubScripts);
     
    11911213    lstrcpy(pVar->ConstractParameter,ConstractParameter);
    11921214
    1193     if(InitBuf[0]||dwFlag==DIMFLAG_INITDEBUGVAR){
    1194         //初期バッファがあるとき
    1195         pVar->offset=AllInitGlobalVarSize;
    1196         AllInitGlobalVarSize+=VarSize;
    1197     }
    1198     else{
    1199         //初期バッファがないとき
    1200         pVar->offset=AllGlobalVarSize | 0x80000000;
    1201         AllGlobalVarSize+=VarSize;
    1202     }
    1203 
    12041215    //レキシカルスコープ
    12051216    pVar->ScopeLevel=obj_LexScopes.GetNowLevel();
     
    12101221    pVar->source_code_address=cp;
    12111222
    1212     //初期バッファにデータをセット
    1213     extern BYTE *initGlobalBuf;
    1214     initGlobalBuf=(BYTE *)HeapReAlloc(hHeap,
    1215         HEAP_ZERO_MEMORY,
    1216         initGlobalBuf,
    1217         AllInitGlobalVarSize);
     1223    //アラインメントを考慮
     1224    int alignment = 0;
     1225    if( pVar->type==DEF_STRUCT ){
     1226        alignment = pVar->u.pobj_c->iAlign;
     1227    }
     1228
     1229    if(InitBuf[0]||dwFlag==DIMFLAG_INITDEBUGVAR){
     1230        //初期バッファがあるとき
     1231
     1232        if( alignment ){
     1233            if( AllInitGlobalVarSize % alignment ){
     1234                AllInitGlobalVarSize += alignment - (AllInitGlobalVarSize % alignment);
     1235            }
     1236        }
     1237
     1238        pVar->offset=AllInitGlobalVarSize;
     1239        AllInitGlobalVarSize+=VarSize;
     1240    }
     1241    else{
     1242        //初期バッファがないとき
     1243
     1244        if( alignment ){
     1245            if( AllGlobalVarSize % alignment ){
     1246                AllGlobalVarSize += alignment - (AllGlobalVarSize % alignment);
     1247            }
     1248        }
     1249
     1250        pVar->offset=AllGlobalVarSize | 0x80000000;
     1251        AllGlobalVarSize+=VarSize;
     1252    }
     1253
    12181254    if(InitBuf[0]){
    1219         if( pVar->type == DEF_OBJECT && InitBuf[0] != '[' ){
    1220             //単発式が初期値のオブジェクトの場合
    1221             //初期値をコピーコンストラクタに渡す
    1222 
    1223             if( isRef ){
    1224                 SetRefVariable( name, InitBuf );
    1225             }
    1226         }
    1227         else{
    1228             int result = SetInitGlobalData(pVar->offset,
     1255        int result = 0;
     1256        if( pVar->type != DEF_OBJECT ){
     1257            //初期バッファにデータをセット
     1258            extern BYTE *initGlobalBuf;
     1259            initGlobalBuf=(BYTE *)HeapReAlloc(hHeap,
     1260                HEAP_ZERO_MEMORY,
     1261                initGlobalBuf,
     1262                AllInitGlobalVarSize);
     1263
     1264            result = SetInitGlobalData(pVar->offset,
    12291265                pVar->type,
    12301266                pVar->u.index,
    12311267                pVar->SubScripts,
    12321268                InitBuf);
    1233 
    1234             if(!result){
    1235                 //動的な式だった場合は代入演算を行う
    1236 
    1237                 //初期代入時のみ、書き込みアクセスを許可する
    1238                 bool bConstBack = pVar->bConst;
    1239                 pVar->bConst = false;
    1240 
    1241                 //代入
    1242                 char temporary[8192];
    1243                 sprintf(temporary,"%s=%s",name,InitBuf);
    1244                 OpcodeCalc(temporary);
    1245 
    1246                 //アクセス制限を元に戻す
    1247                 pVar->bConst = bConstBack;
    1248             }
     1269        }
     1270
     1271        if(!result){
     1272            //動的な式だった場合は代入演算を行う
     1273
     1274            //初期代入時のみ、書き込みアクセスを許可する
     1275            bool bConstBack = pVar->bConst;
     1276            pVar->bConst = false;
     1277
     1278            //代入
     1279            char temporary[8192];
     1280            sprintf(temporary,"%s=%s",name,InitBuf);
     1281            OpcodeCalc(temporary);
     1282
     1283            //アクセス制限を元に戻す
     1284            pVar->bConst = bConstBack;
    12491285        }
    12501286    }
     
    12601296
    12611297/*
     1298    TODO: 消す
    12621299    if(pTypeInfo->type==DEF_OBJECT){
    12631300        //利用対象のクラスコンストラクタ、デストラクタに使用チェックをつける
  • BasicCompiler_Common/Variable.h

    r62 r64  
    1616void GetOriginalTypeName(char *buffer);
    1717BOOL GetTypeName(int type,LONG_PTR lpIndex,char *name);
    18 bool FormatUseProcReturnObject( const char *term, char *procName, char *parameter, int &RefType, char *member );
    19 BOOL GetVarFormatString(char *buffer,char *array,char *array2,char *NestMember,int *pRefType);
     18bool FormatUseProcReturnObject( const char *term, char *procName, char *parameter, CClass::RefType &refType, char *member );
     19BOOL GetVarFormatString(char *buffer,char *array,char *array2,char *NestMember, CClass::RefType &refType );
    2020void GetArrayElement(char *buffer,char *variable,char *array_element);
    2121BOOL CheckVarNameError(char *name,int NowLine);
  • BasicCompiler_Common/calculation.cpp

    r55 r64  
    524524                        StrPtr[pnum][i2]=0;
    525525
    526                         type[pnum]=DEF_PTR_BYTE;
     526                        type[pnum]=DEF_PTR_CHAR;
    527527                        before_index[pnum]=LITERAL_STRING;
    528528                    }
     
    538538                        StrPtr[pnum][i2]=0;
    539539
    540                         type[pnum]=DEF_PTR_BYTE;
     540                        type[pnum]=DEF_PTR_CHAR;
    541541                        before_index[pnum]=LITERAL_STRING;
    542542                    }
    543                     else if(IsVariableTopChar(Parms[0])||Parms[0]=='*'){
     543                    else if(IsVariableTopChar(Parms[0])||Parms[0]=='*'||(Parms[0]=='.'&&IsVariableTopChar(Parms[1]))){
    544544                        if(bDebuggingWatchList){
    545545                            //////////////////////////
     
    11871187    return -1;
    11881188}
    1189 BOOL IsStringObjectType(TYPEINFO *pTypeInfo){
    1190     if(pTypeInfo->type==DEF_OBJECT){
    1191         if(lstrcmp(pTypeInfo->u.pobj_Class->name,"String")==0){
     1189bool IsStringObjectType(const TYPEINFO &TypeInfo){
     1190    if(TypeInfo.type==DEF_OBJECT){
     1191        if(lstrcmp(TypeInfo.u.pobj_Class->name,"String")==0){
    11921192            return 1;
    11931193        }
     
    12091209        if(psi->ParmNum==2){
    12101210            TYPEINFO TypeInfo={psi->pParmInfo[1].type,psi->pParmInfo[1].u.index};
    1211             if(IsStringObjectType(&TypeInfo)){
     1211            if(IsStringObjectType( TypeInfo )){
    12121212                bRet=1;
    12131213                goto finish;
     
    12771277                        TypeInfo.type=pdi->ReturnType;
    12781278                        TypeInfo.u.lpIndex=pdi->u.ReturnIndex;
    1279                         if(IsStringObjectType(&TypeInfo)) return 1;
     1279                        if(IsStringObjectType( TypeInfo )) return 1;
    12801280                        return 0;
    12811281                    }
     
    12871287                        TypeInfo.type=psi->ReturnType;
    12881288                        TypeInfo.u.lpIndex=psi->u.ReturnIndex;
    1289                         if(IsStringObjectType(&TypeInfo)) return 1;
     1289                        if(IsStringObjectType(TypeInfo)) return 1;
    12901290                        return 0;
    12911291                    }
  • BasicCompiler_Common/common.h

    r63 r64  
    546546BOOL GetConstCalcBuffer(char *name,char *Parameter,char *pCalcBuffer);
    547547DWORD GetConstValue(char *name,double *dbl,char *buffer,LONG_PTR *plpIndex);
    548 BOOL IsStringObjectType(TYPEINFO *pTypeInfo);
     548bool IsStringObjectType(const TYPEINFO &TypeInfo);
    549549BOOL IsStringSubsituation(CClass *pobj_c);
    550550int IsStrCalculation(char *Command);
     
    615615//error.cpp
    616616void SetError(int ErrorNum,const char *KeyWord,int pos);
     617void SetError();
    617618void CompileMessage(char *buffer);
    618619bool CheckDifferentType(const int VarType,const LONG_PTR lpVarIndex,const int CalcType,const LONG_PTR lpCalcIndex,const char *pszFuncName,const int ParmNum);
  • BasicCompiler_Common/error.cpp

    r59 r64  
    183183    if(num==131) lstrcpy(msg,"Const定義されたメソッド内でクラスメンバへの書き込みアクセスはできません。");
    184184    if(num==132) lstrcpy(msg,"明示的なコンストラクタ呼び出しと初期値の指定を同時に行うことはできません。");
     185    if(num==133) lstrcpy(msg,"Thisに代入はできません。");
    185186
    186187    //Enum関連
     
    359360    ErrorNum++;
    360361}
     362void SetError(){
     363    SetError(300,NULL,cp);
     364}
    361365void CompileMessage(char *buffer){
    362366    SetError(-2,buffer,-1);
     
    397401
    398402bool CheckDifferentType(const int VarType,const LONG_PTR lpVarIndex,int CalcType,const LONG_PTR lpCalcIndex,const char *pszFuncName,const int ParmNum){
     403
     404    if(VarType==DEF_STRUCT||CalcType==DEF_STRUCT){
     405        //いずれかが構造体場合
     406        if( VarType != CalcType || lpVarIndex != lpCalcIndex ){
     407            DifferentTypeError(VarType,lpVarIndex,CalcType,lpCalcIndex,3,pszFuncName,ParmNum);
     408            return false;
     409        }
     410    }
    399411
    400412    if(VarType==DEF_OBJECT||CalcType==DEF_OBJECT){
  • ProjectEditor/WindowControl.cpp

    r3 r64  
    943943            }
    944944            else if(pMenuInfo[i2].type==MFT_SEPARATOR){
    945                 sprintf(Command+i,"InsMenu %s,0,MF_BYPOSITION\r\n",
     945                sprintf(Command+i,"InsMenu %s,0,MF_BYPOSITION,\"\"\r\n",
    946946                    MenuHandle);
    947947                i+=lstrlen(Command+i);
Note: See TracChangeset for help on using the changeset viewer.