Changeset 75 in dev for BasicCompiler32/OperatorProc.cpp


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

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler32/OperatorProc.cpp

    r73 r75  
    1111
    1212        //call DestructorProcAddr
    13         op_call( method->psi );
     13        op_call( method->pUserProc );
    1414    }
    1515
     
    1818
    1919    //call free
    20     extern SubInfo *pSub_free;
     20    extern UserProc *pSub_free;
    2121    op_call(pSub_free);
    2222}
    2323
    24 int CallOperatorProc(int idCalc,TYPEINFO *pBaseTypeInfo,int *type,LONG_PTR *index_stack,BOOL *bUseHeap,int &sp){
     24int CallOperatorProc(int idCalc,Type *pBaseTypeInfo,int *type,LONG_PTR *index_stack,BOOL *bUseHeap,int &sp){
    2525    //オーバーロードされたオペレータ関数を呼び出す
    2626    CClass *pobj_c;
    2727    pobj_c=(CClass *)index_stack[sp-2];
    2828
    29     std::vector<SubInfo *> subs;
     29    std::vector<UserProc *> subs;
    3030    pobj_c->EnumMethod( idCalc, subs );
    3131    if( subs.size() == 0 ){
     
    4141    int i;
    4242    BOOL bReturnTypeIsObject=1;
    43     TYPEINFO ReturnType={DEF_OBJECT,subs[0]->u.ReturnIndex};
    44     foreach( SubInfo *psi, subs ){
    45         if(psi->ReturnType!=DEF_OBJECT)
     43    Type ReturnType={DEF_OBJECT,subs[0]->ReturnType().GetIndex()};
     44    foreach( UserProc *pUserProc, subs ){
     45        if(pUserProc->ReturnType().IsObject())
    4646            bReturnTypeIsObject=0;
    4747    }
     
    6161    /////////////////////////////////////////////
    6262
    63     PARAMETER_INFO *ppi = (PARAMETER_INFO *)HeapAlloc(hHeap,0,sizeof(PARAMETER_INFO)*3);
    64     int iParmNum=0;
    65 
    66     if(bTwoTerm){
    67         ppi[iParmNum].bArray=0;
    68         ppi[iParmNum].bByVal=0;
    69         ppi[iParmNum].name=0;
    70         ppi[iParmNum].type=type[sp-1];
    71         ppi[iParmNum].u.index=index_stack[sp-1];
    72         ppi[iParmNum].SubScripts[0]=-1;
    73         iParmNum++;
    74     }
    75 
     63    Parameters params;
     64
     65    if(bTwoTerm){
     66        params.push_back( new Parameter( "", Type( type[sp-1], index_stack[sp-1] ) ) );
     67    }
    7668
    7769    //オーバーロードを解決
     
    7971    if(idCalc==CALC_EQUAL) lstrcpy(temporary,"==");
    8072    else GetCalcName(idCalc,temporary);
    81     SubInfo *psi;
    82     psi=OverloadSolution(temporary,subs,ppi,iParmNum,pBaseTypeInfo);
    83 
    84     if(!psi){
    85         HeapDefaultFree(ppi);
     73    Type returnType;
     74    if( pBaseTypeInfo ){
     75        returnType.SetBasicType( pBaseTypeInfo->type );
     76        returnType.SetIndex( pBaseTypeInfo->u.lpIndex );
     77    }
     78    UserProc *pUserProc = OverloadSolution( temporary, subs, params, returnType );
     79
     80    if(!pUserProc){
     81        if(bTwoTerm){
     82            delete params[0];
     83        }
    8684        return -1;
    8785    }
    8886    else{
    8987        //オーバーロードされていないが、パラメータ個数が一致しないとき
    90         if(iParmNum!=psi->params.size()){
    91             HeapDefaultFree(ppi);
     88        if(params.size()!=pUserProc->Params().size()){
     89            if(bTwoTerm){
     90                delete params[0];
     91            }
    9292            return -1;
    9393        }
    9494    }
    9595
    96     for(i=0;i<iParmNum;i++){
     96    for(i=0;i<(int)params.size();i++){
    9797        CheckDifferentType(
    98             psi->params[i]->GetBasicType(),
    99             psi->params[i]->GetIndex(),
    100             ppi[i].type,
    101             ppi[i].u.index,
     98            pUserProc->Params()[i]->GetBasicType(),
     99            pUserProc->Params()[i]->GetIndex(),
     100            params[i]->GetBasicType(),
     101            params[i]->GetIndex(),
    102102            "",
    103103            i);
    104104    }
    105105
    106     HeapDefaultFree(ppi);
     106    if(bTwoTerm){
     107        delete params[0];
     108    }
    107109
    108110    int right_side_size = GetTypeSize(type[sp-1],index_stack[sp-1]);
    109111
    110112    if(bTwoTerm){
    111         if( psi->realParams[1]->IsStruct() &&psi->realParams[1]->IsRef() == false ){
     113        if( pUserProc->RealParams()[1]->IsStruct() &&pUserProc->RealParams()[1]->IsRef() == false ){
    112114            //一時オブジェクトはメソッド内で破棄される
    113115            bUseHeap[sp-1]=0;
     
    116118
    117119
    118     if(psi->ReturnType==DEF_STRUCT){
     120    if( pUserProc->ReturnType().IsStruct() ){
    119121        //////////////////////////////////////////////////////
    120122        // 戻り値に構造体インスタンスを持つ場合
     
    122124        //////////////////////////////////////////////////////
    123125
    124         int object_size = psi->u.Return_pobj_c->GetSize();
     126        int object_size = pUserProc->ReturnType().GetClass().GetSize();
    125127
    126128        //push object_size
     
    128130
    129131        //call calloc
    130         extern SubInfo *pSub_calloc;
     132        extern UserProc *pSub_calloc;
    131133        op_call(pSub_calloc);
    132134
     
    180182        }
    181183
    182         if( psi->realParams[1]->IsRef() ){
     184        if( pUserProc->RealParams()[1]->IsRef() ){
    183185            //一時参照を作成
    184186
     
    191193    }
    192194
    193     if(psi->ReturnType==DEF_STRUCT){
     195    if( pUserProc->ReturnType().IsStruct() ){
    194196        //push ebx
    195197        op_push(REG_EBX);
     
    200202
    201203    //call operator_proc
    202     op_call(psi);
    203 
    204     if(bTwoTerm){
    205         if( psi->realParams[1]->IsRef() ){
     204    op_call(pUserProc);
     205
     206    if(bTwoTerm){
     207        if( pUserProc->RealParams()[1]->IsRef() ){
    206208            //一時参照を破棄
    207209            op_pop( REG_NON );
     
    209211    }
    210212
    211     if(psi->ReturnType!=DEF_NON){
     213    if( !pUserProc->ReturnType().IsNull() ){
    212214        //スタックへプッシュ
    213         PushReturnValue(psi->ReturnType);
     215        PushReturnValue(pUserProc->ReturnType().GetBasicType());
    214216    }
    215217
     
    222224
    223225    sp--;
    224     type[sp-1]=psi->ReturnType;
    225     index_stack[sp-1]=psi->u.ReturnIndex;
    226 
    227     if(psi->ReturnType==DEF_STRUCT){
     226    type[sp-1]=pUserProc->ReturnType().GetBasicType();
     227    index_stack[sp-1]=pUserProc->ReturnType().GetIndex();
     228
     229    if( pUserProc->ReturnType().IsStruct() ){
    228230        //構造体が戻ったときはヒープ領域にインスタンスが格納されている
    229231        //※後にfreeする必要あり
     
    254256    array_bUseHeap[1]=0;
    255257
    256     TYPEINFO BaseTypeInfo={ToType,lpToIndex};
     258    Type BaseTypeInfo={ToType,lpToIndex};
    257259
    258260    int iRet;
     
    272274    SetError(-1,"キャスト演算子がオーバーロードされていません。",cp);
    273275}
    274 void CallIndexerGetterProc(CClass *pobj_Class,char *ObjectName,char *Parameter,TYPEINFO &RetTypeInfo){
    275     std::vector<SubInfo *> subs;
     276void CallIndexerGetterProc(CClass *pobj_Class,char *ObjectName,char *Parameter,Type &RetTypeInfo){
     277    std::vector<UserProc *> subs;
    276278    pobj_Class->EnumMethod( CALC_ARRAY_GET, subs );
    277279    if( subs.size() == 0 ){
     
    280282
    281283    Opcode_CallProc(Parameter,subs[0],0,ObjectName,DEF_OBJECT);
    282     RetTypeInfo.type = subs[0]->ReturnType;
    283     RetTypeInfo.u.lpIndex = subs[0]->u.ReturnIndex;
    284 }
     284    RetTypeInfo.type = subs[0]->ReturnType().GetBasicType();
     285    RetTypeInfo.u.lpIndex = subs[0]->ReturnType().GetIndex();
     286}
Note: See TracChangeset for help on using the changeset viewer.