Ignore:
Timestamp:
Jun 29, 2008, 3:20:40 PM (16 years ago)
Author:
dai_9181
Message:

If/While/Doなどのステートメントに引き渡す式の戻り値がクラス型の場合はBoolean型へのキャストを試みるようにした。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/ab5.0/abdev/compiler_x86/Compile_Statement.cpp

    r537 r676  
    136136
    137137    const PertialSchedule *pIfPertialSchedule = NULL;
    138     if( !NumOpe(Parameter,Type(DEF_BOOLEAN),tempType) ){
    139         //NumOpe内でエラー
    140     }
    141     else if( tempType.IsDouble() ){
    142         //fld qword ptr[esp]
    143         compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
    144 
    145         //push 0
    146         compiler.codeGenerator.op_push_V(0);
    147 
    148         //fild dword ptr[esp]
    149         compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
    150 
    151         //add esp,sizeof(double)+sizeof(long)
    152         compiler.codeGenerator.op_add_esp(sizeof(double)+sizeof(long));
    153 
    154         //fcompp
    155         compiler.codeGenerator.op_fcompp();
    156 
    157         //fnstsw ax
    158         compiler.codeGenerator.op_fnstsw_ax();
    159 
    160         //test ah,40
    161         compiler.codeGenerator.op_test_ah( (char)0x40 );
    162 
    163         //jne (endif、または else まで)
    164         pIfPertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(long), true );
    165     }
    166     else if( tempType.IsSingle() ){
    167         //fld dword ptr[esp]
    168         compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
    169 
    170         //push 0
    171         compiler.codeGenerator.op_push_V(0);
    172 
    173         //fild dword ptr[esp]
    174         compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
    175 
    176         //add esp,sizeof(float)+sizeof(long)
    177         compiler.codeGenerator.op_add_esp(sizeof(float)+sizeof(long));
    178 
    179         //fcompp
    180         compiler.codeGenerator.op_fcompp();
    181 
    182         //fnstsw ax
    183         compiler.codeGenerator.op_fnstsw_ax();
    184 
    185         //test ah,40
    186         compiler.codeGenerator.op_test_ah( (char)0x40 );
    187 
    188         //jne (endif、または else まで)
    189         pIfPertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(long), true );
    190     }
    191     else if( tempType.Is64() ){
    192         //64ビット型
    193 
    194         //pop eax
    195         compiler.codeGenerator.op_pop(REG_EAX);
    196 
    197         //pop ebx
    198         compiler.codeGenerator.op_pop(REG_EBX);
    199 
    200         //cmp eax,0
    201         compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EAX, 0 );
    202 
    203         //jne
    204         const PertialSchedule *pTempPertialSchedule1 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
    205 
    206         //cmp ebx,0
    207         compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EBX, 0 );
    208 
    209         //jne
    210         const PertialSchedule *pTempPertialSchedule2 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
    211 
    212         //jmp (endif、または else までジャンプ)
    213         pIfPertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(long), true );
    214 
    215         compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule1 );
    216         compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule2 );
    217     }
    218     else{
    219         //32ビット型
    220 
    221         //pop eax
    222         compiler.codeGenerator.op_pop(REG_EAX);
    223 
    224         //cmp eax,0
    225         compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EAX, 0 );
    226 
    227         //je (endif、または else まで条件ジャンプ)
    228         pIfPertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(long), true );
     138    bool isNeedHeapFreeStructure;
     139    if( NumOpe( Parameter, Type(DEF_BOOLEAN), tempType, &isNeedHeapFreeStructure ) )
     140    {
     141        if( tempType.IsObject() )
     142        {
     143            // Boolean型にキャストする
     144            Type booleanType( DEF_BOOLEAN );
     145            CallCastOperatorProc( tempType, isNeedHeapFreeStructure, booleanType );
     146            tempType = booleanType;
     147        }
     148
     149        if( tempType.IsDouble() ){
     150            //fld qword ptr[esp]
     151            compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
     152
     153            //push 0
     154            compiler.codeGenerator.op_push_V(0);
     155
     156            //fild dword ptr[esp]
     157            compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
     158
     159            //add esp,sizeof(double)+sizeof(long)
     160            compiler.codeGenerator.op_add_esp(sizeof(double)+sizeof(long));
     161
     162            //fcompp
     163            compiler.codeGenerator.op_fcompp();
     164
     165            //fnstsw ax
     166            compiler.codeGenerator.op_fnstsw_ax();
     167
     168            //test ah,40
     169            compiler.codeGenerator.op_test_ah( (char)0x40 );
     170
     171            //jne (endif、または else まで)
     172            pIfPertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(long), true );
     173        }
     174        else if( tempType.IsSingle() ){
     175            //fld dword ptr[esp]
     176            compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
     177
     178            //push 0
     179            compiler.codeGenerator.op_push_V(0);
     180
     181            //fild dword ptr[esp]
     182            compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
     183
     184            //add esp,sizeof(float)+sizeof(long)
     185            compiler.codeGenerator.op_add_esp(sizeof(float)+sizeof(long));
     186
     187            //fcompp
     188            compiler.codeGenerator.op_fcompp();
     189
     190            //fnstsw ax
     191            compiler.codeGenerator.op_fnstsw_ax();
     192
     193            //test ah,40
     194            compiler.codeGenerator.op_test_ah( (char)0x40 );
     195
     196            //jne (endif、または else まで)
     197            pIfPertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(long), true );
     198        }
     199        else if( tempType.Is64() ){
     200            //64ビット型
     201
     202            //pop eax
     203            compiler.codeGenerator.op_pop(REG_EAX);
     204
     205            //pop ebx
     206            compiler.codeGenerator.op_pop(REG_EBX);
     207
     208            //cmp eax,0
     209            compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EAX, 0 );
     210
     211            //jne
     212            const PertialSchedule *pTempPertialSchedule1 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
     213
     214            //cmp ebx,0
     215            compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EBX, 0 );
     216
     217            //jne
     218            const PertialSchedule *pTempPertialSchedule2 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
     219
     220            //jmp (endif、または else までジャンプ)
     221            pIfPertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(long), true );
     222
     223            compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule1 );
     224            compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule2 );
     225        }
     226        else{
     227            //32ビット型
     228
     229            //pop eax
     230            compiler.codeGenerator.op_pop(REG_EAX);
     231
     232            //cmp eax,0
     233            compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EAX, 0 );
     234
     235            //je (endif、または else まで条件ジャンプ)
     236            pIfPertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(long), true );
     237        }
    229238    }
    230239
     
    359368    const PertialSchedule *pWhilePertialSchedule = NULL;
    360369    Type tempType;
    361     if( !NumOpe(Parameter,Type(),tempType) ){
    362         //ダミー
    363     }
    364     else if( tempType.IsDouble() ){
    365         //fld qword ptr[esp]
    366         compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
    367 
    368         //push 0
    369         compiler.codeGenerator.op_push_V(0);
    370 
    371         //fild dword ptr[esp]
    372         compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
    373 
    374         //add esp,sizeof(double)+sizeof(long)
    375         compiler.codeGenerator.op_add_esp(sizeof(double)+sizeof(long));
    376 
    377         //fcompp
    378         compiler.codeGenerator.op_fcompp();
    379 
    380         //fnstsw ax
    381         compiler.codeGenerator.op_fnstsw_ax();
    382 
    383         //test ah,40
    384         compiler.codeGenerator.op_test_ah( (char)0x40 );
    385 
    386         //jne (Wend まで)
    387         pWhilePertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(long), true );
    388     }
    389     else if( tempType.IsSingle() ){
    390         //fld dword ptr[esp]
    391         compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
    392 
    393         //push 0
    394         compiler.codeGenerator.op_push_V(0);
    395 
    396         //fild dword ptr[esp]
    397         compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
    398 
    399         //add esp,sizeof(float)+sizeof(long)
    400         compiler.codeGenerator.op_add_esp(sizeof(float)+sizeof(long));
    401 
    402         //fcompp
    403         compiler.codeGenerator.op_fcompp();
    404 
    405         //fnstsw ax
    406         compiler.codeGenerator.op_fnstsw_ax();
    407 
    408         //test ah,40h
    409         compiler.codeGenerator.op_test_ah( (char)0x40 );
    410 
    411         //jne (Wend まで)
    412         pWhilePertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(long), true );
    413     }
    414     else if( tempType.Is64() ){
    415         //64ビット型
    416 
    417         //pop eax
    418         compiler.codeGenerator.op_pop(REG_EAX);
    419 
    420         //pop ebx
    421         compiler.codeGenerator.op_pop(REG_EBX);
    422 
    423         //cmp eax,0
    424         compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EAX, 0 );
    425 
    426         //jne
    427         const PertialSchedule *pTempPertialSchedule1 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
    428 
    429         //cmp ebx,0
    430         compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EBX, 0 );
    431 
    432         //jne
    433         const PertialSchedule *pTempPertialSchedule2 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
    434 
    435         //jmp (Wendまでジャンプ)
    436         pWhilePertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(long), true );
    437 
    438         compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule1 );
    439         compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule2 );
    440     }
    441     else{
    442         //その他整数型
    443 
    444         //pop eax
    445         compiler.codeGenerator.op_pop(REG_EAX);
    446 
    447         //cmp eax,0
    448         compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EAX, 0 );
    449 
    450         //je (Wend まで)
    451         pWhilePertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(long), true );
     370    bool isNeedHeapFreeStructure;
     371    if( NumOpe( Parameter, Type(), tempType, &isNeedHeapFreeStructure ) )
     372    {
     373        if( tempType.IsObject() )
     374        {
     375            // Boolean型にキャストする
     376            Type booleanType( DEF_BOOLEAN );
     377            CallCastOperatorProc( tempType, isNeedHeapFreeStructure, booleanType );
     378            tempType = booleanType;
     379        }
     380
     381        if( tempType.IsDouble() ){
     382            //fld qword ptr[esp]
     383            compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
     384
     385            //push 0
     386            compiler.codeGenerator.op_push_V(0);
     387
     388            //fild dword ptr[esp]
     389            compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
     390
     391            //add esp,sizeof(double)+sizeof(long)
     392            compiler.codeGenerator.op_add_esp(sizeof(double)+sizeof(long));
     393
     394            //fcompp
     395            compiler.codeGenerator.op_fcompp();
     396
     397            //fnstsw ax
     398            compiler.codeGenerator.op_fnstsw_ax();
     399
     400            //test ah,40
     401            compiler.codeGenerator.op_test_ah( (char)0x40 );
     402
     403            //jne (Wend まで)
     404            pWhilePertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(long), true );
     405        }
     406        else if( tempType.IsSingle() ){
     407            //fld dword ptr[esp]
     408            compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
     409
     410            //push 0
     411            compiler.codeGenerator.op_push_V(0);
     412
     413            //fild dword ptr[esp]
     414            compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
     415
     416            //add esp,sizeof(float)+sizeof(long)
     417            compiler.codeGenerator.op_add_esp(sizeof(float)+sizeof(long));
     418
     419            //fcompp
     420            compiler.codeGenerator.op_fcompp();
     421
     422            //fnstsw ax
     423            compiler.codeGenerator.op_fnstsw_ax();
     424
     425            //test ah,40h
     426            compiler.codeGenerator.op_test_ah( (char)0x40 );
     427
     428            //jne (Wend まで)
     429            pWhilePertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(long), true );
     430        }
     431        else if( tempType.Is64() ){
     432            //64ビット型
     433
     434            //pop eax
     435            compiler.codeGenerator.op_pop(REG_EAX);
     436
     437            //pop ebx
     438            compiler.codeGenerator.op_pop(REG_EBX);
     439
     440            //cmp eax,0
     441            compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EAX, 0 );
     442
     443            //jne
     444            const PertialSchedule *pTempPertialSchedule1 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
     445
     446            //cmp ebx,0
     447            compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EBX, 0 );
     448
     449            //jne
     450            const PertialSchedule *pTempPertialSchedule2 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
     451
     452            //jmp (Wendまでジャンプ)
     453            pWhilePertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(long), true );
     454
     455            compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule1 );
     456            compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule2 );
     457        }
     458        else{
     459            //その他整数型
     460
     461            //pop eax
     462            compiler.codeGenerator.op_pop(REG_EAX);
     463
     464            //cmp eax,0
     465            compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EAX, 0 );
     466
     467            //je (Wend まで)
     468            pWhilePertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(long), true );
     469        }
    452470    }
    453471
     
    726744
    727745            Type tempType;
    728             NumOpe(temporary,Type(),tempType);
     746            bool isNeedHeapFreeStructure;
     747            NumOpe( temporary, Type(), tempType, &isNeedHeapFreeStructure );
     748
     749            if( tempType.IsObject() )
     750            {
     751                // Boolean型にキャストする
     752                Type booleanType( DEF_BOOLEAN );
     753                CallCastOperatorProc( tempType, isNeedHeapFreeStructure, booleanType );
     754                tempType = booleanType;
     755            }
    729756
    730757            if( tempType.IsDouble() ){
Note: See TracChangeset for help on using the changeset viewer.