Ignore:
Timestamp:
Nov 2, 2007, 2:53:56 AM (17 years ago)
Author:
dai_9181
Message:

静的領域に初期オブジェクトを配置可能にした

File:
1 edited

Legend:

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

    r350 r355  
    590590            BOOL *pbUseHeap )
    591591{
    592 
    593592    int i,i2,i3;
    594593    char temporary[1024],temp2[1024];
     594
     595    if( (string)expression == "typeInfo=t2" )
     596    {
     597        int test=0;
     598    }
    595599
    596600    if(expression[0]=='\0'){
     
    602606        // リテラル配列の場合
    603607
    604         if( !baseType.IsPointer() ){
    605             SetError(1,NULL,cp);
     608        int dataTableOffset;
     609        if( !compiler.GetObjectModule().dataTable.MakeLiteralArrayBuffer( expression, baseType, dataTableOffset ) )
     610        {
    606611            return false;
    607612        }
    608         Type tempBaseType( baseType );
    609         tempBaseType.PtrLevelDown();
    610 
    611         char *buffer = (char *)malloc( lstrlen( expression ) + 1 );
    612         lstrcpy( buffer, expression );
    613         RemoveStringBracket( buffer );
    614 
    615         void *binary = malloc( 1 );
    616         int num = 0;
    617 
    618         i = 0;
    619         while( buffer[i] ){
    620             i = GetOneParameter( buffer, i, temporary );
    621             if( buffer[i] == ',' ){
    622                 i++;
    623             }
    624 
    625             Type resultType;
     613
     614        //mov reg,i2
     615        compiler.codeGenerator.op_mov_RV( sizeof(_int64), *pReg, dataTableOffset, Schedule::DataTable );
     616
     617        resultType = baseType;
     618
     619        return true;
     620    }
     621
     622    bool isLiteralCalculation;
     623    if( NumOpe_GetType( expression, baseType, resultType, &isLiteralCalculation ) )
     624    {
     625        if( isLiteralCalculation )
     626        {
     627            //右辺値が数値の定数式の場合
    626628            _int64 i64data;
    627             if( !StaticCalculation( true, temporary, tempBaseType.GetBasicType(), &i64data, resultType ) ){
     629            StaticCalculation(true, expression,baseType.GetBasicType(),&i64data,resultType);
     630
     631            if(resultType.IsReal()){
     632                if(baseType.IsReal()) resultType=baseType;
     633
     634                int xmmReg = pobj_reg->GetNextXmmReg();
     635                *pReg = xmmReg;
     636
     637                if(resultType.IsDouble()){
     638                    i3 = compiler.GetObjectModule().dataTable.Add( i64data );
     639
     640                    //movlpd xmm_reg,qword ptr[data table offset]
     641                    compiler.codeGenerator.op_movlpd_RM( xmmReg, 0, i3, MOD_DISP32, Schedule::DataTable );
     642                }
     643                if(resultType.IsSingle()){
     644                    double dbl;
     645                    memcpy(&dbl,&i64data,sizeof(_int64));
     646
     647                    float flt;
     648                    int i32data;
     649                    flt=(float)dbl;
     650                    memcpy(&i32data,&flt,sizeof(long));
     651
     652                    i3 = compiler.GetObjectModule().dataTable.Add( i32data );
     653
     654                    //movss xmm_reg,dword ptr[data table offset]
     655                    compiler.codeGenerator.op_movss_RM( xmmReg, 0, i3, MOD_DISP32, Schedule::DataTable );
     656                }
     657            }
     658            else{
     659                if(!resultType.Is64()){
     660                    //整数(符号有り/無し)
     661
     662                    i3=(long)i64data;
     663
     664                    if(resultType.GetBasicSize()==sizeof(char)) i3=i3&0x000000FF;
     665                    if(resultType.GetBasicSize()==sizeof(short)) i3=i3&0x0000FFFF;
     666
     667                    i64data=(_int64)i3;
     668                }
     669
     670                //mov reg,i64data
     671                compiler.codeGenerator.op_mov_RV64(*pReg,i64data);
     672            }
     673            return true;
     674        }
     675    }
     676
     677    if( expression[0] == 1 )
     678    {
     679        if( expression[1]==ESC_NEW )
     680        {
     681            //New演算子(オブジェクト生成)
     682
     683            if( pobj_BlockReg->check(REG_RAX) ){
     684                SetError();
     685            }
     686
     687            //////////////////////////////////////////////////////
     688            /////    レジスタ資源のバックアップ
     689            {   BACKUP_REGISTER_RESOURCE
     690            //////////////////////////////////////////////////////
     691
     692                if( !Operator_New( expression+2, baseType, resultType ) ){
     693                    return false;
     694                }
     695
     696            /////////////////////////////////////////////
     697            //////   レジスタ資源を復元
     698                RESTORE_REGISTER_RESOURCE
     699            }////////////////////////////////////////////
     700
     701            //mov reg,rax
     702            compiler.codeGenerator.op_mov_RR( *pReg, REG_RAX );
     703
     704            return true;
     705        }
     706        else if( expression[1] == ESC_SYSTEM_STATIC_NEW )
     707        {
     708            // 静的領域にオブジェクトを作る
     709
     710            // 静的領域にオブジェクトを生成
     711            int dataTableOffset;
     712            if( !compiler.GetObjectModule().dataTable.MakeConstObjectToProcessStaticBuffer( expression + 2, resultType, dataTableOffset ) )
     713            {
    628714                return false;
    629715            }
    630             if( !resultType.IsWhole() ){
    631                 // TODO: 実数に未対応
    632                 SetError();
    633                 return false;
    634             }
    635 
    636             binary = realloc( binary, ( num + 1 ) * tempBaseType.GetSize() );
    637             memcpy( (char *)binary + (num * tempBaseType.GetSize()), &i64data, tempBaseType.GetSize() );
    638             num++;
    639         }
    640 
    641         i2 = compiler.GetObjectModule().dataTable.AddBinary( binary, num * tempBaseType.GetSize() );
    642 
    643         //mov reg,i2
    644         compiler.codeGenerator.op_mov_RV(sizeof(_int64),*pReg,i2, Schedule::DataTable );
    645 
    646         free( buffer );
    647 
    648         resultType = baseType;
    649 
    650         return true;
    651     }
    652 
    653     bool isLiteralCalculation;
    654     if( !NumOpe_GetType( expression, baseType, resultType, &isLiteralCalculation ) )
    655     {
    656         return false;
    657     }
    658     if( isLiteralCalculation )
    659     {
    660         //右辺値が数値の定数式の場合
    661         _int64 i64data;
    662         StaticCalculation(true, expression,baseType.GetBasicType(),&i64data,resultType);
    663 
    664         if(resultType.IsReal()){
    665             if(baseType.IsReal()) resultType=baseType;
    666 
    667             int xmmReg = pobj_reg->GetNextXmmReg();
    668             *pReg = xmmReg;
    669 
    670             if(resultType.IsDouble()){
    671                 i3 = compiler.GetObjectModule().dataTable.Add( i64data );
    672 
    673                 //movlpd xmm_reg,qword ptr[data table offset]
    674                 compiler.codeGenerator.op_movlpd_RM( xmmReg, 0, i3, MOD_DISP32, Schedule::DataTable );
    675             }
    676             if(resultType.IsSingle()){
    677                 double dbl;
    678                 memcpy(&dbl,&i64data,sizeof(_int64));
    679 
    680                 float flt;
    681                 int i32data;
    682                 flt=(float)dbl;
    683                 memcpy(&i32data,&flt,sizeof(long));
    684 
    685                 i3 = compiler.GetObjectModule().dataTable.Add( i32data );
    686 
    687                 //movss xmm_reg,dword ptr[data table offset]
    688                 compiler.codeGenerator.op_movss_RM( xmmReg, 0, i3, MOD_DISP32, Schedule::DataTable );
    689             }
    690         }
    691         else{
    692             if(!resultType.Is64()){
    693                 //整数(符号有り/無し)
    694 
    695                 i3=(long)i64data;
    696 
    697                 if(resultType.GetBasicSize()==sizeof(char)) i3=i3&0x000000FF;
    698                 if(resultType.GetBasicSize()==sizeof(short)) i3=i3&0x0000FFFF;
    699 
    700                 i64data=(_int64)i3;
    701             }
    702 
    703             //mov reg,i64data
    704             compiler.codeGenerator.op_mov_RV64(*pReg,i64data);
    705         }
    706         return true;
    707     }
    708 
    709     if(expression[0]==1&& expression[1]==ESC_NEW ){
    710         //New演算子(オブジェクト生成)
    711 
    712         if( pobj_BlockReg->check(REG_RAX) ){
    713             SetError();
    714         }
    715 
    716         //////////////////////////////////////////////////////
    717         /////    レジスタ資源のバックアップ
    718         {   BACKUP_REGISTER_RESOURCE
    719         //////////////////////////////////////////////////////
    720 
    721             if( !Operator_New( expression+2, baseType, resultType ) ){
    722                 return false;
    723             }
    724 
    725         /////////////////////////////////////////////
    726         //////   レジスタ資源を復元
    727             RESTORE_REGISTER_RESOURCE
    728         }////////////////////////////////////////////
    729 
    730         //mov reg,rax
    731         compiler.codeGenerator.op_mov_RR( *pReg, REG_RAX );
    732 
    733         return true;
     716
     717            //mov reg,i2
     718            compiler.codeGenerator.op_mov_RV( sizeof(_int64), *pReg, dataTableOffset, Schedule::DataTable);
     719
     720            return true;
     721        }
    734722    }
    735723
     
    850838                    || term[0] == '\"' )
    851839                {
    852                     if( !baseType.IsPointer() )
    853                     {
    854                         //要求タイプがオブジェクト、または未定のとき
    855 
    856                         //String型オブジェクトを生成
    857                         NewStringObject(UseReg,term);
    858 
    859                         type_stack[sp]=DEF_OBJECT;
    860                         index_stack[sp]=(LONG_PTR)compiler.GetObjectModule().meta.GetClasses().GetStringClassPtr();
    861                         bLiteralCalculation=0;
    862 
    863                         if(bXmm) pobj_reg->LockXmmReg();
    864                         else pobj_reg->LockReg();
    865 
    866                         sp++;
    867                         break;
    868                     }
    869 
    870840                    bool isEx = true;
    871841                    if( term[0] == '\"' )
     
    893863                        i3=lstrlen(term);
    894864                    }
     865
     866                    if( !baseType.IsPointer() )
     867                    {
     868                        //要求タイプがオブジェクト、または未定のとき
     869
     870                        //String型オブジェクトを生成
     871                        i2 = compiler.GetObjectModule().dataTable.MakeConstStringObjectToProcessStaticBuffer( term );
     872
     873                        //mov reg,i2
     874                        compiler.codeGenerator.op_mov_RV(sizeof(_int64),UseReg,i2, Schedule::DataTable);
     875
     876                        type_stack[sp]=DEF_OBJECT;
     877                        index_stack[sp]=(LONG_PTR)compiler.GetObjectModule().meta.GetClasses().GetStringClassPtr();
     878                        bLiteralCalculation=0;
     879
     880                        if(bXmm) pobj_reg->LockXmmReg();
     881                        else pobj_reg->LockReg();
     882
     883                        sp++;
     884                        break;
     885                    }
     886
    895887StrLiteral:
    896888
Note: See TracChangeset for help on using the changeset viewer.