Ignore:
Timestamp:
Jul 31, 2007, 4:30:31 AM (17 years ago)
Author:
dai_9181
Message:
 
File:
1 edited

Legend:

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

    r253 r254  
    532532            const Type &baseType,
    533533            Type &resultType,
    534             BOOL *pbUseHeap ){
    535 
     534            BOOL *pbUseHeap )
     535{
    536536    int i,i2,i3;
    537537    char temporary[1024],temp2[1024];
     
    540540        SetError(1,NULL,cp);
    541541        return false;
    542     }
    543 
    544     if(expression[0]==1&& expression[1]==ESC_NEW ){
    545         //New演算子(オブジェクト生成)
    546 
    547         if( !Operator_New( expression+2, baseType, resultType ) ){
    548             return false;
    549         }
    550 
    551         return true;
    552542    }
    553543
     
    603593        //push eax
    604594        compiler.codeGenerator.op_push( REG_EAX );
     595
     596        return true;
     597    }
     598
     599    bool isLiteralCalculation;
     600    if( !NumOpe_GetType( expression, baseType, resultType, &isLiteralCalculation ) )
     601    {
     602        return false;
     603    }
     604    if( isLiteralCalculation )
     605    {
     606        //右辺値が数値の定数式の場合
     607        _int64 i64data;
     608        StaticCalculation(true, expression,baseType.GetBasicType(),&i64data,resultType);
     609
     610        if( resultType.GetBasicSize() == sizeof(_int64) ){
     611            //64ビット(符号有り整数/実数)
     612
     613            //push HILONG(i64data)
     614            compiler.codeGenerator.op_push_V((long)*(long *)(((char *)(&i64data))+4));
     615
     616            //push LOLONG(i64data)
     617            compiler.codeGenerator.op_push_V(*(long *)(&i64data));
     618        }
     619        else if( resultType.IsSingle() ){
     620            //single実数
     621
     622            double dbl;
     623            memcpy(&dbl,&i64data,sizeof(_int64));
     624
     625            float flt;
     626            flt=(float)dbl;
     627            long l;
     628            memcpy(&l,&flt,sizeof(long));
     629
     630            //push flt
     631            compiler.codeGenerator.op_push_V(l);
     632        }
     633        else{
     634            //整数(符号有り/無し)
     635
     636            long l = (long)i64data;
     637
     638            if(resultType.GetBasicSize()==sizeof(char)) l = l & 0x000000FF;
     639            if(resultType.GetBasicSize()==sizeof(short)) l = l & 0x0000FFFF;
     640
     641            //push term
     642            compiler.codeGenerator.op_push_V(l);
     643        }
     644        return true;
     645    }
     646
     647    if(expression[0]==1&& expression[1]==ESC_NEW ){
     648        //New演算子(オブジェクト生成)
     649
     650        if( !Operator_New( expression+2, baseType, resultType ) ){
     651            return false;
     652        }
    605653
    606654        return true;
     
    10561104    if(bLiteralCalculation){
    10571105        //右辺値が数値の定数式の場合
    1058         Type resultType;
    1059         StaticCalculation(true, expression,baseType.GetBasicType(),&i64data,resultType);
    1060 
    1061         obp=BeforeObp;
    1062         pobj_SubAddrSchedule->num=Before_ProcAddrScheduleNum;
    1063         pobj_DataTableSchedule->num=Before_DataTableScheduleNum;
    1064         pobj_Reloc->copy(pobj_BackReloc);
    1065 
    1066         if( resultType.GetBasicSize() == sizeof(_int64) ){
    1067             //64ビット(符号有り整数/実数)
    1068 
    1069             //push HILONG(i64data)
    1070             compiler.codeGenerator.op_push_V((long)*(long *)(((char *)(&i64data))+4));
    1071 
    1072             //push LOLONG(i64data)
    1073             compiler.codeGenerator.op_push_V(*(long *)(&i64data));
    1074         }
    1075         else if( resultType.IsSingle() ){
    1076             //single実数
    1077 
    1078             memcpy(&dbl,&i64data,sizeof(_int64));
    1079 
    1080             float flt;
    1081             flt=(float)dbl;
    1082             memcpy(&i3,&flt,sizeof(long));
    1083 
    1084             //push flt
    1085             compiler.codeGenerator.op_push_V(i3);
    1086         }
    1087         else{
    1088             //整数(符号有り/無し)
    1089 
    1090             i3=(long)i64data;
    1091 
    1092             if(resultType.GetBasicSize()==sizeof(char)) i3=i3&0x000000FF;
    1093             if(resultType.GetBasicSize()==sizeof(short)) i3=i3&0x0000FFFF;
    1094 
    1095             //push term
    1096             compiler.codeGenerator.op_push_V(i3);
    1097         }
    1098 
    1099         type_stack[0]=resultType.GetBasicType();
    1100         index_stack[0]=resultType.GetIndex();
     1106        SetError();
    11011107    }
    11021108    else{
Note: See TracChangeset for help on using the changeset viewer.