Changeset 355 in dev for trunk/abdev/BasicCompiler32/NumOpe.cpp
- Timestamp:
- Nov 2, 2007, 2:53:56 AM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler32/NumOpe.cpp
r350 r355 604 604 // リテラル配列の場合 605 605 606 if( !baseType.IsPointer() ){ 607 SetError(1,NULL,cp); 606 int dataTableOffset; 607 if( !compiler.GetObjectModule().dataTable.MakeLiteralArrayBuffer( expression, baseType, dataTableOffset ) ) 608 { 608 609 return false; 609 610 } 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() );644 611 645 612 //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 ); 649 614 650 615 resultType = baseType; … … 657 622 658 623 bool isLiteralCalculation; 659 if( !NumOpe_GetType( expression, baseType, resultType, &isLiteralCalculation ) )624 if( NumOpe_GetType( expression, baseType, resultType, &isLiteralCalculation ) ) 660 625 { 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 ) 664 671 { 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 } 714 697 } 715 698 … … 736 719 //リテラル値のみの計算かどうかを判別するためのフラグ 737 720 BOOL bLiteralCalculation=1; 738 739 //リテラル演算の場合を考慮した演算前の再配置スケジュール740 CReloc *pobj_BackReloc;741 pobj_BackReloc=new CReloc();742 pobj_BackReloc->copy(pobj_Reloc);743 721 744 722 double dbl; … … 819 797 || term[0] == '\"' ) 820 798 { 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 836 799 bool isEx = true; 837 800 if( term[0] == '\"' ) … … 858 821 } 859 822 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; 860 841 } 861 842 StrLiteral: … … 1200 1181 } 1201 1182 1202 //再配置スケジュールバックアップ情報を解放1203 delete pobj_BackReloc;1204 1205 1183 return isSuccessful; 1206 1184 }
Note:
See TracChangeset
for help on using the changeset viewer.