Changeset 254 in dev for trunk/abdev/BasicCompiler_Common


Ignore:
Timestamp:
Jul 31, 2007, 4:30:31 AM (17 years ago)
Author:
dai_9181
Message:
 
Location:
trunk/abdev/BasicCompiler_Common
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler_Common/NumOpe_GetType.cpp

    r206 r254  
    542542}
    543543
    544 bool NumOpe_GetType( const char *expression, const Type &baseType, Type &resultType ){
     544bool NumOpe_GetType( const char *expression, const Type &baseType, Type &resultType, bool *pIsLiteralCalculation ){
    545545    extern int cp;
    546546    int i,i3;
     547
     548    //リテラル値のみの計算かどうかを判別するためのフラグ
     549    bool dummyBool;
     550    if( pIsLiteralCalculation == NULL )
     551    {
     552        pIsLiteralCalculation = &dummyBool;
     553    }
     554    *pIsLiteralCalculation = true;
    547555
    548556    if(expression[0]=='\0'){
     
    553561    if(expression[0]==1&& expression[1]==ESC_NEW ){
    554562        //New演算子(オブジェクト生成)
     563        *pIsLiteralCalculation = false;
    555564        return Operator_New_GetType(expression+2,baseType, resultType );
    556565    }
     
    590599    BOOL bError;
    591600    bError=0;
    592 
    593     //リテラル値のみの計算かどうかを判別するためのフラグ
    594     BOOL bLiteralCalculation=1;
    595601
    596602    int sp;
     
    684690                        type_stack[sp]=DEF_OBJECT;
    685691                        index_stack[sp]=(LONG_PTR)compiler.GetMeta().GetClasses().GetStringClassPtr();
    686                         bLiteralCalculation=0;
     692                        *pIsLiteralCalculation = false;
    687693
    688694                        sp++;
     
    691697
    692698                    type_stack[sp]=typeOfPtrChar;
    693                     bLiteralCalculation=0;
     699                    *pIsLiteralCalculation = false;
    694700                }
    695701                else if((term[0]=='e'||term[0]=='E')&&
     
    711717
    712718                        if( !isLiteral ){
    713                             bLiteralCalculation=0;
     719                            *pIsLiteralCalculation = false;
    714720                        }
    715721
     
    730736                            index_stack[sp] = (LONG_PTR)compiler.GetMeta().GetClasses().GetObjectClassPtr();
    731737                        }
    732                         bLiteralCalculation = 0;
     738                        *pIsLiteralCalculation = false;
    733739                        sp++;
    734740                        break;
     
    784790
    785791                        index_stack[sp]=tempType.GetIndex();
    786                         bLiteralCalculation=0;
     792                        *pIsLiteralCalculation = false;
    787793
    788794                        sp++;
     
    900906    }
    901907
    902     if(bLiteralCalculation){
     908    if( *pIsLiteralCalculation ){
    903909        //右辺値が数値の定数式の場合
    904910        int base_type = 0;
  • trunk/abdev/BasicCompiler_Common/calculation.cpp

    r206 r254  
    726726                        //リテラル値
    727727                        StrPtr[pnum]=0;
    728                         type[pnum]=GetLiteralValue(Parms,&i64data,BaseType);
     728                        type[pnum]=GetLiteralValue(Parms,&i64data,BaseType, enableerror);
     729                        if( type[pnum] == -1 )
     730                        {
     731                            // エラー
     732                            return false;
     733                        }
    729734                        if(IsRealNumberType(type[pnum])){
    730735                            //実数型
     
    969974#pragma optimize("", off)
    970975#pragma warning(disable : 4748)
    971 DWORD GetLiteralValue(char *value,_int64 *pi64,int BaseType){
     976DWORD GetLiteralValue(char *value,_int64 *pi64,int BaseType, bool isNotifyError ){
    972977    extern HANDLE hHeap;
    973978    extern int cp;
     
    987992            }
    988993            if(temporary[i]){
     994                if( !isNotifyError )
     995                {
     996                    return -1;
     997                }
    989998                SetError(57,NULL,cp);
    990999                return DEF_BYTE;
     
    10091018            }
    10101019            if(temporary[i]){
     1020                if( !isNotifyError )
     1021                {
     1022                    return -1;
     1023                }
    10111024                SetError(58,NULL,cp);
    10121025                return DEF_BYTE;
     
    10211034        }
    10221035        else{
     1036            if( !isNotifyError )
     1037            {
     1038                return -1;
     1039            }
    10231040            SetError(12,"&",cp);
    10241041            return DEF_BYTE;
     
    10701087                    if(bDebugRun) return DEF_DOUBLE;
    10711088
     1089                    if( !isNotifyError )
     1090                    {
     1091                        return -1;
     1092                    }
     1093
    10721094                    SetError(3,value,cp);
    10731095                    return DEF_DOUBLE;
     
    11111133    if(bDebugRun) return DEF_DOUBLE;
    11121134
     1135    if( !isNotifyError )
     1136    {
     1137        return -1;
     1138    }
     1139
    11131140    SetError(33,NULL,cp);
    11141141    return DEF_DOUBLE;
     
    11161143#pragma optimize("", on)
    11171144
    1118 int IsStrCalculation(char *Command){
     1145int IsStrCalculation(const char *Command){
    11191146    int i,i2,i3,i4,PareNum;
    11201147    char temporary[VN_SIZE],temp2[8192];
  • trunk/abdev/BasicCompiler_Common/common.h

    r223 r254  
    343343int GetLiteralIndex(_int64 i64data);
    344344int NeutralizationType(int type1,LONG_PTR index1,int type2,LONG_PTR index2);
    345 DWORD GetLiteralValue(char *value,_int64 *pi64,int BaseType);
    346 int IsStrCalculation(char *Command);
     345DWORD GetLiteralValue(char *value,_int64 *pi64,int BaseType, bool isNotifyError = true );
     346int IsStrCalculation(const char *Command);
    347347BYTE GetCalcId(const char *Command,int *pi);
    348348BOOL GetNumOpeElements(const char *Command,int *pnum,
     
    353353BOOL CheckCalcType(int idCalc,int *type,int sp);
    354354bool GetTermType( const char *term, Type &resultType, bool &isLiteral, bool *pIsClassName = NULL );
    355 bool NumOpe_GetType( const char *expression, const Type &baseType, Type &resultType );
     355bool NumOpe_GetType( const char *expression, const Type &baseType, Type &resultType, bool *pIsLiteralCalculation = NULL );
    356356
    357357//Subroutine.cpp
  • trunk/abdev/BasicCompiler_Common/include/CodeGenerator.h

    r253 r254  
    288288private:
    289289    void set_rex(int op_size,int reg,int index_reg,int base_reg);
    290     void set_mod_rm_sib_disp(char mod,int reg,int scale,int index_reg,int base_reg,long disp, Schedule::Type scheduleType = Schedule::None );
    291     void __op_format(int op_size,char op_prefix,char opcode1,char opcode2,int reg,int base_reg,long offset,char mod, Schedule::Type scheduleType = Schedule::None );
     290    const PertialSchedule *set_mod_rm_sib_disp(char mod,int reg,int scale,int index_reg,int base_reg,long disp, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
     291    const PertialSchedule *__op_format(int op_size,char op_prefix,char opcode1,char opcode2,int reg,int base_reg,long offset,char mod, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
    292292public:
    293293    void op_mov_RV                  (int op_size,int reg,long i32data, Schedule::Type scheduleType = Schedule::None );
    294294    void op_mov_RV64                (int reg,_int64 i64data);
    295     void op_mov_RM                  (int op_size,int reg,int base_reg,long offset,char mod, Schedule::Type scheduleType = Schedule::None );
    296     void op_mov_RM_ex               (int op_size,int reg,int base_reg1,int base_reg2,long offset,BOOL bUseOffset, Schedule::Type scheduleType = Schedule::None );
    297     void op_mov_MR                  (int op_size,int reg,int base_reg,long offset,char mod, Schedule::Type scheduleType = Schedule::None );
    298     void op_mov_MR_ex               (int op_size,int reg,int base_reg1,int base_reg2,long offset,BOOL bUseOffset, Schedule::Type scheduleType = Schedule::None );
    299     void op_mov_MV                  (int op_size,int base_reg,int offset, Schedule::Type offsetScheduleType, BOOL bUseOffset,long i32data);
     295    const PertialSchedule *op_mov_RM        (int op_size,int reg,int base_reg,long offset,char mod, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
     296    const PertialSchedule *op_mov_RM_ex     (int op_size,int reg,int base_reg1,int base_reg2,long offset,BOOL bUseOffset, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
     297    const PertialSchedule *op_mov_MR        (int op_size,int reg,int base_reg,long offset,char mod, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
     298    const PertialSchedule *op_mov_MR_ex     (int op_size,int reg,int base_reg1,int base_reg2,long offset,BOOL bUseOffset, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
     299    const PertialSchedule *op_mov_MV        (int op_size,int base_reg,int offset, Schedule::Type offsetScheduleType, bool isPertialSchedule, BOOL bUseOffset,long i32data);
    300300    void op_mov_RR                  (int reg1,int reg2);
    301301    void op_movsxd                  (int reg64,int reg32);
     
    308308    void op_inc                     (int reg);
    309309    void op_dec                     (int reg);
    310     void op_add_RM                  (int op_size,int reg,int base_reg,int offset,char mod, Schedule::Type scheduleType = Schedule::None );
    311     void op_add_RV                  (int reg,long offset, Schedule::Type scheduleType = Schedule::None );
     310    const PertialSchedule *op_add_RM        (int op_size,int reg,int base_reg,int offset,char mod, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
     311    const PertialSchedule *op_add_RV        (int reg,long offset, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
    312312    void op_add_RR              (int reg1,int reg2);
    313313    void op_add32_reg               (int reg1,int reg2);
     
    334334    void op_cmp_value               (int op_size,int reg,char byte_data);
    335335    void op_setne                   (int reg);
    336     void op_movlpd_MR               (int xmm_reg,int base_reg,int offset,char mod, Schedule::Type scheduleType = Schedule::None );
    337     void op_movlpd_RM               (int xmm_reg,int base_reg,int offset,char mod, Schedule::Type scheduleType = Schedule::None );
     336    const PertialSchedule *op_movlpd_MR     (int xmm_reg,int base_reg,int offset,char mod, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
     337    const PertialSchedule *op_movlpd_RM     (int xmm_reg,int base_reg,int offset,char mod, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
    338338    void op_movsd_RR                (int xmm_reg1,int xmm_reg2);
    339     void op_movsd_MR                (int xmm_reg,int base_reg,int offset,char mod, Schedule::Type scheduleType = Schedule::None );
     339    const PertialSchedule *op_movsd_MR      (int xmm_reg,int base_reg,int offset,char mod, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
    340340    void op_movss_RR                (int xmm_reg1,int xmm_reg2);
    341     void op_movss_RM                (int xmm_reg,int base_reg,int offset,char mod, Schedule::Type scheduleType = Schedule::None );
    342     void op_movss_MR                (int xmm_reg,int base_reg,int offset,char mod, Schedule::Type scheduleType = Schedule::None );
     341    const PertialSchedule *op_movss_RM      (int xmm_reg,int base_reg,int offset,char mod, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
     342    const PertialSchedule *op_movss_MR      (int xmm_reg,int base_reg,int offset,char mod, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
    343343    void op_movd_RX                 (int reg,int xmm_reg);
    344344    void op_cvtsd2ss                (int xmm_reg1,int xmm_reg2);
     
    448448        pNativeCode->Put( l, scheduleType );
    449449    }
     450    const PertialSchedule *PutOld( long l, bool isPertialSchedule )
     451    {
     452        const PertialSchedule *pPertialSchedule;
     453        if( isPertialSchedule )
     454        {
     455            pertialSchedules.push_back( new PertialSchedule( pNativeCode->GetSize(), sizeof(long) ) );
     456            pPertialSchedule = pertialSchedules.back();
     457        }
     458        pNativeCode->Put( l, Schedule::None );
     459        return pPertialSchedule;
     460    }
    450461    void PutOld( const NativeCode &nativeCode )
    451462    {
  • trunk/abdev/BasicCompiler_Common/include/Const.h

    r206 r254  
    8484public:
    8585
    86     int GetBasicType(char *Name);
    87     _int64 GetWholeData(char *Name);
    88     double GetDoubleData(char *Name);
    89     bool IsStringPtr(char *Name);
     86    int GetBasicType(const char *Name);
     87    _int64 GetWholeData(const char *Name);
     88    double GetDoubleData(const char *Name);
     89    bool IsStringPtr(const char *Name);
    9090};
    9191
  • trunk/abdev/BasicCompiler_Common/src/CommonCodeGenerator.cpp

    r253 r254  
    301301void CodeGenerator::op_jmp_continue()
    302302{
    303     //op_jmp( GetContinueCodePos()-(pNativeCode->GetSize()+sizeof(long)), sizeof(long) );
    304 
    305     // TODO: 未完成(OpBuffer/obp廃止が整ったら上記のコードを有効にすべし)
    306 
    307     if( GetContinueCodePosOld() == -1 )
     303    ////////////////////////////////////
     304    // エラー検出(必要なくなったら消す)
     305    extern int obp;
     306    if( GetContinueCodePosOld()-obp != GetContinueCodePos()-pNativeCode->GetSize() )
     307    {
     308        int continueCodePosOld = GetContinueCodePosOld();
     309        int continueCodePos = GetContinueCodePos();
     310        int size = pNativeCode->GetSize();
     311        int test=0;
     312        SetError();
     313    }
     314    ////////////////////////////////////
     315
     316
     317    if( GetContinueCodePos() == -1 )
    308318    {
    309319        SetError(12,"Continue",cp);
    310320        return;
    311321    }
    312 
    313     extern int obp;
    314     op_jmp( GetContinueCodePosOld()-obp, sizeof(long), false, true );
     322    op_jmp( GetContinueCodePos() - pNativeCode->GetSize(), sizeof(long), false, true );
    315323}
    316324void CodeGenerator::op_jmp_exitsub()
  • trunk/abdev/BasicCompiler_Common/src/Const.cpp

    r206 r254  
    9292
    9393
    94 int Consts::GetBasicType(char *Name){
     94int Consts::GetBasicType(const char *Name){
    9595    CConst *pConst = GetObjectPtr(Name);
    9696
     
    9999    return pConst->GetType().GetBasicType();
    100100}
    101 _int64 Consts::GetWholeData(char *Name){
     101_int64 Consts::GetWholeData(const char *Name){
    102102    CConst *pConst = GetObjectPtr(Name);
    103103
     
    106106    return pConst->GetWholeData();
    107107}
    108 double Consts::GetDoubleData(char *Name){
     108double Consts::GetDoubleData(const char *Name){
    109109    CConst *pConst = GetObjectPtr(Name);
    110110
     
    113113    return pConst->GetDoubleData();
    114114}
    115 bool Consts::IsStringPtr( char *Name ){
     115bool Consts::IsStringPtr( const char *Name ){
    116116    CConst *pConst = GetObjectPtr(Name);
    117117
  • trunk/abdev/BasicCompiler_Common/src/LexicalScope.cpp

    r253 r254  
    128128
    129129            //mov rcx,qword ptr[rsp+offset]
     130            compiler.codeGenerator.localVarPertialSchedules.push_back(
    130131            compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_RCX,REG_RSP,
    131132                -pVar->GetOffsetAddress(),
    132133                MOD_BASE_DISP32,
    133                 Schedule::LocalVar);
     134                Schedule::None, true)
     135            );
    134136#else
    135137            //x86コード
Note: See TracChangeset for help on using the changeset viewer.