Changeset 319 in dev for trunk/abdev/BasicCompiler32


Ignore:
Timestamp:
Sep 9, 2007, 12:37:48 PM (17 years ago)
Author:
dai_9181
Message:

GCのバグをいくつか修正

Location:
trunk/abdev/BasicCompiler32
Files:
3 edited

Legend:

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

    r303 r319  
    205205
    206206
     207    //仮想関数テーブルを初期化
     208    if( classObj.IsExistVirtualFunctions()
     209        && !classObj.IsAbstract() )
     210    {
     211        // mov ecx,vtblAddress
     212        compiler.codeGenerator.op_mov_RV_vtbl( REG_ECX, &classObj );
     213
     214        //mov dword ptr[eax],ecx
     215        compiler.codeGenerator.op_mov_MR( sizeof(long), REG_ECX, REG_EAX, 0, MOD_BASE );
     216
     217        // 仮想関数になるメソッドに使用チェックをつける
     218        BOOST_FOREACH( const CMethod *pMethod, classObj.GetMethods() )
     219        {
     220            if( pMethod->IsVirtual() )
     221            {
     222                pMethod->GetUserProc().Using();
     223            }
     224        }
     225    }
     226
     227
    207228    // ※ここでプッシュされた値はNew演算子の戻り値となる
    208229    //push eax
  • trunk/abdev/BasicCompiler32/Compile_ProcOp.cpp

    r316 r319  
    536536                }
    537537            }
    538 
    539             //仮想関数テーブルを初期化
    540             if( compiler.pCompilingClass->IsExistVirtualFunctions()
    541                 && !compiler.pCompilingClass->IsAbstract() )
    542             {
    543                 // mov eax,vtblAddress
    544                 compiler.codeGenerator.op_mov_RV_vtbl( REG_EAX, compiler.pCompilingClass );
    545 
    546                 //Thisポインタをecxにコピー
    547                 SetThisPtrToReg(REG_ECX);
    548 
    549                 //mov dword ptr[ecx],eax
    550                 compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EAX, REG_ECX, 0, MOD_BASE );
    551 
    552 
    553                 // 仮想関数になるメソッドに使用チェックをつける
    554                 BOOST_FOREACH( const CMethod *pMethod, compiler.pCompilingClass->GetMethods() )
    555                 {
    556                     if( pMethod->IsVirtual() )
    557                     {
    558                         pMethod->GetUserProc().Using();
    559                     }
    560                 }
    561             }
    562538        }
    563539        else if( pUserProc->IsDestructor() ){
  • trunk/abdev/BasicCompiler32/NumOpe.cpp

    r301 r319  
    7373
    7474    char *parameter = (char *)malloc( lstrlen( str ) + 32 );
    75     sprintf( parameter, "\"%s\"%c%c*Char", str, 1, ESC_AS );
    76     SetStringQuotes( parameter );
     75    sprintf( parameter, "%s%c%c*Char", str, 1, ESC_AS );
    7776
    7877    Operator_New( *compiler.GetObjectModule().meta.GetClasses().GetStringClassPtr(), "", parameter, Type( DEF_OBJECT, *compiler.GetObjectModule().meta.GetClasses().GetStringClassPtr() ) );
     
    763762                }
    764763
    765                 if(term[0]=='\"'){
    766                     //リテラル文字列
    767                     if(!RemoveStringQuotes(term)){
    768                         SetError(43,NULL,cp);
    769                         goto error;
    770                     }
    771                     i3=lstrlen(term);
    772 StrLiteral:
    773 
    774                     if( baseType.IsObject() || baseType.IsNull() ){
     764                if( (term[0]=='e'||term[0]=='E')
     765                    && (term[1]=='x'||term[1]=='X')
     766                    && term[2]=='\"'
     767                    || term[0] == '\"' )
     768                {
     769                    if( baseType.IsObject() || baseType.IsNull() )
     770                    {
    775771                        //要求タイプがオブジェクト、または未定のとき
    776772
     
    786782                    }
    787783
    788 
     784                    bool isEx = true;
     785                    if( term[0] == '\"' )
     786                    {
     787                        isEx = false;
     788                    }
     789
     790                    if( isEx )
     791                    {
     792                        // 拡張版リテラル文字列(エスケープシーケンス可能)
     793                        if(!RemoveStringQuotes(term+2)){
     794                            SetError(43,NULL,cp);
     795                            goto error;
     796                        }
     797                        i3=FormatString_EscapeSequence(term+2);
     798                        term+=2;
     799                    }
     800                    else
     801                    {
     802                        // 通常文字列
     803                        if(!RemoveStringQuotes(term)){
     804                            SetError(43,NULL,cp);
     805                            goto error;
     806                        }
     807                        i3=lstrlen(term);
     808                    }
     809StrLiteral:
    789810                    type_stack[sp]=typeOfPtrChar;
    790811                    bLiteralCalculation=0;
     
    794815                    //push DataSize
    795816                    compiler.codeGenerator.op_push_V( i2, Schedule::DataTable );
    796                 }
    797                 else if((term[0]=='e'||term[0]=='E')&&
    798                     (term[1]=='x'||term[1]=='X')&&
    799                     term[2]=='\"'){
    800                     //拡張版リテラル文字列(エスケープシーケンス可能)
    801                     if(!RemoveStringQuotes(term+2)){
    802                         SetError(43,NULL,cp);
    803                         goto error;
    804                     }
    805                     i3=FormatString_EscapeSequence(term+2);
    806                     term+=2;
    807 
    808                     goto StrLiteral;
    809817                }
    810818                else if(IsVariableTopChar(term[0])||
     
    896904                            //リテラル文字列
    897905
     906                            if( baseType.IsObject() || baseType.IsNull() )
     907                            {
     908                                //要求タイプがオブジェクト、または未定のとき
     909
     910                                //String型オブジェクトを生成
     911                                NewStringObject(term);
     912
     913                                type_stack[sp]=DEF_OBJECT;
     914                                index_stack[sp]=(LONG_PTR)compiler.GetObjectModule().meta.GetClasses().GetStringClassPtr();
     915                                bLiteralCalculation=0;
     916
     917                                sp++;
     918                                break;
     919                            }
     920
    898921                            double dbl = compiler.GetObjectModule().meta.GetGlobalConsts().GetDoubleData(term);
    899922                            memcpy(&i64data,&dbl,sizeof(double));
Note: See TracChangeset for help on using the changeset viewer.