Changeset 319 in dev for trunk/abdev/BasicCompiler64


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

GCのバグをいくつか修正

Location:
trunk/abdev/BasicCompiler64
Files:
3 edited

Legend:

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

    r308 r319  
    200200
    201201
     202    //仮想関数テーブルを初期化
     203    if( classObj.IsExistVirtualFunctions()
     204        && !classObj.IsAbstract() )
     205    {
     206        // mov rcx,vtblAddress
     207        compiler.codeGenerator.op_mov_RV_vtbl( REG_RCX, &classObj );
     208
     209        //mov qword ptr[rax],rcx
     210        compiler.codeGenerator.op_mov_MR(sizeof(_int64),REG_RCX,REG_RAX,0,MOD_BASE);
     211
     212
     213        // 仮想関数になるメソッドに使用チェックをつける
     214        BOOST_FOREACH( const CMethod *pMethod, classObj.GetMethods() )
     215        {
     216            if( pMethod->IsVirtual() )
     217            {
     218                pMethod->GetUserProc().Using();
     219            }
     220        }
     221    }
     222
     223
    202224    /////////////////////////////////////////////////////////////////////
    203225
  • trunk/abdev/BasicCompiler64/Compile_ProcOp.cpp

    r318 r319  
    507507                }
    508508            }
    509 
    510             //仮想関数テーブルを初期化
    511             if( compiler.pCompilingClass->IsExistVirtualFunctions()
    512                 && !compiler.pCompilingClass->IsAbstract() )
    513             {
    514                 // mov rax,vtblAddress
    515                 compiler.codeGenerator.op_mov_RV_vtbl( REG_RAX, compiler.pCompilingClass );
    516 
    517                 //Thisポインタをrcxにコピー
    518                 SetThisPtrToReg(REG_RCX);
    519 
    520                 //mov qword ptr[rcx],rax
    521                 compiler.codeGenerator.op_mov_MR(sizeof(_int64),REG_RAX,REG_RCX,0,MOD_BASE);
    522 
    523 
    524                 // 仮想関数になるメソッドに使用チェックをつける
    525                 BOOST_FOREACH( const CMethod *pMethod, compiler.pCompilingClass->GetMethods() )
    526                 {
    527                     if( pMethod->IsVirtual() )
    528                     {
    529                         pMethod->GetUserProc().Using();
    530                     }
    531                 }
    532             }
    533509        }
    534510        else if( pUserProc->IsDestructor() ){
  • trunk/abdev/BasicCompiler64/NumOpe.cpp

    r318 r319  
    2222
    2323        char *parameter = (char *)malloc( lstrlen( str ) + 32 );
    24         sprintf( parameter, "\"%s\"%c%c*Char", str, 1, ESC_AS );
    25         SetStringQuotes( parameter );
     24        sprintf( parameter, "%s%c%c*Char", str, 1, ESC_AS );
    2625
    2726        Operator_New( *compiler.GetObjectModule().meta.GetClasses().GetStringClassPtr(), "", parameter, Type( DEF_OBJECT, *compiler.GetObjectModule().meta.GetClasses().GetStringClassPtr() ) );
     
    429428    GetArrayElement(termFull,VarName,ArrayElements);
    430429    if(ArrayElements[0]){
    431         GetVarType(VarName,resultType,false);
    432         if( resultType.IsObject() ){
    433             CallIndexerGetterProc(UseReg,resultType,VarName,ArrayElements,resultType);
     430        Type classType;
     431        GetVarType(VarName,classType,false);
     432        if( classType.IsObject() )
     433        {
     434            CallIndexerGetterProc(UseReg,classType,VarName,ArrayElements,resultType);
    434435
    435436            isLiteral = false;
     
    788789                }
    789790
    790                 if(term[0]=='\"'){
    791                     //リテラル文字列
    792                     if(!RemoveStringQuotes(term)){
    793                         SetError(43,NULL,cp);
    794                         goto error;
    795                     }
    796                     i3=lstrlen(term);
    797 StrLiteral:
    798 
    799                     if( baseType.IsObject() || baseType.IsNull() ){
     791                if( (term[0]=='e'||term[0]=='E')
     792                    && (term[1]=='x'||term[1]=='X')
     793                    && term[2]=='\"'
     794                    || term[0] == '\"' )
     795                {
     796                    if( baseType.IsObject() || baseType.IsNull() )
     797                    {
    800798                        //要求タイプがオブジェクト、または未定のとき
    801799
     
    814812                    }
    815813
     814                    bool isEx = true;
     815                    if( term[0] == '\"' )
     816                    {
     817                        isEx = false;
     818                    }
     819
     820                    if( isEx )
     821                    {
     822                        // 拡張版リテラル文字列(エスケープシーケンス可能)
     823                        if(!RemoveStringQuotes(term+2)){
     824                            SetError(43,NULL,cp);
     825                            goto error;
     826                        }
     827                        i3=FormatString_EscapeSequence(term+2);
     828                        term+=2;
     829                    }
     830                    else
     831                    {
     832                        // 通常文字列
     833                        if(!RemoveStringQuotes(term)){
     834                            SetError(43,NULL,cp);
     835                            goto error;
     836                        }
     837                        i3=lstrlen(term);
     838                    }
     839StrLiteral:
     840
    816841                    type_stack[sp]=typeOfPtrChar;
    817842                    bLiteralCalculation=0;
     
    827852                    }
    828853                }
    829                 else if((term[0]=='e'||term[0]=='E')&&
    830                     (term[1]=='x'||term[1]=='X')&&
    831                     term[2]=='\"'){
    832                     //拡張版リテラル文字列(エスケープシーケンス可能)
    833                     if(!RemoveStringQuotes(term+2)){
    834                         SetError(43,NULL,cp);
    835                         goto error;
    836                     }
    837                     i3=FormatString_EscapeSequence(term+2);
    838                     term+=2;
    839 
    840                     goto StrLiteral;
    841                 }
    842854                else if(IsVariableTopChar(term[0])||
    843855                    term[0]=='*'||
    844                     (term[0]=='.'&&IsVariableTopChar(term[1]))){
     856                    (term[0]=='.'&&IsVariableTopChar(term[1])))
     857                {
    845858                    //////////////////
    846859                    // 何らかの識別子
     
    938951                            //リテラル文字列
    939952
     953                            if( baseType.IsObject() || baseType.IsNull() )
     954                            {
     955                                //要求タイプがオブジェクト、または未定のとき
     956
     957                                //String型オブジェクトを生成
     958                                NewStringObject(UseReg,term);
     959
     960                                type_stack[sp]=DEF_OBJECT;
     961                                index_stack[sp]=(LONG_PTR)compiler.GetObjectModule().meta.GetClasses().GetStringClassPtr();
     962                                bLiteralCalculation=0;
     963
     964                                if(bXmm) pobj_reg->LockXmmReg();
     965                                else pobj_reg->LockReg();
     966
     967                                sp++;
     968                                break;
     969                            }
     970
    940971                            double dbl = compiler.GetObjectModule().meta.GetGlobalConsts().GetDoubleData(term);
    941972                            memcpy(&i64data,&dbl,sizeof(double));
     
    961992                            goto Literal;
    962993                        }
    963                         /*else if(i3==DEF_STRING){
    964                             //リテラル文字列
    965 
    966                             //バイト数
    967                             i3=(int)dbl;
    968 
    969                             memcpy(term,temporary,i3);
    970                             goto StrLiteral;
    971                         }*/
    972994                        else{
    973995                            SetError(1,NULL,0);
Note: See TracChangeset for help on using the changeset viewer.