Ignore:
Timestamp:
Jan 13, 2007, 4:26:50 AM (18 years ago)
Author:
dai_9181
Message:

_System_LocalThis(見えないThisポインタパラメータ)を通常のパラメータ保有領域ではなく、リアルパラメータ保有領域に移動した。
メソッドとグローバル関数のオーバーロードに対応(DLL関数オーバーロードには未対応)。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler_Common/Subroutine.cpp

    r30 r31  
    717717    psi->ParmNum=0;
    718718
    719     if(pobj_c&&bStatic==0){
    720         //オブジェクトメンバの場合は、第一パラメータをThisポインタ引き渡し用として利用
    721         psi->pParmInfo[psi->ParmNum].name=(char *)HeapAlloc(hHeap,0,lstrlen("_System_LocalThis")+1);
    722         lstrcpy(psi->pParmInfo[psi->ParmNum].name,"_System_LocalThis");
    723         psi->pParmInfo[psi->ParmNum].type=DEF_PTR_VOID;
    724         psi->pParmInfo[psi->ParmNum].u.index=-1;
    725         psi->pParmInfo[psi->ParmNum].bByVal=1;
    726         psi->pParmInfo[psi->ParmNum].bArray=0;
    727         psi->pParmInfo[psi->ParmNum].SubScripts[0]=-1;
    728 
    729         psi->ParmNum++;
    730     }
    731 
    732719    //パラメータ
    733720    if(buffer[i]!='('){
     
    1008995    }
    1009996
     997    //リアルパラメータ領域を取得(_System_LocalThis、_System_ReturnValueを考慮して2つだけ多く確保する)
     998    psi->pRealParmInfo=(PARAMETER_INFO *)HeapAlloc(hHeap,0,(psi->ParmNum+2)*sizeof(PARAMETER_INFO));
     999    psi->RealParmNum=0;
     1000
     1001    if(pobj_c&&bStatic==0){
     1002        i = psi->RealParmNum;
     1003
     1004        //オブジェクトメンバの場合は、第一パラメータを_System_LocalThis引き渡し用として利用
     1005        psi->pRealParmInfo[i].name = "_System_LocalThis";
     1006        psi->pRealParmInfo[i].type=DEF_PTR_VOID;
     1007        psi->pRealParmInfo[i].u.index=-1;
     1008        psi->pRealParmInfo[i].bByVal=1;
     1009        psi->pRealParmInfo[i].bArray=0;
     1010        psi->pRealParmInfo[i].SubScripts[0]=-1;
     1011
     1012        psi->RealParmNum++;
     1013    }
     1014
    10101015    if(psi->ReturnType==DEF_OBJECT){
    1011         //オブジェクト インスタンスを戻り値として持つ場合
     1016        i = psi->RealParmNum;
     1017
     1018        //実体オブジェクトを戻り値として持つ場合
    10121019        //※第一パラメータ(Thisポインタありの場合は第二パラメータ)を戻り値用の参照宣言にする
    1013 
    1014         psi->RealParmNum=psi->ParmNum+1;
    1015         psi->RealSecondParmNum=psi->SecondParmNum+1;
    1016 
    1017         psi->pRealParmInfo=(PARAMETER_INFO *)HeapAlloc(hHeap,0,(psi->RealParmNum+1)*sizeof(PARAMETER_INFO));
    1018 
    1019         i=0;
    1020         if(pobj_c&&bStatic==0){
    1021             psi->pRealParmInfo[0]=psi->pParmInfo[0];
    1022             i++;
    1023         }
    10241020
    10251021        if(psi->name[0]==1&&psi->name[1]==ESC_OPERATOR)
     
    10311027        psi->pRealParmInfo[i].bArray=0;
    10321028        psi->pRealParmInfo[i].SubScripts[0]=-1;
    1033         i++;
    1034 
    1035         for(;i<psi->RealParmNum;i++){
    1036             psi->pRealParmInfo[i]=psi->pParmInfo[i-1];
    1037         }
    1038     }
    1039     else{
    1040         psi->pRealParmInfo=psi->pParmInfo;
    1041         psi->RealParmNum=psi->ParmNum;
    1042         psi->RealSecondParmNum=psi->SecondParmNum;
     1029       
     1030        psi->RealParmNum++;
     1031    }
     1032
     1033    //パラメータをコピー
     1034    for( i = 0; i < psi->ParmNum; i++, psi->RealParmNum++ ){
     1035        psi->pRealParmInfo[psi->RealParmNum]=psi->pParmInfo[i];
    10431036    }
    10441037
     
    11911184        HeapDefaultFree(psi->pParmInfo[i2].name);
    11921185    }
    1193     if(psi->pRealParmInfo!=psi->pParmInfo) HeapDefaultFree(psi->pRealParmInfo);
     1186    HeapDefaultFree(psi->pRealParmInfo);
    11941187    if(psi->pParmInfo) HeapDefaultFree(psi->pParmInfo);
    11951188    psi->pRealParmInfo=0;
Note: See TracChangeset for help on using the changeset viewer.