Changeset 415 in dev for trunk


Ignore:
Timestamp:
Mar 6, 2008, 11:19:38 PM (16 years ago)
Author:
dai_9181
Message:

代入演算時の左辺に関数呼び出しの戻り値を評価してメンバを取得するようなコードが存在するとき、エラーになってしまっていたので改修した。(32bit版のみ対応)

Location:
trunk/abdev
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler32/Compile_Calc.cpp

    r402 r415  
    545545
    546546    //型を識別
    547     if( !GetVarType(variable,varType,false) ){
     547    if( !GetTermTypeOnlyVariable(variable,varType) ){
    548548
    549549        // プロパティ用のメソッドを呼び出す
     
    593593
    594594    //変数アドレスを取得
    595     if(!GetVarOffsetReadWrite(
    596         variable,
    597         &VarRelativeVar,
    598         varType)) return;
     595    if( !TermOpeOnlyVariable( variable, varType, VarRelativeVar, true ) )
     596    {
     597        SetError();
     598        return;
     599    }
    599600
    600601    if(varType.GetBasicType()&FLAG_PTR){
  • trunk/abdev/BasicCompiler32/Compile_CallProc.cpp

    r370 r415  
    120120                //"->"によってオブジェクトを指定する通常のメンバ関数呼び出し
    121121                Type varType;
    122                 GetVarType( ObjectName, varType, false );
    123                 if( NATURAL_TYPE( varType.GetBasicType() ) == DEF_OBJECT )
     122                if( GetTermType( ObjectName, varType ) )
    124123                {
    125                     pobj_c = &varType.GetClass();
    126                     leftType = varType;
     124                    if( varType.IsObject() )
     125                    {
     126                        pobj_c = &varType.GetClass();
     127                        leftType = varType;
     128                    }
    127129                }
    128                 else
     130
     131                if( !pobj_c )
    129132                {
    130133                    pobj_c=compiler.GetObjectModule().meta.GetClasses().Find(ObjectName);
     
    286289            if(lstrcmpi(ObjectName,"Super")==0) goto InClassMember;
    287290            else{
    288                 RELATIVE_VAR RelativeVar;
    289                 if( pMethod->IsConst() ){
    290                     //Constアクセスが可能なメソッドの場合
    291                     if( !GetVarOffsetReadOnly( ObjectName, &RelativeVar, Type() ) ){
    292                         return false;
    293                     }
     291                bool isLiteral;
     292                if( !TermOpe( ObjectName, Type(), Type(), isLiteral, NULL, NULL, false, !pMethod->IsConst() ) )
     293                {
     294                    return false;
    294295                }
    295                 else{
    296                     //Constアクセスが不可能なメソッドの場合
    297                     if( !GetVarOffsetReadWrite( ObjectName, &RelativeVar, Type() ) ){
    298                         return false;
    299                     }
    300                 }
    301 
    302                 SetVarPtrToEax(&RelativeVar);
    303 
    304                 // 参照を実体ポインタにする
    305                 compiler.codeGenerator.op_mov_RM( sizeof(long), REG_ECX, REG_EAX, 0, MOD_BASE );
     296
     297                // 実態ポインタをeaxにコピー
     298                compiler.codeGenerator.op_mov_RR( REG_ECX, REG_EAX );
    306299            }
    307300        }
  • trunk/abdev/BasicCompiler32/Compile_Statement.cpp

    r408 r415  
    9393    bool isLiteral;
    9494    BOOL bUseHeap;
    95     bool result = TermOpe( leftTerm, Type(), resultType, isLiteral, &bUseHeap, false, NULL, true );
     95    bool result = TermOpe( leftTerm, Type(), resultType, isLiteral, &bUseHeap, NULL, true );
    9696    if( result ){
    9797
  • trunk/abdev/BasicCompiler32/MakePeHdr.cpp

    r407 r415  
    16511651    //リロケーション情報を解放
    16521652    delete pobj_Reloc;
    1653 
    1654     //クラスに関するメモリを解放
    1655     compiler.GetObjectModule().meta.GetClasses().Clear();
    16561653}
  • trunk/abdev/BasicCompiler32/NumOpe.cpp

    r412 r415  
    140140    return true;
    141141}
    142 bool TermMemberOpe( const Type &leftType, const Type &baseType, Type &resultType, const char *termFull, const char *termLeft, const char *member )
     142bool TermMemberOpe( const Type &leftType, const Type &baseType, Type &resultType, const char *termFull, const char *termLeft, const char *member, bool &isVariable, RELATIVE_VAR &relativeVar )
    143143{
    144144    const CClass &objClass = leftType.GetClass();
     
    179179                compiler.codeGenerator.op_mov_RR( REG_ECX, useReg );
    180180
    181                 RELATIVE_VAR relativeVar;
    182                 relativeVar.dwKind=VAR_DIRECTMEM;
     181                RELATIVE_VAR tempRelativeVar;
     182                tempRelativeVar.dwKind=VAR_DIRECTMEM;
    183183
    184184                if( !_member_offset(
     
    186186                    false,  //読み込み専用
    187187                    leftType,
    188                     VarName,&relativeVar,classType,0)){
     188                    VarName,&tempRelativeVar,classType,0)){
    189189                        return false;
    190190                }
    191191
    192192                // オブジェクトメンバのポインタをeaxにコピー
    193                 if( !VarToReg( relativeVar, baseType, resultType ) ){
     193                if( !VarToReg( tempRelativeVar, baseType, resultType ) ){
    194194                    SetError(11,termFull,cp);
    195195                }
     
    225225        compiler.codeGenerator.op_mov_RR( REG_ECX, useReg );
    226226
    227         RELATIVE_VAR relativeVar;
    228227        relativeVar.dwKind=VAR_DIRECTMEM;
    229228
     
    236235        }
    237236
    238         if( !VarToReg( relativeVar, baseType, resultType ) ){
    239             SetError(11,termFull,cp);
    240         }
     237        // 変数として扱う
     238        isVariable = true;
    241239
    242240        return true;
     
    271269
    272270                // まずはプロパティ値を取得
    273                 TermMemberOpe( leftType, baseType, resultType, termFull, termLeft, methodName );
     271                bool dummyIsVariable;
     272                RELATIVE_VAR dummyRelativeVar;
     273                TermMemberOpe( leftType, baseType, resultType, termFull, termLeft, methodName, dummyIsVariable, dummyRelativeVar );
    274274
    275275                // 戻り値のオブジェクトインスタンスのインデクサを呼び出す
     
    278278                sprintf( temp2, "%s.%s", termLeft, methodName );
    279279                Type classType = resultType;
    280                 return TermMemberOpe( classType, baseType, resultType, termFull, temp2, temporary );
     280                return TermMemberOpe( classType, baseType, resultType, termFull, temp2, temporary, isVariable, relativeVar );
    281281            }
    282282
     
    324324    return false;
    325325}
    326 bool TermOpe( const char *term, const Type &baseType, Type &resultType, bool &isLiteral, BOOL *pbUseHeap, bool isWantObject, bool *pIsClassName, bool isProcedureCallOnly ){
     326bool _TermOpe( const char *term, const Type &baseType, Type &resultType, bool &isLiteral, BOOL *pbUseHeap, bool *pIsClassName, bool isProcedureCallOnly, bool &isVariable, RELATIVE_VAR &relativeVar, bool isWriteAccess )
     327{
    327328    char parameter[VN_SIZE];
    328329
     
    364365        }
    365366
    366         if( !TermOpe( termLeft, baseType, leftType, isLiteral, pbUseHeap, true, &isClassName ) ){
     367        if( !TermOpe( termLeft, baseType, leftType, isLiteral, pbUseHeap, &isClassName ) ){
    367368            goto globalArea;
    368369        }
     
    382383        }
    383384
    384         return TermMemberOpe( leftType, baseType, resultType, termFull, termLeft, member );
     385        return TermMemberOpe( leftType, baseType, resultType, termFull, termLeft, member, isVariable, relativeVar );
    385386    }
    386387globalArea:
     
    545546    ////////////////////////////////
    546547
    547     RELATIVE_VAR relativeVar;
    548548    if(GetVarOffset(
    549549        false,  //エラー表示なし
    550         false,  //読み込み専用
     550        isWriteAccess,
    551551        termFull,
    552552        &relativeVar,resultType)){
     
    555555        //////////
    556556
    557         if( !VarToReg( relativeVar, baseType, resultType ) ){
    558             SetError(11,termFull,cp);
    559         }
     557        // 変数として扱う
     558        isVariable = true;
    560559
    561560        isLiteral = false;
     
    610609
    611610    return false;
     611}
     612
     613bool TermOpe( const char *term, const Type &baseType, Type &resultType, bool &isLiteral, BOOL *pbUseHeap, bool *pIsClassName, bool isProcedureCallOnly, bool isWriteAccess )
     614{
     615    RELATIVE_VAR relativeVar;
     616    bool isVariable = false;
     617    bool result = _TermOpe( term, baseType, resultType, isLiteral, pbUseHeap, pIsClassName, isProcedureCallOnly, isVariable, relativeVar, isWriteAccess );
     618
     619    if( isVariable )
     620    {
     621        // 変数の場合はeaxに変数ポインタを格納する
     622        if( !VarToReg( relativeVar, baseType, resultType ) ){
     623            SetError(11,term,cp);
     624        }
     625    }
     626
     627    return result;
     628}
     629bool TermOpeOnlyVariable( const char *term, Type &resultType, RELATIVE_VAR &relativeVar, bool isWriteAccess )
     630{
     631    bool isLiteral, isVariable = false;
     632    bool result = _TermOpe( term, Type(), resultType, isLiteral, NULL, NULL, false, isVariable, relativeVar, isWriteAccess );
     633
     634    if( !isVariable )
     635    {
     636        SetError();
     637    }
     638
     639    return result;
    612640}
    613641
  • trunk/abdev/BasicCompiler32/Opcode.h

    r376 r415  
    5959//NumOpe.cpp
    6060void PushReturnValue(int type);
     61bool TermOpeOnlyVariable( const char *term, Type &resultType, RELATIVE_VAR &relativeVar, bool isWriteAccess );
    6162bool TermOpe(
    6263             const char *term,
     
    6566             bool &isLiteral,
    6667             BOOL *pbUseHeap,
    67              bool isWantObject = false,
    6868             bool *pIsClassName = NULL,
    69              bool isProcedureCallOnly = false );
     69             bool isProcedureCallOnly = false,
     70             bool isWriteAccess = false );
    7071bool NumOpe( int reg,
    7172            const char *expression,
  • trunk/abdev/BasicCompiler_Common/NumOpe_GetType.cpp

    r412 r415  
    298298}
    299299
    300 bool GetMemberTermType( const Type &leftType, const Type &baseType, Type &resultType, const char *termFull, const char *termLeft, const char *member )
     300bool GetMemberTermType( const Type &leftType, const Type &baseType, Type &resultType, const char *termFull, const char *termLeft, const char *member, bool *pIsVariable )
    301301{
    302302    ////////////////////////////////
     
    325325    if( GetMemberType( leftType, member, resultType, 0, false ) ){
    326326        // メンバが見つかったとき
     327
     328        if( pIsVariable )
     329        {
     330            *pIsVariable = true;
     331        }
     332
    327333        return true;
    328334    }
     
    357363}
    358364
    359 bool GetTermType( const char *term, const Type &baseType, Type &resultType, bool &isLiteral, bool *pIsClassName )
     365bool GetTermType( const char *term, const Type &baseType, Type &resultType, bool &isLiteral, bool *pIsClassName, bool *pIsVariable )
    360366{
    361367    char parameter[VN_SIZE];
     
    415421        }
    416422
    417         return GetMemberTermType( leftType, baseType, resultType, termFull, termLeft, member );
     423        return GetMemberTermType( leftType, baseType, resultType, termFull, termLeft, member, pIsVariable );
    418424    }
    419425
     
    551557        isLiteral = false;
    552558
     559        if( pIsVariable )
     560        {
     561            // 変数である
     562            *pIsVariable = true;
     563        }
     564
    553565        return true;
    554566    }
     
    572584
    573585    return false;
     586}
     587
     588bool GetTermType( const char *term, Type &resultType )
     589{
     590    bool isLiteral;
     591    return GetTermType( term, Type(), resultType, isLiteral );
     592}
     593
     594bool GetTermTypeOnlyVariable( const char *term, Type &resultType )
     595{
     596    bool isLiteral, isVariable = false;
     597    bool result = GetTermType( term, Type(), resultType, isLiteral, NULL, &isVariable );
     598    return ( result && isVariable );
    574599}
    575600
  • trunk/abdev/BasicCompiler_Common/common.h

    r400 r415  
    350350int AutoBigCast(int BaseType,int CalcType);
    351351BOOL CheckCalcType(int idCalc,int *type,int sp);
    352 bool GetTermType( const char *term, const Type &baseType, Type &resultType, bool &isLiteral, bool *pIsClassName = NULL );
     352bool GetTermType( const char *term, const Type &baseType, Type &resultType, bool &isLiteral, bool *pIsClassName = NULL, bool *pIsVariable = NULL );
     353bool GetTermType( const char *term, Type &resultType );
     354bool GetTermTypeOnlyVariable( const char *term, Type &resultType );
    353355bool NumOpe_GetType( const char *expression, const Type &baseType, Type &resultType, bool *pIsLiteralCalculation = NULL );
    354356
  • trunk/abdev/BasicCompiler_Common/hash.cpp

    r350 r415  
    7272            //"->"によってオブジェクトを指定する通常のメンバ関数呼び出し
    7373            Type type;
    74             if( GetVarType(ObjName,type,0) ){
    75                 pobj_c = &type.GetClass();
     74            if( GetTermType(ObjName,type) )
     75            {
     76                if( type.IsObject() )
     77                {
     78                    pobj_c = &type.GetClass();
     79                }
    7680            }
    77             else{
     81
     82            if( !pobj_c )
     83            {
    7884                pobj_c=compiler.GetObjectModule().meta.GetClasses().Find(ObjName);
    7985                if( pobj_c ){
Note: See TracChangeset for help on using the changeset viewer.