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

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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{
Note: See TracChangeset for help on using the changeset viewer.