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/BasicCompiler32/NumOpe.cpp

    r350 r355  
    604604        // リテラル配列の場合
    605605
    606         if( !baseType.IsPointer() ){
    607             SetError(1,NULL,cp);
     606        int dataTableOffset;
     607        if( !compiler.GetObjectModule().dataTable.MakeLiteralArrayBuffer( expression, baseType, dataTableOffset ) )
     608        {
    608609            return false;
    609610        }
    610         Type tempBaseType( baseType );
    611         tempBaseType.PtrLevelDown();
    612 
    613         char *buffer = (char *)malloc( lstrlen( expression ) + 1 );
    614         lstrcpy( buffer, expression );
    615         RemoveStringBracket( buffer );
    616 
    617         void *binary = malloc( 1 );
    618         int num = 0;
    619 
    620         i = 0;
    621         while( buffer[i] ){
    622             i = GetOneParameter( buffer, i, temporary );
    623             if( buffer[i] == ',' ){
    624                 i++;
    625             }
    626 
    627             Type resultType;
    628             _int64 i64data;
    629             if( !StaticCalculation( true, temporary, tempBaseType.GetBasicType(), &i64data, resultType ) ){
    630                 return false;
    631             }
    632             if( !resultType.IsWhole() ){
    633                 // TODO: 実数に未対応
    634                 SetError();
    635                 return false;
    636             }
    637 
    638             binary = realloc( binary, ( num + 1 ) * tempBaseType.GetSize() );
    639             memcpy( (char *)binary + (num * tempBaseType.GetSize()), &i64data, tempBaseType.GetSize() );
    640             num++;
    641         }
    642 
    643         i2 = compiler.GetObjectModule().dataTable.AddBinary( binary, num * tempBaseType.GetSize() );
    644611
    645612        //mov eax,i2
    646         compiler.codeGenerator.op_mov_RV(REG_EAX,i2, Schedule::DataTable );
    647 
    648         free( buffer );
     613        compiler.codeGenerator.op_mov_RV(REG_EAX,dataTableOffset, Schedule::DataTable );
    649614
    650615        resultType = baseType;
     
    657622
    658623    bool isLiteralCalculation;
    659     if( !NumOpe_GetType( expression, baseType, resultType, &isLiteralCalculation ) )
     624    if( NumOpe_GetType( expression, baseType, resultType, &isLiteralCalculation ) )
    660625    {
    661         return false;
    662     }
    663     if( isLiteralCalculation )
     626        if( isLiteralCalculation )
     627        {
     628            //右辺値が数値の定数式の場合
     629            _int64 i64data;
     630            StaticCalculation(true, expression,baseType.GetBasicType(),&i64data,resultType);
     631
     632            if( resultType.GetBasicSize() == sizeof(_int64) ){
     633                //64ビット(符号有り整数/実数)
     634
     635                //push HILONG(i64data)
     636                compiler.codeGenerator.op_push_V((long)*(long *)(((char *)(&i64data))+4));
     637
     638                //push LOLONG(i64data)
     639                compiler.codeGenerator.op_push_V(*(long *)(&i64data));
     640            }
     641            else if( resultType.IsSingle() ){
     642                //single実数
     643
     644                double dbl;
     645                memcpy(&dbl,&i64data,sizeof(_int64));
     646
     647                float flt;
     648                flt=(float)dbl;
     649                long l;
     650                memcpy(&l,&flt,sizeof(long));
     651
     652                //push flt
     653                compiler.codeGenerator.op_push_V(l);
     654            }
     655            else{
     656                //整数(符号有り/無し)
     657
     658                long l = (long)i64data;
     659
     660                if(resultType.GetBasicSize()==sizeof(char)) l = l & 0x000000FF;
     661                if(resultType.GetBasicSize()==sizeof(short)) l = l & 0x0000FFFF;
     662
     663                //push term
     664                compiler.codeGenerator.op_push_V(l);
     665            }
     666            return true;
     667        }
     668    }
     669
     670    if(expression[0]==1 )
    664671    {
    665         //右辺値が数値の定数式の場合
    666         _int64 i64data;
    667         StaticCalculation(true, expression,baseType.GetBasicType(),&i64data,resultType);
    668 
    669         if( resultType.GetBasicSize() == sizeof(_int64) ){
    670             //64ビット(符号有り整数/実数)
    671 
    672             //push HILONG(i64data)
    673             compiler.codeGenerator.op_push_V((long)*(long *)(((char *)(&i64data))+4));
    674 
    675             //push LOLONG(i64data)
    676             compiler.codeGenerator.op_push_V(*(long *)(&i64data));
    677         }
    678         else if( resultType.IsSingle() ){
    679             //single実数
    680 
    681             double dbl;
    682             memcpy(&dbl,&i64data,sizeof(_int64));
    683 
    684             float flt;
    685             flt=(float)dbl;
    686             long l;
    687             memcpy(&l,&flt,sizeof(long));
    688 
    689             //push flt
    690             compiler.codeGenerator.op_push_V(l);
    691         }
    692         else{
    693             //整数(符号有り/無し)
    694 
    695             long l = (long)i64data;
    696 
    697             if(resultType.GetBasicSize()==sizeof(char)) l = l & 0x000000FF;
    698             if(resultType.GetBasicSize()==sizeof(short)) l = l & 0x0000FFFF;
    699 
    700             //push term
    701             compiler.codeGenerator.op_push_V(l);
    702         }
    703         return true;
    704     }
    705 
    706     if(expression[0]==1&& expression[1]==ESC_NEW ){
    707         //New演算子(オブジェクト生成)
    708 
    709         if( !Operator_New( expression+2, baseType, resultType ) ){
    710             return false;
    711         }
    712 
    713         return true;
     672        if( expression[1]==ESC_NEW ){
     673            //New演算子(オブジェクト生成)
     674
     675            if( !Operator_New( expression+2, baseType, resultType ) ){
     676                return false;
     677            }
     678
     679            return true;
     680        }
     681        else if( expression[1] == ESC_SYSTEM_STATIC_NEW )
     682        {
     683            // 静的領域にオブジェクトを作る
     684
     685            // 静的領域にオブジェクトを生成
     686            int dataTableOffset;
     687            if( !compiler.GetObjectModule().dataTable.MakeConstObjectToProcessStaticBuffer( expression + 2, resultType, dataTableOffset ) )
     688            {
     689                return false;
     690            }
     691
     692            // push value
     693            compiler.codeGenerator.op_push_V( dataTableOffset, Schedule::DataTable );
     694
     695            return true;
     696        }
    714697    }
    715698
     
    736719    //リテラル値のみの計算かどうかを判別するためのフラグ
    737720    BOOL bLiteralCalculation=1;
    738 
    739     //リテラル演算の場合を考慮した演算前の再配置スケジュール
    740     CReloc *pobj_BackReloc;
    741     pobj_BackReloc=new CReloc();
    742     pobj_BackReloc->copy(pobj_Reloc);
    743721
    744722    double dbl;
     
    819797                    || term[0] == '\"' )
    820798                {
    821                     if( !baseType.IsPointer() )
    822                     {
    823                         //要求タイプがオブジェクト、または未定のとき
    824 
    825                         //String型オブジェクトを生成
    826                         NewStringObject(term);
    827 
    828                         type_stack[sp]=DEF_OBJECT;
    829                         index_stack[sp]=(LONG_PTR)compiler.GetObjectModule().meta.GetClasses().GetStringClassPtr();
    830                         bLiteralCalculation=0;
    831 
    832                         sp++;
    833                         break;
    834                     }
    835 
    836799                    bool isEx = true;
    837800                    if( term[0] == '\"' )
     
    858821                        }
    859822                        i3=lstrlen(term);
     823                    }
     824
     825                    if( !baseType.IsPointer() )
     826                    {
     827                        //要求タイプがオブジェクト、または未定のとき
     828
     829                        //String型オブジェクトを生成
     830                        i2 = compiler.GetObjectModule().dataTable.MakeConstStringObjectToProcessStaticBuffer( term );
     831                       
     832                        // push value
     833                        compiler.codeGenerator.op_push_V( i2, Schedule::DataTable );
     834
     835                        type_stack[sp]=DEF_OBJECT;
     836                        index_stack[sp]=(LONG_PTR)compiler.GetObjectModule().meta.GetClasses().GetStringClassPtr();
     837                        bLiteralCalculation=0;
     838
     839                        sp++;
     840                        break;
    860841                    }
    861842StrLiteral:
     
    12001181    }
    12011182
    1202     //再配置スケジュールバックアップ情報を解放
    1203     delete pobj_BackReloc;
    1204 
    12051183    return isSuccessful;
    12061184}
Note: See TracChangeset for help on using the changeset viewer.