Changeset 399 in dev for trunk/abdev/BasicCompiler64


Ignore:
Timestamp:
Feb 26, 2008, 3:16:40 AM (17 years ago)
Author:
dai_9181
Message:

関数の戻り値がクラス型のとき、直接インデクサ指定できるような対応を行った。ただし、この対応は暫定的なものであるため、後ほど改修が必要。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler64/NumOpe.cpp

    r370 r399  
    146146    if(ArrayElements[0]){
    147147        Type classType;
    148         GetMemberType( leftType, VarName, classType, 0, false );
     148        if( VarName[0] == '\0' )
     149        {
     150            classType = leftType;
     151        }
     152        else
     153        {
     154            GetMemberType( leftType, VarName, classType, 0, false );
     155        }
    149156        if( classType.IsObject() )
    150157        {
     
    152159            compiler.codeGenerator.op_mov_RR( REG_R11, useReg );
    153160
    154             RELATIVE_VAR relativeVar;
    155             relativeVar.dwKind=VAR_DIRECTMEM;
    156 
    157             if( !_member_offset(
    158                 true,   //エラー表示あり
    159                 false,  //読み込み専用
    160                 leftType,
    161                 VarName,&relativeVar,classType,0))
     161            if( VarName[0] )
    162162            {
    163                 return false;
    164             }
    165 
    166             // オブジェクトメンバのポインタをraxにコピー
    167             if( !VarToReg( relativeVar, baseType, resultType ) ){
    168                 SetError(11,termFull,cp);
     163                RELATIVE_VAR relativeVar;
     164                relativeVar.dwKind=VAR_DIRECTMEM;
     165
     166                if( !_member_offset(
     167                    true,   //エラー表示あり
     168                    false,  //読み込み専用
     169                    leftType,
     170                    VarName,&relativeVar,classType,0))
     171                {
     172                    return false;
     173                }
     174
     175                // オブジェクトメンバのポインタをraxにコピー
     176                if( !VarToReg( relativeVar, baseType, resultType ) ){
     177                    SetError(11,termFull,cp);
     178                }
     179            }
     180            else
     181            {
     182                // オブジェクトメンバのポインタは既にraxに入っている
    169183            }
    170184
     
    238252        const UserProc *pUserProc = OverloadSolutionWithStrParam(termFull,userProcs,parameter,termLeft);
    239253
    240         if( pUserProc ){
     254        if( pUserProc )
     255        {
     256            // TODO: この判定処理は暫定(特に[]サーチを行うところが)
     257            if( pUserProc->Params().size() == 0 && parameter[0] && strstr( termFull, "[" ) )
     258            {
     259                TermMemberOpe( leftType, baseType, resultType, termFull, termLeft, methodName );
     260
     261                char temporary[VN_SIZE], temp2[VN_SIZE];
     262                sprintf( temporary, "[%s]", parameter );
     263                sprintf( temp2, "%s.%s", termLeft, methodName );
     264                Type classType = resultType;
     265                return TermMemberOpe( classType, baseType, resultType, termFull, temp2, temporary );
     266            }
    241267
    242268            resultType = pUserProc->ReturnType();
Note: See TracChangeset for help on using the changeset viewer.